tls: AES-GCM: in GMULT, avoid memcpy, use one less variable in bit loop

function                                             old     new   delta
GMULT                                                168     159      -9

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-12-08 21:24:38 +01:00
parent 6e7c65fca0
commit 32ec5f1705

View File

@ -97,25 +97,25 @@ static void RIGHTSHIFTX(byte* x)
#undef l #undef l
} }
// Caller guarantees X is aligned
static void GMULT(byte* X, byte* Y) static void GMULT(byte* X, byte* Y)
{ {
byte Z[AES_BLOCK_SIZE] ALIGNED_long; byte Z[AES_BLOCK_SIZE] ALIGNED_long;
byte V[AES_BLOCK_SIZE] ALIGNED_long; //byte V[AES_BLOCK_SIZE] ALIGNED_long;
int i, j; int i;
XMEMSET(Z, 0, AES_BLOCK_SIZE); XMEMSET(Z, 0, AES_BLOCK_SIZE);
XMEMCPY(V, X, AES_BLOCK_SIZE); //XMEMCPY(V, X, AES_BLOCK_SIZE);
for (i = 0; i < AES_BLOCK_SIZE; i++) for (i = 0; i < AES_BLOCK_SIZE; i++) {
{ uint32_t y = 0x800000 | Y[i];
byte y = Y[i]; for (;;) { // for every bit in Y[i], from msb to lsb
for (j = 0; j < 8; j++)
{
if (y & 0x80) { if (y & 0x80) {
xorbuf_aligned_AES_BLOCK_SIZE(Z, V); xorbuf_aligned_AES_BLOCK_SIZE(Z, X); // was V, not X
} }
RIGHTSHIFTX(X); // was V, not X
RIGHTSHIFTX(V);
y = y << 1; y = y << 1;
if ((int32_t)y < 0) // if bit 0x80000000 set = if 8 iterations done
break;
} }
} }
XMEMCPY(X, Z, AES_BLOCK_SIZE); XMEMCPY(X, Z, AES_BLOCK_SIZE);