15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_cipher_suite_names.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_connection_status_flags.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Rather than storing the names of all the ciphersuites we eliminate the
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redundancy and break each cipher suite into a key exchange method, cipher
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and mac. For all the ciphersuites in the IANA registry, we extract each of
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// those components from the name, number them and pack the result into a
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 16-bit number thus:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   (MSB to LSB)
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//   <3 bits> unused
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   <5 bits> key exchange
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//   <5 bits> cipher
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   <3 bits> mac
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following tables were generated by ssl_cipher_suite_names_generate.go,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the same directory as this file.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CipherSuite {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 cipher_suite, encoded;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const struct CipherSuite kCipherSuites[] = {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {0x0, 0x0},  // TLS_NULL_WITH_NULL_NULL
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x1, 0x101},  // TLS_RSA_WITH_NULL_MD5
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x2, 0x102},  // TLS_RSA_WITH_NULL_SHA
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x3, 0x209},  // TLS_RSA_EXPORT_WITH_RC4_40_MD5
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x4, 0x111},  // TLS_RSA_WITH_RC4_128_MD5
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x5, 0x112},  // TLS_RSA_WITH_RC4_128_SHA
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x6, 0x219},  // TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x7, 0x122},  // TLS_RSA_WITH_IDEA_CBC_SHA
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x8, 0x22a},  // TLS_RSA_EXPORT_WITH_DES40_CBC_SHA
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x9, 0x132},  // TLS_RSA_WITH_DES_CBC_SHA
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xa, 0x13a},  // TLS_RSA_WITH_3DES_EDE_CBC_SHA
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xb, 0x32a},  // TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc, 0x432},  // TLS_DH_DSS_WITH_DES_CBC_SHA
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xd, 0x43a},  // TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xe, 0x52a},  // TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xf, 0x632},  // TLS_DH_RSA_WITH_DES_CBC_SHA
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x10, 0x63a},  // TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x11, 0x72a},  // TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x12, 0x832},  // TLS_DHE_DSS_WITH_DES_CBC_SHA
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x13, 0x83a},  // TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x14, 0x92a},  // TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x15, 0xa32},  // TLS_DHE_RSA_WITH_DES_CBC_SHA
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x16, 0xa3a},  // TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x17, 0xb09},  // TLS_DH_anon_EXPORT_WITH_RC4_40_MD5
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x18, 0xc11},  // TLS_DH_anon_WITH_RC4_128_MD5
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x19, 0xb2a},  // TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x1a, 0xc32},  // TLS_DH_anon_WITH_DES_CBC_SHA
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x1b, 0xc3a},  // TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x2f, 0x142},  // TLS_RSA_WITH_AES_128_CBC_SHA
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x30, 0x442},  // TLS_DH_DSS_WITH_AES_128_CBC_SHA
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x31, 0x642},  // TLS_DH_RSA_WITH_AES_128_CBC_SHA
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x32, 0x842},  // TLS_DHE_DSS_WITH_AES_128_CBC_SHA
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x33, 0xa42},  // TLS_DHE_RSA_WITH_AES_128_CBC_SHA
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x34, 0xc42},  // TLS_DH_anon_WITH_AES_128_CBC_SHA
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x35, 0x14a},  // TLS_RSA_WITH_AES_256_CBC_SHA
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x36, 0x44a},  // TLS_DH_DSS_WITH_AES_256_CBC_SHA
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x37, 0x64a},  // TLS_DH_RSA_WITH_AES_256_CBC_SHA
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x38, 0x84a},  // TLS_DHE_DSS_WITH_AES_256_CBC_SHA
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x39, 0xa4a},  // TLS_DHE_RSA_WITH_AES_256_CBC_SHA
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x3a, 0xc4a},  // TLS_DH_anon_WITH_AES_256_CBC_SHA
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x3b, 0x103},  // TLS_RSA_WITH_NULL_SHA256
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x3c, 0x143},  // TLS_RSA_WITH_AES_128_CBC_SHA256
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x3d, 0x14b},  // TLS_RSA_WITH_AES_256_CBC_SHA256
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x3e, 0x443},  // TLS_DH_DSS_WITH_AES_128_CBC_SHA256
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x3f, 0x643},  // TLS_DH_RSA_WITH_AES_128_CBC_SHA256
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x40, 0x843},  // TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x41, 0x152},  // TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x42, 0x452},  // TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x43, 0x652},  // TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x44, 0x852},  // TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x45, 0xa52},  // TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x46, 0xc52},  // TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x67, 0xa43},  // TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x68, 0x44b},  // TLS_DH_DSS_WITH_AES_256_CBC_SHA256
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x69, 0x64b},  // TLS_DH_RSA_WITH_AES_256_CBC_SHA256
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x6a, 0x84b},  // TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x6b, 0xa4b},  // TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x6c, 0xc43},  // TLS_DH_anon_WITH_AES_128_CBC_SHA256
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x6d, 0xc4b},  // TLS_DH_anon_WITH_AES_256_CBC_SHA256
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x84, 0x15a},  // TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x85, 0x45a},  // TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x86, 0x65a},  // TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x87, 0x85a},  // TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x88, 0xa5a},  // TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x89, 0xc5a},  // TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x96, 0x162},  // TLS_RSA_WITH_SEED_CBC_SHA
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x97, 0x462},  // TLS_DH_DSS_WITH_SEED_CBC_SHA
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x98, 0x662},  // TLS_DH_RSA_WITH_SEED_CBC_SHA
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x99, 0x862},  // TLS_DHE_DSS_WITH_SEED_CBC_SHA
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x9a, 0xa62},  // TLS_DHE_RSA_WITH_SEED_CBC_SHA
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0x9b, 0xc62},  // TLS_DH_anon_WITH_SEED_CBC_SHA
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0x9c, 0x16f},  // TLS_RSA_WITH_AES_128_GCM_SHA256
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0x9d, 0x177},  // TLS_RSA_WITH_AES_256_GCM_SHA384
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0x9e, 0xa6f},  // TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0x9f, 0xa77},  // TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xa0, 0x66f},  // TLS_DH_RSA_WITH_AES_128_GCM_SHA256
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xa1, 0x677},  // TLS_DH_RSA_WITH_AES_256_GCM_SHA384
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xa2, 0x86f},  // TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xa3, 0x877},  // TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xa4, 0x46f},  // TLS_DH_DSS_WITH_AES_128_GCM_SHA256
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xa5, 0x477},  // TLS_DH_DSS_WITH_AES_256_GCM_SHA384
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xa6, 0xc6f},  // TLS_DH_anon_WITH_AES_128_GCM_SHA256
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xa7, 0xc77},  // TLS_DH_anon_WITH_AES_256_GCM_SHA384
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xba, 0x153},  // TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xbb, 0x453},  // TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xbc, 0x653},  // TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xbd, 0x853},  // TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xbe, 0xa53},  // TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xbf, 0xc53},  // TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc0, 0x15b},  // TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc1, 0x45b},  // TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc2, 0x65b},  // TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc3, 0x85b},  // TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc4, 0xa5b},  // TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc5, 0xc5b},  // TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc001, 0xd02},  // TLS_ECDH_ECDSA_WITH_NULL_SHA
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc002, 0xd12},  // TLS_ECDH_ECDSA_WITH_RC4_128_SHA
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc003, 0xd3a},  // TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc004, 0xd42},  // TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc005, 0xd4a},  // TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc006, 0xe02},  // TLS_ECDHE_ECDSA_WITH_NULL_SHA
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc007, 0xe12},  // TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc008, 0xe3a},  // TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc009, 0xe42},  // TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc00a, 0xe4a},  // TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc00b, 0xf02},  // TLS_ECDH_RSA_WITH_NULL_SHA
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc00c, 0xf12},  // TLS_ECDH_RSA_WITH_RC4_128_SHA
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc00d, 0xf3a},  // TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc00e, 0xf42},  // TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc00f, 0xf4a},  // TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc010, 0x1002},  // TLS_ECDHE_RSA_WITH_NULL_SHA
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc011, 0x1012},  // TLS_ECDHE_RSA_WITH_RC4_128_SHA
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc012, 0x103a},  // TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc013, 0x1042},  // TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc014, 0x104a},  // TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc015, 0x1102},  // TLS_ECDH_anon_WITH_NULL_SHA
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc016, 0x1112},  // TLS_ECDH_anon_WITH_RC4_128_SHA
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc017, 0x113a},  // TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc018, 0x1142},  // TLS_ECDH_anon_WITH_AES_128_CBC_SHA
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc019, 0x114a},  // TLS_ECDH_anon_WITH_AES_256_CBC_SHA
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc023, 0xe43},  // TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc024, 0xe4c},  // TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc025, 0xd43},  // TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc026, 0xd4c},  // TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc027, 0x1043},  // TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc028, 0x104c},  // TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc029, 0xf43},  // TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc02a, 0xf4c},  // TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc02b, 0xe6f},  // TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc02c, 0xe77},  // TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc02d, 0xd6f},  // TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc02e, 0xd77},  // TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc02f, 0x106f},  // TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc030, 0x1077},  // TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc031, 0xf6f},  // TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc032, 0xf77},  // TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc072, 0xe53},  // TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc073, 0xe5c},  // TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc074, 0xd53},  // TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc075, 0xd5c},  // TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc076, 0x1053},  // TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc077, 0x105c},  // TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {0xc078, 0xf53},  // TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc079, 0xf5c},  // TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc07a, 0x17f},  // TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc07b, 0x187},  // TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc07c, 0xa7f},  // TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc07d, 0xa87},  // TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc07e, 0x67f},  // TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc07f, 0x687},  // TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc080, 0x87f},  // TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc081, 0x887},  // TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc082, 0x47f},  // TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc083, 0x487},  // TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc084, 0xc7f},  // TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc085, 0xc87},  // TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc086, 0xe7f},  // TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc087, 0xe87},  // TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc088, 0xd7f},  // TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc089, 0xd87},  // TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc08a, 0x107f},  // TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc08b, 0x1087},  // TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc08c, 0xf7f},  // TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {0xc08d, 0xf87},  // TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const struct {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char name[15];
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} kKeyExchangeNames[18] = {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"NULL"},  // 0
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"RSA"},  // 1
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"RSA_EXPORT"},  // 2
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DH_DSS_EXPORT"},  // 3
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DH_DSS"},  // 4
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DH_RSA_EXPORT"},  // 5
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DH_RSA"},  // 6
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DHE_DSS_EXPORT"},  // 7
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DHE_DSS"},  // 8
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DHE_RSA_EXPORT"},  // 9
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DHE_RSA"},  // 10
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DH_anon_EXPORT"},  // 11
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DH_anon"},  // 12
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {"ECDH_ECDSA"},  // 13
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {"ECDHE_ECDSA"},  // 14
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {"ECDH_RSA"},  // 15
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {"ECDHE_RSA"},  // 16
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {"ECDH_anon"},  // 17
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const struct {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char name[17];
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} kCipherNames[17] = {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"NULL"},  // 0
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"RC4_40"},  // 1
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"RC4_128"},  // 2
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"RC2_CBC_40"},  // 3
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"IDEA_CBC"},  // 4
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DES40_CBC"},  // 5
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"DES_CBC"},  // 6
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"3DES_EDE_CBC"},  // 7
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {"AES_128_CBC"},  // 8
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {"AES_256_CBC"},  // 9
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {"CAMELLIA_128_CBC"},  // 10
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {"CAMELLIA_256_CBC"},  // 11
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {"SEED_CBC"},  // 12
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"AES_128_GCM"},  // 13
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"AES_256_GCM"},  // 14
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"CAMELLIA_128_GCM"},  // 15
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"CAMELLIA_256_GCM"},  // 16
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const struct {
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  char name[7];
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} kMacNames[5] = {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"NULL"},  // 0
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"MD5"},  // 1
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"SHA1"},  // 2
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"SHA256"},  // 3
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {"SHA384"},  // 4
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // 7 is reserved to indicate an AEAD cipher suite.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static const int kAEADMACValue = 7;
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int CipherSuiteCmp(const void* ia, const void* ib) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CipherSuite* a = static_cast<const CipherSuite*>(ia);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CipherSuite* b = static_cast<const CipherSuite*>(ib);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (a->cipher_suite < b->cipher_suite) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (a->cipher_suite == b->cipher_suite) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLCipherSuiteToStrings(const char** key_exchange_str,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const char** cipher_str,
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             const char** mac_str,
2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             bool *is_aead,
2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             uint16 cipher_suite) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *key_exchange_str = *cipher_str = *mac_str = "???";
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  *is_aead = false;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct CipherSuite desired = {0};
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  desired.cipher_suite = cipher_suite;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* r = bsearch(&desired, kCipherSuites,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    arraysize(kCipherSuites), sizeof(kCipherSuites[0]),
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    CipherSuiteCmp);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!r)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CipherSuite* cs = static_cast<CipherSuite*>(r);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int key_exchange = cs->encoded >> 8;
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int cipher = (cs->encoded >> 3) & 0x1f;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int mac = cs->encoded & 0x7;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *key_exchange_str = kKeyExchangeNames[key_exchange].name;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *cipher_str = kCipherNames[cipher].name;
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (mac == kAEADMACValue) {
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    *is_aead = true;
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    *mac_str = NULL;
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  } else {
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    *mac_str = kMacNames[mac].name;
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLVersionToString(const char** name, int ssl_version) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (ssl_version) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SSL_CONNECTION_VERSION_SSL2:
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *name = "SSL 2.0";
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SSL_CONNECTION_VERSION_SSL3:
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *name = "SSL 3.0";
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SSL_CONNECTION_VERSION_TLS1:
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *name = "TLS 1.0";
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SSL_CONNECTION_VERSION_TLS1_1:
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *name = "TLS 1.1";
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SSL_CONNECTION_VERSION_TLS1_2:
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *name = "TLS 1.2";
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << ssl_version;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *name = "???";
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParseSSLCipherString(const std::string& cipher_string,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          uint16* cipher_suite) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int value = 0;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cipher_string.size() == 6 &&
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StartsWithASCII(cipher_string, "0x", false /* case insensitive */) &&
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::HexStringToInt(cipher_string, &value)) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *cipher_suite = static_cast<uint16>(value);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
343