github.com/ooni/psiphon/tunnel-core@v0.0.0-20230105123940-fe12a24c96ee/oovendor/quic-go/internal/handshake/interface.go (about) 1 package handshake 2 3 import ( 4 "errors" 5 "io" 6 "net" 7 "time" 8 9 "github.com/ooni/psiphon/tunnel-core/oovendor/quic-go/internal/protocol" 10 "github.com/ooni/psiphon/tunnel-core/oovendor/quic-go/internal/qtls" 11 "github.com/ooni/psiphon/tunnel-core/oovendor/quic-go/internal/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 // ConnectionState contains information about the state of the connection. 27 type ConnectionState = qtls.ConnectionState 28 29 type headerDecryptor interface { 30 DecryptHeader(sample []byte, firstByte *byte, pnBytes []byte) 31 } 32 33 // LongHeaderOpener opens a long header packet 34 type LongHeaderOpener interface { 35 headerDecryptor 36 DecodePacketNumber(wirePN protocol.PacketNumber, wirePNLen protocol.PacketNumberLen) protocol.PacketNumber 37 Open(dst, src []byte, pn protocol.PacketNumber, associatedData []byte) ([]byte, error) 38 } 39 40 // ShortHeaderOpener opens a short header packet 41 type ShortHeaderOpener interface { 42 headerDecryptor 43 DecodePacketNumber(wirePN protocol.PacketNumber, wirePNLen protocol.PacketNumberLen) protocol.PacketNumber 44 Open(dst, src []byte, rcvTime time.Time, pn protocol.PacketNumber, kp protocol.KeyPhaseBit, associatedData []byte) ([]byte, error) 45 } 46 47 // LongHeaderSealer seals a long header packet 48 type LongHeaderSealer interface { 49 Seal(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) []byte 50 EncryptHeader(sample []byte, firstByte *byte, pnBytes []byte) 51 Overhead() int 52 } 53 54 // ShortHeaderSealer seals a short header packet 55 type ShortHeaderSealer interface { 56 LongHeaderSealer 57 KeyPhase() protocol.KeyPhaseBit 58 } 59 60 // A tlsExtensionHandler sends and received the QUIC TLS extension. 61 type tlsExtensionHandler interface { 62 GetExtensions(msgType uint8) []qtls.Extension 63 ReceivedExtensions(msgType uint8, exts []qtls.Extension) 64 TransportParameters() <-chan []byte 65 } 66 67 type handshakeRunner interface { 68 OnReceivedParams(*wire.TransportParameters) 69 OnHandshakeComplete() 70 OnError(error) 71 DropKeys(protocol.EncryptionLevel) 72 } 73 74 // CryptoSetup handles the handshake and protecting / unprotecting packets 75 type CryptoSetup interface { 76 RunHandshake() 77 io.Closer 78 ChangeConnectionID(protocol.ConnectionID) 79 GetSessionTicket() ([]byte, error) 80 81 HandleMessage([]byte, protocol.EncryptionLevel) bool 82 SetLargest1RTTAcked(protocol.PacketNumber) error 83 SetHandshakeConfirmed() 84 ConnectionState() ConnectionState 85 86 GetInitialOpener() (LongHeaderOpener, error) 87 GetHandshakeOpener() (LongHeaderOpener, error) 88 Get0RTTOpener() (LongHeaderOpener, error) 89 Get1RTTOpener() (ShortHeaderOpener, error) 90 91 GetInitialSealer() (LongHeaderSealer, error) 92 GetHandshakeSealer() (LongHeaderSealer, error) 93 Get0RTTSealer() (LongHeaderSealer, error) 94 Get1RTTSealer() (ShortHeaderSealer, error) 95 } 96 97 // ConnWithVersion is the connection used in the ClientHelloInfo. 98 // It can be used to determine the QUIC version in use. 99 type ConnWithVersion interface { 100 net.Conn 101 GetQUICVersion() protocol.VersionNumber 102 }