accept null-encrypted pckts until an encrypted pckt has ben received

this should fix issue #33
This commit is contained in:
Lucas Clemente
2016-05-02 14:38:05 +02:00
parent d1a3d14cf1
commit 623bf065fd
2 changed files with 20 additions and 12 deletions

View File

@@ -25,6 +25,7 @@ type CryptoSetup struct {
secureAEAD crypto.AEAD
forwardSecureAEAD crypto.AEAD
receivedForwardSecurePacket bool
receivedSecurePacket bool
keyDerivation KeyDerivationFunction
@@ -106,7 +107,14 @@ func (h *CryptoSetup) Open(packetNumber protocol.PacketNumber, associatedData []
}
}
if h.secureAEAD != nil {
return h.secureAEAD.Open(packetNumber, associatedData, ciphertext)
res, err := h.secureAEAD.Open(packetNumber, associatedData, ciphertext)
if err == nil {
h.receivedSecurePacket = true
return res, nil
}
if h.receivedSecurePacket {
return nil, err
}
}
return (&crypto.NullAEAD{}).Open(packetNumber, associatedData, ciphertext)
}

View File

@@ -187,10 +187,20 @@ var _ = Describe("Crypto setup", func() {
Expect(d).To(Equal([]byte("foobar")))
})
It("is not accepted after CHLO", func() {
It("is still accepted after CHLO", func() {
doCHLO()
Expect(cs.secureAEAD).ToNot(BeNil())
_, err := cs.Open(0, []byte{}, foobarFNVSigned)
Expect(err).ToNot(HaveOccurred())
})
It("is not accepted after receiving secure packet", func() {
doCHLO()
Expect(cs.secureAEAD).ToNot(BeNil())
d, err := cs.Open(0, []byte{}, []byte("encrypted"))
Expect(err).ToNot(HaveOccurred())
Expect(d).To(Equal([]byte("decrypted")))
_, err = cs.Open(0, []byte{}, foobarFNVSigned)
Expect(err).To(MatchError("authentication failed"))
})
@@ -231,15 +241,5 @@ var _ = Describe("Crypto setup", func() {
Expect(err).To(MatchError("authentication failed"))
})
})
Context("forward secure encryption", func() {
It("is used after receiving forward secure packet", func() {
doCHLO()
_, err := cs.Open(0, []byte{}, []byte("forward secure encrypted"))
Expect(err).ToNot(HaveOccurred())
d := cs.Seal(0, []byte{}, []byte("foobar"))
Expect(d).To(Equal([]byte("forward secure encrypted")))
})
})
})
})