107 context->state[0] = 0x67452301;
108 context->state[1] = 0xEFCDAB89;
109 context->state[2] = 0x98BADCFE;
110 context->state[3] = 0x10325476;
111 context->state[4] = 0x76543210;
112 context->state[5] = 0xFEDCBA98;
113 context->state[6] = 0x89ABCDEF;
114 context->state[7] = 0x01234567;
126 context->state[0] = 0x67452301;
127 context->state[1] = 0xEFCDAB89;
128 context->state[2] = 0x98BADCFE;
129 context->state[3] = 0x10325476;
130 context->state[4] = 0xC3D2E1F0;
142 context->state[0] = 0x67452301;
143 context->state[1] = 0xEFCDAB89;
144 context->state[2] = 0x98BADCFE;
145 context->state[3] = 0x10325476;
146 context->state[4] = 0xC3D2E1F0;
147 context->state[5] = 0x76543210;
148 context->state[6] = 0xFEDCBA98;
149 context->state[7] = 0x89ABCDEF;
150 context->state[8] = 0x01234567;
151 context->state[9] = 0x3C2D1E0F;
156#define F0(x,y,z) ((x) ^ (y) ^ (z))
157#define F1(x,y,z) (((x) & (y)) | ((~(x)) & (z)))
158#define F2(x,y,z) (((x) | (~(y))) ^ (z))
159#define F3(x,y,z) (((x) & (z)) | ((y) & (~(z))))
160#define F4(x,y,z) ((x) ^ ((y) | (~(z))))
162static const uint32_t K_values[5] = { 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E };
163static const uint32_t KK_values[4] = { 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x00000000 };
164static const uint32_t KK160_values[5] = { 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000 };
166#define K(n) K_values[ (n) >> 4]
167#define KK(n) KK_values[(n) >> 4]
168#define KK160(n) KK160_values[(n) >> 4]
170static const unsigned char R[80] = {
171 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
172 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
173 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
174 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
175 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 };
177static const unsigned char RR[80] = {
178 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
179 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
180 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
181 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
182 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 };
184static const unsigned char S[80] = {
185 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
186 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
187 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
188 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
189 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 };
191static const unsigned char SS[80] = {
192 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
193 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
194 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
195 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
196 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 };
198#define ROLS(j, x) (((x) << S[j]) | ((x) >> (32 - S[j])))
199#define ROLSS(j, x) (((x) << SS[j]) | ((x) >> (32 - SS[j])))
200#define ROL(n, x) (((x) << n) | ((x) >> (32 - n)))
206static void RIPEMDDecode(uint32_t *output,
const unsigned char *input,
unsigned int len)
210 for (i = 0,
j = 0;
j <
len; i++,
j += 4)
211 output[i] = ((uint32_t) input[
j + 0]) | (((uint32_t) input[
j + 1]) << 8) |
212 (((uint32_t) input[
j + 2]) << 16) | (((uint32_t) input[
j + 3]) << 24);
219static void RIPEMD128Transform(uint32_t
state[4],
const unsigned char block[64])
226 RIPEMDDecode(x, block, 64);
228 for(
j = 0;
j < 16;
j++) {
230 a = d; d = c; c = b; b = tmp;
232 aa = dd; dd = cc; cc = bb; bb = tmp;
235 for(
j = 16;
j < 32;
j++) {
237 a = d; d = c; c = b; b = tmp;
239 aa = dd; dd = cc; cc = bb; bb = tmp;
242 for(
j = 32;
j < 48;
j++) {
244 a = d; d = c; c = b; b = tmp;
246 aa = dd; dd = cc; cc = bb; bb = tmp;
249 for(
j = 48;
j < 64;
j++) {
251 a = d; d = c; c = b; b = tmp;
253 aa = dd; dd = cc; cc = bb; bb = tmp;
256 tmp =
state[1] + c + dd;
274 unsigned int index, partLen;
278 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3F);
281 if ((
context->count[0] += ((uint32_t) inputLen << 3)) < ((uint32_t) inputLen << 3)) {
284 context->count[1] += (uint32_t) (inputLen >> 29);
286 partLen = 64 - index;
290 if (inputLen >= partLen) {
291 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) input, partLen);
294 for (i = partLen; i + 63 < inputLen; i += 64) {
295 RIPEMD128Transform(
context->state, &input[i]);
304 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) & input[i], inputLen - i);
311static void RIPEMD256Transform(uint32_t
state[8],
const unsigned char block[64])
318 RIPEMDDecode(x, block, 64);
320 for(
j = 0;
j < 16;
j++) {
322 a = d; d = c; c = b; b = tmp;
324 aa = dd; dd = cc; cc = bb; bb = tmp;
326 tmp =
a;
a = aa; aa = tmp;
328 for(
j = 16;
j < 32;
j++) {
330 a = d; d = c; c = b; b = tmp;
332 aa = dd; dd = cc; cc = bb; bb = tmp;
334 tmp = b; b = bb; bb = tmp;
336 for(
j = 32;
j < 48;
j++) {
338 a = d; d = c; c = b; b = tmp;
340 aa = dd; dd = cc; cc = bb; bb = tmp;
342 tmp = c; c = cc; cc = tmp;
344 for(
j = 48;
j < 64;
j++) {
346 a = d; d = c; c = b; b = tmp;
348 aa = dd; dd = cc; cc = bb; bb = tmp;
350 tmp = d; d = dd; dd = tmp;
373 unsigned int index, partLen;
377 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3F);
380 if ((
context->count[0] += ((uint32_t) inputLen << 3)) < ((uint32_t) inputLen << 3)) {
383 context->count[1] += (uint32_t) (inputLen >> 29);
385 partLen = 64 - index;
389 if (inputLen >= partLen) {
390 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) input, partLen);
393 for (i = partLen; i + 63 < inputLen; i += 64) {
394 RIPEMD256Transform(
context->state, &input[i]);
403 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) & input[i], inputLen - i);
410static void RIPEMD160Transform(uint32_t
state[5],
const unsigned char block[64])
417 RIPEMDDecode(x, block, 64);
419 for(
j = 0;
j < 16;
j++) {
421 a = e; e = d; d =
ROL(10, c); c = b; b = tmp;
423 aa = ee; ee = dd; dd =
ROL(10, cc); cc = bb; bb = tmp;
426 for(
j = 16;
j < 32;
j++) {
428 a = e; e = d; d =
ROL(10, c); c = b; b = tmp;
430 aa = ee; ee = dd; dd =
ROL(10, cc); cc = bb; bb = tmp;
433 for(
j = 32;
j < 48;
j++) {
435 a = e; e = d; d =
ROL(10, c); c = b; b = tmp;
437 aa = ee; ee = dd; dd =
ROL(10, cc); cc = bb; bb = tmp;
440 for(
j = 48;
j < 64;
j++) {
442 a = e; e = d; d =
ROL(10, c); c = b; b = tmp;
444 aa = ee; ee = dd; dd =
ROL(10, cc); cc = bb; bb = tmp;
447 for(
j = 64;
j < 80;
j++) {
449 a = e; e = d; d =
ROL(10, c); c = b; b = tmp;
451 aa = ee; ee = dd; dd =
ROL(10, cc); cc = bb; bb = tmp;
454 tmp =
state[1] + c + dd;
473 unsigned int index, partLen;
477 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3F);
480 if ((
context->count[0] += ((uint32_t) inputLen << 3)) < ((uint32_t) inputLen << 3)) {
483 context->count[1] += (uint32_t) (inputLen >> 29);
485 partLen = 64 - index;
489 if (inputLen >= partLen) {
490 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) input, partLen);
493 for (i = partLen; i + 63 < inputLen; i += 64) {
494 RIPEMD160Transform(
context->state, &input[i]);
503 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) & input[i], inputLen - i);
510static void RIPEMD320Transform(uint32_t
state[10],
const unsigned char block[64])
517 RIPEMDDecode(x, block, 64);
519 for(
j = 0;
j < 16;
j++) {
521 a = e; e = d; d =
ROL(10, c); c = b; b = tmp;
523 aa = ee; ee = dd; dd =
ROL(10, cc); cc = bb; bb = tmp;
525 tmp = b; b = bb; bb = tmp;
527 for(
j = 16;
j < 32;
j++) {
529 a = e; e = d; d =
ROL(10, c); c = b; b = tmp;
531 aa = ee; ee = dd; dd =
ROL(10, cc); cc = bb; bb = tmp;
533 tmp = d; d = dd; dd = tmp;
535 for(
j = 32;
j < 48;
j++) {
537 a = e; e = d; d =
ROL(10, c); c = b; b = tmp;
539 aa = ee; ee = dd; dd =
ROL(10, cc); cc = bb; bb = tmp;
541 tmp =
a;
a = aa; aa = tmp;
543 for(
j = 48;
j < 64;
j++) {
545 a = e; e = d; d =
ROL(10, c); c = b; b = tmp;
547 aa = ee; ee = dd; dd =
ROL(10, cc); cc = bb; bb = tmp;
549 tmp = c; c = cc; cc = tmp;
551 for(
j = 64;
j < 80;
j++) {
553 a = e; e = d; d =
ROL(10, c); c = b; b = tmp;
555 aa = ee; ee = dd; dd =
ROL(10, cc); cc = bb; bb = tmp;
557 tmp = e; e = ee; ee = tmp;
582 unsigned int index, partLen;
586 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3F);
589 if ((
context->count[0] += ((uint32_t) inputLen << 3)) < ((uint32_t) inputLen << 3)) {
592 context->count[1] += (uint32_t) (inputLen >> 29);
594 partLen = 64 - index;
598 if (inputLen >= partLen) {
599 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) input, partLen);
602 for (i = partLen; i + 63 < inputLen; i += 64) {
603 RIPEMD320Transform(
context->state, &input[i]);
612 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) & input[i], inputLen - i);
616static const unsigned char PADDING[64] =
618 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
619 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
620 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
627static void RIPEMDEncode(
unsigned char *output, uint32_t *input,
unsigned int len)
631 for (i = 0,
j = 0;
j <
len; i++,
j += 4) {
632 output[
j + 3] = (
unsigned char) ((input[i] >> 24) & 0xff);
633 output[
j + 2] = (
unsigned char) ((input[i] >> 16) & 0xff);
634 output[
j + 1] = (
unsigned char) ((input[i] >> 8) & 0xff);
635 output[
j + 0] = (
unsigned char) (input[i] & 0xff);
646 unsigned char bits[8];
647 unsigned int index, padLen;
650 bits[0] = (
unsigned char) (
context->count[0] & 0xFF);
651 bits[1] = (
unsigned char) ((
context->count[0] >> 8) & 0xFF);
652 bits[2] = (
unsigned char) ((
context->count[0] >> 16) & 0xFF);
653 bits[3] = (
unsigned char) ((
context->count[0] >> 24) & 0xFF);
654 bits[4] = (
unsigned char) (
context->count[1] & 0xFF);
655 bits[5] = (
unsigned char) ((
context->count[1] >> 8) & 0xFF);
656 bits[6] = (
unsigned char) ((
context->count[1] >> 16) & 0xFF);
657 bits[7] = (
unsigned char) ((
context->count[1] >> 24) & 0xFF);
661 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3f);
662 padLen = (index < 56) ? (56 - index) : (120 - index);
669 RIPEMDEncode(digest,
context->state, 16);
683 unsigned char bits[8];
684 unsigned int index, padLen;
687 bits[0] = (
unsigned char) (
context->count[0] & 0xFF);
688 bits[1] = (
unsigned char) ((
context->count[0] >> 8) & 0xFF);
689 bits[2] = (
unsigned char) ((
context->count[0] >> 16) & 0xFF);
690 bits[3] = (
unsigned char) ((
context->count[0] >> 24) & 0xFF);
691 bits[4] = (
unsigned char) (
context->count[1] & 0xFF);
692 bits[5] = (
unsigned char) ((
context->count[1] >> 8) & 0xFF);
693 bits[6] = (
unsigned char) ((
context->count[1] >> 16) & 0xFF);
694 bits[7] = (
unsigned char) ((
context->count[1] >> 24) & 0xFF);
698 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3f);
699 padLen = (index < 56) ? (56 - index) : (120 - index);
706 RIPEMDEncode(digest,
context->state, 32);
720 unsigned char bits[8];
721 unsigned int index, padLen;
724 bits[0] = (
unsigned char) (
context->count[0] & 0xFF);
725 bits[1] = (
unsigned char) ((
context->count[0] >> 8) & 0xFF);
726 bits[2] = (
unsigned char) ((
context->count[0] >> 16) & 0xFF);
727 bits[3] = (
unsigned char) ((
context->count[0] >> 24) & 0xFF);
728 bits[4] = (
unsigned char) (
context->count[1] & 0xFF);
729 bits[5] = (
unsigned char) ((
context->count[1] >> 8) & 0xFF);
730 bits[6] = (
unsigned char) ((
context->count[1] >> 16) & 0xFF);
731 bits[7] = (
unsigned char) ((
context->count[1] >> 24) & 0xFF);
735 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3f);
736 padLen = (index < 56) ? (56 - index) : (120 - index);
743 RIPEMDEncode(digest,
context->state, 20);
757 unsigned char bits[8];
758 unsigned int index, padLen;
761 bits[0] = (
unsigned char) (
context->count[0] & 0xFF);
762 bits[1] = (
unsigned char) ((
context->count[0] >> 8) & 0xFF);
763 bits[2] = (
unsigned char) ((
context->count[0] >> 16) & 0xFF);
764 bits[3] = (
unsigned char) ((
context->count[0] >> 24) & 0xFF);
765 bits[4] = (
unsigned char) (
context->count[1] & 0xFF);
766 bits[5] = (
unsigned char) ((
context->count[1] >> 8) & 0xFF);
767 bits[6] = (
unsigned char) ((
context->count[1] >> 16) & 0xFF);
768 bits[7] = (
unsigned char) ((
context->count[1] >> 24) & 0xFF);
772 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3f);
773 padLen = (index < 56) ? (56 - index) : (120 - index);
780 RIPEMDEncode(digest,
context->state, 40);
PHP_HASH_API zend_result php_hash_serialize(const php_hashcontext_object *hash, zend_long *magic, zval *zv)
PHP_HASH_API zend_result php_hash_copy(const void *ops, const void *orig_context, void *dest_context)
PHP_HASH_API int php_hash_unserialize(php_hashcontext_object *hash, zend_long magic, const zval *zv)
#define R(tables, key, h, i, t, l, r)
PHP_HASH_API void PHP_RIPEMD160Update(PHP_RIPEMD160_CTX *context, const unsigned char *input, size_t inputLen)
PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
PHP_HASH_API void PHP_RIPEMD320Final(unsigned char digest[40], PHP_RIPEMD320_CTX *context)
const php_hash_ops php_hash_ripemd128_ops
PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
const php_hash_ops php_hash_ripemd160_ops
PHP_HASH_API void PHP_RIPEMD320Init(PHP_RIPEMD320_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
PHP_HASH_API void PHP_RIPEMD128Final(unsigned char digest[16], PHP_RIPEMD128_CTX *context)
PHP_HASH_API void PHP_RIPEMD160Final(unsigned char digest[20], PHP_RIPEMD160_CTX *context)
const php_hash_ops php_hash_ripemd320_ops
PHP_HASH_API void PHP_RIPEMD256Update(PHP_RIPEMD256_CTX *context, const unsigned char *input, size_t inputLen)
const php_hash_ops php_hash_ripemd256_ops
PHP_HASH_API void PHP_RIPEMD128Update(PHP_RIPEMD128_CTX *context, const unsigned char *input, size_t inputLen)
PHP_HASH_API void PHP_RIPEMD256Final(unsigned char digest[32], PHP_RIPEMD256_CTX *context)
PHP_HASH_API void PHP_RIPEMD320Update(PHP_RIPEMD320_CTX *context, const unsigned char *input, size_t inputLen)
PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
void(* php_hash_final_func_t)(unsigned char *digest, void *context)
void(* php_hash_init_func_t)(void *context, HashTable *args)
void(* php_hash_update_func_t)(void *context, const unsigned char *buf, size_t count)
struct _php_hash_ops php_hash_ops
#define PHP_RIPEMD256_SPEC
#define PHP_RIPEMD128_SPEC
#define PHP_RIPEMD320_SPEC
#define PHP_RIPEMD160_SPEC
#define ZEND_ATTRIBUTE_UNUSED
#define ZEND_SECURE_ZERO(var, size)
struct _zend_array HashTable