summaryrefslogtreecommitdiffstats
path: root/src/crypto
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2013-11-02 16:01:16 +0100
committerMatthias Schiffer <mschiffer@universe-factory.net>2013-11-02 16:01:16 +0100
commit4496be6e29732189769b78f63e491dacb23c961b (patch)
tree5882550f4cf9b516fdd613bbaf4535a7f59d981a /src/crypto
parent20a95ef2731ce21acfe5c1ba97b40001217b0216 (diff)
downloadfastd-4496be6e29732189769b78f63e491dacb23c961b.tar
fastd-4496be6e29732189769b78f63e491dacb23c961b.zip
Convert ghash to the new crypto algorithm scheme
Diffstat (limited to 'src/crypto')
-rw-r--r--src/crypto/CMakeLists.txt7
-rw-r--r--src/crypto/mac/CMakeLists.txt34
-rw-r--r--src/crypto/mac/ghash/CMakeLists.txt18
-rw-r--r--src/crypto/mac/ghash/builtin/CMakeLists.txt6
-rw-r--r--src/crypto/mac/ghash/builtin/ghash_builtin.c140
-rw-r--r--src/crypto/mac/macs.c.in117
6 files changed, 321 insertions, 1 deletions
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 $<TARGET_OBJECTS:mac_ghash_${impl}>)
+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 <mschiffer@universe-factory.net>
+ 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 <mschiffer@universe-factory.net>
+ 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>
+
+
+@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;
+}