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

441 line
12 KiB

  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 <openssl/bytestring.h>
  18. #include <openssl/err.h>
  19. #include <openssl/hkdf.h>
  20. #include <openssl/mem.h>
  21. #include <openssl/stack.h>
  22. #include <openssl/x509.h>
  23. #include <openssl/x509v3.h>
  24. #include "internal.h"
  25. /* kMaxKeyUpdates is the number of consecutive KeyUpdates that will be
  26. * processed. Without this limit an attacker could force unbounded processing
  27. * without being able to return application data. */
  28. static const uint8_t kMaxKeyUpdates = 32;
  29. int tls13_handshake(SSL *ssl) {
  30. SSL_HANDSHAKE *hs = ssl->s3->hs;
  31. for (;;) {
  32. /* Resolve the operation the handshake was waiting on. */
  33. switch (hs->wait) {
  34. case ssl_hs_error:
  35. OPENSSL_PUT_ERROR(SSL, SSL_R_SSL_HANDSHAKE_FAILURE);
  36. return -1;
  37. case ssl_hs_flush:
  38. case ssl_hs_flush_and_read_message: {
  39. int ret = BIO_flush(ssl->wbio);
  40. if (ret <= 0) {
  41. ssl->rwstate = SSL_WRITING;
  42. return ret;
  43. }
  44. if (hs->wait != ssl_hs_flush_and_read_message) {
  45. break;
  46. }
  47. ssl->method->expect_flight(ssl);
  48. hs->wait = ssl_hs_read_message;
  49. /* Fall-through. */
  50. }
  51. case ssl_hs_read_message: {
  52. int ret = ssl->method->ssl_get_message(ssl, -1, ssl_dont_hash_message);
  53. if (ret <= 0) {
  54. return ret;
  55. }
  56. break;
  57. }
  58. case ssl_hs_write_message: {
  59. int ret = ssl->method->write_message(ssl);
  60. if (ret <= 0) {
  61. return ret;
  62. }
  63. break;
  64. }
  65. case ssl_hs_x509_lookup:
  66. ssl->rwstate = SSL_X509_LOOKUP;
  67. hs->wait = ssl_hs_ok;
  68. return -1;
  69. case ssl_hs_private_key_operation:
  70. ssl->rwstate = SSL_PRIVATE_KEY_OPERATION;
  71. hs->wait = ssl_hs_ok;
  72. return -1;
  73. case ssl_hs_ok:
  74. break;
  75. }
  76. /* Run the state machine again. */
  77. hs->wait = hs->do_handshake(ssl);
  78. if (hs->wait == ssl_hs_error) {
  79. /* Don't loop around to avoid a stray |SSL_R_SSL_HANDSHAKE_FAILURE| the
  80. * first time around. */
  81. return -1;
  82. }
  83. if (hs->wait == ssl_hs_ok) {
  84. /* The handshake has completed. */
  85. return 1;
  86. }
  87. /* Otherwise, loop to the beginning and resolve what was blocking the
  88. * handshake. */
  89. }
  90. }
  91. static int tls13_get_cert_verify_signature_input(SSL *ssl, uint8_t **out,
  92. size_t *out_len, int server) {
  93. CBB cbb;
  94. if (!CBB_init(&cbb, 64 + 33 + 1 + 2 * EVP_MAX_MD_SIZE)) {
  95. goto err;
  96. }
  97. for (size_t i = 0; i < 64; i++) {
  98. if (!CBB_add_u8(&cbb, 0x20)) {
  99. goto err;
  100. }
  101. }
  102. if (server) {
  103. /* Include the NUL byte. */
  104. static const char kContext[] = "TLS 1.3, server CertificateVerify";
  105. if (!CBB_add_bytes(&cbb, (const uint8_t *)kContext, sizeof(kContext))) {
  106. goto err;
  107. }
  108. } else {
  109. static const char kContext[] = "TLS 1.3, client CertificateVerify";
  110. if (!CBB_add_bytes(&cbb, (const uint8_t *)kContext, sizeof(kContext))) {
  111. goto err;
  112. }
  113. }
  114. uint8_t context_hashes[2 * EVP_MAX_MD_SIZE];
  115. size_t context_hashes_len;
  116. if (!tls13_get_context_hashes(ssl, context_hashes, &context_hashes_len) ||
  117. !CBB_add_bytes(&cbb, context_hashes, context_hashes_len) ||
  118. !CBB_finish(&cbb, out, out_len)) {
  119. goto err;
  120. }
  121. return 1;
  122. err:
  123. OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
  124. CBB_cleanup(&cbb);
  125. return 0;
  126. }
  127. int tls13_process_certificate(SSL *ssl, int allow_anonymous) {
  128. CBS cbs, context;
  129. CBS_init(&cbs, ssl->init_msg, ssl->init_num);
  130. if (!CBS_get_u8_length_prefixed(&cbs, &context) ||
  131. CBS_len(&context) != 0) {
  132. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  133. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  134. return 0;
  135. }
  136. const int retain_sha256 =
  137. ssl->server && ssl->ctx->retain_only_sha256_of_client_certs;
  138. int ret = 0;
  139. uint8_t alert;
  140. STACK_OF(X509) *chain = ssl_parse_cert_chain(
  141. ssl, &alert, retain_sha256 ? ssl->s3->new_session->peer_sha256 : NULL,
  142. &cbs);
  143. if (chain == NULL) {
  144. ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
  145. goto err;
  146. }
  147. if (CBS_len(&cbs) != 0) {
  148. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  149. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  150. goto err;
  151. }
  152. if (sk_X509_num(chain) == 0) {
  153. if (!allow_anonymous) {
  154. OPENSSL_PUT_ERROR(SSL, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
  155. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
  156. goto err;
  157. }
  158. /* OpenSSL returns X509_V_OK when no certificates are requested. This is
  159. * classed by them as a bug, but it's assumed by at least NGINX. */
  160. ssl->s3->new_session->verify_result = X509_V_OK;
  161. /* No certificate, so nothing more to do. */
  162. ret = 1;
  163. goto err;
  164. }
  165. ssl->s3->new_session->peer_sha256_valid = retain_sha256;
  166. if (!ssl_verify_cert_chain(ssl, &ssl->s3->new_session->verify_result,
  167. chain)) {
  168. goto err;
  169. }
  170. X509_free(ssl->s3->new_session->peer);
  171. X509 *leaf = sk_X509_value(chain, 0);
  172. X509_up_ref(leaf);
  173. ssl->s3->new_session->peer = leaf;
  174. sk_X509_pop_free(ssl->s3->new_session->cert_chain, X509_free);
  175. ssl->s3->new_session->cert_chain = chain;
  176. chain = NULL;
  177. ret = 1;
  178. err:
  179. sk_X509_pop_free(chain, X509_free);
  180. return ret;
  181. }
  182. int tls13_process_certificate_verify(SSL *ssl) {
  183. int ret = 0;
  184. X509 *peer = ssl->s3->new_session->peer;
  185. EVP_PKEY *pkey = NULL;
  186. uint8_t *msg = NULL;
  187. size_t msg_len;
  188. /* Filter out unsupported certificate types. */
  189. pkey = X509_get_pubkey(peer);
  190. if (pkey == NULL) {
  191. goto err;
  192. }
  193. CBS cbs, signature;
  194. uint16_t signature_algorithm;
  195. CBS_init(&cbs, ssl->init_msg, ssl->init_num);
  196. if (!CBS_get_u16(&cbs, &signature_algorithm) ||
  197. !CBS_get_u16_length_prefixed(&cbs, &signature) ||
  198. CBS_len(&cbs) != 0) {
  199. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  200. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  201. goto err;
  202. }
  203. int al;
  204. if (!tls12_check_peer_sigalg(ssl, &al, signature_algorithm)) {
  205. ssl3_send_alert(ssl, SSL3_AL_FATAL, al);
  206. goto err;
  207. }
  208. ssl->s3->tmp.peer_signature_algorithm = signature_algorithm;
  209. if (!tls13_get_cert_verify_signature_input(ssl, &msg, &msg_len,
  210. !ssl->server)) {
  211. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  212. goto err;
  213. }
  214. int sig_ok =
  215. ssl_public_key_verify(ssl, CBS_data(&signature), CBS_len(&signature),
  216. signature_algorithm, pkey, msg, msg_len);
  217. #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
  218. sig_ok = 1;
  219. ERR_clear_error();
  220. #endif
  221. if (!sig_ok) {
  222. OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_SIGNATURE);
  223. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECRYPT_ERROR);
  224. goto err;
  225. }
  226. ret = 1;
  227. err:
  228. EVP_PKEY_free(pkey);
  229. OPENSSL_free(msg);
  230. return ret;
  231. }
  232. int tls13_check_message_type(SSL *ssl, int type) {
  233. if (ssl->s3->tmp.message_type != type) {
  234. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
  235. OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
  236. ERR_add_error_dataf("got type %d, wanted type %d",
  237. ssl->s3->tmp.message_type, type);
  238. return 0;
  239. }
  240. return 1;
  241. }
  242. int tls13_process_finished(SSL *ssl) {
  243. uint8_t verify_data[EVP_MAX_MD_SIZE];
  244. size_t verify_data_len;
  245. if (!tls13_finished_mac(ssl, verify_data, &verify_data_len, !ssl->server)) {
  246. return 0;
  247. }
  248. int finished_ok =
  249. ssl->init_num == verify_data_len &&
  250. CRYPTO_memcmp(verify_data, ssl->init_msg, verify_data_len) == 0;
  251. #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
  252. finished_ok = 1;
  253. #endif
  254. if (!finished_ok) {
  255. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECRYPT_ERROR);
  256. OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
  257. return 0;
  258. }
  259. return 1;
  260. }
  261. int tls13_prepare_certificate(SSL *ssl) {
  262. CBB cbb, body;
  263. if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_CERTIFICATE) ||
  264. /* The request context is always empty in the handshake. */
  265. !CBB_add_u8(&body, 0) ||
  266. !ssl_add_cert_chain(ssl, &body) ||
  267. !ssl->method->finish_message(ssl, &cbb)) {
  268. CBB_cleanup(&cbb);
  269. return 0;
  270. }
  271. return 1;
  272. }
  273. enum ssl_private_key_result_t tls13_prepare_certificate_verify(
  274. SSL *ssl, int is_first_run) {
  275. enum ssl_private_key_result_t ret = ssl_private_key_failure;
  276. uint8_t *msg = NULL;
  277. size_t msg_len;
  278. CBB cbb, body;
  279. CBB_zero(&cbb);
  280. uint16_t signature_algorithm;
  281. if (!tls1_choose_signature_algorithm(ssl, &signature_algorithm)) {
  282. goto err;
  283. }
  284. if (!ssl->method->init_message(ssl, &cbb, &body,
  285. SSL3_MT_CERTIFICATE_VERIFY) ||
  286. !CBB_add_u16(&body, signature_algorithm)) {
  287. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  288. goto err;
  289. }
  290. /* Sign the digest. */
  291. CBB child;
  292. const size_t max_sig_len = ssl_private_key_max_signature_len(ssl);
  293. uint8_t *sig;
  294. size_t sig_len;
  295. if (!CBB_add_u16_length_prefixed(&body, &child) ||
  296. !CBB_reserve(&child, &sig, max_sig_len)) {
  297. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  298. goto err;
  299. }
  300. enum ssl_private_key_result_t sign_result;
  301. if (is_first_run) {
  302. if (!tls13_get_cert_verify_signature_input(ssl, &msg, &msg_len,
  303. ssl->server)) {
  304. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  305. goto err;
  306. }
  307. sign_result = ssl_private_key_sign(ssl, sig, &sig_len, max_sig_len,
  308. signature_algorithm, msg, msg_len);
  309. } else {
  310. sign_result = ssl_private_key_complete(ssl, sig, &sig_len, max_sig_len);
  311. }
  312. if (sign_result != ssl_private_key_success) {
  313. ret = sign_result;
  314. goto err;
  315. }
  316. if (!CBB_did_write(&child, sig_len) ||
  317. !ssl->method->finish_message(ssl, &cbb)) {
  318. goto err;
  319. }
  320. ret = ssl_private_key_success;
  321. err:
  322. CBB_cleanup(&cbb);
  323. OPENSSL_free(msg);
  324. return ret;
  325. }
  326. int tls13_prepare_finished(SSL *ssl) {
  327. size_t verify_data_len;
  328. uint8_t verify_data[EVP_MAX_MD_SIZE];
  329. if (!tls13_finished_mac(ssl, verify_data, &verify_data_len, ssl->server)) {
  330. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  331. OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
  332. return 0;
  333. }
  334. CBB cbb, body;
  335. if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_FINISHED) ||
  336. !CBB_add_bytes(&body, verify_data, verify_data_len) ||
  337. !ssl->method->finish_message(ssl, &cbb)) {
  338. CBB_cleanup(&cbb);
  339. return 0;
  340. }
  341. return 1;
  342. }
  343. static int tls13_receive_key_update(SSL *ssl) {
  344. if (ssl->init_num != 0) {
  345. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  346. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  347. return 0;
  348. }
  349. // TODO(svaldez): Send KeyUpdate.
  350. return tls13_rotate_traffic_key(ssl, evp_aead_open);
  351. }
  352. int tls13_post_handshake(SSL *ssl) {
  353. if (ssl->s3->tmp.message_type == SSL3_MT_KEY_UPDATE) {
  354. ssl->s3->key_update_count++;
  355. if (ssl->s3->key_update_count > kMaxKeyUpdates) {
  356. OPENSSL_PUT_ERROR(SSL, SSL_R_TOO_MANY_KEY_UPDATES);
  357. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
  358. return 0;
  359. }
  360. return tls13_receive_key_update(ssl);
  361. }
  362. ssl->s3->key_update_count = 0;
  363. if (ssl->s3->tmp.message_type == SSL3_MT_NEW_SESSION_TICKET &&
  364. !ssl->server) {
  365. return tls13_process_new_session_ticket(ssl);
  366. }
  367. // TODO(svaldez): Handle post-handshake authentication.
  368. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
  369. OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
  370. return 0;
  371. }