1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2 /* SPDX-License-Identifier: Unlicense */
3
4 /**
5 @file gcm_mult_h.c
6 GCM implementation, do the GF mult, by Tom St Denis
7 */
8 #include "tomcrypt_private.h"
9
10 #if defined(LTC_GCM_MODE)
11 /**
12 GCM multiply by H
13 @param gcm The GCM state which holds the H value
14 @param I The value to multiply H by
15 */
gcm_mult_h(const gcm_state * gcm,unsigned char * I)16 void gcm_mult_h(const gcm_state *gcm, unsigned char *I)
17 {
18 unsigned char T[16];
19 #ifdef LTC_GCM_TABLES
20 int x;
21 #ifdef LTC_GCM_TABLES_SSE2
22 asm("movdqa (%0),%%xmm0"::"r"(&gcm->PC[0][I[0]][0]));
23 for (x = 1; x < 16; x++) {
24 asm("pxor (%0),%%xmm0"::"r"(&gcm->PC[x][I[x]][0]));
25 }
26 asm("movdqa %%xmm0,(%0)"::"r"(&T));
27 #else
28 int y;
29 XMEMCPY(T, &gcm->PC[0][I[0]][0], 16);
30 for (x = 1; x < 16; x++) {
31 #ifdef LTC_FAST
32 for (y = 0; y < 16; y += sizeof(LTC_FAST_TYPE)) {
33 *(LTC_FAST_TYPE_PTR_CAST(T + y)) ^= *(LTC_FAST_TYPE_PTR_CAST(&gcm->PC[x][I[x]][y]));
34 }
35 #else
36 for (y = 0; y < 16; y++) {
37 T[y] ^= gcm->PC[x][I[x]][y];
38 }
39 #endif /* LTC_FAST */
40 }
41 #endif /* LTC_GCM_TABLES_SSE2 */
42 #else
43 gcm_gf_mult(gcm->H, I, T);
44 #endif
45 XMEMCPY(I, T, 16);
46 }
47 #endif
48