package handshake
import (
"context"
"crypto/tls"
"errors"
"io"
"github.com/quic-go/quic-go/internal/monotime"
"github.com/quic-go/quic-go/internal/protocol"
"github.com/quic-go/quic-go/internal/wire"
)
var (
ErrKeysNotYetAvailable = errors .New ("CryptoSetup: keys at this encryption level not yet available" )
ErrKeysDropped = errors .New ("CryptoSetup: keys were already dropped" )
ErrDecryptionFailed = errors .New ("decryption failed" )
)
type headerDecryptor interface {
DecryptHeader(sample []byte , firstByte *byte , pnBytes []byte )
}
type LongHeaderOpener interface {
headerDecryptor
DecodePacketNumber (wirePN protocol .PacketNumber , wirePNLen protocol .PacketNumberLen ) protocol .PacketNumber
Open (dst, src []byte , pn protocol .PacketNumber , associatedData []byte ) ([]byte , error )
}
type ShortHeaderOpener interface {
headerDecryptor
DecodePacketNumber (wirePN protocol .PacketNumber , wirePNLen protocol .PacketNumberLen ) protocol .PacketNumber
Open (dst, src []byte , rcvTime monotime .Time , pn protocol .PacketNumber , kp protocol .KeyPhaseBit , associatedData []byte ) ([]byte , error )
}
type LongHeaderSealer interface {
Seal (dst, src []byte , packetNumber protocol .PacketNumber , associatedData []byte ) []byte
EncryptHeader (sample []byte , firstByte *byte , pnBytes []byte )
Overhead () int
}
type ShortHeaderSealer interface {
LongHeaderSealer
KeyPhase () protocol .KeyPhaseBit
}
type ConnectionState struct {
tls .ConnectionState
Used0RTT bool
}
type EventKind uint8
const (
EventNoEvent EventKind = iota + 1
EventWriteInitialData
EventWriteHandshakeData
EventReceivedReadKeys
EventDiscard0RTTKeys
EventReceivedTransportParameters
EventRestoredTransportParameters
EventHandshakeComplete
)
func (k EventKind ) String () string {
switch k {
case EventNoEvent :
return "EventNoEvent"
case EventWriteInitialData :
return "EventWriteInitialData"
case EventWriteHandshakeData :
return "EventWriteHandshakeData"
case EventReceivedReadKeys :
return "EventReceivedReadKeys"
case EventDiscard0RTTKeys :
return "EventDiscard0RTTKeys"
case EventReceivedTransportParameters :
return "EventReceivedTransportParameters"
case EventRestoredTransportParameters :
return "EventRestoredTransportParameters"
case EventHandshakeComplete :
return "EventHandshakeComplete"
default :
return "Unknown EventKind"
}
}
type Event struct {
Kind EventKind
Data []byte
TransportParameters *wire .TransportParameters
}
type CryptoSetup interface {
StartHandshake (context .Context ) error
io .Closer
ChangeConnectionID (protocol .ConnectionID )
GetSessionTicket () ([]byte , error )
HandleMessage ([]byte , protocol .EncryptionLevel ) error
NextEvent () Event
SetLargest1RTTAcked (protocol .PacketNumber ) error
DiscardInitialKeys ()
SetHandshakeConfirmed ()
ConnectionState () ConnectionState
GetInitialOpener () (LongHeaderOpener , error )
GetHandshakeOpener () (LongHeaderOpener , error )
Get0RTTOpener () (LongHeaderOpener , error )
Get1RTTOpener () (ShortHeaderOpener , error )
GetInitialSealer () (LongHeaderSealer , error )
GetHandshakeSealer () (LongHeaderSealer , error )
Get0RTTSealer () (LongHeaderSealer , error )
Get1RTTSealer () (ShortHeaderSealer , error )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .