Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

497 linhas
17 KiB

  1. /* Copyright (c) 2014, Google Inc.
  2. *
  3. * Permission to use, copy, modify, and/or distribute this software for any
  4. * purpose with or without fee is hereby granted, provided that the above
  5. * copyright notice and this permission notice appear in all copies.
  6. *
  7. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  10. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  12. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  13. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <string>
  17. #include <vector>
  18. #include <openssl/base64.h>
  19. #include <openssl/bio.h>
  20. #include <openssl/err.h>
  21. #include <openssl/ssl.h>
  22. #include "test/scoped_types.h"
  23. struct ExpectedCipher {
  24. unsigned long id;
  25. int in_group_flag;
  26. };
  27. struct CipherTest {
  28. // The rule string to apply.
  29. const char *rule;
  30. // The list of expected ciphers, in order, terminated with -1.
  31. const ExpectedCipher *expected;
  32. };
  33. // Selecting individual ciphers should work.
  34. static const char kRule1[] =
  35. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  36. "ECDHE-RSA-CHACHA20-POLY1305:"
  37. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  38. "ECDHE-RSA-AES128-GCM-SHA256";
  39. static const ExpectedCipher kExpected1[] = {
  40. { TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305, 0 },
  41. { TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305, 0 },
  42. { TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0 },
  43. { TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0 },
  44. { 0, 0 },
  45. };
  46. // + reorders selected ciphers to the end, keeping their relative
  47. // order.
  48. static const char kRule2[] =
  49. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  50. "ECDHE-RSA-CHACHA20-POLY1305:"
  51. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  52. "ECDHE-RSA-AES128-GCM-SHA256:"
  53. "+aRSA";
  54. static const ExpectedCipher kExpected2[] = {
  55. { TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305, 0 },
  56. { TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0 },
  57. { TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305, 0 },
  58. { TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0 },
  59. { 0, 0 },
  60. };
  61. // ! banishes ciphers from future selections.
  62. static const char kRule3[] =
  63. "!aRSA:"
  64. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  65. "ECDHE-RSA-CHACHA20-POLY1305:"
  66. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  67. "ECDHE-RSA-AES128-GCM-SHA256";
  68. static const ExpectedCipher kExpected3[] = {
  69. { TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305, 0 },
  70. { TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0 },
  71. { 0, 0 },
  72. };
  73. // Multiple masks can be ANDed in a single rule.
  74. static const char kRule4[] = "kRSA+AESGCM+AES128";
  75. static const ExpectedCipher kExpected4[] = {
  76. { TLS1_CK_RSA_WITH_AES_128_GCM_SHA256, 0 },
  77. { 0, 0 },
  78. };
  79. // - removes selected ciphers, but preserves their order for future
  80. // selections. Select AES_128_GCM, but order the key exchanges RSA,
  81. // DHE_RSA, ECDHE_RSA.
  82. static const char kRule5[] =
  83. "ALL:-kECDHE:-kDHE:-kRSA:-ALL:"
  84. "AESGCM+AES128+aRSA";
  85. static const ExpectedCipher kExpected5[] = {
  86. { TLS1_CK_RSA_WITH_AES_128_GCM_SHA256, 0 },
  87. { TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256, 0 },
  88. { TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0 },
  89. { 0, 0 },
  90. };
  91. // Unknown selectors are no-ops.
  92. static const char kRule6[] =
  93. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  94. "ECDHE-RSA-CHACHA20-POLY1305:"
  95. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  96. "ECDHE-RSA-AES128-GCM-SHA256:"
  97. "BOGUS1:-BOGUS2:+BOGUS3:!BOGUS4";
  98. static const ExpectedCipher kExpected6[] = {
  99. { TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305, 0 },
  100. { TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305, 0 },
  101. { TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0 },
  102. { TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0 },
  103. { 0, 0 },
  104. };
  105. // Square brackets specify equi-preference groups.
  106. static const char kRule7[] =
  107. "[ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-ECDSA-AES128-GCM-SHA256]:"
  108. "[ECDHE-RSA-CHACHA20-POLY1305]:"
  109. "ECDHE-RSA-AES128-GCM-SHA256";
  110. static const ExpectedCipher kExpected7[] = {
  111. { TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305, 1 },
  112. { TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0 },
  113. { TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305, 0 },
  114. { TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0 },
  115. { 0, 0 },
  116. };
  117. // @STRENGTH performs a stable strength-sort of the selected
  118. // ciphers and only the selected ciphers.
  119. static const char kRule8[] =
  120. // To simplify things, banish all but {ECDHE_RSA,RSA} x
  121. // {CHACHA20,AES_256_CBC,AES_128_CBC,RC4} x SHA1.
  122. "!kEDH:!AESGCM:!3DES:!SHA256:!MD5:!SHA384:"
  123. // Order some ciphers backwards by strength.
  124. "ALL:-CHACHA20:-AES256:-AES128:-RC4:-ALL:"
  125. // Select ECDHE ones and sort them by strength. Ties should resolve
  126. // based on the order above.
  127. "kECDHE:@STRENGTH:-ALL:"
  128. // Now bring back everything uses RSA. ECDHE_RSA should be first,
  129. // sorted by strength. Then RSA, backwards by strength.
  130. "aRSA";
  131. static const ExpectedCipher kExpected8[] = {
  132. { TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA, 0 },
  133. { TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305, 0 },
  134. { TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA, 0 },
  135. { TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA, 0 },
  136. { SSL3_CK_RSA_RC4_128_SHA, 0 },
  137. { TLS1_CK_RSA_WITH_AES_128_SHA, 0 },
  138. { TLS1_CK_RSA_WITH_AES_256_SHA, 0 },
  139. { 0, 0 },
  140. };
  141. static CipherTest kCipherTests[] = {
  142. { kRule1, kExpected1 },
  143. { kRule2, kExpected2 },
  144. { kRule3, kExpected3 },
  145. { kRule4, kExpected4 },
  146. { kRule5, kExpected5 },
  147. { kRule6, kExpected6 },
  148. { kRule7, kExpected7 },
  149. { kRule8, kExpected8 },
  150. { NULL, NULL },
  151. };
  152. static const char *kBadRules[] = {
  153. // Invalid brackets.
  154. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256",
  155. "RSA]",
  156. "[[RSA]]",
  157. // Operators inside brackets.
  158. "[+RSA]",
  159. // Unknown directive.
  160. "@BOGUS",
  161. // Empty cipher lists error at SSL_CTX_set_cipher_list.
  162. "",
  163. "BOGUS",
  164. // Invalid command.
  165. "?BAR",
  166. // Special operators are not allowed if groups are used.
  167. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:+FOO",
  168. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:!FOO",
  169. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:-FOO",
  170. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:@STRENGTH",
  171. NULL,
  172. };
  173. static void PrintCipherPreferenceList(ssl_cipher_preference_list_st *list) {
  174. bool in_group = false;
  175. for (size_t i = 0; i < sk_SSL_CIPHER_num(list->ciphers); i++) {
  176. const SSL_CIPHER *cipher = sk_SSL_CIPHER_value(list->ciphers, i);
  177. if (!in_group && list->in_group_flags[i]) {
  178. fprintf(stderr, "\t[\n");
  179. in_group = true;
  180. }
  181. fprintf(stderr, "\t");
  182. if (in_group) {
  183. fprintf(stderr, " ");
  184. }
  185. fprintf(stderr, "%s\n", SSL_CIPHER_get_name(cipher));
  186. if (in_group && !list->in_group_flags[i]) {
  187. fprintf(stderr, "\t]\n");
  188. in_group = false;
  189. }
  190. }
  191. }
  192. static bool TestCipherRule(CipherTest *t) {
  193. ScopedSSL_CTX ctx(SSL_CTX_new(TLS_method()));
  194. if (!ctx) {
  195. return false;
  196. }
  197. if (!SSL_CTX_set_cipher_list(ctx.get(), t->rule)) {
  198. fprintf(stderr, "Error testing cipher rule '%s'\n", t->rule);
  199. return false;
  200. }
  201. // Compare the two lists.
  202. size_t i;
  203. for (i = 0; i < sk_SSL_CIPHER_num(ctx->cipher_list->ciphers); i++) {
  204. const SSL_CIPHER *cipher =
  205. sk_SSL_CIPHER_value(ctx->cipher_list->ciphers, i);
  206. if (t->expected[i].id != SSL_CIPHER_get_id(cipher) ||
  207. t->expected[i].in_group_flag != ctx->cipher_list->in_group_flags[i]) {
  208. fprintf(stderr, "Error: cipher rule '%s' evaluted to:\n", t->rule);
  209. PrintCipherPreferenceList(ctx->cipher_list);
  210. return false;
  211. }
  212. }
  213. if (t->expected[i].id != 0) {
  214. fprintf(stderr, "Error: cipher rule '%s' evaluted to:\n", t->rule);
  215. PrintCipherPreferenceList(ctx->cipher_list);
  216. return false;
  217. }
  218. return true;
  219. }
  220. static bool TestCipherRules() {
  221. for (size_t i = 0; kCipherTests[i].rule != NULL; i++) {
  222. if (!TestCipherRule(&kCipherTests[i])) {
  223. return false;
  224. }
  225. }
  226. for (size_t i = 0; kBadRules[i] != NULL; i++) {
  227. ScopedSSL_CTX ctx(SSL_CTX_new(SSLv23_server_method()));
  228. if (!ctx) {
  229. return false;
  230. }
  231. if (SSL_CTX_set_cipher_list(ctx.get(), kBadRules[i])) {
  232. fprintf(stderr, "Cipher rule '%s' unexpectedly succeeded\n", kBadRules[i]);
  233. return false;
  234. }
  235. ERR_clear_error();
  236. }
  237. return true;
  238. }
  239. // kOpenSSLSession is a serialized SSL_SESSION generated from openssl
  240. // s_client -sess_out.
  241. static const char kOpenSSLSession[] =
  242. "MIIFpQIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  243. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  244. "IWoJoQYCBFRDO46iBAICASyjggR6MIIEdjCCA16gAwIBAgIIK9dUvsPWSlUwDQYJ"
  245. "KoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMx"
  246. "JTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTQxMDA4"
  247. "MTIwNzU3WhcNMTUwMTA2MDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwK"
  248. "Q2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29v"
  249. "Z2xlIEluYzEXMBUGA1UEAwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEB"
  250. "AQUAA4IBDwAwggEKAoIBAQCcKeLrplAC+Lofy8t/wDwtB6eu72CVp0cJ4V3lknN6"
  251. "huH9ct6FFk70oRIh/VBNBBz900jYy+7111Jm1b8iqOTQ9aT5C7SEhNcQFJvqzH3e"
  252. "MPkb6ZSWGm1yGF7MCQTGQXF20Sk/O16FSjAynU/b3oJmOctcycWYkY0ytS/k3LBu"
  253. "Id45PJaoMqjB0WypqvNeJHC3q5JjCB4RP7Nfx5jjHSrCMhw8lUMW4EaDxjaR9KDh"
  254. "PLgjsk+LDIySRSRDaCQGhEOWLJZVLzLo4N6/UlctCHEllpBUSvEOyFga52qroGjg"
  255. "rf3WOQ925MFwzd6AK+Ich0gDRg8sQfdLH5OuP1cfLfU1AgMBAAGjggFBMIIBPTAd"
  256. "BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdv"
  257. "b2dsZS5jb20waAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtp"
  258. "Lmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50"
  259. "czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBQ7a+CcxsZByOpc+xpYFcIbnUMZ"
  260. "hTAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEv"
  261. "MBcGA1UdIAQQMA4wDAYKKwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRw"
  262. "Oi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCa"
  263. "OXCBdoqUy5bxyq+Wrh1zsyyCFim1PH5VU2+yvDSWrgDY8ibRGJmfff3r4Lud5kal"
  264. "dKs9k8YlKD3ITG7P0YT/Rk8hLgfEuLcq5cc0xqmE42xJ+Eo2uzq9rYorc5emMCxf"
  265. "5L0TJOXZqHQpOEcuptZQ4OjdYMfSxk5UzueUhA3ogZKRcRkdB3WeWRp+nYRhx4St"
  266. "o2rt2A0MKmY9165GHUqMK9YaaXHDXqBu7Sefr1uSoAP9gyIJKeihMivsGqJ1TD6Z"
  267. "cc6LMe+dN2P8cZEQHtD1y296ul4Mivqk3jatUVL8/hCwgch9A8O4PGZq9WqBfEWm"
  268. "IyHh1dPtbg1lOXdYCWtjpAIEAKUDAgEUqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36S"
  269. "YTcLEkXqKwOBfF9vE4KX0NxeLwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9B"
  270. "sNHM362zZnY27GpTw+Kwd751CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yE"
  271. "OTDKPNj3+inbMaVigtK4PLyPq+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdA"
  272. "i4gv7Y5oliyn";
  273. // kCustomSession is a custom serialized SSL_SESSION generated by
  274. // filling in missing fields from |kOpenSSLSession|. This includes
  275. // providing |peer_sha256|, so |peer| is not serialized.
  276. static const char kCustomSession[] =
  277. "MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  278. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  279. "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
  280. "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
  281. "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
  282. "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
  283. "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
  284. "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";
  285. static bool DecodeBase64(std::vector<uint8_t> *out, const char *in) {
  286. size_t len;
  287. if (!EVP_DecodedLength(&len, strlen(in))) {
  288. fprintf(stderr, "EVP_DecodedLength failed\n");
  289. return false;
  290. }
  291. out->resize(len);
  292. if (!EVP_DecodeBase64(bssl::vector_data(out), &len, len, (const uint8_t *)in,
  293. strlen(in))) {
  294. fprintf(stderr, "EVP_DecodeBase64 failed\n");
  295. return false;
  296. }
  297. out->resize(len);
  298. return true;
  299. }
  300. static bool TestSSL_SESSIONEncoding(const char *input_b64) {
  301. const uint8_t *cptr;
  302. uint8_t *ptr;
  303. // Decode the input.
  304. std::vector<uint8_t> input;
  305. if (!DecodeBase64(&input, input_b64)) {
  306. return false;
  307. }
  308. // Verify the SSL_SESSION decodes.
  309. cptr = bssl::vector_data(&input);
  310. ScopedSSL_SESSION session(d2i_SSL_SESSION(NULL, &cptr, input.size()));
  311. if (!session || cptr != bssl::vector_data(&input) + input.size()) {
  312. fprintf(stderr, "d2i_SSL_SESSION failed\n");
  313. return false;
  314. }
  315. // Verify the SSL_SESSION encoding round-trips.
  316. size_t encoded_len;
  317. ScopedOpenSSLBytes encoded;
  318. uint8_t *encoded_raw;
  319. if (!SSL_SESSION_to_bytes(session.get(), &encoded_raw, &encoded_len)) {
  320. fprintf(stderr, "SSL_SESSION_to_bytes failed\n");
  321. return false;
  322. }
  323. encoded.reset(encoded_raw);
  324. if (encoded_len != input.size() ||
  325. memcmp(bssl::vector_data(&input), encoded.get(), input.size()) != 0) {
  326. fprintf(stderr, "SSL_SESSION_to_bytes did not round-trip\n");
  327. return false;
  328. }
  329. // Verify the SSL_SESSION encoding round-trips via the legacy API.
  330. int len = i2d_SSL_SESSION(session.get(), NULL);
  331. if (len < 0 || (size_t)len != input.size()) {
  332. fprintf(stderr, "i2d_SSL_SESSION(NULL) returned invalid length\n");
  333. return false;
  334. }
  335. encoded.reset((uint8_t *)OPENSSL_malloc(input.size()));
  336. if (!encoded) {
  337. fprintf(stderr, "malloc failed\n");
  338. return false;
  339. }
  340. ptr = encoded.get();
  341. len = i2d_SSL_SESSION(session.get(), &ptr);
  342. if (len < 0 || (size_t)len != input.size()) {
  343. fprintf(stderr, "i2d_SSL_SESSION returned invalid length\n");
  344. return false;
  345. }
  346. if (ptr != encoded.get() + input.size()) {
  347. fprintf(stderr, "i2d_SSL_SESSION did not advance ptr correctly\n");
  348. return false;
  349. }
  350. if (memcmp(bssl::vector_data(&input), encoded.get(), input.size()) != 0) {
  351. fprintf(stderr, "i2d_SSL_SESSION did not round-trip\n");
  352. return false;
  353. }
  354. return true;
  355. }
  356. static bool TestDefaultVersion(uint16_t version,
  357. const SSL_METHOD *(*method)(void)) {
  358. ScopedSSL_CTX ctx(SSL_CTX_new(method()));
  359. if (!ctx) {
  360. return false;
  361. }
  362. return ctx->min_version == version && ctx->max_version == version;
  363. }
  364. static bool CipherGetRFCName(std::string *out, uint16_t value) {
  365. const SSL_CIPHER *cipher = SSL_get_cipher_by_value(value);
  366. if (cipher == NULL) {
  367. return false;
  368. }
  369. char *rfc_name = SSL_CIPHER_get_rfc_name(cipher);
  370. out->assign(rfc_name);
  371. OPENSSL_free(rfc_name);
  372. return true;
  373. }
  374. typedef struct {
  375. int id;
  376. const char *rfc_name;
  377. } CIPHER_RFC_NAME_TEST;
  378. static const CIPHER_RFC_NAME_TEST kCipherRFCNameTests[] = {
  379. { SSL3_CK_RSA_DES_192_CBC3_SHA, "TLS_RSA_WITH_3DES_EDE_CBC_SHA" },
  380. { SSL3_CK_RSA_RC4_128_MD5, "TLS_RSA_WITH_RC4_MD5" },
  381. { TLS1_CK_RSA_WITH_AES_128_SHA, "TLS_RSA_WITH_AES_128_CBC_SHA" },
  382. { TLS1_CK_ADH_WITH_AES_128_SHA, "TLS_DH_anon_WITH_AES_128_CBC_SHA" },
  383. { TLS1_CK_DHE_RSA_WITH_AES_256_SHA, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA" },
  384. { TLS1_CK_DHE_RSA_WITH_AES_256_SHA256,
  385. "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256" },
  386. { TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA,
  387. "TLS_ECDH_anon_WITH_AES_128_CBC_SHA" },
  388. { TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256,
  389. "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256" },
  390. { TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384,
  391. "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384" },
  392. { TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  393. "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" },
  394. { TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  395. "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" },
  396. { TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  397. "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" },
  398. { TLS1_CK_PSK_WITH_RC4_128_SHA, "TLS_PSK_WITH_RC4_SHA" },
  399. // These names are non-standard:
  400. { TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305,
  401. "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256" },
  402. { TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305,
  403. "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256" },
  404. { TLS1_CK_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
  405. "TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256" },
  406. };
  407. static bool TestCipherGetRFCName(void) {
  408. for (size_t i = 0;
  409. i < sizeof(kCipherRFCNameTests) / sizeof(kCipherRFCNameTests[0]); i++) {
  410. const CIPHER_RFC_NAME_TEST *test = &kCipherRFCNameTests[i];
  411. std::string rfc_name;
  412. if (!CipherGetRFCName(&rfc_name, test->id & 0xffff)) {
  413. fprintf(stderr, "SSL_CIPHER_get_rfc_name failed\n");
  414. return false;
  415. }
  416. if (rfc_name != test->rfc_name) {
  417. fprintf(stderr, "SSL_CIPHER_get_rfc_name: got '%s', wanted '%s'\n",
  418. rfc_name.c_str(), test->rfc_name);
  419. return false;
  420. }
  421. }
  422. return true;
  423. }
  424. int main(void) {
  425. SSL_library_init();
  426. if (!TestCipherRules() ||
  427. !TestSSL_SESSIONEncoding(kOpenSSLSession) ||
  428. !TestSSL_SESSIONEncoding(kCustomSession) ||
  429. !TestDefaultVersion(0, &TLS_method) ||
  430. !TestDefaultVersion(SSL3_VERSION, &SSLv3_method) ||
  431. !TestDefaultVersion(TLS1_VERSION, &TLSv1_method) ||
  432. !TestDefaultVersion(TLS1_1_VERSION, &TLSv1_1_method) ||
  433. !TestDefaultVersion(TLS1_2_VERSION, &TLSv1_2_method) ||
  434. !TestDefaultVersion(0, &DTLS_method) ||
  435. !TestDefaultVersion(DTLS1_VERSION, &DTLSv1_method) ||
  436. !TestDefaultVersion(DTLS1_2_VERSION, &DTLSv1_2_method) ||
  437. !TestCipherGetRFCName()) {
  438. BIO_print_errors_fp(stderr);
  439. return 1;
  440. }
  441. printf("PASS\n");
  442. return 0;
  443. }