generate a client nonce once, when reading a server config multiple times

This commit is contained in:
Marten Seemann
2016-11-11 10:50:50 +07:00
parent a2996f6343
commit 4b67aefb83
2 changed files with 19 additions and 3 deletions

View File

@@ -97,6 +97,7 @@ func (h *cryptoSetupClient) handleREJMessage(cryptoData map[Tag][]byte) error {
h.sno = sno h.sno = sno
} }
// TODO: what happens if the server sends a different server config in two packets?
if scfg, ok := cryptoData[TagSCFG]; ok { if scfg, ok := cryptoData[TagSCFG]; ok {
h.serverConfig, err = parseServerConfig(scfg) h.serverConfig, err = parseServerConfig(scfg)
if err != nil { if err != nil {
@@ -104,9 +105,11 @@ func (h *cryptoSetupClient) handleREJMessage(cryptoData map[Tag][]byte) error {
} }
// 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
err = h.generateClientNonce() if len(h.nonc) == 0 {
if err != nil { err = h.generateClientNonce()
return err if err != nil {
return err
}
} }
} }

View File

@@ -90,6 +90,19 @@ var _ = Describe("Crypto setup", func() {
Expect(cs.nonc).To(HaveLen(32)) Expect(cs.nonc).To(HaveLen(32))
}) })
It("only generates a client nonce once, when reading multiple server configs", func() {
b := &bytes.Buffer{}
WriteHandshakeMessage(b, TagSCFG, getDefaultServerConfigClient())
tagMap[TagSCFG] = b.Bytes()
err := cs.handleREJMessage(tagMap)
Expect(err).ToNot(HaveOccurred())
nonc := cs.nonc
Expect(nonc).ToNot(BeEmpty())
err = cs.handleREJMessage(tagMap)
Expect(err).ToNot(HaveOccurred())
Expect(cs.nonc).To(Equal(nonc))
})
It("passes on errors from reading the server config", func() { It("passes on errors from reading the server config", func() {
b := &bytes.Buffer{} b := &bytes.Buffer{}
WriteHandshakeMessage(b, TagSHLO, make(map[Tag][]byte)) WriteHandshakeMessage(b, TagSHLO, make(map[Tag][]byte))