diff options
Diffstat (limited to 'src/lib/libssl/s3_cbc.c')
| -rw-r--r-- | src/lib/libssl/s3_cbc.c | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/src/lib/libssl/s3_cbc.c b/src/lib/libssl/s3_cbc.c index 74e0562c2d..4f84c9485b 100644 --- a/src/lib/libssl/s3_cbc.c +++ b/src/lib/libssl/s3_cbc.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s3_cbc.c,v 1.22 2020/06/19 21:26:40 tb Exp $ */ | 1 | /* $OpenBSD: s3_cbc.c,v 1.23 2020/10/03 17:35:16 jsing Exp $ */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 2012 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 2012 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| @@ -101,7 +101,7 @@ constant_time_eq_8(unsigned int a, unsigned int b) | |||
| 101 | return DUPLICATE_MSB_TO_ALL_8(c); | 101 | return DUPLICATE_MSB_TO_ALL_8(c); |
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | /* tls1_cbc_remove_padding removes the CBC padding from the decrypted, TLS, CBC | 104 | /* ssl3_cbc_remove_padding removes the CBC padding from the decrypted, TLS, CBC |
| 105 | * record in |rec| in constant time and returns 1 if the padding is valid and | 105 | * record in |rec| in constant time and returns 1 if the padding is valid and |
| 106 | * -1 otherwise. It also removes any explicit IV from the start of the record | 106 | * -1 otherwise. It also removes any explicit IV from the start of the record |
| 107 | * without leaking any timing about whether there was enough space after the | 107 | * without leaking any timing about whether there was enough space after the |
| @@ -113,26 +113,24 @@ constant_time_eq_8(unsigned int a, unsigned int b) | |||
| 113 | * 1: if the padding was valid | 113 | * 1: if the padding was valid |
| 114 | * -1: otherwise. */ | 114 | * -1: otherwise. */ |
| 115 | int | 115 | int |
| 116 | tls1_cbc_remove_padding(const SSL* s, SSL3_RECORD_INTERNAL *rec, | 116 | ssl3_cbc_remove_padding(SSL3_RECORD_INTERNAL *rec, unsigned int eiv_len, |
| 117 | unsigned int block_size, unsigned int mac_size) | 117 | unsigned int mac_size) |
| 118 | { | 118 | { |
| 119 | unsigned int padding_length, good, to_check, i; | 119 | unsigned int padding_length, good, to_check, i; |
| 120 | const unsigned int overhead = 1 /* padding length byte */ + mac_size; | 120 | const unsigned int overhead = 1 /* padding length byte */ + mac_size; |
| 121 | 121 | ||
| 122 | /* Check if version requires explicit IV */ | 122 | /* |
| 123 | if (SSL_USE_EXPLICIT_IV(s)) { | 123 | * These lengths are all public so we can test them in |
| 124 | /* These lengths are all public so we can test them in | 124 | * non-constant time. |
| 125 | * non-constant time. | 125 | */ |
| 126 | */ | 126 | if (overhead + eiv_len > rec->length) |
| 127 | if (overhead + block_size > rec->length) | ||
| 128 | return 0; | ||
| 129 | /* We can now safely skip explicit IV */ | ||
| 130 | rec->data += block_size; | ||
| 131 | rec->input += block_size; | ||
| 132 | rec->length -= block_size; | ||
| 133 | } else if (overhead > rec->length) | ||
| 134 | return 0; | 127 | return 0; |
| 135 | 128 | ||
| 129 | /* We can now safely skip explicit IV, if any. */ | ||
| 130 | rec->data += eiv_len; | ||
| 131 | rec->input += eiv_len; | ||
| 132 | rec->length -= eiv_len; | ||
| 133 | |||
| 136 | padding_length = rec->data[rec->length - 1]; | 134 | padding_length = rec->data[rec->length - 1]; |
| 137 | 135 | ||
| 138 | good = constant_time_ge(rec->length, overhead + padding_length); | 136 | good = constant_time_ge(rec->length, overhead + padding_length); |
