github.com/tumi8/quic-go@v0.37.4-tum/noninternal/handshake/interface.go (about) 1 package handshake 2 3 import ( 4 "crypto/tls" 5 "errors" 6 "io" 7 "time" 8 9 "github.com/tumi8/quic-go/noninternal/qtls" 10 "github.com/tumi8/quic-go/noninternal/protocol" 11 "github.com/tumi8/quic-go/noninternal/wire" 12 ) 13 14 var ( 15 // ErrKeysNotYetAvailable is returned when an opener or a sealer is requested for an encryption level, 16 // but the corresponding opener has not yet been initialized 17 // This can happen when packets arrive out of order. 18 ErrKeysNotYetAvailable = errors.New("CryptoSetup: keys at this encryption level not yet available") 19 // ErrKeysDropped is returned when an opener or a sealer is requested for an encryption level, 20 // but the corresponding keys have already been dropped. 21 ErrKeysDropped = errors.New("CryptoSetup: keys were already dropped") 22 // ErrDecryptionFailed is returned when the AEAD fails to open the packet. 23 ErrDecryptionFailed = errors.New("decryption failed") 24 ) 25 26 type headerDecryptor interface { 27 DecryptHeader(sample []byte, firstByte *byte, pnBytes []byte) 28 } 29 30 // LongHeaderOpener opens a long header packet 31 type LongHeaderOpener interface { 32 headerDecryptor 33 DecodePacketNumber(wirePN protocol.PacketNumber, wirePNLen protocol.PacketNumberLen) protocol.PacketNumber 34 Open(dst, src []byte, pn protocol.PacketNumber, associatedData []byte) ([]byte, error) 35 } 36 37 // ShortHeaderOpener opens a short header packet 38 type ShortHeaderOpener interface { 39 headerDecryptor 40 DecodePacketNumber(wirePN protocol.PacketNumber, wirePNLen protocol.PacketNumberLen) protocol.PacketNumber 41 Open(dst, src []byte, rcvTime time.Time, pn protocol.PacketNumber, kp protocol.KeyPhaseBit, associatedData []byte) ([]byte, error) 42 } 43 44 // LongHeaderSealer seals a long header packet 45 type LongHeaderSealer interface { 46 Seal(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) []byte 47 EncryptHeader(sample []byte, firstByte *byte, pnBytes []byte) 48 Overhead() int 49 } 50 51 // ShortHeaderSealer seals a short header packet 52 type ShortHeaderSealer interface { 53 LongHeaderSealer 54 KeyPhase() protocol.KeyPhaseBit 55 } 56 57 type ConnectionState struct { 58 tls.ConnectionState 59 Used0RTT bool 60 ConnectionInfo qtls.QUICConn 61 } 62 63 // EventKind is the kind of handshake event. 64 type EventKind uint8 65 66 const ( 67 // EventNoEvent signals that there are no new handshake events 68 EventNoEvent EventKind = iota + 1 69 // EventWriteInitialData contains new CRYPTO data to send at the Initial encryption level 70 EventWriteInitialData 71 // EventWriteHandshakeData contains new CRYPTO data to send at the Handshake encryption level 72 EventWriteHandshakeData 73 // EventReceivedReadKeys signals that new decryption keys are available. 74 // It doesn't say which encryption level those keys are for. 75 EventReceivedReadKeys 76 // EventDiscard0RTTKeys signals that the Handshake keys were discarded. 77 EventDiscard0RTTKeys 78 // EventReceivedTransportParameters contains the transport parameters sent by the peer. 79 EventReceivedTransportParameters 80 // EventRestoredTransportParameters contains the transport parameters restored from the session ticket. 81 // It is only used for the client. 82 EventRestoredTransportParameters 83 // EventHandshakeComplete signals that the TLS handshake was completed. 84 EventHandshakeComplete 85 ) 86 87 // Event is a handshake event. 88 type Event struct { 89 Kind EventKind 90 Data []byte 91 TransportParameters *wire.TransportParameters 92 } 93 94 // CryptoSetup handles the handshake and protecting / unprotecting packets 95 type CryptoSetup interface { 96 StartHandshake() error 97 io.Closer 98 ChangeConnectionID(protocol.ConnectionID) 99 GetSessionTicket() ([]byte, error) 100 101 HandleMessage([]byte, protocol.EncryptionLevel) error 102 NextEvent() Event 103 104 SetLargest1RTTAcked(protocol.PacketNumber) error 105 DiscardInitialKeys() 106 SetHandshakeConfirmed() 107 ConnectionState() ConnectionState 108 109 GetInitialOpener() (LongHeaderOpener, error) 110 GetHandshakeOpener() (LongHeaderOpener, error) 111 Get0RTTOpener() (LongHeaderOpener, error) 112 Get1RTTOpener() (ShortHeaderOpener, error) 113 114 GetInitialSealer() (LongHeaderSealer, error) 115 GetHandshakeSealer() (LongHeaderSealer, error) 116 Get0RTTSealer() (LongHeaderSealer, error) 117 Get1RTTSealer() (ShortHeaderSealer, error) 118 }