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)
{
char z[BLOCK_SIZE], v[BLOCK_SIZE], r;
int bit, byte;
uint8_t z[BLOCK_SIZE], v[BLOCK_SIZE], r, mask;
int bit, byte, i;
r = 0xE1;
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--)
{
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);
}
if (v[BLOCK_SIZE - 1] & 0x01)
{
sr_block(v);
v[0] ^= r;
}
else
{
sr_block(v);
z[i] ^= v[i] & mask;
}
mask = constant_time_mask(v[BLOCK_SIZE - 1] & 0x01);
sr_block(v);
v[0] ^= r & mask;
}
}
memcpy(res, z, BLOCK_SIZE);