diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/tls13_client.c | 37 | ||||
| -rw-r--r-- | src/lib/libssl/tls13_handshake.c | 9 | ||||
| -rw-r--r-- | src/lib/libssl/tls13_internal.h | 3 |
3 files changed, 30 insertions, 19 deletions
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c index 07b9ede345..b842cbd39c 100644 --- a/src/lib/libssl/tls13_client.c +++ b/src/lib/libssl/tls13_client.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls13_client.c,v 1.20 2020/01/20 13:10:37 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_client.c,v 1.21 2020/01/21 03:40:05 beck Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -241,8 +241,8 @@ tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs) | |||
| 241 | uint16_t cipher_suite, legacy_version; | 241 | uint16_t cipher_suite, legacy_version; |
| 242 | uint8_t compression_method; | 242 | uint8_t compression_method; |
| 243 | const SSL_CIPHER *cipher; | 243 | const SSL_CIPHER *cipher; |
| 244 | int alert_desc; | ||
| 244 | SSL *s = ctx->ssl; | 245 | SSL *s = ctx->ssl; |
| 245 | int alert; | ||
| 246 | 246 | ||
| 247 | if (!CBS_get_u16(cbs, &legacy_version)) | 247 | if (!CBS_get_u16(cbs, &legacy_version)) |
| 248 | goto err; | 248 | goto err; |
| @@ -258,8 +258,10 @@ tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs) | |||
| 258 | if (tls13_server_hello_is_legacy(cbs)) | 258 | if (tls13_server_hello_is_legacy(cbs)) |
| 259 | return tls13_use_legacy_client(ctx); | 259 | return tls13_use_legacy_client(ctx); |
| 260 | 260 | ||
| 261 | if (!tlsext_client_parse(s, cbs, &alert, SSL_TLSEXT_MSG_SH)) | 261 | if (!tlsext_client_parse(s, cbs, &alert_desc, SSL_TLSEXT_MSG_SH)) { |
| 262 | ctx->alert = alert_desc; | ||
| 262 | goto err; | 263 | goto err; |
| 264 | } | ||
| 263 | 265 | ||
| 264 | if (CBS_len(cbs) != 0) | 266 | if (CBS_len(cbs) != 0) |
| 265 | goto err; | 267 | goto err; |
| @@ -273,14 +275,14 @@ tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs) | |||
| 273 | */ | 275 | */ |
| 274 | if (ctx->hs->server_version != 0) { | 276 | if (ctx->hs->server_version != 0) { |
| 275 | if (legacy_version != TLS1_2_VERSION) { | 277 | if (legacy_version != TLS1_2_VERSION) { |
| 276 | /* XXX - alert. */ | 278 | ctx->alert = SSL_AD_PROTOCOL_VERSION; |
| 277 | goto err; | 279 | goto err; |
| 278 | } | 280 | } |
| 279 | } else { | 281 | } else { |
| 280 | if (legacy_version < ctx->hs->min_version || | 282 | if (legacy_version < ctx->hs->min_version || |
| 281 | legacy_version > ctx->hs->max_version || | 283 | legacy_version > ctx->hs->max_version || |
| 282 | legacy_version > TLS1_2_VERSION) { | 284 | legacy_version > TLS1_2_VERSION) { |
| 283 | /* XXX - alert. */ | 285 | ctx->alert = SSL_AD_PROTOCOL_VERSION; |
| 284 | goto err; | 286 | goto err; |
| 285 | } | 287 | } |
| 286 | ctx->hs->server_version = legacy_version; | 288 | ctx->hs->server_version = legacy_version; |
| @@ -295,19 +297,19 @@ tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs) | |||
| 295 | cipher = ssl3_get_cipher_by_value(cipher_suite); | 297 | cipher = ssl3_get_cipher_by_value(cipher_suite); |
| 296 | if (cipher == NULL || | 298 | if (cipher == NULL || |
| 297 | sk_SSL_CIPHER_find(ssl_get_ciphers_by_id(s), cipher) < 0) { | 299 | sk_SSL_CIPHER_find(ssl_get_ciphers_by_id(s), cipher) < 0) { |
| 298 | /* XXX - alert. */ | 300 | ctx->alert = SSL_AD_ILLEGAL_PARAMETER; |
| 299 | goto err; | 301 | goto err; |
| 300 | } | 302 | } |
| 301 | if (ctx->hs->server_version == TLS1_3_VERSION && | 303 | if (ctx->hs->server_version == TLS1_3_VERSION && |
| 302 | cipher->algorithm_ssl != SSL_TLSV1_3) { | 304 | cipher->algorithm_ssl != SSL_TLSV1_3) { |
| 303 | /* XXX - alert. */ | 305 | ctx->alert = SSL_AD_ILLEGAL_PARAMETER; |
| 304 | goto err; | 306 | goto err; |
| 305 | } | 307 | } |
| 306 | /* XXX - move this to hs_tls13? */ | 308 | /* XXX - move this to hs_tls13? */ |
| 307 | S3I(s)->hs.new_cipher = cipher; | 309 | S3I(s)->hs.new_cipher = cipher; |
| 308 | 310 | ||
| 309 | if (compression_method != 0) { | 311 | if (compression_method != 0) { |
| 310 | /* XXX - alert. */ | 312 | ctx->alert = SSL_AD_ILLEGAL_PARAMETER; |
| 311 | goto err; | 313 | goto err; |
| 312 | } | 314 | } |
| 313 | 315 | ||
| @@ -318,8 +320,8 @@ tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs) | |||
| 318 | return 1; | 320 | return 1; |
| 319 | 321 | ||
| 320 | err: | 322 | err: |
| 321 | /* XXX - send alert. */ | 323 | if (ctx->alert == 0) |
| 322 | 324 | ctx->alert = TLS1_AD_DECODE_ERROR; | |
| 323 | return 0; | 325 | return 0; |
| 324 | } | 326 | } |
| 325 | 327 | ||
| @@ -407,14 +409,16 @@ tls13_server_hello_recv(struct tls13_ctx *ctx) | |||
| 407 | int | 409 | int |
| 408 | tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx) | 410 | tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx) |
| 409 | { | 411 | { |
| 410 | int alert; | ||
| 411 | CBS cbs; | 412 | CBS cbs; |
| 413 | int alert_desc; | ||
| 412 | 414 | ||
| 413 | if (!tls13_handshake_msg_content(ctx->hs_msg, &cbs)) | 415 | if (!tls13_handshake_msg_content(ctx->hs_msg, &cbs)) |
| 414 | goto err; | 416 | goto err; |
| 415 | 417 | ||
| 416 | if (!tlsext_client_parse(ctx->ssl, &cbs, &alert, SSL_TLSEXT_MSG_EE)) | 418 | if (!tlsext_client_parse(ctx->ssl, &cbs, &alert_desc, SSL_TLSEXT_MSG_EE)) { |
| 419 | ctx->alert = alert_desc; | ||
| 417 | goto err; | 420 | goto err; |
| 421 | } | ||
| 418 | 422 | ||
| 419 | if (CBS_len(&cbs) != 0) | 423 | if (CBS_len(&cbs) != 0) |
| 420 | goto err; | 424 | goto err; |
| @@ -422,8 +426,8 @@ tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx) | |||
| 422 | return 1; | 426 | return 1; |
| 423 | 427 | ||
| 424 | err: | 428 | err: |
| 425 | /* XXX - send alert. */ | 429 | if (ctx->alert == 0) |
| 426 | 430 | ctx->alert = TLS1_AD_DECODE_ERROR; | |
| 427 | return 0; | 431 | return 0; |
| 428 | } | 432 | } |
| 429 | 433 | ||
| @@ -627,13 +631,14 @@ tls13_server_certificate_verify_recv(struct tls13_ctx *ctx) | |||
| 627 | goto err; | 631 | goto err; |
| 628 | if (EVP_DigestVerifyFinal(mdctx, CBS_data(&signature), | 632 | if (EVP_DigestVerifyFinal(mdctx, CBS_data(&signature), |
| 629 | CBS_len(&signature)) <= 0) { | 633 | CBS_len(&signature)) <= 0) { |
| 630 | /* XXX - send alert. */ | ||
| 631 | goto err; | 634 | goto err; |
| 632 | } | 635 | } |
| 633 | 636 | ||
| 634 | ret = 1; | 637 | ret = 1; |
| 635 | 638 | ||
| 636 | err: | 639 | err: |
| 640 | if (!ret) | ||
| 641 | ctx->alert = TLS1_AD_DECODE_ERROR; | ||
| 637 | CBB_cleanup(&cbb); | 642 | CBB_cleanup(&cbb); |
| 638 | EVP_MD_CTX_free(mdctx); | 643 | EVP_MD_CTX_free(mdctx); |
| 639 | free(sig_content); | 644 | free(sig_content); |
| @@ -688,7 +693,7 @@ tls13_server_finished_recv(struct tls13_ctx *ctx) | |||
| 688 | goto err; | 693 | goto err; |
| 689 | 694 | ||
| 690 | if (!CBS_mem_equal(&cbs, verify_data, verify_data_len)) { | 695 | if (!CBS_mem_equal(&cbs, verify_data, verify_data_len)) { |
| 691 | /* XXX - send alert. */ | 696 | ctx->alert = TLS1_AD_DECRYPTION_FAILED; |
| 692 | goto err; | 697 | goto err; |
| 693 | } | 698 | } |
| 694 | 699 | ||
diff --git a/src/lib/libssl/tls13_handshake.c b/src/lib/libssl/tls13_handshake.c index c86187caec..48a01d3ca4 100644 --- a/src/lib/libssl/tls13_handshake.c +++ b/src/lib/libssl/tls13_handshake.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls13_handshake.c,v 1.37 2020/01/20 22:04:17 beck Exp $ */ | 1 | /* $OpenBSD: tls13_handshake.c,v 1.38 2020/01/21 03:40:05 beck Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2018-2019 Theo Buehler <tb@openbsd.org> | 3 | * Copyright (c) 2018-2019 Theo Buehler <tb@openbsd.org> |
| 4 | * Copyright (c) 2019 Joel Sing <jsing@openbsd.org> | 4 | * Copyright (c) 2019 Joel Sing <jsing@openbsd.org> |
| @@ -291,7 +291,8 @@ tls13_handshake_perform(struct tls13_ctx *ctx) | |||
| 291 | ctx->handshake_completed = 1; | 291 | ctx->handshake_completed = 1; |
| 292 | tls13_record_layer_handshake_completed(ctx->rl); | 292 | tls13_record_layer_handshake_completed(ctx->rl); |
| 293 | return TLS13_IO_SUCCESS; | 293 | return TLS13_IO_SUCCESS; |
| 294 | } | 294 | } else if (ctx->alert) |
| 295 | return tls13_send_alert(ctx->rl, ctx->alert); | ||
| 295 | 296 | ||
| 296 | if (action->sender == ctx->mode) { | 297 | if (action->sender == ctx->mode) { |
| 297 | if ((ret = tls13_handshake_send_action(ctx, action)) <= 0) | 298 | if ((ret = tls13_handshake_send_action(ctx, action)) <= 0) |
| @@ -329,6 +330,8 @@ tls13_handshake_send_action(struct tls13_ctx *ctx, | |||
| 329 | /* XXX - provide CBB. */ | 330 | /* XXX - provide CBB. */ |
| 330 | if (!action->send(ctx)) | 331 | if (!action->send(ctx)) |
| 331 | return TLS13_IO_FAILURE; | 332 | return TLS13_IO_FAILURE; |
| 333 | else if (ctx->alert) | ||
| 334 | return tls13_send_alert(ctx->rl, ctx->alert); | ||
| 332 | } | 335 | } |
| 333 | 336 | ||
| 334 | if ((ret = tls13_handshake_msg_send(ctx->hs_msg, ctx->rl)) <= 0) | 337 | if ((ret = tls13_handshake_msg_send(ctx->hs_msg, ctx->rl)) <= 0) |
| @@ -389,6 +392,8 @@ tls13_handshake_recv_action(struct tls13_ctx *ctx, | |||
| 389 | ret = TLS13_IO_FAILURE; | 392 | ret = TLS13_IO_FAILURE; |
| 390 | if (action->recv(ctx)) | 393 | if (action->recv(ctx)) |
| 391 | ret = TLS13_IO_SUCCESS; | 394 | ret = TLS13_IO_SUCCESS; |
| 395 | else if (ctx->alert) | ||
| 396 | ret = tls13_send_alert(ctx->rl, ctx->alert); | ||
| 392 | 397 | ||
| 393 | tls13_handshake_msg_free(ctx->hs_msg); | 398 | tls13_handshake_msg_free(ctx->hs_msg); |
| 394 | ctx->hs_msg = NULL; | 399 | ctx->hs_msg = NULL; |
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h index 41833f233f..530ace41af 100644 --- a/src/lib/libssl/tls13_internal.h +++ b/src/lib/libssl/tls13_internal.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls13_internal.h,v 1.37 2020/01/20 13:10:37 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_internal.h,v 1.38 2020/01/21 03:40:05 beck Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2018 Bob Beck <beck@openbsd.org> | 3 | * Copyright (c) 2018 Bob Beck <beck@openbsd.org> |
| 4 | * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> | 4 | * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> |
| @@ -186,6 +186,7 @@ struct tls13_ctx { | |||
| 186 | struct tls13_record_layer *rl; | 186 | struct tls13_record_layer *rl; |
| 187 | struct tls13_handshake_msg *hs_msg; | 187 | struct tls13_handshake_msg *hs_msg; |
| 188 | uint8_t key_update_request; | 188 | uint8_t key_update_request; |
| 189 | uint8_t alert; | ||
| 189 | int phh_count; | 190 | int phh_count; |
| 190 | time_t phh_last_seen; | 191 | time_t phh_last_seen; |
| 191 | }; | 192 | }; |
