On Sun, Dec 22, 2013 at 06:10:47PM -0500, Ted Unangst wrote:
> On Sat, Dec 21, 2013 at 22:40, Ted Unangst wrote:
> > I also point out that all the HashFinal functions check for a null
> > digest and don't do anything in that case. This seems stupid to
> > me, I think such programs should crash. I didn't change anything
> > yet because they are at least all consistent. Thoughts?
>
> Here's the deep cleanse version. The behavior with null digest was
> never documented.
>
> (in sha512, the removal of the block introduces a mix of declarations
> and statements. i have left this as is, now that all base compilers
> support it, rather than further complicate the ifdef.)
>
ok gilles@
> Index: md4.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/hash/md4.c,v
> retrieving revision 1.7
> diff -u -p -r1.7 md4.c
> --- md4.c 8 Aug 2005 08:05:35 -0000 1.7
> +++ md4.c 22 Dec 2013 23:03:22 -0000
> @@ -127,11 +127,9 @@ MD4Final(unsigned char digest[MD4_DIGEST
> int i;
>
> MD4Pad(ctx);
> - if (digest != NULL) {
> - for (i = 0; i < 4; i++)
> - PUT_32BIT_LE(digest + i * 4, ctx->state[i]);
> - memset(ctx, 0, sizeof(*ctx));
> - }
> + for (i = 0; i < 4; i++)
> + PUT_32BIT_LE(digest + i * 4, ctx->state[i]);
> + memset(ctx, 0, sizeof(*ctx));
> }
>
>
> Index: md5.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/hash/md5.c,v
> retrieving revision 1.8
> diff -u -p -r1.8 md5.c
> --- md5.c 8 Aug 2005 08:05:35 -0000 1.8
> +++ md5.c 22 Dec 2013 23:03:22 -0000
> @@ -126,11 +126,9 @@ MD5Final(unsigned char digest[MD5_DIGEST
> int i;
>
> MD5Pad(ctx);
> - if (digest != NULL) {
> - for (i = 0; i < 4; i++)
> - PUT_32BIT_LE(digest + i * 4, ctx->state[i]);
> - memset(ctx, 0, sizeof(*ctx));
> - }
> + for (i = 0; i < 4; i++)
> + PUT_32BIT_LE(digest + i * 4, ctx->state[i]);
> + memset(ctx, 0, sizeof(*ctx));
> }
>
>
> Index: rmd160.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/hash/rmd160.c,v
> retrieving revision 1.18
> diff -u -p -r1.18 rmd160.c
> --- rmd160.c 8 Aug 2005 08:05:35 -0000 1.18
> +++ rmd160.c 22 Dec 2013 23:03:23 -0000
> @@ -151,11 +151,9 @@ RMD160Final(u_int8_t digest[RMD160_DIGES
> int i;
>
> RMD160Pad(ctx);
> - if (digest != NULL) {
> - for (i = 0; i < 5; i++)
> - PUT_32BIT_LE(digest + i*4, ctx->state[i]);
> - memset(ctx, 0, sizeof (*ctx));
> - }
> + for (i = 0; i < 5; i++)
> + PUT_32BIT_LE(digest + i*4, ctx->state[i]);
> + memset(ctx, 0, sizeof (*ctx));
> }
>
> void
> Index: sha1.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/hash/sha1.c,v
> retrieving revision 1.22
> diff -u -p -r1.22 sha1.c
> --- sha1.c 27 Aug 2012 21:05:43 -0000 1.22
> +++ sha1.c 22 Dec 2013 23:03:23 -0000
> @@ -165,11 +165,9 @@ SHA1Final(u_int8_t digest[SHA1_DIGEST_LE
> u_int i;
>
> SHA1Pad(context);
> - if (digest) {
> - for (i = 0; i < SHA1_DIGEST_LENGTH; i++) {
> - digest[i] = (u_int8_t)
> - ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
> - }
> - memset(context, 0, sizeof(*context));
> + for (i = 0; i < SHA1_DIGEST_LENGTH; i++) {
> + digest[i] = (u_int8_t)
> + ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
> }
> + memset(context, 0, sizeof(*context));
> }
> Index: sha2.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/hash/sha2.c,v
> retrieving revision 1.15
> diff -u -p -r1.15 sha2.c
> --- sha2.c 22 Dec 2013 22:55:51 -0000 1.15
> +++ sha2.c 22 Dec 2013 23:03:23 -0000
> @@ -302,19 +302,16 @@ SHA224Final(u_int8_t digest[SHA224_DIGES
> {
> SHA224Pad(context);
>
> - /* If no digest buffer is passed, we don't bother doing this: */
> - if (digest != NULL) {
> #if BYTE_ORDER == LITTLE_ENDIAN
> - int i;
> + int i;
>
> - /* Convert TO host byte order */
> - for (i = 0; i < 7; i++)
> - BE_32_TO_8(digest + i * 4, context->state.st32[i]);
> + /* Convert TO host byte order */
> + for (i = 0; i < 7; i++)
> + BE_32_TO_8(digest + i * 4, context->state.st32[i]);
> #else
> - memcpy(digest, context->state.st32, SHA224_DIGEST_LENGTH);
> + memcpy(digest, context->state.st32, SHA224_DIGEST_LENGTH);
> #endif
> - memset(context, 0, sizeof(*context));
> - }
> + memset(context, 0, sizeof(*context));
> }
> #endif /* SHA256_ONLY */
>
> @@ -580,19 +577,16 @@ SHA256Final(u_int8_t digest[SHA256_DIGES
> {
> SHA256Pad(context);
>
> - /* If no digest buffer is passed, we don't bother doing this: */
> - if (digest != NULL) {
> #if BYTE_ORDER == LITTLE_ENDIAN
> - int i;
> + int i;
>
> - /* Convert TO host byte order */
> - for (i = 0; i < 8; i++)
> - BE_32_TO_8(digest + i * 4, context->state.st32[i]);
> + /* Convert TO host byte order */
> + for (i = 0; i < 8; i++)
> + BE_32_TO_8(digest + i * 4, context->state.st32[i]);
> #else
> - memcpy(digest, context->state.st32, SHA256_DIGEST_LENGTH);
> + memcpy(digest, context->state.st32, SHA256_DIGEST_LENGTH);
> #endif
> - memset(context, 0, sizeof(*context));
> - }
> + memset(context, 0, sizeof(*context));
> }
>
>
> @@ -860,19 +854,16 @@ SHA512Final(u_int8_t digest[SHA512_DIGES
> {
> SHA512Pad(context);
>
> - /* If no digest buffer is passed, we don't bother doing this: */
> - if (digest != NULL) {
> #if BYTE_ORDER == LITTLE_ENDIAN
> - int i;
> + int i;
>
> - /* Convert TO host byte order */
> - for (i = 0; i < 8; i++)
> - BE_64_TO_8(digest + i * 8, context->state.st64[i]);
> + /* Convert TO host byte order */
> + for (i = 0; i < 8; i++)
> + BE_64_TO_8(digest + i * 8, context->state.st64[i]);
> #else
> - memcpy(digest, context->state.st64, SHA512_DIGEST_LENGTH);
> + memcpy(digest, context->state.st64, SHA512_DIGEST_LENGTH);
> #endif
> - memset(context, 0, sizeof(*context));
> - }
> + memset(context, 0, sizeof(*context));
> }
>
>
> @@ -895,19 +886,15 @@ SHA384Final(u_int8_t digest[SHA384_DIGES
> {
> SHA384Pad(context);
>
> - /* If no digest buffer is passed, we don't bother doing this: */
> - if (digest != NULL) {
> #if BYTE_ORDER == LITTLE_ENDIAN
> - int i;
> + int i;
>
> - /* Convert TO host byte order */
> - for (i = 0; i < 6; i++)
> - BE_64_TO_8(digest + i * 8, context->state.st64[i]);
> + /* Convert TO host byte order */
> + for (i = 0; i < 6; i++)
> + BE_64_TO_8(digest + i * 8, context->state.st64[i]);
> #else
> - memcpy(digest, context->state.st64, SHA384_DIGEST_LENGTH);
> + memcpy(digest, context->state.st64, SHA384_DIGEST_LENGTH);
> #endif
> - }
> -
> /* Zero out state data */
> memset(context, 0, sizeof(*context));
> }
>
--
Gilles Chehade
https://www.poolp.org @poolpOrg