|
|
@@ -120,8 +120,8 @@ func (c *ClientSession) EncodeRequestBody(request *protocol.RequestHeader, write
|
|
|
}
|
|
|
auth := &crypto.AEADAuthenticator{
|
|
|
AEAD: new(NoOpAuthenticator),
|
|
|
- NonceGenerator: crypto.NoOpBytesGenerator{},
|
|
|
- AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
|
|
|
+ NonceGenerator: crypto.GenerateEmptyBytes(),
|
|
|
+ AdditionalDataGenerator: crypto.GenerateEmptyBytes(),
|
|
|
}
|
|
|
return crypto.NewAuthenticationWriter(auth, sizeParser, writer, protocol.TransferTypePacket)
|
|
|
}
|
|
|
@@ -133,8 +133,8 @@ func (c *ClientSession) EncodeRequestBody(request *protocol.RequestHeader, write
|
|
|
if request.Option.Has(protocol.RequestOptionChunkStream) {
|
|
|
auth := &crypto.AEADAuthenticator{
|
|
|
AEAD: new(FnvAuthenticator),
|
|
|
- NonceGenerator: crypto.NoOpBytesGenerator{},
|
|
|
- AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
|
|
|
+ NonceGenerator: crypto.GenerateEmptyBytes(),
|
|
|
+ AdditionalDataGenerator: crypto.GenerateEmptyBytes(),
|
|
|
}
|
|
|
return crypto.NewAuthenticationWriter(auth, sizeParser, cryptionWriter, request.Command.TransferType())
|
|
|
}
|
|
|
@@ -145,24 +145,18 @@ func (c *ClientSession) EncodeRequestBody(request *protocol.RequestHeader, write
|
|
|
aead, _ := cipher.NewGCM(block)
|
|
|
|
|
|
auth := &crypto.AEADAuthenticator{
|
|
|
- AEAD: aead,
|
|
|
- NonceGenerator: &ChunkNonceGenerator{
|
|
|
- Nonce: append([]byte(nil), c.requestBodyIV...),
|
|
|
- Size: aead.NonceSize(),
|
|
|
- },
|
|
|
- AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
|
|
|
+ AEAD: aead,
|
|
|
+ NonceGenerator: GenerateChunkNonce(c.requestBodyIV, uint32(aead.NonceSize())),
|
|
|
+ AdditionalDataGenerator: crypto.GenerateEmptyBytes(),
|
|
|
}
|
|
|
return crypto.NewAuthenticationWriter(auth, sizeParser, writer, request.Command.TransferType())
|
|
|
case protocol.SecurityType_CHACHA20_POLY1305:
|
|
|
aead, _ := chacha20poly1305.New(GenerateChacha20Poly1305Key(c.requestBodyKey))
|
|
|
|
|
|
auth := &crypto.AEADAuthenticator{
|
|
|
- AEAD: aead,
|
|
|
- NonceGenerator: &ChunkNonceGenerator{
|
|
|
- Nonce: append([]byte(nil), c.requestBodyIV...),
|
|
|
- Size: aead.NonceSize(),
|
|
|
- },
|
|
|
- AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
|
|
|
+ AEAD: aead,
|
|
|
+ NonceGenerator: GenerateChunkNonce(c.requestBodyIV, uint32(aead.NonceSize())),
|
|
|
+ AdditionalDataGenerator: crypto.GenerateEmptyBytes(),
|
|
|
}
|
|
|
return crypto.NewAuthenticationWriter(auth, sizeParser, writer, request.Command.TransferType())
|
|
|
default:
|
|
|
@@ -219,8 +213,8 @@ func (c *ClientSession) DecodeResponseBody(request *protocol.RequestHeader, read
|
|
|
|
|
|
auth := &crypto.AEADAuthenticator{
|
|
|
AEAD: new(NoOpAuthenticator),
|
|
|
- NonceGenerator: crypto.NoOpBytesGenerator{},
|
|
|
- AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
|
|
|
+ NonceGenerator: crypto.GenerateEmptyBytes(),
|
|
|
+ AdditionalDataGenerator: crypto.GenerateEmptyBytes(),
|
|
|
}
|
|
|
|
|
|
return crypto.NewAuthenticationReader(auth, sizeParser, reader, protocol.TransferTypePacket)
|
|
|
@@ -231,8 +225,8 @@ func (c *ClientSession) DecodeResponseBody(request *protocol.RequestHeader, read
|
|
|
if request.Option.Has(protocol.RequestOptionChunkStream) {
|
|
|
auth := &crypto.AEADAuthenticator{
|
|
|
AEAD: new(FnvAuthenticator),
|
|
|
- NonceGenerator: crypto.NoOpBytesGenerator{},
|
|
|
- AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
|
|
|
+ NonceGenerator: crypto.GenerateEmptyBytes(),
|
|
|
+ AdditionalDataGenerator: crypto.GenerateEmptyBytes(),
|
|
|
}
|
|
|
return crypto.NewAuthenticationReader(auth, sizeParser, c.responseReader, request.Command.TransferType())
|
|
|
}
|
|
|
@@ -243,24 +237,18 @@ func (c *ClientSession) DecodeResponseBody(request *protocol.RequestHeader, read
|
|
|
aead, _ := cipher.NewGCM(block)
|
|
|
|
|
|
auth := &crypto.AEADAuthenticator{
|
|
|
- AEAD: aead,
|
|
|
- NonceGenerator: &ChunkNonceGenerator{
|
|
|
- Nonce: append([]byte(nil), c.responseBodyIV...),
|
|
|
- Size: aead.NonceSize(),
|
|
|
- },
|
|
|
- AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
|
|
|
+ AEAD: aead,
|
|
|
+ NonceGenerator: GenerateChunkNonce(c.responseBodyIV, uint32(aead.NonceSize())),
|
|
|
+ AdditionalDataGenerator: crypto.GenerateEmptyBytes(),
|
|
|
}
|
|
|
return crypto.NewAuthenticationReader(auth, sizeParser, reader, request.Command.TransferType())
|
|
|
case protocol.SecurityType_CHACHA20_POLY1305:
|
|
|
aead, _ := chacha20poly1305.New(GenerateChacha20Poly1305Key(c.responseBodyKey))
|
|
|
|
|
|
auth := &crypto.AEADAuthenticator{
|
|
|
- AEAD: aead,
|
|
|
- NonceGenerator: &ChunkNonceGenerator{
|
|
|
- Nonce: append([]byte(nil), c.responseBodyIV...),
|
|
|
- Size: aead.NonceSize(),
|
|
|
- },
|
|
|
- AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
|
|
|
+ AEAD: aead,
|
|
|
+ NonceGenerator: GenerateChunkNonce(c.responseBodyIV, uint32(aead.NonceSize())),
|
|
|
+ AdditionalDataGenerator: crypto.GenerateEmptyBytes(),
|
|
|
}
|
|
|
return crypto.NewAuthenticationReader(auth, sizeParser, reader, request.Command.TransferType())
|
|
|
default:
|
|
|
@@ -268,14 +256,12 @@ func (c *ClientSession) DecodeResponseBody(request *protocol.RequestHeader, read
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-type ChunkNonceGenerator struct {
|
|
|
- Nonce []byte
|
|
|
- Size int
|
|
|
- count uint16
|
|
|
-}
|
|
|
-
|
|
|
-func (g *ChunkNonceGenerator) Next() []byte {
|
|
|
- serial.Uint16ToBytes(g.count, g.Nonce[:0])
|
|
|
- g.count++
|
|
|
- return g.Nonce[:g.Size]
|
|
|
+func GenerateChunkNonce(nonce []byte, size uint32) crypto.BytesGenerator {
|
|
|
+ c := append([]byte(nil), nonce...)
|
|
|
+ count := uint16(0)
|
|
|
+ return func() []byte {
|
|
|
+ serial.Uint16ToBytes(count, c[:0])
|
|
|
+ count++
|
|
|
+ return c[:size]
|
|
|
+ }
|
|
|
}
|