tls13_both.cc 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. /* Copyright (c) 2016, 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 <openssl/ssl.h>
  15. #include <assert.h>
  16. #include <string.h>
  17. #include <utility>
  18. #include <openssl/bytestring.h>
  19. #include <openssl/err.h>
  20. #include <openssl/hkdf.h>
  21. #include <openssl/mem.h>
  22. #include <openssl/stack.h>
  23. #include <openssl/x509.h>
  24. #include "../crypto/internal.h"
  25. #include "internal.h"
  26. BSSL_NAMESPACE_BEGIN
  27. // kMaxKeyUpdates is the number of consecutive KeyUpdates that will be
  28. // processed. Without this limit an attacker could force unbounded processing
  29. // without being able to return application data.
  30. static const uint8_t kMaxKeyUpdates = 32;
  31. const uint8_t kHelloRetryRequest[SSL3_RANDOM_SIZE] = {
  32. 0xcf, 0x21, 0xad, 0x74, 0xe5, 0x9a, 0x61, 0x11, 0xbe, 0x1d, 0x8c,
  33. 0x02, 0x1e, 0x65, 0xb8, 0x91, 0xc2, 0xa2, 0x11, 0x16, 0x7a, 0xbb,
  34. 0x8c, 0x5e, 0x07, 0x9e, 0x09, 0xe2, 0xc8, 0xa8, 0x33, 0x9c,
  35. };
  36. // See RFC 8446, section 4.1.3.
  37. const uint8_t kTLS12DowngradeRandom[8] = {0x44, 0x4f, 0x57, 0x4e,
  38. 0x47, 0x52, 0x44, 0x00};
  39. const uint8_t kTLS13DowngradeRandom[8] = {0x44, 0x4f, 0x57, 0x4e,
  40. 0x47, 0x52, 0x44, 0x01};
  41. // This is a non-standard randomly-generated value.
  42. const uint8_t kJDK11DowngradeRandom[8] = {0xed, 0xbf, 0xb4, 0xa8,
  43. 0xc2, 0x47, 0x10, 0xff};
  44. bool tls13_get_cert_verify_signature_input(
  45. SSL_HANDSHAKE *hs, Array<uint8_t> *out,
  46. enum ssl_cert_verify_context_t cert_verify_context) {
  47. ScopedCBB cbb;
  48. if (!CBB_init(cbb.get(), 64 + 33 + 1 + 2 * EVP_MAX_MD_SIZE)) {
  49. OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
  50. return false;
  51. }
  52. for (size_t i = 0; i < 64; i++) {
  53. if (!CBB_add_u8(cbb.get(), 0x20)) {
  54. OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
  55. return false;
  56. }
  57. }
  58. Span<const char> context;
  59. if (cert_verify_context == ssl_cert_verify_server) {
  60. static const char kContext[] = "TLS 1.3, server CertificateVerify";
  61. context = kContext;
  62. } else if (cert_verify_context == ssl_cert_verify_client) {
  63. static const char kContext[] = "TLS 1.3, client CertificateVerify";
  64. context = kContext;
  65. } else if (cert_verify_context == ssl_cert_verify_channel_id) {
  66. static const char kContext[] = "TLS 1.3, Channel ID";
  67. context = kContext;
  68. } else {
  69. OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
  70. return false;
  71. }
  72. // Note |context| includes the NUL byte separator.
  73. if (!CBB_add_bytes(cbb.get(),
  74. reinterpret_cast<const uint8_t *>(context.data()),
  75. context.size())) {
  76. OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
  77. return false;
  78. }
  79. uint8_t context_hash[EVP_MAX_MD_SIZE];
  80. size_t context_hash_len;
  81. if (!hs->transcript.GetHash(context_hash, &context_hash_len) ||
  82. !CBB_add_bytes(cbb.get(), context_hash, context_hash_len) ||
  83. !CBBFinishArray(cbb.get(), out)) {
  84. OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
  85. return false;
  86. }
  87. return true;
  88. }
  89. bool tls13_process_certificate(SSL_HANDSHAKE *hs, const SSLMessage &msg,
  90. bool allow_anonymous) {
  91. SSL *const ssl = hs->ssl;
  92. CBS body = msg.body;
  93. bssl::UniquePtr<CRYPTO_BUFFER> decompressed;
  94. if (msg.type == SSL3_MT_COMPRESSED_CERTIFICATE) {
  95. CBS compressed;
  96. uint16_t alg_id;
  97. uint32_t uncompressed_len;
  98. if (!CBS_get_u16(&body, &alg_id) ||
  99. !CBS_get_u24(&body, &uncompressed_len) ||
  100. !CBS_get_u24_length_prefixed(&body, &compressed) ||
  101. CBS_len(&body) != 0) {
  102. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  103. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  104. return false;
  105. }
  106. if (uncompressed_len > ssl->max_cert_list) {
  107. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
  108. OPENSSL_PUT_ERROR(SSL, SSL_R_UNCOMPRESSED_CERT_TOO_LARGE);
  109. ERR_add_error_dataf("requested=%u",
  110. static_cast<unsigned>(uncompressed_len));
  111. return false;
  112. }
  113. ssl_cert_decompression_func_t decompress = nullptr;
  114. for (const auto* alg : ssl->ctx->cert_compression_algs.get()) {
  115. if (alg->alg_id == alg_id) {
  116. decompress = alg->decompress;
  117. break;
  118. }
  119. }
  120. if (decompress == nullptr) {
  121. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
  122. OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CERT_COMPRESSION_ALG);
  123. ERR_add_error_dataf("alg=%d", static_cast<int>(alg_id));
  124. return false;
  125. }
  126. CRYPTO_BUFFER *decompressed_ptr = nullptr;
  127. if (!decompress(ssl, &decompressed_ptr, uncompressed_len,
  128. CBS_data(&compressed), CBS_len(&compressed))) {
  129. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  130. OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_DECOMPRESSION_FAILED);
  131. ERR_add_error_dataf("alg=%d", static_cast<int>(alg_id));
  132. return false;
  133. }
  134. decompressed.reset(decompressed_ptr);
  135. if (CRYPTO_BUFFER_len(decompressed_ptr) != uncompressed_len) {
  136. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  137. OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_DECOMPRESSION_FAILED);
  138. ERR_add_error_dataf(
  139. "alg=%d got=%u expected=%u", static_cast<int>(alg_id),
  140. static_cast<unsigned>(CRYPTO_BUFFER_len(decompressed_ptr)),
  141. static_cast<unsigned>(uncompressed_len));
  142. return false;
  143. }
  144. CBS_init(&body, CRYPTO_BUFFER_data(decompressed_ptr),
  145. CRYPTO_BUFFER_len(decompressed_ptr));
  146. } else {
  147. assert(msg.type == SSL3_MT_CERTIFICATE);
  148. }
  149. CBS context, certificate_list;
  150. if (!CBS_get_u8_length_prefixed(&body, &context) ||
  151. CBS_len(&context) != 0 ||
  152. !CBS_get_u24_length_prefixed(&body, &certificate_list) ||
  153. CBS_len(&body) != 0) {
  154. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  155. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  156. return false;
  157. }
  158. UniquePtr<STACK_OF(CRYPTO_BUFFER)> certs(sk_CRYPTO_BUFFER_new_null());
  159. if (!certs) {
  160. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  161. OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
  162. return false;
  163. }
  164. const bool retain_sha256 =
  165. ssl->server && hs->config->retain_only_sha256_of_client_certs;
  166. UniquePtr<EVP_PKEY> pkey;
  167. while (CBS_len(&certificate_list) > 0) {
  168. CBS certificate, extensions;
  169. if (!CBS_get_u24_length_prefixed(&certificate_list, &certificate) ||
  170. !CBS_get_u16_length_prefixed(&certificate_list, &extensions) ||
  171. CBS_len(&certificate) == 0) {
  172. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  173. OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_LENGTH_MISMATCH);
  174. return false;
  175. }
  176. if (sk_CRYPTO_BUFFER_num(certs.get()) == 0) {
  177. pkey = ssl_cert_parse_pubkey(&certificate);
  178. if (!pkey) {
  179. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  180. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  181. return false;
  182. }
  183. // TLS 1.3 always uses certificate keys for signing thus the correct
  184. // keyUsage is enforced.
  185. if (!ssl_cert_check_key_usage(&certificate,
  186. key_usage_digital_signature)) {
  187. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
  188. return false;
  189. }
  190. if (retain_sha256) {
  191. // Retain the hash of the leaf certificate if requested.
  192. SHA256(CBS_data(&certificate), CBS_len(&certificate),
  193. hs->new_session->peer_sha256);
  194. }
  195. }
  196. UniquePtr<CRYPTO_BUFFER> buf(
  197. CRYPTO_BUFFER_new_from_CBS(&certificate, ssl->ctx->pool));
  198. if (!buf ||
  199. !PushToStack(certs.get(), std::move(buf))) {
  200. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  201. OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
  202. return false;
  203. }
  204. // Parse out the extensions.
  205. bool have_status_request = false, have_sct = false;
  206. CBS status_request, sct;
  207. const SSL_EXTENSION_TYPE ext_types[] = {
  208. {TLSEXT_TYPE_status_request, &have_status_request, &status_request},
  209. {TLSEXT_TYPE_certificate_timestamp, &have_sct, &sct},
  210. };
  211. uint8_t alert = SSL_AD_DECODE_ERROR;
  212. if (!ssl_parse_extensions(&extensions, &alert, ext_types,
  213. OPENSSL_ARRAY_SIZE(ext_types),
  214. 0 /* reject unknown */)) {
  215. ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
  216. return false;
  217. }
  218. // All Certificate extensions are parsed, but only the leaf extensions are
  219. // stored.
  220. if (have_status_request) {
  221. if (ssl->server || !hs->config->ocsp_stapling_enabled) {
  222. OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);
  223. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNSUPPORTED_EXTENSION);
  224. return false;
  225. }
  226. uint8_t status_type;
  227. CBS ocsp_response;
  228. if (!CBS_get_u8(&status_request, &status_type) ||
  229. status_type != TLSEXT_STATUSTYPE_ocsp ||
  230. !CBS_get_u24_length_prefixed(&status_request, &ocsp_response) ||
  231. CBS_len(&ocsp_response) == 0 ||
  232. CBS_len(&status_request) != 0) {
  233. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  234. return false;
  235. }
  236. if (sk_CRYPTO_BUFFER_num(certs.get()) == 1) {
  237. hs->new_session->ocsp_response.reset(
  238. CRYPTO_BUFFER_new_from_CBS(&ocsp_response, ssl->ctx->pool));
  239. if (hs->new_session->ocsp_response == nullptr) {
  240. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  241. return false;
  242. }
  243. }
  244. }
  245. if (have_sct) {
  246. if (ssl->server || !hs->config->signed_cert_timestamps_enabled) {
  247. OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);
  248. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNSUPPORTED_EXTENSION);
  249. return false;
  250. }
  251. if (!ssl_is_sct_list_valid(&sct)) {
  252. OPENSSL_PUT_ERROR(SSL, SSL_R_ERROR_PARSING_EXTENSION);
  253. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  254. return false;
  255. }
  256. if (sk_CRYPTO_BUFFER_num(certs.get()) == 1) {
  257. hs->new_session->signed_cert_timestamp_list.reset(
  258. CRYPTO_BUFFER_new_from_CBS(&sct, ssl->ctx->pool));
  259. if (hs->new_session->signed_cert_timestamp_list == nullptr) {
  260. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  261. return false;
  262. }
  263. }
  264. }
  265. }
  266. // Store a null certificate list rather than an empty one if the peer didn't
  267. // send certificates.
  268. if (sk_CRYPTO_BUFFER_num(certs.get()) == 0) {
  269. certs.reset();
  270. }
  271. hs->peer_pubkey = std::move(pkey);
  272. hs->new_session->certs = std::move(certs);
  273. if (!ssl->ctx->x509_method->session_cache_objects(hs->new_session.get())) {
  274. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  275. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  276. return false;
  277. }
  278. if (sk_CRYPTO_BUFFER_num(hs->new_session->certs.get()) == 0) {
  279. if (!allow_anonymous) {
  280. OPENSSL_PUT_ERROR(SSL, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
  281. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_CERTIFICATE_REQUIRED);
  282. return false;
  283. }
  284. // OpenSSL returns X509_V_OK when no certificates are requested. This is
  285. // classed by them as a bug, but it's assumed by at least NGINX.
  286. hs->new_session->verify_result = X509_V_OK;
  287. // No certificate, so nothing more to do.
  288. return true;
  289. }
  290. hs->new_session->peer_sha256_valid = retain_sha256;
  291. return true;
  292. }
  293. bool tls13_process_certificate_verify(SSL_HANDSHAKE *hs, const SSLMessage &msg) {
  294. SSL *const ssl = hs->ssl;
  295. if (hs->peer_pubkey == NULL) {
  296. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  297. return false;
  298. }
  299. CBS body = msg.body, signature;
  300. uint16_t signature_algorithm;
  301. if (!CBS_get_u16(&body, &signature_algorithm) ||
  302. !CBS_get_u16_length_prefixed(&body, &signature) ||
  303. CBS_len(&body) != 0) {
  304. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  305. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  306. return false;
  307. }
  308. uint8_t alert = SSL_AD_DECODE_ERROR;
  309. if (!tls12_check_peer_sigalg(ssl, &alert, signature_algorithm)) {
  310. ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
  311. return false;
  312. }
  313. hs->new_session->peer_signature_algorithm = signature_algorithm;
  314. Array<uint8_t> input;
  315. if (!tls13_get_cert_verify_signature_input(
  316. hs, &input,
  317. ssl->server ? ssl_cert_verify_client : ssl_cert_verify_server)) {
  318. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  319. return false;
  320. }
  321. if (!ssl_public_key_verify(ssl, signature, signature_algorithm,
  322. hs->peer_pubkey.get(), input)) {
  323. OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_SIGNATURE);
  324. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECRYPT_ERROR);
  325. return false;
  326. }
  327. return true;
  328. }
  329. bool tls13_process_finished(SSL_HANDSHAKE *hs, const SSLMessage &msg,
  330. bool use_saved_value) {
  331. SSL *const ssl = hs->ssl;
  332. uint8_t verify_data_buf[EVP_MAX_MD_SIZE];
  333. Span<const uint8_t> verify_data;
  334. if (use_saved_value) {
  335. assert(ssl->server);
  336. verify_data = hs->expected_client_finished();
  337. } else {
  338. size_t len;
  339. if (!tls13_finished_mac(hs, verify_data_buf, &len, !ssl->server)) {
  340. return false;
  341. }
  342. verify_data = MakeConstSpan(verify_data_buf, len);
  343. }
  344. bool finished_ok =
  345. CBS_mem_equal(&msg.body, verify_data.data(), verify_data.size());
  346. #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
  347. finished_ok = true;
  348. #endif
  349. if (!finished_ok) {
  350. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECRYPT_ERROR);
  351. OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
  352. return false;
  353. }
  354. return true;
  355. }
  356. bool tls13_add_certificate(SSL_HANDSHAKE *hs) {
  357. SSL *const ssl = hs->ssl;
  358. CERT *const cert = hs->config->cert.get();
  359. DC *const dc = cert->dc.get();
  360. ScopedCBB cbb;
  361. CBB *body, body_storage, certificate_list;
  362. if (hs->cert_compression_negotiated) {
  363. if (!CBB_init(cbb.get(), 1024)) {
  364. return false;
  365. }
  366. body = cbb.get();
  367. } else {
  368. body = &body_storage;
  369. if (!ssl->method->init_message(ssl, cbb.get(), body, SSL3_MT_CERTIFICATE)) {
  370. return false;
  371. }
  372. }
  373. if (// The request context is always empty in the handshake.
  374. !CBB_add_u8(body, 0) ||
  375. !CBB_add_u24_length_prefixed(body, &certificate_list)) {
  376. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  377. return false;
  378. }
  379. if (!ssl_has_certificate(hs)) {
  380. return ssl_add_message_cbb(ssl, cbb.get());
  381. }
  382. CRYPTO_BUFFER *leaf_buf = sk_CRYPTO_BUFFER_value(cert->chain.get(), 0);
  383. CBB leaf, extensions;
  384. if (!CBB_add_u24_length_prefixed(&certificate_list, &leaf) ||
  385. !CBB_add_bytes(&leaf, CRYPTO_BUFFER_data(leaf_buf),
  386. CRYPTO_BUFFER_len(leaf_buf)) ||
  387. !CBB_add_u16_length_prefixed(&certificate_list, &extensions)) {
  388. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  389. return false;
  390. }
  391. if (hs->scts_requested && cert->signed_cert_timestamp_list != nullptr) {
  392. CBB contents;
  393. if (!CBB_add_u16(&extensions, TLSEXT_TYPE_certificate_timestamp) ||
  394. !CBB_add_u16_length_prefixed(&extensions, &contents) ||
  395. !CBB_add_bytes(
  396. &contents,
  397. CRYPTO_BUFFER_data(cert->signed_cert_timestamp_list.get()),
  398. CRYPTO_BUFFER_len(cert->signed_cert_timestamp_list.get())) ||
  399. !CBB_flush(&extensions)) {
  400. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  401. return false;
  402. }
  403. }
  404. if (hs->ocsp_stapling_requested && cert->ocsp_response != NULL) {
  405. CBB contents, ocsp_response;
  406. if (!CBB_add_u16(&extensions, TLSEXT_TYPE_status_request) ||
  407. !CBB_add_u16_length_prefixed(&extensions, &contents) ||
  408. !CBB_add_u8(&contents, TLSEXT_STATUSTYPE_ocsp) ||
  409. !CBB_add_u24_length_prefixed(&contents, &ocsp_response) ||
  410. !CBB_add_bytes(&ocsp_response,
  411. CRYPTO_BUFFER_data(cert->ocsp_response.get()),
  412. CRYPTO_BUFFER_len(cert->ocsp_response.get())) ||
  413. !CBB_flush(&extensions)) {
  414. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  415. return false;
  416. }
  417. }
  418. if (ssl_signing_with_dc(hs)) {
  419. const CRYPTO_BUFFER *raw = dc->raw.get();
  420. CBB child;
  421. if (!CBB_add_u16(&extensions, TLSEXT_TYPE_delegated_credential) ||
  422. !CBB_add_u16_length_prefixed(&extensions, &child) ||
  423. !CBB_add_bytes(&child, CRYPTO_BUFFER_data(raw),
  424. CRYPTO_BUFFER_len(raw)) ||
  425. !CBB_flush(&extensions)) {
  426. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  427. return 0;
  428. }
  429. ssl->s3->delegated_credential_used = true;
  430. }
  431. for (size_t i = 1; i < sk_CRYPTO_BUFFER_num(cert->chain.get()); i++) {
  432. CRYPTO_BUFFER *cert_buf = sk_CRYPTO_BUFFER_value(cert->chain.get(), i);
  433. CBB child;
  434. if (!CBB_add_u24_length_prefixed(&certificate_list, &child) ||
  435. !CBB_add_bytes(&child, CRYPTO_BUFFER_data(cert_buf),
  436. CRYPTO_BUFFER_len(cert_buf)) ||
  437. !CBB_add_u16(&certificate_list, 0 /* no extensions */)) {
  438. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  439. return false;
  440. }
  441. }
  442. if (!hs->cert_compression_negotiated) {
  443. return ssl_add_message_cbb(ssl, cbb.get());
  444. }
  445. Array<uint8_t> msg;
  446. if (!CBBFinishArray(cbb.get(), &msg)) {
  447. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  448. return false;
  449. }
  450. const CertCompressionAlg *alg = nullptr;
  451. for (const auto *candidate : ssl->ctx->cert_compression_algs.get()) {
  452. if (candidate->alg_id == hs->cert_compression_alg_id) {
  453. alg = candidate;
  454. break;
  455. }
  456. }
  457. if (alg == nullptr || alg->compress == nullptr) {
  458. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  459. return false;
  460. }
  461. CBB compressed;
  462. body = &body_storage;
  463. if (!ssl->method->init_message(ssl, cbb.get(), body,
  464. SSL3_MT_COMPRESSED_CERTIFICATE) ||
  465. !CBB_add_u16(body, hs->cert_compression_alg_id) ||
  466. !CBB_add_u24(body, msg.size()) ||
  467. !CBB_add_u24_length_prefixed(body, &compressed) ||
  468. !alg->compress(ssl, &compressed, msg.data(), msg.size()) ||
  469. !ssl_add_message_cbb(ssl, cbb.get())) {
  470. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  471. return false;
  472. }
  473. return true;
  474. }
  475. enum ssl_private_key_result_t tls13_add_certificate_verify(SSL_HANDSHAKE *hs) {
  476. SSL *const ssl = hs->ssl;
  477. uint16_t signature_algorithm;
  478. if (!tls1_choose_signature_algorithm(hs, &signature_algorithm)) {
  479. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
  480. return ssl_private_key_failure;
  481. }
  482. ScopedCBB cbb;
  483. CBB body;
  484. if (!ssl->method->init_message(ssl, cbb.get(), &body,
  485. SSL3_MT_CERTIFICATE_VERIFY) ||
  486. !CBB_add_u16(&body, signature_algorithm)) {
  487. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  488. return ssl_private_key_failure;
  489. }
  490. // Sign the digest.
  491. CBB child;
  492. const size_t max_sig_len = EVP_PKEY_size(hs->local_pubkey.get());
  493. uint8_t *sig;
  494. size_t sig_len;
  495. if (!CBB_add_u16_length_prefixed(&body, &child) ||
  496. !CBB_reserve(&child, &sig, max_sig_len)) {
  497. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  498. return ssl_private_key_failure;
  499. }
  500. Array<uint8_t> msg;
  501. if (!tls13_get_cert_verify_signature_input(
  502. hs, &msg,
  503. ssl->server ? ssl_cert_verify_server : ssl_cert_verify_client)) {
  504. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  505. return ssl_private_key_failure;
  506. }
  507. enum ssl_private_key_result_t sign_result = ssl_private_key_sign(
  508. hs, sig, &sig_len, max_sig_len, signature_algorithm, msg);
  509. if (sign_result != ssl_private_key_success) {
  510. return sign_result;
  511. }
  512. if (!CBB_did_write(&child, sig_len) ||
  513. !ssl_add_message_cbb(ssl, cbb.get())) {
  514. return ssl_private_key_failure;
  515. }
  516. return ssl_private_key_success;
  517. }
  518. bool tls13_add_finished(SSL_HANDSHAKE *hs) {
  519. SSL *const ssl = hs->ssl;
  520. size_t verify_data_len;
  521. uint8_t verify_data[EVP_MAX_MD_SIZE];
  522. if (!tls13_finished_mac(hs, verify_data, &verify_data_len, ssl->server)) {
  523. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  524. OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
  525. return false;
  526. }
  527. ScopedCBB cbb;
  528. CBB body;
  529. if (!ssl->method->init_message(ssl, cbb.get(), &body, SSL3_MT_FINISHED) ||
  530. !CBB_add_bytes(&body, verify_data, verify_data_len) ||
  531. !ssl_add_message_cbb(ssl, cbb.get())) {
  532. return false;
  533. }
  534. return true;
  535. }
  536. bool tls13_add_key_update(SSL *ssl, int update_requested) {
  537. ScopedCBB cbb;
  538. CBB body_cbb;
  539. if (!ssl->method->init_message(ssl, cbb.get(), &body_cbb,
  540. SSL3_MT_KEY_UPDATE) ||
  541. !CBB_add_u8(&body_cbb, update_requested) ||
  542. !ssl_add_message_cbb(ssl, cbb.get()) ||
  543. !tls13_rotate_traffic_key(ssl, evp_aead_seal)) {
  544. return false;
  545. }
  546. // Suppress KeyUpdate acknowledgments until this change is written to the
  547. // wire. This prevents us from accumulating write obligations when read and
  548. // write progress at different rates. See RFC 8446, section 4.6.3.
  549. ssl->s3->key_update_pending = true;
  550. return true;
  551. }
  552. static bool tls13_receive_key_update(SSL *ssl, const SSLMessage &msg) {
  553. CBS body = msg.body;
  554. uint8_t key_update_request;
  555. if (!CBS_get_u8(&body, &key_update_request) ||
  556. CBS_len(&body) != 0 ||
  557. (key_update_request != SSL_KEY_UPDATE_NOT_REQUESTED &&
  558. key_update_request != SSL_KEY_UPDATE_REQUESTED)) {
  559. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  560. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  561. return false;
  562. }
  563. if (!tls13_rotate_traffic_key(ssl, evp_aead_open)) {
  564. return false;
  565. }
  566. // Acknowledge the KeyUpdate
  567. if (key_update_request == SSL_KEY_UPDATE_REQUESTED &&
  568. !ssl->s3->key_update_pending &&
  569. !tls13_add_key_update(ssl, SSL_KEY_UPDATE_NOT_REQUESTED)) {
  570. return false;
  571. }
  572. return true;
  573. }
  574. bool tls13_post_handshake(SSL *ssl, const SSLMessage &msg) {
  575. if (msg.type == SSL3_MT_KEY_UPDATE) {
  576. ssl->s3->key_update_count++;
  577. if (ssl->quic_method != nullptr ||
  578. ssl->s3->key_update_count > kMaxKeyUpdates) {
  579. OPENSSL_PUT_ERROR(SSL, SSL_R_TOO_MANY_KEY_UPDATES);
  580. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
  581. return false;
  582. }
  583. return tls13_receive_key_update(ssl, msg);
  584. }
  585. ssl->s3->key_update_count = 0;
  586. if (msg.type == SSL3_MT_NEW_SESSION_TICKET && !ssl->server) {
  587. return tls13_process_new_session_ticket(ssl, msg);
  588. }
  589. ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
  590. OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
  591. return false;
  592. }
  593. BSSL_NAMESPACE_END