You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2147 lines
75 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 <time.h>
  17. #include <algorithm>
  18. #include <string>
  19. #include <utility>
  20. #include <vector>
  21. #include <openssl/base64.h>
  22. #include <openssl/bio.h>
  23. #include <openssl/crypto.h>
  24. #include <openssl/err.h>
  25. #include <openssl/pem.h>
  26. #include <openssl/sha.h>
  27. #include <openssl/ssl.h>
  28. #include <openssl/x509.h>
  29. #include "internal.h"
  30. #include "../crypto/internal.h"
  31. #include "../crypto/test/test_util.h"
  32. #if defined(OPENSSL_WINDOWS)
  33. /* Windows defines struct timeval in winsock2.h. */
  34. OPENSSL_MSVC_PRAGMA(warning(push, 3))
  35. #include <winsock2.h>
  36. OPENSSL_MSVC_PRAGMA(warning(pop))
  37. #else
  38. #include <sys/time.h>
  39. #endif
  40. struct ExpectedCipher {
  41. unsigned long id;
  42. int in_group_flag;
  43. };
  44. struct CipherTest {
  45. // The rule string to apply.
  46. const char *rule;
  47. // The list of expected ciphers, in order.
  48. std::vector<ExpectedCipher> expected;
  49. };
  50. static const CipherTest kCipherTests[] = {
  51. // Selecting individual ciphers should work.
  52. {
  53. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  54. "ECDHE-RSA-CHACHA20-POLY1305:"
  55. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  56. "ECDHE-RSA-AES128-GCM-SHA256",
  57. {
  58. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  59. {TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD, 0},
  60. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  61. {TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD, 0},
  62. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  63. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  64. },
  65. },
  66. // + reorders selected ciphers to the end, keeping their relative order.
  67. {
  68. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  69. "ECDHE-RSA-CHACHA20-POLY1305:"
  70. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  71. "ECDHE-RSA-AES128-GCM-SHA256:"
  72. "+aRSA",
  73. {
  74. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  75. {TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD, 0},
  76. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  77. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  78. {TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD, 0},
  79. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  80. },
  81. },
  82. // ! banishes ciphers from future selections.
  83. {
  84. "!aRSA:"
  85. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  86. "ECDHE-RSA-CHACHA20-POLY1305:"
  87. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  88. "ECDHE-RSA-AES128-GCM-SHA256",
  89. {
  90. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  91. {TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD, 0},
  92. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  93. },
  94. },
  95. // Multiple masks can be ANDed in a single rule.
  96. {
  97. "kRSA+AESGCM+AES128",
  98. {
  99. {TLS1_CK_RSA_WITH_AES_128_GCM_SHA256, 0},
  100. },
  101. },
  102. // - removes selected ciphers, but preserves their order for future
  103. // selections. Select AES_128_GCM, but order the key exchanges RSA, DHE_RSA,
  104. // ECDHE_RSA.
  105. {
  106. "ALL:-kECDHE:-kDHE:-kRSA:-ALL:"
  107. "AESGCM+AES128+aRSA",
  108. {
  109. {TLS1_CK_RSA_WITH_AES_128_GCM_SHA256, 0},
  110. {TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  111. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  112. },
  113. },
  114. // Unknown selectors are no-ops.
  115. {
  116. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  117. "ECDHE-RSA-CHACHA20-POLY1305:"
  118. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  119. "ECDHE-RSA-AES128-GCM-SHA256:"
  120. "BOGUS1:-BOGUS2:+BOGUS3:!BOGUS4",
  121. {
  122. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  123. {TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD, 0},
  124. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  125. {TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD, 0},
  126. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  127. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  128. },
  129. },
  130. // Square brackets specify equi-preference groups.
  131. {
  132. "[ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-ECDSA-AES128-GCM-SHA256]:"
  133. "[ECDHE-RSA-CHACHA20-POLY1305]:"
  134. "ECDHE-RSA-AES128-GCM-SHA256",
  135. {
  136. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 1},
  137. {TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD, 1},
  138. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  139. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 1},
  140. {TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD, 0},
  141. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  142. },
  143. },
  144. // @STRENGTH performs a stable strength-sort of the selected ciphers and
  145. // only the selected ciphers.
  146. {
  147. // To simplify things, banish all but {ECDHE_RSA,RSA} x
  148. // {CHACHA20,AES_256_CBC,AES_128_CBC,RC4} x SHA1.
  149. "!kEDH:!AESGCM:!3DES:!SHA256:!MD5:!SHA384:"
  150. // Order some ciphers backwards by strength.
  151. "ALL:-CHACHA20:-AES256:-AES128:-RC4:-ALL:"
  152. // Select ECDHE ones and sort them by strength. Ties should resolve
  153. // based on the order above.
  154. "kECDHE:@STRENGTH:-ALL:"
  155. // Now bring back everything uses RSA. ECDHE_RSA should be first, sorted
  156. // by strength. Then RSA, backwards by strength.
  157. "aRSA",
  158. {
  159. {TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA, 0},
  160. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  161. {TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD, 0},
  162. #ifdef BORINGSSL_ENABLE_RC4_TLS
  163. {TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA, 0},
  164. #endif
  165. {TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA, 0},
  166. #ifdef BORINGSSL_ENABLE_RC4_TLS
  167. {SSL3_CK_RSA_RC4_128_SHA, 0},
  168. #endif
  169. {TLS1_CK_RSA_WITH_AES_128_SHA, 0},
  170. {TLS1_CK_RSA_WITH_AES_256_SHA, 0},
  171. },
  172. },
  173. // Exact ciphers may not be used in multi-part rules; they are treated
  174. // as unknown aliases.
  175. {
  176. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  177. "ECDHE-RSA-AES128-GCM-SHA256:"
  178. "!ECDHE-RSA-AES128-GCM-SHA256+RSA:"
  179. "!ECDSA+ECDHE-ECDSA-AES128-GCM-SHA256",
  180. {
  181. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  182. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  183. },
  184. },
  185. // SSLv3 matches everything that existed before TLS 1.2.
  186. {
  187. "AES128-SHA:AES128-SHA256:!SSLv3",
  188. {
  189. {TLS1_CK_RSA_WITH_AES_128_SHA256, 0},
  190. },
  191. },
  192. // TLSv1.2 matches everything added in TLS 1.2.
  193. {
  194. "AES128-SHA:AES128-SHA256:!TLSv1.2",
  195. {
  196. {TLS1_CK_RSA_WITH_AES_128_SHA, 0},
  197. },
  198. },
  199. // The two directives have no intersection.
  200. {
  201. "AES128-SHA:AES128-SHA256:!TLSv1.2+SSLv3",
  202. {
  203. {TLS1_CK_RSA_WITH_AES_128_SHA, 0},
  204. {TLS1_CK_RSA_WITH_AES_128_SHA256, 0},
  205. },
  206. },
  207. // The shared name of the CHACHA20_POLY1305 variants behaves like a cipher
  208. // name and not an alias. It may not be used in a multipart rule. (That the
  209. // shared name works is covered by the standard tests.)
  210. {
  211. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  212. "ECDHE-RSA-CHACHA20-POLY1305:"
  213. "!ECDHE-RSA-CHACHA20-POLY1305+RSA:"
  214. "!ECDSA+ECDHE-ECDSA-CHACHA20-POLY1305",
  215. {
  216. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  217. {TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD, 0},
  218. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  219. {TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD, 0},
  220. },
  221. },
  222. };
  223. static const char *kBadRules[] = {
  224. // Invalid brackets.
  225. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256",
  226. "RSA]",
  227. "[[RSA]]",
  228. // Operators inside brackets.
  229. "[+RSA]",
  230. // Unknown directive.
  231. "@BOGUS",
  232. // Empty cipher lists error at SSL_CTX_set_cipher_list.
  233. "",
  234. "BOGUS",
  235. // COMPLEMENTOFDEFAULT is empty.
  236. "COMPLEMENTOFDEFAULT",
  237. // Invalid command.
  238. "?BAR",
  239. // Special operators are not allowed if groups are used.
  240. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:+FOO",
  241. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:!FOO",
  242. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:-FOO",
  243. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:@STRENGTH",
  244. };
  245. static const char *kMustNotIncludeNull[] = {
  246. "ALL",
  247. "DEFAULT",
  248. "ALL:!eNULL",
  249. "ALL:!NULL",
  250. #ifdef BORINGSSL_ENABLE_RC4_TLS
  251. "MEDIUM",
  252. #endif
  253. "HIGH",
  254. "FIPS",
  255. "SHA",
  256. "SHA1",
  257. "RSA",
  258. "SSLv3",
  259. "TLSv1",
  260. "TLSv1.2",
  261. };
  262. static const char *kMustNotIncludeCECPQ1[] = {
  263. "ALL",
  264. "DEFAULT",
  265. #ifdef BORINGSSL_ENABLE_RC4_TLS
  266. "MEDIUM",
  267. #endif
  268. "HIGH",
  269. "FIPS",
  270. "SHA",
  271. "SHA1",
  272. "SHA256",
  273. "SHA384",
  274. "RSA",
  275. "SSLv3",
  276. "TLSv1",
  277. "TLSv1.2",
  278. "aRSA",
  279. "RSA",
  280. "aECDSA",
  281. "ECDSA",
  282. "AES",
  283. "AES128",
  284. "AES256",
  285. "AESGCM",
  286. "CHACHA20",
  287. };
  288. static void PrintCipherPreferenceList(ssl_cipher_preference_list_st *list) {
  289. bool in_group = false;
  290. for (size_t i = 0; i < sk_SSL_CIPHER_num(list->ciphers); i++) {
  291. const SSL_CIPHER *cipher = sk_SSL_CIPHER_value(list->ciphers, i);
  292. if (!in_group && list->in_group_flags[i]) {
  293. fprintf(stderr, "\t[\n");
  294. in_group = true;
  295. }
  296. fprintf(stderr, "\t");
  297. if (in_group) {
  298. fprintf(stderr, " ");
  299. }
  300. fprintf(stderr, "%s\n", SSL_CIPHER_get_name(cipher));
  301. if (in_group && !list->in_group_flags[i]) {
  302. fprintf(stderr, "\t]\n");
  303. in_group = false;
  304. }
  305. }
  306. }
  307. static bool TestCipherRule(const CipherTest &t) {
  308. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  309. if (!ctx) {
  310. return false;
  311. }
  312. if (!SSL_CTX_set_cipher_list(ctx.get(), t.rule)) {
  313. fprintf(stderr, "Error testing cipher rule '%s'\n", t.rule);
  314. return false;
  315. }
  316. // Compare the two lists.
  317. if (sk_SSL_CIPHER_num(ctx->cipher_list->ciphers) != t.expected.size()) {
  318. fprintf(stderr, "Error: cipher rule '%s' evaluated to:\n", t.rule);
  319. PrintCipherPreferenceList(ctx->cipher_list);
  320. return false;
  321. }
  322. for (size_t i = 0; i < t.expected.size(); i++) {
  323. const SSL_CIPHER *cipher =
  324. sk_SSL_CIPHER_value(ctx->cipher_list->ciphers, i);
  325. if (t.expected[i].id != SSL_CIPHER_get_id(cipher) ||
  326. t.expected[i].in_group_flag != ctx->cipher_list->in_group_flags[i]) {
  327. fprintf(stderr, "Error: cipher rule '%s' evaluated to:\n", t.rule);
  328. PrintCipherPreferenceList(ctx->cipher_list);
  329. return false;
  330. }
  331. }
  332. return true;
  333. }
  334. static bool TestRuleDoesNotIncludeNull(const char *rule) {
  335. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(SSLv23_server_method()));
  336. if (!ctx) {
  337. return false;
  338. }
  339. if (!SSL_CTX_set_cipher_list(ctx.get(), rule)) {
  340. fprintf(stderr, "Error: cipher rule '%s' failed\n", rule);
  341. return false;
  342. }
  343. for (size_t i = 0; i < sk_SSL_CIPHER_num(ctx->cipher_list->ciphers); i++) {
  344. if (SSL_CIPHER_is_NULL(sk_SSL_CIPHER_value(ctx->cipher_list->ciphers, i))) {
  345. fprintf(stderr, "Error: cipher rule '%s' includes NULL\n",rule);
  346. return false;
  347. }
  348. }
  349. return true;
  350. }
  351. static bool TestRuleDoesNotIncludeCECPQ1(const char *rule) {
  352. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  353. if (!ctx) {
  354. return false;
  355. }
  356. if (!SSL_CTX_set_cipher_list(ctx.get(), rule)) {
  357. fprintf(stderr, "Error: cipher rule '%s' failed\n", rule);
  358. return false;
  359. }
  360. for (size_t i = 0; i < sk_SSL_CIPHER_num(ctx->cipher_list->ciphers); i++) {
  361. if (SSL_CIPHER_is_CECPQ1(sk_SSL_CIPHER_value(ctx->cipher_list->ciphers, i))) {
  362. fprintf(stderr, "Error: cipher rule '%s' includes CECPQ1\n",rule);
  363. return false;
  364. }
  365. }
  366. return true;
  367. }
  368. static bool TestCipherRules() {
  369. for (const CipherTest &test : kCipherTests) {
  370. if (!TestCipherRule(test)) {
  371. return false;
  372. }
  373. }
  374. for (const char *rule : kBadRules) {
  375. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(SSLv23_server_method()));
  376. if (!ctx) {
  377. return false;
  378. }
  379. if (SSL_CTX_set_cipher_list(ctx.get(), rule)) {
  380. fprintf(stderr, "Cipher rule '%s' unexpectedly succeeded\n", rule);
  381. return false;
  382. }
  383. ERR_clear_error();
  384. }
  385. for (const char *rule : kMustNotIncludeNull) {
  386. if (!TestRuleDoesNotIncludeNull(rule)) {
  387. return false;
  388. }
  389. }
  390. for (const char *rule : kMustNotIncludeCECPQ1) {
  391. if (!TestRuleDoesNotIncludeCECPQ1(rule)) {
  392. return false;
  393. }
  394. }
  395. return true;
  396. }
  397. // kOpenSSLSession is a serialized SSL_SESSION generated from openssl
  398. // s_client -sess_out.
  399. static const char kOpenSSLSession[] =
  400. "MIIFpQIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  401. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  402. "IWoJoQYCBFRDO46iBAICASyjggR6MIIEdjCCA16gAwIBAgIIK9dUvsPWSlUwDQYJ"
  403. "KoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMx"
  404. "JTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTQxMDA4"
  405. "MTIwNzU3WhcNMTUwMTA2MDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwK"
  406. "Q2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29v"
  407. "Z2xlIEluYzEXMBUGA1UEAwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEB"
  408. "AQUAA4IBDwAwggEKAoIBAQCcKeLrplAC+Lofy8t/wDwtB6eu72CVp0cJ4V3lknN6"
  409. "huH9ct6FFk70oRIh/VBNBBz900jYy+7111Jm1b8iqOTQ9aT5C7SEhNcQFJvqzH3e"
  410. "MPkb6ZSWGm1yGF7MCQTGQXF20Sk/O16FSjAynU/b3oJmOctcycWYkY0ytS/k3LBu"
  411. "Id45PJaoMqjB0WypqvNeJHC3q5JjCB4RP7Nfx5jjHSrCMhw8lUMW4EaDxjaR9KDh"
  412. "PLgjsk+LDIySRSRDaCQGhEOWLJZVLzLo4N6/UlctCHEllpBUSvEOyFga52qroGjg"
  413. "rf3WOQ925MFwzd6AK+Ich0gDRg8sQfdLH5OuP1cfLfU1AgMBAAGjggFBMIIBPTAd"
  414. "BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdv"
  415. "b2dsZS5jb20waAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtp"
  416. "Lmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50"
  417. "czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBQ7a+CcxsZByOpc+xpYFcIbnUMZ"
  418. "hTAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEv"
  419. "MBcGA1UdIAQQMA4wDAYKKwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRw"
  420. "Oi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCa"
  421. "OXCBdoqUy5bxyq+Wrh1zsyyCFim1PH5VU2+yvDSWrgDY8ibRGJmfff3r4Lud5kal"
  422. "dKs9k8YlKD3ITG7P0YT/Rk8hLgfEuLcq5cc0xqmE42xJ+Eo2uzq9rYorc5emMCxf"
  423. "5L0TJOXZqHQpOEcuptZQ4OjdYMfSxk5UzueUhA3ogZKRcRkdB3WeWRp+nYRhx4St"
  424. "o2rt2A0MKmY9165GHUqMK9YaaXHDXqBu7Sefr1uSoAP9gyIJKeihMivsGqJ1TD6Z"
  425. "cc6LMe+dN2P8cZEQHtD1y296ul4Mivqk3jatUVL8/hCwgch9A8O4PGZq9WqBfEWm"
  426. "IyHh1dPtbg1lOXdYCWtjpAIEAKUDAgEUqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36S"
  427. "YTcLEkXqKwOBfF9vE4KX0NxeLwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9B"
  428. "sNHM362zZnY27GpTw+Kwd751CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yE"
  429. "OTDKPNj3+inbMaVigtK4PLyPq+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdA"
  430. "i4gv7Y5oliyn";
  431. // kCustomSession is a custom serialized SSL_SESSION generated by
  432. // filling in missing fields from |kOpenSSLSession|. This includes
  433. // providing |peer_sha256|, so |peer| is not serialized.
  434. static const char kCustomSession[] =
  435. "MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  436. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  437. "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
  438. "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
  439. "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
  440. "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
  441. "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
  442. "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";
  443. // kBoringSSLSession is a serialized SSL_SESSION generated from bssl client.
  444. static const char kBoringSSLSession[] =
  445. "MIIRwQIBAQICAwMEAsAvBCDdoGxGK26mR+8lM0uq6+k9xYuxPnwAjpcF9n0Yli9R"
  446. "kQQwbyshfWhdi5XQ1++7n2L1qqrcVlmHBPpr6yknT/u4pUrpQB5FZ7vqvNn8MdHf"
  447. "9rWgoQYCBFXgs7uiBAICHCCjggR6MIIEdjCCA16gAwIBAgIIf+yfD7Y6UicwDQYJ"
  448. "KoZIhvcNAQELBQAwSTELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMx"
  449. "JTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwODEy"
  450. "MTQ1MzE1WhcNMTUxMTEwMDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwK"
  451. "Q2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29v"
  452. "Z2xlIEluYzEXMBUGA1UEAwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEB"
  453. "AQUAA4IBDwAwggEKAoIBAQC0MeG5YGQ0t+IeJeoneP/PrhEaieibeKYkbKVLNZpo"
  454. "PLuBinvhkXZo3DC133NpCBpy6ZktBwamqyixAyuk/NU6OjgXqwwxfQ7di1AInLIU"
  455. "792c7hFyNXSUCG7At8Ifi3YwBX9Ba6u/1d6rWTGZJrdCq3QU11RkKYyTq2KT5mce"
  456. "Tv9iGKqSkSTlp8puy/9SZ/3DbU3U+BuqCFqeSlz7zjwFmk35acdCilpJlVDDN5C/"
  457. "RCh8/UKc8PaL+cxlt531qoTENvYrflBno14YEZlCBZsPiFeUSILpKEj3Ccwhy0eL"
  458. "EucWQ72YZU8mUzXBoXGn0zA0crFl5ci/2sTBBGZsylNBAgMBAAGjggFBMIIBPTAd"
  459. "BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdv"
  460. "b2dsZS5jb20waAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtp"
  461. "Lmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50"
  462. "czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBS/bzHxcE73Q4j3slC4BLbMtLjG"
  463. "GjAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEv"
  464. "MBcGA1UdIAQQMA4wDAYKKwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRw"
  465. "Oi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQAb"
  466. "qdWPZEHk0X7iKPCTHL6S3w6q1eR67goxZGFSM1lk1hjwyu7XcLJuvALVV9uY3ovE"
  467. "kQZSHwT+pyOPWQhsSjO+1GyjvCvK/CAwiUmBX+bQRGaqHsRcio7xSbdVcajQ3bXd"
  468. "X+s0WdbOpn6MStKAiBVloPlSxEI8pxY6x/BBCnTIk/+DMB17uZlOjG3vbAnkDkP+"
  469. "n0OTucD9sHV7EVj9XUxi51nOfNBCN/s7lpUjDS/NJ4k3iwOtbCPswiot8vLO779a"
  470. "f07vR03r349Iz/KTzk95rlFtX0IU+KYNxFNsanIXZ+C9FYGRXkwhHcvFb4qMUB1y"
  471. "TTlM80jBMOwyjZXmjRAhpAIEAKUDAgEUqQUCAwGJwKqBpwSBpOgebbmn9NRUtMWH"
  472. "+eJpqA5JLMFSMCChOsvKey3toBaCNGU7HfAEiiXNuuAdCBoK262BjQc2YYfqFzqH"
  473. "zuppopXCvhohx7j/tnCNZIMgLYt/O9SXK2RYI5z8FhCCHvB4CbD5G0LGl5EFP27s"
  474. "Jb6S3aTTYPkQe8yZSlxevg6NDwmTogLO9F7UUkaYmVcMQhzssEE2ZRYNwSOU6KjE"
  475. "0Yj+8fAiBtbQriIEIN2L8ZlpaVrdN5KFNdvcmOxJu81P8q53X55xQyGTnGWwsgMC"
  476. "ARezggvvMIIEdjCCA16gAwIBAgIIf+yfD7Y6UicwDQYJKoZIhvcNAQELBQAwSTEL"
  477. "MAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2ds"
  478. "ZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwODEyMTQ1MzE1WhcNMTUxMTEw"
  479. "MDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQG"
  480. "A1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UE"
  481. "AwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB"
  482. "AQC0MeG5YGQ0t+IeJeoneP/PrhEaieibeKYkbKVLNZpoPLuBinvhkXZo3DC133Np"
  483. "CBpy6ZktBwamqyixAyuk/NU6OjgXqwwxfQ7di1AInLIU792c7hFyNXSUCG7At8If"
  484. "i3YwBX9Ba6u/1d6rWTGZJrdCq3QU11RkKYyTq2KT5mceTv9iGKqSkSTlp8puy/9S"
  485. "Z/3DbU3U+BuqCFqeSlz7zjwFmk35acdCilpJlVDDN5C/RCh8/UKc8PaL+cxlt531"
  486. "qoTENvYrflBno14YEZlCBZsPiFeUSILpKEj3Ccwhy0eLEucWQ72YZU8mUzXBoXGn"
  487. "0zA0crFl5ci/2sTBBGZsylNBAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEF"
  488. "BQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYB"
  489. "BQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lB"
  490. "RzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9v"
  491. "Y3NwMB0GA1UdDgQWBBS/bzHxcE73Q4j3slC4BLbMtLjGGjAMBgNVHRMBAf8EAjAA"
  492. "MB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYK"
  493. "KwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5j"
  494. "b20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQAbqdWPZEHk0X7iKPCTHL6S"
  495. "3w6q1eR67goxZGFSM1lk1hjwyu7XcLJuvALVV9uY3ovEkQZSHwT+pyOPWQhsSjO+"
  496. "1GyjvCvK/CAwiUmBX+bQRGaqHsRcio7xSbdVcajQ3bXdX+s0WdbOpn6MStKAiBVl"
  497. "oPlSxEI8pxY6x/BBCnTIk/+DMB17uZlOjG3vbAnkDkP+n0OTucD9sHV7EVj9XUxi"
  498. "51nOfNBCN/s7lpUjDS/NJ4k3iwOtbCPswiot8vLO779af07vR03r349Iz/KTzk95"
  499. "rlFtX0IU+KYNxFNsanIXZ+C9FYGRXkwhHcvFb4qMUB1yTTlM80jBMOwyjZXmjRAh"
  500. "MIID8DCCAtigAwIBAgIDAjqDMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT"
  501. "MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i"
  502. "YWwgQ0EwHhcNMTMwNDA1MTUxNTU2WhcNMTYxMjMxMjM1OTU5WjBJMQswCQYDVQQG"
  503. "EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy"
  504. "bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB"
  505. "AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP"
  506. "VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv"
  507. "h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE"
  508. "ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ"
  509. "EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC"
  510. "DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB5zCB5DAfBgNVHSMEGDAWgBTAephojYn7"
  511. "qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wDgYD"
  512. "VR0PAQH/BAQDAgEGMC4GCCsGAQUFBwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDov"
  513. "L2cuc3ltY2QuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwNQYDVR0fBC4wLDAqoCig"
  514. "JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMBcGA1UdIAQQ"
  515. "MA4wDAYKKwYBBAHWeQIFATANBgkqhkiG9w0BAQsFAAOCAQEAqvqpIM1qZ4PtXtR+"
  516. "3h3Ef+AlBgDFJPupyC1tft6dgmUsgWM0Zj7pUsIItMsv91+ZOmqcUHqFBYx90SpI"
  517. "hNMJbHzCzTWf84LuUt5oX+QAihcglvcpjZpNy6jehsgNb1aHA30DP9z6eX0hGfnI"
  518. "Oi9RdozHQZJxjyXON/hKTAAj78Q1EK7gI4BzfE00LshukNYQHpmEcxpw8u1VDu4X"
  519. "Bupn7jLrLN1nBz/2i8Jw3lsA5rsb0zYaImxssDVCbJAJPZPpZAkiDoUGn8JzIdPm"
  520. "X4DkjYUiOnMDsWCOrmji9D6X52ASCWg23jrW4kOVWzeBkoEfu43XrVJkFleW2V40"
  521. "fsg12DCCA30wggLmoAMCAQICAxK75jANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG"
  522. "EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUg"
  523. "Q2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTAyMDUyMTA0MDAwMFoXDTE4MDgyMTA0"
  524. "MDAwMFowQjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xGzAZ"
  525. "BgNVBAMTEkdlb1RydXN0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP"
  526. "ADCCAQoCggEBANrMGGMw/fQXIxpWflvfPGw45HG3eJHUvKHYTPioQ7YD6U0hBwiI"
  527. "2lgvZjkpvQV4i5046AW3an5xpObEYKaw74DkiSgPniXW7YPzraaRx5jJQhg1FJ2t"
  528. "mEaSLk/K8YdDwRaVVy1Q74ktgHpXrfLuX2vSAI25FPgUFTXZwEaje3LIkb/JVSvN"
  529. "0Jc+nCZkzN/Ogxlxyk7m1NV7qRnNVd7I7NJeOFPlXE+MLf5QIzb8ZubLjqQ5GQC3"
  530. "lQI5kQsO/jgu0R0FmvZNPm8PBx2vLB6PYDni+jZTEznUXiYr2z2oFL0y6xgDKFIE"
  531. "ceWrMz3hOLsHNoRinHnqFjD0X8Ar6HFr5PkCAwEAAaOB8DCB7TAfBgNVHSMEGDAW"
  532. "gBRI5mj5K9KylddH2CMgEE8zmJCf1DAdBgNVHQ4EFgQUwHqYaI2J+6sFZAwRfap9"
  533. "ZbjKzE4wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMw"
  534. "MTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9zZWN1cmVjYS5j"
  535. "cmwwTgYDVR0gBEcwRTBDBgRVHSAAMDswOQYIKwYBBQUHAgEWLWh0dHBzOi8vd3d3"
  536. "Lmdlb3RydXN0LmNvbS9yZXNvdXJjZXMvcmVwb3NpdG9yeTANBgkqhkiG9w0BAQUF"
  537. "AAOBgQB24RJuTksWEoYwBrKBCM/wCMfHcX5m7sLt1Dsf//DwyE7WQziwuTB9GNBV"
  538. "g6JqyzYRnOhIZqNtf7gT1Ef+i1pcc/yu2RsyGTirlzQUqpbS66McFAhJtrvlke+D"
  539. "NusdVm/K2rxzY5Dkf3s+Iss9B+1fOHSc4wNQTqGvmO5h8oQ/Eg==";
  540. // kBadSessionExtraField is a custom serialized SSL_SESSION generated by replacing
  541. // the final (optional) element of |kCustomSession| with tag number 30.
  542. static const char kBadSessionExtraField[] =
  543. "MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  544. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  545. "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
  546. "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
  547. "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
  548. "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
  549. "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
  550. "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBL4DBAEF";
  551. // kBadSessionVersion is a custom serialized SSL_SESSION generated by replacing
  552. // the version of |kCustomSession| with 2.
  553. static const char kBadSessionVersion[] =
  554. "MIIBdgIBAgICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  555. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  556. "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
  557. "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
  558. "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
  559. "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
  560. "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
  561. "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";
  562. // kBadSessionTrailingData is a custom serialized SSL_SESSION with trailing data
  563. // appended.
  564. static const char kBadSessionTrailingData[] =
  565. "MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  566. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  567. "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
  568. "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
  569. "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
  570. "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
  571. "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
  572. "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEFAAAA";
  573. static bool DecodeBase64(std::vector<uint8_t> *out, const char *in) {
  574. size_t len;
  575. if (!EVP_DecodedLength(&len, strlen(in))) {
  576. fprintf(stderr, "EVP_DecodedLength failed\n");
  577. return false;
  578. }
  579. out->resize(len);
  580. if (!EVP_DecodeBase64(out->data(), &len, len, (const uint8_t *)in,
  581. strlen(in))) {
  582. fprintf(stderr, "EVP_DecodeBase64 failed\n");
  583. return false;
  584. }
  585. out->resize(len);
  586. return true;
  587. }
  588. static bool TestSSL_SESSIONEncoding(const char *input_b64) {
  589. const uint8_t *cptr;
  590. uint8_t *ptr;
  591. // Decode the input.
  592. std::vector<uint8_t> input;
  593. if (!DecodeBase64(&input, input_b64)) {
  594. return false;
  595. }
  596. // Verify the SSL_SESSION decodes.
  597. bssl::UniquePtr<SSL_SESSION> session(SSL_SESSION_from_bytes(input.data(), input.size()));
  598. if (!session) {
  599. fprintf(stderr, "SSL_SESSION_from_bytes failed\n");
  600. return false;
  601. }
  602. // Verify the SSL_SESSION encoding round-trips.
  603. size_t encoded_len;
  604. bssl::UniquePtr<uint8_t> encoded;
  605. uint8_t *encoded_raw;
  606. if (!SSL_SESSION_to_bytes(session.get(), &encoded_raw, &encoded_len)) {
  607. fprintf(stderr, "SSL_SESSION_to_bytes failed\n");
  608. return false;
  609. }
  610. encoded.reset(encoded_raw);
  611. if (encoded_len != input.size() ||
  612. memcmp(input.data(), encoded.get(), input.size()) != 0) {
  613. fprintf(stderr, "SSL_SESSION_to_bytes did not round-trip\n");
  614. hexdump(stderr, "Before: ", input.data(), input.size());
  615. hexdump(stderr, "After: ", encoded_raw, encoded_len);
  616. return false;
  617. }
  618. // Verify the SSL_SESSION also decodes with the legacy API.
  619. cptr = input.data();
  620. session.reset(d2i_SSL_SESSION(NULL, &cptr, input.size()));
  621. if (!session || cptr != input.data() + input.size()) {
  622. fprintf(stderr, "d2i_SSL_SESSION failed\n");
  623. return false;
  624. }
  625. // Verify the SSL_SESSION encoding round-trips via the legacy API.
  626. int len = i2d_SSL_SESSION(session.get(), NULL);
  627. if (len < 0 || (size_t)len != input.size()) {
  628. fprintf(stderr, "i2d_SSL_SESSION(NULL) returned invalid length\n");
  629. return false;
  630. }
  631. encoded.reset((uint8_t *)OPENSSL_malloc(input.size()));
  632. if (!encoded) {
  633. fprintf(stderr, "malloc failed\n");
  634. return false;
  635. }
  636. ptr = encoded.get();
  637. len = i2d_SSL_SESSION(session.get(), &ptr);
  638. if (len < 0 || (size_t)len != input.size()) {
  639. fprintf(stderr, "i2d_SSL_SESSION returned invalid length\n");
  640. return false;
  641. }
  642. if (ptr != encoded.get() + input.size()) {
  643. fprintf(stderr, "i2d_SSL_SESSION did not advance ptr correctly\n");
  644. return false;
  645. }
  646. if (memcmp(input.data(), encoded.get(), input.size()) != 0) {
  647. fprintf(stderr, "i2d_SSL_SESSION did not round-trip\n");
  648. return false;
  649. }
  650. return true;
  651. }
  652. static bool TestBadSSL_SESSIONEncoding(const char *input_b64) {
  653. std::vector<uint8_t> input;
  654. if (!DecodeBase64(&input, input_b64)) {
  655. return false;
  656. }
  657. // Verify that the SSL_SESSION fails to decode.
  658. bssl::UniquePtr<SSL_SESSION> session(SSL_SESSION_from_bytes(input.data(), input.size()));
  659. if (session) {
  660. fprintf(stderr, "SSL_SESSION_from_bytes unexpectedly succeeded\n");
  661. return false;
  662. }
  663. ERR_clear_error();
  664. return true;
  665. }
  666. static bool TestDefaultVersion(uint16_t min_version, uint16_t max_version,
  667. const SSL_METHOD *(*method)(void)) {
  668. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(method()));
  669. if (!ctx) {
  670. return false;
  671. }
  672. if (ctx->min_version != min_version || ctx->max_version != max_version) {
  673. fprintf(stderr, "Got min %04x, max %04x; wanted min %04x, max %04x\n",
  674. ctx->min_version, ctx->max_version, min_version, max_version);
  675. return false;
  676. }
  677. return true;
  678. }
  679. static bool CipherGetRFCName(std::string *out, uint16_t value) {
  680. const SSL_CIPHER *cipher = SSL_get_cipher_by_value(value);
  681. if (cipher == NULL) {
  682. return false;
  683. }
  684. bssl::UniquePtr<char> rfc_name(SSL_CIPHER_get_rfc_name(cipher));
  685. if (!rfc_name) {
  686. return false;
  687. }
  688. out->assign(rfc_name.get());
  689. return true;
  690. }
  691. typedef struct {
  692. int id;
  693. const char *rfc_name;
  694. } CIPHER_RFC_NAME_TEST;
  695. static const CIPHER_RFC_NAME_TEST kCipherRFCNameTests[] = {
  696. { SSL3_CK_RSA_DES_192_CBC3_SHA, "TLS_RSA_WITH_3DES_EDE_CBC_SHA" },
  697. #ifdef BORINGSSL_ENABLE_RC4_TLS
  698. { SSL3_CK_RSA_RC4_128_MD5, "TLS_RSA_WITH_RC4_MD5" },
  699. #endif
  700. { TLS1_CK_RSA_WITH_AES_128_SHA, "TLS_RSA_WITH_AES_128_CBC_SHA" },
  701. { TLS1_CK_DHE_RSA_WITH_AES_256_SHA, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA" },
  702. { TLS1_CK_DHE_RSA_WITH_AES_256_SHA256,
  703. "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256" },
  704. { TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256,
  705. "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256" },
  706. { TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384,
  707. "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384" },
  708. { TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  709. "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" },
  710. { TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  711. "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" },
  712. { TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  713. "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" },
  714. #ifdef BORINGSSL_ENABLE_RC4_TLS
  715. { TLS1_CK_PSK_WITH_RC4_128_SHA, "TLS_PSK_WITH_RC4_SHA" },
  716. #endif
  717. { TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA,
  718. "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA" },
  719. { TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
  720. "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256" },
  721. // These names are non-standard:
  722. { TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD,
  723. "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256" },
  724. { TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD,
  725. "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256" },
  726. };
  727. static bool TestCipherGetRFCName(void) {
  728. for (size_t i = 0;
  729. i < OPENSSL_ARRAY_SIZE(kCipherRFCNameTests); i++) {
  730. const CIPHER_RFC_NAME_TEST *test = &kCipherRFCNameTests[i];
  731. std::string rfc_name;
  732. if (!CipherGetRFCName(&rfc_name, test->id & 0xffff)) {
  733. fprintf(stderr, "SSL_CIPHER_get_rfc_name failed\n");
  734. return false;
  735. }
  736. if (rfc_name != test->rfc_name) {
  737. fprintf(stderr, "SSL_CIPHER_get_rfc_name: got '%s', wanted '%s'\n",
  738. rfc_name.c_str(), test->rfc_name);
  739. return false;
  740. }
  741. }
  742. return true;
  743. }
  744. // CreateSessionWithTicket returns a sample |SSL_SESSION| with the ticket
  745. // replaced for one of length |ticket_len| or nullptr on failure.
  746. static bssl::UniquePtr<SSL_SESSION> CreateSessionWithTicket(size_t ticket_len) {
  747. std::vector<uint8_t> der;
  748. if (!DecodeBase64(&der, kOpenSSLSession)) {
  749. return nullptr;
  750. }
  751. bssl::UniquePtr<SSL_SESSION> session(SSL_SESSION_from_bytes(der.data(), der.size()));
  752. if (!session) {
  753. return nullptr;
  754. }
  755. // Swap out the ticket for a garbage one.
  756. OPENSSL_free(session->tlsext_tick);
  757. session->tlsext_tick = reinterpret_cast<uint8_t*>(OPENSSL_malloc(ticket_len));
  758. if (session->tlsext_tick == nullptr) {
  759. return nullptr;
  760. }
  761. memset(session->tlsext_tick, 'a', ticket_len);
  762. session->tlsext_ticklen = ticket_len;
  763. // Fix up the timeout.
  764. session->time = time(NULL);
  765. return session;
  766. }
  767. static bool GetClientHello(SSL *ssl, std::vector<uint8_t> *out) {
  768. bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
  769. if (!bio) {
  770. return false;
  771. }
  772. // Do not configure a reading BIO, but record what's written to a memory BIO.
  773. BIO_up_ref(bio.get());
  774. SSL_set_bio(ssl, nullptr /* rbio */, bio.get());
  775. int ret = SSL_connect(ssl);
  776. if (ret > 0) {
  777. // SSL_connect should fail without a BIO to write to.
  778. return false;
  779. }
  780. ERR_clear_error();
  781. const uint8_t *client_hello;
  782. size_t client_hello_len;
  783. if (!BIO_mem_contents(bio.get(), &client_hello, &client_hello_len)) {
  784. return false;
  785. }
  786. *out = std::vector<uint8_t>(client_hello, client_hello + client_hello_len);
  787. return true;
  788. }
  789. // GetClientHelloLen creates a client SSL connection with a ticket of length
  790. // |ticket_len| and records the ClientHello. It returns the length of the
  791. // ClientHello, not including the record header, on success and zero on error.
  792. static size_t GetClientHelloLen(size_t ticket_len) {
  793. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  794. bssl::UniquePtr<SSL_SESSION> session = CreateSessionWithTicket(ticket_len);
  795. if (!ctx || !session) {
  796. return 0;
  797. }
  798. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  799. if (!ssl || !SSL_set_session(ssl.get(), session.get())) {
  800. return 0;
  801. }
  802. std::vector<uint8_t> client_hello;
  803. if (!GetClientHello(ssl.get(), &client_hello) ||
  804. client_hello.size() <= SSL3_RT_HEADER_LENGTH) {
  805. return 0;
  806. }
  807. return client_hello.size() - SSL3_RT_HEADER_LENGTH;
  808. }
  809. struct PaddingTest {
  810. size_t input_len, padded_len;
  811. };
  812. static const PaddingTest kPaddingTests[] = {
  813. // ClientHellos of length below 0x100 do not require padding.
  814. {0xfe, 0xfe},
  815. {0xff, 0xff},
  816. // ClientHellos of length 0x100 through 0x1fb are padded up to 0x200.
  817. {0x100, 0x200},
  818. {0x123, 0x200},
  819. {0x1fb, 0x200},
  820. // ClientHellos of length 0x1fc through 0x1ff get padded beyond 0x200. The
  821. // padding extension takes a minimum of four bytes plus one required content
  822. // byte. (To work around yet more server bugs, we avoid empty final
  823. // extensions.)
  824. {0x1fc, 0x201},
  825. {0x1fd, 0x202},
  826. {0x1fe, 0x203},
  827. {0x1ff, 0x204},
  828. // Finally, larger ClientHellos need no padding.
  829. {0x200, 0x200},
  830. {0x201, 0x201},
  831. };
  832. static bool TestPaddingExtension() {
  833. // Sample a baseline length.
  834. size_t base_len = GetClientHelloLen(1);
  835. if (base_len == 0) {
  836. return false;
  837. }
  838. for (const PaddingTest &test : kPaddingTests) {
  839. if (base_len > test.input_len) {
  840. fprintf(stderr, "Baseline ClientHello too long.\n");
  841. return false;
  842. }
  843. size_t padded_len = GetClientHelloLen(1 + test.input_len - base_len);
  844. if (padded_len != test.padded_len) {
  845. fprintf(stderr, "%u-byte ClientHello padded to %u bytes, not %u.\n",
  846. static_cast<unsigned>(test.input_len),
  847. static_cast<unsigned>(padded_len),
  848. static_cast<unsigned>(test.padded_len));
  849. return false;
  850. }
  851. }
  852. return true;
  853. }
  854. // Test that |SSL_get_client_CA_list| echoes back the configured parameter even
  855. // before configuring as a server.
  856. static bool TestClientCAList() {
  857. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  858. if (!ctx) {
  859. return false;
  860. }
  861. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  862. if (!ssl) {
  863. return false;
  864. }
  865. STACK_OF(X509_NAME) *stack = sk_X509_NAME_new_null();
  866. if (stack == nullptr) {
  867. return false;
  868. }
  869. // |SSL_set_client_CA_list| takes ownership.
  870. SSL_set_client_CA_list(ssl.get(), stack);
  871. return SSL_get_client_CA_list(ssl.get()) == stack;
  872. }
  873. static void AppendSession(SSL_SESSION *session, void *arg) {
  874. std::vector<SSL_SESSION*> *out =
  875. reinterpret_cast<std::vector<SSL_SESSION*>*>(arg);
  876. out->push_back(session);
  877. }
  878. // ExpectCache returns true if |ctx|'s session cache consists of |expected|, in
  879. // order.
  880. static bool ExpectCache(SSL_CTX *ctx,
  881. const std::vector<SSL_SESSION*> &expected) {
  882. // Check the linked list.
  883. SSL_SESSION *ptr = ctx->session_cache_head;
  884. for (SSL_SESSION *session : expected) {
  885. if (ptr != session) {
  886. return false;
  887. }
  888. // TODO(davidben): This is an absurd way to denote the end of the list.
  889. if (ptr->next ==
  890. reinterpret_cast<SSL_SESSION *>(&ctx->session_cache_tail)) {
  891. ptr = nullptr;
  892. } else {
  893. ptr = ptr->next;
  894. }
  895. }
  896. if (ptr != nullptr) {
  897. return false;
  898. }
  899. // Check the hash table.
  900. std::vector<SSL_SESSION*> actual, expected_copy;
  901. lh_SSL_SESSION_doall_arg(SSL_CTX_sessions(ctx), AppendSession, &actual);
  902. expected_copy = expected;
  903. std::sort(actual.begin(), actual.end());
  904. std::sort(expected_copy.begin(), expected_copy.end());
  905. return actual == expected_copy;
  906. }
  907. static bssl::UniquePtr<SSL_SESSION> CreateTestSession(uint32_t number) {
  908. bssl::UniquePtr<SSL_SESSION> ret(SSL_SESSION_new());
  909. if (!ret) {
  910. return nullptr;
  911. }
  912. ret->session_id_length = SSL3_SSL_SESSION_ID_LENGTH;
  913. memset(ret->session_id, 0, ret->session_id_length);
  914. memcpy(ret->session_id, &number, sizeof(number));
  915. return ret;
  916. }
  917. // Test that the internal session cache behaves as expected.
  918. static bool TestInternalSessionCache() {
  919. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  920. if (!ctx) {
  921. return false;
  922. }
  923. // Prepare 10 test sessions.
  924. std::vector<bssl::UniquePtr<SSL_SESSION>> sessions;
  925. for (int i = 0; i < 10; i++) {
  926. bssl::UniquePtr<SSL_SESSION> session = CreateTestSession(i);
  927. if (!session) {
  928. return false;
  929. }
  930. sessions.push_back(std::move(session));
  931. }
  932. SSL_CTX_sess_set_cache_size(ctx.get(), 5);
  933. // Insert all the test sessions.
  934. for (const auto &session : sessions) {
  935. if (!SSL_CTX_add_session(ctx.get(), session.get())) {
  936. return false;
  937. }
  938. }
  939. // Only the last five should be in the list.
  940. std::vector<SSL_SESSION*> expected = {
  941. sessions[9].get(),
  942. sessions[8].get(),
  943. sessions[7].get(),
  944. sessions[6].get(),
  945. sessions[5].get(),
  946. };
  947. if (!ExpectCache(ctx.get(), expected)) {
  948. return false;
  949. }
  950. // Inserting an element already in the cache should fail.
  951. if (SSL_CTX_add_session(ctx.get(), sessions[7].get()) ||
  952. !ExpectCache(ctx.get(), expected)) {
  953. return false;
  954. }
  955. // Although collisions should be impossible (256-bit session IDs), the cache
  956. // must handle them gracefully.
  957. bssl::UniquePtr<SSL_SESSION> collision(CreateTestSession(7));
  958. if (!collision || !SSL_CTX_add_session(ctx.get(), collision.get())) {
  959. return false;
  960. }
  961. expected = {
  962. collision.get(),
  963. sessions[9].get(),
  964. sessions[8].get(),
  965. sessions[6].get(),
  966. sessions[5].get(),
  967. };
  968. if (!ExpectCache(ctx.get(), expected)) {
  969. return false;
  970. }
  971. // Removing sessions behaves correctly.
  972. if (!SSL_CTX_remove_session(ctx.get(), sessions[6].get())) {
  973. return false;
  974. }
  975. expected = {
  976. collision.get(),
  977. sessions[9].get(),
  978. sessions[8].get(),
  979. sessions[5].get(),
  980. };
  981. if (!ExpectCache(ctx.get(), expected)) {
  982. return false;
  983. }
  984. // Removing sessions requires an exact match.
  985. if (SSL_CTX_remove_session(ctx.get(), sessions[0].get()) ||
  986. SSL_CTX_remove_session(ctx.get(), sessions[7].get()) ||
  987. !ExpectCache(ctx.get(), expected)) {
  988. return false;
  989. }
  990. return true;
  991. }
  992. static uint16_t EpochFromSequence(uint64_t seq) {
  993. return static_cast<uint16_t>(seq >> 48);
  994. }
  995. static bssl::UniquePtr<X509> GetTestCertificate() {
  996. static const char kCertPEM[] =
  997. "-----BEGIN CERTIFICATE-----\n"
  998. "MIICWDCCAcGgAwIBAgIJAPuwTC6rEJsMMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV\n"
  999. "BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\n"
  1000. "aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDIzMjA1MDQwWhcNMTcwNDIyMjA1MDQwWjBF\n"
  1001. "MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50\n"
  1002. "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n"
  1003. "gQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92kWdGMdAQhLci\n"
  1004. "HnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiFKKAnHmUcrgfV\n"
  1005. "W28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQABo1AwTjAdBgNV\n"
  1006. "HQ4EFgQUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wHwYDVR0jBBgwFoAUi3XVrMsIvg4f\n"
  1007. "Zbf6Vr5sp3Xaha8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQA76Hht\n"
  1008. "ldY9avcTGSwbwoiuIqv0jTL1fHFnzy3RHMLDh+Lpvolc5DSrSJHCP5WuK0eeJXhr\n"
  1009. "T5oQpHL9z/cCDLAKCKRa4uV0fhEdOWBqyR9p8y5jJtye72t6CuFUV5iqcpF4BH4f\n"
  1010. "j2VNHwsSrJwkD4QUGlUtH7vwnQmyCFxZMmWAJg==\n"
  1011. "-----END CERTIFICATE-----\n";
  1012. bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(kCertPEM, strlen(kCertPEM)));
  1013. return bssl::UniquePtr<X509>(PEM_read_bio_X509(bio.get(), nullptr, nullptr, nullptr));
  1014. }
  1015. static bssl::UniquePtr<EVP_PKEY> GetTestKey() {
  1016. static const char kKeyPEM[] =
  1017. "-----BEGIN RSA PRIVATE KEY-----\n"
  1018. "MIICXgIBAAKBgQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92\n"
  1019. "kWdGMdAQhLciHnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiF\n"
  1020. "KKAnHmUcrgfVW28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQAB\n"
  1021. "AoGBAIBy09Fd4DOq/Ijp8HeKuCMKTHqTW1xGHshLQ6jwVV2vWZIn9aIgmDsvkjCe\n"
  1022. "i6ssZvnbjVcwzSoByhjN8ZCf/i15HECWDFFh6gt0P5z0MnChwzZmvatV/FXCT0j+\n"
  1023. "WmGNB/gkehKjGXLLcjTb6dRYVJSCZhVuOLLcbWIV10gggJQBAkEA8S8sGe4ezyyZ\n"
  1024. "m4e9r95g6s43kPqtj5rewTsUxt+2n4eVodD+ZUlCULWVNAFLkYRTBCASlSrm9Xhj\n"
  1025. "QpmWAHJUkQJBAOVzQdFUaewLtdOJoPCtpYoY1zd22eae8TQEmpGOR11L6kbxLQsk\n"
  1026. "aMly/DOnOaa82tqAGTdqDEZgSNmCeKKknmECQAvpnY8GUOVAubGR6c+W90iBuQLj\n"
  1027. "LtFp/9ihd2w/PoDwrHZaoUYVcT4VSfJQog/k7kjE4MYXYWL8eEKg3WTWQNECQQDk\n"
  1028. "104Wi91Umd1PzF0ijd2jXOERJU1wEKe6XLkYYNHWQAe5l4J4MWj9OdxFXAxIuuR/\n"
  1029. "tfDwbqkta4xcux67//khAkEAvvRXLHTaa6VFzTaiiO8SaFsHV3lQyXOtMrBpB5jd\n"
  1030. "moZWgjHvB2W9Ckn7sDqsPB+U2tyX0joDdQEyuiMECDY8oQ==\n"
  1031. "-----END RSA PRIVATE KEY-----\n";
  1032. bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(kKeyPEM, strlen(kKeyPEM)));
  1033. return bssl::UniquePtr<EVP_PKEY>(
  1034. PEM_read_bio_PrivateKey(bio.get(), nullptr, nullptr, nullptr));
  1035. }
  1036. static bssl::UniquePtr<X509> GetECDSATestCertificate() {
  1037. static const char kCertPEM[] =
  1038. "-----BEGIN CERTIFICATE-----\n"
  1039. "MIIBzzCCAXagAwIBAgIJANlMBNpJfb/rMAkGByqGSM49BAEwRTELMAkGA1UEBhMC\n"
  1040. "QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp\n"
  1041. "dHMgUHR5IEx0ZDAeFw0xNDA0MjMyMzIxNTdaFw0xNDA1MjMyMzIxNTdaMEUxCzAJ\n"
  1042. "BgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5l\n"
  1043. "dCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmK2ni\n"
  1044. "v2Wfl74vHg2UikzVl2u3qR4NRvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYa\n"
  1045. "HPUdfvGULUvPciLBo1AwTjAdBgNVHQ4EFgQUq4TSrKuV8IJOFngHVVdf5CaNgtEw\n"
  1046. "HwYDVR0jBBgwFoAUq4TSrKuV8IJOFngHVVdf5CaNgtEwDAYDVR0TBAUwAwEB/zAJ\n"
  1047. "BgcqhkjOPQQBA0gAMEUCIQDyoDVeUTo2w4J5m+4nUIWOcAZ0lVfSKXQA9L4Vh13E\n"
  1048. "BwIgfB55FGohg/B6dGh5XxSZmmi08cueFV7mHzJSYV51yRQ=\n"
  1049. "-----END CERTIFICATE-----\n";
  1050. bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(kCertPEM, strlen(kCertPEM)));
  1051. return bssl::UniquePtr<X509>(PEM_read_bio_X509(bio.get(), nullptr, nullptr, nullptr));
  1052. }
  1053. static bssl::UniquePtr<EVP_PKEY> GetECDSATestKey() {
  1054. static const char kKeyPEM[] =
  1055. "-----BEGIN PRIVATE KEY-----\n"
  1056. "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgBw8IcnrUoEqc3VnJ\n"
  1057. "TYlodwi1b8ldMHcO6NHJzgqLtGqhRANCAATmK2niv2Wfl74vHg2UikzVl2u3qR4N\n"
  1058. "Rvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYaHPUdfvGULUvPciLB\n"
  1059. "-----END PRIVATE KEY-----\n";
  1060. bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(kKeyPEM, strlen(kKeyPEM)));
  1061. return bssl::UniquePtr<EVP_PKEY>(
  1062. PEM_read_bio_PrivateKey(bio.get(), nullptr, nullptr, nullptr));
  1063. }
  1064. static bool ConnectClientAndServer(bssl::UniquePtr<SSL> *out_client, bssl::UniquePtr<SSL> *out_server,
  1065. SSL_CTX *client_ctx, SSL_CTX *server_ctx,
  1066. SSL_SESSION *session) {
  1067. bssl::UniquePtr<SSL> client(SSL_new(client_ctx)), server(SSL_new(server_ctx));
  1068. if (!client || !server) {
  1069. return false;
  1070. }
  1071. SSL_set_connect_state(client.get());
  1072. SSL_set_accept_state(server.get());
  1073. SSL_set_session(client.get(), session);
  1074. BIO *bio1, *bio2;
  1075. if (!BIO_new_bio_pair(&bio1, 0, &bio2, 0)) {
  1076. return false;
  1077. }
  1078. // SSL_set_bio takes ownership.
  1079. SSL_set_bio(client.get(), bio1, bio1);
  1080. SSL_set_bio(server.get(), bio2, bio2);
  1081. // Drive both their handshakes to completion.
  1082. for (;;) {
  1083. int client_ret = SSL_do_handshake(client.get());
  1084. int client_err = SSL_get_error(client.get(), client_ret);
  1085. if (client_err != SSL_ERROR_NONE &&
  1086. client_err != SSL_ERROR_WANT_READ &&
  1087. client_err != SSL_ERROR_WANT_WRITE) {
  1088. fprintf(stderr, "Client error: %d\n", client_err);
  1089. return false;
  1090. }
  1091. int server_ret = SSL_do_handshake(server.get());
  1092. int server_err = SSL_get_error(server.get(), server_ret);
  1093. if (server_err != SSL_ERROR_NONE &&
  1094. server_err != SSL_ERROR_WANT_READ &&
  1095. server_err != SSL_ERROR_WANT_WRITE) {
  1096. fprintf(stderr, "Server error: %d\n", server_err);
  1097. return false;
  1098. }
  1099. if (client_ret == 1 && server_ret == 1) {
  1100. break;
  1101. }
  1102. }
  1103. *out_client = std::move(client);
  1104. *out_server = std::move(server);
  1105. return true;
  1106. }
  1107. static bool TestSequenceNumber(bool dtls) {
  1108. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(dtls ? DTLS_method() : TLS_method()));
  1109. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(dtls ? DTLS_method() : TLS_method()));
  1110. if (!client_ctx || !server_ctx) {
  1111. return false;
  1112. }
  1113. bssl::UniquePtr<X509> cert = GetTestCertificate();
  1114. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  1115. if (!cert || !key ||
  1116. !SSL_CTX_use_certificate(server_ctx.get(), cert.get()) ||
  1117. !SSL_CTX_use_PrivateKey(server_ctx.get(), key.get())) {
  1118. return false;
  1119. }
  1120. bssl::UniquePtr<SSL> client, server;
  1121. if (!ConnectClientAndServer(&client, &server, client_ctx.get(),
  1122. server_ctx.get(), nullptr /* no session */)) {
  1123. return false;
  1124. }
  1125. uint64_t client_read_seq = SSL_get_read_sequence(client.get());
  1126. uint64_t client_write_seq = SSL_get_write_sequence(client.get());
  1127. uint64_t server_read_seq = SSL_get_read_sequence(server.get());
  1128. uint64_t server_write_seq = SSL_get_write_sequence(server.get());
  1129. if (dtls) {
  1130. // Both client and server must be at epoch 1.
  1131. if (EpochFromSequence(client_read_seq) != 1 ||
  1132. EpochFromSequence(client_write_seq) != 1 ||
  1133. EpochFromSequence(server_read_seq) != 1 ||
  1134. EpochFromSequence(server_write_seq) != 1) {
  1135. fprintf(stderr, "Bad epochs.\n");
  1136. return false;
  1137. }
  1138. // The next record to be written should exceed the largest received.
  1139. if (client_write_seq <= server_read_seq ||
  1140. server_write_seq <= client_read_seq) {
  1141. fprintf(stderr, "Inconsistent sequence numbers.\n");
  1142. return false;
  1143. }
  1144. } else {
  1145. // The next record to be written should equal the next to be received.
  1146. if (client_write_seq != server_read_seq ||
  1147. server_write_seq != client_write_seq) {
  1148. fprintf(stderr, "Inconsistent sequence numbers.\n");
  1149. return false;
  1150. }
  1151. }
  1152. // Send a record from client to server.
  1153. uint8_t byte = 0;
  1154. if (SSL_write(client.get(), &byte, 1) != 1 ||
  1155. SSL_read(server.get(), &byte, 1) != 1) {
  1156. fprintf(stderr, "Could not send byte.\n");
  1157. return false;
  1158. }
  1159. // The client write and server read sequence numbers should have incremented.
  1160. if (client_write_seq + 1 != SSL_get_write_sequence(client.get()) ||
  1161. server_read_seq + 1 != SSL_get_read_sequence(server.get())) {
  1162. fprintf(stderr, "Sequence numbers did not increment.\n");\
  1163. return false;
  1164. }
  1165. return true;
  1166. }
  1167. static bool TestOneSidedShutdown() {
  1168. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  1169. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  1170. if (!client_ctx || !server_ctx) {
  1171. return false;
  1172. }
  1173. bssl::UniquePtr<X509> cert = GetTestCertificate();
  1174. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  1175. if (!cert || !key ||
  1176. !SSL_CTX_use_certificate(server_ctx.get(), cert.get()) ||
  1177. !SSL_CTX_use_PrivateKey(server_ctx.get(), key.get())) {
  1178. return false;
  1179. }
  1180. bssl::UniquePtr<SSL> client, server;
  1181. if (!ConnectClientAndServer(&client, &server, client_ctx.get(),
  1182. server_ctx.get(), nullptr /* no session */)) {
  1183. return false;
  1184. }
  1185. // Shut down half the connection. SSL_shutdown will return 0 to signal only
  1186. // one side has shut down.
  1187. if (SSL_shutdown(client.get()) != 0) {
  1188. fprintf(stderr, "Could not shutdown.\n");
  1189. return false;
  1190. }
  1191. // Reading from the server should consume the EOF.
  1192. uint8_t byte;
  1193. if (SSL_read(server.get(), &byte, 1) != 0 ||
  1194. SSL_get_error(server.get(), 0) != SSL_ERROR_ZERO_RETURN) {
  1195. fprintf(stderr, "Connection was not shut down cleanly.\n");
  1196. return false;
  1197. }
  1198. // However, the server may continue to write data and then shut down the
  1199. // connection.
  1200. byte = 42;
  1201. if (SSL_write(server.get(), &byte, 1) != 1 ||
  1202. SSL_read(client.get(), &byte, 1) != 1 ||
  1203. byte != 42) {
  1204. fprintf(stderr, "Could not send byte.\n");
  1205. return false;
  1206. }
  1207. // The server may then shutdown the connection.
  1208. if (SSL_shutdown(server.get()) != 1 ||
  1209. SSL_shutdown(client.get()) != 1) {
  1210. fprintf(stderr, "Could not complete shutdown.\n");
  1211. return false;
  1212. }
  1213. return true;
  1214. }
  1215. static bool TestSessionDuplication() {
  1216. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  1217. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  1218. if (!client_ctx || !server_ctx) {
  1219. return false;
  1220. }
  1221. bssl::UniquePtr<X509> cert = GetTestCertificate();
  1222. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  1223. if (!cert || !key ||
  1224. !SSL_CTX_use_certificate(server_ctx.get(), cert.get()) ||
  1225. !SSL_CTX_use_PrivateKey(server_ctx.get(), key.get())) {
  1226. return false;
  1227. }
  1228. bssl::UniquePtr<SSL> client, server;
  1229. if (!ConnectClientAndServer(&client, &server, client_ctx.get(),
  1230. server_ctx.get(), nullptr /* no session */)) {
  1231. return false;
  1232. }
  1233. SSL_SESSION *session0 = SSL_get_session(client.get());
  1234. bssl::UniquePtr<SSL_SESSION> session1(SSL_SESSION_dup(session0, SSL_SESSION_DUP_ALL));
  1235. if (!session1) {
  1236. return false;
  1237. }
  1238. session1->not_resumable = 0;
  1239. uint8_t *s0_bytes, *s1_bytes;
  1240. size_t s0_len, s1_len;
  1241. if (!SSL_SESSION_to_bytes(session0, &s0_bytes, &s0_len)) {
  1242. return false;
  1243. }
  1244. bssl::UniquePtr<uint8_t> free_s0(s0_bytes);
  1245. if (!SSL_SESSION_to_bytes(session1.get(), &s1_bytes, &s1_len)) {
  1246. return false;
  1247. }
  1248. bssl::UniquePtr<uint8_t> free_s1(s1_bytes);
  1249. return s0_len == s1_len && memcmp(s0_bytes, s1_bytes, s0_len) == 0;
  1250. }
  1251. static bool ExpectFDs(const SSL *ssl, int rfd, int wfd) {
  1252. if (SSL_get_rfd(ssl) != rfd || SSL_get_wfd(ssl) != wfd) {
  1253. fprintf(stderr, "Got fds %d and %d, wanted %d and %d.\n", SSL_get_rfd(ssl),
  1254. SSL_get_wfd(ssl), rfd, wfd);
  1255. return false;
  1256. }
  1257. // The wrapper BIOs are always equal when fds are equal, even if set
  1258. // individually.
  1259. if (rfd == wfd && SSL_get_rbio(ssl) != SSL_get_wbio(ssl)) {
  1260. fprintf(stderr, "rbio and wbio did not match.\n");
  1261. return false;
  1262. }
  1263. return true;
  1264. }
  1265. static bool TestSetFD() {
  1266. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  1267. if (!ctx) {
  1268. return false;
  1269. }
  1270. // Test setting different read and write FDs.
  1271. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  1272. if (!ssl ||
  1273. !SSL_set_rfd(ssl.get(), 1) ||
  1274. !SSL_set_wfd(ssl.get(), 2) ||
  1275. !ExpectFDs(ssl.get(), 1, 2)) {
  1276. return false;
  1277. }
  1278. // Test setting the same FD.
  1279. ssl.reset(SSL_new(ctx.get()));
  1280. if (!ssl ||
  1281. !SSL_set_fd(ssl.get(), 1) ||
  1282. !ExpectFDs(ssl.get(), 1, 1)) {
  1283. return false;
  1284. }
  1285. // Test setting the same FD one side at a time.
  1286. ssl.reset(SSL_new(ctx.get()));
  1287. if (!ssl ||
  1288. !SSL_set_rfd(ssl.get(), 1) ||
  1289. !SSL_set_wfd(ssl.get(), 1) ||
  1290. !ExpectFDs(ssl.get(), 1, 1)) {
  1291. return false;
  1292. }
  1293. // Test setting the same FD in the other order.
  1294. ssl.reset(SSL_new(ctx.get()));
  1295. if (!ssl ||
  1296. !SSL_set_wfd(ssl.get(), 1) ||
  1297. !SSL_set_rfd(ssl.get(), 1) ||
  1298. !ExpectFDs(ssl.get(), 1, 1)) {
  1299. return false;
  1300. }
  1301. // Test changing the read FD partway through.
  1302. ssl.reset(SSL_new(ctx.get()));
  1303. if (!ssl ||
  1304. !SSL_set_fd(ssl.get(), 1) ||
  1305. !SSL_set_rfd(ssl.get(), 2) ||
  1306. !ExpectFDs(ssl.get(), 2, 1)) {
  1307. return false;
  1308. }
  1309. // Test changing the write FD partway through.
  1310. ssl.reset(SSL_new(ctx.get()));
  1311. if (!ssl ||
  1312. !SSL_set_fd(ssl.get(), 1) ||
  1313. !SSL_set_wfd(ssl.get(), 2) ||
  1314. !ExpectFDs(ssl.get(), 1, 2)) {
  1315. return false;
  1316. }
  1317. // Test a no-op change to the read FD partway through.
  1318. ssl.reset(SSL_new(ctx.get()));
  1319. if (!ssl ||
  1320. !SSL_set_fd(ssl.get(), 1) ||
  1321. !SSL_set_rfd(ssl.get(), 1) ||
  1322. !ExpectFDs(ssl.get(), 1, 1)) {
  1323. return false;
  1324. }
  1325. // Test a no-op change to the write FD partway through.
  1326. ssl.reset(SSL_new(ctx.get()));
  1327. if (!ssl ||
  1328. !SSL_set_fd(ssl.get(), 1) ||
  1329. !SSL_set_wfd(ssl.get(), 1) ||
  1330. !ExpectFDs(ssl.get(), 1, 1)) {
  1331. return false;
  1332. }
  1333. // ASan builds will implicitly test that the internal |BIO| reference-counting
  1334. // is correct.
  1335. return true;
  1336. }
  1337. static bool TestSetBIO() {
  1338. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  1339. if (!ctx) {
  1340. return false;
  1341. }
  1342. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  1343. bssl::UniquePtr<BIO> bio1(BIO_new(BIO_s_mem())), bio2(BIO_new(BIO_s_mem())),
  1344. bio3(BIO_new(BIO_s_mem()));
  1345. if (!ssl || !bio1 || !bio2 || !bio3) {
  1346. return false;
  1347. }
  1348. // SSL_set_bio takes one reference when the parameters are the same.
  1349. BIO_up_ref(bio1.get());
  1350. SSL_set_bio(ssl.get(), bio1.get(), bio1.get());
  1351. // Repeating the call does nothing.
  1352. SSL_set_bio(ssl.get(), bio1.get(), bio1.get());
  1353. // It takes one reference each when the parameters are different.
  1354. BIO_up_ref(bio2.get());
  1355. BIO_up_ref(bio3.get());
  1356. SSL_set_bio(ssl.get(), bio2.get(), bio3.get());
  1357. // Repeating the call does nothing.
  1358. SSL_set_bio(ssl.get(), bio2.get(), bio3.get());
  1359. // It takes one reference when changing only wbio.
  1360. BIO_up_ref(bio1.get());
  1361. SSL_set_bio(ssl.get(), bio2.get(), bio1.get());
  1362. // It takes one reference when changing only rbio and the two are different.
  1363. BIO_up_ref(bio3.get());
  1364. SSL_set_bio(ssl.get(), bio3.get(), bio1.get());
  1365. // If setting wbio to rbio, it takes no additional references.
  1366. SSL_set_bio(ssl.get(), bio3.get(), bio3.get());
  1367. // From there, wbio may be switched to something else.
  1368. BIO_up_ref(bio1.get());
  1369. SSL_set_bio(ssl.get(), bio3.get(), bio1.get());
  1370. // If setting rbio to wbio, it takes no additional references.
  1371. SSL_set_bio(ssl.get(), bio1.get(), bio1.get());
  1372. // From there, rbio may be switched to something else, but, for historical
  1373. // reasons, it takes a reference to both parameters.
  1374. BIO_up_ref(bio1.get());
  1375. BIO_up_ref(bio2.get());
  1376. SSL_set_bio(ssl.get(), bio2.get(), bio1.get());
  1377. // ASAN builds will implicitly test that the internal |BIO| reference-counting
  1378. // is correct.
  1379. return true;
  1380. }
  1381. static uint16_t kVersions[] = {
  1382. SSL3_VERSION, TLS1_VERSION, TLS1_1_VERSION, TLS1_2_VERSION, TLS1_3_VERSION,
  1383. };
  1384. static int VerifySucceed(X509_STORE_CTX *store_ctx, void *arg) { return 1; }
  1385. static bool TestGetPeerCertificate() {
  1386. bssl::UniquePtr<X509> cert = GetTestCertificate();
  1387. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  1388. if (!cert || !key) {
  1389. return false;
  1390. }
  1391. for (uint16_t version : kVersions) {
  1392. // Configure both client and server to accept any certificate.
  1393. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  1394. if (!ctx ||
  1395. !SSL_CTX_use_certificate(ctx.get(), cert.get()) ||
  1396. !SSL_CTX_use_PrivateKey(ctx.get(), key.get())) {
  1397. return false;
  1398. }
  1399. SSL_CTX_set_min_version(ctx.get(), version);
  1400. SSL_CTX_set_max_version(ctx.get(), version);
  1401. SSL_CTX_set_verify(
  1402. ctx.get(), SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr);
  1403. SSL_CTX_set_cert_verify_callback(ctx.get(), VerifySucceed, NULL);
  1404. bssl::UniquePtr<SSL> client, server;
  1405. if (!ConnectClientAndServer(&client, &server, ctx.get(), ctx.get(),
  1406. nullptr /* no session */)) {
  1407. return false;
  1408. }
  1409. // Client and server should both see the leaf certificate.
  1410. bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(server.get()));
  1411. if (!peer || X509_cmp(cert.get(), peer.get()) != 0) {
  1412. fprintf(stderr, "%x: Server peer certificate did not match.\n", version);
  1413. return false;
  1414. }
  1415. peer.reset(SSL_get_peer_certificate(client.get()));
  1416. if (!peer || X509_cmp(cert.get(), peer.get()) != 0) {
  1417. fprintf(stderr, "%x: Client peer certificate did not match.\n", version);
  1418. return false;
  1419. }
  1420. // However, for historical reasons, the chain includes the leaf on the
  1421. // client, but does not on the server.
  1422. if (sk_X509_num(SSL_get_peer_cert_chain(client.get())) != 1) {
  1423. fprintf(stderr, "%x: Client peer chain was incorrect.\n", version);
  1424. return false;
  1425. }
  1426. if (sk_X509_num(SSL_get_peer_cert_chain(server.get())) != 0) {
  1427. fprintf(stderr, "%x: Server peer chain was incorrect.\n", version);
  1428. return false;
  1429. }
  1430. }
  1431. return true;
  1432. }
  1433. static bool TestRetainOnlySHA256OfCerts() {
  1434. bssl::UniquePtr<X509> cert = GetTestCertificate();
  1435. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  1436. if (!cert || !key) {
  1437. return false;
  1438. }
  1439. uint8_t *cert_der = NULL;
  1440. int cert_der_len = i2d_X509(cert.get(), &cert_der);
  1441. if (cert_der_len < 0) {
  1442. return false;
  1443. }
  1444. bssl::UniquePtr<uint8_t> free_cert_der(cert_der);
  1445. uint8_t cert_sha256[SHA256_DIGEST_LENGTH];
  1446. SHA256(cert_der, cert_der_len, cert_sha256);
  1447. for (uint16_t version : kVersions) {
  1448. // Configure both client and server to accept any certificate, but the
  1449. // server must retain only the SHA-256 of the peer.
  1450. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  1451. if (!ctx ||
  1452. !SSL_CTX_use_certificate(ctx.get(), cert.get()) ||
  1453. !SSL_CTX_use_PrivateKey(ctx.get(), key.get())) {
  1454. return false;
  1455. }
  1456. SSL_CTX_set_min_version(ctx.get(), version);
  1457. SSL_CTX_set_max_version(ctx.get(), version);
  1458. SSL_CTX_set_verify(
  1459. ctx.get(), SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr);
  1460. SSL_CTX_set_cert_verify_callback(ctx.get(), VerifySucceed, NULL);
  1461. SSL_CTX_set_retain_only_sha256_of_client_certs(ctx.get(), 1);
  1462. bssl::UniquePtr<SSL> client, server;
  1463. if (!ConnectClientAndServer(&client, &server, ctx.get(), ctx.get(),
  1464. nullptr /* no session */)) {
  1465. return false;
  1466. }
  1467. // The peer certificate has been dropped.
  1468. bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(server.get()));
  1469. if (peer) {
  1470. fprintf(stderr, "%x: Peer certificate was retained.\n", version);
  1471. return false;
  1472. }
  1473. SSL_SESSION *session = SSL_get_session(server.get());
  1474. if (!session->peer_sha256_valid) {
  1475. fprintf(stderr, "%x: peer_sha256_valid was not set.\n", version);
  1476. return false;
  1477. }
  1478. if (memcmp(cert_sha256, session->peer_sha256, SHA256_DIGEST_LENGTH) != 0) {
  1479. fprintf(stderr, "%x: peer_sha256 did not match.\n", version);
  1480. return false;
  1481. }
  1482. }
  1483. return true;
  1484. }
  1485. static bool ClientHelloMatches(uint16_t version, const uint8_t *expected,
  1486. size_t expected_len) {
  1487. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  1488. if (!ctx) {
  1489. return false;
  1490. }
  1491. SSL_CTX_set_max_version(ctx.get(), version);
  1492. // Our default cipher list varies by CPU capabilities, so manually place the
  1493. // ChaCha20 ciphers in front.
  1494. if (!SSL_CTX_set_cipher_list(ctx.get(), "!RC4:CHACHA20:ALL")) {
  1495. return false;
  1496. }
  1497. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  1498. if (!ssl) {
  1499. return false;
  1500. }
  1501. std::vector<uint8_t> client_hello;
  1502. if (!GetClientHello(ssl.get(), &client_hello)) {
  1503. return false;
  1504. }
  1505. // Zero the client_random.
  1506. constexpr size_t kRandomOffset = 1 + 2 + 2 + // record header
  1507. 1 + 3 + // handshake message header
  1508. 2; // client_version
  1509. if (client_hello.size() < kRandomOffset + SSL3_RANDOM_SIZE) {
  1510. fprintf(stderr, "ClientHello for version %04x too short.\n", version);
  1511. return false;
  1512. }
  1513. memset(client_hello.data() + kRandomOffset, 0, SSL3_RANDOM_SIZE);
  1514. if (client_hello.size() != expected_len ||
  1515. memcmp(client_hello.data(), expected, expected_len) != 0) {
  1516. fprintf(stderr, "ClientHello for version %04x did not match:\n", version);
  1517. fprintf(stderr, "Got:\n\t");
  1518. for (size_t i = 0; i < client_hello.size(); i++) {
  1519. fprintf(stderr, "0x%02x, ", client_hello[i]);
  1520. }
  1521. fprintf(stderr, "\nWanted:\n\t");
  1522. for (size_t i = 0; i < expected_len; i++) {
  1523. fprintf(stderr, "0x%02x, ", expected[i]);
  1524. }
  1525. fprintf(stderr, "\n");
  1526. return false;
  1527. }
  1528. return true;
  1529. }
  1530. // Tests that our ClientHellos do not change unexpectedly.
  1531. static bool TestClientHello() {
  1532. static const uint8_t kSSL3ClientHello[] = {
  1533. 0x16,
  1534. 0x03, 0x00,
  1535. 0x00, 0x3f,
  1536. 0x01,
  1537. 0x00, 0x00, 0x3b,
  1538. 0x03, 0x00,
  1539. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1540. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1541. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1542. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1543. 0x00,
  1544. 0x00, 0x14,
  1545. 0xc0, 0x09,
  1546. 0xc0, 0x13,
  1547. 0x00, 0x33,
  1548. 0xc0, 0x0a,
  1549. 0xc0, 0x14,
  1550. 0x00, 0x39,
  1551. 0x00, 0x2f,
  1552. 0x00, 0x35,
  1553. 0x00, 0x0a,
  1554. 0x00, 0xff, 0x01, 0x00,
  1555. };
  1556. if (!ClientHelloMatches(SSL3_VERSION, kSSL3ClientHello,
  1557. sizeof(kSSL3ClientHello))) {
  1558. return false;
  1559. }
  1560. static const uint8_t kTLS1ClientHello[] = {
  1561. 0x16,
  1562. 0x03, 0x01,
  1563. 0x00, 0x5e,
  1564. 0x01,
  1565. 0x00, 0x00, 0x5a,
  1566. 0x03, 0x01,
  1567. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1568. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1569. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1570. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1571. 0x00,
  1572. 0x00, 0x12,
  1573. 0xc0, 0x09,
  1574. 0xc0, 0x13,
  1575. 0x00, 0x33,
  1576. 0xc0, 0x0a,
  1577. 0xc0, 0x14,
  1578. 0x00, 0x39,
  1579. 0x00, 0x2f,
  1580. 0x00, 0x35,
  1581. 0x00, 0x0a,
  1582. 0x01, 0x00, 0x00, 0x1f, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x17, 0x00,
  1583. 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00,
  1584. 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18,
  1585. };
  1586. if (!ClientHelloMatches(TLS1_VERSION, kTLS1ClientHello,
  1587. sizeof(kTLS1ClientHello))) {
  1588. return false;
  1589. }
  1590. static const uint8_t kTLS11ClientHello[] = {
  1591. 0x16,
  1592. 0x03, 0x01,
  1593. 0x00, 0x5e,
  1594. 0x01,
  1595. 0x00, 0x00, 0x5a,
  1596. 0x03, 0x02,
  1597. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1598. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1599. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1600. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1601. 0x00,
  1602. 0x00, 0x12,
  1603. 0xc0, 0x09,
  1604. 0xc0, 0x13,
  1605. 0x00, 0x33,
  1606. 0xc0, 0x0a,
  1607. 0xc0, 0x14,
  1608. 0x00, 0x39,
  1609. 0x00, 0x2f,
  1610. 0x00, 0x35,
  1611. 0x00, 0x0a,
  1612. 0x01, 0x00, 0x00, 0x1f, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x17, 0x00,
  1613. 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00,
  1614. 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18,
  1615. };
  1616. if (!ClientHelloMatches(TLS1_1_VERSION, kTLS11ClientHello,
  1617. sizeof(kTLS11ClientHello))) {
  1618. return false;
  1619. }
  1620. static const uint8_t kTLS12ClientHello[] = {
  1621. 0x16, 0x03, 0x01, 0x00, 0xa2, 0x01, 0x00, 0x00, 0x9e, 0x03, 0x03, 0x00,
  1622. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1623. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1624. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xcc, 0xa9,
  1625. 0xcc, 0xa8, 0xcc, 0x14, 0xcc, 0x13, 0xc0, 0x2b, 0xc0, 0x2f, 0x00, 0x9e,
  1626. 0xc0, 0x2c, 0xc0, 0x30, 0x00, 0x9f, 0xc0, 0x09, 0xc0, 0x23, 0xc0, 0x13,
  1627. 0xc0, 0x27, 0x00, 0x33, 0x00, 0x67, 0xc0, 0x0a, 0xc0, 0x24, 0xc0, 0x14,
  1628. 0xc0, 0x28, 0x00, 0x39, 0x00, 0x6b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x2f,
  1629. 0x00, 0x3c, 0x00, 0x35, 0x00, 0x3d, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x3b,
  1630. 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x23, 0x00,
  1631. 0x00, 0x00, 0x0d, 0x00, 0x18, 0x00, 0x16, 0x07, 0x02, 0x06, 0x01, 0x06,
  1632. 0x03, 0x07, 0x01, 0x05, 0x01, 0x05, 0x03, 0x07, 0x00, 0x04, 0x01, 0x04,
  1633. 0x03, 0x02, 0x01, 0x02, 0x03, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00,
  1634. 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18,
  1635. };
  1636. if (!ClientHelloMatches(TLS1_2_VERSION, kTLS12ClientHello,
  1637. sizeof(kTLS12ClientHello))) {
  1638. return false;
  1639. }
  1640. // TODO(davidben): Add a change detector for TLS 1.3 once the spec and our
  1641. // implementation has settled enough that it won't change.
  1642. return true;
  1643. }
  1644. static bssl::UniquePtr<SSL_SESSION> g_last_session;
  1645. static int SaveLastSession(SSL *ssl, SSL_SESSION *session) {
  1646. // Save the most recent session.
  1647. g_last_session.reset(session);
  1648. return 1;
  1649. }
  1650. static bssl::UniquePtr<SSL_SESSION> CreateClientSession(SSL_CTX *client_ctx,
  1651. SSL_CTX *server_ctx) {
  1652. g_last_session = nullptr;
  1653. SSL_CTX_sess_set_new_cb(client_ctx, SaveLastSession);
  1654. // Connect client and server to get a session.
  1655. bssl::UniquePtr<SSL> client, server;
  1656. if (!ConnectClientAndServer(&client, &server, client_ctx, server_ctx,
  1657. nullptr /* no session */)) {
  1658. fprintf(stderr, "Failed to connect client and server.\n");
  1659. return nullptr;
  1660. }
  1661. // Run the read loop to account for post-handshake tickets in TLS 1.3.
  1662. SSL_read(client.get(), nullptr, 0);
  1663. SSL_CTX_sess_set_new_cb(client_ctx, nullptr);
  1664. if (!g_last_session) {
  1665. fprintf(stderr, "Client did not receive a session.\n");
  1666. return nullptr;
  1667. }
  1668. return std::move(g_last_session);
  1669. }
  1670. static bool ExpectSessionReused(SSL_CTX *client_ctx, SSL_CTX *server_ctx,
  1671. SSL_SESSION *session,
  1672. bool reused) {
  1673. bssl::UniquePtr<SSL> client, server;
  1674. if (!ConnectClientAndServer(&client, &server, client_ctx,
  1675. server_ctx, session)) {
  1676. fprintf(stderr, "Failed to connect client and server.\n");
  1677. return false;
  1678. }
  1679. if (SSL_session_reused(client.get()) != SSL_session_reused(server.get())) {
  1680. fprintf(stderr, "Client and server were inconsistent.\n");
  1681. return false;
  1682. }
  1683. bool was_reused = !!SSL_session_reused(client.get());
  1684. if (was_reused != reused) {
  1685. fprintf(stderr, "Session was%s reused, but we expected the opposite.\n",
  1686. was_reused ? "" : " not");
  1687. return false;
  1688. }
  1689. return true;
  1690. }
  1691. static bool TestSessionIDContext() {
  1692. bssl::UniquePtr<X509> cert = GetTestCertificate();
  1693. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  1694. if (!cert || !key) {
  1695. return false;
  1696. }
  1697. static const uint8_t kContext1[] = {1};
  1698. static const uint8_t kContext2[] = {2};
  1699. for (uint16_t version : kVersions) {
  1700. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  1701. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  1702. if (!server_ctx || !client_ctx ||
  1703. !SSL_CTX_use_certificate(server_ctx.get(), cert.get()) ||
  1704. !SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()) ||
  1705. !SSL_CTX_set_session_id_context(server_ctx.get(), kContext1,
  1706. sizeof(kContext1))) {
  1707. return false;
  1708. }
  1709. SSL_CTX_set_min_version(client_ctx.get(), version);
  1710. SSL_CTX_set_max_version(client_ctx.get(), version);
  1711. SSL_CTX_set_session_cache_mode(client_ctx.get(), SSL_SESS_CACHE_BOTH);
  1712. SSL_CTX_set_min_version(server_ctx.get(), version);
  1713. SSL_CTX_set_max_version(server_ctx.get(), version);
  1714. SSL_CTX_set_session_cache_mode(server_ctx.get(), SSL_SESS_CACHE_BOTH);
  1715. bssl::UniquePtr<SSL_SESSION> session =
  1716. CreateClientSession(client_ctx.get(), server_ctx.get());
  1717. if (!session) {
  1718. fprintf(stderr, "Error getting session (version = %04x).\n", version);
  1719. return false;
  1720. }
  1721. if (!ExpectSessionReused(client_ctx.get(), server_ctx.get(), session.get(),
  1722. true /* expect session reused */)) {
  1723. fprintf(stderr, "Error resuming session (version = %04x).\n", version);
  1724. return false;
  1725. }
  1726. // Change the session ID context.
  1727. if (!SSL_CTX_set_session_id_context(server_ctx.get(), kContext2,
  1728. sizeof(kContext2))) {
  1729. return false;
  1730. }
  1731. if (!ExpectSessionReused(client_ctx.get(), server_ctx.get(), session.get(),
  1732. false /* expect session not reused */)) {
  1733. fprintf(stderr,
  1734. "Error connection with different context (version = %04x).\n",
  1735. version);
  1736. return false;
  1737. }
  1738. }
  1739. return true;
  1740. }
  1741. static timeval g_current_time;
  1742. static void CurrentTimeCallback(const SSL *ssl, timeval *out_clock) {
  1743. *out_clock = g_current_time;
  1744. }
  1745. static bool TestSessionTimeout() {
  1746. bssl::UniquePtr<X509> cert = GetTestCertificate();
  1747. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  1748. if (!cert || !key) {
  1749. return false;
  1750. }
  1751. for (uint16_t version : kVersions) {
  1752. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  1753. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  1754. if (!server_ctx || !client_ctx ||
  1755. !SSL_CTX_use_certificate(server_ctx.get(), cert.get()) ||
  1756. !SSL_CTX_use_PrivateKey(server_ctx.get(), key.get())) {
  1757. return false;
  1758. }
  1759. SSL_CTX_set_min_version(client_ctx.get(), version);
  1760. SSL_CTX_set_max_version(client_ctx.get(), version);
  1761. SSL_CTX_set_session_cache_mode(client_ctx.get(), SSL_SESS_CACHE_BOTH);
  1762. SSL_CTX_set_min_version(server_ctx.get(), version);
  1763. SSL_CTX_set_max_version(server_ctx.get(), version);
  1764. SSL_CTX_set_session_cache_mode(server_ctx.get(), SSL_SESS_CACHE_BOTH);
  1765. SSL_CTX_set_current_time_cb(server_ctx.get(), CurrentTimeCallback);
  1766. bssl::UniquePtr<SSL_SESSION> session =
  1767. CreateClientSession(client_ctx.get(), server_ctx.get());
  1768. if (!session) {
  1769. fprintf(stderr, "Error getting session (version = %04x).\n", version);
  1770. return false;
  1771. }
  1772. // Advance the clock just behind the timeout.
  1773. g_current_time.tv_sec += SSL_DEFAULT_SESSION_TIMEOUT;
  1774. if (!ExpectSessionReused(client_ctx.get(), server_ctx.get(), session.get(),
  1775. true /* expect session reused */)) {
  1776. fprintf(stderr, "Error resuming session (version = %04x).\n", version);
  1777. return false;
  1778. }
  1779. // Advance the clock one more second.
  1780. g_current_time.tv_sec++;
  1781. if (!ExpectSessionReused(client_ctx.get(), server_ctx.get(), session.get(),
  1782. false /* expect session not reused */)) {
  1783. fprintf(stderr, "Error resuming session (version = %04x).\n", version);
  1784. return false;
  1785. }
  1786. }
  1787. return true;
  1788. }
  1789. static int SwitchContext(SSL *ssl, int *out_alert, void *arg) {
  1790. SSL_CTX *ctx = reinterpret_cast<SSL_CTX*>(arg);
  1791. SSL_set_SSL_CTX(ssl, ctx);
  1792. return SSL_TLSEXT_ERR_OK;
  1793. }
  1794. static bool TestSNICallback() {
  1795. bssl::UniquePtr<X509> cert = GetTestCertificate();
  1796. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  1797. bssl::UniquePtr<X509> cert2 = GetECDSATestCertificate();
  1798. bssl::UniquePtr<EVP_PKEY> key2 = GetECDSATestKey();
  1799. if (!cert || !key || !cert2 || !key2) {
  1800. return false;
  1801. }
  1802. // At each version, test that switching the |SSL_CTX| at the SNI callback
  1803. // behaves correctly.
  1804. for (uint16_t version : kVersions) {
  1805. if (version == SSL3_VERSION) {
  1806. continue;
  1807. }
  1808. static const uint16_t kECDSAWithSHA256 = SSL_SIGN_ECDSA_SECP256R1_SHA256;
  1809. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  1810. bssl::UniquePtr<SSL_CTX> server_ctx2(SSL_CTX_new(TLS_method()));
  1811. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  1812. if (!server_ctx || !server_ctx2 || !client_ctx ||
  1813. !SSL_CTX_use_certificate(server_ctx.get(), cert.get()) ||
  1814. !SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()) ||
  1815. !SSL_CTX_use_certificate(server_ctx2.get(), cert2.get()) ||
  1816. !SSL_CTX_use_PrivateKey(server_ctx2.get(), key2.get()) ||
  1817. // Historically signing preferences would be lost in some cases with the
  1818. // SNI callback, which triggers the TLS 1.2 SHA-1 default. To ensure
  1819. // this doesn't happen when |version| is TLS 1.2, configure the private
  1820. // key to only sign SHA-256.
  1821. !SSL_CTX_set_signing_algorithm_prefs(server_ctx2.get(),
  1822. &kECDSAWithSHA256, 1)) {
  1823. return false;
  1824. }
  1825. SSL_CTX_set_min_version(client_ctx.get(), version);
  1826. SSL_CTX_set_max_version(client_ctx.get(), version);
  1827. SSL_CTX_set_min_version(server_ctx.get(), version);
  1828. SSL_CTX_set_max_version(server_ctx.get(), version);
  1829. SSL_CTX_set_min_version(server_ctx2.get(), version);
  1830. SSL_CTX_set_max_version(server_ctx2.get(), version);
  1831. SSL_CTX_set_tlsext_servername_callback(server_ctx.get(), SwitchContext);
  1832. SSL_CTX_set_tlsext_servername_arg(server_ctx.get(), server_ctx2.get());
  1833. bssl::UniquePtr<SSL> client, server;
  1834. if (!ConnectClientAndServer(&client, &server, client_ctx.get(),
  1835. server_ctx.get(), nullptr)) {
  1836. fprintf(stderr, "Handshake failed at version %04x.\n", version);
  1837. return false;
  1838. }
  1839. // The client should have received |cert2|.
  1840. bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(client.get()));
  1841. if (!peer ||
  1842. X509_cmp(peer.get(), cert2.get()) != 0) {
  1843. fprintf(stderr, "Incorrect certificate received at version %04x.\n",
  1844. version);
  1845. return false;
  1846. }
  1847. }
  1848. return true;
  1849. }
  1850. static int SetMaxVersion(const struct ssl_early_callback_ctx *ctx) {
  1851. SSL_set_max_version(ctx->ssl, TLS1_2_VERSION);
  1852. return 1;
  1853. }
  1854. // TestEarlyCallbackVersionSwitch tests that the early callback can swap the
  1855. // maximum version.
  1856. static bool TestEarlyCallbackVersionSwitch() {
  1857. bssl::UniquePtr<X509> cert = GetTestCertificate();
  1858. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  1859. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  1860. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  1861. if (!cert || !key || !server_ctx || !client_ctx ||
  1862. !SSL_CTX_use_certificate(server_ctx.get(), cert.get()) ||
  1863. !SSL_CTX_use_PrivateKey(server_ctx.get(), key.get())) {
  1864. return false;
  1865. }
  1866. SSL_CTX_set_max_version(client_ctx.get(), TLS1_3_VERSION);
  1867. SSL_CTX_set_max_version(server_ctx.get(), TLS1_3_VERSION);
  1868. SSL_CTX_set_select_certificate_cb(server_ctx.get(), SetMaxVersion);
  1869. bssl::UniquePtr<SSL> client, server;
  1870. if (!ConnectClientAndServer(&client, &server, client_ctx.get(),
  1871. server_ctx.get(), nullptr)) {
  1872. return false;
  1873. }
  1874. if (SSL_version(client.get()) != TLS1_2_VERSION) {
  1875. fprintf(stderr, "Early callback failed to switch the maximum version.\n");
  1876. return false;
  1877. }
  1878. return true;
  1879. }
  1880. int main() {
  1881. CRYPTO_library_init();
  1882. if (!TestCipherRules() ||
  1883. !TestSSL_SESSIONEncoding(kOpenSSLSession) ||
  1884. !TestSSL_SESSIONEncoding(kCustomSession) ||
  1885. !TestSSL_SESSIONEncoding(kBoringSSLSession) ||
  1886. !TestBadSSL_SESSIONEncoding(kBadSessionExtraField) ||
  1887. !TestBadSSL_SESSIONEncoding(kBadSessionVersion) ||
  1888. !TestBadSSL_SESSIONEncoding(kBadSessionTrailingData) ||
  1889. // TODO(svaldez): Update this when TLS 1.3 is enabled by default.
  1890. !TestDefaultVersion(SSL3_VERSION, TLS1_2_VERSION, &TLS_method) ||
  1891. !TestDefaultVersion(SSL3_VERSION, SSL3_VERSION, &SSLv3_method) ||
  1892. !TestDefaultVersion(TLS1_VERSION, TLS1_VERSION, &TLSv1_method) ||
  1893. !TestDefaultVersion(TLS1_1_VERSION, TLS1_1_VERSION, &TLSv1_1_method) ||
  1894. !TestDefaultVersion(TLS1_2_VERSION, TLS1_2_VERSION, &TLSv1_2_method) ||
  1895. !TestDefaultVersion(TLS1_1_VERSION, TLS1_2_VERSION, &DTLS_method) ||
  1896. !TestDefaultVersion(TLS1_1_VERSION, TLS1_1_VERSION, &DTLSv1_method) ||
  1897. !TestDefaultVersion(TLS1_2_VERSION, TLS1_2_VERSION, &DTLSv1_2_method) ||
  1898. !TestCipherGetRFCName() ||
  1899. !TestPaddingExtension() ||
  1900. !TestClientCAList() ||
  1901. !TestInternalSessionCache() ||
  1902. !TestSequenceNumber(false /* TLS */) ||
  1903. !TestSequenceNumber(true /* DTLS */) ||
  1904. !TestOneSidedShutdown() ||
  1905. !TestSessionDuplication() ||
  1906. !TestSetFD() ||
  1907. !TestSetBIO() ||
  1908. !TestGetPeerCertificate() ||
  1909. !TestRetainOnlySHA256OfCerts() ||
  1910. !TestClientHello() ||
  1911. !TestSessionIDContext() ||
  1912. !TestSessionTimeout() ||
  1913. !TestSNICallback() ||
  1914. !TestEarlyCallbackVersionSwitch()) {
  1915. ERR_print_errors_fp(stderr);
  1916. return 1;
  1917. }
  1918. printf("PASS\n");
  1919. return 0;
  1920. }