X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=crypto%2Falgtables.c;h=e0d6cc8bb3fddb2bc75f6e4bb288e6eba873907b;hb=cf8e1e165e29df4b0e161751e9e952b75236c932;hp=8fa24e4d626742c22fe92be35b9949f35ad5ba2d;hpb=07876950ceee6d28473f347ad2f0c4422c266e32;p=chiark-tcl.git
diff --git a/crypto/algtables.c b/crypto/algtables.c
index 8fa24e4..e0d6cc8 100644
--- a/crypto/algtables.c
+++ b/crypto/algtables.c
@@ -1,63 +1,110 @@
/*
+ * crypto - Tcl bindings for parts of the `nettle' crypto library
+ * Copyright 2006-2012 Ian Jackson
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this library; if not, see .
*/
-#include
-#include
-
-#include "hbytes.h"
-#include "serpent.h"
-#include "sha1.h"
-#include "md5.h"
-
-static void alg_serpent_makekey(void *schedule, const void *key, int keylen) {
- serpent_makekey(schedule, key, keylen);
-}
-
-static void alg_serpent_encrypt(const void *sch, const void *in, void *out) {
- serpent_encrypt(in, out, sch);
-}
-
-static void alg_serpent_decrypt(const void *sch, const void *in, void *out) {
- serpent_decrypt(in, out, sch);
-}
-
-const BlockCipherAlgInfo blockcipheralginfos[]= {
- { "serpent", 16, sizeof(SerpentKeySchedule), 16,32,
- serpent_byteswap_block,
- { alg_serpent_makekey, alg_serpent_encrypt },
- { alg_serpent_makekey, alg_serpent_decrypt } },
+
+#include "chiark_tcl_crypto.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define NETTLE_BLOCKCIPHERS \
+ DO(serpent, SERPENT) \
+ DO(twofish, TWOFISH) \
+/* DO(aes, AES) */ \
+ DO(blowfish, BLOWFISH) \
+ /* ALIAS(rijndael, aes, AES)*/
+
+#define ALIAS(alias,name,NAME)
+#define DO(name,NAME) \
+ static void alg_##name##_makekey(void *sch, const void *key, int keylen) { \
+ name##_set_key(sch, keylen, key); \
+ } \
+ static void alg_##name##_encr(const void *sch, const void *in, void *out) { \
+ name##_encrypt((void*)sch, NAME##_BLOCK_SIZE, out, in); \
+ } \
+ static void alg_##name##_decr(const void *sch, const void *in, void *out) { \
+ name##_decrypt((void*)sch, NAME##_BLOCK_SIZE, out, in); \
+ }
+ NETTLE_BLOCKCIPHERS
+#undef DO
+#undef ALIAS
+
+const BlockCipherAlgInfo cht_blockcipheralginfo_entries[]= {
+#define ALIAS(alias,name,NAME) \
+ { #alias, NAME##_BLOCK_SIZE, sizeof(struct name##_ctx), \
+ NAME##_MIN_KEY_SIZE, NAME##_MAX_KEY_SIZE, \
+ { alg_##name##_makekey, alg_##name##_encr }, \
+ { alg_##name##_makekey, alg_##name##_decr } \
+ },
+#define DO(name,NAME) ALIAS(name,name,NAME)
+ NETTLE_BLOCKCIPHERS
+#undef DO
+#undef ALIAS
+ { 0 }
+};
+
+const BlockCipherPropInfo cht_blockcipherpropinfo_entries[]= {
+ { "blocklen", offsetof(BlockCipherAlgInfo, blocksize) },
+ { "minkeylen", offsetof(BlockCipherAlgInfo, key_min) },
+ { "maxkeylen", offsetof(BlockCipherAlgInfo, key_max) },
+ { 0 }
+};
+
+#define NETTLE_DIGESTS \
+ DO(sha1, SHA1) \
+ DO(sha256, SHA256) \
+ DO(md5, MD5)
+
+#define DO(name,NAME) \
+ static void alg_##name##_init(void *state) { \
+ name##_init(state); \
+ } \
+ static void alg_##name##_update(void *state, const void *data, int len) { \
+ name##_update(state, len, data); \
+ } \
+ static void alg_##name##_final(void *state, void *digest) { \
+ name##_digest(state,NAME##_DIGEST_SIZE,digest); \
+ } \
+ static void alg_##name##_oneshot(void *digest, const void *data, int len) { \
+ struct name##_ctx ctx; \
+ name##_init(&ctx); \
+ name##_update(&ctx, len, data); \
+ name##_digest(&ctx,NAME##_DIGEST_SIZE,digest); \
+ }
+ NETTLE_DIGESTS
+#undef DO
+
+const HashAlgPropInfo cht_hashalgpropinfo_entries[]= {
+ { "hashlen", offsetof(HashAlgInfo, hashsize) },
+ { "blocklen", offsetof(HashAlgInfo, blocksize) },
{ 0 }
};
-static void alg_sha1_init(void *state) { sha1_init(state); }
-static void alg_sha1_update(void *state, const void *data, int len) {
- sha1_update(state, data, len);
-}
-static void alg_sha1_final(void *state, void *digest) {
- sha1_final(state, digest);
-}
-static void alg_sha1_oneshot(void *digest, const void *data, int len) {
- sha1(data,len,digest);
-}
-
-static void alg_md5_init(void *state) { MD5Init(state); }
-static void alg_md5_update(void *state, const void *data, int len) {
- MD5Update(state, data, len);
-}
-static void alg_md5_final(void *state, void *digest) {
- MD5Final(digest, state);
-}
-static void alg_md5_oneshot(void *digest, const void *data, int len) {
- struct MD5Context ctx;
- MD5Init(&ctx);
- MD5Update(&ctx,data,len);
- MD5Final(digest,&ctx);
-}
-
-const HashAlgInfo hashalginfos[]= {
- { "sha1", 20, 64, sizeof(struct sha1_state),
- alg_sha1_init, alg_sha1_update, alg_sha1_final, alg_sha1_oneshot },
- { "md5", 16, 64, sizeof(struct MD5Context),
- alg_md5_init, alg_md5_update, alg_md5_final, alg_md5_oneshot },
+const HashAlgInfo cht_hashalginfo_entries[]= {
+#define DO(name,NAME) \
+ { #name, NAME##_DIGEST_SIZE, NAME##_DATA_SIZE, sizeof(struct name##_ctx), \
+ alg_##name##_init, alg_##name##_update, alg_##name##_final, \
+ alg_##name##_oneshot },
+ NETTLE_DIGESTS
+#undef DO
{ 0 }
};