]> Cypherpunks repositories - gostls13.git/commitdiff
crypto/tls: simplify keylog tests.
authorAdam Langley <agl@golang.org>
Fri, 30 Sep 2016 19:55:25 +0000 (12:55 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sat, 1 Oct 2016 15:50:11 +0000 (15:50 +0000)
Since there's no aspect of key logging that OpenSSL can check for us,
the tests for it might as well just connect to another goroutine as this
is lower-maintainance.

Change-Id: I746d1dbad1b4bbfc8ef6ccf136ee4824dbda021e
Reviewed-on: https://go-review.googlesource.com/30089
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Joonas Kuorilehto <joneskoo@derbian.fi>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/crypto/tls/common.go
src/crypto/tls/handshake_client.go
src/crypto/tls/handshake_client_test.go
src/crypto/tls/handshake_server_test.go
src/crypto/tls/testdata/Client-TLSv10-KeyLogWriter [deleted file]
src/crypto/tls/testdata/Server-TLSv10-KeyLogWriter [deleted file]

index 28b3d4c6cec7c6a905652b5f0848653f62906df4..f2989b6effc05c03aea2f0ca377ab7618296937f 100644 (file)
@@ -637,15 +637,19 @@ func (c *Config) BuildNameToCertificate() {
        }
 }
 
-// writeKeyLog logs client random and master secret if logging enabled
-// by setting KeyLogWriter.
+// writeKeyLog logs client random and master secret if logging was enabled by
+// setting c.KeyLogWriter.
 func (c *Config) writeKeyLog(clientRandom, masterSecret []byte) error {
        if c.KeyLogWriter == nil {
                return nil
        }
+
+       logLine := []byte(fmt.Sprintf("CLIENT_RANDOM %x %x\n", clientRandom, masterSecret))
+
        writerMutex.Lock()
-       _, err := fmt.Fprintf(c.KeyLogWriter, "CLIENT_RANDOM %x %x\n", clientRandom, masterSecret)
+       _, err := c.KeyLogWriter.Write(logLine)
        writerMutex.Unlock()
+
        return err
 }
 
index 577e823dd956e4b7a8c69a814614eb65a5d05c1c..e42953a0755e3236c2f3734548b816b7647aae9a 100644 (file)
@@ -523,7 +523,7 @@ func (hs *clientHandshakeState) doFullHandshake() error {
        hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.hello.random, hs.serverHello.random)
        if err := c.config.writeKeyLog(hs.hello.random, hs.masterSecret); err != nil {
                c.sendAlert(alertInternalError)
-               return errors.New("tls: failed to write to key log:" + err.Error())
+               return errors.New("tls: failed to write to key log: " + err.Error())
        }
 
        hs.finishedHash.discardHandshakeBuffer()
index 143d1d9fb0af8575b09a5509eed356b6fd512a64..822d922026e363b4916fd316c8345b116b3b989f 100644 (file)
@@ -728,45 +728,55 @@ func TestLRUClientSessionCache(t *testing.T) {
        }
 }
 
