#include "sha1.h"
static void
-SHA1_Transform(unsigned long[5], const unsigned char[64]);
+SHA1_Transform(u_int32_t[5], const unsigned char[64]);
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
/* Hash a single 512-bit block. This is the core of the algorithm. */
static void
-SHA1_Transform(unsigned long state[5], const unsigned char buffer[64])
+SHA1_Transform(u_int32_t state[5], const unsigned char buffer[64])
{
- unsigned long a, b, c, d, e;
+ u_int32_t a, b, c, d, e;
typedef union {
unsigned char c[64];
- unsigned long l[16];
+ u_int32_t l[16];
} CHAR64LONG16;
CHAR64LONG16 *block;
j = (context->count[0] >> 3) & 63;
if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++;
context->count[1] += (len >> 29);
- if ((j + len) > 63) {
- memcpy(&context->buffer[j], data, (i = 64-j));
+ i = 64 - j;
+ while (len >= i) {
+ memcpy(&context->buffer[j], data, i);
SHA1_Transform(context->state, context->buffer);
- for ( ; i + 63 < len; i += 64) {
- SHA1_Transform(context->state, &data[i]);
- }
+ data += i;
+ len -= i;
+ i = 64;
j = 0;
}
- else
- i = 0;
- memcpy(&context->buffer[j], &data[i], len - i);
+ memcpy(&context->buffer[j], data, len);
}
void
SHA1_Final(unsigned char digest[20], SHA1_CTX *context)
{
- unsigned long i, j;
+ u_int32_t i, j;
unsigned char finalcount[8];
for (i = 0; i < 8; i++) {