check if the received server config is expired

This commit is contained in:
Marten Seemann
2016-11-16 11:51:10 +07:00
parent 0b736b2cce
commit f9013edb77
4 changed files with 32 additions and 1 deletions

View File

@@ -119,6 +119,10 @@ func (h *cryptoSetupClient) handleREJMessage(cryptoData map[Tag][]byte) error {
return err
}
if h.serverConfig.IsExpired() {
return qerr.CryptoServerConfigExpired
}
// now that we have a server config, we can use its OBIT value to generate a client nonce
if len(h.nonc) == 0 {
err = h.generateClientNonce()

View File

@@ -100,6 +100,21 @@ var _ = Describe("Crypto setup", func() {
Expect(cs.serverConfig.ID).To(Equal(scfg[TagSCID]))
})
It("rejects expired server configs", func() {
b := &bytes.Buffer{}
scfg := getDefaultServerConfigClient()
scfg[TagEXPY] = []byte{0x80, 0x54, 0x72, 0x4F, 0, 0, 0, 0} // 2012-03-28
WriteHandshakeMessage(b, TagSCFG, scfg)
tagMap[TagSCFG] = b.Bytes()
// make sure we actually set TagEXPY correct
serverConfig, err := parseServerConfig(b.Bytes())
Expect(err).ToNot(HaveOccurred())
Expect(serverConfig.expiry.Year()).To(Equal(2012))
// now try to read this server config in the crypto setup
err = cs.handleREJMessage(tagMap)
Expect(err).To(MatchError(qerr.CryptoServerConfigExpired))
})
It("generates a client nonce after reading a server config", func() {
b := &bytes.Buffer{}
WriteHandshakeMessage(b, TagSCFG, getDefaultServerConfigClient())

View File

@@ -134,6 +134,10 @@ func (s *serverConfigClient) parseValues(tagMap map[Tag][]byte) error {
return nil
}
func (s *serverConfigClient) IsExpired() bool {
return s.expiry.Before(time.Now())
}
func (s *serverConfigClient) Get() []byte {
return s.raw
}

View File

@@ -17,7 +17,7 @@ func getDefaultServerConfigClient() map[Tag][]byte {
TagAEAD: []byte("AESG"),
TagPUBS: bytes.Repeat([]byte{0}, 35),
TagOBIT: bytes.Repeat([]byte{0}, 8),
TagEXPY: bytes.Repeat([]byte{0}, 8),
TagEXPY: []byte{0x0, 0x6c, 0x57, 0x78, 0, 0, 0, 0}, // 2033-12-24
}
}
@@ -45,6 +45,14 @@ var _ = Describe("Server Config", func() {
Expect(scfg.raw).To(Equal(b.Bytes()))
})
It("tells if a server config is expired", func() {
scfg := &serverConfigClient{}
scfg.expiry = time.Now().Add(-time.Second)
Expect(scfg.IsExpired()).To(BeTrue())
scfg.expiry = time.Now().Add(time.Second)
Expect(scfg.IsExpired()).To(BeFalse())
})
Context("parsing the server config", func() {
It("rejects a handshake message with the wrong message tag", func() {
var serverConfig bytes.Buffer