ssl_cipher_suite_names_unittest.cc 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. // Copyright (c) 2011 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/ssl/ssl_cipher_suite_names.h"
  5. #include "net/ssl/ssl_connection_status_flags.h"
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. #include "third_party/boringssl/src/include/openssl/ssl.h"
  8. namespace net {
  9. namespace {
  10. int kObsoleteVersion = SSL_CONNECTION_VERSION_TLS1;
  11. int kModernVersion = SSL_CONNECTION_VERSION_TLS1_2;
  12. uint16_t kModernCipherSuite =
  13. 0xc02f; /* TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 */
  14. uint16_t kObsoleteCipherObsoleteKeyExchange =
  15. 0x2f; /* TLS_RSA_WITH_AES_128_CBC_SHA */
  16. uint16_t kObsoleteCipherModernKeyExchange =
  17. 0xc014; /* TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA */
  18. uint16_t kModernCipherObsoleteKeyExchange =
  19. 0x9c; /* TLS_RSA_WITH_AES_128_GCM_SHA256 */
  20. uint16_t kModernCipherModernKeyExchange =
  21. 0xc02f; /* TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 */
  22. uint16_t kObsoleteSignature = SSL_SIGN_RSA_PKCS1_SHA1;
  23. uint16_t kModernSignature = SSL_SIGN_RSA_PSS_RSAE_SHA256;
  24. int MakeConnectionStatus(int version, uint16_t cipher_suite) {
  25. int connection_status = 0;
  26. SSLConnectionStatusSetVersion(version, &connection_status);
  27. SSLConnectionStatusSetCipherSuite(cipher_suite, &connection_status);
  28. return connection_status;
  29. }
  30. TEST(CipherSuiteNamesTest, Basic) {
  31. const char *key_exchange, *cipher, *mac;
  32. bool is_aead, is_tls13;
  33. SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
  34. 0x000a);
  35. EXPECT_STREQ("RSA", key_exchange);
  36. EXPECT_STREQ("3DES_EDE_CBC", cipher);
  37. EXPECT_STREQ("HMAC-SHA1", mac);
  38. EXPECT_FALSE(is_aead);
  39. EXPECT_FALSE(is_tls13);
  40. SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
  41. 0x002f);
  42. EXPECT_STREQ("RSA", key_exchange);
  43. EXPECT_STREQ("AES_128_CBC", cipher);
  44. EXPECT_STREQ("HMAC-SHA1", mac);
  45. EXPECT_FALSE(is_aead);
  46. EXPECT_FALSE(is_tls13);
  47. SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
  48. 0xc030);
  49. EXPECT_STREQ("ECDHE_RSA", key_exchange);
  50. EXPECT_STREQ("AES_256_GCM", cipher);
  51. EXPECT_TRUE(is_aead);
  52. EXPECT_FALSE(is_tls13);
  53. EXPECT_EQ(nullptr, mac);
  54. SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
  55. 0xcca9);
  56. EXPECT_STREQ("ECDHE_ECDSA", key_exchange);
  57. EXPECT_STREQ("CHACHA20_POLY1305", cipher);
  58. EXPECT_TRUE(is_aead);
  59. EXPECT_FALSE(is_tls13);
  60. EXPECT_EQ(nullptr, mac);
  61. SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
  62. 0xff31);
  63. EXPECT_STREQ("???", key_exchange);
  64. EXPECT_STREQ("???", cipher);
  65. EXPECT_STREQ("???", mac);
  66. EXPECT_FALSE(is_aead);
  67. EXPECT_FALSE(is_tls13);
  68. SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
  69. 0x1301);
  70. EXPECT_STREQ("AES_128_GCM", cipher);
  71. EXPECT_TRUE(is_aead);
  72. EXPECT_TRUE(is_tls13);
  73. EXPECT_EQ(nullptr, mac);
  74. EXPECT_EQ(nullptr, key_exchange);
  75. SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
  76. 0x1302);
  77. EXPECT_STREQ("AES_256_GCM", cipher);
  78. EXPECT_TRUE(is_aead);
  79. EXPECT_TRUE(is_tls13);
  80. EXPECT_EQ(nullptr, mac);
  81. EXPECT_EQ(nullptr, key_exchange);
  82. SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
  83. 0x1303);
  84. EXPECT_STREQ("CHACHA20_POLY1305", cipher);
  85. EXPECT_TRUE(is_aead);
  86. EXPECT_TRUE(is_tls13);
  87. EXPECT_EQ(nullptr, mac);
  88. EXPECT_EQ(nullptr, key_exchange);
  89. }
  90. TEST(CipherSuiteNamesTest, ParseSSLCipherString) {
  91. uint16_t cipher_suite = 0;
  92. EXPECT_TRUE(ParseSSLCipherString("0x0004", &cipher_suite));
  93. EXPECT_EQ(0x00004u, cipher_suite);
  94. EXPECT_TRUE(ParseSSLCipherString("0xBEEF", &cipher_suite));
  95. EXPECT_EQ(0xBEEFu, cipher_suite);
  96. }
  97. TEST(CipherSuiteNamesTest, ParseSSLCipherStringFails) {
  98. const char* const cipher_strings[] = {
  99. "0004",
  100. "0x004",
  101. "0xBEEFY",
  102. };
  103. for (const auto* cipher_string : cipher_strings) {
  104. uint16_t cipher_suite = 0;
  105. EXPECT_FALSE(ParseSSLCipherString(cipher_string, &cipher_suite));
  106. }
  107. }
  108. TEST(CipherSuiteNamesTest, ObsoleteSSLStatusProtocol) {
  109. // Obsolete
  110. // Note all of these combinations are impossible; TLS 1.2 is necessary for
  111. // kModernCipherSuite.
  112. EXPECT_EQ(OBSOLETE_SSL_MASK_PROTOCOL,
  113. ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_SSL2,
  114. kModernCipherSuite),
  115. kModernSignature));
  116. EXPECT_EQ(OBSOLETE_SSL_MASK_PROTOCOL,
  117. ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_SSL3,
  118. kModernCipherSuite),
  119. kModernSignature));
  120. EXPECT_EQ(OBSOLETE_SSL_MASK_PROTOCOL,
  121. ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_TLS1,
  122. kModernCipherSuite),
  123. kModernSignature));
  124. EXPECT_EQ(
  125. OBSOLETE_SSL_MASK_PROTOCOL,
  126. ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_TLS1_1,
  127. kModernCipherSuite),
  128. kModernSignature));
  129. // Modern
  130. EXPECT_EQ(
  131. OBSOLETE_SSL_NONE,
  132. ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_TLS1_2,
  133. kModernCipherSuite),
  134. kModernSignature));
  135. EXPECT_EQ(OBSOLETE_SSL_NONE,
  136. ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_QUIC,
  137. kModernCipherSuite),
  138. kModernSignature));
  139. }
  140. TEST(CipherSuiteNamesTest, ObsoleteSSLStatusProtocolAndCipherSuite) {
  141. // Cartesian combos
  142. // As above, some of these combinations can't happen in practice.
  143. EXPECT_EQ(OBSOLETE_SSL_MASK_PROTOCOL | OBSOLETE_SSL_MASK_KEY_EXCHANGE |
  144. OBSOLETE_SSL_MASK_CIPHER | OBSOLETE_SSL_MASK_SIGNATURE,
  145. ObsoleteSSLStatus(
  146. MakeConnectionStatus(kObsoleteVersion,
  147. kObsoleteCipherObsoleteKeyExchange),
  148. kObsoleteSignature));
  149. EXPECT_EQ(OBSOLETE_SSL_MASK_PROTOCOL | OBSOLETE_SSL_MASK_KEY_EXCHANGE |
  150. OBSOLETE_SSL_MASK_CIPHER,
  151. ObsoleteSSLStatus(
  152. MakeConnectionStatus(kObsoleteVersion,
  153. kObsoleteCipherObsoleteKeyExchange),
  154. kModernSignature));
  155. EXPECT_EQ(
  156. OBSOLETE_SSL_MASK_PROTOCOL | OBSOLETE_SSL_MASK_KEY_EXCHANGE,
  157. ObsoleteSSLStatus(MakeConnectionStatus(kObsoleteVersion,
  158. kModernCipherObsoleteKeyExchange),
  159. kModernSignature));
  160. EXPECT_EQ(
  161. OBSOLETE_SSL_MASK_PROTOCOL | OBSOLETE_SSL_MASK_CIPHER,
  162. ObsoleteSSLStatus(MakeConnectionStatus(kObsoleteVersion,
  163. kObsoleteCipherModernKeyExchange),
  164. kModernSignature));
  165. EXPECT_EQ(
  166. OBSOLETE_SSL_MASK_PROTOCOL,
  167. ObsoleteSSLStatus(MakeConnectionStatus(kObsoleteVersion,
  168. kModernCipherModernKeyExchange),
  169. kModernSignature));
  170. EXPECT_EQ(
  171. OBSOLETE_SSL_MASK_KEY_EXCHANGE | OBSOLETE_SSL_MASK_CIPHER,
  172. ObsoleteSSLStatus(MakeConnectionStatus(
  173. kModernVersion, kObsoleteCipherObsoleteKeyExchange),
  174. kModernSignature));
  175. EXPECT_EQ(
  176. OBSOLETE_SSL_MASK_KEY_EXCHANGE,
  177. ObsoleteSSLStatus(MakeConnectionStatus(kModernVersion,
  178. kModernCipherObsoleteKeyExchange),
  179. kModernSignature));
  180. EXPECT_EQ(
  181. OBSOLETE_SSL_MASK_CIPHER,
  182. ObsoleteSSLStatus(MakeConnectionStatus(kModernVersion,
  183. kObsoleteCipherModernKeyExchange),
  184. kModernSignature));
  185. EXPECT_EQ(
  186. OBSOLETE_SSL_NONE,
  187. ObsoleteSSLStatus(
  188. MakeConnectionStatus(kModernVersion, kModernCipherModernKeyExchange),
  189. kModernSignature));
  190. EXPECT_EQ(
  191. OBSOLETE_SSL_NONE,
  192. ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_TLS1_3,
  193. 0x1301 /* AES_128_GCM_SHA256 */),
  194. kModernSignature));
  195. // Don't flag the signature as obsolete if not present. It may be an old cache
  196. // entry or a key exchange that doesn't involve a signature. (Though, in the
  197. // latter case, we would always flag a bad key exchange.)
  198. EXPECT_EQ(
  199. OBSOLETE_SSL_NONE,
  200. ObsoleteSSLStatus(
  201. MakeConnectionStatus(kModernVersion, kModernCipherModernKeyExchange),
  202. 0));
  203. EXPECT_EQ(
  204. OBSOLETE_SSL_MASK_KEY_EXCHANGE,
  205. ObsoleteSSLStatus(MakeConnectionStatus(kModernVersion,
  206. kModernCipherObsoleteKeyExchange),
  207. 0));
  208. // Flag obsolete signatures.
  209. EXPECT_EQ(
  210. OBSOLETE_SSL_MASK_SIGNATURE,
  211. ObsoleteSSLStatus(
  212. MakeConnectionStatus(kModernVersion, kModernCipherModernKeyExchange),
  213. kObsoleteSignature));
  214. }
  215. TEST(CipherSuiteNamesTest, HTTP2CipherSuites) {
  216. // Picked some random cipher suites.
  217. EXPECT_FALSE(
  218. IsTLSCipherSuiteAllowedByHTTP2(0x0 /* TLS_NULL_WITH_NULL_NULL */));
  219. EXPECT_FALSE(IsTLSCipherSuiteAllowedByHTTP2(
  220. 0xc014 /* TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA */));
  221. EXPECT_FALSE(IsTLSCipherSuiteAllowedByHTTP2(
  222. 0x9c /* TLS_RSA_WITH_AES_128_GCM_SHA256 */));
  223. // Non-existent cipher suite.
  224. EXPECT_FALSE(IsTLSCipherSuiteAllowedByHTTP2(0xffff)) << "Doesn't exist!";
  225. // HTTP/2-compatible ones.
  226. EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(
  227. 0xc02f /* TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 */));
  228. EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(
  229. 0xcca8 /* ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 */));
  230. EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(
  231. 0xcca9 /* ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 */));
  232. EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(0x1301 /* AES_128_GCM_SHA256 */));
  233. EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(0x1302 /* AES_256_GCM_SHA384 */));
  234. EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(0x1303 /* CHACHA20_POLY1305 */));
  235. }
  236. } // anonymous namespace
  237. } // namespace net