22#if (defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__BIG_ENDIAN__) || defined(__LITTLE_ENDIAN__))
23# if defined(__LITTLE_ENDIAN__)
24# undef WORDS_BIGENDIAN
26# if defined(__BIG_ENDIAN__)
27# define WORDS_BIGENDIAN
38#define round(a,b,c,x,mul) \
40 a -= t1[(unsigned char)(c)] ^ \
41 t2[(unsigned char)(((uint32_t)(c))>>(2*8))] ^ \
42 t3[(unsigned char)((c)>>(4*8))] ^ \
43 t4[(unsigned char)(((uint32_t)((c)>>(4*8)))>>(2*8))] ; \
44 b += t4[(unsigned char)(((uint32_t)(c))>>(1*8))] ^ \
45 t3[(unsigned char)(((uint32_t)(c))>>(3*8))] ^ \
46 t2[(unsigned char)(((uint32_t)((c)>>(4*8)))>>(1*8))] ^ \
47 t1[(unsigned char)(((uint32_t)((c)>>(4*8)))>>(3*8))]; \
50#define pass(a,b,c,mul) \
61 x0 -= x7 ^ L64(0xA5A5A5A5A5A5A5A5); \
64 x3 -= x2 ^ ((~x1)<<19); \
67 x6 -= x5 ^ ((~x4)>>23); \
70 x1 -= x0 ^ ((~x7)<<19); \
73 x4 -= x3 ^ ((~x2)>>23); \
76 x7 -= x6 ^ L64(0x0123456789ABCDEF);
83#define compress(passes) \
90 for(pass_no=0; pass_no<passes; pass_no++) { \
93 tmpa=a; a=c; c=b; b=tmpa; \
97#define split_ex(str) \
98 x0=str[0]; x1=str[1]; x2=str[2]; x3=str[3]; \
99 x4=str[4]; x5=str[5]; x6=str[6]; x7=str[7];
100#ifdef WORDS_BIGENDIAN
106 for (i = 0; i < 64; ++i) { \
107 ((unsigned char *) tmp)[i^7] = ((unsigned char *) str)[i]; \
112# define split split_ex
115#define tiger_compress(passes, str, state) \
117 register uint64_t a, b, c, tmpa, x0, x1, x2, x3, x4, x5, x6, x7; \
118 uint64_t aa, bb, cc; \
119 unsigned int pass_no; \
153#ifndef WORDS_BIGENDIAN
157 context->buffer[57] = (
unsigned char) ((
context->passed >> 8) & 0xff);
158 context->buffer[58] = (
unsigned char) ((
context->passed >> 16) & 0xff);
159 context->buffer[59] = (
unsigned char) ((
context->passed >> 24) & 0xff);
160 context->buffer[60] = (
unsigned char) ((
context->passed >> 32) & 0xff);
161 context->buffer[61] = (
unsigned char) ((
context->passed >> 40) & 0xff);
162 context->buffer[62] = (
unsigned char) ((
context->passed >> 48) & 0xff);
163 context->buffer[63] = (
unsigned char) ((
context->passed >> 56) & 0xff);
168static inline void TigerDigest(
unsigned char *digest_str,
unsigned int digest_len,
PHP_TIGER_CTX *
context)
172 for (i = 0; i < digest_len; ++i) {
173 digest_str[i] = (
unsigned char) ((
context->state[i/8] >> (8 * (i%8))) & 0xff);
200 size_t i = 0, r = (
context->length +
len) % 64;
210 for (; i + 64 <=
len; i += 64) {
224 TigerDigest(digest, 16,
context);
231 TigerDigest(digest, 20,
context);
238 TigerDigest(digest, 24,
context);
248 && ctx->length <
sizeof(ctx->buffer)) {
251 return r !=
SUCCESS ? r : -2000;
255#define PHP_HASH_TIGER_OPS(p, b) \
256 const php_hash_ops php_hash_##p##tiger##b##_ops = { \
258 (php_hash_init_func_t) PHP_##p##TIGERInit, \
259 (php_hash_update_func_t) PHP_TIGERUpdate, \
260 (php_hash_final_func_t) PHP_TIGER##b##Final, \
262 php_hash_serialize, \
263 php_tiger_unserialize, \
267 sizeof(PHP_TIGER_CTX), \
memset(ptr, 0, type->size)
PHP_HASH_API int php_hash_unserialize_spec(php_hashcontext_object *hash, const zval *zv, const char *spec)
hash(string $algo, string $data, bool $binary=false, array $options=[])
#define tiger_compress(passes, str, state)
PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
PHP_HASH_API void PHP_TIGER128Final(unsigned char digest[16], PHP_TIGER_CTX *context)
PHP_HASH_API void PHP_TIGERUpdate(PHP_TIGER_CTX *context, const unsigned char *input, size_t len)
PHP_HASH_API void PHP_TIGER192Final(unsigned char digest[24], PHP_TIGER_CTX *context)
#define PHP_HASH_TIGER_OPS(p, b)
PHP_HASH_API void PHP_TIGER160Final(unsigned char digest[20], PHP_TIGER_CTX *context)
struct _php_hashcontext_object php_hashcontext_object
#define PHP_HASH_SERIALIZE_MAGIC_SPEC
#define ZEND_ATTRIBUTE_UNUSED
#define ZEND_SECURE_ZERO(var, size)
struct _zend_array HashTable