mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-23 22:27:38 -05:00
dfbc2e81e3
quic-go now vendors all of its dependencies, so we don't need to vendor them here. Created by running: gvt delete github.com/lucas-clemente/quic-go gvt delete github.com/bifurcation/mint gvt delete github.com/lucas-clemente/aes12 gvt delete github.com/lucas-clemente/fnv128a gvt delete github.com/lucas-clemente/quic-go-certificates gvt delete github.com/aead/chacha20 gvt delete github.com/hashicorp/golang-lru gvt fetch -tag v0.10.0-no-integrationtests github.com/lucas-clemente/quic-go
50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
|
|
"github.com/lucas-clemente/quic-go/internal/protocol"
|
|
)
|
|
|
|
// ReadVarIntPacketNumber reads a number in the QUIC varint packet number format
|
|
func ReadVarIntPacketNumber(b *bytes.Reader) (protocol.PacketNumber, protocol.PacketNumberLen, error) {
|
|
b1, err := b.ReadByte()
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
if b1&0x80 == 0 {
|
|
return protocol.PacketNumber(b1), protocol.PacketNumberLen1, nil
|
|
}
|
|
b2, err := b.ReadByte()
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
if b1&0x40 == 0 {
|
|
return protocol.PacketNumber(uint64(b1&0x3f)<<8 + uint64(b2)), protocol.PacketNumberLen2, nil
|
|
}
|
|
b3, err := b.ReadByte()
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
b4, err := b.ReadByte()
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
return protocol.PacketNumber(uint64(b1&0x3f)<<24 + uint64(b2)<<16 + uint64(b3)<<8 + uint64(b4)), protocol.PacketNumberLen4, nil
|
|
}
|
|
|
|
// WriteVarIntPacketNumber writes a packet number in the QUIC varint packet number format
|
|
func WriteVarIntPacketNumber(b *bytes.Buffer, i protocol.PacketNumber, len protocol.PacketNumberLen) error {
|
|
switch len {
|
|
case protocol.PacketNumberLen1:
|
|
b.WriteByte(uint8(i & 0x7f))
|
|
case protocol.PacketNumberLen2:
|
|
b.Write([]byte{(uint8(i>>8) & 0x3f) | 0x80, uint8(i)})
|
|
case protocol.PacketNumberLen4:
|
|
b.Write([]byte{(uint8(i>>24) & 0x3f) | 0xc0, uint8(i >> 16), uint8(i >> 8), uint8(i)})
|
|
default:
|
|
return fmt.Errorf("invalid packet number length: %d", len)
|
|
}
|
|
return nil
|
|
}
|