diff options
Diffstat (limited to 'src/crypto/mac/ghash/pclmulqdq')
-rw-r--r-- | src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.c | 9 | ||||
-rw-r--r-- | src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.h | 10 | ||||
-rw-r--r-- | src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq_impl.c | 30 |
3 files changed, 24 insertions, 25 deletions
diff --git a/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.c b/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.c index 8f1edb0..419d406 100644 --- a/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.c +++ b/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.c @@ -34,17 +34,10 @@ static bool ghash_available(void) { return ((fastd_cpuid()&REQ) == REQ); } -static void ghash_free(fastd_context_t *ctx UNUSED, fastd_mac_state_t *state) { - if (state) { - secure_memzero(state, sizeof(*state)); - free(state); - } -} - const fastd_mac_t fastd_mac_ghash_pclmulqdq = { .available = ghash_available, .init = fastd_ghash_pclmulqdq_init, .hash = fastd_ghash_pclmulqdq_hash, - .free = ghash_free, + .free = fastd_ghash_pclmulqdq_free, }; diff --git a/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.h b/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.h index ccb1ecf..81313a3 100644 --- a/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.h +++ b/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.h @@ -27,10 +27,6 @@ #include "../../../../crypto.h" -struct fastd_mac_state { - fastd_block128_t H; -}; - - -fastd_mac_state_t* fastd_ghash_pclmulqdq_init(fastd_context_t *ctx, const uint8_t *key); -bool fastd_ghash_pclmulqdq_hash(fastd_context_t *ctx, const fastd_mac_state_t *state, fastd_block128_t *out, const fastd_block128_t *in, size_t n_blocks); +fastd_mac_state_t* fastd_ghash_pclmulqdq_init(const uint8_t *key); +bool fastd_ghash_pclmulqdq_hash(const fastd_mac_state_t *state, fastd_block128_t *out, const fastd_block128_t *in, size_t n_blocks); +void fastd_ghash_pclmulqdq_free(fastd_mac_state_t *state); diff --git a/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq_impl.c b/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq_impl.c index 134d4ed..201ec9a 100644 --- a/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq_impl.c +++ b/src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq_impl.c @@ -35,6 +35,11 @@ typedef union vecblock { fastd_block128_t b; } vecblock_t; +struct fastd_mac_state { + vecblock_t H; +}; + + static inline __m128i shl(__m128i v, int a) { __m128i tmpl = _mm_slli_epi64(v, a); __m128i tmpr = _mm_srli_epi64(v, 64-a); @@ -58,18 +63,24 @@ static inline __m128i byteswap(__m128i v) { } -fastd_mac_state_t* fastd_ghash_pclmulqdq_init(fastd_context_t *ctx UNUSED, const uint8_t *key) { - fastd_mac_state_t *state = malloc(sizeof(fastd_mac_state_t)); - - vecblock_t h; - memcpy(&h, key, sizeof(__m128i)); +fastd_mac_state_t* fastd_ghash_pclmulqdq_init(const uint8_t *key) { + fastd_mac_state_t *state; + if (posix_memalign((void**)&state, 16, sizeof(fastd_mac_state_t))) + abort(); - h.v = byteswap(h.v); - state->H = h.b; + memcpy(&state->H, key, sizeof(__m128i)); + state->H.v = byteswap(state->H.v); return state; } +void fastd_ghash_pclmulqdq_free(fastd_mac_state_t *state) { + if (state) { + secure_memzero(state, sizeof(*state)); + free(state); + } +} + static __m128i gmul(__m128i v, __m128i h) { /* multiply */ __m128i z0, z1, z2, tmp; @@ -123,15 +134,14 @@ static __m128i gmul(__m128i v, __m128i h) { } -bool fastd_ghash_pclmulqdq_hash(fastd_context_t *ctx UNUSED, const fastd_mac_state_t *state, fastd_block128_t *out, const fastd_block128_t *in, size_t n_blocks) { - vecblock_t h = {.b = state->H}; +bool fastd_ghash_pclmulqdq_hash(const fastd_mac_state_t *state, fastd_block128_t *out, const fastd_block128_t *in, size_t n_blocks) { vecblock_t v = {.v = _mm_setzero_si128()}; size_t i; for (i = 0; i < n_blocks; i++) { __m128i b = ((vecblock_t)in[i]).v; v.v = _mm_xor_si128(v.v, byteswap(b)); - v.v = gmul(v.v, h.v); + v.v = gmul(v.v, state->H.v); } v.v = byteswap(v.v); |