mirror of
https://github.com/refraction-networking/uquic.git
synced 2025-03-31 18:57:36 +03:00
Add variable length QUIC frame padding support. Refactor how QUIC frames are defined in a QUIC Spec. Update documentation and examples. Added Chrome and Firefox parrots. Close #3.
75 lines
2 KiB
Go
75 lines
2 KiB
Go
package quic
|
|
|
|
import (
|
|
"crypto/rand"
|
|
)
|
|
|
|
type InitialPacketSpec struct {
|
|
// SrcConnIDLength specifies how many bytes should the SrcConnID be
|
|
SrcConnIDLength int
|
|
|
|
// DestConnIDLength specifies how many bytes should the DestConnID be
|
|
DestConnIDLength int
|
|
|
|
// InitPacketNumberLength specifies how many bytes should the InitPacketNumber
|
|
// be interpreted as. It is usually 1 or 2 bytes. If unset, UQUIC will use the
|
|
// default algorithm to compute the length which is at least 2 bytes.
|
|
InitPacketNumberLength PacketNumberLen
|
|
|
|
// InitPacketNumber is the packet number of the first Initial packet. Following
|
|
// Initial packets, if any, will increment the Packet Number accordingly.
|
|
InitPacketNumber uint64 // [UQUIC]
|
|
|
|
// TokenStore is used to store and retrieve tokens. If set, will override the
|
|
// one set in the Config.
|
|
TokenStore TokenStore
|
|
|
|
// If ClientTokenLength is set when TokenStore is not set, a dummy TokenStore
|
|
// will be created to randomly generate tokens of the specified length for
|
|
// Pop() calls with any key and silently drop any Put() calls.
|
|
//
|
|
// However, the tokens will not be stored anywhere and are expected to be
|
|
// invalid since not assigned by the server.
|
|
ClientTokenLength int
|
|
|
|
// FrameBuilder specifies how the frames should be encapsulated for the first Initial
|
|
// packet.
|
|
//
|
|
// If nil, there will be only one single Crypto frame in the first Initial packet.
|
|
FrameBuilder QUICFrameBuilder
|
|
}
|
|
|
|
func (ps *InitialPacketSpec) UpdateConfig(conf *Config) {
|
|
conf.TokenStore = ps.getTokenStore()
|
|
}
|
|
|
|
func (ps *InitialPacketSpec) getTokenStore() TokenStore {
|
|
if ps.TokenStore != nil {
|
|
return ps.TokenStore
|
|
}
|
|
|
|
if ps.ClientTokenLength > 0 {
|
|
return &dummyTokenStore{
|
|
tokenLength: ps.ClientTokenLength,
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type dummyTokenStore struct {
|
|
tokenLength int
|
|
}
|
|
|
|
func (d *dummyTokenStore) Pop(key string) (token *ClientToken) {
|
|
var data []byte = make([]byte, d.tokenLength)
|
|
rand.Read(data)
|
|
|
|
return &ClientToken{
|
|
data: data,
|
|
}
|
|
}
|
|
|
|
func (d *dummyTokenStore) Put(_ string, _ *ClientToken) {
|
|
// Do nothing
|
|
}
|