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.
 
 
 
 
 
 

630 line
20 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/digest.h>
  19. #include <openssl/err.h>
  20. #include <openssl/mem.h>
  21. #include <openssl/rand.h>
  22. #include <openssl/stack.h>
  23. #include "internal.h"
  24. enum server_hs_state_t {
  25. state_process_client_hello = 0,
  26. state_send_hello_retry_request,
  27. state_flush_hello_retry_request,
  28. state_process_second_client_hello,
  29. state_send_server_hello,
  30. state_send_encrypted_extensions,
  31. state_send_certificate_request,
  32. state_send_server_certificate,
  33. state_send_server_certificate_verify,
  34. state_complete_server_certificate_verify,
  35. state_send_server_finished,
  36. state_flush,
  37. state_process_client_certificate,
  38. state_process_client_certificate_verify,
  39. state_process_client_finished,
  40. state_send_new_session_ticket,
  41. state_flush_new_session_ticket,
  42. state_done,
  43. };
  44. static const uint8_t kZeroes[EVP_MAX_MD_SIZE] = {0};
  45. static int resolve_psk_secret(SSL *ssl) {
  46. SSL_HANDSHAKE *hs = ssl->s3->hs;
  47. if (ssl->s3->tmp.new_cipher->algorithm_auth != SSL_aPSK) {
  48. return tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len);
  49. }
  50. /* TODO(davidben): Support PSK. */
  51. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  52. return 0;
  53. }
  54. static int resolve_ecdhe_secret(SSL *ssl, int *out_need_retry,
  55. struct ssl_early_callback_ctx *early_ctx) {
  56. *out_need_retry = 0;
  57. SSL_HANDSHAKE *hs = ssl->s3->hs;
  58. if (ssl->s3->tmp.new_cipher->algorithm_mkey != SSL_kECDHE) {
  59. return tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len);
  60. }
  61. CBS key_share;
  62. if (!ssl_early_callback_get_extension(early_ctx, &key_share,
  63. TLSEXT_TYPE_key_share)) {
  64. OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_KEY_SHARE);
  65. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_MISSING_EXTENSION);
  66. return ssl_hs_error;
  67. }
  68. int found_key_share;
  69. uint8_t *dhe_secret;
  70. size_t dhe_secret_len;
  71. uint8_t alert;
  72. if (!ssl_ext_key_share_parse_clienthello(ssl, &found_key_share, &dhe_secret,
  73. &dhe_secret_len, &alert,
  74. &key_share)) {
  75. ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
  76. return 0;
  77. }
  78. if (!found_key_share) {
  79. *out_need_retry = 1;
  80. return 0;
  81. }
  82. int ok = tls13_advance_key_schedule(ssl, dhe_secret, dhe_secret_len);
  83. OPENSSL_free(dhe_secret);
  84. return ok;
  85. }
  86. static enum ssl_hs_wait_t do_process_client_hello(SSL *ssl, SSL_HANDSHAKE *hs) {
  87. if (!tls13_check_message_type(ssl, SSL3_MT_CLIENT_HELLO)) {
  88. return ssl_hs_error;
  89. }
  90. struct ssl_early_callback_ctx early_ctx;
  91. if (!ssl_early_callback_init(ssl, &early_ctx, ssl->init_msg,
  92. ssl->init_num)) {
  93. OPENSSL_PUT_ERROR(SSL, SSL_R_CLIENTHELLO_PARSE_FAILED);
  94. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  95. return ssl_hs_error;
  96. }
  97. CBS cbs, client_random, session_id, cipher_suites, compression_methods;
  98. uint16_t client_wire_version;
  99. CBS_init(&cbs, ssl->init_msg, ssl->init_num);
  100. if (!CBS_get_u16(&cbs, &client_wire_version) ||
  101. !CBS_get_bytes(&cbs, &client_random, SSL3_RANDOM_SIZE) ||
  102. !CBS_get_u8_length_prefixed(&cbs, &session_id) ||
  103. CBS_len(&session_id) > SSL_MAX_SSL_SESSION_ID_LENGTH) {
  104. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  105. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  106. return ssl_hs_error;
  107. }
  108. uint16_t min_version, max_version;
  109. if (!ssl_get_version_range(ssl, &min_version, &max_version)) {
  110. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  111. return ssl_hs_error;
  112. }
  113. assert(ssl->s3->have_version);
  114. /* Load the client random. */
  115. memcpy(ssl->s3->client_random, CBS_data(&client_random), SSL3_RANDOM_SIZE);
  116. SSL_set_session(ssl, NULL);
  117. if (!ssl_get_new_session(ssl, 1 /* server */)) {
  118. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  119. return ssl_hs_error;
  120. }
  121. if (ssl->ctx->dos_protection_cb != NULL &&
  122. ssl->ctx->dos_protection_cb(&early_ctx) == 0) {
  123. /* Connection rejected for DOS reasons. */
  124. OPENSSL_PUT_ERROR(SSL, SSL_R_CONNECTION_REJECTED);
  125. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ACCESS_DENIED);
  126. return ssl_hs_error;
  127. }
  128. if (!CBS_get_u16_length_prefixed(&cbs, &cipher_suites) ||
  129. CBS_len(&cipher_suites) == 0 ||
  130. CBS_len(&cipher_suites) % 2 != 0 ||
  131. !CBS_get_u8_length_prefixed(&cbs, &compression_methods) ||
  132. CBS_len(&compression_methods) == 0) {
  133. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  134. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  135. return ssl_hs_error;
  136. }
  137. /* TLS 1.3 requires the peer only advertise the null compression. */
  138. if (CBS_len(&compression_methods) != 1 ||
  139. CBS_data(&compression_methods)[0] != 0) {
  140. OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_COMPRESSION_LIST);
  141. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
  142. return ssl_hs_error;
  143. }
  144. /* TLS extensions. */
  145. if (!ssl_parse_clienthello_tlsext(ssl, &cbs)) {
  146. OPENSSL_PUT_ERROR(SSL, SSL_R_PARSE_TLSEXT);
  147. return ssl_hs_error;
  148. }
  149. /* There should be nothing left over in the message. */
  150. if (CBS_len(&cbs) != 0) {
  151. OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_PACKET_LENGTH);
  152. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  153. return ssl_hs_error;
  154. }
  155. /* Let cert callback update server certificates if required.
  156. *
  157. * TODO(davidben): Can this get run earlier? */
  158. if (ssl->cert->cert_cb != NULL) {
  159. int rv = ssl->cert->cert_cb(ssl, ssl->cert->cert_cb_arg);
  160. if (rv == 0) {
  161. OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_CB_ERROR);
  162. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  163. return ssl_hs_error;
  164. }
  165. if (rv < 0) {
  166. hs->state = state_process_client_hello;
  167. return ssl_hs_x509_lookup;
  168. }
  169. }
  170. STACK_OF(SSL_CIPHER) *ciphers =
  171. ssl_bytes_to_cipher_list(ssl, &cipher_suites, max_version);
  172. if (ciphers == NULL) {
  173. return ssl_hs_error;
  174. }
  175. const SSL_CIPHER *cipher =
  176. ssl3_choose_cipher(ssl, ciphers, ssl_get_cipher_preferences(ssl));
  177. sk_SSL_CIPHER_free(ciphers);
  178. if (cipher == NULL) {
  179. OPENSSL_PUT_ERROR(SSL, SSL_R_NO_SHARED_CIPHER);
  180. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
  181. return ssl_hs_error;
  182. }
  183. ssl->s3->new_session->cipher = cipher;
  184. ssl->s3->tmp.new_cipher = cipher;
  185. ssl->method->received_flight(ssl);
  186. /* The PRF hash is now known. Set up the key schedule and hash the
  187. * ClientHello. */
  188. size_t hash_len =
  189. EVP_MD_size(ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl)));
  190. if (!tls13_init_key_schedule(ssl, kZeroes, hash_len)) {
  191. return ssl_hs_error;
  192. }
  193. /* Resolve PSK and incorporate it into the secret. */
  194. if (!resolve_psk_secret(ssl)) {
  195. return ssl_hs_error;
  196. }
  197. /* Resolve ECDHE and incorporate it into the secret. */
  198. int need_retry;
  199. if (!resolve_ecdhe_secret(ssl, &need_retry, &early_ctx)) {
  200. if (need_retry) {
  201. hs->state = state_send_hello_retry_request;
  202. return ssl_hs_ok;
  203. }
  204. return ssl_hs_error;
  205. }
  206. hs->state = state_send_server_hello;
  207. return ssl_hs_ok;
  208. }
  209. static enum ssl_hs_wait_t do_send_hello_retry_request(SSL *ssl,
  210. SSL_HANDSHAKE *hs) {
  211. CBB cbb, body, extensions;
  212. uint16_t group_id;
  213. if (!ssl->method->init_message(ssl, &cbb, &body,
  214. SSL3_MT_HELLO_RETRY_REQUEST) ||
  215. !CBB_add_u16(&body, ssl->version) ||
  216. !CBB_add_u16(&body, ssl_cipher_get_value(ssl->s3->tmp.new_cipher)) ||
  217. !tls1_get_shared_group(ssl, &group_id) ||
  218. !CBB_add_u16(&body, group_id) ||
  219. !CBB_add_u16_length_prefixed(&body, &extensions) ||
  220. !ssl->method->finish_message(ssl, &cbb)) {
  221. CBB_cleanup(&cbb);
  222. return ssl_hs_error;
  223. }
  224. hs->state = state_flush_hello_retry_request;
  225. return ssl_hs_write_message;
  226. }
  227. static enum ssl_hs_wait_t do_flush_hello_retry_request(SSL *ssl,
  228. SSL_HANDSHAKE *hs) {
  229. hs->state = state_process_second_client_hello;
  230. return ssl_hs_flush_and_read_message;
  231. }
  232. static enum ssl_hs_wait_t do_process_second_client_hello(SSL *ssl,
  233. SSL_HANDSHAKE *hs) {
  234. if (!tls13_check_message_type(ssl, SSL3_MT_CLIENT_HELLO)) {
  235. return ssl_hs_error;
  236. }
  237. struct ssl_early_callback_ctx early_ctx;
  238. if (!ssl_early_callback_init(ssl, &early_ctx, ssl->init_msg,
  239. ssl->init_num)) {
  240. OPENSSL_PUT_ERROR(SSL, SSL_R_CLIENTHELLO_PARSE_FAILED);
  241. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  242. return ssl_hs_error;
  243. }
  244. int need_retry;
  245. if (!resolve_ecdhe_secret(ssl, &need_retry, &early_ctx)) {
  246. if (need_retry) {
  247. /* Only send one HelloRetryRequest. */
  248. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
  249. OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
  250. }
  251. return ssl_hs_error;
  252. }
  253. if (!ssl->method->hash_current_message(ssl)) {
  254. return ssl_hs_error;
  255. }
  256. ssl->method->received_flight(ssl);
  257. hs->state = state_send_server_hello;
  258. return ssl_hs_ok;
  259. }
  260. static enum ssl_hs_wait_t do_send_server_hello(SSL *ssl, SSL_HANDSHAKE *hs) {
  261. CBB cbb, body, extensions;
  262. if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_SERVER_HELLO) ||
  263. !CBB_add_u16(&body, ssl->version) ||
  264. !RAND_bytes(ssl->s3->server_random, sizeof(ssl->s3->server_random)) ||
  265. !CBB_add_bytes(&body, ssl->s3->server_random, SSL3_RANDOM_SIZE) ||
  266. !CBB_add_u16(&body, ssl_cipher_get_value(ssl->s3->tmp.new_cipher)) ||
  267. !CBB_add_u16_length_prefixed(&body, &extensions) ||
  268. !ssl_ext_key_share_add_serverhello(ssl, &extensions) ||
  269. !ssl->method->finish_message(ssl, &cbb)) {
  270. CBB_cleanup(&cbb);
  271. return ssl_hs_error;
  272. }
  273. hs->state = state_send_encrypted_extensions;
  274. return ssl_hs_write_message;
  275. }
  276. static enum ssl_hs_wait_t do_send_encrypted_extensions(SSL *ssl,
  277. SSL_HANDSHAKE *hs) {
  278. if (!tls13_set_handshake_traffic(ssl)) {
  279. return ssl_hs_error;
  280. }
  281. CBB cbb, body;
  282. if (!ssl->method->init_message(ssl, &cbb, &body,
  283. SSL3_MT_ENCRYPTED_EXTENSIONS) ||
  284. !ssl_add_serverhello_tlsext(ssl, &body) ||
  285. !ssl->method->finish_message(ssl, &cbb)) {
  286. CBB_cleanup(&cbb);
  287. return ssl_hs_error;
  288. }
  289. hs->state = state_send_certificate_request;
  290. return ssl_hs_write_message;
  291. }
  292. static enum ssl_hs_wait_t do_send_certificate_request(SSL *ssl,
  293. SSL_HANDSHAKE *hs) {
  294. /* Determine whether to request a client certificate. */
  295. ssl->s3->tmp.cert_request = !!(ssl->verify_mode & SSL_VERIFY_PEER);
  296. /* CertificateRequest may only be sent in certificate-based ciphers. */
  297. if (!ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
  298. ssl->s3->tmp.cert_request = 0;
  299. }
  300. if (!ssl->s3->tmp.cert_request) {
  301. /* Skip this state. */
  302. hs->state = state_send_server_certificate;
  303. return ssl_hs_ok;
  304. }
  305. CBB cbb, body, sigalgs_cbb;
  306. if (!ssl->method->init_message(ssl, &cbb, &body,
  307. SSL3_MT_CERTIFICATE_REQUEST) ||
  308. !CBB_add_u8(&body, 0 /* no certificate_request_context. */)) {
  309. goto err;
  310. }
  311. const uint16_t *sigalgs;
  312. size_t sigalgs_len = tls12_get_psigalgs(ssl, &sigalgs);
  313. if (!CBB_add_u16_length_prefixed(&body, &sigalgs_cbb)) {
  314. goto err;
  315. }
  316. for (size_t i = 0; i < sigalgs_len; i++) {
  317. if (!CBB_add_u16(&sigalgs_cbb, sigalgs[i])) {
  318. goto err;
  319. }
  320. }
  321. if (!ssl_add_client_CA_list(ssl, &body) ||
  322. !CBB_add_u16(&body, 0 /* empty certificate_extensions. */) ||
  323. !ssl->method->finish_message(ssl, &cbb)) {
  324. goto err;
  325. }
  326. hs->state = state_send_server_certificate;
  327. return ssl_hs_write_message;
  328. err:
  329. CBB_cleanup(&cbb);
  330. return ssl_hs_error;
  331. }
  332. static enum ssl_hs_wait_t do_send_server_certificate(SSL *ssl,
  333. SSL_HANDSHAKE *hs) {
  334. if (!ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
  335. hs->state = state_send_server_finished;
  336. return ssl_hs_ok;
  337. }
  338. if (!ssl_has_certificate(ssl)) {
  339. OPENSSL_PUT_ERROR(SSL, SSL_R_NO_CERTIFICATE_SET);
  340. return ssl_hs_error;
  341. }
  342. if (!tls13_prepare_certificate(ssl)) {
  343. return ssl_hs_error;
  344. }
  345. hs->state = state_send_server_certificate_verify;
  346. return ssl_hs_write_message;
  347. }
  348. static enum ssl_hs_wait_t do_send_server_certificate_verify(SSL *ssl,
  349. SSL_HANDSHAKE *hs,
  350. int is_first_run) {
  351. switch (tls13_prepare_certificate_verify(ssl, is_first_run)) {
  352. case ssl_private_key_success:
  353. hs->state = state_send_server_finished;
  354. return ssl_hs_write_message;
  355. case ssl_private_key_retry:
  356. hs->state = state_complete_server_certificate_verify;
  357. return ssl_hs_private_key_operation;
  358. case ssl_private_key_failure:
  359. return ssl_hs_error;
  360. }
  361. assert(0);
  362. return ssl_hs_error;
  363. }
  364. static enum ssl_hs_wait_t do_send_server_finished(SSL *ssl, SSL_HANDSHAKE *hs) {
  365. if (!tls13_prepare_finished(ssl)) {
  366. return ssl_hs_error;
  367. }
  368. hs->state = state_flush;
  369. return ssl_hs_write_message;
  370. }
  371. static enum ssl_hs_wait_t do_flush(SSL *ssl, SSL_HANDSHAKE *hs) {
  372. /* Update the secret to the master secret and derive traffic keys. */
  373. if (!tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len) ||
  374. !tls13_derive_traffic_secret_0(ssl) ||
  375. !tls13_set_traffic_key(ssl, type_data, evp_aead_seal,
  376. hs->traffic_secret_0, hs->hash_len)) {
  377. return ssl_hs_error;
  378. }
  379. hs->state = state_process_client_certificate;
  380. return ssl_hs_flush_and_read_message;
  381. }
  382. static enum ssl_hs_wait_t do_process_client_certificate(SSL *ssl,
  383. SSL_HANDSHAKE *hs) {
  384. if (!ssl->s3->tmp.cert_request) {
  385. /* Skip this state. */
  386. hs->state = state_process_client_certificate_verify;
  387. return ssl_hs_ok;
  388. }
  389. const int allow_anonymous =
  390. (ssl->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) == 0;
  391. if (!tls13_check_message_type(ssl, SSL3_MT_CERTIFICATE) ||
  392. !tls13_process_certificate(ssl, allow_anonymous) ||
  393. !ssl->method->hash_current_message(ssl)) {
  394. return ssl_hs_error;
  395. }
  396. /* For historical reasons, the server's copy of the chain does not include the
  397. * leaf while the client's does. */
  398. if (sk_X509_num(ssl->s3->new_session->cert_chain) > 0) {
  399. X509_free(sk_X509_shift(ssl->s3->new_session->cert_chain));
  400. }
  401. hs->state = state_process_client_certificate_verify;
  402. return ssl_hs_read_message;
  403. }
  404. static enum ssl_hs_wait_t do_process_client_certificate_verify(
  405. SSL *ssl, SSL_HANDSHAKE *hs) {
  406. if (ssl->s3->new_session->peer == NULL) {
  407. /* Skip this state. */
  408. hs->state = state_process_client_finished;
  409. return ssl_hs_ok;
  410. }
  411. if (!tls13_check_message_type(ssl, SSL3_MT_CERTIFICATE_VERIFY) ||
  412. !tls13_process_certificate_verify(ssl) ||
  413. !ssl->method->hash_current_message(ssl)) {
  414. return 0;
  415. }
  416. hs->state = state_process_client_finished;
  417. return ssl_hs_read_message;
  418. }
  419. static enum ssl_hs_wait_t do_process_client_finished(SSL *ssl,
  420. SSL_HANDSHAKE *hs) {
  421. if (!tls13_check_message_type(ssl, SSL3_MT_FINISHED) ||
  422. !tls13_process_finished(ssl) ||
  423. !ssl->method->hash_current_message(ssl) ||
  424. /* evp_aead_seal keys have already been switched. */
  425. !tls13_set_traffic_key(ssl, type_data, evp_aead_open,
  426. hs->traffic_secret_0, hs->hash_len) ||
  427. !tls13_finalize_keys(ssl)) {
  428. return ssl_hs_error;
  429. }
  430. ssl->method->received_flight(ssl);
  431. hs->state = state_send_new_session_ticket;
  432. return ssl_hs_ok;
  433. }
  434. static enum ssl_hs_wait_t do_send_new_session_ticket(SSL *ssl,
  435. SSL_HANDSHAKE *hs) {
  436. SSL_SESSION *session = ssl->s3->new_session;
  437. session->ticket_lifetime_hint = session->timeout;
  438. session->ticket_flags = SSL_TICKET_ALLOW_DHE_RESUMPTION;
  439. if (!RAND_bytes((uint8_t *)&session->ticket_age_add,
  440. sizeof(session->ticket_age_add))) {
  441. return 0;
  442. }
  443. session->ticket_age_add_valid = 1;
  444. CBB cbb, body, ticket;
  445. if (!ssl->method->init_message(ssl, &cbb, &body,
  446. SSL3_MT_NEW_SESSION_TICKET) ||
  447. !CBB_add_u32(&body, session->ticket_lifetime_hint) ||
  448. !CBB_add_u32(&body, session->ticket_flags) ||
  449. !CBB_add_u32(&body, session->ticket_age_add) ||
  450. !CBB_add_u16(&body, 0 /* no ticket extensions */) ||
  451. !CBB_add_u16_length_prefixed(&body, &ticket) ||
  452. !ssl_encrypt_ticket(ssl, &ticket, session) ||
  453. !ssl->method->finish_message(ssl, &cbb)) {
  454. CBB_cleanup(&cbb);
  455. return ssl_hs_error;
  456. }
  457. hs->session_tickets_sent++;
  458. hs->state = state_flush_new_session_ticket;
  459. return ssl_hs_write_message;
  460. }
  461. /* TLS 1.3 recommends single-use tickets, so issue multiple tickets in case the
  462. * client makes several connections before getting a renewal. */
  463. static const int kNumTickets = 2;
  464. static enum ssl_hs_wait_t do_flush_new_session_ticket(SSL *ssl,
  465. SSL_HANDSHAKE *hs) {
  466. if (hs->session_tickets_sent >= kNumTickets) {
  467. hs->state = state_done;
  468. } else {
  469. hs->state = state_send_new_session_ticket;
  470. }
  471. return ssl_hs_flush;
  472. }
  473. enum ssl_hs_wait_t tls13_server_handshake(SSL *ssl) {
  474. SSL_HANDSHAKE *hs = ssl->s3->hs;
  475. while (hs->state != state_done) {
  476. enum ssl_hs_wait_t ret = ssl_hs_error;
  477. enum server_hs_state_t state = hs->state;
  478. switch (state) {
  479. case state_process_client_hello:
  480. ret = do_process_client_hello(ssl, hs);
  481. break;
  482. case state_send_hello_retry_request:
  483. ret = do_send_hello_retry_request(ssl, hs);
  484. break;
  485. case state_flush_hello_retry_request:
  486. ret = do_flush_hello_retry_request(ssl, hs);
  487. break;
  488. case state_process_second_client_hello:
  489. ret = do_process_second_client_hello(ssl, hs);
  490. break;
  491. case state_send_server_hello:
  492. ret = do_send_server_hello(ssl, hs);
  493. break;
  494. case state_send_encrypted_extensions:
  495. ret = do_send_encrypted_extensions(ssl, hs);
  496. break;
  497. case state_send_certificate_request:
  498. ret = do_send_certificate_request(ssl, hs);
  499. break;
  500. case state_send_server_certificate:
  501. ret = do_send_server_certificate(ssl, hs);
  502. break;
  503. case state_send_server_certificate_verify:
  504. ret = do_send_server_certificate_verify(ssl, hs, 1 /* first run */);
  505. break;
  506. case state_complete_server_certificate_verify:
  507. ret = do_send_server_certificate_verify(ssl, hs, 0 /* complete */);
  508. break;
  509. case state_send_server_finished:
  510. ret = do_send_server_finished(ssl, hs);
  511. break;
  512. case state_flush:
  513. ret = do_flush(ssl, hs);
  514. break;
  515. case state_process_client_certificate:
  516. ret = do_process_client_certificate(ssl, hs);
  517. break;
  518. case state_process_client_certificate_verify:
  519. ret = do_process_client_certificate_verify(ssl, hs);
  520. break;
  521. case state_process_client_finished:
  522. ret = do_process_client_finished(ssl, hs);
  523. break;
  524. case state_send_new_session_ticket:
  525. ret = do_send_new_session_ticket(ssl, hs);
  526. break;
  527. case state_flush_new_session_ticket:
  528. ret = do_flush_new_session_ticket(ssl, hs);
  529. break;
  530. case state_done:
  531. ret = ssl_hs_ok;
  532. break;
  533. }
  534. if (ret != ssl_hs_ok) {
  535. return ret;
  536. }
  537. }
  538. return ssl_hs_ok;
  539. }