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

Reply via email to