From 4496be6e29732189769b78f63e491dacb23c961b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 2 Nov 2013 16:01:16 +0100 Subject: Convert ghash to the new crypto algorithm scheme --- src/crypto/CMakeLists.txt | 7 +- src/crypto/mac/CMakeLists.txt | 34 +++++++ src/crypto/mac/ghash/CMakeLists.txt | 18 ++++ src/crypto/mac/ghash/builtin/CMakeLists.txt | 6 ++ src/crypto/mac/ghash/builtin/ghash_builtin.c | 140 +++++++++++++++++++++++++++ src/crypto/mac/macs.c.in | 117 ++++++++++++++++++++++ 6 files changed, 321 insertions(+), 1 deletion(-) create mode 100644 src/crypto/mac/CMakeLists.txt create mode 100644 src/crypto/mac/ghash/CMakeLists.txt create mode 100644 src/crypto/mac/ghash/builtin/CMakeLists.txt create mode 100644 src/crypto/mac/ghash/builtin/ghash_builtin.c create mode 100644 src/crypto/mac/macs.c.in (limited to 'src/crypto') diff --git a/src/crypto/CMakeLists.txt b/src/crypto/CMakeLists.txt index 1c78e03..94ff3b4 100644 --- a/src/crypto/CMakeLists.txt +++ b/src/crypto/CMakeLists.txt @@ -1,3 +1,8 @@ add_subdirectory(cipher) +add_subdirectory(mac) -set(CRYPTO_SOURCES "${CIPHER_SOURCES}" PARENT_SCOPE) +set(CRYPTO_SOURCES "") +list(APPEND CRYPTO_SOURCES ${CIPHER_SOURCES}) +list(APPEND CRYPTO_SOURCES ${MAC_SOURCES}) + +set(CRYPTO_SOURCES "${CRYPTO_SOURCES}" PARENT_SCOPE) diff --git a/src/crypto/mac/CMakeLists.txt b/src/crypto/mac/CMakeLists.txt new file mode 100644 index 0000000..7f8664c --- /dev/null +++ b/src/crypto/mac/CMakeLists.txt @@ -0,0 +1,34 @@ +set(MACS "") + +if(WITH_MAC_GHASH) + list(APPEND MACS ghash) +endif(WITH_MAC_GHASH) + +set(MAC_SOURCES "${CMAKE_CURRENT_BINARY_DIR}/macs.c") + +set(MAC_DEFINITIONS "") +set(MAC_IMPLS "") +set(MAC_LIST "") + +foreach(mac ${MACS}) + add_subdirectory(${mac}) + + list(APPEND MAC_SOURCES ${IMPL_SOURCES}) + + set(MAC_LIST "${MAC_LIST}\n{\"${MAC_NAME}\", mac_${mac}_impls},") + set(MAC_IMPLS "${MAC_IMPLS}\nstatic const fastd_mac_t *const mac_${mac}_impls[] = {") + + foreach(impl ${IMPLS}) + set(MAC_DEFINITIONS "${MAC_DEFINITIONS}\nextern const fastd_mac_t fastd_mac_${mac}_${impl};") + set(MAC_IMPLS "${MAC_IMPLS}&fastd_mac_${mac}_${impl}, ") + endforeach(impl) + + set(MAC_IMPLS "${MAC_IMPLS}NULL};") + +endforeach(mac) + + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/macs.c.in ${CMAKE_CURRENT_BINARY_DIR}/macs.c) + + +set(MAC_SOURCES "${MAC_SOURCES}" PARENT_SCOPE) diff --git a/src/crypto/mac/ghash/CMakeLists.txt b/src/crypto/mac/ghash/CMakeLists.txt new file mode 100644 index 0000000..7d697e8 --- /dev/null +++ b/src/crypto/mac/ghash/CMakeLists.txt @@ -0,0 +1,18 @@ +set(IMPLS "") + +if(WITH_MAC_GHASH_BUILTIN) + list(APPEND IMPLS builtin) +endif(WITH_MAC_GHASH_BUILTIN) + +set(IMPL_SOURCES "") + +foreach(impl ${IMPLS}) + add_subdirectory(${impl}) + + list(APPEND IMPL_SOURCES $) +endforeach(impl) + + +set(MAC_NAME "ghash" PARENT_SCOPE) +set(IMPLS "${IMPLS}" PARENT_SCOPE) +set(IMPL_SOURCES "${IMPL_SOURCES}" PARENT_SCOPE) diff --git a/src/crypto/mac/ghash/builtin/CMakeLists.txt b/src/crypto/mac/ghash/builtin/CMakeLists.txt new file mode 100644 index 0000000..7951d58 --- /dev/null +++ b/src/crypto/mac/ghash/builtin/CMakeLists.txt @@ -0,0 +1,6 @@ +include_directories(${FASTD_SOURCE_DIR}/src ${FASTD_BINARY_DIR}) + +add_library(mac_ghash_builtin OBJECT + ghash_builtin.c +) +set_property(TARGET mac_ghash_builtin PROPERTY COMPILE_FLAGS "${FASTD_CFLAGS}") diff --git a/src/crypto/mac/ghash/builtin/ghash_builtin.c b/src/crypto/mac/ghash/builtin/ghash_builtin.c new file mode 100644 index 0000000..2eb7fed --- /dev/null +++ b/src/crypto/mac/ghash/builtin/ghash_builtin.c @@ -0,0 +1,140 @@ +/* + Copyright (c) 2012-2013, Matthias Schiffer + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "../../../../fastd.h" + + +struct fastd_mac_state { + fastd_block128_t H[32][16]; +}; + + +static const fastd_block128_t r = { .b = {0xe1} }; + + +static inline uint8_t shr(fastd_block128_t *out, const fastd_block128_t *in, int n) { + size_t i; + uint8_t c = 0; + + for (i = 0; i < sizeof(fastd_block128_t); i++) { + uint8_t c2 = in->b[i] << (8-n); + out->b[i] = (in->b[i] >> n) | c; + c = c2; + } + + return (c >> (8-n)); +} + +static inline void mulH_a(fastd_block128_t *x, const fastd_mac_state_t *cstate) { + fastd_block128_t out = {}; + + int i; + for (i = 0; i < 16; i++) { + xor_a(&out, &cstate->H[2*i][x->b[i]>>4]); + xor_a(&out, &cstate->H[2*i+1][x->b[i]&0xf]); + } + + *x = out; +} + + +static fastd_mac_context_t* ghash_initialize(fastd_context_t *ctx UNUSED) { + return NULL; +} + +static fastd_mac_state_t* ghash_init_state(fastd_context_t *ctx UNUSED, const fastd_mac_context_t *mctx UNUSED, const uint8_t *key) { + fastd_mac_state_t *state = malloc(sizeof(fastd_mac_state_t)); + + fastd_block128_t Hbase[4]; + fastd_block128_t Rbase[4]; + + memcpy(&Hbase[0], key, sizeof(fastd_block128_t)); + Rbase[0] = r; + + int i; + for (i = 1; i < 4; i++) { + uint8_t carry = shr(&Hbase[i], &Hbase[i-1], 1); + if (carry) + xor_a(&Hbase[i], &r); + + shr(&Rbase[i], &Rbase[i-1], 1); + } + + fastd_block128_t R[16]; + memset(state->H, 0, sizeof(state->H)); + memset(R, 0, sizeof(R)); + + for (i = 0; i < 16; i++) { + int j; + for (j = 0; j < 4; j++) { + if (i & (8 >> j)) { + xor_a(&state->H[0][i], &Hbase[j]); + xor_a(&R[i], &Rbase[j]); + } + } + } + + for (i = 1; i < 32; i++) { + int j; + + for (j = 0; j < 16; j++) { + uint8_t carry = shr(&state->H[i][j], &state->H[i-1][j], 4); + xor_a(&state->H[i][j], &R[carry]); + } + } + + return state; +} + +static bool ghash_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) { + memset(out, 0, sizeof(fastd_block128_t)); + + size_t i; + for (i = 0; i < n_blocks; i++) { + xor_a(out, &in[i]); + mulH_a(out, state); + } + + return true; +} + +static void ghash_free_state(fastd_context_t *ctx UNUSED, fastd_mac_state_t *state) { + free(state); +} + +static void ghash_free(fastd_context_t *ctx UNUSED, fastd_mac_context_t *mctx UNUSED) { +} + +const fastd_mac_t fastd_mac_ghash_builtin = { + .name = "builtin", + + .initialize = ghash_initialize, + .init_state = ghash_init_state, + .hash = ghash_hash, + + .free_state = ghash_free_state, + .free = ghash_free, +}; diff --git a/src/crypto/mac/macs.c.in b/src/crypto/mac/macs.c.in new file mode 100644 index 0000000..e591935 --- /dev/null +++ b/src/crypto/mac/macs.c.in @@ -0,0 +1,117 @@ +/* + Copyright (c) 2012-2013, Matthias Schiffer + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + + +@MAC_DEFINITIONS@ + +typedef struct mac_impl_list { + const char *name; + const fastd_mac_t *const *impls; +} mac_impl_list_t; + +@MAC_IMPLS@ + +static const mac_impl_list_t macs[] = { @MAC_LIST@ +}; + + +const fastd_mac_t** fastd_mac_config_alloc(void) { + const fastd_mac_t **mac_conf = calloc(array_size(macs), sizeof(const fastd_mac_t*)); + + size_t i; + for (i = 0; i < array_size(macs); i++) + mac_conf[i] = macs[i].impls[0]; + + return mac_conf; +} + +void fastd_mac_config_free(const fastd_mac_t **mac_conf) { + free(mac_conf); +} + +bool fastd_mac_config(const fastd_mac_t **mac_conf, const char *name, const char *impl) { + size_t i; + for (i = 0; i < array_size(macs); i++) { + if (!strcmp(macs[i].name, name)) { + size_t j; + for (j = 0; macs[i].impls[j]; j++) { + if (!strcmp(macs[i].impls[j]->name, impl)) { + mac_conf[i] = macs[i].impls[j]; + return true; + } + } + + return false; + } + } + + return false; +} + +void fastd_mac_init(fastd_context_t *ctx) { + ctx->mac_contexts = calloc(array_size(macs), sizeof(fastd_mac_context_t*)); + + size_t i; + for (i = 0; i < array_size(macs); i++) { + if (ctx->conf->macs[i]) + ctx->mac_contexts[i] = ctx->conf->macs[i]->initialize(ctx); + } +} + +void fastd_mac_free(fastd_context_t *ctx) { + size_t i; + for (i = 0; i < array_size(macs); i++) + ctx->conf->macs[i]->free(ctx, ctx->mac_contexts[i]); + + free(ctx->mac_contexts); +} + +bool fastd_mac_available(const char *name) { + size_t i; + for (i = 0; i < array_size(macs); i++) { + if (!strcmp(macs[i].name, name)) { + return true; + } + } + + return false; +} + +const fastd_mac_t* fastd_mac_get_by_name(fastd_context_t *ctx, const char *name, fastd_mac_context_t **cctx) { + size_t i; + for (i = 0; i < array_size(macs); i++) { + if (!strcmp(macs[i].name, name)) { + if (cctx) + *cctx = ctx->mac_contexts[i]; + + return ctx->conf->macs[i]; + } + } + + return NULL; +} -- cgit v1.2.3