diff options
| author | beck <> | 2020-06-06 01:40:09 +0000 |
|---|---|---|
| committer | beck <> | 2020-06-06 01:40:09 +0000 |
| commit | 2d835ca8318d9ce502e9fd2dced3ef440decb39d (patch) | |
| tree | 921562c039b5a27a1e18f71fe397784a1d3435d3 /src/lib/libssl/tls13_lib.c | |
| parent | f599916be5b15add90651fc8802c4f96fc257310 (diff) | |
| download | openbsd-2d835ca8318d9ce502e9fd2dced3ef440decb39d.tar.gz openbsd-2d835ca8318d9ce502e9fd2dced3ef440decb39d.tar.bz2 openbsd-2d835ca8318d9ce502e9fd2dced3ef440decb39d.zip | |
Implement a rolling hash of the ClientHello message, Enforce RFC 8446
section 4.1.2 to ensure subsequent ClientHello messages after a
HelloRetryRequest messages must be unchanged from the initial
ClientHello.
ok tb@ jsing@
Diffstat (limited to 'src/lib/libssl/tls13_lib.c')
| -rw-r--r-- | src/lib/libssl/tls13_lib.c | 81 |
1 files changed, 80 insertions, 1 deletions
diff --git a/src/lib/libssl/tls13_lib.c b/src/lib/libssl/tls13_lib.c index 174da2f9c3..b5939aecab 100644 --- a/src/lib/libssl/tls13_lib.c +++ b/src/lib/libssl/tls13_lib.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls13_lib.c,v 1.50 2020/05/22 02:37:27 beck Exp $ */ | 1 | /* $OpenBSD: tls13_lib.c,v 1.51 2020/06/06 01:40:09 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 | * Copyright (c) 2019 Bob Beck <beck@openbsd.org> | 4 | * Copyright (c) 2019 Bob Beck <beck@openbsd.org> |
| @@ -486,3 +486,82 @@ tls13_synthetic_handshake_message(struct tls13_ctx *ctx) | |||
| 486 | 486 | ||
| 487 | return ret; | 487 | return ret; |
| 488 | } | 488 | } |
| 489 | |||
| 490 | int | ||
| 491 | tls13_clienthello_hash_init(struct tls13_ctx *ctx) | ||
| 492 | { | ||
| 493 | if (ctx->hs->clienthello_md_ctx != NULL) | ||
| 494 | return 0; | ||
| 495 | if ((ctx->hs->clienthello_md_ctx = EVP_MD_CTX_new()) == NULL) | ||
| 496 | return 0; | ||
| 497 | if (!EVP_DigestInit_ex(ctx->hs->clienthello_md_ctx, | ||
| 498 | EVP_sha256(), NULL)) | ||
| 499 | return 0; | ||
| 500 | |||
| 501 | if ((ctx->hs->clienthello_hash == NULL) && | ||
| 502 | (ctx->hs->clienthello_hash = calloc(1, EVP_MAX_MD_SIZE)) == | ||
| 503 | NULL) | ||
| 504 | return 0; | ||
| 505 | |||
| 506 | return 1; | ||
| 507 | } | ||
| 508 | |||
| 509 | void | ||
| 510 | tls13_clienthello_hash_clear(struct ssl_handshake_tls13_st *hs) | ||
| 511 | { | ||
| 512 | EVP_MD_CTX_free(hs->clienthello_md_ctx); | ||
| 513 | hs->clienthello_md_ctx = NULL; | ||
| 514 | freezero(hs->clienthello_hash, EVP_MAX_MD_SIZE); | ||
| 515 | hs->clienthello_hash = NULL; | ||
| 516 | } | ||
| 517 | |||
| 518 | int | ||
| 519 | tls13_clienthello_hash_update_bytes(struct tls13_ctx *ctx, void *data, | ||
| 520 | size_t len) | ||
| 521 | { | ||
| 522 | return EVP_DigestUpdate(ctx->hs->clienthello_md_ctx, data, len); | ||
| 523 | } | ||
| 524 | |||
| 525 | int | ||
| 526 | tls13_clienthello_hash_update(struct tls13_ctx *ctx, CBS *cbs) | ||
| 527 | { | ||
| 528 | return tls13_clienthello_hash_update_bytes(ctx, (void *)CBS_data(cbs), | ||
| 529 | CBS_len(cbs)); | ||
| 530 | } | ||
| 531 | |||
| 532 | int | ||
| 533 | tls13_clienthello_hash_finalize(struct tls13_ctx *ctx) | ||
| 534 | { | ||
| 535 | if (!EVP_DigestFinal_ex(ctx->hs->clienthello_md_ctx, | ||
| 536 | ctx->hs->clienthello_hash, | ||
| 537 | &ctx->hs->clienthello_hash_len)) | ||
| 538 | return 0; | ||
| 539 | EVP_MD_CTX_free(ctx->hs->clienthello_md_ctx); | ||
| 540 | ctx->hs->clienthello_md_ctx = NULL; | ||
| 541 | return 1; | ||
| 542 | } | ||
| 543 | |||
| 544 | int | ||
| 545 | tls13_clienthello_hash_validate(struct tls13_ctx *ctx) | ||
| 546 | { | ||
| 547 | unsigned char new_ch_hash[EVP_MAX_MD_SIZE]; | ||
| 548 | unsigned int new_ch_hash_len; | ||
| 549 | |||
| 550 | if (ctx->hs->clienthello_hash == NULL) | ||
| 551 | return 0; | ||
| 552 | |||
| 553 | if (!EVP_DigestFinal_ex(ctx->hs->clienthello_md_ctx, | ||
| 554 | new_ch_hash, &new_ch_hash_len)) | ||
| 555 | return 0; | ||
| 556 | EVP_MD_CTX_free(ctx->hs->clienthello_md_ctx); | ||
| 557 | ctx->hs->clienthello_md_ctx = NULL; | ||
| 558 | |||
| 559 | if (ctx->hs->clienthello_hash_len != new_ch_hash_len) | ||
| 560 | return 0; | ||
| 561 | if (memcmp(ctx->hs->clienthello_hash, new_ch_hash, | ||
| 562 | new_ch_hash_len) != 0) | ||
| 563 | return 0; | ||
| 564 | |||
| 565 | return 1; | ||
| 566 | } | ||
| 567 | |||
