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  }