summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/md32_common.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/md32_common.h')
-rw-r--r--src/lib/libcrypto/md32_common.h57
1 files changed, 36 insertions, 21 deletions
diff --git a/src/lib/libcrypto/md32_common.h b/src/lib/libcrypto/md32_common.h
index 2b91f9eef2..353d2b96ad 100644
--- a/src/lib/libcrypto/md32_common.h
+++ b/src/lib/libcrypto/md32_common.h
@@ -94,6 +94,8 @@
94 * in original (data) byte order, implemented externally (it 94 * in original (data) byte order, implemented externally (it
95 * actually is optional if data and host are of the same 95 * actually is optional if data and host are of the same
96 * "endianess"). 96 * "endianess").
97 * HASH_MAKE_STRING
98 * macro convering context variables to an ASCII hash string.
97 * 99 *
98 * Optional macros: 100 * Optional macros:
99 * 101 *
@@ -177,9 +179,18 @@
177 */ 179 */
178#undef ROTATE 180#undef ROTATE
179#ifndef PEDANTIC 181#ifndef PEDANTIC
180# if defined(_MSC_VER) 182# if 0 /* defined(_MSC_VER) */
181# define ROTATE(a,n) _lrotl(a,n) 183# define ROTATE(a,n) _lrotl(a,n)
182# elif defined(__GNUC__) && __GNUC__>=2 && !defined(NO_ASM) 184# elif defined(__MWERKS__)
185# if defined(__POWERPC__)
186# define ROTATE(a,n) __rlwinm(a,n,0,31)
187# elif defined(__MC68K__)
188 /* Motorola specific tweak. <appro@fy.chalmers.se> */
189# define ROTATE(a,n) ( n<24 ? __rol(a,n) : __ror(a,32-n) )
190# else
191# define ROTATE(a,n) __rol(a,n)
192# endif
193# elif defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
183 /* 194 /*
184 * Some GNU C inline assembler templates. Note that these are 195 * Some GNU C inline assembler templates. Note that these are
185 * rotates by *constant* number of bits! But that's exactly 196 * rotates by *constant* number of bits! But that's exactly
@@ -187,18 +198,18 @@
187 * 198 *
188 * <appro@fy.chalmers.se> 199 * <appro@fy.chalmers.se>
189 */ 200 */
190# if defined(__i386) 201# if defined(__i386) || defined(__i386__)
191# define ROTATE(a,n) ({ register unsigned int ret; \ 202# define ROTATE(a,n) ({ register unsigned int ret; \
192 asm volatile ( \ 203 asm ( \
193 "roll %1,%0" \ 204 "roll %1,%0" \
194 : "=r"(ret) \ 205 : "=r"(ret) \
195 : "I"(n), "0"(a) \ 206 : "I"(n), "0"(a) \
196 : "cc"); \ 207 : "cc"); \
197 ret; \ 208 ret; \
198 }) 209 })
199# elif defined(__powerpc) 210# elif defined(__powerpc) || defined(__ppc)
200# define ROTATE(a,n) ({ register unsigned int ret; \ 211# define ROTATE(a,n) ({ register unsigned int ret; \
201 asm volatile ( \ 212 asm ( \
202 "rlwinm %0,%1,%2,0,31" \ 213 "rlwinm %0,%1,%2,0,31" \
203 : "=r"(ret) \ 214 : "=r"(ret) \
204 : "r"(a), "I"(n)); \ 215 : "r"(a), "I"(n)); \
@@ -211,27 +222,27 @@
211 * Engage compiler specific "fetch in reverse byte order" 222 * Engage compiler specific "fetch in reverse byte order"
212 * intrinsic function if available. 223 * intrinsic function if available.
213 */ 224 */
214# if defined(__GNUC__) && __GNUC__>=2 && !defined(NO_ASM) 225# if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
215 /* some GNU C inline assembler templates by <appro@fy.chalmers.se> */ 226 /* some GNU C inline assembler templates by <appro@fy.chalmers.se> */
216# if defined(__i386) && !defined(I386_ONLY) 227# if (defined(__i386) || defined(__i386__)) && !defined(I386_ONLY)
217# define BE_FETCH32(a) ({ register unsigned int l=(a);\ 228# define BE_FETCH32(a) ({ register unsigned int l=(a);\
218 asm volatile ( \ 229 asm ( \
219 "bswapl %0" \ 230 "bswapl %0" \
220 : "=r"(l) : "0"(l)); \ 231 : "=r"(l) : "0"(l)); \
221 l; \ 232 l; \
222 }) 233 })
223# elif defined(__powerpc) 234# elif defined(__powerpc)
224# define LE_FETCH32(a) ({ register unsigned int l; \ 235# define LE_FETCH32(a) ({ register unsigned int l; \
225 asm volatile ( \ 236 asm ( \
226 "lwbrx %0,0,%1" \ 237 "lwbrx %0,0,%1" \
227 : "=r"(l) \ 238 : "=r"(l) \
228 : "r"(a)); \ 239 : "r"(a)); \
229 l; \ 240 l; \
230 }) 241 })
231 242
232# elif defined(__sparc) && defined(ULTRASPARC) 243# elif defined(__sparc) && defined(OPENSSL_SYS_ULTRASPARC)
233# define LE_FETCH32(a) ({ register unsigned int l; \ 244# define LE_FETCH32(a) ({ register unsigned int l; \
234 asm volatile ( \ 245 asm ( \
235 "lda [%1]#ASI_PRIMARY_LITTLE,%0"\ 246 "lda [%1]#ASI_PRIMARY_LITTLE,%0"\
236 : "=r"(l) \ 247 : "=r"(l) \
237 : "r"(a)); \ 248 : "r"(a)); \
@@ -399,13 +410,14 @@
399 * Time for some action:-) 410 * Time for some action:-)
400 */ 411 */
401 412
402void HASH_UPDATE (HASH_CTX *c, const unsigned char *data, unsigned long len) 413int HASH_UPDATE (HASH_CTX *c, const void *data_, unsigned long len)
403 { 414 {
415 const unsigned char *data=data_;
404 register HASH_LONG * p; 416 register HASH_LONG * p;
405 register unsigned long l; 417 register unsigned long l;
406 int sw,sc,ew,ec; 418 int sw,sc,ew,ec;
407 419
408 if (len==0) return; 420 if (len==0) return 1;
409 421
410 l=(c->Nl+(len<<3))&0xffffffffL; 422 l=(c->Nl+(len<<3))&0xffffffffL;
411 /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to 423 /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to
@@ -454,7 +466,7 @@ void HASH_UPDATE (HASH_CTX *c, const unsigned char *data, unsigned long len)
454 HOST_c2l_p(data,l,ec); p[sw]=l; 466 HOST_c2l_p(data,l,ec); p[sw]=l;
455 } 467 }
456 } 468 }
457 return; 469 return 1;
458 } 470 }
459 } 471 }
460 472
@@ -508,6 +520,7 @@ void HASH_UPDATE (HASH_CTX *c, const unsigned char *data, unsigned long len)
508 HOST_c2l_p(data,l,ec); 520 HOST_c2l_p(data,l,ec);
509 *p=l; 521 *p=l;
510 } 522 }
523 return 1;
511 } 524 }
512 525
513 526
@@ -531,7 +544,7 @@ void HASH_TRANSFORM (HASH_CTX *c, const unsigned char *data)
531 } 544 }
532 545
533 546
534void HASH_FINAL (unsigned char *md, HASH_CTX *c) 547int HASH_FINAL (unsigned char *md, HASH_CTX *c)
535 { 548 {
536 register HASH_LONG *p; 549 register HASH_LONG *p;
537 register unsigned long l; 550 register unsigned long l;
@@ -581,14 +594,16 @@ void HASH_FINAL (unsigned char *md, HASH_CTX *c)
581#endif 594#endif
582 HASH_BLOCK_HOST_ORDER (c,p,1); 595 HASH_BLOCK_HOST_ORDER (c,p,1);
583 596
584 l=c->A; HOST_l2c(l,md); 597#ifndef HASH_MAKE_STRING
585 l=c->B; HOST_l2c(l,md); 598#error "HASH_MAKE_STRING must be defined!"
586 l=c->C; HOST_l2c(l,md); 599#else
587 l=c->D; HOST_l2c(l,md); 600 HASH_MAKE_STRING(c,md);
601#endif
588 602
589 c->num=0; 603 c->num=0;
590 /* clear stuff, HASH_BLOCK may be leaving some stuff on the stack 604 /* clear stuff, HASH_BLOCK may be leaving some stuff on the stack
591 * but I'm not worried :-) 605 * but I'm not worried :-)
592 memset((void *)c,0,sizeof(HASH_CTX)); 606 memset((void *)c,0,sizeof(HASH_CTX));
593 */ 607 */
608 return 1;
594 } 609 }