Module Name: src Committed By: joerg Date: Thu Jun 11 19:02:04 UTC 2009
Modified Files: src/common/lib/libc/hash/sha2: sha2.c Log Message: De-uglify: - drop useless asserts - use uintXX_t directly - use NULL To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/common/lib/libc/hash/sha2/sha2.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/common/lib/libc/hash/sha2/sha2.c diff -u src/common/lib/libc/hash/sha2/sha2.c:1.9 src/common/lib/libc/hash/sha2/sha2.c:1.10 --- src/common/lib/libc/hash/sha2/sha2.c:1.9 Thu Jun 11 18:46:37 2009 +++ src/common/lib/libc/hash/sha2/sha2.c Thu Jun 11 19:02:04 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: sha2.c,v 1.9 2009/06/11 18:46:37 joerg Exp $ */ +/* $NetBSD: sha2.c,v 1.10 2009/06/11 19:02:04 joerg Exp $ */ /* $KAME: sha2.c,v 1.9 2003/07/20 00:28:38 itojun Exp $ */ /* @@ -39,113 +39,25 @@ #include <sys/cdefs.h> #if defined(_KERNEL) || defined(_STANDALONE) -__KERNEL_RCSID(0, "$NetBSD: sha2.c,v 1.9 2009/06/11 18:46:37 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sha2.c,v 1.10 2009/06/11 19:02:04 joerg Exp $"); #include <lib/libkern/libkern.h> #else #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: sha2.c,v 1.9 2009/06/11 18:46:37 joerg Exp $"); +__RCSID("$NetBSD: sha2.c,v 1.10 2009/06/11 19:02:04 joerg Exp $"); #endif /* LIBC_SCCS and not lint */ #include "namespace.h" -#include <assert.h> #include <string.h> #endif #include <sys/types.h> -#include <sys/param.h> #include <sys/sha2.h> #include <sys/endian.h> -/* - * ASSERT NOTE: - * Some sanity checking code is included using assert(). On my FreeBSD - * system, this additional code can be removed by compiling with NDEBUG - * defined. Check your own systems manpage on assert() to see how to - * compile WITHOUT the sanity checking code on your system. - * - * UNROLLED TRANSFORM LOOP NOTE: - * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform - * loop version for the hash transform rounds (defined using macros - * later in this file). Either define on the command line, for example: - * - * cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c - * - * or define below: - * - * #define SHA2_UNROLL_TRANSFORM - * - */ - -#if defined(__bsdi__) || defined(__FreeBSD__) -#define assert(x) -#endif - - -/*** SHA-256/384/512 Machine Architecture Definitions *****************/ -/* - * BYTE_ORDER NOTE: - * - * Please make sure that your system defines BYTE_ORDER. If your - * architecture is little-endian, make sure it also defines - * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are - * equivilent. - * - * If your system does not define the above, then you can do so by - * hand like this: - * - * #define LITTLE_ENDIAN 1234 - * #define BIG_ENDIAN 4321 - * - * And for little-endian machines, add: - * - * #define BYTE_ORDER LITTLE_ENDIAN - * - * Or for big-endian machines: - * - * #define BYTE_ORDER BIG_ENDIAN - * - * The FreeBSD machine this was written on defines BYTE_ORDER - * appropriately by including <sys/types.h> (which in turn includes - * <machine/endian.h> where the appropriate definitions are actually - * made). - */ -#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN) -#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN -#endif - -/* - * Define the followingsha2_* types to types of the correct length on - * the native archtecture. Most BSD systems and Linux define u_intXX_t - * types. Machines with recent ANSI C headers, can use the standard C99 - * uintXX_t definintions from inttypes.h by defining SHA2_USE_INTTYPES_H - * during compile or in the sha.h header file. - * - * Machines that support neither u_intXX_t nor inttypes.h's uintXX_t - * will need to define these three typedefs below (and the appropriate - * ones in sha.h too) by hand according to their system architecture. - * - * Thank you, Jun-ichiro itojun Hagino, for suggesting using u_intXX_t - * types and pointing out recent ANSI C support for uintXX_t in inttypes.h. - */ -#if 1 /*def SHA2_USE_INTTYPES_H*/ - -typedef uint8_t sha2_byte; /* Exactly 1 byte */ -typedef uint32_t sha2_word32; /* Exactly 4 bytes */ -typedef uint64_t sha2_word64; /* Exactly 8 bytes */ - -#else /* SHA2_USE_INTTYPES_H */ - -typedef u_int8_t sha2_byte; /* Exactly 1 byte */ -typedef u_int32_t sha2_word32; /* Exactly 4 bytes */ -typedef u_int64_t sha2_word64; /* Exactly 8 bytes */ - -#endif /* SHA2_USE_INTTYPES_H */ - - /*** SHA-256/384/512 Various Length Definitions ***********************/ /* NOTE: Most of these are in sha2.h */ #define SHA256_SHORT_BLOCK_LENGTH (SHA256_BLOCK_LENGTH - 8) @@ -158,7 +70,7 @@ * 64-bit words): */ #define ADDINC128(w,n) { \ - (w)[0] += (sha2_word64)(n); \ + (w)[0] += (uint64_t)(n); \ if ((w)[0] < (n)) { \ (w)[1]++; \ } \ @@ -202,15 +114,15 @@ * only. */ static void SHA512_Last(SHA512_CTX*); -void SHA224_Transform(SHA224_CTX*, const sha2_word64*); -void SHA256_Transform(SHA256_CTX*, const sha2_word32*); -void SHA384_Transform(SHA384_CTX*, const sha2_word64*); -void SHA512_Transform(SHA512_CTX*, const sha2_word64*); +void SHA224_Transform(SHA224_CTX*, const uint64_t*); +void SHA256_Transform(SHA256_CTX*, const uint32_t*); +void SHA384_Transform(SHA384_CTX*, const uint64_t*); +void SHA512_Transform(SHA512_CTX*, const uint64_t*); /*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/ /* Hash constant words K for SHA-256: */ -static const sha2_word32 K256[64] = { +static const uint32_t K256[64] = { 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL, @@ -230,7 +142,7 @@ }; /* Initial hash value H for SHA-224: */ -static const sha2_word32 sha224_initial_hash_value[8] = { +static const uint32_t sha224_initial_hash_value[8] = { 0xc1059ed8UL, 0x367cd507UL, 0x3070dd17UL, @@ -242,7 +154,7 @@ }; /* Initial hash value H for SHA-256: */ -static const sha2_word32 sha256_initial_hash_value[8] = { +static const uint32_t sha256_initial_hash_value[8] = { 0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, @@ -254,7 +166,7 @@ }; /* Hash constant words K for SHA-384 and SHA-512: */ -static const sha2_word64 K512[80] = { +static const uint64_t K512[80] = { 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, @@ -298,7 +210,7 @@ }; /* Initial hash value H for SHA-384 */ -static const sha2_word64 sha384_initial_hash_value[8] = { +static const uint64_t sha384_initial_hash_value[8] = { 0xcbbb9d5dc1059ed8ULL, 0x629a292a367cd507ULL, 0x9159015a3070dd17ULL, @@ -310,7 +222,7 @@ }; /* Initial hash value H for SHA-512 */ -static const sha2_word64 sha512_initial_hash_value[8] = { +static const uint64_t sha512_initial_hash_value[8] = { 0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL, @@ -367,7 +279,7 @@ return 1; } -void SHA224_Transform(SHA224_CTX* context, const sha2_word64* data) { +void SHA224_Transform(SHA224_CTX* context, const uint64_t* data) { SHA224_Transform((SHA256_CTX*)context, data); } @@ -395,12 +307,12 @@ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \ j++ -void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) { - sha2_word32 a, b, c, d, e, f, g, h, s0, s1; - sha2_word32 T1, *W256; +void SHA256_Transform(SHA256_CTX* context, const uint32_t* data) { + uint32_t a, b, c, d, e, f, g, h, s0, s1; + uint32_t T1, *W256; int j; - W256 = (sha2_word32*)context->buffer; + W256 = (uint32_t *)context->buffer; /* Initialize registers with the prev. intermediate value */ a = context->state[0]; @@ -453,12 +365,12 @@ #else /* SHA2_UNROLL_TRANSFORM */ -void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) { - sha2_word32 a, b, c, d, e, f, g, h, s0, s1; - sha2_word32 T1, T2, *W256; +void SHA256_Transform(SHA256_CTX* context, const uint32_t* data) { + uint32_t a, b, c, d, e, f, g, h, s0, s1; + uint32_t T1, T2, *W256; int j; - W256 = (sha2_word32*)(void *)context->buffer; + W256 = (uint32_t *)(void *)context->buffer; /* Initialize registers with the prev. intermediate value */ a = context->state[0]; @@ -528,11 +440,11 @@ #endif /* SHA2_UNROLL_TRANSFORM */ -int SHA224_Update(SHA256_CTX *context, const sha2_byte *data, size_t len) { +int SHA224_Update(SHA256_CTX *context, const uint8_t *data, size_t len) { return SHA256_Update(context, data, len); } -int SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { +int SHA256_Update(SHA256_CTX* context, const uint8_t *data, size_t len) { unsigned int freespace, usedspace; if (len == 0) { @@ -540,9 +452,6 @@ return 1; } - /* Sanity check: */ - assert(context != (SHA256_CTX*)0 && data != (sha2_byte*)0); - usedspace = (unsigned int)((context->bitcount >> 3) % SHA256_BLOCK_LENGTH); if (usedspace > 0) { @@ -555,7 +464,7 @@ context->bitcount += freespace << 3; len -= freespace; data += freespace; - SHA256_Transform(context, (sha2_word32*)(void *)context->buffer); + SHA256_Transform(context, (uint32_t *)(void *)context->buffer); } else { /* The buffer is not yet full */ memcpy(&context->buffer[usedspace], data, len); @@ -575,7 +484,7 @@ if ((uintptr_t)data % 4 == 0) { while (len >= SHA256_BLOCK_LENGTH) { SHA256_Transform(context, - (const sha2_word32 *)(const void *)data); + (const uint32_t *)(const void *)data); context->bitcount += SHA256_BLOCK_LENGTH << 3; len -= SHA256_BLOCK_LENGTH; data += SHA256_BLOCK_LENGTH; @@ -584,7 +493,7 @@ while (len >= SHA256_BLOCK_LENGTH) { memcpy(context->buffer, data, SHA256_BLOCK_LENGTH); SHA256_Transform(context, - (const sha2_word32 *)(const void *)context->buffer); + (const uint32_t *)(const void *)context->buffer); context->bitcount += SHA256_BLOCK_LENGTH << 3; len -= SHA256_BLOCK_LENGTH; data += SHA256_BLOCK_LENGTH; @@ -601,16 +510,13 @@ return 1; } -static int SHA224_256_Final(sha2_byte digest[], SHA256_CTX* context, size_t len) { - sha2_word32 *d = (void *)digest; +static int SHA224_256_Final(uint8_t digest[], SHA256_CTX* context, size_t len) { + uint32_t *d = (void *)digest; unsigned int usedspace; size_t i; - /* Sanity check: */ - assert(context != (SHA256_CTX*)0); - /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { + if (digest != NULL) { usedspace = (unsigned int)((context->bitcount >> 3) % SHA256_BLOCK_LENGTH); context->bitcount = htobe64(context->bitcount); if (usedspace > 0) { @@ -625,7 +531,7 @@ memset(&context->buffer[usedspace], 0, (size_t)(SHA256_BLOCK_LENGTH - usedspace)); } /* Do second-to-last transform: */ - SHA256_Transform(context, (sha2_word32*)(void *)context->buffer); + SHA256_Transform(context, (uint32_t *)(void *)context->buffer); /* And set-up for the last transform: */ memset(context->buffer, 0, (size_t)(SHA256_SHORT_BLOCK_LENGTH)); @@ -638,10 +544,10 @@ *context->buffer = 0x80; } /* Set the bit count: */ - *(sha2_word64*)(void *)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount; + *(uint64_t *)(void *)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount; /* Final transform: */ - SHA256_Transform(context, (sha2_word32*)(void *)context->buffer); + SHA256_Transform(context, (uint32_t *)(void *)context->buffer); for (i = 0; i < len / 4; i++) d[i] = htobe32(context->state[i]); @@ -654,19 +560,19 @@ return 1; } -int SHA224_Final(sha2_byte digest[], SHA256_CTX* context) { +int SHA224_Final(uint8_t digest[], SHA256_CTX* context) { return SHA224_256_Final(digest, context, SHA224_DIGEST_LENGTH); } -int SHA256_Final(sha2_byte digest[], SHA256_CTX* context) { +int SHA256_Final(uint8_t digest[], SHA256_CTX* context) { return SHA224_256_Final(digest, context, SHA256_DIGEST_LENGTH); } /*** SHA-512: *********************************************************/ int SHA512_Init(SHA512_CTX* context) { - if (context == (SHA512_CTX*)0) { + if (context == NULL) return 1; - } + memcpy(context->state, sha512_initial_hash_value, (size_t)(SHA512_DIGEST_LENGTH)); memset(context->buffer, 0, (size_t)(SHA512_BLOCK_LENGTH)); context->bitcount[0] = context->bitcount[1] = 0; @@ -697,9 +603,9 @@ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \ j++ -void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) { - sha2_word64 a, b, c, d, e, f, g, h, s0, s1; - sha2_word64 T1, *W512 = (sha2_word64*)context->buffer; +void SHA512_Transform(SHA512_CTX* context, const uint64_t* data) { + uint64_t a, b, c, d, e, f, g, h, s0, s1; + uint64_t T1, *W512 = (uint64_t *)context->buffer; int j; /* Initialize registers with the prev. intermediate value */ @@ -752,9 +658,9 @@ #else /* SHA2_UNROLL_TRANSFORM */ -void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) { - sha2_word64 a, b, c, d, e, f, g, h, s0, s1; - sha2_word64 T1, T2, *W512 = (void *)context->buffer; +void SHA512_Transform(SHA512_CTX* context, const uint64_t* data) { + uint64_t a, b, c, d, e, f, g, h, s0, s1; + uint64_t T1, T2, *W512 = (void *)context->buffer; int j; /* Initialize registers with the prev. intermediate value */ @@ -825,7 +731,7 @@ #endif /* SHA2_UNROLL_TRANSFORM */ -int SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) { +int SHA512_Update(SHA512_CTX* context, const uint8_t *data, size_t len) { unsigned int freespace, usedspace; if (len == 0) { @@ -833,9 +739,6 @@ return 1; } - /* Sanity check: */ - assert(context != (SHA512_CTX*)0 && data != (sha2_byte*)0); - usedspace = (unsigned int)((context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH); if (usedspace > 0) { /* Calculate how much free space is available in the buffer */ @@ -847,7 +750,7 @@ ADDINC128(context->bitcount, freespace << 3); len -= freespace; data += freespace; - SHA512_Transform(context, (sha2_word64*)(void *)context->buffer); + SHA512_Transform(context, (uint64_t *)(void *)context->buffer); } else { /* The buffer is not yet full */ memcpy(&context->buffer[usedspace], data, len); @@ -867,7 +770,7 @@ if ((uintptr_t)data % 8 == 0) { while (len >= SHA512_BLOCK_LENGTH) { SHA512_Transform(context, - (const sha2_word64*)(const void *)data); + (const uint64_t*)(const void *)data); ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3); len -= SHA512_BLOCK_LENGTH; data += SHA512_BLOCK_LENGTH; @@ -911,7 +814,7 @@ memset(&context->buffer[usedspace], 0, (size_t)(SHA512_BLOCK_LENGTH - usedspace)); } /* Do second-to-last transform: */ - SHA512_Transform(context, (sha2_word64*)(void *)context->buffer); + SHA512_Transform(context, (uint64_t *)(void *)context->buffer); /* And set-up for the last transform: */ memset(context->buffer, 0, (size_t)(SHA512_BLOCK_LENGTH - 2)); @@ -924,22 +827,19 @@ *context->buffer = 0x80; } /* Store the length of input data (in bits): */ - *(sha2_word64*)(void *)&context->buffer[SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1]; - *(sha2_word64*)(void *)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0]; + *(uint64_t *)(void *)&context->buffer[SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1]; + *(uint64_t *)(void *)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0]; /* Final transform: */ - SHA512_Transform(context, (sha2_word64*)(void *)context->buffer); + SHA512_Transform(context, (uint64_t *)(void *)context->buffer); } -int SHA512_Final(sha2_byte digest[], SHA512_CTX* context) { - sha2_word64 *d = (void *)digest; +int SHA512_Final(uint8_t digest[], SHA512_CTX* context) { + uint64_t *d = (void *)digest; size_t i; - /* Sanity check: */ - assert(context != (SHA512_CTX*)0); - /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { + if (digest != NULL) { SHA512_Last(context); /* Save the hash data for output: */ @@ -955,7 +855,7 @@ /*** SHA-384: *********************************************************/ int SHA384_Init(SHA384_CTX* context) { - if (context == (SHA384_CTX*)0) { + if (context == NULL) { return 1; } memcpy(context->state, sha384_initial_hash_value, (size_t)(SHA512_DIGEST_LENGTH)); @@ -965,23 +865,20 @@ return 1; } -int SHA384_Update(SHA384_CTX* context, const sha2_byte* data, size_t len) { +int SHA384_Update(SHA384_CTX* context, const uint8_t* data, size_t len) { return SHA512_Update((SHA512_CTX*)context, data, len); } -void SHA384_Transform(SHA512_CTX* context, const sha2_word64* data) { +void SHA384_Transform(SHA512_CTX* context, const uint64_t* data) { SHA512_Transform((SHA512_CTX*)context, data); } -int SHA384_Final(sha2_byte digest[], SHA384_CTX* context) { - sha2_word64 *d = (void *)digest; +int SHA384_Final(uint8_t digest[], SHA384_CTX* context) { + uint64_t *d = (void *)digest; size_t i; - /* Sanity check: */ - assert(context != (SHA384_CTX*)0); - /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { + if (digest != NULL) { SHA512_Last((SHA512_CTX*)context); /* Save the hash data for output: */