#include "hbytes.h"
#include "serpent.h"
-#include "sha1.h"
-#include "md5.h"
+
+#include <nettle/md5.h>
+#include <nettle/sha.h>
static void alg_serpent_makekey(void *schedule, const void *key, int keylen) {
serpent_makekey(schedule, key, keylen);
{ 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);
-}
+#define NETTLE_DIGESTS \
+ DO(sha1, SHA1) \
+ DO(sha256, SHA256) \
+ DO(md5, MD5)
-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);
-}
+#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 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 },
+#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 }
};