// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/base/ssl_cipher_suite_names.h"

#include <stdlib.h>

#include "base/logging.h"
#include "base/string_number_conversions.h"
#include "base/string_util.h"
#include "net/base/ssl_connection_status_flags.h"

// Rather than storing the names of all the ciphersuites we eliminate the
// redundancy and break each cipher suite into a key exchange method, cipher
// and mac. For all the ciphersuites in the IANA registry, we extract each of
// those components from the name, number them and pack the result into a
// 16-bit number thus:
//   (MSB to LSB)
//   <4 bits> unused
//   <5 bits> key exchange
//   <4 bits> cipher
//   <3 bits> mac

// The following tables were generated by ssl_cipher_suite_names_generate.go,
// found in the same directory as this file.

struct CipherSuite {
  uint16 cipher_suite, encoded;
};

static const struct CipherSuite kCipherSuites[] = {
  {0x0, 0x0},  // TLS_NULL_WITH_NULL_NULL
  {0x1, 0x81},  // TLS_RSA_WITH_NULL_MD5
  {0x2, 0x82},  // TLS_RSA_WITH_NULL_SHA
  {0x3, 0x109},  // TLS_RSA_EXPORT_WITH_RC4_40_MD5
  {0x4, 0x91},  // TLS_RSA_WITH_RC4_128_MD5
  {0x5, 0x92},  // TLS_RSA_WITH_RC4_128_SHA
  {0x6, 0x119},  // TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5
  {0x7, 0xa2},  // TLS_RSA_WITH_IDEA_CBC_SHA
  {0x8, 0x12a},  // TLS_RSA_EXPORT_WITH_DES40_CBC_SHA
  {0x9, 0xb2},  // TLS_RSA_WITH_DES_CBC_SHA
  {0xa, 0xba},  // TLS_RSA_WITH_3DES_EDE_CBC_SHA
  {0xb, 0x1aa},  // TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA
  {0xc, 0x232},  // TLS_DH_DSS_WITH_DES_CBC_SHA
  {0xd, 0x23a},  // TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA
  {0xe, 0x2aa},  // TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA
  {0xf, 0x332},  // TLS_DH_RSA_WITH_DES_CBC_SHA
  {0x10, 0x33a},  // TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA
  {0x11, 0x3aa},  // TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
  {0x12, 0x432},  // TLS_DHE_DSS_WITH_DES_CBC_SHA
  {0x13, 0x43a},  // TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
  {0x14, 0x4aa},  // TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
  {0x15, 0x532},  // TLS_DHE_RSA_WITH_DES_CBC_SHA
  {0x16, 0x53a},  // TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  {0x17, 0x589},  // TLS_DH_anon_EXPORT_WITH_RC4_40_MD5
  {0x18, 0x611},  // TLS_DH_anon_WITH_RC4_128_MD5
  {0x19, 0x5aa},  // TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA
  {0x1a, 0x632},  // TLS_DH_anon_WITH_DES_CBC_SHA
  {0x1b, 0x63a},  // TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
  {0x1e, 0x6b2},  // TLS_KRB5_WITH_DES_CBC_SHA
  {0x1f, 0x6ba},  // TLS_KRB5_WITH_3DES_EDE_CBC_SHA
  {0x20, 0x692},  // TLS_KRB5_WITH_RC4_128_SHA
  {0x21, 0x6a2},  // TLS_KRB5_WITH_IDEA_CBC_SHA
  {0x22, 0x6b1},  // TLS_KRB5_WITH_DES_CBC_MD5
  {0x23, 0x6b9},  // TLS_KRB5_WITH_3DES_EDE_CBC_MD5
  {0x24, 0x691},  // TLS_KRB5_WITH_RC4_128_MD5
  {0x25, 0x6a1},  // TLS_KRB5_WITH_IDEA_CBC_MD5
  {0x26, 0x742},  // TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA
  {0x27, 0x71a},  // TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA
  {0x28, 0x70a},  // TLS_KRB5_EXPORT_WITH_RC4_40_SHA
  {0x29, 0x741},  // TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5
  {0x2a, 0x719},  // TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5
  {0x2b, 0x709},  // TLS_KRB5_EXPORT_WITH_RC4_40_MD5
  {0x2c, 0x782},  // TLS_PSK_WITH_NULL_SHA
  {0x2d, 0x802},  // TLS_DHE_PSK_WITH_NULL_SHA
  {0x2e, 0x882},  // TLS_RSA_PSK_WITH_NULL_SHA
  {0x2f, 0xca},  // TLS_RSA_WITH_AES_128_CBC_SHA
  {0x30, 0x24a},  // TLS_DH_DSS_WITH_AES_128_CBC_SHA
  {0x31, 0x34a},  // TLS_DH_RSA_WITH_AES_128_CBC_SHA
  {0x32, 0x44a},  // TLS_DHE_DSS_WITH_AES_128_CBC_SHA
  {0x33, 0x54a},  // TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  {0x34, 0x64a},  // TLS_DH_anon_WITH_AES_128_CBC_SHA
  {0x35, 0xd2},  // TLS_RSA_WITH_AES_256_CBC_SHA
  {0x36, 0x252},  // TLS_DH_DSS_WITH_AES_256_CBC_SHA
  {0x37, 0x352},  // TLS_DH_RSA_WITH_AES_256_CBC_SHA
  {0x38, 0x452},  // TLS_DHE_DSS_WITH_AES_256_CBC_SHA
  {0x39, 0x552},  // TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  {0x3a, 0x652},  // TLS_DH_anon_WITH_AES_256_CBC_SHA
  {0x3b, 0x83},  // TLS_RSA_WITH_NULL_SHA256
  {0x3c, 0xcb},  // TLS_RSA_WITH_AES_128_CBC_SHA256
  {0x3d, 0xd3},  // TLS_RSA_WITH_AES_256_CBC_SHA256
  {0x3e, 0x24b},  // TLS_DH_DSS_WITH_AES_128_CBC_SHA256
  {0x3f, 0x34b},  // TLS_DH_RSA_WITH_AES_128_CBC_SHA256
  {0x40, 0x44b},  // TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
  {0x41, 0xda},  // TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  {0x42, 0x25a},  // TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA
  {0x43, 0x35a},  // TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA
  {0x44, 0x45a},  // TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA
  {0x45, 0x55a},  // TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  {0x46, 0x65a},  // TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA
  {0x67, 0x54b},  // TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  {0x68, 0x253},  // TLS_DH_DSS_WITH_AES_256_CBC_SHA256
  {0x69, 0x353},  // TLS_DH_RSA_WITH_AES_256_CBC_SHA256
  {0x6a, 0x453},  // TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
  {0x6b, 0x553},  // TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  {0x6c, 0x64b},  // TLS_DH_anon_WITH_AES_128_CBC_SHA256
  {0x6d, 0x653},  // TLS_DH_anon_WITH_AES_256_CBC_SHA256
  {0x84, 0xe2},  // TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  {0x85, 0x262},  // TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA
  {0x86, 0x362},  // TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA
  {0x87, 0x462},  // TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA
  {0x88, 0x562},  // TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  {0x89, 0x662},  // TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA
  {0x8a, 0x792},  // TLS_PSK_WITH_RC4_128_SHA
  {0x8b, 0x7ba},  // TLS_PSK_WITH_3DES_EDE_CBC_SHA
  {0x8c, 0x7ca},  // TLS_PSK_WITH_AES_128_CBC_SHA
  {0x8d, 0x7d2},  // TLS_PSK_WITH_AES_256_CBC_SHA
  {0x8e, 0x812},  // TLS_DHE_PSK_WITH_RC4_128_SHA
  {0x8f, 0x83a},  // TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA
  {0x90, 0x84a},  // TLS_DHE_PSK_WITH_AES_128_CBC_SHA
  {0x91, 0x852},  // TLS_DHE_PSK_WITH_AES_256_CBC_SHA
  {0x92, 0x892},  // TLS_RSA_PSK_WITH_RC4_128_SHA
  {0x93, 0x8ba},  // TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA
  {0x94, 0x8ca},  // TLS_RSA_PSK_WITH_AES_128_CBC_SHA
  {0x95, 0x8d2},  // TLS_RSA_PSK_WITH_AES_256_CBC_SHA
  {0x96, 0xea},  // TLS_RSA_WITH_SEED_CBC_SHA
  {0x97, 0x26a},  // TLS_DH_DSS_WITH_SEED_CBC_SHA
  {0x98, 0x36a},  // TLS_DH_RSA_WITH_SEED_CBC_SHA
  {0x99, 0x46a},  // TLS_DHE_DSS_WITH_SEED_CBC_SHA
  {0x9a, 0x56a},  // TLS_DHE_RSA_WITH_SEED_CBC_SHA
  {0x9b, 0x66a},  // TLS_DH_anon_WITH_SEED_CBC_SHA
  {0x9c, 0xf3},  // TLS_RSA_WITH_AES_128_GCM_SHA256
  {0x9d, 0xfc},  // TLS_RSA_WITH_AES_256_GCM_SHA384
  {0x9e, 0x573},  // TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  {0x9f, 0x57c},  // TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  {0xa0, 0x373},  // TLS_DH_RSA_WITH_AES_128_GCM_SHA256
  {0xa1, 0x37c},  // TLS_DH_RSA_WITH_AES_256_GCM_SHA384
  {0xa2, 0x473},  // TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
  {0xa3, 0x47c},  // TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
  {0xa4, 0x273},  // TLS_DH_DSS_WITH_AES_128_GCM_SHA256
  {0xa5, 0x27c},  // TLS_DH_DSS_WITH_AES_256_GCM_SHA384
  {0xa6, 0x673},  // TLS_DH_anon_WITH_AES_128_GCM_SHA256
  {0xa7, 0x67c},  // TLS_DH_anon_WITH_AES_256_GCM_SHA384
  {0xa8, 0x7f3},  // TLS_PSK_WITH_AES_128_GCM_SHA256
  {0xa9, 0x7fc},  // TLS_PSK_WITH_AES_256_GCM_SHA384
  {0xaa, 0x873},  // TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  {0xab, 0x87c},  // TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  {0xac, 0x8f3},  // TLS_RSA_PSK_WITH_AES_128_GCM_SHA256
  {0xad, 0x8fc},  // TLS_RSA_PSK_WITH_AES_256_GCM_SHA384
  {0xae, 0x7cb},  // TLS_PSK_WITH_AES_128_CBC_SHA256
  {0xaf, 0x7d4},  // TLS_PSK_WITH_AES_256_CBC_SHA384
  {0xb0, 0x783},  // TLS_PSK_WITH_NULL_SHA256
  {0xb1, 0x784},  // TLS_PSK_WITH_NULL_SHA384
  {0xb2, 0x84b},  // TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  {0xb3, 0x854},  // TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  {0xb4, 0x803},  // TLS_DHE_PSK_WITH_NULL_SHA256
  {0xb5, 0x804},  // TLS_DHE_PSK_WITH_NULL_SHA384
  {0xb6, 0x8cb},  // TLS_RSA_PSK_WITH_AES_128_CBC_SHA256
  {0xb7, 0x8d4},  // TLS_RSA_PSK_WITH_AES_256_CBC_SHA384
  {0xb8, 0x883},  // TLS_RSA_PSK_WITH_NULL_SHA256
  {0xb9, 0x884},  // TLS_RSA_PSK_WITH_NULL_SHA384
  {0xba, 0xdb},  // TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  {0xbb, 0x25b},  // TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256
  {0xbc, 0x35b},  // TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256
  {0xbd, 0x45b},  // TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256
  {0xbe, 0x55b},  // TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  {0xbf, 0x65b},  // TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256
  {0xc0, 0xe3},  // TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  {0xc1, 0x263},  // TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256
  {0xc2, 0x363},  // TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256
  {0xc3, 0x463},  // TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256
  {0xc4, 0x563},  // TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  {0xc5, 0x663},  // TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256
  {0xc001, 0x902},  // TLS_ECDH_ECDSA_WITH_NULL_SHA
  {0xc002, 0x912},  // TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  {0xc003, 0x93a},  // TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  {0xc004, 0x94a},  // TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  {0xc005, 0x952},  // TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  {0xc006, 0x982},  // TLS_ECDHE_ECDSA_WITH_NULL_SHA
  {0xc007, 0x992},  // TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  {0xc008, 0x9ba},  // TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  {0xc009, 0x9ca},  // TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  {0xc00a, 0x9d2},  // TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  {0xc00b, 0xa02},  // TLS_ECDH_RSA_WITH_NULL_SHA
  {0xc00c, 0xa12},  // TLS_ECDH_RSA_WITH_RC4_128_SHA
  {0xc00d, 0xa3a},  // TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  {0xc00e, 0xa4a},  // TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  {0xc00f, 0xa52},  // TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  {0xc010, 0xa82},  // TLS_ECDHE_RSA_WITH_NULL_SHA
  {0xc011, 0xa92},  // TLS_ECDHE_RSA_WITH_RC4_128_SHA
  {0xc012, 0xaba},  // TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  {0xc013, 0xaca},  // TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  {0xc014, 0xad2},  // TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  {0xc015, 0xb02},  // TLS_ECDH_anon_WITH_NULL_SHA
  {0xc016, 0xb12},  // TLS_ECDH_anon_WITH_RC4_128_SHA
  {0xc017, 0xb3a},  // TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA
  {0xc018, 0xb4a},  // TLS_ECDH_anon_WITH_AES_128_CBC_SHA
  {0xc019, 0xb52},  // TLS_ECDH_anon_WITH_AES_256_CBC_SHA
  {0xc01a, 0xbba},  // TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA
  {0xc01b, 0xc3a},  // TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA
  {0xc01c, 0xcba},  // TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA
  {0xc01d, 0xbca},  // TLS_SRP_SHA_WITH_AES_128_CBC_SHA
  {0xc01e, 0xc4a},  // TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA
  {0xc01f, 0xcca},  // TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA
  {0xc020, 0xbd2},  // TLS_SRP_SHA_WITH_AES_256_CBC_SHA
  {0xc021, 0xc52},  // TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA
  {0xc022, 0xcd2},  // TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA
  {0xc023, 0x9cb},  // TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  {0xc024, 0x9d4},  // TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  {0xc025, 0x94b},  // TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  {0xc026, 0x954},  // TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  {0xc027, 0xacb},  // TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  {0xc028, 0xad4},  // TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  {0xc029, 0xa4b},  // TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  {0xc02a, 0xa54},  // TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  {0xc02b, 0x9f3},  // TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  {0xc02c, 0x9fc},  // TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  {0xc02d, 0x973},  // TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  {0xc02e, 0x97c},  // TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  {0xc02f, 0xaf3},  // TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  {0xc030, 0xafc},  // TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  {0xc031, 0xa73},  // TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  {0xc032, 0xa7c},  // TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  {0xc033, 0xd12},  // TLS_ECDHE_PSK_WITH_RC4_128_SHA
  {0xc034, 0xd3a},  // TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA
  {0xc035, 0xd4a},  // TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA
  {0xc036, 0xd52},  // TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA
  {0xc037, 0xd4b},  // TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  {0xc038, 0xd54},  // TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384
  {0xc039, 0xd02},  // TLS_ECDHE_PSK_WITH_NULL_SHA
  {0xc03a, 0xd03},  // TLS_ECDHE_PSK_WITH_NULL_SHA256
  {0xc03b, 0xd04},  // TLS_ECDHE_PSK_WITH_NULL_SHA384
};

