De-uglify:

- drop useless asserts
- use uintXX_t directly
- use NULL
This commit is contained in:
joerg 2009-06-11 19:02:04 +00:00
parent c8f28eff97
commit 8c33577af1
1 changed files with 60 additions and 163 deletions

View File

@ -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 @@ typedef u_int64_t sha2_word64; /* Exactly 8 bytes */
* 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 @@ typedef u_int64_t sha2_word64; /* Exactly 8 bytes */
* 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 @@ static const sha2_word32 K256[64] = {
};
/* 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 @@ static const sha2_word32 sha224_initial_hash_value[8] = {
};
/* 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 @@ static const sha2_word32 sha256_initial_hash_value[8] = {
};
/* 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 @@ static const sha2_word64 K512[80] = {
};
/* 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 @@ static const sha2_word64 sha384_initial_hash_value[8] = {
};
/* 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 @@ int SHA256_Init(SHA256_CTX* context) {
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 @@ void SHA224_Transform(SHA224_CTX* context, const sha2_word64* data) {
(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 @@ void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
#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 @@ void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
#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 @@ int SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) {
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 @@ int SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) {
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 @@ int SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) {
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 @@ int SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) {
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 @@ int SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) {
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 @@ static int SHA224_256_Final(sha2_byte digest[], SHA256_CTX* context, size_t len)
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 @@ static int SHA224_256_Final(sha2_byte digest[], SHA256_CTX* context, size_t len)
*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 @@ static int SHA224_256_Final(sha2_byte digest[], SHA256_CTX* context, size_t len)
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 @@ int SHA512_Init(SHA512_CTX* context) {
(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 @@ void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
#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 @@ void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
#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 @@ int SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) {
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 @@ int SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) {
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 @@ int SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) {
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 @@ static void SHA512_Last(SHA512_CTX* context) {
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 @@ static void SHA512_Last(SHA512_CTX* context) {
*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 @@ int SHA512_Final(sha2_byte digest[], SHA512_CTX* context) {
/*** 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 @@ int SHA384_Init(SHA384_CTX* context) {
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: */