parse version negotiation packets

This commit is contained in:
Marten Seemann
2016-12-01 18:44:25 +07:00
parent 7fa93c56af
commit 1154d22218
2 changed files with 32 additions and 7 deletions

View File

@@ -27,7 +27,8 @@ type PublicHeader struct {
TruncateConnectionID bool
PacketNumberLen protocol.PacketNumberLen
PacketNumber protocol.PacketNumber
VersionNumber protocol.VersionNumber
VersionNumber protocol.VersionNumber // VersionNumber sent by the client
SupportedVersions []protocol.VersionNumber // VersionNumbers sent by the server
DiversificationNonce []byte
}
@@ -169,13 +170,27 @@ func ParsePublicHeader(b io.ByteReader, packetSentBy protocol.Perspective) (*Pub
}
// Version (optional)
if header.VersionFlag && !header.ResetFlag {
var versionTag uint32
versionTag, err = utils.ReadUint32(b)
if err != nil {
return nil, err
if !header.ResetFlag {
if header.VersionFlag {
if packetSentBy == protocol.PerspectiveClient {
var versionTag uint32
versionTag, err = utils.ReadUint32(b)
if err != nil {
return nil, err
}
header.VersionNumber = protocol.VersionTagToNumber(versionTag)
} else { // parse the version negotiaton packet
header.SupportedVersions = make([]protocol.VersionNumber, 0)
for {
var versionTag uint32
versionTag, err = utils.ReadUint32(b)
if err != nil {
break
}
header.SupportedVersions = append(header.SupportedVersions, protocol.VersionTagToNumber(versionTag))
}
}
}
header.VersionNumber = protocol.VersionTagToNumber(versionTag)
}
// Packet number

View File

@@ -18,6 +18,7 @@ var _ = Describe("Public Header", func() {
Expect(hdr.ResetFlag).To(BeFalse())
Expect(hdr.ConnectionID).To(Equal(protocol.ConnectionID(0x4cfa9f9b668619f6)))
Expect(hdr.VersionNumber).To(Equal(protocol.Version34))
Expect(hdr.SupportedVersions).To(BeEmpty())
Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(1)))
Expect(b.Len()).To(BeZero())
})
@@ -72,6 +73,15 @@ var _ = Describe("Public Header", func() {
Expect(err).To(MatchError("diversification nonces should only be sent by servers"))
})
It("parses version negotiation packets sent by the server", func() {
data := composeVersionNegotiation(0x1337)
hdr, err := ParsePublicHeader(bytes.NewReader(data), protocol.PerspectiveServer)
Expect(err).ToNot(HaveOccurred())
Expect(hdr.VersionFlag).To(BeTrue())
Expect(hdr.VersionNumber).To(BeZero()) // unitialized
Expect(hdr.SupportedVersions).To(Equal(protocol.SupportedVersions))
})
Context("Packet Number lengths", func() {
It("accepts 1-byte packet numbers", func() {
b := bytes.NewReader([]byte{0x08, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0xde})