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 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 // now that we have a server config, we can use its OBIT value to generate a client nonce
if len(h.nonc) == 0 { if len(h.nonc) == 0 {
err = h.generateClientNonce() err = h.generateClientNonce()

View File

@@ -100,6 +100,21 @@ var _ = Describe("Crypto setup", func() {
Expect(cs.serverConfig.ID).To(Equal(scfg[TagSCID])) 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() { It("generates a client nonce after reading a server config", func() {
b := &bytes.Buffer{} b := &bytes.Buffer{}
WriteHandshakeMessage(b, TagSCFG, getDefaultServerConfigClient()) WriteHandshakeMessage(b, TagSCFG, getDefaultServerConfigClient())

View File

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

View File

@@ -17,7 +17,7 @@ func getDefaultServerConfigClient() map[Tag][]byte {
TagAEAD: []byte("AESG"), TagAEAD: []byte("AESG"),
TagPUBS: bytes.Repeat([]byte{0}, 35), TagPUBS: bytes.Repeat([]byte{0}, 35),
TagOBIT: bytes.Repeat([]byte{0}, 8), 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())) 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() { Context("parsing the server config", func() {
It("rejects a handshake message with the wrong message tag", func() { It("rejects a handshake message with the wrong message tag", func() {
var serverConfig bytes.Buffer var serverConfig bytes.Buffer