diff options
13 files changed, 123 insertions, 100 deletions
diff --git a/configure.ac b/configure.ac index 4e31e0684..5fa82573f 100644 --- a/configure.ac +++ b/configure.ac @@ -1645,6 +1645,7 @@ AC_CONFIG_FILES([ src/libstrongswan/plugins/af_alg/Makefile src/libstrongswan/plugins/ntru/Makefile src/libstrongswan/plugins/bliss/Makefile + src/libstrongswan/plugins/bliss/tests/Makefile src/libstrongswan/plugins/test_vectors/Makefile src/libstrongswan/tests/Makefile src/libhydra/Makefile diff --git a/src/libstrongswan/Makefile.am b/src/libstrongswan/Makefile.am index 9a6e03632..91d92c3f3 100644 --- a/src/libstrongswan/Makefile.am +++ b/src/libstrongswan/Makefile.am @@ -546,6 +546,13 @@ if MONOLITHIC endif endif +if USE_BLISS + SUBDIRS += plugins/bliss +if MONOLITHIC + libstrongswan_la_LIBADD += plugins/bliss/libstrongswan-bliss.la +endif +endif + if USE_TEST_VECTORS SUBDIRS += plugins/test_vectors if MONOLITHIC @@ -557,12 +564,6 @@ if MONOLITHIC SUBDIRS += . endif SUBDIRS += tests - if USE_BLISS - SUBDIRS += plugins/bliss -if MONOLITHIC - libstrongswan_la_LIBADD += plugins/bliss/libstrongswan-bliss.la + SUBDIRS += plugins/bliss/tests endif -endif - - diff --git a/src/libstrongswan/plugins/bliss/.gitignore b/src/libstrongswan/plugins/bliss/.gitignore index fcce5a9d9..f1ba4e2a5 100644 --- a/src/libstrongswan/plugins/bliss/.gitignore +++ b/src/libstrongswan/plugins/bliss/.gitignore @@ -1,4 +1,3 @@ -bliss_tests bliss_huffman bliss_huffman_code_1.c bliss_huffman_code_3.c diff --git a/src/libstrongswan/plugins/bliss/Makefile.am b/src/libstrongswan/plugins/bliss/Makefile.am index c4db1544c..27d179be9 100644 --- a/src/libstrongswan/plugins/bliss/Makefile.am +++ b/src/libstrongswan/plugins/bliss/Makefile.am @@ -5,75 +5,56 @@ AM_CFLAGS = \ $(PLUGIN_CFLAGS) \ @COVERAGE_CFLAGS@ -if MONOLITHIC -noinst_LTLIBRARIES = libstrongswan-bliss.la -else -plugin_LTLIBRARIES = libstrongswan-bliss.la -endif - -libstrongswan_bliss_la_SOURCES = \ - bliss_plugin.h bliss_plugin.c \ +# these file are also used by bliss_huffman +noinst_LTLIBRARIES = libbliss-params.la +libbliss_params_la_SOURCES = \ bliss_param_set.h bliss_param_set.c \ + bliss_fft_params.h bliss_fft_params.c + +# these files are also used by the tests, we can't directly refer to them +# because of the subdirectory, which would cause distclean to fail +noinst_LTLIBRARIES += libbliss.la +libbliss_la_SOURCES = \ bliss_private_key.h bliss_private_key.c \ bliss_public_key.h bliss_public_key.c \ bliss_signature.h bliss_signature.c \ bliss_utils.h bliss_utils.c \ bliss_bitpacker.h bliss_bitpacker.c \ bliss_fft.h bliss_fft.c \ - bliss_fft_params.h bliss_fft_params.c \ bliss_huffman_code.h bliss_huffman_code.c \ bliss_huffman_code_1.c bliss_huffman_code_3.c bliss_huffman_code_4.c \ bliss_sampler.h bliss_sampler.c +libbliss_la_LIBADD = libbliss-params.la + +CLEANFILES = \ + bliss_huffman_code_1.c bliss_huffman_code_3.c bliss_huffman_code_4.c + +if MONOLITHIC +noinst_LTLIBRARIES += libstrongswan-bliss.la +else +plugin_LTLIBRARIES = libstrongswan-bliss.la +endif + +libstrongswan_bliss_la_SOURCES = \ + bliss_plugin.h bliss_plugin.c libstrongswan_bliss_la_LDFLAGS = -module -avoid-version +libstrongswan_bliss_la_LIBADD = libbliss.la + noinst_PROGRAMS = bliss_huffman bliss_huffman_SOURCES = bliss_huffman.c -bliss_huffman_LDADD = \ - $(top_builddir)/src/libstrongswan/libstrongswan.la -lm \ - bliss_param_set.o bliss_fft_params.o +bliss_huffman_LDADD = -lm libbliss-params.la bliss_huffman_code_1.c : bliss_huffman bliss_huffman_code.h $(AM_V_GEN) \ - ./bliss_huffman 1 8 > $@ + ./bliss_huffman 1 8 > $@ 2>/dev/null bliss_huffman_code_3.c : bliss_huffman bliss_huffman_code.h $(AM_V_GEN) \ - ./bliss_huffman 3 16 > $@ + ./bliss_huffman 3 16 > $@ 2>/dev/null bliss_huffman_code_4.c : bliss_huffman bliss_huffman_code.h $(AM_V_GEN) \ - ./bliss_huffman 4 32 > $@ - -TESTS = bliss_tests - -check_PROGRAMS = $(TESTS) - -bliss_tests_SOURCES = \ - suites/test_bliss_fft.c \ - suites/test_bliss_bitpacker.c \ - suites/test_bliss_sampler.c \ - suites/test_bliss_sign.c \ - bliss_fft_params.c \ - bliss_fft.c \ - bliss_private_key.c \ - bliss_public_key.c \ - bliss_param_set.c \ - bliss_sampler.c \ - bliss_signature.c \ - bliss_utils.c \ - bliss_bitpacker.c \ - bliss_tests.h bliss_tests.c - -bliss_tests_CFLAGS = \ - -I$(top_srcdir)/src/libstrongswan \ - -I$(top_srcdir)/src/libstrongswan/tests \ - -DPLUGINDIR=\""$(abs_top_builddir)/src/libstrongswan/plugins\"" \ - -DPLUGINS=\""${s_plugins}\"" \ - @COVERAGE_CFLAGS@ - -bliss_tests_LDFLAGS = @COVERAGE_LDFLAGS@ -bliss_tests_LDADD = \ - $(top_builddir)/src/libstrongswan/libstrongswan.la \ - $(top_builddir)/src/libstrongswan/tests/libtest.la + ./bliss_huffman 4 32 > $@ 2>/dev/null diff --git a/src/libstrongswan/plugins/bliss/bliss_huffman.c b/src/libstrongswan/plugins/bliss/bliss_huffman.c index 890dfba06..6667b09dc 100644 --- a/src/libstrongswan/plugins/bliss/bliss_huffman.c +++ b/src/libstrongswan/plugins/bliss/bliss_huffman.c @@ -1,4 +1,5 @@ /* + * Copyright (C) 2014 Tobias Brunner * Copyright (C) 2014 Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * @@ -33,6 +34,7 @@ struct tuple_t { typedef struct node_t node_t; struct node_t { + node_t *next; node_t *l; node_t *r; tuple_t *tuple; @@ -119,8 +121,7 @@ static void write_code_tables(int bliss_type, int n_z1, int n_z2, node_t *nodes, printf(" * Copyright (C) 2014 Andreas Steffen\n"); printf(" * HSR Hochschule fuer Technik Rapperswil\n"); printf(" *\n"); - printf(" * Optimum Huffman code for %N signatures\n", - bliss_param_set_id_names, bliss_type); + printf(" * Optimum Huffman code for BLISS-X signatures\n"); printf(" *\n"); printf(" * This file has been automatically generated by the" " bliss_huffman utility\n"); @@ -182,6 +183,25 @@ static void destroy_node(node_t *node) free(node); } +static void remove_node(node_t *list, node_t **last, node_t *node) +{ + node_t *current, *prev; + + for (current = list->next, prev = list; current; + prev = current, current = current->next) + { + if (current == node) + { + prev->next = current->next; + if (*last == current) + { + *last = prev->next ?: prev; + } + break; + } + } +} + /** * Generate a Huffman code for the optimum encoding of BLISS signatures */ @@ -190,14 +210,13 @@ int main(int argc, char *argv[]) bliss_param_set_t *set; int dx, bliss_type, depth = 1, groups, groups_left, pairs = 1; int i_max = 9, k_max = 8, index_max = (2*k_max - 1) * i_max; - int i, i_top, k, k_top; + int i, i_top, k, k_top; uint16_t index; double p, p_z1[i_max], p_z2[k_max], x_z1[i_max], x_z2[k_max]; double t, x, x0, p_sum, entropy = 0, erf_i, erf_k, erf_0 = 0; tuple_t *tuple, *tuples[index_max]; node_t *node, *node_l, *node_r, *nodes = NULL; - linked_list_t *node_list; - enumerator_t *enumerator; + node_t *node_list, *node_last; if (argc < 2) { @@ -211,10 +230,6 @@ int main(int argc, char *argv[]) fprintf(stderr, "%d code pairs with constant length\n\n", pairs); groups_left = groups = pairs >> 1; - library_init(NULL, "bliss_huffman"); - lib->plugins->load(lib->plugins, "bliss"); - atexit(library_deinit); - bliss_type = atoi(argv[1]); set = bliss_param_set_get_by_id(bliss_type); if (!set) @@ -222,7 +237,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "bliss type %d unsupported\n"); exit(1); } - + t = 1/(sqrt(2) * set->sigma); /* Probability distribution for z1 */ @@ -261,7 +276,7 @@ int main(int argc, char *argv[]) for (k = 0; k < k_top; k++) { - + erf_k = erf(t*x) / 2; p_z2[k] = (k == 0) ? 2*erf_k : erf_k - erf_0; p_sum += (k == 0) ? p_z2[k] : 2*p_z2[k]; @@ -275,18 +290,18 @@ int main(int argc, char *argv[]) { p_z2[k] /= p_sum; } - + /* Print the probability distribution for z2 */ fprintf(stderr, " k p_z2[k] dx = %d\n", dx); for (k = 1 - k_top; k < k_top; k++) { - + fprintf(stderr, "%2d %18.16f ",k, p_z2[abs(k)]); if (k < 0) { fprintf(stderr, "%7.1f ..%7.1f\n", -x_z2[-k], -x_z2[-k-1]); - } + } else if (k == 0) { fprintf(stderr, "%7.1f ..%7.1f\n", -x_z2[k], x_z2[k]); @@ -294,12 +309,13 @@ int main(int argc, char *argv[]) else { fprintf(stderr, "%7.1f ..%7.1f\n", x_z2[k-1], x_z2[k]); - } + } } fprintf(stderr, "\n"); /* Compute probabilities of tuples (z1, z2) */ - node_list =linked_list_create(); + INIT(node_list); + node_last = node_list; fprintf(stderr, "(i, k) p\n"); p_sum =0; index = 0; @@ -313,18 +329,19 @@ int main(int argc, char *argv[]) p_sum += p; entropy += -log(p) * p; - tuple = malloc_thing(tuple_t); - node = malloc_thing(node_t); - tuple->z1 = i; - tuple->z2 = k; - tuple->index = index; + INIT(tuple, + .z1 = i, + .z2 = k, + .index = index, + ); tuples[index++] = tuple; - node->p = p; - node->tuple = tuple; - node->depth = 0; - node->r = NULL; - node->l = NULL; - node_list->insert_last(node_list, node); + + INIT(node, + .p = p, + .tuple = tuple, + ); + node_last->next = node; + node_last = node; } } entropy /= log(2); @@ -332,12 +349,11 @@ int main(int argc, char *argv[]) p_sum, entropy, (int)(512 * entropy)); /* Build Huffman tree */ - while (node_list->get_count(node_list) > 1) + while (node_list->next != node_last) { node_r = node_l = NULL; - enumerator = node_list->create_enumerator(node_list); - while (enumerator->enumerate(enumerator, &node)) + for (node = node_list->next; node; node = node->next) { if (pairs > 0) { @@ -363,23 +379,22 @@ int main(int argc, char *argv[]) node_l = node; } } - enumerator->destroy(enumerator); - - node = malloc_thing(node_t); - node->l = node_l; - node->r = node_r; - node->p = node_l->p + node_r->p; - node->depth = 1 + max(node_l->depth, node_r->depth); - node->tuple = NULL; + INIT(node, + .l = node_l, + .r = node_r, + .p = node_l->p + node_r->p, + .depth = 1 + max(node_l->depth, node_r->depth), + .tuple = NULL, + ); print_node(node_r); print_node(node_l); fprintf(stderr, " %18.16f", node->p); - node_list->remove(node_list, node_l, NULL); - node_list->remove(node_list, node_r, NULL); - node_list->insert_last(node_list, node); - + remove_node(node_list, &node_last, node_l); + remove_node(node_list, &node_last, node_r); + node_last->next = node; + node_last = node; if (pairs > 0) { @@ -394,15 +409,16 @@ int main(int argc, char *argv[]) depth++; } } - fprintf(stderr, " %3d\n\n", node_list->get_count(node_list)); + fprintf(stderr, "\n\n"); } - node_list->remove_first(node_list, (void**)&nodes); - node_list->destroy(node_list); + + nodes = node_list->next; write_code_tables(bliss_type, i_top, k_top, nodes, tuples); destroy_node(nodes); + destroy_node(node_list); exit(0); } diff --git a/src/libstrongswan/plugins/bliss/tests/.gitignore b/src/libstrongswan/plugins/bliss/tests/.gitignore new file mode 100644 index 000000000..94f77f0f9 --- /dev/null +++ b/src/libstrongswan/plugins/bliss/tests/.gitignore @@ -0,0 +1 @@ +bliss_tests diff --git a/src/libstrongswan/plugins/bliss/tests/Makefile.am b/src/libstrongswan/plugins/bliss/tests/Makefile.am new file mode 100644 index 000000000..57d58e98f --- /dev/null +++ b/src/libstrongswan/plugins/bliss/tests/Makefile.am @@ -0,0 +1,24 @@ +TESTS = bliss_tests + +check_PROGRAMS = $(TESTS) + +bliss_tests_SOURCES = \ + suites/test_bliss_fft.c \ + suites/test_bliss_bitpacker.c \ + suites/test_bliss_sampler.c \ + suites/test_bliss_sign.c \ + bliss_tests.h bliss_tests.c + +bliss_tests_CFLAGS = \ + -I$(top_srcdir)/src/libstrongswan \ + -I$(top_srcdir)/src/libstrongswan/tests \ + -I$(top_srcdir)/src/libstrongswan/plugins/bliss \ + -DPLUGINDIR=\""$(abs_top_builddir)/src/libstrongswan/plugins\"" \ + -DPLUGINS=\""${s_plugins}\"" \ + @COVERAGE_CFLAGS@ + +bliss_tests_LDFLAGS = @COVERAGE_LDFLAGS@ +bliss_tests_LDADD = \ + $(top_builddir)/src/libstrongswan/libstrongswan.la \ + $(top_builddir)/src/libstrongswan/tests/libtest.la \ + ../libbliss.la diff --git a/src/libstrongswan/plugins/bliss/bliss_tests.c b/src/libstrongswan/plugins/bliss/tests/bliss_tests.c index de21e77b7..de21e77b7 100644 --- a/src/libstrongswan/plugins/bliss/bliss_tests.c +++ b/src/libstrongswan/plugins/bliss/tests/bliss_tests.c diff --git a/src/libstrongswan/plugins/bliss/bliss_tests.h b/src/libstrongswan/plugins/bliss/tests/bliss_tests.h index 67b0cdd23..67b0cdd23 100644 --- a/src/libstrongswan/plugins/bliss/bliss_tests.h +++ b/src/libstrongswan/plugins/bliss/tests/bliss_tests.h diff --git a/src/libstrongswan/plugins/bliss/suites/test_bliss_bitpacker.c b/src/libstrongswan/plugins/bliss/tests/suites/test_bliss_bitpacker.c index f040ba70e..f040ba70e 100644 --- a/src/libstrongswan/plugins/bliss/suites/test_bliss_bitpacker.c +++ b/src/libstrongswan/plugins/bliss/tests/suites/test_bliss_bitpacker.c diff --git a/src/libstrongswan/plugins/bliss/suites/test_bliss_fft.c b/src/libstrongswan/plugins/bliss/tests/suites/test_bliss_fft.c index 009aaf802..009aaf802 100644 --- a/src/libstrongswan/plugins/bliss/suites/test_bliss_fft.c +++ b/src/libstrongswan/plugins/bliss/tests/suites/test_bliss_fft.c diff --git a/src/libstrongswan/plugins/bliss/suites/test_bliss_sampler.c b/src/libstrongswan/plugins/bliss/tests/suites/test_bliss_sampler.c index 1bd1266ad..1bd1266ad 100644 --- a/src/libstrongswan/plugins/bliss/suites/test_bliss_sampler.c +++ b/src/libstrongswan/plugins/bliss/tests/suites/test_bliss_sampler.c diff --git a/src/libstrongswan/plugins/bliss/suites/test_bliss_sign.c b/src/libstrongswan/plugins/bliss/tests/suites/test_bliss_sign.c index dbe459143..dbe459143 100644 --- a/src/libstrongswan/plugins/bliss/suites/test_bliss_sign.c +++ b/src/libstrongswan/plugins/bliss/tests/suites/test_bliss_sign.c |