Skip to content

Commit 2582de2

Browse files
committed
Move record padding out of tls_common.c
Only tls13_meth.c needs to handle adding record padding. All other *_meth.c files can ignore it. Reviewed-by: Hugo Landau <hlandau@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from openssl#19343)
1 parent b6f7519 commit 2582de2

7 files changed

Lines changed: 79 additions & 54 deletions

File tree

ssl/record/methods/ktls_meth.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,8 @@ static struct record_functions_st ossl_ktls_funcs = {
506506
ktls_allocate_write_buffers,
507507
ktls_initialise_write_packets,
508508
NULL,
509-
ktls_prepare_record_header
509+
ktls_prepare_record_header,
510+
NULL
510511
};
511512

512513
const OSSL_RECORD_METHOD ossl_ktls_record_method = {

ssl/record/methods/recmethod_local.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ struct record_functions_st
105105
OSSL_RECORD_TEMPLATE *templ,
106106
unsigned int rectype,
107107
unsigned char **recdata);
108+
109+
int (*add_record_padding)(OSSL_RECORD_LAYER *rl,
110+
OSSL_RECORD_TEMPLATE *thistempl,
111+
WPACKET *thispkt,
112+
SSL3_RECORD *thiswr);
108113
};
109114

110115
struct ossl_record_layer_st

ssl/record/methods/ssl3_meth.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,5 +315,6 @@ struct record_functions_st ssl_3_0_funcs = {
315315
tls1_allocate_write_buffers,
316316
tls1_initialise_write_packets,
317317
NULL,
318-
tls_prepare_record_header_default
318+
tls_prepare_record_header_default,
319+
NULL
319320
};

ssl/record/methods/tls13_meth.c

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,62 @@ static unsigned int tls13_get_record_type(OSSL_RECORD_LAYER *rl,
253253
return SSL3_RT_APPLICATION_DATA;
254254
}
255255

