mirror of
https://github.com/refraction-networking/utls.git
synced 2025-04-01 19:17:36 +03:00
* build(deps): bump github.com/quic-go/quic-go from 0.40.1 to 0.42.0 Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.40.1 to 0.42.0. - [Release notes](https://github.com/quic-go/quic-go/releases) - [Changelog](https://github.com/quic-go/quic-go/blob/master/Changelog.md) - [Commits](https://github.com/quic-go/quic-go/compare/v0.40.1...v0.42.0) --- updated-dependencies: - dependency-name: github.com/quic-go/quic-go dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> * update: remove dependency of quic-go We now vendor the quicvarint submodule from quic-go for a minimal dependency tree. This also updates the minimal Go version requirement to Go 1.21, given uTLS promised to support 2 most recent minor versions of Go. Signed-off-by: Gaukas Wang <i@gaukas.wang> --------- Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: Gaukas Wang <i@gaukas.wang> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gaukas Wang <i@gaukas.wang>
157 lines
4.2 KiB
Go
157 lines
4.2 KiB
Go
// Copyright 2024 The quic-go Authors. All rights reserved.
|
|
// Use of this source code is governed by a MIT-style
|
|
// license that can be found in the LICENSE file of
|
|
// the quic-go repository.
|
|
|
|
package protocol
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// The PacketType is the Long Header Type
|
|
type PacketType uint8
|
|
|
|
const (
|
|
// PacketTypeInitial is the packet type of an Initial packet
|
|
PacketTypeInitial PacketType = 1 + iota
|
|
// PacketTypeRetry is the packet type of a Retry packet
|
|
PacketTypeRetry
|
|
// PacketTypeHandshake is the packet type of a Handshake packet
|
|
PacketTypeHandshake
|
|
// PacketType0RTT is the packet type of a 0-RTT packet
|
|
PacketType0RTT
|
|
)
|
|
|
|
func (t PacketType) String() string {
|
|
switch t {
|
|
case PacketTypeInitial:
|
|
return "Initial"
|
|
case PacketTypeRetry:
|
|
return "Retry"
|
|
case PacketTypeHandshake:
|
|
return "Handshake"
|
|
case PacketType0RTT:
|
|
return "0-RTT Protected"
|
|
default:
|
|
return fmt.Sprintf("unknown packet type: %d", t)
|
|
}
|
|
}
|
|
|
|
type ECN uint8
|
|
|
|
const (
|
|
ECNUnsupported ECN = iota
|
|
ECNNon // 00
|
|
ECT1 // 01
|
|
ECT0 // 10
|
|
ECNCE // 11
|
|
)
|
|
|
|
func ParseECNHeaderBits(bits byte) ECN {
|
|
switch bits {
|
|
case 0:
|
|
return ECNNon
|
|
case 0b00000010:
|
|
return ECT0
|
|
case 0b00000001:
|
|
return ECT1
|
|
case 0b00000011:
|
|
return ECNCE
|
|
default:
|
|
panic("invalid ECN bits")
|
|
}
|
|
}
|
|
|
|
func (e ECN) ToHeaderBits() byte {
|
|
//nolint:exhaustive // There are only 4 values.
|
|
switch e {
|
|
case ECNNon:
|
|
return 0
|
|
case ECT0:
|
|
return 0b00000010
|
|
case ECT1:
|
|
return 0b00000001
|
|
case ECNCE:
|
|
return 0b00000011
|
|
default:
|
|
panic("ECN unsupported")
|
|
}
|
|
}
|
|
|
|
func (e ECN) String() string {
|
|
switch e {
|
|
case ECNUnsupported:
|
|
return "ECN unsupported"
|
|
case ECNNon:
|
|
return "Not-ECT"
|
|
case ECT1:
|
|
return "ECT(1)"
|
|
case ECT0:
|
|
return "ECT(0)"
|
|
case ECNCE:
|
|
return "CE"
|
|
default:
|
|
return fmt.Sprintf("invalid ECN value: %d", e)
|
|
}
|
|
}
|
|
|
|
// A ByteCount in QUIC
|
|
type ByteCount int64
|
|
|
|
// MaxByteCount is the maximum value of a ByteCount
|
|
const MaxByteCount = ByteCount(1<<62 - 1)
|
|
|
|
// InvalidByteCount is an invalid byte count
|
|
const InvalidByteCount ByteCount = -1
|
|
|
|
// A StatelessResetToken is a stateless reset token.
|
|
type StatelessResetToken [16]byte
|
|
|
|
// MaxPacketBufferSize maximum packet size of any QUIC packet, based on
|
|
// ethernet's max size, minus the IP and UDP headers. IPv6 has a 40 byte header,
|
|
// UDP adds an additional 8 bytes. This is a total overhead of 48 bytes.
|
|
// Ethernet's max packet size is 1500 bytes, 1500 - 48 = 1452.
|
|
const MaxPacketBufferSize = 1452
|
|
|
|
// MaxLargePacketBufferSize is used when using GSO
|
|
const MaxLargePacketBufferSize = 20 * 1024
|
|
|
|
// MinInitialPacketSize is the minimum size an Initial packet is required to have.
|
|
const MinInitialPacketSize = 1200
|
|
|
|
// MinUnknownVersionPacketSize is the minimum size a packet with an unknown version
|
|
// needs to have in order to trigger a Version Negotiation packet.
|
|
const MinUnknownVersionPacketSize = MinInitialPacketSize
|
|
|
|
// MinStatelessResetSize is the minimum size of a stateless reset packet that we send
|
|
const MinStatelessResetSize = 1 /* first byte */ + 20 /* max. conn ID length */ + 4 /* max. packet number length */ + 1 /* min. payload length */ + 16 /* token */
|
|
|
|
// MinConnectionIDLenInitial is the minimum length of the destination connection ID on an Initial packet.
|
|
const MinConnectionIDLenInitial = 8
|
|
|
|
// DefaultAckDelayExponent is the default ack delay exponent
|
|
const DefaultAckDelayExponent = 3
|
|
|
|
// DefaultActiveConnectionIDLimit is the default active connection ID limit
|
|
const DefaultActiveConnectionIDLimit = 2
|
|
|
|
// MaxAckDelayExponent is the maximum ack delay exponent
|
|
const MaxAckDelayExponent = 20
|
|
|
|
// DefaultMaxAckDelay is the default max_ack_delay
|
|
const DefaultMaxAckDelay = 25 * time.Millisecond
|
|
|
|
// MaxMaxAckDelay is the maximum max_ack_delay
|
|
const MaxMaxAckDelay = (1<<14 - 1) * time.Millisecond
|
|
|
|
// MaxConnIDLen is the maximum length of the connection ID
|
|
const MaxConnIDLen = 20
|
|
|
|
// InvalidPacketLimitAES is the maximum number of packets that we can fail to decrypt when using
|
|
// AEAD_AES_128_GCM or AEAD_AES_265_GCM.
|
|
const InvalidPacketLimitAES = 1 << 52
|
|
|
|
// InvalidPacketLimitChaCha is the maximum number of packets that we can fail to decrypt when using AEAD_CHACHA20_POLY1305.
|
|
const InvalidPacketLimitChaCha = 1 << 36
|