Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

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