| 
									
										
										
										
											2016-12-12 17:42:03 +01:00
										 |  |  | package crypto_test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"crypto/aes" | 
					
						
							|  |  |  | 	"crypto/cipher" | 
					
						
							|  |  |  | 	"crypto/rand" | 
					
						
							|  |  |  | 	"io" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							| 
									
										
										
										
											2017-02-06 13:31:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-12 17:42:03 +01:00
										 |  |  | 	"v2ray.com/core/common/buf" | 
					
						
							|  |  |  | 	. "v2ray.com/core/common/crypto" | 
					
						
							| 
									
										
										
										
											2017-05-02 22:23:07 +02:00
										 |  |  | 	"v2ray.com/core/common/protocol" | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	. "v2ray.com/ext/assert" | 
					
						
							| 
									
										
										
										
											2016-12-12 17:42:03 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestAuthenticationReaderWriter(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert := With(t) | 
					
						
							| 
									
										
										
										
											2016-12-12 17:42:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	key := make([]byte, 16) | 
					
						
							|  |  |  | 	rand.Read(key) | 
					
						
							|  |  |  | 	block, err := aes.NewCipher(key) | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(err, IsNil) | 
					
						
							| 
									
										
										
										
											2016-12-12 17:42:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	aead, err := cipher.NewGCM(block) | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(err, IsNil) | 
					
						
							| 
									
										
										
										
											2016-12-12 17:42:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-27 13:31:09 +02:00
										 |  |  | 	rawPayload := make([]byte, 8192*10) | 
					
						
							| 
									
										
										
										
											2017-04-23 13:30:08 +02:00
										 |  |  | 	rand.Read(rawPayload) | 
					
						
							| 
									
										
										
										
											2016-12-12 17:42:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-27 13:31:09 +02:00
										 |  |  | 	payload := buf.NewLocal(8192 * 10) | 
					
						
							| 
									
										
										
										
											2017-04-23 13:30:08 +02:00
										 |  |  | 	payload.Append(rawPayload) | 
					
						
							| 
									
										
										
										
											2016-12-12 21:49:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-27 13:31:09 +02:00
										 |  |  | 	cache := buf.NewLocal(160 * 1024) | 
					
						
							| 
									
										
										
										
											2016-12-12 21:49:04 +01:00
										 |  |  | 	iv := make([]byte, 12) | 
					
						
							|  |  |  | 	rand.Read(iv) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	writer := NewAuthenticationWriter(&AEADAuthenticator{ | 
					
						
							|  |  |  | 		AEAD: aead, | 
					
						
							|  |  |  | 		NonceGenerator: &StaticBytesGenerator{ | 
					
						
							|  |  |  | 			Content: iv, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		AdditionalDataGenerator: &NoOpBytesGenerator{}, | 
					
						
							| 
									
										
										
										
											2017-05-02 22:23:07 +02:00
										 |  |  | 	}, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream) | 
					
						
							| 
									
										
										
										
											2017-02-06 14:06:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 22:33:15 +01:00
										 |  |  | 	assert(writer.WriteMultiBuffer(buf.NewMultiBufferValue(payload)), IsNil) | 
					
						
							| 
									
										
										
										
											2017-11-21 22:03:43 +01:00
										 |  |  | 	assert(cache.Len(), Equals, 82658) | 
					
						
							| 
									
										
										
										
											2017-11-09 22:33:15 +01:00
										 |  |  | 	assert(writer.WriteMultiBuffer(buf.MultiBuffer{}), IsNil) | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(err, IsNil) | 
					
						
							| 
									
										
										
										
											2017-02-06 13:31:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-12 21:49:04 +01:00
										 |  |  | 	reader := NewAuthenticationReader(&AEADAuthenticator{ | 
					
						
							|  |  |  | 		AEAD: aead, | 
					
						
							|  |  |  | 		NonceGenerator: &StaticBytesGenerator{ | 
					
						
							|  |  |  | 			Content: iv, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		AdditionalDataGenerator: &NoOpBytesGenerator{}, | 
					
						
							| 
									
										
										
										
											2017-05-02 22:23:07 +02:00
										 |  |  | 	}, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream) | 
					
						
							| 
									
										
										
										
											2016-12-12 21:49:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 00:55:28 +01:00
										 |  |  | 	var mb buf.MultiBuffer | 
					
						
							| 
									
										
										
										
											2017-04-27 13:31:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for mb.Len() < len(rawPayload) { | 
					
						
							| 
									
										
										
										
											2017-11-09 22:33:15 +01:00
										 |  |  | 		mb2, err := reader.ReadMultiBuffer() | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 		assert(err, IsNil) | 
					
						
							| 
									
										
										
										
											2017-04-27 13:31:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		mb.AppendMulti(mb2) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-02-06 14:06:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-27 13:31:09 +02:00
										 |  |  | 	mbContent := make([]byte, 8192*10) | 
					
						
							| 
									
										
										
										
											2017-04-23 13:30:08 +02:00
										 |  |  | 	mb.Read(mbContent) | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(mbContent, Equals, rawPayload) | 
					
						
							| 
									
										
										
										
											2016-12-12 21:49:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 22:33:15 +01:00
										 |  |  | 	_, err = reader.ReadMultiBuffer() | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(err, Equals, io.EOF) | 
					
						
							| 
									
										
										
										
											2016-12-12 21:49:04 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestAuthenticationReaderWriterPacket(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert := With(t) | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	key := make([]byte, 16) | 
					
						
							|  |  |  | 	rand.Read(key) | 
					
						
							|  |  |  | 	block, err := aes.NewCipher(key) | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(err, IsNil) | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	aead, err := cipher.NewGCM(block) | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(err, IsNil) | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	cache := buf.NewLocal(1024) | 
					
						
							|  |  |  | 	iv := make([]byte, 12) | 
					
						
							|  |  |  | 	rand.Read(iv) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	writer := NewAuthenticationWriter(&AEADAuthenticator{ | 
					
						
							|  |  |  | 		AEAD: aead, | 
					
						
							|  |  |  | 		NonceGenerator: &StaticBytesGenerator{ | 
					
						
							|  |  |  | 			Content: iv, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		AdditionalDataGenerator: &NoOpBytesGenerator{}, | 
					
						
							| 
									
										
										
										
											2017-05-02 22:23:07 +02:00
										 |  |  | 	}, PlainChunkSizeParser{}, cache, protocol.TransferTypePacket) | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 00:55:28 +01:00
										 |  |  | 	var payload buf.MultiBuffer | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | 	pb1 := buf.New() | 
					
						
							|  |  |  | 	pb1.Append([]byte("abcd")) | 
					
						
							|  |  |  | 	payload.Append(pb1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pb2 := buf.New() | 
					
						
							|  |  |  | 	pb2.Append([]byte("efgh")) | 
					
						
							|  |  |  | 	payload.Append(pb2) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 22:33:15 +01:00
										 |  |  | 	assert(writer.WriteMultiBuffer(payload), IsNil) | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(cache.Len(), GreaterThan, 0) | 
					
						
							| 
									
										
										
										
											2017-11-09 22:33:15 +01:00
										 |  |  | 	assert(writer.WriteMultiBuffer(buf.MultiBuffer{}), IsNil) | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(err, IsNil) | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	reader := NewAuthenticationReader(&AEADAuthenticator{ | 
					
						
							|  |  |  | 		AEAD: aead, | 
					
						
							|  |  |  | 		NonceGenerator: &StaticBytesGenerator{ | 
					
						
							|  |  |  | 			Content: iv, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		AdditionalDataGenerator: &NoOpBytesGenerator{}, | 
					
						
							| 
									
										
										
										
											2017-05-02 22:23:07 +02:00
										 |  |  | 	}, PlainChunkSizeParser{}, cache, protocol.TransferTypePacket) | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 22:33:15 +01:00
										 |  |  | 	mb, err := reader.ReadMultiBuffer() | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(err, IsNil) | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	b1 := mb.SplitFirst() | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(b1.String(), Equals, "abcd") | 
					
						
							| 
									
										
										
										
											2017-12-03 13:23:24 +01:00
										 |  |  | 	assert(mb.IsEmpty(), IsTrue) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mb, err = reader.ReadMultiBuffer() | 
					
						
							|  |  |  | 	assert(err, IsNil) | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | 	b2 := mb.SplitFirst() | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(b2.String(), Equals, "efgh") | 
					
						
							|  |  |  | 	assert(mb.IsEmpty(), IsTrue) | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 22:33:15 +01:00
										 |  |  | 	_, err = reader.ReadMultiBuffer() | 
					
						
							| 
									
										
										
										
											2017-10-24 16:15:35 +02:00
										 |  |  | 	assert(err, Equals, io.EOF) | 
					
						
							| 
									
										
										
										
											2017-05-02 00:28:16 +02:00
										 |  |  | } |