// SHA-224. Adapted from LibTomCrypt. This code is Public Domain #include "hash.h" #include #include extern void z__b_sha2_256_update( struct b_hash_ctx *md, const void *src, size_t inlen); extern void z__b_sha2_256_finish(struct b_hash_ctx *md, void *out, size_t max); static void sha_init(struct b_hash_ctx *md) { md->ctx_state.sha2_256.curlen = 0; md->ctx_state.sha2_256.length = 0; md->ctx_state.sha2_256.state[0] = 0xc1059ed8UL; md->ctx_state.sha2_256.state[1] = 0x367cd507UL; md->ctx_state.sha2_256.state[2] = 0x3070dd17UL; md->ctx_state.sha2_256.state[3] = 0xf70e5939UL; md->ctx_state.sha2_256.state[4] = 0xffc00b31UL; md->ctx_state.sha2_256.state[5] = 0x68581511UL; md->ctx_state.sha2_256.state[6] = 0x64f98fa7UL; md->ctx_state.sha2_256.state[7] = 0xbefa4fa4UL; } static void sha_update(struct b_hash_ctx *md, const void *in, size_t inlen) { z__b_sha2_256_update(md, in, inlen); } static void sha_finish(struct b_hash_ctx *md, void *out, size_t max) { unsigned char res[B_DIGEST_LENGTH_SHA2_256]; z__b_sha2_256_finish(md, res, max); /* truncate the digest to 224 bits */ memcpy(out, res, b_min(size_t, max, B_DIGEST_LENGTH_224)); } struct b_hash_function_ops z__b_sha2_224_ops = { .hash_init = sha_init, .hash_update = sha_update, .hash_finish = sha_finish, };