summaryrefslogtreecommitdiffstats
path: root/src/crypto/mac/ghash/pclmulqdq
diff options
context:
space:
mode:
Diffstat (limited to 'src/crypto/mac/ghash/pclmulqdq')
-rw-r--r--src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.c9
-rw-r--r--src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq.h10
-rw-r--r--src/crypto/mac/ghash/pclmulqdq/ghash_pclmulqdq_impl.c30
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);