Skip to content

Commit

Permalink
crypto/tls: support AES-128-CBC cipher suites with SHA-256.
Browse files Browse the repository at this point in the history
These were new with TLS 1.2 and, reportedly, some servers require it.
Since it's easy, this change adds suport for three flavours of
AES-128-CBC with SHA-256 MACs.

Other testdata/ files have to be updated because this changes the list
of cipher suites offered by default by the client.

Fixes golang#15487.

Change-Id: I1b14330c31eeda20185409a37072343552c3464f
Reviewed-on: https://go-review.googlesource.com/27315
Run-TryBot: Adam Langley <[email protected]>
Reviewed-by: Brad Fitzpatrick <[email protected]>
Reviewed-by: Jonathan Rudenberg <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
  • Loading branch information
agl committed Aug 18, 2016
1 parent cde0e97 commit cfd077f
Show file tree
Hide file tree
Showing 34 changed files with 2,043 additions and 1,717 deletions.
25 changes: 20 additions & 5 deletions cipher_suites.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"crypto/hmac"
"crypto/rc4"
"crypto/sha1"
"crypto/sha256"
"crypto/x509"
"hash"
)
Expand Down Expand Up @@ -73,25 +74,30 @@ type cipherSuite struct {
}

var cipherSuites = []*cipherSuite{
// Ciphersuite order is chosen so that ECDHE comes before plain RSA
// and RC4 comes before AES-CBC (because of the Lucky13 attack).
// Ciphersuite order is chosen so that ECDHE comes before plain RSA and
// GCM is top preference.
{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, ecdheRSAKA, suiteECDHE | suiteTLS12, nil, nil, aeadAESGCM},
{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12, nil, nil, aeadAESGCM},
{TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, ecdheRSAKA, suiteECDHE | suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM},
{TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM},
{TLS_ECDHE_RSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheRSAKA, suiteECDHE | suiteDefaultOff, cipherRC4, macSHA1, nil},
{TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteDefaultOff, cipherRC4, macSHA1, nil},
{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, ecdheRSAKA, suiteECDHE | suiteTLS12, cipherAES, macSHA256, nil},
{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, 16, 20, 16, ecdheRSAKA, suiteECDHE, cipherAES, macSHA1, nil},
{TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12, cipherAES, macSHA256, nil},
{TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 16, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECDSA, cipherAES, macSHA1, nil},
{TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, 32, 20, 16, ecdheRSAKA, suiteECDHE, cipherAES, macSHA1, nil},
{TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 32, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECDSA, cipherAES, macSHA1, nil},
{TLS_RSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, rsaKA, suiteTLS12, nil, nil, aeadAESGCM},
{TLS_RSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, rsaKA, suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM},
{TLS_RSA_WITH_RC4_128_SHA, 16, 20, 0, rsaKA, suiteDefaultOff, cipherRC4, macSHA1, nil},
{TLS_RSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, rsaKA, suiteTLS12, cipherAES, macSHA256, nil},
{TLS_RSA_WITH_AES_128_CBC_SHA, 16, 20, 16, rsaKA, 0, cipherAES, macSHA1, nil},
{TLS_RSA_WITH_AES_256_CBC_SHA, 32, 20, 16, rsaKA, 0, cipherAES, macSHA1, nil},
{TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, 24, 20, 8, ecdheRSAKA, suiteECDHE, cipher3DES, macSHA1, nil},
{TLS_RSA_WITH_3DES_EDE_CBC_SHA, 24, 20, 8, rsaKA, 0, cipher3DES, macSHA1, nil},

// RC4-based cipher suites are disabled by default.
{TLS_RSA_WITH_RC4_128_SHA, 16, 20, 0, rsaKA, suiteDefaultOff, cipherRC4, macSHA1, nil},
{TLS_ECDHE_RSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheRSAKA, suiteECDHE | suiteDefaultOff, cipherRC4, macSHA1, nil},
{TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteDefaultOff, cipherRC4, macSHA1, nil},
}

