diff options
author | Simon Josefsson <simon@josefsson.org> | 2005-10-17 13:13:08 +0000 |
---|---|---|
committer | Simon Josefsson <simon@josefsson.org> | 2005-10-17 13:13:08 +0000 |
commit | 42a58ba9efc7afe5f359f9e5992d15651843c92c (patch) | |
tree | c37d964456d3ab074d93ce8b0d0e86f021afe89e /lib/gc-libgcrypt.c | |
parent | 1ded427a5e0dba47b32257e484a29418cf789653 (diff) | |
download | gnulib-42a58ba9efc7afe5f359f9e5992d15651843c92c.tar.gz |
Add more hash functions.
Diffstat (limited to 'lib/gc-libgcrypt.c')
-rw-r--r-- | lib/gc-libgcrypt.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/lib/gc-libgcrypt.c b/lib/gc-libgcrypt.c index a7d2c17d9f..5eb14e6447 100644 --- a/lib/gc-libgcrypt.c +++ b/lib/gc-libgcrypt.c @@ -215,6 +215,118 @@ gc_cipher_close (gc_cipher_handle handle) /* Hashes. */ Gc_rc +gc_hash_open (Gc_hash hash, Gc_hash_mode mode, gc_hash_handle * outhandle) +{ + int gcryalg, gcrymode; + gcry_error_t err; + + switch (hash) + { + case GC_MD5: + gcryalg = GCRY_MD_MD5; + break; + + case GC_SHA1: + gcryalg = GCRY_MD_SHA1; + break; + + case GC_RMD160: + gcryalg = GCRY_MD_RMD160; + break; + + default: + return GC_INVALID_HASH; + } + + switch (mode) + { + case 0: + gcrymode = 0; + break; + + case GC_HMAC: + gcrymode = GCRY_MD_FLAG_HMAC; + break; + + default: + return GC_INVALID_HASH; + } + + err = gcry_md_open ((gcry_md_hd_t *) outhandle, gcryalg, gcrymode); + if (gcry_err_code (err)) + return GC_INVALID_HASH; + + return GC_OK; +} + +Gc_rc +gc_hash_clone (gc_hash_handle handle, gc_hash_handle * outhandle) +{ + int err; + + err = gcry_md_copy ((gcry_md_hd_t *) outhandle, (gcry_md_hd_t) handle); + if (err) + return GC_INVALID_HASH; + + return GC_OK; +} + +size_t +gc_hash_digest_length (Gc_hash hash) +{ + int gcryalg; + + switch (hash) + { + case GC_MD5: + gcryalg = GCRY_MD_MD5; + break; + + case GC_SHA1: + gcryalg = GCRY_MD_SHA1; + break; + + case GC_RMD160: + gcryalg = GCRY_MD_RMD160; + break; + + default: + return 0; + } + + return gcry_md_get_algo_dlen (gcryalg); +} + +void +gc_hash_hmac_setkey (gc_hash_handle handle, size_t len, const char *key) +{ + gcry_md_setkey ((gcry_md_hd_t) handle, key, len); +} + +void +gc_hash_write (gc_hash_handle handle, size_t len, const char *data) +{ + gcry_md_write ((gcry_md_hd_t) handle, data, len); +} + +const char * +gc_hash_read (gc_hash_handle handle) +{ + const char *digest; + + gcry_md_final ((gcry_md_hd_t) handle); + digest = gcry_md_read ((gcry_md_hd_t) handle, 0); + + return digest; +} + +void +gc_hash_close (gc_hash_handle handle) +{ + gcry_md_close ((gcry_md_hd_t) handle); +} + +Gc_rc gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *resbuf) { int gcryalg; @@ -233,6 +345,12 @@ gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *resbuf) break; #endif +#ifdef GC_USE_RMD160 + case GC_RMD160: + gcryalg = GCRY_MD_RMD160; + break; +#endif + default: return GC_INVALID_HASH; } |