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