gcm: Implement block multiplication in constant time

This commit is contained in:
Tobias Brunner
2026-07-21 10:37:43 +02:00
parent 577d4d16f6
commit 87bbfe4f5f
+8 -13
View File
@@ -106,8 +106,8 @@ static void sr_block(char *block)
*/ */
static void mult_block(char *x, char *y, char *res) static void mult_block(char *x, char *y, char *res)
{ {
char z[BLOCK_SIZE], v[BLOCK_SIZE], r; uint8_t z[BLOCK_SIZE], v[BLOCK_SIZE], r, mask;
int bit, byte; int bit, byte, i;
r = 0xE1; r = 0xE1;
memset(z, 0, BLOCK_SIZE); memset(z, 0, BLOCK_SIZE);
@@ -117,19 +117,14 @@ static void mult_block(char *x, char *y, char *res)
{ {
for (bit = 7; bit >= 0; bit--) for (bit = 7; bit >= 0; bit--)
{ {
if (x[byte] & (1 << bit)) mask = constant_time_mask(x[byte] & (1 << bit));
for (i = 0; i < BLOCK_SIZE; i++)
{ {
memxor(z, v, BLOCK_SIZE); z[i] ^= v[i] & mask;
}
if (v[BLOCK_SIZE - 1] & 0x01)
{
sr_block(v);
v[0] ^= r;
}
else
{
sr_block(v);
} }
mask = constant_time_mask(v[BLOCK_SIZE - 1] & 0x01);
sr_block(v);
v[0] ^= r & mask;
} }
} }
memcpy(res, z, BLOCK_SIZE); memcpy(res, z, BLOCK_SIZE);