static const struct {
  char name[15];
} kKeyExchangeNames[27] = {
  {"NULL"},  // 0
  {"RSA"},  // 1
  {"RSA_EXPORT"},  // 2
  {"DH_DSS_EXPORT"},  // 3
  {"DH_DSS"},  // 4
  {"DH_RSA_EXPORT"},  // 5
  {"DH_RSA"},  // 6
  {"DHE_DSS_EXPORT"},  // 7
  {"DHE_DSS"},  // 8
  {"DHE_RSA_EXPORT"},  // 9
  {"DHE_RSA"},  // 10
  {"DH_anon_EXPORT"},  // 11
  {"DH_anon"},  // 12
  {"KRB5"},  // 13
  {"KRB5_EXPORT"},  // 14
  {"PSK"},  // 15
  {"DHE_PSK"},  // 16
  {"RSA_PSK"},  // 17
  {"ECDH_ECDSA"},  // 18
  {"ECDHE_ECDSA"},  // 19
  {"ECDH_RSA"},  // 20
  {"ECDHE_RSA"},  // 21
  {"ECDH_anon"},  // 22
  {"SRP_SHA"},  // 23
  {"SRP_SHA_RSA"},  // 24
  {"SRP_SHA_DSS"},  // 25
  {"ECDHE_PSK"},  // 26
};

