1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis 2 * 3 * LibTomCrypt is a library that provides various cryptographic 4 * algorithms in a highly modular and flexible manner. 5 * 6 * The library is free for all purposes without any express 7 * guarantee it works. 8 * 9 * Tom St Denis, tomstdenis (at) gmail.com, http://libtomcrypt.com 10 */ 11 12 /** 13 @file gcm_mult_h.c 14 GCM implementation, do the GF mult, by Tom St Denis 15 */ 16 #include "tomcrypt.h" 17 18 #if defined(GCM_MODE) 19 /** 20 GCM multiply by H 21 @param gcm The GCM state which holds the H value 22 @param I The value to multiply H by 23 */ 24 void gcm_mult_h(gcm_state *gcm, unsigned char *I) 25 { 26 unsigned char T[16]; 27 #ifdef GCM_TABLES 28 int x, y; 29 #ifdef GCM_TABLES_SSE2 30 asm("movdqa (%0),%%xmm0"::"r"(&gcm->PC[0][I[0]][0])); 31 for (x = 1; x < 16; x++) { 32 asm("pxor (%0),%%xmm0"::"r"(&gcm->PC[x][I[x]][0])); 33 } 34 asm("movdqa %%xmm0,(%0)"::"r"(&T)); 35 #else 36 XMEMCPY(T, &gcm->PC[0][I[0]][0], 16); 37 for (x = 1; x < 16; x++) { 38 #ifdef LTC_FAST 39 for (y = 0; y < 16; y += sizeof(LTC_FAST_TYPE)) { 40 *((LTC_FAST_TYPE *)(T + y)) ^= *((LTC_FAST_TYPE *)(&gcm->PC[x][I[x]][y])); 41 } 42 #else 43 for (y = 0; y < 16; y++) { 44 T[y] ^= gcm->PC[x][I[x]][y]; 45 } 46 #endif /* LTC_FAST */ 47 } 48 #endif /* GCM_TABLES_SSE2 */ 49 #else 50 gcm_gf_mult(gcm->H, I, T); 51 #endif 52 XMEMCPY(I, T, 16); 53 } 54 #endif 55 56 /* $Source: /cvs/libtom/libtomcrypt/src/encauth/gcm/gcm_mult_h.c,v $ */ 57 /* $Revision: 1.4 $ */ 58 /* $Date: 2006/08/23 20:40:23 $ */ 59