X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccrypt%2Fsilchash.c;h=52419b0b296635091e1eff4b3cb2343d494242e3;hb=38d89c8cd04b2b9b7e487230420bbf21d26ac722;hp=5e740df5c9baebe29d528b3997e38ee321dc05f9;hpb=9be2c37303ca7ee9f860e3a3b3d625fae88b0cea;p=silc.git diff --git a/lib/silccrypt/silchash.c b/lib/silccrypt/silchash.c index 5e740df5..52419b0b 100644 --- a/lib/silccrypt/silchash.c +++ b/lib/silccrypt/silchash.c @@ -24,6 +24,12 @@ #include "md5.h" #include "sha1.h" +/* The main SILC hash structure. */ +struct SilcHashStruct { + SilcHashObject *hash; + void *context; +}; + #ifndef SILC_EPOC /* List of dynamically registered hash functions. */ SilcDList silc_hash_list = NULL; @@ -159,7 +165,6 @@ bool silc_hash_alloc(const unsigned char *name, SilcHash *new_hash) *new_hash = silc_calloc(1, sizeof(**new_hash)); (*new_hash)->hash = entry; (*new_hash)->context = silc_calloc(1, entry->context_len()); - (*new_hash)->make_hash = silc_hash_make; return TRUE; } @@ -183,6 +188,20 @@ SilcUInt32 silc_hash_len(SilcHash hash) return hash->hash->hash_len; } +/* Returns the block lenght of the hash. */ + +SilcUInt32 silc_hash_block_len(SilcHash hash) +{ + return hash->hash->block_len; +} + +/* Returns the name of the hash function */ + +const char *silc_hash_get_name(SilcHash hash) +{ + return hash->hash->name; +} + /* Returns TRUE if hash algorithm `name' is supported. */ bool silc_hash_is_supported(const unsigned char *name) @@ -254,14 +273,36 @@ char *silc_hash_get_supported(void) void silc_hash_make(SilcHash hash, const unsigned char *data, SilcUInt32 len, unsigned char *return_hash) +{ + silc_hash_init(hash); + silc_hash_update(hash, data, len); + silc_hash_final(hash, return_hash); +} + +void silc_hash_init(SilcHash hash) { hash->hash->init(hash->context); - hash->hash->update(hash->context, (unsigned char *)data, len); +} + +void silc_hash_update(SilcHash hash, const unsigned char *data, + SilcUInt32 data_len) +{ + hash->hash->update(hash->context, (unsigned char *)data, data_len); +} + +void silc_hash_final(SilcHash hash, unsigned char *return_hash) +{ hash->hash->final(hash->context, return_hash); } +void silc_hash_transform(SilcHash hash, SilcUInt32 *state, + const unsigned char *data) +{ + hash->hash->transform(state, data); +} + /* Creates fingerprint of the data. If `hash' is NULL SHA1 is used as - default hash function. The returned fingerprint must be free's by the + default hash function. The returned fingerprint must be freed by the caller. */ char *silc_hash_fingerprint(SilcHash hash, const unsigned char *data,