-func TestHandshakeClientKeyLog(t *testing.T) {
-       config := testConfig.Clone()
-       buf := &bytes.Buffer{}
-       config.KeyLogWriter = buf
+func TestKeyLog(t *testing.T) {
+       var serverBuf, clientBuf bytes.Buffer
 
-       // config.Rand is zero reader, so client random is all-0
-       var zeroRandom = strings.Repeat("0", 64)
+       clientConfig := testConfig.Clone()
+       clientConfig.KeyLogWriter = &clientBuf
 
-       test := &clientTest{
-               name:    "KeyLogWriter",
-               command: []string{"openssl", "s_server"},
-               config:  config,
-               validate: func(state ConnectionState) error {
-                       var format, clientRandom, masterSecret string
-                       if _, err := fmt.Fscanf(buf, "%s %s %s\n", &format, &clientRandom, &masterSecret); err != nil {
-                               return fmt.Errorf("failed to parse KeyLogWriter: " + err.Error())
-                       }
-                       if format != "CLIENT_RANDOM" {
-                               return fmt.Errorf("got key log format %q, wanted CLIENT_RANDOM", format)
-                       }
-                       if clientRandom != zeroRandom {
-                               return fmt.Errorf("got key log client random %q, wanted %q", clientRandom, zeroRandom)
-                       }
+       serverConfig := testConfig.Clone()
+       serverConfig.KeyLogWriter = &serverBuf
 
-                       // Master secret is random from server; check length only
-                       if len(masterSecret) != 96 {
-                               return fmt.Errorf("got wrong length master secret in key log %v, want 96", len(masterSecret))
-                       }
+       c, s := net.Pipe()
+       done := make(chan bool)
 
-                       // buf should contain no more lines
-                       var trailingGarbage string
-                       if _, err := fmt.Fscanln(buf, &trailingGarbage); err == nil {
-                               return fmt.Errorf("expected exactly one key in log, got trailing garbage %q", trailingGarbage)
-                       }
+       go func() {
+               defer close(done)
 
-                       return nil
-               },
+               if err := Server(s, serverConfig).Handshake(); err != nil {
+                       t.Errorf("server: %s", err)
+                       return
+               }
+               s.Close()
+       }()
+
+       if err := Client(c, clientConfig).Handshake(); err != nil {
+               t.Fatalf("client: %s", err)
        }
-       runClientTestTLS10(t, test)
+
+       c.Close()
+       <-done
+
+       checkKeylogLine := func(side, loggedLine string) {
+               if len(loggedLine) == 0 {
+                       t.Fatalf("%s: no keylog line was produced", side)
+               }
+               const expectedLen = 13 /* "CLIENT_RANDOM" */ +
+                       1 /* space */ +
+                       32*2 /* hex client nonce */ +
+                       1 /* space */ +
+                       48*2 /* hex master secret */ +
+                       1 /* new line */
+               if len(loggedLine) != expectedLen {
+                       t.Fatalf("%s: keylog line has incorrect length (want %d, got %d): %q", side, expectedLen, len(loggedLine), loggedLine)
+               }
+               if !strings.HasPrefix(loggedLine, "CLIENT_RANDOM "+strings.Repeat("0", 64)+" ") {
+                       t.Fatalf("%s: keylog line has incorrect structure or nonce: %q", side, loggedLine)
+               }
+       }
+
+       checkKeylogLine("client", string(clientBuf.Bytes()))
+       checkKeylogLine("server", string(serverBuf.Bytes()))
 }
 
 func TestHandshakeClientALPNMatch(t *testing.T) {
index f42bad3a999d9f2ef0c1b6810cbecae1b756e5a6..f64d97710824cc227c61dae7337ebe17c6beb212 100644 (file)
@@ -747,43 +747,6 @@ func TestHandshakeServerECDHEECDSAAES(t *testing.T) {
        runServerTestTLS12(t, test)
 }
 
-func TestHandshakeServerKeyLog(t *testing.T) {
-       config := testConfig.Clone()
-       buf := &bytes.Buffer{}
-       config.KeyLogWriter = buf
-
-       test := &serverTest{
-               name:    "KeyLogWriter",
-               command: []string{"openssl", "s_client"},
-               config:  config,
-               validate: func(state ConnectionState) error {
-                       var format, clientRandom, masterSecret string
-                       if _, err := fmt.Fscanf(buf, "%s %s %s\n", &format, &clientRandom, &masterSecret); err != nil {
-                               return fmt.Errorf("failed to parse KeyLogWriter: " + err.Error())
-                       }
-                       if format != "CLIENT_RANDOM" {
-                               return fmt.Errorf("got key log format %q, wanted CLIENT_RANDOM", format)
-                       }
-                       // Both clientRandom and masterSecret are unpredictable in server handshake test
-                       if len(clientRandom) != 64 {
-                               return fmt.Errorf("got wrong length client random in key log %v, wanted 64", len(clientRandom))
-                       }
-                       if len(masterSecret) != 96 {
-                               return fmt.Errorf("got wrong length master secret in key log %v, want 96", len(masterSecret))
-                       }
-
-                       // buf should contain no more lines
-                       var trailingGarbage string
-                       if _, err := fmt.Fscanln(buf, &trailingGarbage); err == nil {
-                               return fmt.Errorf("expected exactly one key in log, got trailing garbage %q", trailingGarbage)
-                       }
-
-                       return nil
-               },
-       }
-       runServerTestTLS10(t, test)
-}
-
 func TestHandshakeServerALPN(t *testing.T) {
        config := testConfig.Clone()
        config.NextProtos = []string{"proto1", "proto2"}
diff --git a/src/crypto/tls/testdata/Client-TLSv10-KeyLogWriter b/src/crypto/tls/testdata/Client-TLSv10-KeyLogWriter
deleted file mode 100644 (file)
index b2ce45e..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 8b 01 00 00  87 03 03 00 00 00 00 00  |................|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 28 c0 2f  |.............(./|
-00000030  c0 2b c0 30 c0 2c c0 27  c0 13 c0 23 c0 09 c0 14  |.+.0.,.'...#....|
-00000040  c0 0a 00 9c 00 9d 00 3c  00 2f 00 35 c0 12 00 0a  |.......<./.5....|
-00000050  00 05 c0 11 c0 07 01 00  00 36 00 05 00 05 01 00  |.........6......|
-00000060  00 00 00 00 0a 00 08 00  06 00 17 00 18 00 19 00  |................|
-00000070  0b 00 02 01 00 00 0d 00  0e 00 0c 04 01 04 03 05  |................|
-00000080  01 05 03 02 01 02 03 ff  01 00 01 00 00 12 00 00  |................|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 51 02 00 00  4d 03 01 57 b8 3b cc ec  |....Q...M..W.;..|
-00000010  06 37 31 e0 76 72 0b 48  40 8f 7a 06 15 1b e2 61  |.71.vr.H@.z....a|
-00000020  6e 80 81 64 2d a8 3b d2  07 76 a3 20 93 ee d8 71  |n..d-.;..v. ...q|
-00000030  17 8e 8c a3 74 fd 9e 82  f9 01 66 71 fe 6b 6f 1c  |....t.....fq.ko.|
-00000040  4f 22 2f 50 18 b7 af 56  63 be 52 62 00 2f 00 00  |O"/P...Vc.Rb./..|
-00000050  05 ff 01 00 01 00 16 03  01 02 59 0b 00 02 55 00  |..........Y...U.|
-00000060  02 52 00 02 4f 30 82 02  4b 30 82 01 b4 a0 03 02  |.R..O0..K0......|
-00000070  01 02 02 09 00 e8 f0 9d  3f e2 5b ea a6 30 0d 06  |........?.[..0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 1f 31 0b  |.*.H........0.1.|
-00000090  30 09 06 03 55 04 0a 13  02 47 6f 31 10 30 0e 06  |0...U....Go1.0..|
-000000a0  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-000000b0  0d 31 36 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.160101000000Z..|
-000000c0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 1a 31  |250101000000Z0.1|
-000000d0  0b 30 09 06 03 55 04 0a  13 02 47 6f 31 0b 30 09  |.0...U....Go1.0.|
-000000e0  06 03 55 04 03 13 02 47  6f 30 81 9f 30 0d 06 09  |..U....Go0..0...|
-000000f0  2a 86 48 86 f7 0d 01 01  01 05 00 03 81 8d 00 30  |*.H............0|
-00000100  81 89 02 81 81 00 db 46  7d 93 2e 12 27 06 48 bc  |.......F}...'.H.|
-00000110  06 28 21 ab 7e c4 b6 a2  5d fe 1e 52 45 88 7a 36  |.(!.~...]..RE.z6|
-00000120  47 a5 08 0d 92 42 5b c2  81 c0 be 97 79 98 40 fb  |G....B[.....y.@.|
-00000130  4f 6d 14 fd 2b 13 8b c2  a5 2e 67 d8 d4 09 9e d6  |Om..+.....g.....|
-00000140  22 38 b7 4a 0b 74 73 2b  c2 34 f1 d1 93 e5 96 d9  |"8.J.ts+.4......|
-00000150  74 7b f3 58 9f 6c 61 3c  c0 b0 41 d4 d9 2b 2b 24  |t{.X.la<..A..++$|
-00000160  23 77 5b 1c 3b bd 75 5d  ce 20 54 cf a1 63 87 1d  |#w[.;.u]. T..c..|
-00000170  1e 24 c4 f3 1d 1a 50 8b  aa b6 14 43 ed 97 a7 75  |.$....P....C...u|
-00000180  62 f4 14 c8 52 d7 02 03  01 00 01 a3 81 93 30 81  |b...R.........0.|
-00000190  90 30 0e 06 03 55 1d 0f  01 01 ff 04 04 03 02 05  |.0...U..........|
-000001a0  a0 30 1d 06 03 55 1d 25  04 16 30 14 06 08 2b 06  |.0...U.%..0...+.|
-000001b0  01 05 05 07 03 01 06 08  2b 06 01 05 05 07 03 02  |........+.......|
-000001c0  30 0c 06 03 55 1d 13 01  01 ff 04 02 30 00 30 19  |0...U.......0.0.|
-000001d0  06 03 55 1d 0e 04 12 04  10 9f 91 16 1f 43 43 3e  |..U..........CC>|
-000001e0  49 a6 de 6d b6 80 d7 9f  60 30 1b 06 03 55 1d 23  |I..m....`0...U.#|
-000001f0  04 14 30 12 80 10 48 13  49 4d 13 7e 16 31 bb a3  |..0...H.IM.~.1..|
-00000200  01 d5 ac ab 6e 7b 30 19  06 03 55 1d 11 04 12 30  |....n{0...U....0|
-00000210  10 82 0e 65 78 61 6d 70  6c 65 2e 67 6f 6c 61 6e  |...example.golan|
-00000220  67 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |g0...*.H........|
-00000230  03 81 81 00 9d 30 cc 40  2b 5b 50 a0 61 cb ba e5  |.....0.@+[P.a...|
-00000240  53 58 e1 ed 83 28 a9 58  1a a9 38 a4 95 a1 ac 31  |SX...(.X..8....1|
-00000250  5a 1a 84 66 3d 43 d3 2d  d9 0b f2 97 df d3 20 64  |Z..f=C.-...... d|
-00000260  38 92 24 3a 00 bc cf 9c  7d b7 40 20 01 5f aa d3  |8.$:....}.@ ._..|
-00000270  16 61 09 a2 76 fd 13 c3  cc e1 0c 5c ee b1 87 82  |.a..v......\....|
-00000280  f1 6c 04 ed 73 bb b3 43  77 8d 0c 1c f1 0f a1 d8  |.l..s..Cw.......|
-00000290  40 83 61 c9 4c 72 2b 9d  ae db 46 06 06 4d f4 c1  |@.a.Lr+...F..M..|
-000002a0  b3 3e c0 d1 bd 42 d4 db  fe 3d 13 60 84 5c 21 d3  |.>...B...=.`.\!.|
-000002b0  3b e9 fa e7 16 03 01 00  04 0e 00 00 00           |;............|
->>> Flow 3 (client to server)
-00000000  16 03 01 00 86 10 00 00  82 00 80 b9 65 8d bf a7  |............e...|
-00000010  c8 4b 79 ce 6f cb 8b 13  1c ac b9 7d 66 5e e9 ba  |.Ky.o......}f^..|
-00000020  1d 71 4e a9 e9 34 ae f6  64 65 90 3b d8 16 52 a2  |.qN..4..de.;..R.|
-00000030  6f f4 cb 8a 13 74 a2 ee  b7 27 69 b4 41 c0 90 68  |o....t...'i.A..h|
-00000040  bc 02 69 e1 c6 48 4f 39  36 30 25 ca 4c 17 ce 83  |..i..HO960%.L...|
-00000050  9e 08 56 e3 05 49 93 9e  2e c4 fb e6 c8 01 f1 0f  |..V..I..........|
-00000060  c5 70 0f 08 83 48 e9 48  ef 6e 50 8b 05 7e e5 84  |.p...H.H.nP..~..|
-00000070  25 fa 55 c7 ae 31 02 27  00 ef 3f 98 86 20 12 89  |%.U..1.'..?.. ..|
-00000080  91 59 28 b4 f7 d7 af d2  69 61 35 14 03 01 00 01  |.Y(.....ia5.....|
-00000090  01 16 03 01 00 30 1d 92  fd 37 c1 b0 b9 f3 cf c4  |.....0...7......|
-000000a0  56 72 cf df 2e 24 3f 87  77 5d fa 10 08 81 e8 af  |Vr...$?.w]......|
-000000b0  f3 f1 67 4c ae 73 0f 0f  fa 16 df 37 1f 8a 96 f2  |..gL.s.....7....|
-000000c0  b5 30 9d ca 5a 56                                 |.0..ZV|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 ad 53 97 4c cb  |..........0.S.L.|
-00000010  0f 87 69 5f d3 26 90 f1  76 a3 68 41 0a 3a 53 06  |..i_.&..v.hA.:S.|
-00000020  1c ae b0 2a 60 fd 2c 67  1a b2 02 f8 96 99 cf bf  |...*`.,g........|
-00000030  05 b0 ef 86 30 04 ea 30  79 5c fc                 |....0..0y\.|
->>> Flow 5 (client to server)
-00000000  17 03 01 00 20 66 62 1a  6e ed 6d 90 3e 99 a2 1b  |.... fb.n.m.>...|
-00000010  40 cd 8e 32 91 1e 92 00  28 0b 13 32 74 a1 d6 66  |@..2....(..2t..f|
-00000020  88 93 a5 69 22 17 03 01  00 20 a4 4e 90 dd 00 9a  |...i".... .N....|
-00000030  df 03 07 6f ef 26 97 0f  3f 6a 51 c8 89 29 26 95  |...o.&..?jQ..)&.|
-00000040  1b c4 8e 70 e5 ba fc 12  40 8c 15 03 01 00 20 ce  |...p....@..... .|
-00000050  a5 16 1a e2 e6 3a 1f a3  4f fe fe 69 73 c4 dd 07  |.....:..O..is...|
-00000060  65 03 99 20 0f ef 79 eb  43 7f df a8 30 03 e9     |e.. ..y.C...0..|
diff --git a/src/crypto/tls/testdata/Server-TLSv10-KeyLogWriter b/src/crypto/tls/testdata/Server-TLSv10-KeyLogWriter
deleted file mode 100644 (file)
index aafee9d..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 5f 01 00 00  5b 03 01 57 b8 3c c5 75  |...._...[..W.<.u|
-00000010  f1 cb 38 e5 78 fd 82 44  ba bf 25 55 88 e9 0a 2a  |..8.x..D..%U...*|
-00000020  b2 69 8a b6 c9 75 20 30  14 82 99 00 00 2e 00 39  |.i...u 0.......9|
-00000030  00 38 00 35 00 16 00 13  00 0a 00 33 00 32 00 2f  |.8.5.......3.2./|
-00000040  00 9a 00 99 00 96 00 05  00 04 00 15 00 12 00 09  |................|
-00000050  00 14 00 11 00 08 00 06  00 03 00 ff 01 00 00 04  |................|
-00000060  00 23 00 00                                       |.#..|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 35 02 00 00  31 03 01 00 00 00 00 00  |....5...1.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 35 00 00  |.............5..|
-00000030  09 00 23 00 00 ff 01 00  01 00 16 03 01 02 59 0b  |..#...........Y.|
-00000040  00 02 55 00 02 52 00 02  4f 30 82 02 4b 30 82 01  |..U..R..O0..K0..|
-00000050  b4 a0 03 02 01 02 02 09  00 e8 f0 9d 3f e2 5b ea  |............?.[.|
-00000060  a6 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
-00000070  30 1f 31 0b 30 09 06 03  55 04 0a 13 02 47 6f 31  |0.1.0...U....Go1|
-00000080  10 30 0e 06 03 55 04 03  13 07 47 6f 20 52 6f 6f  |.0...U....Go Roo|
-00000090  74 30 1e 17 0d 31 36 30  31 30 31 30 30 30 30 30  |t0...16010100000|
-000000a0  30 5a 17 0d 32 35 30 31  30 31 30 30 30 30 30 30  |0Z..250101000000|
-000000b0  5a 30 1a 31 0b 30 09 06  03 55 04 0a 13 02 47 6f  |Z0.1.0...U....Go|
-000000c0  31 0b 30 09 06 03 55 04  03 13 02 47 6f 30 81 9f  |1.0...U....Go0..|
-000000d0  30 0d 06 09 2a 86 48 86  f7 0d 01 01 01 05 00 03  |0...*.H.........|
-000000e0  81 8d 00 30 81 89 02 81  81 00 db 46 7d 93 2e 12  |...0.......F}...|
-000000f0  27 06 48 bc 06 28 21 ab  7e c4 b6 a2 5d fe 1e 52  |'.H..(!.~...]..R|
-00000100  45 88 7a 36 47 a5 08 0d  92 42 5b c2 81 c0 be 97  |E.z6G....B[.....|
-00000110  79 98 40 fb 4f 6d 14 fd  2b 13 8b c2 a5 2e 67 d8  |y.@.Om..+.....g.|
-00000120  d4 09 9e d6 22 38 b7 4a  0b 74 73 2b c2 34 f1 d1  |...."8.J.ts+.4..|
-00000130  93 e5 96 d9 74 7b f3 58  9f 6c 61 3c c0 b0 41 d4  |....t{.X.la<..A.|
-00000140  d9 2b 2b 24 23 77 5b 1c  3b bd 75 5d ce 20 54 cf  |.++$#w[.;.u]. T.|
-00000150  a1 63 87 1d 1e 24 c4 f3  1d 1a 50 8b aa b6 14 43  |.c...$....P....C|
-00000160  ed 97 a7 75 62 f4 14 c8  52 d7 02 03 01 00 01 a3  |...ub...R.......|
-00000170  81 93 30 81 90 30 0e 06  03 55 1d 0f 01 01 ff 04  |..0..0...U......|
-00000180  04 03 02 05 a0 30 1d 06  03 55 1d 25 04 16 30 14  |.....0...U.%..0.|
-00000190  06 08 2b 06 01 05 05 07  03 01 06 08 2b 06 01 05  |..+.........+...|
-000001a0  05 07 03 02 30 0c 06 03  55 1d 13 01 01 ff 04 02  |....0...U.......|
-000001b0  30 00 30 19 06 03 55 1d  0e 04 12 04 10 9f 91 16  |0.0...U.........|
-000001c0  1f 43 43 3e 49 a6 de 6d  b6 80 d7 9f 60 30 1b 06  |.CC>I..m....`0..|
-000001d0  03 55 1d 23 04 14 30 12  80 10 48 13 49 4d 13 7e  |.U.#..0...H.IM.~|
-000001e0  16 31 bb a3 01 d5 ac ab  6e 7b 30 19 06 03 55 1d  |.1......n{0...U.|
-000001f0  11 04 12 30 10 82 0e 65  78 61 6d 70 6c 65 2e 67  |...0...example.g|
-00000200  6f 6c 61 6e 67 30 0d 06  09 2a 86 48 86 f7 0d 01  |olang0...*.H....|
-00000210  01 0b 05 00 03 81 81 00  9d 30 cc 40 2b 5b 50 a0  |.........0.@+[P.|
-00000220  61 cb ba e5 53 58 e1 ed  83 28 a9 58 1a a9 38 a4  |a...SX...(.X..8.|
-00000230  95 a1 ac 31 5a 1a 84 66  3d 43 d3 2d d9 0b f2 97  |...1Z..f=C.-....|
-00000240  df d3 20 64 38 92 24 3a  00 bc cf 9c 7d b7 40 20  |.. d8.$:....}.@ |
-00000250  01 5f aa d3 16 61 09 a2  76 fd 13 c3 cc e1 0c 5c  |._...a..v......\|
-00000260  ee b1 87 82 f1 6c 04 ed  73 bb b3 43 77 8d 0c 1c  |.....l..s..Cw...|
-00000270  f1 0f a1 d8 40 83 61 c9  4c 72 2b 9d ae db 46 06  |....@.a.Lr+...F.|
-00000280  06 4d f4 c1 b3 3e c0 d1  bd 42 d4 db fe 3d 13 60  |.M...>...B...=.`|
-00000290  84 5c 21 d3 3b e9 fa e7  16 03 01 00 04 0e 00 00  |.\!.;...........|
-000002a0  00                                                |.|
->>> Flow 3 (client to server)
-00000000  16 03 01 00 86 10 00 00  82 00 80 1a 4d 38 1d 19  |............M8..|
-00000010  9b a3 df 67 f5 f8 7e 0a  93 1d d4 2a 3d e2 c2 64  |...g..~....*=..d|
-00000020  9b bb ec 45 54 e6 2d b1  e0 d7 a2 9a 5a c8 7d fd  |...ET.-.....Z.}.|
-00000030  6e f0 da 44 e8 71 ca ff  1d 4f dd 7b 95 f3 60 49  |n..D.q...O.{..`I|
-00000040  8f 35 45 32 f9 8c fd 3c  65 23 7d a8 e4 e9 09 16  |.5E2...<e#}.....|
-00000050  ce bf 17 b0 6d 50 8e 73  06 54 bf e2 10 13 a5 55  |....mP.s.T.....U|
-00000060  80 86 26 a3 bc ee 36 59  c5 b4 1e b2 11 c0 d7 3d  |..&...6Y.......=|
-00000070  33 89 ec 7f 2a 56 ff c3  f7 ed a7 a1 4e 3f 36 1f  |3...*V......N?6.|
-00000080  1c c2 c2 c3 93 21 a7 67  b2 d2 46 14 03 01 00 01  |.....!.g..F.....|
-00000090  01 16 03 01 00 30 9a cd  cc de 85 fd a5 f8 12 52  |.....0.........R|
-000000a0  02 48 59 b5 2a ec 20 38  c6 ba d9 cc 56 ab 0a 9a  |.HY.*. 8....V...|
-000000b0  42 67 da 0a cb 79 c5 61  c7 a8 77 45 67 31 a6 9a  |Bg...y.a..wEg1..|
-000000c0  15 54 1d ef 92 7a                                 |.T...z|
->>> Flow 4 (server to client)
-00000000  16 03 01 00 82 04 00 00  7e 00 00 00 00 00 78 50  |........~.....xP|
-00000010  46 ad c1 db a8 38 86 7b  2b bb fd d0 c3 42 3e 00  |F....8.{+....B>.|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
-00000030  6d 2c 85 83 61 d2 8a 86  79 fe 6e fd c9 09 56 98  |m,..a...y.n...V.|
-00000040  1c 42 38 90 81 cd eb ed  37 3e 90 af 03 fe 47 6e  |.B8.....7>....Gn|
-00000050  88 1c 9b a1 4e e6 ea 92  09 35 6a 04 11 96 64 cb  |....N....5j...d.|
-00000060  68 2f 53 6c 7c 33 94 11  0c 0d a4 cc f1 0d 90 d1  |h/Sl|3..........|
-00000070  46 96 89 a4 ae 2e 4f 21  25 c1 b0 55 db 34 25 b6  |F.....O!%..U.4%.|
-00000080  28 82 8f 91 3c 59 cb 14  03 01 00 01 01 16 03 01  |(...<Y..........|
-00000090  00 30 ca 15 85 e6 08 c3  bf 01 22 13 e1 06 d2 1f  |.0........".....|
-000000a0  b8 ad b4 cd 89 82 64 58  7f d5 41 a4 51 3a 0f fd  |......dX..A.Q:..|
-000000b0  c6 69 4c d5 28 cc d3 76  cf 88 4f 4e e1 83 cf c6  |.iL.(..v..ON....|
-000000c0  ea ee 17 03 01 00 20 ba  c9 d8 18 92 e2 e4 ae f0  |...... .........|
-000000d0  84 9a 3d fb a7 af c5 04  02 e8 d8 4b e4 44 7a 1b  |..=........K.Dz.|
-000000e0  95 07 db 9e e7 d6 57 17  03 01 00 30 8e f4 91 eb  |......W....0....|
-000000f0  d0 90 84 6b 50 88 8d 35  83 d0 67 bb 51 9b 6a dd  |...kP..5..g.Q.j.|
-00000100  1f 2a 13 ad c6 bd 61 90  07 df c5 76 e2 ac 15 56  |.*....a....v...V|
-00000110  47 7f 72 f9 6f 70 6b da  2f 37 14 28 15 03 01 00  |G.r.opk./7.(....|
-00000120  20 61 e5 d6 fa 55 ae a5  50 5a fc 67 e5 5a a9 89  | a...U..PZ.g.Z..|
-00000130  9b 8c a4 17 01 1c a6 74  29 97 9c 05 a4 d7 d7 d1  |.......t).......|
-00000140  e0                                                |.|