X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/eee161205f1139ee49e81c8efa33fe18380c917b..b2524d68efdcf16f3f7340da16094f17826c7b95:/sha256.c diff --git a/sha256.c b/sha256.c index 54a4c85..683ba13 100644 --- a/sha256.c +++ b/sha256.c @@ -1,13 +1,13 @@ /* -*-c-*- * - * $Id: sha256.c,v 1.1 2000/10/15 17:48:14 mdw Exp $ + * $Id: sha256.c,v 1.3 2004/04/08 01:36:15 mdw Exp $ * * Implementation of the SHA-256 hash function * * (c) 2000 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of Catacomb. * @@ -15,26 +15,18 @@ * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. - * + * * Catacomb is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. - * + * * You should have received a copy of the GNU Library General Public * License along with Catacomb; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: sha256.c,v $ - * Revision 1.1 2000/10/15 17:48:14 mdw - * New SHA variants with longer outputs. - * - */ - /*----- Header files ------------------------------------------------------*/ #include @@ -46,7 +38,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 @@ -101,7 +93,7 @@ void sha256_compress(sha256_ctx *ctx, const void *sbuf) } /* --- The main compression function --- */ - + T(a, b, c, d, e, f, g, h, 0, 0x428a2f98); T(h, a, b, c, d, e, f, g, 1, 0x71374491); T(g, h, a, b, c, d, e, f, 2, 0xb5c0fbcf); @@ -179,7 +171,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 +194,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 +237,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 +254,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 +264,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); +} + +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 +286,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