dnscrypt-proxy/vendor/github.com/quic-go/quic-go/internal/handshake/aead.go

91 lines
2.6 KiB
Go
Raw Normal View History

2022-07-21 18:50:10 +02:00
package handshake
import (
"encoding/binary"
"github.com/quic-go/quic-go/internal/protocol"
2022-07-21 18:50:10 +02:00
)
2024-03-26 19:56:06 +01:00
func createAEAD(suite *cipherSuite, trafficSecret []byte, v protocol.Version) *xorNonceAEAD {
2022-07-21 18:50:10 +02:00
keyLabel := hkdfLabelKeyV1
ivLabel := hkdfLabelIVV1
if v == protocol.Version2 {
keyLabel = hkdfLabelKeyV2
ivLabel = hkdfLabelIVV2
}
key := hkdfExpandLabel(suite.Hash, trafficSecret, []byte{}, keyLabel, suite.KeyLen)
iv := hkdfExpandLabel(suite.Hash, trafficSecret, []byte{}, ivLabel, suite.IVLen())
return suite.AEAD(key, iv)
}
type longHeaderSealer struct {
2024-03-26 19:56:06 +01:00
aead *xorNonceAEAD
2022-07-21 18:50:10 +02:00
headerProtector headerProtector
2024-03-26 19:56:06 +01:00
nonceBuf [8]byte
2022-07-21 18:50:10 +02:00
}
var _ LongHeaderSealer = &longHeaderSealer{}
2024-03-26 19:56:06 +01:00
func newLongHeaderSealer(aead *xorNonceAEAD, headerProtector headerProtector) LongHeaderSealer {
if aead.NonceSize() != 8 {
panic("unexpected nonce size")
}
2022-07-21 18:50:10 +02:00
return &longHeaderSealer{
aead: aead,
headerProtector: headerProtector,
}
}
func (s *longHeaderSealer) Seal(dst, src []byte, pn protocol.PacketNumber, ad []byte) []byte {
2024-03-26 19:56:06 +01:00
binary.BigEndian.PutUint64(s.nonceBuf[:], uint64(pn))
return s.aead.Seal(dst, s.nonceBuf[:], src, ad)
2022-07-21 18:50:10 +02:00
}
func (s *longHeaderSealer) EncryptHeader(sample []byte, firstByte *byte, pnBytes []byte) {
s.headerProtector.EncryptHeader(sample, firstByte, pnBytes)
}
func (s *longHeaderSealer) Overhead() int {
return s.aead.Overhead()
}
type longHeaderOpener struct {
2024-03-26 19:56:06 +01:00
aead *xorNonceAEAD
2022-07-21 18:50:10 +02:00
headerProtector headerProtector
highestRcvdPN protocol.PacketNumber // highest packet number received (which could be successfully unprotected)
2024-03-26 19:56:06 +01:00
// use a single array to avoid allocations
nonceBuf [8]byte
2022-07-21 18:50:10 +02:00
}
var _ LongHeaderOpener = &longHeaderOpener{}
2024-03-26 19:56:06 +01:00
func newLongHeaderOpener(aead *xorNonceAEAD, headerProtector headerProtector) LongHeaderOpener {
if aead.NonceSize() != 8 {
panic("unexpected nonce size")
}
2022-07-21 18:50:10 +02:00
return &longHeaderOpener{
aead: aead,
headerProtector: headerProtector,
}
}
func (o *longHeaderOpener) DecodePacketNumber(wirePN protocol.PacketNumber, wirePNLen protocol.PacketNumberLen) protocol.PacketNumber {
return protocol.DecodePacketNumber(wirePNLen, o.highestRcvdPN, wirePN)
}
func (o *longHeaderOpener) Open(dst, src []byte, pn protocol.PacketNumber, ad []byte) ([]byte, error) {
2024-03-26 19:56:06 +01:00
binary.BigEndian.PutUint64(o.nonceBuf[:], uint64(pn))
dec, err := o.aead.Open(dst, o.nonceBuf[:], src, ad)
2022-07-21 18:50:10 +02:00
if err == nil {
2024-01-18 23:47:00 +01:00
o.highestRcvdPN = max(o.highestRcvdPN, pn)
2022-07-21 18:50:10 +02:00
} else {
err = ErrDecryptionFailed
}
return dec, err
}
func (o *longHeaderOpener) DecryptHeader(sample []byte, firstByte *byte, pnBytes []byte) {
o.headerProtector.DecryptHeader(sample, firstByte, pnBytes)
}