func cipherRC4(key, iv []byte, isRead bool) interface{} {
Expand Down Expand Up @@ -128,6 +134,12 @@ func macSHA1(version uint16, key []byte) macFunction {
return tls10MAC{hmac.New(sha1.New, key)}
}

// macSHA1 returns a SHA-256 based MAC. These are only supported in TLS 1.2 so
// the given version is ignored.
func macSHA256(version uint16, key []byte) macFunction {
return tls10MAC{hmac.New(sha256.New, key)}
}

type macFunction interface {
Size() int
MAC(digestBuf, seq, header, data []byte) []byte
Expand Down Expand Up @@ -270,6 +282,7 @@ const (
TLS_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x000a
TLS_RSA_WITH_AES_128_CBC_SHA uint16 = 0x002f
TLS_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0035
TLS_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x003c
TLS_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x009c
TLS_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x009d
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA uint16 = 0xc007
Expand All @@ -279,6 +292,8 @@ const (
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xc012
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA uint16 = 0xc013
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA uint16 = 0xc014
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 uint16 = 0xc023
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0xc027
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0xc02f
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 uint16 = 0xc02b
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0xc030
Expand Down
26 changes: 26 additions & 0 deletions handshake_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,32 @@ func TestHandshakeClientAES256GCMSHA384(t *testing.T) {
runClientTestTLS12(t, test)
}

func TestHandshakeClientAES128CBCSHA256(t *testing.T) {
test := &clientTest{
name: "AES128-SHA256",
command: []string{"openssl", "s_server", "-cipher", "AES128-SHA256"},
}
runClientTestTLS12(t, test)
}

func TestHandshakeClientECDHERSAAES128CBCSHA256(t *testing.T) {
test := &clientTest{
name: "ECDHE-RSA-AES128-SHA256",
command: []string{"openssl", "s_server", "-cipher", "ECDHE-RSA-AES128-SHA256"},
}
runClientTestTLS12(t, test)
}

func TestHandshakeClientECDHEECDSAAES128CBCSHA256(t *testing.T) {
test := &clientTest{
name: "ECDHE-ECDSA-AES128-SHA256",
command: []string{"openssl", "s_server", "-cipher", "ECDHE-ECDSA-AES128-SHA256"},
cert: testECDSACertificate,
key: testECDSAPrivateKey,
}
runClientTestTLS12(t, test)
}

func TestHandshakeClientCertRSA(t *testing.T) {
config := testConfig.clone()
cert, _ := X509KeyPair([]byte(clientCertificatePEM), []byte(clientKeyPEM))
Expand Down
104 changes: 52 additions & 52 deletions testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
>>> Flow 1 (client to server)
00000000 16 03 01 00 85 01 00 00 81 03 03 00 00 00 00 00 |................|
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 22 c0 2f |............."./|
00000030 c0 2b c0 30 c0 2c c0 11 c0 07 c0 13 c0 09 c0 14 |.+.0.,..........|
00000040 c0 0a 00 9c 00 9d 00 05 00 2f 00 35 c0 12 00 0a |........./.5....|
00000050 01 00 00 36 00 05 00 05 01 00 00 00 00 00 0a 00 |...6............|
00000060 08 00 06 00 17 00 18 00 19 00 0b 00 02 01 00 00 |................|
00000070 0d 00 0e 00 0c 04 01 04 03 05 01 05 03 02 01 02 |................|
00000080 03 ff 01 00 01 00 00 12 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 59 02 00 00 55 03 01 75 a2 11 1e 9d |....Y...U..u....|
00000010 5c 45 79 41 ae d4 f0 0b c8 45 86 2c e8 a0 a0 c9 |\EyA.....E.,....|
00000020 37 a9 55 f4 f4 a8 f0 a5 f8 64 ad 20 96 c5 22 52 |7.U......d. .."R|
00000030 3f 37 2f 7c 75 39 64 3c 4c 96 01 e1 bf 12 0a 9c |?7/|u9d<L.......|
00000040 57 36 5a 0b 7c e6 70 e3 28 64 82 f1 c0 09 00 00 |W6Z.|.p.(d......|
00000000 16 03 01 00 59 02 00 00 55 03 01 e1 f3 09 aa 74 |....Y...U......t|
00000010 61 78 98 9e 67 71 72 06 52 62 67 4d a3 ee 63 b3 |ax..gqr.RbgM..c.|
00000020 5f a2 3b 5a 16 34 46 08 d6 5d 37 20 f2 1c 60 07 |_.;Z.4F..]7 ..`.|
00000030 19 16 cf d8 c6 d2 f3 b1 67 79 2a 3b 3b 9c e3 c6 |........gy*;;...|
00000040 d7 9d 15 32 14 9d 46 81 0a 73 86 44 c0 09 00 00 |...2..F..s.D....|
00000050 0d ff 01 00 01 00 00 0b 00 04 03 00 01 02 16 03 |................|
00000060 01 02 0e 0b 00 02 0a 00 02 07 00 02 04 30 82 02 |.............0..|
00000070 00 30 82 01 62 02 09 00 b8 bf 2d 47 a0 d2 eb f4 |.0..b.....-G....|
Expand Down Expand Up @@ -48,20 +48,20 @@
00000240 13 83 0d 94 06 bb d4 37 7a f6 ec 7a c9 86 2e dd |.......7z..z....|
00000250 d7 11 69 7f 85 7c 56 de fb 31 78 2b e4 c7 78 0d |..i..|V..1x+..x.|
00000260 ae cb be 9e 4e 36 24 31 7b 6a 0f 39 95 12 07 8f |....N6$1{j.9....|
00000270 2a 16 03 01 00 d6 0c 00 00 d2 03 00 17 41 04 c3 |*............A..|
00000280 9d 20 75 e6 2f 70 63 0c 3a f8 98 74 d4 df bb 9f |. u./pc.:..t....|
00000290 ff d2 95 fc 4f 3e 9b 0e 0e 49 b5 97 dc fe bc 7e |....O>...I.....~|
000002a0 62 2a 71 9f f5 72 4c 42 4f e5 14 d7 30 1a 06 fe |b*q..rLBO...0...|
000002b0 ca 12 89 e4 61 21 1e 2c 9f 2e 56 56 e9 54 a3 00 |....a!.,..VV.T..|
000002c0 8b 30 81 88 02 42 01 29 8c cd 92 fe af fd 59 85 |.0...B.)......Y.|
000002d0 ad 41 ba 23 f2 fc 38 c3 0e 34 73 9c 49 05 e1 7a |.A.#..8..4s.I..z|
000002e0 c6 8b cb 33 09 3c 48 66 8f 70 3c 9a 64 96 de fd |...3.<Hf.p<.d...|
000002f0 8a 17 e0 11 67 02 12 ef bb c7 66 f3 d6 69 09 5c |....g.....f..i.\|
00000300 55 88 36 55 2e 5b dc 48 02 42 01 6f 80 dd 49 00 |U.6U.[.H.B.o..I.|
00000310 21 f9 aa 1f 93 7e 6c 00 67 d8 ff 2a e4 9f 2d 1a |!....~l.g..*..-.|
00000320 9c 66 ee 5d 31 b6 0e 93 6a 7f 80 1f 72 cb 57 37 |.f.]1...j...r.W7|
00000330 4d 37 af 9f 1b b7 ae 12 9f fa 2c 84 9b a8 0f 2a |M7........,....*|
00000340 d6 5e 27 00 ec 20 57 30 22 c4 ea 37 16 03 01 00 |.^'.. W0"..7....|
00000270 2a 16 03 01 00 d6 0c 00 00 d2 03 00 17 41 04 52 |*............A.R|
00000280 4c a0 cf a0 77 26 e4 f5 f5 15 04 8b d9 cc 11 dc |L...w&..........|
00000290 80 75 fb f3 bc 2b b4 8b 14 fc ca ea 54 88 ef 5b |.u...+......T..[|
000002a0 5c 33 9b 3c 20 41 ef c4 e0 34 4b 8b ab be d7 92 |\3.< A...4K.....|
000002b0 fc 1b 86 fc e1 36 9a 6f 81 fc 1c b8 1f a7 99 00 |.....6.o........|
000002c0 8b 30 81 88 02 42 00 b5 bf 87 11 17 2f bd 9a c0 |.0...B....../...|
000002d0 16 67 27 8e e8 f4 c5 55 cf 37 c3 0f 91 3c c9 f5 |.g'....U.7...<..|
000002e0 92 d0 89 e3 9c 05 cb 58 b2 a9 9b 7c cf 29 6e 68 |.......X...|.)nh|
000002f0 38 70 f9 4b ba ac 96 0e 1e 41 f8 84 98 3e b8 df |8p.K.....A...>..|
00000300 f4 fe c7 15 cd 7d 96 2d 02 42 01 71 92 66 de 2a |.....}.-.B.q.f.*|
00000310 03 f7 a0 e5 d6 b8 3e a9 26 a0 77 7c ab 4c 9b 5d |......>.&.w|.L.]|
00000320 b1 88 0d c0 ce 33 02 95 9f 74 b9 a2 bb db 5e 59 |.....3...t....^Y|
00000330 f4 61 f4 79 78 ef ca ba 08 68 6e 63 fc 06 0a 10 |.a.yx....hnc....|
00000340 84 b3 a1 ea 98 86 c4 a5 d2 7d 9d b7 16 03 01 00 |.........}......|
00000350 0e 0d 00 00 06 03 01 02 40 00 00 0e 00 00 00 |........@......|
>>> Flow 3 (client to server)
00000000 16 03 01 02 0a 0b 00 02 06 00 02 03 00 02 00 30 |...............0|
Expand Down Expand Up @@ -101,30 +101,30 @@
00000220 51 88 35 75 71 b5 e5 54 5b 12 2e 8f 09 67 fd a7 |Q.5uq..T[....g..|
00000230 24 20 3e b2 56 1c ce 97 28 5e f8 2b 2d 4f 9e f1 |$ >.V...(^.+-O..|
00000240 07 9f 6c 4b 5b 83 56 e2 32 42 e9 58 b6 d7 49 a6 |..lK[.V.2B.X..I.|
00000250 b5 68 1a 41 03 56 6b dc 5a 89 16 03 01 00 90 0f |.h.A.Vk.Z.......|
00000260 00 00 8c 00 8a 30 81 87 02 41 16 3b 14 a8 7e 9e |.....0...A.;..~.|
00000270 91 01 b5 56 4b 38 8a 74 46 ad c1 c3 d2 b3 2f ca |...VK8.tF...../.|
00000280 57 b8 de 43 4d bb c7 2f 62 3a 94 91 e3 72 60 7d |W..CM../b:...r`}|
00000290 cd 90 77 78 35 ef 21 9d 4e b5 79 98 18 e0 46 8b |..wx5.!.N.y...F.|
000002a0 e4 97 98 e2 d9 cf 6f c9 a2 ef 35 02 42 00 93 ec |......o...5.B...|
000002b0 45 d7 34 da 4f 86 81 67 bf 87 14 6b b8 69 ae 80 |E.4.O..g...k.i..|
000002c0 2a b0 15 a8 cd 12 46 34 e7 30 d7 f2 84 9d 9e 81 |*.....F4.0......|
000002d0 3d 3c 24 0e 18 58 0a 4e 66 62 5d ec ae 35 7c e4 |=<$..X.Nfb]..5|.|
000002e0 66 d9 b3 0b 26 95 fb bc af f3 02 67 fb da a3 14 |f...&......g....|
000002f0 03 01 00 01 01 16 03 01 00 30 e0 9d a5 39 ec b2 |.........0...9..|
00000300 29 40 32 b8 65 3c fb 59 f8 53 de 3c 36 41 2c 48 |)@2.e<.Y.S.<6A,H|
00000310 08 cb 00 00 f1 64 aa 37 b1 ef 27 18 0d 6a f9 30 |.....d.7..'..j.0|
00000320 13 6e 6e 9e ab 82 d8 ba e2 51 |.nn......Q|
00000250 b5 68 1a 41 03 56 6b dc 5a 89 16 03 01 00 91 0f |.h.A.Vk.Z.......|
00000260 00 00 8d 00 8b 30 81 88 02 42 01 d7 78 09 ea ca |.....0...B..x...|
00000270 28 67 36 42 ba f4 eb c7 c7 b3 08 29 76 e4 b0 1a |(g6B.......)v...|
00000280 ad 25 12 8d 4a 8d 8f e5 ad b1 6b d3 7f 1a ff 48 |.%..J.....k....H|
00000290 d3 1c 5e f4 ce ff 75 c2 46 df f0 30 b3 f8 b9 77 |..^...u.F..0...w|
000002a0 6e eb f8 81 56 27 06 f3 30 15 c2 ca 02 42 00 8d |n...V'..0....B..|
000002b0 d3 0d a2 49 0b 47 6d 7a 64 8d 83 95 7b 60 23 d1 |...I.Gmzd...{`#.|
000002c0 46 4d 23 6f a7 e0 35 2d d4 95 49 7d e5 1e ed eb |FM#o..5-..I}....|
000002d0 b8 64 f4 9e 78 33 ae f5 e7 cb 72 88 7d e1 f3 47 |.d..x3....r.}..G|
000002e0 5e f2 ed 33 23 5e b1 a2 c1 34 d2 59 c7 83 3e 20 |^..3#^...4.Y..> |
000002f0 14 03 01 00 01 01 16 03 01 00 30 ae 61 41 6c b4 |..........0.aAl.|
00000300 a6 b1 bb b8 d9 9c 3c 82 47 ab c4 bc 1a da 4f 0a |......<.G.....O.|
00000310 cc bd 7b 4d e1 16 0b 08 03 8c 54 d9 71 9d 58 cb |..{M......T.q.X.|
00000320 4d 90 74 e4 f3 6d 80 19 6b d6 a7 |M.t..m..k..|
>>> Flow 4 (server to client)
00000000 14 03 01 00 01 01 16 03 01 00 30 ba 3e 11 94 20 |..........0.>.. |
00000010 72 43 30 b3 5a eb db 4e 17 fa 83 aa 8f e4 17 92 |rC0.Z..N........|
00000020 58 0c 56 ce b3 39 cc 40 34 91 55 96 4c 9e 02 5b |[email protected]..[|
00000030 05 ec 4e 6b 95 52 17 ea 06 dc d7 |..Nk.R.....|
00000000 14 03 01 00 01 01 16 03 01 00 30 97 b9 5b fd 48 |..........0..[.H|
00000010 b5 b8 12 a3 8b 6b 25 57 5b e4 03 6e c6 3e fd 32 |.....k%W[..n.>.2|
00000020 18 50 a3 15 3f 56 f6 70 38 b6 4c 1f a5 d7 82 eb |.P..?V.p8.L.....|
00000030 b9 3e f6 44 66 12 5d 6a 38 1c f1 |.>.Df.]j8..|
>>> Flow 5 (client to server)
00000000 17 03 01 00 20 30 65 6a 9b 39 98 ff ea 90 d9 a7 |.... 0ej.9......|
00000010 52 88 ca 38 b2 71 b7 75 0f 9f 41 b0 bb 33 ff 83 |R..8.q.u..A..3..|
00000020 6e 59 7e 81 a1 17 03 01 00 20 18 9a a6 df 69 9c |nY~...... ....i.|
00000030 56 f1 4e d4 9b 85 80 64 ee b8 d2 a7 ca 3a 54 5f |V.N....d.....:T_|
00000040 d4 e6 64 68 aa fd 28 22 06 3b 15 03 01 00 20 0f |..dh..(".;.... .|
00000050 4e 21 15 b2 b0 dd 7a 33 71 88 d9 45 25 05 92 ad |N!....z3q..E%...|
00000060 b1 35 dc fa 61 df 53 66 fc 80 89 49 bc 8f c4 |.5..a.Sf...I...|
00000000 17 03 01 00 20 94 a2 0d d2 54 24 8b 81 eb d3 e2 |.... ....T$.....|
00000010 3c d5 a1 f6 97 c3 45 8e 6c 26 b8 e1 ae 22 e8 94 |<.....E.l&..."..|
00000020 30 41 2c 1d 3f 17 03 01 00 20 95 76 96 d1 f2 6d |0A,.?.... .v...m|
00000030 64 39 c7 0e a6 7c 56 56 13 0d bb f9 24 ef 64 32 |d9...|VV....$.d2|
00000040 1e 49 d7 97 c1 2e 23 5f 02 51 15 03 01 00 20 a0 |.I....#_.Q.... .|
00000050 17 61 eb 8e e1 63 cf 80 4d a3 ee 6a 99 6c 3a 39 |.a...c..M..j.l:9|
00000060 b0 a4 48 26 37 58 ab 3a 21 67 1a 48 2b 88 35 |..H&7X.:!g.H+.5|
Loading

0 comments on commit cfd077f

Please sign in to comment.