46#if !defined(__BORLANDC__) && !defined(min)
47#define min(a, b) ((a)<(b))?(a):(b)
73void SHAEngine::Process_Partial(
void const * & data,
long & length)
75 if (length == 0 || data ==
NULL)
return;
82 if (PartialCount == 0 && length >= SRC_BLOCK_SIZE)
return;
88 int add_count =
min((
int)length, SRC_BLOCK_SIZE - PartialCount);
89 memcpy(&Partial[PartialCount], data, add_count);
90 data = ((
char const *&)data) + add_count;
91 PartialCount += add_count;
98 if (PartialCount == SRC_BLOCK_SIZE) {
99 Process_Block(&Partial[0], Acc);
100 Length += (long)SRC_BLOCK_SIZE;
133 Process_Partial(data, length);
138 if (length == 0)
return;
143 long blocks = (length / SRC_BLOCK_SIZE);
144 long const * source = (
long const *)data;
145 for (
int bcount = 0; bcount < blocks; bcount++) {
146 Process_Block(source, Acc);
147 Length += (long)SRC_BLOCK_SIZE;
148 source += SRC_BLOCK_SIZE/
sizeof(long);
149 length -= (long)SRC_BLOCK_SIZE;
157 Process_Partial(data, length);
161#define Reverse_LONG(a) ((a>>24)&0x000000FFL) | ((a>>8)&0x0000FF00L) | ((a<<8)&0x00FF0000L) | ((a<<24)&0xFF000000L)
187 memcpy(result, &FinalResult,
sizeof(FinalResult));
190 long length = Length + PartialCount;
191 int partialcount = PartialCount;
192 unsigned char partial[SRC_BLOCK_SIZE];
193 memcpy(partial, Partial,
sizeof(Partial));
198 partial[partialcount] = (
unsigned char)0x80;
208 if ((SRC_BLOCK_SIZE - partialcount) < 9) {
209 if (partialcount+1 < SRC_BLOCK_SIZE) {
210 memset(&partial[partialcount+1],
'\0', SRC_BLOCK_SIZE - (partialcount+1));
212 Process_Block(&partial[0], acc);
222 memset(&partial[partialcount],
'\0', SRC_BLOCK_SIZE - partialcount);
223 *(
long *)(&partial[SRC_BLOCK_SIZE-4]) =
Reverse_LONG((length*8));
224 Process_Block(&partial[0], acc);
226 memcpy((
char *)&FinalResult, &acc,
sizeof(acc));
227 for (
int index = 0; index <
sizeof(FinalResult)/
sizeof(long); index++) {
229 (
long &)FinalResult.Long[index] =
Reverse_LONG(FinalResult.Long[index]);
231 (
bool&)IsCached =
true;
232 memcpy(result, &FinalResult,
sizeof(FinalResult));
233 return(
sizeof(FinalResult));
249 return(T)( ( X << n ) | ( (unsigned)X >> ((
sizeof(T)*8) - n) ) );
253 return(
long)( ( X << n ) | ( (unsigned)X >> ((
sizeof(long)*8) - n) ) );
256inline unsigned long _rotl(
unsigned long X,
int n)
258 return(
unsigned long)( ( X << n ) | ( (unsigned)X >> ((
sizeof(
unsigned long)*8) - n) ) );
265void memrev(
char * buffer,
size_t length);
286void SHAEngine::Process_Block(
void const * source, SHADigest & acc)
const
292 long block[PROC_BLOCK_SIZE/
sizeof(long)];
298 long const * data = (
long const *)source;
300 for (index = 0; index < SRC_BLOCK_SIZE/
sizeof(long); index++) {
304 for (index = SRC_BLOCK_SIZE/
sizeof(
long); index < PROC_BLOCK_SIZE/
sizeof(long); index++) {
306 block[index] =
_rotl(block[index-3] ^ block[index-8] ^ block[index-14] ^ block[index-16], 1);
314 for (index = 0; index < PROC_BLOCK_SIZE/
sizeof(long); index++) {
315 long temp =
_rotl(
alt.Long[0], 5) + Do_Function(index,
alt.Long[1],
alt.Long[2],
alt.Long[3]) +
alt.Long[4] + block[index] + Get_Constant(index);
316 alt.Long[4] =
alt.Long[3];
317 alt.Long[3] =
alt.Long[2];
319 alt.Long[1] =
alt.Long[0];
322 acc.Long[0] +=
alt.Long[0];
323 acc.Long[1] +=
alt.Long[1];
324 acc.Long[2] +=
alt.Long[2];
325 acc.Long[3] +=
alt.Long[3];
326 acc.Long[4] +=
alt.Long[4];
void Hash(void const *data, long length)
int Result(void *result) const
void memrev(char *buffer, size_t length)