00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "whirlpool.h"
00023
00024 void whirlpool_add(whirlpool_t * const context,
00025 const unsigned char * const src, unsigned long srcbits)
00026 {
00027 int i;
00028 uint32_t b, carry;
00029 int srcpos = 0;
00030
00031 int gap = (8 - ((int)srcbits & 7)) & 7;
00032 int rem = context->bits & 7;
00033
00034 uint8_t *buf = context->buf;
00035 uint8_t *len = context->len;
00036 int bits = context->bits;
00037 int pos = context->pos;
00038
00039
00040 uint64_t value = srcbits;
00041
00042 for (i = 31, carry = 0; i >= 0 && (carry != 0 || value != 0ULL); i--) {
00043 carry += len[i] + ((uint32_t)value & 0xff);
00044 len[i] = (uint8_t)carry;
00045 carry >>= 8;
00046 value >>= 8;
00047 }
00048
00049
00050 while (srcbits > 8) {
00051
00052 b = ((src[srcpos] << gap) & 0xff) |
00053 ((src[srcpos + 1] & 0xff) >> (8 - gap));
00054
00055
00056 buf[pos++] |= (uint8_t)(b >> rem);
00057 bits += 8 - rem;
00058
00059 if (bits == DIGESTBITS) {
00060
00061 whirlpool_transform(context);
00062
00063
00064 bits = pos = 0;
00065 }
00066
00067 buf[pos] = b << (8 - rem);
00068 bits += rem;
00069
00070
00071 srcbits -= 8;
00072 srcpos++;
00073 }
00074
00075
00076
00077
00078 if (srcbits > 0) {
00079 b = (src[srcpos] << gap) & 0xff;
00080
00081
00082 buf[pos] |= b >> rem;
00083 }
00084
00085 else
00086 b = 0;
00087
00088
00089
00090
00091 if (rem + srcbits < 8)
00092 bits += srcbits;
00093
00094 else {
00095
00096 pos++;
00097 bits += 8 - rem;
00098 srcbits -= 8 - rem;
00099
00100
00101
00102
00103 if (bits == DIGESTBITS) {
00104
00105 whirlpool_transform(context);
00106
00107
00108 bits = pos = 0;
00109 }
00110
00111 buf[pos] = b << (8 - rem);
00112 bits += (int)srcbits;
00113 }
00114
00115 context->bits = bits;
00116 context->pos = pos;
00117 }