2 * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #include <openssl/evp.h>
11 #include <openssl/core_names.h>
12 #include "internal/ssl3_cbc.h"
13 #include "../../ssl_local.h"
14 #include "../record_local.h"
15 #include "recmethod_local.h"
17 static int ssl3_set_crypto_state(OSSL_RECORD_LAYER
*rl
, int level
,
18 unsigned char *key
, size_t keylen
,
19 unsigned char *iv
, size_t ivlen
,
20 unsigned char *mackey
, size_t mackeylen
,
21 const EVP_CIPHER
*ciph
,
27 EVP_CIPHER_CTX
*ciph_ctx
;
28 int enc
= (rl
->direction
== OSSL_RECORD_DIRECTION_WRITE
) ? 1 : 0;
31 ERR_raise(ERR_LIB_SSL
, ERR_R_INTERNAL_ERROR
);
32 return OSSL_RECORD_RETURN_FATAL
;
35 if ((rl
->enc_ctx
= EVP_CIPHER_CTX_new()) == NULL
) {
36 ERR_raise(ERR_LIB_SSL
, ERR_R_INTERNAL_ERROR
);
37 return OSSL_RECORD_RETURN_FATAL
;
39 ciph_ctx
= rl
->enc_ctx
;
41 rl
->md_ctx
= EVP_MD_CTX_new();
42 if (rl
->md_ctx
== NULL
) {
43 ERR_raise(ERR_LIB_SSL
, ERR_R_INTERNAL_ERROR
);
44 return OSSL_RECORD_RETURN_FATAL
;
47 if ((md
!= NULL
&& EVP_DigestInit_ex(rl
->md_ctx
, md
, NULL
) <= 0)) {
48 ERR_raise(ERR_LIB_SSL
, ERR_R_INTERNAL_ERROR
);
49 return OSSL_RECORD_RETURN_FATAL
;
52 #ifndef OPENSSL_NO_COMP
54 rl
->compctx
= COMP_CTX_new(comp
);
55 if (rl
->compctx
== NULL
) {
56 ERR_raise(ERR_LIB_SSL
, SSL_R_COMPRESSION_LIBRARY_ERROR
);
57 return OSSL_RECORD_RETURN_FATAL
;
62 if (!EVP_CipherInit_ex(ciph_ctx
, ciph
, NULL
, key
, iv
, enc
)) {
63 ERR_raise(ERR_LIB_SSL
, ERR_R_INTERNAL_ERROR
);
64 return OSSL_RECORD_RETURN_FATAL
;
68 * The cipher we actually ended up using in the EVP_CIPHER_CTX may be
69 * different to that in ciph if we have an ENGINE in use
71 if (EVP_CIPHER_get0_provider(EVP_CIPHER_CTX_get0_cipher(ciph_ctx
)) != NULL
72 && !ossl_set_tls_provider_parameters(rl
, ciph_ctx
, ciph
, md
)) {
73 /* ERR_raise already called */
74 return OSSL_RECORD_RETURN_FATAL
;
77 if (mackeylen
> sizeof(rl
->mac_secret
)) {
78 ERR_raise(ERR_LIB_SSL
, ERR_R_INTERNAL_ERROR
);
79 return OSSL_RECORD_RETURN_FATAL
;
81 memcpy(rl
->mac_secret
, mackey
, mackeylen
);
83 return OSSL_RECORD_RETURN_SUCCESS
;
87 * ssl3_cipher encrypts/decrypts |n_recs| records in |inrecs|. Calls RLAYERfatal
88 * on internal error, but not otherwise. It is the responsibility of the caller
89 * to report a bad_record_mac
92 * 0: if the record is publicly invalid, or an internal error
93 * 1: Success or Mac-then-encrypt decryption failed (MAC will be randomised)
95 static int ssl3_cipher(OSSL_RECORD_LAYER
*rl
, TLS_RL_RECORD
*inrecs
,
96 size_t n_recs
, int sending
, SSL_MAC_BUF
*mac
,
103 const EVP_CIPHER
*enc
;
108 * We shouldn't ever be called with more than one record in the SSLv3 case
114 if (ds
== NULL
|| (enc
= EVP_CIPHER_CTX_get0_cipher(ds
)) == NULL
)
117 provided
= (EVP_CIPHER_get0_provider(enc
) != NULL
);
120 bs
= EVP_CIPHER_CTX_get_block_size(ds
);
127 if ((bs
!= 1) && sending
&& !provided
) {
129 * We only do this for legacy ciphers. Provided ciphers add the
130 * padding on the provider side.
134 /* we need to add 'i-1' padding bytes */
137 * the last of these zero bytes will be overwritten with the
140 memset(&rec
->input
[rec
->length
], 0, i
);
142 rec
->input
[l
- 1] = (unsigned char)(i
- 1);
146 if (l
== 0 || l
% bs
!= 0) {
147 /* Publicly invalid */
150 /* otherwise, rec->length >= bs */
156 if (!EVP_CipherUpdate(ds
, rec
->data
, &outlen
, rec
->input
,
159 rec
->length
= outlen
;
161 if (!sending
&& mac
!= NULL
) {
162 /* Now get a pointer to the MAC */
163 OSSL_PARAM params
[2], *p
= params
;
168 *p
++ = OSSL_PARAM_construct_octet_ptr(OSSL_CIPHER_PARAM_TLS_MAC
,
171 *p
= OSSL_PARAM_construct_end();
173 if (!EVP_CIPHER_CTX_get_params(ds
, params
)) {
174 /* Shouldn't normally happen */
175 RLAYERfatal(rl
, SSL_AD_INTERNAL_ERROR
, ERR_R_INTERNAL_ERROR
);
180 if (EVP_Cipher(ds
, rec
->data
, rec
->input
, (unsigned int)l
) < 1) {
181 /* Shouldn't happen */
182 RLAYERfatal(rl
, SSL_AD_BAD_RECORD_MAC
, ERR_R_INTERNAL_ERROR
);
187 return ssl3_cbc_remove_padding_and_mac(&rec
->length
,
190 (mac
!= NULL
) ? &mac
->mac
: NULL
,
191 (mac
!= NULL
) ? &mac
->alloced
: NULL
,
200 static const unsigned char ssl3_pad_1
[48] = {
201 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
202 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
203 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
204 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
205 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
206 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
209 static const unsigned char ssl3_pad_2
[48] = {
210 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
211 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
212 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
213 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
214 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
215 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
218 static int ssl3_mac(OSSL_RECORD_LAYER
*rl
, TLS_RL_RECORD
*rec
, unsigned char *md
,
221 unsigned char *mac_sec
, *seq
= rl
->sequence
;
222 const EVP_MD_CTX
*hash
;
223 unsigned char *p
, rec_char
;
228 mac_sec
= &(rl
->mac_secret
[0]);
231 t
= EVP_MD_CTX_get_size(hash
);
235 npad
= (48 / md_size
) * md_size
;
238 && EVP_CIPHER_CTX_get_mode(rl
->enc_ctx
) == EVP_CIPH_CBC_MODE
239 && ssl3_cbc_record_digest_supported(hash
)) {
240 #ifdef OPENSSL_NO_DEPRECATED_3_0
244 * This is a CBC-encrypted record. We must avoid leaking any
245 * timing-side channel information about how many blocks of data we
246 * are hashing because that gives an attacker a timing-oracle.
250 * npad is, at most, 48 bytes and that's with MD5:
251 * 16 + 48 + 8 (sequence bytes) + 1 + 2 = 75.
253 * With SHA-1 (the largest hash speced for SSLv3) the hash size
254 * goes up 4, but npad goes down by 8, resulting in a smaller
257 unsigned char header
[75];
259 memcpy(header
+ j
, mac_sec
, md_size
);
261 memcpy(header
+ j
, ssl3_pad_1
, npad
);
263 memcpy(header
+ j
, seq
, 8);
265 header
[j
++] = rec
->type
;
266 header
[j
++] = (unsigned char)(rec
->length
>> 8);
267 header
[j
++] = (unsigned char)(rec
->length
& 0xff);
269 /* Final param == is SSLv3 */
270 if (ssl3_cbc_digest_record(EVP_MD_CTX_get0_md(hash
),
273 rec
->length
, rec
->orig_len
,
274 mac_sec
, md_size
, 1) <= 0)
278 unsigned int md_size_u
;
279 /* Chop the digest off the end :-) */
280 EVP_MD_CTX
*md_ctx
= EVP_MD_CTX_new();
285 rec_char
= rec
->type
;
288 if (EVP_MD_CTX_copy_ex(md_ctx
, hash
) <= 0
289 || EVP_DigestUpdate(md_ctx
, mac_sec
, md_size
) <= 0
290 || EVP_DigestUpdate(md_ctx
, ssl3_pad_1
, npad
) <= 0
291 || EVP_DigestUpdate(md_ctx
, seq
, 8) <= 0
292 || EVP_DigestUpdate(md_ctx
, &rec_char
, 1) <= 0
293 || EVP_DigestUpdate(md_ctx
, md
, 2) <= 0
294 || EVP_DigestUpdate(md_ctx
, rec
->input
, rec
->length
) <= 0
295 || EVP_DigestFinal_ex(md_ctx
, md
, NULL
) <= 0
296 || EVP_MD_CTX_copy_ex(md_ctx
, hash
) <= 0
297 || EVP_DigestUpdate(md_ctx
, mac_sec
, md_size
) <= 0
298 || EVP_DigestUpdate(md_ctx
, ssl3_pad_2
, npad
) <= 0
299 || EVP_DigestUpdate(md_ctx
, md
, md_size
) <= 0
300 || EVP_DigestFinal_ex(md_ctx
, md
, &md_size_u
) <= 0) {
301 EVP_MD_CTX_free(md_ctx
);
305 EVP_MD_CTX_free(md_ctx
);
308 if (!tls_increment_sequence_ctr(rl
))
314 struct record_functions_st ssl_3_0_funcs
= {
315 ssl3_set_crypto_state
,
318 tls_default_set_protocol_version
,
320 tls_get_more_records
,
321 tls_default_validate_record_header
,
322 tls_default_post_process_record
,
323 tls_get_max_records_default
,
324 tls_write_records_default
,
325 /* These 2 functions are defined in tls1_meth.c */
326 tls1_allocate_write_buffers
,
327 tls1_initialise_write_packets
,
329 tls_prepare_record_header_default
,
331 tls_prepare_for_encryption_default
,
332 tls_post_encryption_processing_default
,