From b58bc8cffda22edb8ace72e96489b3943492c400 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 10 Nov 2016 18:33:24 +0700 Subject: [PATCH] parse server config sent in the SHLO in client CryptoSetup --- handshake/crypto_setup_client.go | 11 +++++++++++ handshake/crypto_setup_client_test.go | 23 +++++++++++++++++++++++ handshake/server_config_client_test.go | 21 +++++++++++++-------- 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/handshake/crypto_setup_client.go b/handshake/crypto_setup_client.go index ce7365b7c..42a4562db 100644 --- a/handshake/crypto_setup_client.go +++ b/handshake/crypto_setup_client.go @@ -82,13 +82,24 @@ func (h *cryptoSetupClient) HandleCryptoStream() error { func (h *cryptoSetupClient) handleREJMessage(cryptoData map[Tag][]byte) error { utils.Debugf("Got REJ:\n%s", printHandshakeMessage(cryptoData)) + + var err error + if stk, ok := cryptoData[TagSTK]; ok { h.stk = stk } + if sno, ok := cryptoData[TagSNO]; ok { h.sno = sno } + if scfg, ok := cryptoData[TagSCFG]; ok { + h.serverConfig, err = parseServerConfig(scfg) + if err != nil { + return err + } + } + return nil } diff --git a/handshake/crypto_setup_client_test.go b/handshake/crypto_setup_client_test.go index d214626f1..247540571 100644 --- a/handshake/crypto_setup_client_test.go +++ b/handshake/crypto_setup_client_test.go @@ -62,6 +62,29 @@ var _ = Describe("Crypto setup", func() { Expect(err).ToNot(HaveOccurred()) Expect(cs.sno).To(Equal(nonc)) }) + + Context("Reading server configs", func() { + It("reads a server config", func() { + b := &bytes.Buffer{} + scfg := getDefaultServerConfigClient() + WriteHandshakeMessage(b, TagSCFG, scfg) + tagMap[TagSCFG] = b.Bytes() + err := cs.handleREJMessage(tagMap) + Expect(err).ToNot(HaveOccurred()) + Expect(cs.serverConfig).ToNot(BeNil()) + Expect(cs.serverConfig.ID).To(Equal(scfg[TagSCID])) + }) + + It("passes on errors from reading the server config", func() { + b := &bytes.Buffer{} + WriteHandshakeMessage(b, TagSHLO, make(map[Tag][]byte)) + tagMap[TagSCFG] = b.Bytes() + _, origErr := parseServerConfig(b.Bytes()) + err := cs.handleREJMessage(tagMap) + Expect(err).To(HaveOccurred()) + Expect(err).To(MatchError(origErr)) + }) + }) }) Context("CHLO generation", func() { diff --git a/handshake/server_config_client_test.go b/handshake/server_config_client_test.go index bfae57cf5..2625de939 100644 --- a/handshake/server_config_client_test.go +++ b/handshake/server_config_client_test.go @@ -9,18 +9,23 @@ import ( . "github.com/onsi/gomega" ) +// This tagMap can be passed to parseValues and is garantueed to not cause any errors +func getDefaultServerConfigClient() map[Tag][]byte { + return map[Tag][]byte{ + TagSCID: bytes.Repeat([]byte{'F'}, 16), + TagKEXS: []byte("C255"), + TagAEAD: []byte("AESG"), + TagPUBS: bytes.Repeat([]byte{0}, 35), + TagOBIT: bytes.Repeat([]byte{0}, 8), + TagEXPY: bytes.Repeat([]byte{0}, 8), + } +} + var _ = Describe("Server Config", func() { var tagMap map[Tag][]byte BeforeEach(func() { - // This tagMap can be passed to parseValues and doesn't cause any errors - tagMap = make(map[Tag][]byte) - tagMap[TagSCID] = bytes.Repeat([]byte{'F'}, 16) - tagMap[TagKEXS] = []byte("C255") - tagMap[TagAEAD] = []byte("AESG") - tagMap[TagPUBS] = bytes.Repeat([]byte{0}, 35) - tagMap[TagOBIT] = bytes.Repeat([]byte{0}, 8) - tagMap[TagEXPY] = bytes.Repeat([]byte{0}, 8) + tagMap = getDefaultServerConfigClient() }) It("returns the parsed server config", func() {