Skip to content

Commit

Permalink
Implements Stateless Reset parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
mpiraux committed Apr 28, 2020
1 parent 1da4265 commit bb8dad8
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 4 deletions.
14 changes: 11 additions & 3 deletions agents/parse_agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,18 @@ func (a *ParsingAgent) Run(conn *Connection) {
payload := cryptoState.Read.Decrypt(ciphertext[hLen:], uint64(header.PacketNumber()), ciphertext[:hLen])
if payload == nil {
a.Logger.Printf("Could not decrypt packet {type=%s, number=%d}\n", header.PacketType().String(), header.PacketNumber())
break packetSelect
statelessResetToken := ciphertext[len(ciphertext)-16:]
if bytes.Equal(statelessResetToken, conn.TLSTPHandler.ReceivedParameters.StatelessResetToken) {
a.Logger.Println("Received a Stateless Reset packet")
cleartext = ciphertext
packet = ReadStatelessResetPacket(bytes.NewReader(ciphertext))
} else {
break packetSelect
}
} else {
cleartext = append(append(cleartext, ic.Payload[off:off+hLen]...), payload...)
packet = ReadProtectedPacket(bytes.NewReader(cleartext), a.conn)
}
cleartext = append(append(cleartext, ic.Payload[off:off+hLen]...), payload...)
packet = ReadProtectedPacket(bytes.NewReader(cleartext), a.conn)
consumed = len(ic.Payload)
case Retry:
cleartext = ciphertext
Expand Down
18 changes: 18 additions & 0 deletions packets.go
Original file line number Diff line number Diff line change
Expand Up @@ -375,3 +375,21 @@ func NewZeroRTTProtectedPacket(conn *Connection) *ZeroRTTProtectedPacket {
return p
}

type StatelessResetPacket struct {
abstractPacket
UnpredictableBits []byte
StatelessResetToken [16]byte
}
func (*StatelessResetPacket) ShouldBeAcknowledged() bool { return false }
func (*StatelessResetPacket) PNSpace() PNSpace { return PNSpaceNoSpace }
func (p *StatelessResetPacket) Pointer() unsafe.Pointer { return unsafe.Pointer(p) }
func (*StatelessResetPacket) EncryptionLevel() EncryptionLevel { return EncryptionLevelNone }
func ( StatelessResetPacket) EncodePayload() []byte { return nil }

func ReadStatelessResetPacket(buffer *bytes.Reader) *StatelessResetPacket {
p := new(StatelessResetPacket)
p.UnpredictableBits = make([]byte, buffer.Len() - len(p.StatelessResetToken))
buffer.Read(p.UnpredictableBits)
buffer.Read(p.StatelessResetToken[:])
return p
}
2 changes: 1 addition & 1 deletion qlog/qt2qlog/qt2qlog.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func ConvertPacket(p Packet) *qlog.Packet {
}
// TODO handle PacketSize computation here
switch p.(type) {
case *VersionNegotiationPacket, *RetryPacket:
case *VersionNegotiationPacket, *RetryPacket, *StatelessResetPacket:
default:
j.Header.PacketNumber = uint64(p.Header().PacketNumber())
}
Expand Down

0 comments on commit bb8dad8

Please sign in to comment.