static const struct {
  char name[17];
} kCipherNames[16] = {
  {"NULL"},  // 0
  {"RC4_40"},  // 1
  {"RC4_128"},  // 2
  {"RC2_CBC_40"},  // 3
  {"IDEA_CBC"},  // 4
  {"DES40_CBC"},  // 5
  {"DES_CBC"},  // 6
  {"3DES_EDE_CBC"},  // 7
  {"DES_CBC_40"},  // 8
  {"AES_128_CBC"},  // 9
  {"AES_256_CBC"},  // 10
  {"CAMELLIA_128_CBC"},  // 11
  {"CAMELLIA_256_CBC"},  // 12
  {"SEED_CBC"},  // 13
  {"AES_128_GCM"},  // 14
  {"AES_256_GCM"},  // 15
};

static const struct {
  char name[7];
} kMacNames[5] = {
  {"NULL"},  // 0
  {"MD5"},  // 1
  {"SHA1"},  // 2
  {"SHA256"},  // 3
  {"SHA384"},  // 4
};


namespace net {

static int CipherSuiteCmp(const void* ia, const void* ib) {
  const CipherSuite* a = static_cast<const CipherSuite*>(ia);
  const CipherSuite* b = static_cast<const CipherSuite*>(ib);

  if (a->cipher_suite < b->cipher_suite) {
    return -1;
  } else if (a->cipher_suite == b->cipher_suite) {
    return 0;
  } else {
    return 1;
  }
}

void SSLCipherSuiteToStrings(const char** key_exchange_str,
                             const char** cipher_str,
                             const char** mac_str, uint16 cipher_suite) {
  *key_exchange_str = *cipher_str = *mac_str = "???";

  struct CipherSuite desired = {0};
  desired.cipher_suite = cipher_suite;

  void* r = bsearch(&desired, kCipherSuites,
                    arraysize(kCipherSuites), sizeof(kCipherSuites[0]),
                    CipherSuiteCmp);

  if (!r)
    return;

  const CipherSuite* cs = static_cast<CipherSuite*>(r);

  const int key_exchange = cs->encoded >> 7;
  const int cipher = (cs->encoded >> 3) & 0xf;
  const int mac = cs->encoded & 0x7;

  *key_exchange_str = kKeyExchangeNames[key_exchange].name;
  *cipher_str = kCipherNames[cipher].name;
  *mac_str = kMacNames[mac].name;
}

void SSLCompressionToString(const char** name, uint8 compresssion) {
  if (compresssion == 0) {
    *name = "NONE";
  } else if (compresssion == 1) {
    *name = "DEFLATE";
  } else if (compresssion == 64) {
    *name = "LZS";
  } else {
    *name = "???";
  }
}

void SSLVersionToString(const char** name, int ssl_version) {
  switch (ssl_version) {
    case SSL_CONNECTION_VERSION_SSL2:
      *name = "SSL 2.0";
      break;
    case SSL_CONNECTION_VERSION_SSL3:
      *name = "SSL 3.0";
      break;
    case SSL_CONNECTION_VERSION_TLS1:
      *name = "TLS 1.0";
      break;
    case SSL_CONNECTION_VERSION_TLS1_1:
      *name = "TLS 1.1";
      break;
    case SSL_CONNECTION_VERSION_TLS1_2:
      *name = "TLS 1.2";
      break;
    default:
      NOTREACHED() << ssl_version;
      *name = "???";
      break;
  }
}

bool ParseSSLCipherString(const std::string& cipher_string,
                          uint16* cipher_suite) {
  int value = 0;
  if (cipher_string.size() == 6 &&
      StartsWithASCII(cipher_string, "0x", false /* case insensitive */) &&
      base::HexStringToInt(cipher_string, &value)) {
    *cipher_suite = static_cast<uint16>(value);
    return true;
  }
  return false;
}

}  // namespace net
