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.
 
 
 
 
 
 

484 regels
15 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_server_hello,
  27. state_send_encrypted_extensions,
  28. state_send_certificate_request,
  29. state_send_server_certificate,
  30. state_send_server_certificate_verify,
  31. state_complete_server_certificate_verify,
  32. state_send_server_finished,
  33. state_flush,
  34. state_read_client_second_flight,
  35. state_process_client_certificate,
  36. state_process_client_certificate_verify,
  37. state_process_client_finished,
  38. state_done,
  39. };
  40. static enum ssl_hs_wait_t do_process_client_hello(SSL *ssl, SSL_HANDSHAKE *hs) {
  41. if (!tls13_check_message_type(ssl, SSL3_MT_CLIENT_HELLO)) {
  42. return ssl_hs_error;
  43. }
  44. struct ssl_early_callback_ctx early_ctx;
  45. uint16_t client_wire_version;
  46. CBS client_random, session_id, cipher_suites, compression_methods;
  47. memset(&early_ctx, 0, sizeof(early_ctx));
  48. early_ctx.ssl = ssl;
  49. early_ctx.client_hello = ssl->init_msg;
  50. early_ctx.client_hello_len = ssl->init_num;
  51. if (!ssl_early_callback_init(&early_ctx)) {
  52. OPENSSL_PUT_ERROR(SSL, SSL_R_CLIENTHELLO_PARSE_FAILED);
  53. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  54. return ssl_hs_error;
  55. }
  56. CBS cbs;
  57. CBS_init(&cbs, ssl->init_msg, ssl->init_num);
  58. if (!CBS_get_u16(&cbs, &client_wire_version) ||
  59. !CBS_get_bytes(&cbs, &client_random, SSL3_RANDOM_SIZE) ||
  60. !CBS_get_u8_length_prefixed(&cbs, &session_id) ||
  61. CBS_len(&session_id) > SSL_MAX_SSL_SESSION_ID_LENGTH) {
  62. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  63. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  64. return ssl_hs_error;
  65. }
  66. uint16_t min_version, max_version;
  67. if (!ssl_get_version_range(ssl, &min_version, &max_version)) {
  68. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  69. return ssl_hs_error;
  70. }
  71. assert(ssl->s3->have_version);
  72. /* Load the client random. */
  73. memcpy(ssl->s3->client_random, CBS_data(&client_random), SSL3_RANDOM_SIZE);
  74. ssl->hit = 0;
  75. if (!ssl_get_new_session(ssl, 1 /* server */)) {
  76. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  77. return ssl_hs_error;
  78. }
  79. if (ssl->ctx->dos_protection_cb != NULL &&
  80. ssl->ctx->dos_protection_cb(&early_ctx) == 0) {
  81. /* Connection rejected for DOS reasons. */
  82. OPENSSL_PUT_ERROR(SSL, SSL_R_CONNECTION_REJECTED);
  83. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ACCESS_DENIED);
  84. return ssl_hs_error;
  85. }
  86. if (!CBS_get_u16_length_prefixed(&cbs, &cipher_suites) ||
  87. CBS_len(&cipher_suites) == 0 ||
  88. CBS_len(&cipher_suites) % 2 != 0 ||
  89. !CBS_get_u8_length_prefixed(&cbs, &compression_methods) ||
  90. CBS_len(&compression_methods) == 0) {
  91. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  92. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  93. return ssl_hs_error;
  94. }
  95. /* TLS 1.3 requires the peer only advertise the null compression. */
  96. if (CBS_len(&compression_methods) != 1 ||
  97. CBS_data(&compression_methods)[0] != 0) {
  98. OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_COMPRESSION_LIST);
  99. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
  100. return ssl_hs_error;
  101. }
  102. /* TLS extensions. */
  103. if (!ssl_parse_clienthello_tlsext(ssl, &cbs)) {
  104. OPENSSL_PUT_ERROR(SSL, SSL_R_PARSE_TLSEXT);
  105. return ssl_hs_error;
  106. }
  107. /* There should be nothing left over in the message. */
  108. if (CBS_len(&cbs) != 0) {
  109. OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_PACKET_LENGTH);
  110. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
  111. return ssl_hs_error;
  112. }
  113. /* Let cert callback update server certificates if required.
  114. *
  115. * TODO(davidben): Can this get run earlier? */
  116. if (ssl->cert->cert_cb != NULL) {
  117. int rv = ssl->cert->cert_cb(ssl, ssl->cert->cert_cb_arg);
  118. if (rv == 0) {
  119. OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_CB_ERROR);
  120. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
  121. return ssl_hs_error;
  122. }
  123. if (rv < 0) {
  124. hs->state = state_process_client_hello;
  125. return ssl_hs_x509_lookup;
  126. }
  127. }
  128. STACK_OF(SSL_CIPHER) *ciphers =
  129. ssl_bytes_to_cipher_list(ssl, &cipher_suites, max_version);
  130. if (ciphers == NULL) {
  131. return ssl_hs_error;
  132. }
  133. const SSL_CIPHER *cipher =
  134. ssl3_choose_cipher(ssl, ciphers, ssl_get_cipher_preferences(ssl));
  135. sk_SSL_CIPHER_free(ciphers);
  136. if (cipher == NULL) {
  137. OPENSSL_PUT_ERROR(SSL, SSL_R_NO_SHARED_CIPHER);
  138. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
  139. return ssl_hs_error;
  140. }
  141. ssl->session->cipher = cipher;
  142. ssl->s3->tmp.new_cipher = cipher;
  143. /* The PRF hash is now known. Set up the key schedule and hash the
  144. * ClientHello. */
  145. static const uint8_t kZeroes[EVP_MAX_MD_SIZE] = {0};
  146. size_t hash_len =
  147. EVP_MD_size(ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl)));
  148. if (!tls13_init_key_schedule(ssl, kZeroes, hash_len)) {
  149. return ssl_hs_error;
  150. }
  151. /* Resolve PSK and incorporate it into the secret. */
  152. if (cipher->algorithm_auth == SSL_aPSK) {
  153. /* TODO(davidben): Support PSK. */
  154. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  155. return ssl_hs_error;
  156. } else if (!tls13_advance_key_schedule(ssl, kZeroes, hash_len)) {
  157. return ssl_hs_error;
  158. }
  159. /* Resolve ECDHE and incorporate it into the secret. */
  160. if (cipher->algorithm_mkey == SSL_kECDHE) {
  161. const uint8_t *key_share_buf = NULL;
  162. size_t key_share_len = 0;
  163. CBS key_share;
  164. if (!SSL_early_callback_ctx_extension_get(&early_ctx, TLSEXT_TYPE_key_share,
  165. &key_share_buf, &key_share_len)) {
  166. OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_KEY_SHARE);
  167. ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_MISSING_EXTENSION);
  168. return ssl_hs_error;
  169. }
  170. CBS_init(&key_share, key_share_buf, key_share_len);
  171. uint8_t *dhe_secret;
  172. size_t dhe_secret_len;
  173. uint8_t alert;
  174. if (!ext_key_share_parse_clienthello(ssl, &dhe_secret, &dhe_secret_len,
  175. &alert, &key_share)) {
  176. ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
  177. return ssl_hs_error;
  178. }
  179. int ok = tls13_advance_key_schedule(ssl, dhe_secret, dhe_secret_len);
  180. OPENSSL_free(dhe_secret);
  181. if (!ok) {
  182. return ssl_hs_error;
  183. }
  184. } else if (!tls13_advance_key_schedule(ssl, kZeroes, hash_len)) {
  185. return ssl_hs_error;
  186. }
  187. hs->state = state_send_server_hello;
  188. return ssl_hs_ok;
  189. }
  190. static enum ssl_hs_wait_t do_send_server_hello(SSL *ssl, SSL_HANDSHAKE *hs) {
  191. CBB cbb, body, extensions;
  192. if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_SERVER_HELLO) ||
  193. !CBB_add_u16(&body, ssl->version) ||
  194. !RAND_bytes(ssl->s3->server_random, sizeof(ssl->s3->server_random)) ||
  195. !CBB_add_bytes(&body, ssl->s3->server_random, SSL3_RANDOM_SIZE) ||
  196. !CBB_add_u16(&body, ssl_cipher_get_value(ssl->s3->tmp.new_cipher)) ||
  197. !CBB_add_u16_length_prefixed(&body, &extensions) ||
  198. !ext_key_share_add_serverhello(ssl, &extensions) ||
  199. !ssl->method->finish_message(ssl, &cbb)) {
  200. CBB_cleanup(&cbb);
  201. return ssl_hs_error;
  202. }
  203. hs->state = state_send_encrypted_extensions;
  204. return ssl_hs_write_message;
  205. }
  206. static enum ssl_hs_wait_t do_send_encrypted_extensions(SSL *ssl,
  207. SSL_HANDSHAKE *hs) {
  208. if (!tls13_set_handshake_traffic(ssl)) {
  209. return ssl_hs_error;
  210. }
  211. CBB cbb, body;
  212. if (!ssl->method->init_message(ssl, &cbb, &body,
  213. SSL3_MT_ENCRYPTED_EXTENSIONS) ||
  214. !ssl_add_serverhello_tlsext(ssl, &body) ||
  215. !ssl->method->finish_message(ssl, &cbb)) {
  216. CBB_cleanup(&cbb);
  217. return ssl_hs_error;
  218. }
  219. hs->state = state_send_certificate_request;
  220. return ssl_hs_write_message;
  221. }
  222. static enum ssl_hs_wait_t do_send_certificate_request(SSL *ssl,
  223. SSL_HANDSHAKE *hs) {
  224. /* Determine whether to request a client certificate. */
  225. ssl->s3->tmp.cert_request = !!(ssl->verify_mode & SSL_VERIFY_PEER);
  226. /* CertificateRequest may only be sent in certificate-based ciphers. */
  227. if (!ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
  228. ssl->s3->tmp.cert_request = 0;
  229. }
  230. if (!ssl->s3->tmp.cert_request) {
  231. /* Skip this state. */
  232. hs->state = state_send_server_certificate;
  233. return ssl_hs_ok;
  234. }
  235. CBB cbb, body, sigalgs_cbb;
  236. if (!ssl->method->init_message(ssl, &cbb, &body,
  237. SSL3_MT_CERTIFICATE_REQUEST) ||
  238. !CBB_add_u8(&body, 0 /* no certificate_request_context. */)) {
  239. goto err;
  240. }
  241. const uint16_t *sigalgs;
  242. size_t sigalgs_len = tls12_get_psigalgs(ssl, &sigalgs);
  243. if (!CBB_add_u16_length_prefixed(&body, &sigalgs_cbb)) {
  244. goto err;
  245. }
  246. for (size_t i = 0; i < sigalgs_len; i++) {
  247. if (!CBB_add_u16(&sigalgs_cbb, sigalgs[i])) {
  248. goto err;
  249. }
  250. }
  251. if (!ssl_add_client_CA_list(ssl, &body) ||
  252. !CBB_add_u16(&body, 0 /* empty certificate_extensions. */) ||
  253. !ssl->method->finish_message(ssl, &cbb)) {
  254. goto err;
  255. }
  256. hs->state = state_send_server_certificate;
  257. return ssl_hs_write_message;
  258. err:
  259. CBB_cleanup(&cbb);
  260. return ssl_hs_error;
  261. }
  262. static enum ssl_hs_wait_t do_send_server_certificate(SSL *ssl,
  263. SSL_HANDSHAKE *hs) {
  264. if (!ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
  265. hs->state = state_send_server_finished;
  266. return ssl_hs_ok;
  267. }
  268. if (!ssl_has_certificate(ssl)) {
  269. OPENSSL_PUT_ERROR(SSL, SSL_R_NO_CERTIFICATE_SET);
  270. return ssl_hs_error;
  271. }
  272. if (!tls13_prepare_certificate(ssl)) {
  273. return ssl_hs_error;
  274. }
  275. hs->state = state_send_server_certificate_verify;
  276. return ssl_hs_write_message;
  277. }
  278. static enum ssl_hs_wait_t do_send_server_certificate_verify(SSL *ssl,
  279. SSL_HANDSHAKE *hs,
  280. int is_first_run) {
  281. switch (tls13_prepare_certificate_verify(ssl, is_first_run)) {
  282. case ssl_private_key_success:
  283. hs->state = state_send_server_finished;
  284. return ssl_hs_write_message;
  285. case ssl_private_key_retry:
  286. hs->state = state_complete_server_certificate_verify;
  287. return ssl_hs_private_key_operation;
  288. case ssl_private_key_failure:
  289. return ssl_hs_error;
  290. }
  291. assert(0);
  292. return ssl_hs_error;
  293. }
  294. static enum ssl_hs_wait_t do_send_server_finished(SSL *ssl, SSL_HANDSHAKE *hs) {
  295. if (!tls13_prepare_finished(ssl)) {
  296. return ssl_hs_error;
  297. }
  298. hs->state = state_flush;
  299. return ssl_hs_write_message;
  300. }
  301. static enum ssl_hs_wait_t do_flush(SSL *ssl, SSL_HANDSHAKE *hs) {
  302. hs->state = state_read_client_second_flight;
  303. return ssl_hs_flush;
  304. }
  305. static enum ssl_hs_wait_t do_read_client_second_flight(SSL *ssl,
  306. SSL_HANDSHAKE *hs) {
  307. /* Update the secret to the master secret and derive traffic keys. */
  308. static const uint8_t kZeroes[EVP_MAX_MD_SIZE] = {0};
  309. if (!tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len) ||
  310. !tls13_derive_traffic_secret_0(ssl) ||
  311. !tls13_set_traffic_key(ssl, type_data, evp_aead_seal,
  312. hs->traffic_secret_0, hs->hash_len)) {
  313. return ssl_hs_error;
  314. }
  315. hs->state = state_process_client_certificate;
  316. return ssl_hs_read_message;
  317. }
  318. static enum ssl_hs_wait_t do_process_client_certificate(SSL *ssl,
  319. SSL_HANDSHAKE *hs) {
  320. if (!ssl->s3->tmp.cert_request) {
  321. /* Skip this state. */
  322. hs->state = state_process_client_certificate_verify;
  323. return ssl_hs_ok;
  324. }
  325. if (!tls13_check_message_type(ssl, SSL3_MT_CERTIFICATE) ||
  326. !tls13_process_certificate(ssl) ||
  327. !ssl->method->hash_current_message(ssl)) {
  328. return ssl_hs_error;
  329. }
  330. hs->state = state_process_client_certificate_verify;
  331. return ssl_hs_read_message;
  332. }
  333. static enum ssl_hs_wait_t do_process_client_certificate_verify(
  334. SSL *ssl, SSL_HANDSHAKE *hs) {
  335. if (ssl->session->peer == NULL) {
  336. /* Skip this state. */
  337. hs->state = state_process_client_finished;
  338. return ssl_hs_ok;
  339. }
  340. if (!tls13_check_message_type(ssl, SSL3_MT_CERTIFICATE_VERIFY) ||
  341. !tls13_process_certificate_verify(ssl) ||
  342. !ssl->method->hash_current_message(ssl)) {
  343. return 0;
  344. }
  345. hs->state = state_process_client_finished;
  346. return ssl_hs_read_message;
  347. }
  348. static enum ssl_hs_wait_t do_process_client_finished(SSL *ssl,
  349. SSL_HANDSHAKE *hs) {
  350. if (!tls13_check_message_type(ssl, SSL3_MT_FINISHED) ||
  351. !tls13_process_finished(ssl) ||
  352. !ssl->method->hash_current_message(ssl) ||
  353. /* evp_aead_seal keys have already been switched. */
  354. !tls13_set_traffic_key(ssl, type_data, evp_aead_open,
  355. hs->traffic_secret_0, hs->hash_len) ||
  356. !tls13_finalize_keys(ssl)) {
  357. return ssl_hs_error;
  358. }
  359. hs->state = state_done;
  360. return ssl_hs_ok;
  361. }
  362. enum ssl_hs_wait_t tls13_server_handshake(SSL *ssl) {
  363. SSL_HANDSHAKE *hs = ssl->s3->hs;
  364. while (hs->state != state_done) {
  365. enum ssl_hs_wait_t ret = ssl_hs_error;
  366. enum server_hs_state_t state = hs->state;
  367. switch (state) {
  368. case state_process_client_hello:
  369. ret = do_process_client_hello(ssl, hs);
  370. break;
  371. case state_send_server_hello:
  372. ret = do_send_server_hello(ssl, hs);
  373. break;
  374. case state_send_encrypted_extensions:
  375. ret = do_send_encrypted_extensions(ssl, hs);
  376. break;
  377. case state_send_certificate_request:
  378. ret = do_send_certificate_request(ssl, hs);
  379. break;
  380. case state_send_server_certificate:
  381. ret = do_send_server_certificate(ssl, hs);
  382. break;
  383. case state_send_server_certificate_verify:
  384. ret = do_send_server_certificate_verify(ssl, hs, 1 /* first run */);
  385. break;
  386. case state_complete_server_certificate_verify:
  387. ret = do_send_server_certificate_verify(ssl, hs, 0 /* complete */);
  388. break;
  389. case state_send_server_finished:
  390. ret = do_send_server_finished(ssl, hs);
  391. break;
  392. case state_flush:
  393. ret = do_flush(ssl, hs);
  394. break;
  395. case state_read_client_second_flight:
  396. ret = do_read_client_second_flight(ssl, hs);
  397. break;
  398. case state_process_client_certificate:
  399. ret = do_process_client_certificate(ssl, hs);
  400. break;
  401. case state_process_client_certificate_verify:
  402. ret = do_process_client_certificate_verify(ssl, hs);
  403. break;
  404. case state_process_client_finished:
  405. ret = do_process_client_finished(ssl, hs);
  406. break;
  407. case state_done:
  408. ret = ssl_hs_ok;
  409. break;
  410. }
  411. if (ret != ssl_hs_ok) {
  412. return ret;
  413. }
  414. }
  415. return ssl_hs_ok;
  416. }