Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

566 Zeilen
18 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_done,
  41. };
  42. static const uint8_t kZeroes[EVP_MAX_MD_SIZE] = {0};
  43. static int resolve_psk_secret(SSL *ssl) {
  44. SSL_HANDSHAKE *hs = ssl->s3->hs;
  45. if (ssl->s3->tmp.new_cipher->algorithm_auth != SSL_aPSK) {
  46. return tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len);
  47. }
  48. /* TODO(davidben): Support PSK. */
  49. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  50. return 0;
  51. }
  52. static int resolve_ecdhe_secret(SSL *ssl, int *out_need_retry,
  53. struct ssl_early_callback_ctx *early_ctx) {
  54. *out_need_retry = 0;
  55. SSL_HANDSHAKE *hs = ssl->s3->hs;
  56. if (ssl->s3->tmp.new_cipher->algorithm_mkey != SSL_kECDHE) {
  57. return tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len);
  58. }
  59. const uint8_t *key_share_buf = NULL;
  60. size_t key_share_len = 0;
  61. CBS key_share;
  62. if (!SSL_early_callback_ctx_extension_get(early_ctx, TLSEXT_TYPE_key_share,
  63. &key_share_buf, &key_share_len)) {
  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. CBS_init(&key_share, key_share_buf, key_share_len);
  69. int found_key_share;
  70. uint8_t *dhe_secret;
  71. size_t dhe_secret_len;
  72. uint8_t alert;
  73. if (!ext_key_share_parse_clienthello(ssl, &found_key_share, &dhe_secret,
  74. &dhe_secret_len, &alert, &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->hit = 0;
  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->session->cipher = cipher;
  184. ssl->s3->tmp.new_cipher = cipher;
  185. /* The PRF hash is now known. Set up the key schedule and hash the
  186. * ClientHello. */
  187. size_t hash_len =
  188. EVP_MD_size(ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl)));
  189. if (!tls13_init_key_schedule(ssl, kZeroes, hash_len)) {
  190. return ssl_hs_error;
  191. }
  192. /* Resolve PSK and incorporate it into the secret. */
  193. if (!resolve_psk_secret(ssl)) {
  194. return ssl_hs_error;
  195. }
  196. /* Resolve ECDHE and incorporate it into the secret. */
  197. int need_retry;
  198. if (!resolve_ecdhe_secret(ssl, &need_retry, &early_ctx)) {
  199. if (need_retry) {
  200. hs->state = state_send_hello_retry_request;
  201. return ssl_hs_ok;
  202. }
  203. return ssl_hs_error;
  204. }
  205. hs->state = state_send_server_hello;
  206. return ssl_hs_ok;
  207. }
  208. static enum ssl_hs_wait_t do_send_hello_retry_request(SSL *ssl,
  209. SSL_HANDSHAKE *hs) {
  210. CBB cbb, body, extensions;
  211. uint16_t group_id;
  212. if (!ssl->method->init_message(ssl, &cbb, &body,
  213. SSL3_MT_HELLO_RETRY_REQUEST) ||
  214. !CBB_add_u16(&body, ssl->version) ||
  215. !CBB_add_u16(&body, ssl_cipher_get_value(ssl->s3->tmp.new_cipher)) ||
  216. !tls1_get_shared_group(ssl, &group_id) ||
  217. !CBB_add_u16(&body, group_id) ||
  218. !CBB_add_u16_length_prefixed(&body, &extensions) ||
  219. !ssl->method->finish_message(ssl, &cbb)) {
  220. CBB_cleanup(&cbb);
  221. return ssl_hs_error;
  222. }
  223. hs->state = state_flush_hello_retry_request;
  224. return ssl_hs_write_message;
  225. }
  226. static enum ssl_hs_wait_t do_flush_hello_retry_request(SSL *ssl,
  227. SSL_HANDSHAKE *hs) {
  228. hs->state = state_process_second_client_hello;
  229. return ssl_hs_flush_and_read_message;
  230. }
  231. static enum ssl_hs_wait_t do_process_second_client_hello(SSL *ssl,
  232. SSL_HANDSHAKE *hs) {
  233. if (!tls13_check_message_type(ssl, SSL3_MT_CLIENT_HELLO)) {
  234. return ssl_hs_error;
  235. }
  236. struct ssl_early_callback_ctx early_ctx;
  237. if (!ssl_early_callback_init(ssl, &early_ctx, ssl->init_msg,
  238. ssl->init_num)) {
  239. OPENSSL_PUT_ERROR(SSL, SSL_R_CLIENTHELLO_PARSE_FAILED);
  240. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  241. return ssl_hs_error;
  242. }
  243. int need_retry;
  244. if (!resolve_ecdhe_secret(ssl, &need_retry, &early_ctx)) {
  245. if (need_retry) {
  246. /* Only send one HelloRetryRequest. */
  247. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
  248. OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
  249. }
  250. return ssl_hs_error;
  251. }
  252. if (!ssl->method->hash_current_message(ssl)) {
  253. return ssl_hs_error;
  254. }
  255. hs->state = state_send_server_hello;
  256. return ssl_hs_ok;
  257. }
  258. static enum ssl_hs_wait_t do_send_server_hello(SSL *ssl, SSL_HANDSHAKE *hs) {
  259. CBB cbb, body, extensions;
  260. if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_SERVER_HELLO) ||
  261. !CBB_add_u16(&body, ssl->version) ||
  262. !RAND_bytes(ssl->s3->server_random, sizeof(ssl->s3->server_random)) ||
  263. !CBB_add_bytes(&body, ssl->s3->server_random, SSL3_RANDOM_SIZE) ||
  264. !CBB_add_u16(&body, ssl_cipher_get_value(ssl->s3->tmp.new_cipher)) ||
  265. !CBB_add_u16_length_prefixed(&body, &extensions) ||
  266. !ext_key_share_add_serverhello(ssl, &extensions) ||
  267. !ssl->method->finish_message(ssl, &cbb)) {
  268. CBB_cleanup(&cbb);
  269. return ssl_hs_error;
  270. }
  271. hs->state = state_send_encrypted_extensions;
  272. return ssl_hs_write_message;
  273. }
  274. static enum ssl_hs_wait_t do_send_encrypted_extensions(SSL *ssl,
  275. SSL_HANDSHAKE *hs) {
  276. if (!tls13_set_handshake_traffic(ssl)) {
  277. return ssl_hs_error;
  278. }
  279. CBB cbb, body;
  280. if (!ssl->method->init_message(ssl, &cbb, &body,
  281. SSL3_MT_ENCRYPTED_EXTENSIONS) ||
  282. !ssl_add_serverhello_tlsext(ssl, &body) ||
  283. !ssl->method->finish_message(ssl, &cbb)) {
  284. CBB_cleanup(&cbb);
  285. return ssl_hs_error;
  286. }
  287. hs->state = state_send_certificate_request;
  288. return ssl_hs_write_message;
  289. }
  290. static enum ssl_hs_wait_t do_send_certificate_request(SSL *ssl,
  291. SSL_HANDSHAKE *hs) {
  292. /* Determine whether to request a client certificate. */
  293. ssl->s3->tmp.cert_request = !!(ssl->verify_mode & SSL_VERIFY_PEER);
  294. /* CertificateRequest may only be sent in certificate-based ciphers. */
  295. if (!ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
  296. ssl->s3->tmp.cert_request = 0;
  297. }
  298. if (!ssl->s3->tmp.cert_request) {
  299. /* Skip this state. */
  300. hs->state = state_send_server_certificate;
  301. return ssl_hs_ok;
  302. }
  303. CBB cbb, body, sigalgs_cbb;
  304. if (!ssl->method->init_message(ssl, &cbb, &body,
  305. SSL3_MT_CERTIFICATE_REQUEST) ||
  306. !CBB_add_u8(&body, 0 /* no certificate_request_context. */)) {
  307. goto err;
  308. }
  309. const uint16_t *sigalgs;
  310. size_t sigalgs_len = tls12_get_psigalgs(ssl, &sigalgs);
  311. if (!CBB_add_u16_length_prefixed(&body, &sigalgs_cbb)) {
  312. goto err;
  313. }
  314. for (size_t i = 0; i < sigalgs_len; i++) {
  315. if (!CBB_add_u16(&sigalgs_cbb, sigalgs[i])) {
  316. goto err;
  317. }
  318. }
  319. if (!ssl_add_client_CA_list(ssl, &body) ||
  320. !CBB_add_u16(&body, 0 /* empty certificate_extensions. */) ||
  321. !ssl->method->finish_message(ssl, &cbb)) {
  322. goto err;
  323. }
  324. hs->state = state_send_server_certificate;
  325. return ssl_hs_write_message;
  326. err:
  327. CBB_cleanup(&cbb);
  328. return ssl_hs_error;
  329. }
  330. static enum ssl_hs_wait_t do_send_server_certificate(SSL *ssl,
  331. SSL_HANDSHAKE *hs) {
  332. if (!ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
  333. hs->state = state_send_server_finished;
  334. return ssl_hs_ok;
  335. }
  336. if (!ssl_has_certificate(ssl)) {
  337. OPENSSL_PUT_ERROR(SSL, SSL_R_NO_CERTIFICATE_SET);
  338. return ssl_hs_error;
  339. }
  340. if (!tls13_prepare_certificate(ssl)) {
  341. return ssl_hs_error;
  342. }
  343. hs->state = state_send_server_certificate_verify;
  344. return ssl_hs_write_message;
  345. }
  346. static enum ssl_hs_wait_t do_send_server_certificate_verify(SSL *ssl,
  347. SSL_HANDSHAKE *hs,
  348. int is_first_run) {
  349. switch (tls13_prepare_certificate_verify(ssl, is_first_run)) {
  350. case ssl_private_key_success:
  351. hs->state = state_send_server_finished;
  352. return ssl_hs_write_message;
  353. case ssl_private_key_retry:
  354. hs->state = state_complete_server_certificate_verify;
  355. return ssl_hs_private_key_operation;
  356. case ssl_private_key_failure:
  357. return ssl_hs_error;
  358. }
  359. assert(0);
  360. return ssl_hs_error;
  361. }
  362. static enum ssl_hs_wait_t do_send_server_finished(SSL *ssl, SSL_HANDSHAKE *hs) {
  363. if (!tls13_prepare_finished(ssl)) {
  364. return ssl_hs_error;
  365. }
  366. hs->state = state_flush;
  367. return ssl_hs_write_message;
  368. }
  369. static enum ssl_hs_wait_t do_flush(SSL *ssl, SSL_HANDSHAKE *hs) {
  370. /* Update the secret to the master secret and derive traffic keys. */
  371. if (!tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len) ||
  372. !tls13_derive_traffic_secret_0(ssl) ||
  373. !tls13_set_traffic_key(ssl, type_data, evp_aead_seal,
  374. hs->traffic_secret_0, hs->hash_len)) {
  375. return ssl_hs_error;
  376. }
  377. hs->state = state_process_client_certificate;
  378. return ssl_hs_flush_and_read_message;
  379. }
  380. static enum ssl_hs_wait_t do_process_client_certificate(SSL *ssl,
  381. SSL_HANDSHAKE *hs) {
  382. if (!ssl->s3->tmp.cert_request) {
  383. /* Skip this state. */
  384. hs->state = state_process_client_certificate_verify;
  385. return ssl_hs_ok;
  386. }
  387. if (!tls13_check_message_type(ssl, SSL3_MT_CERTIFICATE) ||
  388. !tls13_process_certificate(ssl) ||
  389. !ssl->method->hash_current_message(ssl)) {
  390. return ssl_hs_error;
  391. }
  392. hs->state = state_process_client_certificate_verify;
  393. return ssl_hs_read_message;
  394. }
  395. static enum ssl_hs_wait_t do_process_client_certificate_verify(
  396. SSL *ssl, SSL_HANDSHAKE *hs) {
  397. if (ssl->session->peer == NULL) {
  398. /* Skip this state. */
  399. hs->state = state_process_client_finished;
  400. return ssl_hs_ok;
  401. }
  402. if (!tls13_check_message_type(ssl, SSL3_MT_CERTIFICATE_VERIFY) ||
  403. !tls13_process_certificate_verify(ssl) ||
  404. !ssl->method->hash_current_message(ssl)) {
  405. return 0;
  406. }
  407. hs->state = state_process_client_finished;
  408. return ssl_hs_read_message;
  409. }
  410. static enum ssl_hs_wait_t do_process_client_finished(SSL *ssl,
  411. SSL_HANDSHAKE *hs) {
  412. if (!tls13_check_message_type(ssl, SSL3_MT_FINISHED) ||
  413. !tls13_process_finished(ssl) ||
  414. !ssl->method->hash_current_message(ssl) ||
  415. /* evp_aead_seal keys have already been switched. */
  416. !tls13_set_traffic_key(ssl, type_data, evp_aead_open,
  417. hs->traffic_secret_0, hs->hash_len) ||
  418. !tls13_finalize_keys(ssl)) {
  419. return ssl_hs_error;
  420. }
  421. hs->state = state_done;
  422. return ssl_hs_ok;
  423. }
  424. enum ssl_hs_wait_t tls13_server_handshake(SSL *ssl) {
  425. SSL_HANDSHAKE *hs = ssl->s3->hs;
  426. while (hs->state != state_done) {
  427. enum ssl_hs_wait_t ret = ssl_hs_error;
  428. enum server_hs_state_t state = hs->state;
  429. switch (state) {
  430. case state_process_client_hello:
  431. ret = do_process_client_hello(ssl, hs);
  432. break;
  433. case state_send_hello_retry_request:
  434. ret = do_send_hello_retry_request(ssl, hs);
  435. break;
  436. case state_flush_hello_retry_request:
  437. ret = do_flush_hello_retry_request(ssl, hs);
  438. break;
  439. case state_process_second_client_hello:
  440. ret = do_process_second_client_hello(ssl, hs);
  441. break;
  442. case state_send_server_hello:
  443. ret = do_send_server_hello(ssl, hs);
  444. break;
  445. case state_send_encrypted_extensions:
  446. ret = do_send_encrypted_extensions(ssl, hs);
  447. break;
  448. case state_send_certificate_request:
  449. ret = do_send_certificate_request(ssl, hs);
  450. break;
  451. case state_send_server_certificate:
  452. ret = do_send_server_certificate(ssl, hs);
  453. break;
  454. case state_send_server_certificate_verify:
  455. ret = do_send_server_certificate_verify(ssl, hs, 1 /* first run */);
  456. break;
  457. case state_complete_server_certificate_verify:
  458. ret = do_send_server_certificate_verify(ssl, hs, 0 /* complete */);
  459. break;
  460. case state_send_server_finished:
  461. ret = do_send_server_finished(ssl, hs);
  462. break;
  463. case state_flush:
  464. ret = do_flush(ssl, hs);
  465. break;
  466. case state_process_client_certificate:
  467. ret = do_process_client_certificate(ssl, hs);
  468. break;
  469. case state_process_client_certificate_verify:
  470. ret = do_process_client_certificate_verify(ssl, hs);
  471. break;
  472. case state_process_client_finished:
  473. ret = do_process_client_finished(ssl, hs);
  474. break;
  475. case state_done:
  476. ret = ssl_hs_ok;
  477. break;
  478. }
  479. if (ret != ssl_hs_ok) {
  480. return ret;
  481. }
  482. }
  483. return ssl_hs_ok;
  484. }