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  }