X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/eee161205f1139ee49e81c8efa33fe18380c917b..5b69c389f8528045a8aabf848818dcbd1c420881:/sha256.c diff --git a/sha256.c b/sha256.c index 54a4c85..8ffc689 100644 --- a/sha256.c +++ b/sha256.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: sha256.c,v 1.1 2000/10/15 17:48:14 mdw Exp $ + * $Id: sha256.c,v 1.2 2004/03/21 22:43:34 mdw Exp $ * * Implementation of the SHA-256 hash function * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: sha256.c,v $ + * Revision 1.2 2004/03/21 22:43:34 mdw + * New hash variant SHA224. + * * Revision 1.1 2000/10/15 17:48:14 mdw * New SHA variants with longer outputs. * @@ -46,7 +49,7 @@ /*----- Main code ---------------------------------------------------------*/ -/* --- @sha256_compress@ --- * +/* --- @sha256_compress@, @sha224_compress@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context block * @const void *sbuf@ = pointer to buffer of appropriate size @@ -179,7 +182,7 @@ void sha256_compress(sha256_ctx *ctx, const void *sbuf) ctx->h += h; } -/* --- @sha256_init@ --- * +/* --- @sha256_init@, @sha224_init@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context block to initialize * @@ -202,7 +205,21 @@ void sha256_init(sha256_ctx *ctx) ctx->nl = ctx->nh = 0; } -/* --- @sha256_set@ --- * +void sha224_init(sha256_ctx *ctx) +{ + ctx->a = 0xc1059ed8; + ctx->b = 0x367cd507; + ctx->c = 0x3070dd17; + ctx->d = 0xf70e5939; + ctx->e = 0xffc00b31; + ctx->f = 0x68581511; + ctx->g = 0x64f98fa7; + ctx->h = 0xbefa4fa4; + ctx->off = 0; + ctx->nl = ctx->nh = 0; +} + +/* --- @sha256_set@, @sha224_set@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context block * @const void *buf@ = pointer to state buffer @@ -231,7 +248,7 @@ void sha256_set(sha256_ctx *ctx, const void *buf, unsigned long count) ctx->nh = U32(((count & ~MASK32) >> 16) >> 16); } -/* --- @sha256_hash@ --- * +/* --- @sha256_hash@, @sha224_hash@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context block * @const void *buf@ = buffer of data to hash @@ -248,7 +265,7 @@ void sha256_hash(sha256_ctx *ctx, const void *buf, size_t sz) HASH_BUFFER(SHA256, sha256, ctx, buf, sz); } -/* --- @sha256_done@ --- * +/* --- @sha256_done, @sha224_done@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context block * @void *hash@ = pointer to output buffer @@ -258,13 +275,18 @@ void sha256_hash(sha256_ctx *ctx, const void *buf, size_t sz) * Use: Returns the hash of the data read so far. */ -void sha256_done(sha256_ctx *ctx, void *hash) +static void final(sha256_ctx *ctx) { - octet *p = hash; HASH_PAD(SHA256, sha256, ctx, 0x80, 0, 8); STORE32(ctx->buf + SHA256_BUFSZ - 8, (ctx->nl >> 29) | (ctx->nh << 3)); STORE32(ctx->buf + SHA256_BUFSZ - 4, ctx->nl << 3); - sha256_compress(ctx, ctx->buf); + sha256_compress(ctx, ctx->buf); +} + +void sha256_done(sha256_ctx *ctx, void *hash) +{ + octet *p = hash; + final(ctx); STORE32(p + 0, ctx->a); STORE32(p + 4, ctx->b); STORE32(p + 8, ctx->c); @@ -275,7 +297,20 @@ void sha256_done(sha256_ctx *ctx, void *hash) STORE32(p + 28, ctx->h); } -/* --- @sha256_state@ --- * +void sha224_done(sha224_ctx *ctx, void *hash) +{ + octet *p = hash; + final(ctx); + STORE32(p + 0, ctx->a); + STORE32(p + 4, ctx->b); + STORE32(p + 8, ctx->c); + STORE32(p + 12, ctx->d); + STORE32(p + 16, ctx->e); + STORE32(p + 20, ctx->f); + STORE32(p + 24, ctx->g); +} + +/* --- @sha256_state@, @sha224_state@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context * @void *state@ = pointer to buffer for current state