On 03/21/2011 04:32 PM, Daniel Kahn Gillmor wrote: > i'll work on a revised patch with docs and a test if i can figure out a > test as well.
Attached is a patch that breaks out separate compilation units,
const-ifies the arrays, and adjusts the docs and the test suite.
I did not see nettle_armor in the docs at all, so i didn't add any docs
about nettle_armors[]. Maybe that whole section needs to be written?
Any further comments?
--dkg
commit 35a49c639381b6df7aa83346b46c5afcaabb34ec Author: Daniel Kahn Gillmor <[email protected]> Date: Tue Mar 22 16:49:27 2011 -0400 make algorithms dynamically enumerable diff --git a/Makefile.in b/Makefile.in index 1020fd7..c5e911f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -75,6 +75,7 @@ nettle_SOURCES = aes-decrypt-internal.c aes-decrypt.c \ twofish.c twofish-meta.c \ yarrow256.c yarrow_key_event.c \ buffer.c buffer-init.c realloc.c \ + nettle-meta-hashes.c nettle-meta-ciphers.c nettle-meta-armors.c \ nettle-internal.c write-be32.c hogweed_SOURCES = sexp.c sexp-format.c \ diff --git a/nettle-meta-armors.c b/nettle-meta-armors.c new file mode 100644 index 0000000..da19ab4 --- /dev/null +++ b/nettle-meta-armors.c @@ -0,0 +1,32 @@ +/* nettle-meta.c */ + +/* nettle, low-level cryptographics library + * + * The nettle library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at your + * option) any later version. + * + * The nettle library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the nettle library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + */ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include <stddef.h> +#include "nettle-meta.h" + +const struct nettle_armor * const nettle_armors[] = { + &nettle_base64, + &nettle_base16, + NULL +}; diff --git a/nettle-meta-ciphers.c b/nettle-meta-ciphers.c new file mode 100644 index 0000000..c6d4a5f --- /dev/null +++ b/nettle-meta-ciphers.c @@ -0,0 +1,48 @@ +/* nettle-meta.c */ + +/* nettle, low-level cryptographics library + * + * The nettle library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at your + * option) any later version. + * + * The nettle library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the nettle library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + */ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include <stddef.h> +#include "nettle-meta.h" + +const struct nettle_cipher * const nettle_ciphers[] = { + &nettle_aes128, + &nettle_aes192, + &nettle_aes256, + &nettle_arcfour128, + &nettle_camellia128, + &nettle_camellia192, + &nettle_camellia256, + &nettle_cast128, + &nettle_serpent128, + &nettle_serpent192, + &nettle_serpent256, + &nettle_twofish128, + &nettle_twofish192, + &nettle_twofish256, + &nettle_arctwo40, + &nettle_arctwo64, + &nettle_arctwo128, + &nettle_arctwo_gutmann128, + NULL +}; diff --git a/nettle-meta-hashes.c b/nettle-meta-hashes.c new file mode 100644 index 0000000..da6412b --- /dev/null +++ b/nettle-meta-hashes.c @@ -0,0 +1,38 @@ +/* nettle-meta-hashes.c */ + +/* nettle, low-level cryptographics library + * + * The nettle library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at your + * option) any later version. + * + * The nettle library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the nettle library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + */ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include <stddef.h> +#include "nettle-meta.h" + +const struct nettle_hash * const nettle_hashes[] = { + &nettle_md2, + &nettle_md4, + &nettle_md5, + &nettle_sha1, + &nettle_sha224, + &nettle_sha256, + &nettle_sha384, + &nettle_sha512, + NULL +}; diff --git a/nettle-meta.h b/nettle-meta.h index 2a00954..0fbfc03 100644 --- a/nettle-meta.h +++ b/nettle-meta.h @@ -96,6 +96,9 @@ struct nettle_cipher (nettle_crypt_func *) name##_decrypt, \ } +/* null-terminated list of ciphers implemented by this version of nettle */ +extern const struct nettle_cipher * const nettle_ciphers[]; + extern const struct nettle_cipher nettle_aes128; extern const struct nettle_cipher nettle_aes192; extern const struct nettle_cipher nettle_aes256; @@ -149,6 +152,9 @@ struct nettle_hash (nettle_hash_digest_func *) name##_digest \ } +/* null-terminated list of digests implemented by this version of nettle */ +extern const struct nettle_hash * const nettle_hashes[]; + extern const struct nettle_hash nettle_md2; extern const struct nettle_hash nettle_md4; extern const struct nettle_hash nettle_md5; @@ -207,6 +213,9 @@ struct nettle_armor (nettle_armor_decode_final_func *) name##_decode_final, \ } +/* null-terminated list of armor schemes implemented by this version of nettle */ +extern const struct nettle_armor * const nettle_armors[]; + extern const struct nettle_armor nettle_base64; extern const struct nettle_armor nettle_base16; diff --git a/nettle.texinfo b/nettle.texinfo index 797ea06..57347eb 100644 --- a/nettle.texinfo +++ b/nettle.texinfo @@ -683,6 +683,12 @@ The last three attributes are function pointers, of types @deftypevrx {Constant Struct} {struct nettle_hash} nettle_sha512 These are all the hash functions that Nettle implements. + +Nettle also exports a list of all these hashes. This list can be used +to dynamically enumerate or search the supported algorithms: + +@deftypevrx {Constant Struct * Constant} {struct nettle_hash *} nettle_hashes[] + @end deftypevr @node Cipher functions, Cipher modes, Hash functions, Reference @@ -1330,6 +1336,13 @@ struct, which is of size @code{context_size}. Nettle includes such structs for all the @emph{regular} ciphers, i.e. ones without weak keys or other oddities. + +Nettle also exports a list of all these ciphers without weak keys or +other oddities. This list can be used to dynamically enumerate or +search the supported algorithms: + +@deftypevrx {Constant Struct * const} {struct nettle_cipher *} nettle_ciphers[] + @end deftypevr @node Cipher modes, Keyed hash functions, Cipher functions, Reference diff --git a/testsuite/.test-rules.make b/testsuite/.test-rules.make index 1233307..fc23472 100644 --- a/testsuite/.test-rules.make +++ b/testsuite/.test-rules.make @@ -82,6 +82,15 @@ gcm-test$(EXEEXT): gcm-test.$(OBJEXT) hmac-test$(EXEEXT): hmac-test.$(OBJEXT) $(LINK) hmac-test.$(OBJEXT) $(TEST_OBJS) -o hmac-test$(EXEEXT) +meta-hash-test$(EXEEXT): meta-hash-test.$(OBJEXT) + $(LINK) meta-hash-test.$(OBJEXT) $(TEST_OBJS) -o meta-hash-test$(EXEEXT) + +meta-cipher-test$(EXEEXT): meta-cipher-test.$(OBJEXT) + $(LINK) meta-cipher-test.$(OBJEXT) $(TEST_OBJS) -o meta-cipher-test$(EXEEXT) + +meta-armor-test$(EXEEXT): meta-armor-test.$(OBJEXT) + $(LINK) meta-armor-test.$(OBJEXT) $(TEST_OBJS) -o meta-armor-test$(EXEEXT) + buffer-test$(EXEEXT): buffer-test.$(OBJEXT) $(LINK) buffer-test.$(OBJEXT) $(TEST_OBJS) -o buffer-test$(EXEEXT) diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in index 6eef3dc..8a263cb 100644 --- a/testsuite/Makefile.in +++ b/testsuite/Makefile.in @@ -22,6 +22,7 @@ TS_NETTLE_SOURCES = aes-test.c arcfour-test.c arctwo-test.c \ serpent-test.c twofish-test.c \ knuth-lfib-test.c \ cbc-test.c ctr-test.c gcm-test.c hmac-test.c \ + meta-hash-test.c meta-cipher-test.c meta-armor-test.c \ buffer-test.c yarrow-test.c TS_HOGWEED_SOURCES = sexp-test.c sexp-format-test.c \ diff --git a/testsuite/meta-armor-test.c b/testsuite/meta-armor-test.c new file mode 100644 index 0000000..a99064b --- /dev/null +++ b/testsuite/meta-armor-test.c @@ -0,0 +1,27 @@ +#include "testutils.h" +#include "nettle-meta.h" + +const char* armors[] = { + "base16", + "base64" +}; + +int +test_main(void) +{ + int i,j; + int count = sizeof(armors)/sizeof(*armors); + for (i = 0; i < count; i++) { + for (j = 0; NULL != nettle_armors[j]; j++) { + if (0 == strcmp(armors[i], nettle_armors[j]->name)) + break; + } + ASSERT(NULL != nettle_armors[j]); /* make sure we found a matching armor */ + } + j = 0; + while (NULL != nettle_armors[j]) + j++; + ASSERT(j == count); /* we are not missing testing any armors */ + SUCCESS(); +} + diff --git a/testsuite/meta-cipher-test.c b/testsuite/meta-cipher-test.c new file mode 100644 index 0000000..1bb74d8 --- /dev/null +++ b/testsuite/meta-cipher-test.c @@ -0,0 +1,43 @@ +#include "testutils.h" +#include "nettle-meta.h" + +const char* ciphers[] = { + "aes128", + "aes192", + "aes256", + "arctwo40", + "arctwo64", + "arctwo128", + "arctwo_gutmann128", + "arcfour128", + "camellia128", + "camellia192", + "camellia256", + "cast128", + "serpent128", + "serpent192", + "serpent256", + "twofish128", + "twofish192", + "twofish256" +}; + +int +test_main(void) +{ + int i,j; + int count = sizeof(ciphers)/sizeof(*ciphers); + for (i = 0; i < count; i++) { + for (j = 0; NULL != nettle_ciphers[j]; j++) { + if (0 == strcmp(ciphers[i], nettle_ciphers[j]->name)) + break; + } + ASSERT(NULL != nettle_ciphers[j]); /* make sure we found a matching cipher */ + } + j = 0; + while (NULL != nettle_ciphers[j]) + j++; + ASSERT(j == count); /* we are not missing testing any ciphers */ + SUCCESS(); +} + diff --git a/testsuite/meta-hash-test.c b/testsuite/meta-hash-test.c new file mode 100644 index 0000000..d7f251c --- /dev/null +++ b/testsuite/meta-hash-test.c @@ -0,0 +1,33 @@ +#include "testutils.h" +#include "nettle-meta.h" + +const char* hashes[] = { + "md2", + "md4", + "md5", + "sha1", + "sha224", + "sha256", + "sha384", + "sha512" +}; + +int +test_main(void) +{ + int i,j; + int count = sizeof(hashes)/sizeof(*hashes); + for (i = 0; i < count; i++) { + for (j = 0; NULL != nettle_hashes[j]; j++) { + if (0 == strcmp(hashes[i], nettle_hashes[j]->name)) + break; + } + ASSERT(NULL != nettle_hashes[j]); /* make sure we found a matching hash */ + } + j = 0; + while (NULL != nettle_hashes[j]) + j++; + ASSERT(j == count); /* we are not missing testing any hashes */ + SUCCESS(); +} +
signature.asc
Description: OpenPGP digital signature
_______________________________________________ nettle-bugs mailing list [email protected] http://lists.lysator.liu.se/mailman/listinfo/nettle-bugs
