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  }