forked from quic-go/quic-go
implement unpacking of 0-RTT packets
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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},
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user