github.com/sagernet/quic-go@v0.43.1-beta.1/internal/handshake/interface.go (about) 1 package handshake 2 3 import ( 4 "crypto/tls" 5 "errors" 6 "io" 7 "time" 8 9 "github.com/sagernet/quic-go/internal/protocol" 10 "github.com/sagernet/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 ConnectionState struct { 57 tls.ConnectionState 58 Used0RTT bool 59 } 60 61 // EventKind is the kind of handshake event. 62 type EventKind uint8 63 64 const ( 65 // EventNoEvent signals that there are no new handshake events 66 EventNoEvent EventKind = iota + 1 67 // EventWriteInitialData contains new CRYPTO data to send at the Initial encryption level 68 EventWriteInitialData 69 // EventWriteHandshakeData contains new CRYPTO data to send at the Handshake encryption level 70 EventWriteHandshakeData 71 // EventReceivedReadKeys signals that new decryption keys are available. 72 // It doesn't say which encryption level those keys are for. 73 EventReceivedReadKeys 74 // EventDiscard0RTTKeys signals that the Handshake keys were discarded. 75 EventDiscard0RTTKeys 76 // EventReceivedTransportParameters contains the transport parameters sent by the peer. 77 EventReceivedTransportParameters 78 // EventRestoredTransportParameters contains the transport parameters restored from the session ticket. 79 // It is only used for the client. 80 EventRestoredTransportParameters 81 // EventHandshakeComplete signals that the TLS handshake was completed. 82 EventHandshakeComplete 83 ) 84 85 // Event is a handshake event. 86 type Event struct { 87 Kind EventKind 88 Data []byte 89 TransportParameters *wire.TransportParameters 90 } 91 92 // CryptoSetup handles the handshake and protecting / unprotecting packets 93 type CryptoSetup interface { 94 StartHandshake() error 95 io.Closer 96 ChangeConnectionID(protocol.ConnectionID) 97 GetSessionTicket() ([]byte, error) 98 99 HandleMessage([]byte, protocol.EncryptionLevel) error 100 NextEvent() Event 101 102 SetLargest1RTTAcked(protocol.PacketNumber) error 103 DiscardInitialKeys() 104 SetHandshakeConfirmed() 105 ConnectionState() ConnectionState 106 107 GetInitialOpener() (LongHeaderOpener, error) 108 GetHandshakeOpener() (LongHeaderOpener, error) 109 Get0RTTOpener() (LongHeaderOpener, error) 110 Get1RTTOpener() (ShortHeaderOpener, error) 111 112 GetInitialSealer() (LongHeaderSealer, error) 113 GetHandshakeSealer() (LongHeaderSealer, error) 114 Get0RTTSealer() (LongHeaderSealer, error) 115 Get1RTTSealer() (ShortHeaderSealer, error) 116 }