diff options
author | jsing <> | 2018-08-22 17:46:29 +0000 |
---|---|---|
committer | jsing <> | 2018-08-22 17:46:29 +0000 |
commit | 0efe9a67702e1062521567f7091216b2696777ff (patch) | |
tree | b52e454e7bc5ac62631455c9e2c1b0a0cae923a8 /src | |
parent | 53e398d973627d7a56dacc2650fcb0c86edff951 (diff) | |
download | openbsd-0efe9a67702e1062521567f7091216b2696777ff.tar.gz openbsd-0efe9a67702e1062521567f7091216b2696777ff.tar.bz2 openbsd-0efe9a67702e1062521567f7091216b2696777ff.zip |
Correct session ticket encryption.
The CBB conversion resulted in the ticket encryption being handled
incorrectly, resulting in only the last block being used. Fix this and
restore the previous behaviour.
Issue found by inoguchi@ and sebastia@.
ok inoguchi@ and tb@
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index 01fe647500..3cf6d9a3cb 100644 --- a/src/lib/libssl/ssl_srvr.c +++ b/src/lib/libssl/ssl_srvr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_srvr.c,v 1.41 2018/08/19 15:38:03 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.42 2018/08/22 17:46:29 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -2532,7 +2532,7 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2532 | const unsigned char *const_p; | 2532 | const unsigned char *const_p; |
2533 | unsigned char *p, *hmac; | 2533 | unsigned char *p, *hmac; |
2534 | size_t hmac_len; | 2534 | size_t hmac_len; |
2535 | int enc_ticket_len, slen; | 2535 | int enc_ticket_len, len, slen; |
2536 | int slen_full = 0; | 2536 | int slen_full = 0; |
2537 | SSL_SESSION *sess; | 2537 | SSL_SESSION *sess; |
2538 | unsigned int hlen; | 2538 | unsigned int hlen; |
@@ -2610,9 +2610,16 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2610 | /* Encrypt the session ticket. */ | 2610 | /* Encrypt the session ticket. */ |
2611 | if ((enc_ticket = calloc(1, slen + EVP_MAX_BLOCK_LENGTH)) == NULL) | 2611 | if ((enc_ticket = calloc(1, slen + EVP_MAX_BLOCK_LENGTH)) == NULL) |
2612 | goto err; | 2612 | goto err; |
2613 | if (!EVP_EncryptUpdate(&ctx, enc_ticket, &enc_ticket_len, senc, slen)) | 2613 | enc_ticket_len = 0; |
2614 | if (!EVP_EncryptUpdate(&ctx, enc_ticket, &len, senc, slen)) | ||
2614 | goto err; | 2615 | goto err; |
2615 | if (!EVP_EncryptFinal_ex(&ctx, enc_ticket, &enc_ticket_len)) | 2616 | enc_ticket_len += len; |
2617 | if (!EVP_EncryptFinal_ex(&ctx, enc_ticket + enc_ticket_len, &len)) | ||
2618 | goto err; | ||
2619 | enc_ticket_len += len; | ||
2620 | |||
2621 | if (enc_ticket_len < 0 || | ||
2622 | enc_ticket_len > slen + EVP_MAX_BLOCK_LENGTH) | ||
2616 | goto err; | 2623 | goto err; |
2617 | 2624 | ||
2618 | /* Generate the HMAC. */ | 2625 | /* Generate the HMAC. */ |