tls13_enc.cc 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  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 <algorithm>
  18. #include <utility>
  19. #include <openssl/aead.h>
  20. #include <openssl/bytestring.h>
  21. #include <openssl/digest.h>
  22. #include <openssl/hkdf.h>
  23. #include <openssl/hmac.h>
  24. #include <openssl/mem.h>
  25. #include "../crypto/internal.h"
  26. #include "internal.h"
  27. BSSL_NAMESPACE_BEGIN
  28. static bool init_key_schedule(SSL_HANDSHAKE *hs, uint16_t version,
  29. const SSL_CIPHER *cipher) {
  30. if (!hs->transcript.InitHash(version, cipher)) {
  31. return false;
  32. }
  33. // Initialize the secret to the zero key.
  34. hs->ResizeSecrets(hs->transcript.DigestLen());
  35. OPENSSL_memset(hs->secret().data(), 0, hs->secret().size());
  36. return true;
  37. }
  38. static bool hkdf_extract_to_secret(SSL_HANDSHAKE *hs, Span<const uint8_t> in) {
  39. size_t len;
  40. if (!HKDF_extract(hs->secret().data(), &len, hs->transcript.Digest(),
  41. in.data(), in.size(), hs->secret().data(),
  42. hs->secret().size())) {
  43. return false;
  44. }
  45. assert(len == hs->secret().size());
  46. return true;
  47. }
  48. bool tls13_init_key_schedule(SSL_HANDSHAKE *hs, Span<const uint8_t> psk) {
  49. if (!init_key_schedule(hs, ssl_protocol_version(hs->ssl), hs->new_cipher)) {
  50. return false;
  51. }
  52. hs->transcript.FreeBuffer();
  53. return hkdf_extract_to_secret(hs, psk);
  54. }
  55. bool tls13_init_early_key_schedule(SSL_HANDSHAKE *hs, Span<const uint8_t> psk) {
  56. SSL *const ssl = hs->ssl;
  57. return init_key_schedule(hs, ssl_session_protocol_version(ssl->session.get()),
  58. ssl->session->cipher) &&
  59. hkdf_extract_to_secret(hs, psk);
  60. }
  61. static Span<const char> label_to_span(const char *label) {
  62. return MakeConstSpan(label, strlen(label));
  63. }
  64. static bool hkdf_expand_label(Span<uint8_t> out, const EVP_MD *digest,
  65. Span<const uint8_t> secret,
  66. Span<const char> label,
  67. Span<const uint8_t> hash) {
  68. Span<const char> protocol_label = label_to_span("tls13 ");
  69. ScopedCBB cbb;
  70. CBB child;
  71. Array<uint8_t> hkdf_label;
  72. if (!CBB_init(cbb.get(), 2 + 1 + protocol_label.size() + label.size() + 1 +
  73. hash.size()) ||
  74. !CBB_add_u16(cbb.get(), out.size()) ||
  75. !CBB_add_u8_length_prefixed(cbb.get(), &child) ||
  76. !CBB_add_bytes(&child,
  77. reinterpret_cast<const uint8_t *>(protocol_label.data()),
  78. protocol_label.size()) ||
  79. !CBB_add_bytes(&child, reinterpret_cast<const uint8_t *>(label.data()),
  80. label.size()) ||
  81. !CBB_add_u8_length_prefixed(cbb.get(), &child) ||
  82. !CBB_add_bytes(&child, hash.data(), hash.size()) ||
  83. !CBBFinishArray(cbb.get(), &hkdf_label)) {
  84. return false;
  85. }
  86. return HKDF_expand(out.data(), out.size(), digest, secret.data(),
  87. secret.size(), hkdf_label.data(), hkdf_label.size());
  88. }
  89. static const char kTLS13LabelDerived[] = "derived";
  90. bool tls13_advance_key_schedule(SSL_HANDSHAKE *hs, Span<const uint8_t> in) {
  91. uint8_t derive_context[EVP_MAX_MD_SIZE];
  92. unsigned derive_context_len;
  93. return EVP_Digest(nullptr, 0, derive_context, &derive_context_len,
  94. hs->transcript.Digest(), nullptr) &&
  95. hkdf_expand_label(hs->secret(), hs->transcript.Digest(), hs->secret(),
  96. label_to_span(kTLS13LabelDerived),
  97. MakeConstSpan(derive_context, derive_context_len)) &&
  98. hkdf_extract_to_secret(hs, in);
  99. }
  100. // derive_secret derives a secret of length |out.size()| and writes the result
  101. // in |out| with the given label, the current base secret, and the most
  102. // recently-saved handshake context. It returns true on success and false on
  103. // error.
  104. static bool derive_secret(SSL_HANDSHAKE *hs, Span<uint8_t> out,
  105. Span<const char> label) {
  106. uint8_t context_hash[EVP_MAX_MD_SIZE];
  107. size_t context_hash_len;
  108. if (!hs->transcript.GetHash(context_hash, &context_hash_len)) {
  109. return false;
  110. }
  111. return hkdf_expand_label(out, hs->transcript.Digest(), hs->secret(), label,
  112. MakeConstSpan(context_hash, context_hash_len));
  113. }
  114. bool tls13_set_traffic_key(SSL *ssl, enum ssl_encryption_level_t level,
  115. enum evp_aead_direction_t direction,
  116. Span<const uint8_t> traffic_secret) {
  117. const SSL_SESSION *session = SSL_get_session(ssl);
  118. uint16_t version = ssl_session_protocol_version(session);
  119. UniquePtr<SSLAEADContext> traffic_aead;
  120. if (ssl->quic_method == nullptr) {
  121. // Look up cipher suite properties.
  122. const EVP_AEAD *aead;
  123. size_t discard;
  124. if (!ssl_cipher_get_evp_aead(&aead, &discard, &discard, session->cipher,
  125. version, SSL_is_dtls(ssl))) {
  126. return false;
  127. }
  128. const EVP_MD *digest = ssl_session_get_digest(session);
  129. // Derive the key.
  130. size_t key_len = EVP_AEAD_key_length(aead);
  131. uint8_t key_buf[EVP_AEAD_MAX_KEY_LENGTH];
  132. auto key = MakeSpan(key_buf, key_len);
  133. if (!hkdf_expand_label(key, digest, traffic_secret, label_to_span("key"),
  134. {})) {
  135. return false;
  136. }
  137. // Derive the IV.
  138. size_t iv_len = EVP_AEAD_nonce_length(aead);
  139. uint8_t iv_buf[EVP_AEAD_MAX_NONCE_LENGTH];
  140. auto iv = MakeSpan(iv_buf, iv_len);
  141. if (!hkdf_expand_label(iv, digest, traffic_secret, label_to_span("iv"),
  142. {})) {
  143. return false;
  144. }
  145. traffic_aead = SSLAEADContext::Create(direction, session->ssl_version,
  146. SSL_is_dtls(ssl), session->cipher,
  147. key, Span<const uint8_t>(), iv);
  148. } else {
  149. // Install a placeholder SSLAEADContext so that SSL accessors work. The
  150. // encryption itself will be handled by the SSL_QUIC_METHOD.
  151. traffic_aead =
  152. SSLAEADContext::CreatePlaceholderForQUIC(version, session->cipher);
  153. // QUIC never installs early data keys at the TLS layer.
  154. assert(level != ssl_encryption_early_data);
  155. }
  156. if (!traffic_aead) {
  157. return false;
  158. }
  159. if (direction == evp_aead_open) {
  160. if (!ssl->method->set_read_state(ssl, std::move(traffic_aead))) {
  161. return false;
  162. }
  163. } else {
  164. if (!ssl->method->set_write_state(ssl, std::move(traffic_aead))) {
  165. return false;
  166. }
  167. }
  168. // Save the traffic secret.
  169. if (traffic_secret.size() >
  170. OPENSSL_ARRAY_SIZE(ssl->s3->read_traffic_secret) ||
  171. traffic_secret.size() >
  172. OPENSSL_ARRAY_SIZE(ssl->s3->write_traffic_secret)) {
  173. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  174. return false;
  175. }
  176. if (direction == evp_aead_open) {
  177. OPENSSL_memmove(ssl->s3->read_traffic_secret, traffic_secret.data(),
  178. traffic_secret.size());
  179. ssl->s3->read_traffic_secret_len = traffic_secret.size();
  180. ssl->s3->read_level = level;
  181. } else {
  182. OPENSSL_memmove(ssl->s3->write_traffic_secret, traffic_secret.data(),
  183. traffic_secret.size());
  184. ssl->s3->write_traffic_secret_len = traffic_secret.size();
  185. ssl->s3->write_level = level;
  186. }
  187. return true;
  188. }
  189. static const char kTLS13LabelExporter[] = "exp master";
  190. static const char kTLS13LabelClientEarlyTraffic[] = "c e traffic";
  191. static const char kTLS13LabelClientHandshakeTraffic[] = "c hs traffic";
  192. static const char kTLS13LabelServerHandshakeTraffic[] = "s hs traffic";
  193. static const char kTLS13LabelClientApplicationTraffic[] = "c ap traffic";
  194. static const char kTLS13LabelServerApplicationTraffic[] = "s ap traffic";
  195. bool tls13_derive_early_secret(SSL_HANDSHAKE *hs) {
  196. SSL *const ssl = hs->ssl;
  197. if (!derive_secret(hs, hs->early_traffic_secret(),
  198. label_to_span(kTLS13LabelClientEarlyTraffic)) ||
  199. !ssl_log_secret(ssl, "CLIENT_EARLY_TRAFFIC_SECRET",
  200. hs->early_traffic_secret())) {
  201. return false;
  202. }
  203. return true;
  204. }
  205. bool tls13_set_early_secret_for_quic(SSL_HANDSHAKE *hs) {
  206. SSL *const ssl = hs->ssl;
  207. if (ssl->quic_method == nullptr) {
  208. return true;
  209. }
  210. if (ssl->server) {
  211. if (!ssl->quic_method->set_encryption_secrets(
  212. ssl, ssl_encryption_early_data, hs->early_traffic_secret().data(),
  213. /*write_secret=*/nullptr, hs->early_traffic_secret().size())) {
  214. OPENSSL_PUT_ERROR(SSL, SSL_R_QUIC_INTERNAL_ERROR);
  215. return false;
  216. }
  217. } else {
  218. if (!ssl->quic_method->set_encryption_secrets(
  219. ssl, ssl_encryption_early_data, /*read_secret=*/nullptr,
  220. hs->early_traffic_secret().data(),
  221. hs->early_traffic_secret().size())) {
  222. OPENSSL_PUT_ERROR(SSL, SSL_R_QUIC_INTERNAL_ERROR);
  223. return false;
  224. }
  225. }
  226. return true;
  227. }
  228. static bool set_quic_secrets(SSL_HANDSHAKE *hs, ssl_encryption_level_t level,
  229. Span<const uint8_t> client_write_secret,
  230. Span<const uint8_t> server_write_secret) {
  231. SSL *const ssl = hs->ssl;
  232. assert(client_write_secret.size() == server_write_secret.size());
  233. if (ssl->quic_method == nullptr) {
  234. return true;
  235. }
  236. if (!ssl->server) {
  237. std::swap(client_write_secret, server_write_secret);
  238. }
  239. return ssl->quic_method->set_encryption_secrets(
  240. ssl, level,
  241. /*read_secret=*/client_write_secret.data(),
  242. /*write_secret=*/server_write_secret.data(), client_write_secret.size());
  243. }
  244. bool tls13_derive_handshake_secrets(SSL_HANDSHAKE *hs) {
  245. SSL *const ssl = hs->ssl;
  246. if (!derive_secret(hs, hs->client_handshake_secret(),
  247. label_to_span(kTLS13LabelClientHandshakeTraffic)) ||
  248. !ssl_log_secret(ssl, "CLIENT_HANDSHAKE_TRAFFIC_SECRET",
  249. hs->client_handshake_secret()) ||
  250. !derive_secret(hs, hs->server_handshake_secret(),
  251. label_to_span(kTLS13LabelServerHandshakeTraffic)) ||
  252. !ssl_log_secret(ssl, "SERVER_HANDSHAKE_TRAFFIC_SECRET",
  253. hs->server_handshake_secret()) ||
  254. !set_quic_secrets(hs, ssl_encryption_handshake,
  255. hs->client_handshake_secret(),
  256. hs->server_handshake_secret())) {
  257. return false;
  258. }
  259. return true;
  260. }
  261. bool tls13_derive_application_secrets(SSL_HANDSHAKE *hs) {
  262. SSL *const ssl = hs->ssl;
  263. ssl->s3->exporter_secret_len = hs->transcript.DigestLen();
  264. if (!derive_secret(hs, hs->client_traffic_secret_0(),
  265. label_to_span(kTLS13LabelClientApplicationTraffic)) ||
  266. !ssl_log_secret(ssl, "CLIENT_TRAFFIC_SECRET_0",
  267. hs->client_traffic_secret_0()) ||
  268. !derive_secret(hs, hs->server_traffic_secret_0(),
  269. label_to_span(kTLS13LabelServerApplicationTraffic)) ||
  270. !ssl_log_secret(ssl, "SERVER_TRAFFIC_SECRET_0",
  271. hs->server_traffic_secret_0()) ||
  272. !derive_secret(
  273. hs, MakeSpan(ssl->s3->exporter_secret, ssl->s3->exporter_secret_len),
  274. label_to_span(kTLS13LabelExporter)) ||
  275. !ssl_log_secret(ssl, "EXPORTER_SECRET",
  276. MakeConstSpan(ssl->s3->exporter_secret,
  277. ssl->s3->exporter_secret_len)) ||
  278. !set_quic_secrets(hs, ssl_encryption_application,
  279. hs->client_traffic_secret_0(),
  280. hs->server_traffic_secret_0())) {
  281. return false;
  282. }
  283. return true;
  284. }
  285. static const char kTLS13LabelApplicationTraffic[] = "traffic upd";
  286. bool tls13_rotate_traffic_key(SSL *ssl, enum evp_aead_direction_t direction) {
  287. Span<uint8_t> secret;
  288. if (direction == evp_aead_open) {
  289. secret = MakeSpan(ssl->s3->read_traffic_secret,
  290. ssl->s3->read_traffic_secret_len);
  291. } else {
  292. secret = MakeSpan(ssl->s3->write_traffic_secret,
  293. ssl->s3->write_traffic_secret_len);
  294. }
  295. const EVP_MD *digest = ssl_session_get_digest(SSL_get_session(ssl));
  296. return hkdf_expand_label(secret, digest, secret,
  297. label_to_span(kTLS13LabelApplicationTraffic), {}) &&
  298. tls13_set_traffic_key(ssl, ssl_encryption_application, direction,
  299. secret);
  300. }
  301. static const char kTLS13LabelResumption[] = "res master";
  302. bool tls13_derive_resumption_secret(SSL_HANDSHAKE *hs) {
  303. if (hs->transcript.DigestLen() > SSL_MAX_MASTER_KEY_LENGTH) {
  304. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  305. return false;
  306. }
  307. hs->new_session->master_key_length = hs->transcript.DigestLen();
  308. return derive_secret(
  309. hs,
  310. MakeSpan(hs->new_session->master_key, hs->new_session->master_key_length),
  311. label_to_span(kTLS13LabelResumption));
  312. }
  313. static const char kTLS13LabelFinished[] = "finished";
  314. // tls13_verify_data sets |out| to be the HMAC of |context| using a derived
  315. // Finished key for both Finished messages and the PSK binder. |out| must have
  316. // space available for |EVP_MAX_MD_SIZE| bytes.
  317. static bool tls13_verify_data(uint8_t *out, size_t *out_len,
  318. const EVP_MD *digest, uint16_t version,
  319. Span<const uint8_t> secret,
  320. Span<const uint8_t> context) {
  321. uint8_t key_buf[EVP_MAX_MD_SIZE];
  322. auto key = MakeSpan(key_buf, EVP_MD_size(digest));
  323. unsigned len;
  324. if (!hkdf_expand_label(key, digest, secret,
  325. label_to_span(kTLS13LabelFinished), {}) ||
  326. HMAC(digest, key.data(), key.size(), context.data(), context.size(), out,
  327. &len) == nullptr) {
  328. return false;
  329. }
  330. *out_len = len;
  331. return true;
  332. }
  333. bool tls13_finished_mac(SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len,
  334. bool is_server) {
  335. Span<const uint8_t> traffic_secret =
  336. is_server ? hs->server_handshake_secret() : hs->client_handshake_secret();
  337. uint8_t context_hash[EVP_MAX_MD_SIZE];
  338. size_t context_hash_len;
  339. if (!hs->transcript.GetHash(context_hash, &context_hash_len) ||
  340. !tls13_verify_data(out, out_len, hs->transcript.Digest(),
  341. hs->ssl->version, traffic_secret,
  342. MakeConstSpan(context_hash, context_hash_len))) {
  343. return 0;
  344. }
  345. return 1;
  346. }
  347. static const char kTLS13LabelResumptionPSK[] = "resumption";
  348. bool tls13_derive_session_psk(SSL_SESSION *session, Span<const uint8_t> nonce) {
  349. const EVP_MD *digest = ssl_session_get_digest(session);
  350. // The session initially stores the resumption_master_secret, which we
  351. // override with the PSK.
  352. auto session_key = MakeSpan(session->master_key, session->master_key_length);
  353. return hkdf_expand_label(session_key, digest, session_key,
  354. label_to_span(kTLS13LabelResumptionPSK), nonce);
  355. }
  356. static const char kTLS13LabelExportKeying[] = "exporter";
  357. bool tls13_export_keying_material(SSL *ssl, Span<uint8_t> out,
  358. Span<const uint8_t> secret,
  359. Span<const char> label,
  360. Span<const uint8_t> context) {
  361. if (secret.empty()) {
  362. assert(0);
  363. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  364. return false;
  365. }
  366. const EVP_MD *digest = ssl_session_get_digest(SSL_get_session(ssl));
  367. uint8_t hash_buf[EVP_MAX_MD_SIZE];
  368. uint8_t export_context_buf[EVP_MAX_MD_SIZE];
  369. unsigned hash_len;
  370. unsigned export_context_len;
  371. if (!EVP_Digest(context.data(), context.size(), hash_buf, &hash_len, digest,
  372. nullptr) ||
  373. !EVP_Digest(nullptr, 0, export_context_buf, &export_context_len, digest,
  374. nullptr)) {
  375. return false;
  376. }
  377. auto hash = MakeConstSpan(hash_buf, hash_len);
  378. auto export_context = MakeConstSpan(export_context_buf, export_context_len);
  379. uint8_t derived_secret_buf[EVP_MAX_MD_SIZE];
  380. auto derived_secret = MakeSpan(derived_secret_buf, EVP_MD_size(digest));
  381. return hkdf_expand_label(derived_secret, digest, secret, label,
  382. export_context) &&
  383. hkdf_expand_label(out, digest, derived_secret,
  384. label_to_span(kTLS13LabelExportKeying), hash);
  385. }
  386. static const char kTLS13LabelPSKBinder[] = "res binder";
  387. static bool tls13_psk_binder(uint8_t *out, size_t *out_len, uint16_t version,
  388. const EVP_MD *digest, Span<const uint8_t> psk,
  389. Span<const uint8_t> context) {
  390. uint8_t binder_context[EVP_MAX_MD_SIZE];
  391. unsigned binder_context_len;
  392. if (!EVP_Digest(NULL, 0, binder_context, &binder_context_len, digest, NULL)) {
  393. return false;
  394. }
  395. uint8_t early_secret[EVP_MAX_MD_SIZE] = {0};
  396. size_t early_secret_len;
  397. if (!HKDF_extract(early_secret, &early_secret_len, digest, psk.data(),
  398. psk.size(), NULL, 0)) {
  399. return false;
  400. }
  401. uint8_t binder_key_buf[EVP_MAX_MD_SIZE] = {0};
  402. auto binder_key = MakeSpan(binder_key_buf, EVP_MD_size(digest));
  403. if (!hkdf_expand_label(binder_key, digest,
  404. MakeConstSpan(early_secret, early_secret_len),
  405. label_to_span(kTLS13LabelPSKBinder),
  406. MakeConstSpan(binder_context, binder_context_len)) ||
  407. !tls13_verify_data(out, out_len, digest, version, binder_key, context)) {
  408. return false;
  409. }
  410. assert(*out_len == EVP_MD_size(digest));
  411. return true;
  412. }
  413. static bool hash_transcript_and_truncated_client_hello(
  414. SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len, const EVP_MD *digest,
  415. Span<const uint8_t> client_hello, size_t binders_len) {
  416. // Truncate the ClientHello.
  417. if (binders_len + 2 < binders_len || client_hello.size() < binders_len + 2) {
  418. return false;
  419. }
  420. client_hello = client_hello.subspan(0, client_hello.size() - binders_len - 2);
  421. ScopedEVP_MD_CTX ctx;
  422. unsigned len;
  423. if (!hs->transcript.CopyToHashContext(ctx.get(), digest) ||
  424. !EVP_DigestUpdate(ctx.get(), client_hello.data(), client_hello.size()) ||
  425. !EVP_DigestFinal_ex(ctx.get(), out, &len)) {
  426. return false;
  427. }
  428. *out_len = len;
  429. return true;
  430. }
  431. bool tls13_write_psk_binder(SSL_HANDSHAKE *hs, Span<uint8_t> msg) {
  432. SSL *const ssl = hs->ssl;
  433. const EVP_MD *digest = ssl_session_get_digest(ssl->session.get());
  434. size_t hash_len = EVP_MD_size(digest);
  435. ScopedEVP_MD_CTX ctx;
  436. uint8_t context[EVP_MAX_MD_SIZE];
  437. size_t context_len;
  438. uint8_t verify_data[EVP_MAX_MD_SIZE];
  439. size_t verify_data_len;
  440. if (!hash_transcript_and_truncated_client_hello(
  441. hs, context, &context_len, digest, msg,
  442. 1 /* length prefix */ + hash_len) ||
  443. !tls13_psk_binder(verify_data, &verify_data_len,
  444. ssl->session->ssl_version, digest,
  445. MakeConstSpan(ssl->session->master_key,
  446. ssl->session->master_key_length),
  447. MakeConstSpan(context, context_len)) ||
  448. verify_data_len != hash_len) {
  449. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  450. return false;
  451. }
  452. OPENSSL_memcpy(msg.data() + msg.size() - verify_data_len, verify_data,
  453. verify_data_len);
  454. return true;
  455. }
  456. bool tls13_verify_psk_binder(SSL_HANDSHAKE *hs, SSL_SESSION *session,
  457. const SSLMessage &msg, CBS *binders) {
  458. uint8_t context[EVP_MAX_MD_SIZE];
  459. size_t context_len;
  460. uint8_t verify_data[EVP_MAX_MD_SIZE];
  461. size_t verify_data_len;
  462. CBS binder;
  463. if (!hash_transcript_and_truncated_client_hello(hs, context, &context_len,
  464. hs->transcript.Digest(),
  465. msg.raw, CBS_len(binders)) ||
  466. !tls13_psk_binder(
  467. verify_data, &verify_data_len, hs->ssl->version,
  468. hs->transcript.Digest(),
  469. MakeConstSpan(session->master_key, session->master_key_length),
  470. MakeConstSpan(context, context_len)) ||
  471. // We only consider the first PSK, so compare against the first binder.
  472. !CBS_get_u8_length_prefixed(binders, &binder)) {
  473. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  474. return false;
  475. }
  476. bool binder_ok =
  477. CBS_len(&binder) == verify_data_len &&
  478. CRYPTO_memcmp(CBS_data(&binder), verify_data, verify_data_len) == 0;
  479. #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
  480. binder_ok = true;
  481. #endif
  482. if (!binder_ok) {
  483. OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
  484. return false;
  485. }
  486. return true;
  487. }
  488. BSSL_NAMESPACE_END