256+
static int tls13_add_record_padding(OSSL_RECORD_LAYER *rl,
257+
OSSL_RECORD_TEMPLATE *thistempl,
258+
WPACKET *thispkt,
259+
SSL3_RECORD *thiswr)
260+
{
261+
size_t rlen;
262+
263+
/* Nothing to be done in the case of a plaintext alert */
264+
if (rl->allow_plain_alerts && thistempl->type != SSL3_RT_ALERT)
265+
return 1;
266+
267+
if (!WPACKET_put_bytes_u8(thispkt, thistempl->type)) {
268+
RLAYERfatal(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
269+
return 0;
270+
}
271+
SSL3_RECORD_add_length(thiswr, 1);
272+
273+
/* Add TLS1.3 padding */
274+
rlen = SSL3_RECORD_get_length(thiswr);
275+
if (rlen < rl->max_frag_len) {
276+
size_t padding = 0;
277+
size_t max_padding = rl->max_frag_len - rlen;
278+
279+
if (rl->padding != NULL) {
280+
padding = rl->padding(rl->cbarg, thistempl->type, rlen);
281+
} else if (rl->block_padding > 0) {
282+
size_t mask = rl->block_padding - 1;
283+
size_t remainder;
284+
285+
/* optimize for power of 2 */
286+
if ((rl->block_padding & mask) == 0)
287+
remainder = rlen & mask;
288+
else
289+
remainder = rlen % rl->block_padding;
290+
/* don't want to add a block of padding if we don't have to */
291+
if (remainder == 0)
292+
padding = 0;
293+
else
294+
padding = rl->block_padding - remainder;
295+
}
296+
if (padding > 0) {
297+
/* do not allow the record to exceed max plaintext length */
298+
if (padding > max_padding)
299+
padding = max_padding;
300+
if (!WPACKET_memset(thispkt, 0, padding)) {
301+
RLAYERfatal(rl, SSL_AD_INTERNAL_ERROR,
302+
ERR_R_INTERNAL_ERROR);
303+
return 0;
304+
}
305+
SSL3_RECORD_add_length(thiswr, padding);
306+
}
307+
}
308+
309+
return 1;
310+
}
311+
256312
struct record_functions_st tls_1_3_funcs = {
257313
tls13_set_crypto_state,
258314
tls13_cipher,
@@ -267,5 +323,6 @@ struct record_functions_st tls_1_3_funcs = {
267323
tls_allocate_write_buffers_default,
268324
tls_initialise_write_packets_default,
269325
tls13_get_record_type,
270-
tls_prepare_record_header_default
326+
tls_prepare_record_header_default,
327+
tls13_add_record_padding
271328
};

ssl/record/methods/tls1_meth.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,8 @@ struct record_functions_st tls_1_funcs = {
656656
tls1_allocate_write_buffers,
657657
tls1_initialise_write_packets,
658658
NULL,
659-
tls_prepare_record_header_default
659+
tls_prepare_record_header_default,
660+
NULL
660661
};
661662

662663
struct record_functions_st dtls_1_funcs = {
@@ -672,5 +673,6 @@ struct record_functions_st dtls_1_funcs = {
672673
NULL,
673674
NULL,
674675
NULL,
676+
NULL,
675677
NULL
676678
};

ssl/record/methods/tls_common.c

Lines changed: 6 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,7 +1628,7 @@ int tls_write_records_default(OSSL_RECORD_LAYER *rl,
16281628

16291629
if (!rl->funcs->prepare_record_header(rl, thispkt, thistempl, rectype,
16301630
&compressdata)) {
1631-
RLAYERfatal(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1631+
/* RLAYERfatal() already called */
16321632
goto err;
16331633
}
16341634

@@ -1658,54 +1658,11 @@ int tls_write_records_default(OSSL_RECORD_LAYER *rl,
16581658
SSL3_RECORD_reset_input(&wr[j]);
16591659
}
16601660

1661-
if (rl->version == TLS1_3_VERSION
1662-
&& !using_ktls
1663-
&& rl->enc_ctx != NULL
1664-
&& (!rl->allow_plain_alerts
1665-
|| thistempl->type != SSL3_RT_ALERT)) {
1666-
size_t rlen;
1667-
1668-
if (!WPACKET_put_bytes_u8(thispkt, thistempl->type)) {
1669-
RLAYERfatal(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1670-
goto err;
1671-
}
1672-
SSL3_RECORD_add_length(thiswr, 1);
1673-
1674-
/* Add TLS1.3 padding */
1675-
rlen = SSL3_RECORD_get_length(thiswr);
1676-
if (rlen < rl->max_frag_len) {
1677-
size_t padding = 0;
1678-
size_t max_padding = rl->max_frag_len - rlen;
1679-
1680-
if (rl->padding != NULL) {
1681-
padding = rl->padding(rl->cbarg, thistempl->type, rlen);
1682-
} else if (rl->block_padding > 0) {
1683-
size_t mask = rl->block_padding - 1;
1684-
size_t remainder;
1685-
1686-
/* optimize for power of 2 */
1687-
if ((rl->block_padding & mask) == 0)
1688-
remainder = rlen & mask;
1689-
else
1690-
remainder = rlen % rl->block_padding;
1691-
/* don't want to add a block of padding if we don't have to */
1692-
if (remainder == 0)
1693-
padding = 0;
1694-
else
1695-
padding = rl->block_padding - remainder;
1696-
}
1697-
if (padding > 0) {
1698-
/* do not allow the record to exceed max plaintext length */
1699-
if (padding > max_padding)
1700-
padding = max_padding;
1701-
if (!WPACKET_memset(thispkt, 0, padding)) {
1702-
RLAYERfatal(rl, SSL_AD_INTERNAL_ERROR,
1703-
ERR_R_INTERNAL_ERROR);
1704-
goto err;
1705-
}
1706-
SSL3_RECORD_add_length(thiswr, padding);
1707-
}
1708-
}
1661+
if (rl->funcs->add_record_padding != NULL
1662+
&& !rl->funcs->add_record_padding(rl, thistempl, thispkt,
1663+
thiswr)) {
1664+
/* RLAYERfatal() already called */
1665+
goto err;
17091666
}
17101667

17111668
/*

ssl/record/methods/tlsany_meth.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,8 @@ struct record_functions_st tls_any_funcs = {
148148
tls_allocate_write_buffers_default,
149149
tls_initialise_write_packets_default,
150150
NULL,
151-
tls_prepare_record_header_default
151+
tls_prepare_record_header_default,
152+
NULL
152153
};
153154

154155
static int dtls_any_set_protocol_version(OSSL_RECORD_LAYER *rl, int vers)
@@ -174,5 +175,6 @@ struct record_functions_st dtls_any_funcs = {
174175
NULL,
175176
NULL,
176177
NULL,
178+
NULL,
177179
NULL
178180
};

0 commit comments

Comments
 (0)