github.com/mikelsr/quic-go@v0.36.1-0.20230701132136-1d9415b66898/internal/handshake/interface.go (about) 1 package handshake 2 3 import ( 4 "crypto/tls" 5 "errors" 6 "io" 7 "time" 8 9 "github.com/mikelsr/quic-go/internal/protocol" 10 "github.com/mikelsr/quic-go/internal/wire" 11 ) 12 13 var ( 14 // ErrKeysNotYetAvailable is returned when an opener or a sealer is requested for an encryption level, 15 // but the corresponding opener has not yet been initialized 16 // This can happen when packets arrive out of order. 17 ErrKeysNotYetAvailable = errors.New("CryptoSetup: keys at this encryption level not yet available") 18 // ErrKeysDropped is returned when an opener or a sealer is requested for an encryption level, 19 // but the corresponding keys have already been dropped. 20 ErrKeysDropped = errors.New("CryptoSetup: keys were already dropped") 21 // ErrDecryptionFailed is returned when the AEAD fails to open the packet. 22 ErrDecryptionFailed = errors.New("decryption failed") 23 ) 24 25 type headerDecryptor interface { 26 DecryptHeader(sample []byte, firstByte *byte, pnBytes []byte) 27 } 28 29 // LongHeaderOpener opens a long header packet 30 type LongHeaderOpener interface { 31 headerDecryptor 32 DecodePacketNumber(wirePN protocol.PacketNumber, wirePNLen protocol.PacketNumberLen) protocol.PacketNumber 33 Open(dst, src []byte, pn protocol.PacketNumber, associatedData []byte) ([]byte, error) 34 } 35 36 // ShortHeaderOpener opens a short header packet 37 type ShortHeaderOpener interface { 38 headerDecryptor 39 DecodePacketNumber(wirePN protocol.PacketNumber, wirePNLen protocol.PacketNumberLen) protocol.PacketNumber 40 Open(dst, src []byte, rcvTime time.Time, pn protocol.PacketNumber, kp protocol.KeyPhaseBit, associatedData []byte) ([]byte, error) 41 } 42 43 // LongHeaderSealer seals a long header packet 44 type LongHeaderSealer interface { 45 Seal(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) []byte 46 EncryptHeader(sample []byte, firstByte *byte, pnBytes []byte) 47 Overhead() int 48 } 49 50 // ShortHeaderSealer seals a short header packet 51 type ShortHeaderSealer interface { 52 LongHeaderSealer 53 KeyPhase() protocol.KeyPhaseBit 54 } 55 56 type handshakeRunner interface { 57 OnReceivedParams(*wire.TransportParameters) 58 OnHandshakeComplete() 59 OnReceivedReadKeys() 60 DropKeys(protocol.EncryptionLevel) 61 } 62 63 type ConnectionState struct { 64 tls.ConnectionState 65 Used0RTT bool 66 } 67 68 // CryptoSetup handles the handshake and protecting / unprotecting packets 69 type CryptoSetup interface { 70 StartHandshake() error 71 io.Closer 72 ChangeConnectionID(protocol.ConnectionID) 73 GetSessionTicket() ([]byte, error) 74 75 HandleMessage([]byte, protocol.EncryptionLevel) error 76 SetLargest1RTTAcked(protocol.PacketNumber) error 77 SetHandshakeConfirmed() 78 ConnectionState() ConnectionState 79 80 GetInitialOpener() (LongHeaderOpener, error) 81 GetHandshakeOpener() (LongHeaderOpener, error) 82 Get0RTTOpener() (LongHeaderOpener, error) 83 Get1RTTOpener() (ShortHeaderOpener, error) 84 85 GetInitialSealer() (LongHeaderSealer, error) 86 GetHandshakeSealer() (LongHeaderSealer, error) 87 Get0RTTSealer() (LongHeaderSealer, error) 88 Get1RTTSealer() (ShortHeaderSealer, error) 89 }