> One can *probably* discuss > that it would be appropriate to *facilitate* omission of H in context > *other than* OpenSSL by avoiding H during most of the setup procedure. > See attached patch for example. But do note that I'm not saying that it > works or suggesting to include it right away, I only want to show what > *might* be matter of discussion.
Missed the patch...
diff --git a/crypto/modes/gcm128.c b/crypto/modes/gcm128.c index df9f654..e26651d 100644 --- a/crypto/modes/gcm128.c +++ b/crypto/modes/gcm128.c @@ -721,24 +721,24 @@ void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx, void *key, block128_f block) ctx->block = block; ctx->key = key; - (*block) (ctx->H.c, ctx->H.c, key); + (*block) (ctx->Xi.c, ctx->Xi.c, key); if (is_endian.little) { /* H is stored in host byte order */ #ifdef BSWAP8 - ctx->H.u[0] = BSWAP8(ctx->H.u[0]); - ctx->H.u[1] = BSWAP8(ctx->H.u[1]); + ctx->Xi.u[0] = BSWAP8(ctx->Xi.u[0]); + ctx->Xi.u[1] = BSWAP8(ctx->Xi.u[1]); #else - u8 *p = ctx->H.c; + u8 *p = ctx->Xi.c; u64 hi, lo; hi = (u64)GETU32(p) << 32 | GETU32(p + 4); lo = (u64)GETU32(p + 8) << 32 | GETU32(p + 12); - ctx->H.u[0] = hi; - ctx->H.u[1] = lo; + ctx->Xi.u[0] = hi; + ctx->Xi.u[1] = lo; #endif } #if TABLE_BITS==8 - gcm_init_8bit(ctx->Htable, ctx->H.u); + gcm_init_8bit(ctx->Htable, ctx->Xi.u); #elif TABLE_BITS==4 # if defined(GHASH) # define CTX__GHASH(f) (ctx->ghash = (f)) @@ -750,18 +750,18 @@ void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx, void *key, block128_f block) if (OPENSSL_ia32cap_P[0] & (1 << 24) && /* check FXSR bit */ OPENSSL_ia32cap_P[1] & (1 << 1)) { /* check PCLMULQDQ bit */ if (((OPENSSL_ia32cap_P[1] >> 22) & 0x41) == 0x41) { /* AVX+MOVBE */ - gcm_init_avx(ctx->Htable, ctx->H.u); + gcm_init_avx(ctx->Htable, ctx->Xi.u); ctx->gmult = gcm_gmult_avx; CTX__GHASH(gcm_ghash_avx); } else { - gcm_init_clmul(ctx->Htable, ctx->H.u); + gcm_init_clmul(ctx->Htable, ctx->Xi.u); ctx->gmult = gcm_gmult_clmul; CTX__GHASH(gcm_ghash_clmul); } return; } # endif - gcm_init_4bit(ctx->Htable, ctx->H.u); + gcm_init_4bit(ctx->Htable, ctx->Xi.u); # if defined(GHASH_ASM_X86) /* x86 only */ # if defined(OPENSSL_IA32_SSE2) if (OPENSSL_ia32cap_P[0] & (1 << 25)) { /* check SSE bit */ @@ -781,48 +781,52 @@ void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx, void *key, block128_f block) # elif defined(GHASH_ASM_ARM) # ifdef PMULL_CAPABLE if (PMULL_CAPABLE) { - gcm_init_v8(ctx->Htable, ctx->H.u); + gcm_init_v8(ctx->Htable, ctx->Xi.u); ctx->gmult = gcm_gmult_v8; CTX__GHASH(gcm_ghash_v8); } else # endif # ifdef NEON_CAPABLE if (NEON_CAPABLE) { - gcm_init_neon(ctx->Htable, ctx->H.u); + gcm_init_neon(ctx->Htable, ctx->Xi.u); ctx->gmult = gcm_gmult_neon; CTX__GHASH(gcm_ghash_neon); } else # endif { - gcm_init_4bit(ctx->Htable, ctx->H.u); + gcm_init_4bit(ctx->Htable, ctx->Xi.u); ctx->gmult = gcm_gmult_4bit; CTX__GHASH(gcm_ghash_4bit); } # elif defined(GHASH_ASM_SPARC) if (OPENSSL_sparcv9cap_P[0] & SPARCV9_VIS3) { - gcm_init_vis3(ctx->Htable, ctx->H.u); + gcm_init_vis3(ctx->Htable, ctx->Xi.u); ctx->gmult = gcm_gmult_vis3; CTX__GHASH(gcm_ghash_vis3); } else { - gcm_init_4bit(ctx->Htable, ctx->H.u); + gcm_init_4bit(ctx->Htable, ctx->Xi.u); ctx->gmult = gcm_gmult_4bit; CTX__GHASH(gcm_ghash_4bit); } # elif defined(GHASH_ASM_PPC) if (OPENSSL_ppccap_P & PPC_CRYPTO207) { - gcm_init_p8(ctx->Htable, ctx->H.u); + gcm_init_p8(ctx->Htable, ctx->Xi.u); ctx->gmult = gcm_gmult_p8; CTX__GHASH(gcm_ghash_p8); } else { - gcm_init_4bit(ctx->Htable, ctx->H.u); + gcm_init_4bit(ctx->Htable, ctx->Xi.u); ctx->gmult = gcm_gmult_4bit; CTX__GHASH(gcm_ghash_4bit); } # else - gcm_init_4bit(ctx->Htable, ctx->H.u); + gcm_init_4bit(ctx->Htable, ctx->Xi.u); # endif # undef CTX__GHASH #endif + ctx->H.u[0] = ctx->Xi.u[0]; + ctx->H.u[1] = ctx->Xi.u[1]; + ctx->Xi.u[0] = 0; + ctx->Xi.u[1] = 0; } void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx, const unsigned char *iv,
-- openssl-dev mailing list To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev