xref: /optee_os/core/lib/libtomcrypt/src/encauth/gcm/gcm_mult_h.c (revision 8411e6ad673d20c4742ed30c785e3f5cdea54dfa)
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