From 5b69c389f8528045a8aabf848818dcbd1c420881 Mon Sep 17 00:00:00 2001 From: mdw Date: Sun, 21 Mar 2004 22:44:24 +0000 Subject: [PATCH] New hash variant SHA224. --- .cvsignore | 4 ++++ Makefile.m4 | 7 ++++-- sha224.c | 14 ++++++++++++ sha224.h | 13 +++++++++++ sha256.c | 55 +++++++++++++++++++++++++++++++++++++--------- sha256.h | 30 ++++++++++++++++++------- tests/sha224 | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 175 insertions(+), 20 deletions(-) create mode 100644 sha224.c create mode 100644 sha224.h create mode 100644 tests/sha224 diff --git a/.cvsignore b/.cvsignore index b8a967d..8eae633 100644 --- a/.cvsignore +++ b/.cvsignore @@ -279,5 +279,9 @@ xtea-ecb.c xtea-ecb.h xtea-ofb.c xtea-ofb.h +sha224-hmac.c +sha224-hmac.h +sha224-mgf.c +sha224-mgf.h junk deb-build diff --git a/Makefile.m4 b/Makefile.m4 index 4428442..814fd34 100644 --- a/Makefile.m4 +++ b/Makefile.m4 @@ -1,6 +1,6 @@ ## -*-m4-*- ## -## $Id: Makefile.m4,v 1.65 2003/11/29 23:39:36 mdw Exp $ +## $Id: Makefile.m4,v 1.66 2004/03/21 22:43:50 mdw Exp $ ## ## Makefile for Catacomb ## @@ -29,6 +29,9 @@ ##----- Revision history ---------------------------------------------------- ## ## $Log: Makefile.m4,v $ +## Revision 1.66 2004/03/21 22:43:50 mdw +## New hash variant SHA224. +## ## Revision 1.65 2003/11/29 23:39:36 mdw ## Debianization. ## @@ -269,7 +272,7 @@ define(`cipher_modes', `_(ecb) _(cbc) _(cfb) _(ofb) _(counter)') define(`hashes', `dnl _(md5) _(md4) _(md2) _(tiger) dnl -_(sha) _(sha256) _(sha384) _(sha512) dnl +_(sha) _(sha224) _(sha256) _(sha384) _(sha512) dnl _(rmd128) _(rmd160) _(rmd256) _(rmd320)') define(`hash_modes', `_(mgf) _(hmac)') diff --git a/sha224.c b/sha224.c new file mode 100644 index 0000000..2eceba0 --- /dev/null +++ b/sha224.c @@ -0,0 +1,14 @@ +/* -*-c-*- + * + * $Id: sha224.c,v 1.1 2004/03/21 22:43:34 mdw Exp $ + * + * Stub code for SHA-224 + */ + +#include "ghash.h" +#include "ghash-def.h" +#include "hash.h" +#include "sha224.h" + +GHASH_DEF(SHA224, sha224) +HASH_TEST(SHA224, sha224) diff --git a/sha224.h b/sha224.h new file mode 100644 index 0000000..23684b7 --- /dev/null +++ b/sha224.h @@ -0,0 +1,13 @@ +/* -*-c-*- + * + * $Id: sha224.h,v 1.1 2004/03/21 22:43:34 mdw Exp $ + * + * Stub header for SHA-224 + */ + +#ifndef CATACOMB_SHA224_H +#define CATACOMB_SHA224_H + +#include "sha256.h" + +#endif 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 diff --git a/sha256.h b/sha256.h index 50d61fa..ca6e18c 100644 --- a/sha256.h +++ b/sha256.h @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: sha256.h,v 1.2 2000/10/15 19:09:20 mdw Exp $ + * $Id: sha256.h,v 1.3 2004/03/21 22:43:34 mdw Exp $ * * Implementation of the SHA-256 hash function * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: sha256.h,v $ + * Revision 1.3 2004/03/21 22:43:34 mdw + * New hash variant SHA224. + * * Revision 1.2 2000/10/15 19:09:20 mdw * Support HMAC mode for hash functions which need to store more state than * the hash output size. @@ -68,6 +71,10 @@ #define SHA256_HASHSZ 32 #define SHA256_STATESZ 32 +#define SHA224_BUFSZ 64 +#define SHA224_HASHSZ 28 +#define SHA224_STATESZ 32 + /*----- Data structures ---------------------------------------------------*/ typedef struct sha256_ctx { @@ -75,11 +82,11 @@ typedef struct sha256_ctx { uint32 nl, nh; /* Byte count so far */ unsigned off; /* Offset into buffer */ octet buf[SHA256_BUFSZ]; /* Accumulation buffer */ -} sha256_ctx; +} sha256_ctx, sha224_ctx; /*----- Functions provided ------------------------------------------------*/ -/* --- @sha256_compress@ --- * +/* --- @sha256_compress@, @sha224_compress@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context block * @const void *sbuf@ = pointer to buffer of appropriate size @@ -90,8 +97,9 @@ typedef struct sha256_ctx { */ extern void sha256_compress(sha256_ctx */*ctx*/, const void */*sbuf*/); +#define sha224_compress sha256_compress -/* --- @sha256_init@ --- * +/* --- @sha256_init@, @sha224_init@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context block to initialize * @@ -101,8 +109,9 @@ extern void sha256_compress(sha256_ctx */*ctx*/, const void */*sbuf*/); */ extern void sha256_init(sha256_ctx */*ctx*/); +extern void sha224_init(sha256_ctx */*ctx*/); -/* --- @sha256_set@ --- * +/* --- @sha256_set@, @sha224_set@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context block * @const void *buf@ = pointer to state buffer @@ -117,8 +126,9 @@ extern void sha256_init(sha256_ctx */*ctx*/); extern void sha256_set(sha256_ctx */*ctx*/, const void */*buf*/, unsigned long /*count*/); +#define sha224_set sha256_set -/* --- @sha256_hash@ --- * +/* --- @sha256_hash@, @sha224_hash@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context block * @const void *buf@ = buffer of data to hash @@ -132,8 +142,9 @@ extern void sha256_set(sha256_ctx */*ctx*/, const void */*buf*/, extern void sha256_hash(sha256_ctx */*ctx*/, const void */*buf*/, size_t /*sz*/); +#define sha224_hash sha256_hash -/* --- @sha256_done@ --- * +/* --- @sha256_done@, @sha224_done@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context block * @void *hash@ = pointer to output buffer @@ -144,8 +155,9 @@ extern void sha256_hash(sha256_ctx */*ctx*/, */ extern void sha256_done(sha256_ctx */*ctx*/, void */*hash*/); +extern void sha224_done(sha256_ctx */*ctx*/, void */*hash*/); -/* --- @sha256_state@ --- * +/* --- @sha256_state@, @sha224_state@ --- * * * Arguments: @sha256_ctx *ctx@ = pointer to context * @void *state@ = pointer to buffer for current state @@ -157,10 +169,12 @@ extern void sha256_done(sha256_ctx */*ctx*/, void */*hash*/); */ extern unsigned long sha256_state(sha256_ctx */*ctx*/, void */*state*/); +#define sha224_state sha256_state /*----- Generic hash interface --------------------------------------------*/ extern const gchash sha256; +extern const gchash sha224; /*----- That's all, folks -------------------------------------------------*/ diff --git a/tests/sha224 b/tests/sha224 new file mode 100644 index 0000000..c9fc538 --- /dev/null +++ b/tests/sha224 @@ -0,0 +1,72 @@ +# $Id: sha224,v 1.1 2004/03/21 22:43:34 mdw Exp $ +# +# Test vectors for SHA-224 + +# --- Basic hash function --- + +sha224 { + + # --- Test vectors from the definition [FALSE] --- + + "abc" + 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7; + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525; + + # --- Other tests to trap regression --- + + "" + d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f; + "a" + abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5; + "message digest" + 2cb21c83ae2f004de7e81c3c7019cbcb65b71ab656b22d6d0c39b8eb; + "abcdefghijklmnopqrstuvwxyz" + 45a5f72c39c5cff2522eb3429799e49e5f44b356ef926bcf390dccc2; + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525; + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + bff72b4fcb7d75e5632900ac5f90d219e05e97a7bde72e740db393d9; +} + +sha224-rep { + "1234567890" 8 + b50aecbe4e9bb0b57bc5f3ae760a8e01db24f203fb3cdcd13148046e; + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 +" 23 + 5a86156c37c95ab356e003d569370580737794815f46de7f4834d634; +} + +# --- HMAC mode --- +# +# Autogenerated, unofficial. + +sha224-hmac { + "Hi There" + 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b + 1abbc7c42cf4ca9f9d7b624564cb72d7b0945ea0a615095904a0fd34; + + "what do ya want for nothing?" + 4a656665 + a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44; + + "ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ" + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 5121d4bc8e43ee3ddcc2b0d312c110e961fc34b19ced1cce11c7a55c; + + "ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ" + 0102030405060708090a0b0c0d0e0f10111213141516171819 + 6c11506874013cac6a2abc1bb382627cec6a90d86efc012de7afec5a; + + "Test With Truncation" + 0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c + 0f081672137307d07aad12880537cd43f454823de00c038424741e17; + + "Test Using Larger Than Block-Size Key - Hash Key First" + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 9ed2eebc0ed23576efc815e9b5bc0d9257e36d13e4dd5d5f0c809b38; + + "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data" + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 7358939e58683a448ac5065196d33191a1c1d33d4b8b0304dc60f5e0; +} -- 2.11.0