131 #if !defined(DATA_ORDER_IS_BIG_ENDIAN) && !defined(DATA_ORDER_IS_LITTLE_ENDIAN)
132 #error "DATA_ORDER must be defined!"
136 #error "HASH_CBLOCK must be defined!"
139 #error "HASH_LONG must be defined!"
142 #error "HASH_CTX must be defined!"
146 #error "HASH_UPDATE must be defined!"
148 #ifndef HASH_TRANSFORM
149 #error "HASH_TRANSFORM must be defined!"
152 #error "HASH_FINAL must be defined!"
155 #ifndef HASH_BLOCK_HOST_ORDER
156 #error "HASH_BLOCK_HOST_ORDER must be defined!"
164 #ifndef HASH_BLOCK_DATA_ORDER
165 #error "HASH_BLOCK_DATA_ORDER must be defined!"
170 #define HASH_LBLOCK (HASH_CBLOCK/4)
173 #ifndef HASH_LONG_LOG2
174 #define HASH_LONG_LOG2 2
182 # if defined(_MSC_VER) || defined(__ICC)
183 # define ROTATE(a,n) _lrotl(a,n)
184 # elif defined(__MWERKS__)
185 # if defined(__POWERPC__)
186 # define ROTATE(a,n) __rlwinm(a,n,0,31)
187 # elif defined(__MC68K__)
189 # define ROTATE(a,n) ( n<24 ? __rol(a,n) : __ror(a,32-n) )
191 # define ROTATE(a,n) __rol(a,n)
193 # elif defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
200 # if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
201 # define ROTATE(a,n) ({ register unsigned int ret; \
209 # elif defined(__powerpc) || defined(__ppc__) || defined(__powerpc64__)
210 # define ROTATE(a,n) ({ register unsigned int ret; \
212 "rlwinm %0,%1,%2,0,31" \
221 #if HASH_LONG_LOG2==2
225 #define REVERSE_FETCH32(a,l) ( \
226 l=*(const HASH_LONG *)(a), \
227 ((ROTATE(l,8)&0x00FF00FF)|(ROTATE((l&0x00FF00FF),24))) \
231 #define REVERSE_FETCH32(a,l) ( \
232 l=*(const HASH_LONG *)(a), \
233 l=(((l>>8)&0x00FF00FF)|((l&0x00FF00FF)<<8)), \
254 #define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
265 #if defined(B_ENDIAN)
266 # if defined(DATA_ORDER_IS_BIG_ENDIAN)
267 # if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED) && HASH_LONG_LOG2==2
268 # define HASH_BLOCK_DATA_ORDER_ALIGNED HASH_BLOCK_HOST_ORDER
271 #elif defined(L_ENDIAN)
272 # if defined(DATA_ORDER_IS_LITTLE_ENDIAN)
273 # if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED) && HASH_LONG_LOG2==2
274 # define HASH_BLOCK_DATA_ORDER_ALIGNED HASH_BLOCK_HOST_ORDER
279 #if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
280 #ifndef HASH_BLOCK_DATA_ORDER
281 #error "HASH_BLOCK_DATA_ORDER must be defined!"
285 #if defined(DATA_ORDER_IS_BIG_ENDIAN)
288 # if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
289 # if ((defined(__i386) || defined(__i386__)) && !defined(I386_ONLY)) || \
290 (defined(__x86_64) || defined(__x86_64__))
297 # define HOST_c2l(c,l) ({ unsigned int r=*((const unsigned int *)(c)); \
298 asm ("bswapl %0":"=r"(r):"0"(r)); \
300 # define HOST_l2c(l,c) ({ unsigned int r=(l); \
301 asm ("bswapl %0":"=r"(r):"0"(r)); \
302 *((unsigned int *)(c))=r; (c)+=4; r; })
308 #define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++)))<<24), \
309 l|=(((unsigned long)(*((c)++)))<<16), \
310 l|=(((unsigned long)(*((c)++)))<< 8), \
311 l|=(((unsigned long)(*((c)++))) ), \
314 #define HOST_p_c2l(c,l,n) { \
316 case 0: l =((unsigned long)(*((c)++)))<<24; \
317 case 1: l|=((unsigned long)(*((c)++)))<<16; \
318 case 2: l|=((unsigned long)(*((c)++)))<< 8; \
319 case 3: l|=((unsigned long)(*((c)++))); \
321 #define HOST_p_c2l_p(c,l,sc,len) { \
323 case 0: l =((unsigned long)(*((c)++)))<<24; \
324 if (--len == 0) break; \
325 case 1: l|=((unsigned long)(*((c)++)))<<16; \
326 if (--len == 0) break; \
327 case 2: l|=((unsigned long)(*((c)++)))<< 8; \
330 #define HOST_c2l_p(c,l,n) { \
333 case 3: l =((unsigned long)(*(--(c))))<< 8; \
334 case 2: l|=((unsigned long)(*(--(c))))<<16; \
335 case 1: l|=((unsigned long)(*(--(c))))<<24; \
338 #define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
339 *((c)++)=(unsigned char)(((l)>>16)&0xff), \
340 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
341 *((c)++)=(unsigned char)(((l) )&0xff), \
345 #elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
347 #if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
350 # define HOST_c2l(c,l) ((l)=*((const unsigned int *)(c)), (c)+=4, l)
351 # define HOST_l2c(l,c) (*((unsigned int *)(c))=(l), (c)+=4, l)
356 #define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++))) ), \
357 l|=(((unsigned long)(*((c)++)))<< 8), \
358 l|=(((unsigned long)(*((c)++)))<<16), \
359 l|=(((unsigned long)(*((c)++)))<<24), \
362 #define HOST_p_c2l(c,l,n) { \
364 case 0: l =((unsigned long)(*((c)++))); \
365 case 1: l|=((unsigned long)(*((c)++)))<< 8; \
366 case 2: l|=((unsigned long)(*((c)++)))<<16; \
367 case 3: l|=((unsigned long)(*((c)++)))<<24; \
369 #define HOST_p_c2l_p(c,l,sc,len) { \
371 case 0: l =((unsigned long)(*((c)++))); \
372 if (--len == 0) break; \
373 case 1: l|=((unsigned long)(*((c)++)))<< 8; \
374 if (--len == 0) break; \
375 case 2: l|=((unsigned long)(*((c)++)))<<16; \
378 #define HOST_c2l_p(c,l,n) { \
381 case 3: l =((unsigned long)(*(--(c))))<<16; \
382 case 2: l|=((unsigned long)(*(--(c))))<< 8; \
383 case 1: l|=((unsigned long)(*(--(c)))); \
386 #define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
387 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
388 *((c)++)=(unsigned char)(((l)>>16)&0xff), \
389 *((c)++)=(unsigned char)(((l)>>24)&0xff), \
399 int HASH_UPDATE (HASH_CTX *c,
const void *data_,
size_t len)
401 const unsigned char *data=data_;
402 register HASH_LONG * p;
403 register HASH_LONG l;
406 if (len==0)
return 1;
408 l=(c->Nl+(((HASH_LONG)len)<<3))&0xffffffffUL;
422 if ((c->num+len) >= HASH_CBLOCK)
424 l=p[sw]; HOST_p_c2l(data,l,sc); p[sw++]=l;
425 for (; sw<HASH_LBLOCK; sw++)
427 HOST_c2l(data,l); p[sw]=l;
429 HASH_BLOCK_HOST_ORDER (c,p,1);
430 len-=(HASH_CBLOCK-c->num);
436 c->num+=(
unsigned int)len;
439 l=p[sw]; HOST_p_c2l_p(data,l,sc,len); p[sw]=l;
447 HOST_p_c2l(data,l,sc);
449 for (; sw < ew; sw++)
451 HOST_c2l(data,l); p[sw]=l;
455 HOST_c2l_p(data,l,ec); p[sw]=l;
465 #if defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
470 if ((((
size_t)data)%4) == 0)
473 HASH_BLOCK_DATA_ORDER_ALIGNED (c,(
const HASH_LONG *)data,sw);
479 #if !defined(HASH_BLOCK_DATA_ORDER)
482 memcpy (p=c->data,data,HASH_CBLOCK);
483 HASH_BLOCK_DATA_ORDER_ALIGNED(c,p,1);
489 #if defined(HASH_BLOCK_DATA_ORDER)
491 HASH_BLOCK_DATA_ORDER(c,data,sw);
507 HOST_c2l(data,l); *p=l;
509 HOST_c2l_p(data,l,ec);
516 void HASH_TRANSFORM (HASH_CTX *c,
const unsigned char *data)
518 #if defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
519 if ((((
size_t)data)%4) == 0)
521 HASH_BLOCK_DATA_ORDER_ALIGNED (c,(
const HASH_LONG *)data,1);
523 #if !defined(HASH_BLOCK_DATA_ORDER)
525 memcpy (c->data,data,HASH_CBLOCK);
526 HASH_BLOCK_DATA_ORDER_ALIGNED (c,c->data,1);
530 #if defined(HASH_BLOCK_DATA_ORDER)
531 HASH_BLOCK_DATA_ORDER (c,data,1);
536 int HASH_FINAL (
unsigned char *md, HASH_CTX *c)
538 register HASH_LONG *p;
539 register unsigned long l;
541 static const unsigned char end[4]={0x80,0x00,0x00,0x00};
542 const unsigned char *cp=end;
564 l = (j==0) ? 0 : p[i];
566 HOST_p_c2l(cp,l,j); p[i++]=l;
568 if (i>(HASH_LBLOCK-2))
570 if (i<HASH_LBLOCK) p[i]=0;
571 HASH_BLOCK_HOST_ORDER (c,p,1);
574 for (; i<(HASH_LBLOCK-2); i++)
577 #if defined(DATA_ORDER_IS_BIG_ENDIAN)
578 p[HASH_LBLOCK-2]=c->Nh;
579 p[HASH_LBLOCK-1]=c->Nl;
580 #elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
581 p[HASH_LBLOCK-2]=c->Nl;
582 p[HASH_LBLOCK-1]=c->Nh;
584 HASH_BLOCK_HOST_ORDER (c,p,1);
586 #ifndef HASH_MAKE_STRING
587 #error "HASH_MAKE_STRING must be defined!"
589 HASH_MAKE_STRING(c,md);
601 #define MD32_REG_T long