| 
					
				 | 
			
			
				@@ -1,67 +1,67 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package vmess 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "bytes" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "crypto/aes" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "crypto/rand" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  mrand "math/rand" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "testing" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"bytes" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"crypto/aes" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"crypto/rand" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	mrand "math/rand" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"testing" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func randomBytes(p []byte, t *testing.T) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  nBytes, err := rand.Read(p) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    t.Fatal(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if nBytes != len(p) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    t.Error("Unable to generate %d bytes of random buffer", len(p)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	nBytes, err := rand.Read(p) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		t.Fatal(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if nBytes != len(p) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		t.Error("Unable to generate %d bytes of random buffer", len(p)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func TestNormalReading(t *testing.T) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  testSize := 256 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  plaintext := make([]byte, testSize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  randomBytes(plaintext, t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  keySize := 16 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  key := make([]byte, keySize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  randomBytes(key, t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cipher, err := aes.NewCipher(key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    t.Fatal(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ciphertext := make([]byte, testSize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for encryptSize := 0; encryptSize < testSize; encryptSize += blockSize { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    cipher.Encrypt(ciphertext[encryptSize:], plaintext[encryptSize:]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ciphertextcopy := make([]byte, testSize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  copy(ciphertextcopy, ciphertext) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  reader, err := NewDecryptionReader(bytes.NewReader(ciphertextcopy), key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    t.Fatal(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  readtext := make([]byte, testSize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  readSize := 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for readSize < testSize { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    nBytes := mrand.Intn(16) + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if nBytes > testSize - readSize { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      nBytes = testSize - readSize 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    bytesRead, err := reader.Read(readtext[readSize:readSize + nBytes]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      t.Fatal(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if bytesRead != nBytes { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      t.Errorf("Expected to read %d bytes, but only read %d bytes", nBytes, bytesRead) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    readSize += nBytes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ! bytes.Equal(readtext, plaintext) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    t.Errorf("Expected plaintext %v, but got %v", plaintext, readtext) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	testSize := 256 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	plaintext := make([]byte, testSize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	randomBytes(plaintext, t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	keySize := 16 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	key := make([]byte, keySize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	randomBytes(key, t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	cipher, err := aes.NewCipher(key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		t.Fatal(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ciphertext := make([]byte, testSize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for encryptSize := 0; encryptSize < testSize; encryptSize += blockSize { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		cipher.Encrypt(ciphertext[encryptSize:], plaintext[encryptSize:]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ciphertextcopy := make([]byte, testSize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	copy(ciphertextcopy, ciphertext) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	reader, err := NewDecryptionReader(bytes.NewReader(ciphertextcopy), key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		t.Fatal(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	readtext := make([]byte, testSize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	readSize := 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for readSize < testSize { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		nBytes := mrand.Intn(16) + 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if nBytes > testSize-readSize { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			nBytes = testSize - readSize 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		bytesRead, err := reader.Read(readtext[readSize : readSize+nBytes]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			t.Fatal(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if bytesRead != nBytes { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			t.Errorf("Expected to read %d bytes, but only read %d bytes", nBytes, bytesRead) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		readSize += nBytes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if !bytes.Equal(readtext, plaintext) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		t.Errorf("Expected plaintext %v, but got %v", plaintext, readtext) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |