Skip to content

Commit

Permalink
Fix leakage when the cacheline is 32-bytes in CBC_MAC_ROTATE_IN_PLACE
Browse files Browse the repository at this point in the history
rotated_mac is a 64-byte aligned buffer of size 64 and rotate_offset is secret.
Consider a weaker leakage model(CL) where only cacheline base address is leaked,
i.e address/32 for 32-byte cacheline(CL32).

Previous code used to perform two loads
    1. rotated_mac[rotate_offset ^ 32] and
    2. rotated_mac[rotate_offset++]
which would leak 2q + 1, 2q for 0 <= rotate_offset < 32
and 2q, 2q + 1 for 32 <= rotate_offset < 64

The proposed fix performs load operations which will always leak 2q, 2q + 1 and
selects the appropriate value in constant-time.

Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from #18033)

(cherry picked from commit 3b83638)
  • Loading branch information
basavesh authored and t8m committed May 9, 2022
1 parent 222ab33 commit b643a4d
Showing 1 changed file with 11 additions and 3 deletions.
14 changes: 11 additions & 3 deletions ssl/record/tls_pad.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ static int ssl3_cbc_copy_mac(size_t *reclen,
#if defined(CBC_MAC_ROTATE_IN_PLACE)
unsigned char rotated_mac_buf[64 + EVP_MAX_MD_SIZE];
unsigned char *rotated_mac;
char aux1, aux2, aux3, mask;
#else
unsigned char rotated_mac[EVP_MAX_MD_SIZE];
#endif
Expand Down Expand Up @@ -288,12 +289,19 @@ static int ssl3_cbc_copy_mac(size_t *reclen,
#if defined(CBC_MAC_ROTATE_IN_PLACE)
j = 0;
for (i = 0; i < mac_size; i++) {
/* in case cache-line is 32 bytes, touch second line */
((volatile unsigned char *)rotated_mac)[rotate_offset ^ 32];
/*
* in case cache-line is 32 bytes,
* load from both lines and select appropriately
*/
aux1 = rotated_mac[rotate_offset & ~32];
aux2 = rotated_mac[rotate_offset | 32];
mask = constant_time_eq_8(rotate_offset & ~32, rotate_offset);
aux3 = constant_time_select_8(mask, aux1, aux2);
rotate_offset++;

/* If the padding wasn't good we emit a random MAC */
out[j++] = constant_time_select_8((unsigned char)(good & 0xff),
rotated_mac[rotate_offset++],
aux3,
randmac[i]);
rotate_offset &= constant_time_lt_s(rotate_offset, mac_size);
}
Expand Down

0 comments on commit b643a4d

Please sign in to comment.