forked from quic-go/quic-go
add a function to tell if a packet is a 0-RTT packet
This commit is contained in:
@@ -2,6 +2,7 @@ package wire
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -43,6 +44,21 @@ func IsVersionNegotiationPacket(b []byte) bool {
|
||||
return b[0]&0x80 > 0 && b[1] == 0 && b[2] == 0 && b[3] == 0 && b[4] == 0
|
||||
}
|
||||
|
||||
// Is0RTTPacket says if this is a 0-RTT packet.
|
||||
// A packet sent with a version we don't understand can never be a 0-RTT packet.
|
||||
func Is0RTTPacket(b []byte) bool {
|
||||
if len(b) < 5 {
|
||||
return false
|
||||
}
|
||||
if b[0]&0x80 == 0 {
|
||||
return false
|
||||
}
|
||||
if !protocol.IsSupportedVersion(protocol.SupportedVersions, protocol.VersionNumber(binary.BigEndian.Uint32(b[1:5]))) {
|
||||
return false
|
||||
}
|
||||
return b[0]&0x30>>4 == 0x1
|
||||
}
|
||||
|
||||
var ErrUnsupportedVersion = errors.New("unsupported version")
|
||||
|
||||
// The Header is the version independent part of the header
|
||||
|
||||
@@ -93,6 +93,24 @@ var _ = Describe("Header Parsing", func() {
|
||||
})
|
||||
})
|
||||
|
||||
Context("identifying 0-RTT packets", func() {
|
||||
var zeroRTTHeader []byte
|
||||
|
||||
BeforeEach(func() {
|
||||
zeroRTTHeader = make([]byte, 5)
|
||||
zeroRTTHeader[0] = 0x80 | 0x1<<4
|
||||
binary.BigEndian.PutUint32(zeroRTTHeader[1:], uint32(versionIETFFrames))
|
||||
})
|
||||
|
||||
It("recognizes 0-RTT packets", func() {
|
||||
Expect(Is0RTTPacket(zeroRTTHeader[:4])).To(BeFalse()) // too short
|
||||
Expect(Is0RTTPacket([]byte{zeroRTTHeader[0], 1, 2, 3, 4})).To(BeFalse()) // unknown version
|
||||
Expect(Is0RTTPacket([]byte{zeroRTTHeader[0] | 0x80, 1, 2, 3, 4})).To(BeFalse()) // short header
|
||||
Expect(Is0RTTPacket(zeroRTTHeader)).To(BeTrue())
|
||||
Expect(Is0RTTPacket(append(zeroRTTHeader, []byte("foobar")...))).To(BeTrue())
|
||||
})
|
||||
})
|
||||
|
||||
Context("Identifying Version Negotiation Packets", func() {
|
||||
It("identifies version negotiation packets", func() {
|
||||
Expect(IsVersionNegotiationPacket([]byte{0x80 | 0x56, 0, 0, 0, 0})).To(BeTrue())
|
||||
|
||||
Reference in New Issue
Block a user