implement unpacking of 0-RTT packets

This commit is contained in:
Marten Seemann
2019-08-04 13:49:36 +07:00
parent c5f74595ca
commit fc37cdc5c5
5 changed files with 51 additions and 2 deletions

View File

@@ -34,6 +34,21 @@ func (m *MockSealingManager) EXPECT() *MockSealingManagerMockRecorder {
return m.recorder return m.recorder
} }
// Get0RTTSealer mocks base method
func (m *MockSealingManager) Get0RTTSealer() (handshake.LongHeaderSealer, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Get0RTTSealer")
ret0, _ := ret[0].(handshake.LongHeaderSealer)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// Get0RTTSealer indicates an expected call of Get0RTTSealer
func (mr *MockSealingManagerMockRecorder) Get0RTTSealer() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get0RTTSealer", reflect.TypeOf((*MockSealingManager)(nil).Get0RTTSealer))
}
// Get1RTTSealer mocks base method // Get1RTTSealer mocks base method
func (m *MockSealingManager) Get1RTTSealer() (handshake.ShortHeaderSealer, error) { func (m *MockSealingManager) Get1RTTSealer() (handshake.ShortHeaderSealer, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()

View File

@@ -65,6 +65,16 @@ func (u *packetUnpacker) Unpack(hdr *wire.Header, rcvTime time.Time, data []byte
if err != nil { if err != nil {
return nil, err return nil, err
} }
case protocol.PacketType0RTT:
encLevel = protocol.Encryption0RTT
opener, err := u.cs.Get0RTTOpener()
if err != nil {
return nil, err
}
extHdr, decrypted, err = u.unpackLongHeaderPacket(opener, hdr, data)
if err != nil {
return nil, err
}
default: default:
if hdr.IsLongHeader { if hdr.IsLongHeader {
return nil, fmt.Errorf("unknown packet type: %s", hdr.Type) return nil, fmt.Errorf("unknown packet type: %s", hdr.Type)

View File

@@ -78,6 +78,29 @@ var _ = Describe("Packet Unpacker", func() {
Expect(packet.data).To(Equal([]byte("decrypted"))) Expect(packet.data).To(Equal([]byte("decrypted")))
}) })
It("opens 0-RTT packets", func() {
extHdr := &wire.ExtendedHeader{
Header: wire.Header{
IsLongHeader: true,
Type: protocol.PacketType0RTT,
Length: 3 + 6, // packet number len + payload
DestConnectionID: connID,
Version: version,
},
PacketNumber: 2,
PacketNumberLen: 3,
}
hdr, hdrRaw := getHeader(extHdr)
opener := mocks.NewMockLongHeaderOpener(mockCtrl)
cs.EXPECT().Get0RTTOpener().Return(opener, nil)
opener.EXPECT().DecryptHeader(gomock.Any(), gomock.Any(), gomock.Any())
opener.EXPECT().Open(gomock.Any(), payload, extHdr.PacketNumber, hdrRaw).Return([]byte("decrypted"), nil)
packet, err := unpacker.Unpack(hdr, time.Now(), append(hdrRaw, payload...))
Expect(err).ToNot(HaveOccurred())
Expect(packet.encryptionLevel).To(Equal(protocol.Encryption0RTT))
Expect(packet.data).To(Equal([]byte("decrypted")))
})
It("returns the error when getting the sealer fails", func() { It("returns the error when getting the sealer fails", func() {
extHdr := &wire.ExtendedHeader{ extHdr := &wire.ExtendedHeader{
Header: wire.Header{DestConnectionID: connID}, Header: wire.Header{DestConnectionID: connID},

View File

@@ -361,6 +361,7 @@ func (s *baseServer) handlePacketImpl(p *receivedPacket) bool /* was the packet
// Drop long header packets. // Drop long header packets.
// There's litte point in sending a Stateless Reset, since the client // There's litte point in sending a Stateless Reset, since the client
// might not have received the token yet. // might not have received the token yet.
s.logger.Debugf("Dropping long header packet of type %s (%d bytes)", hdr.Type, len(p.data))
return false return false
} }

View File

@@ -683,8 +683,8 @@ func (s *session) handleSinglePacket(p *receivedPacket, hdr *wire.Header) bool /
s.logger.Debugf("Dropping %s packet with unexpected source connection ID: %s (expected %s)", hdr.PacketType(), hdr.SrcConnectionID, s.handshakeDestConnID) s.logger.Debugf("Dropping %s packet with unexpected source connection ID: %s (expected %s)", hdr.PacketType(), hdr.SrcConnectionID, s.handshakeDestConnID)
return false return false
} }
// drop 0-RTT packets // drop 0-RTT packets, if we are a client
if hdr.Type == protocol.PacketType0RTT { if s.perspective == protocol.PerspectiveClient && hdr.Type == protocol.PacketType0RTT {
return false return false
} }