29#define DIGESTBITS (8*DIGESTBYTES)
32#define WBLOCKBITS (8*WBLOCKBYTES)
35#define LENGTHBITS (8*LENGTHBYTES)
49 for (i = 0; i < 8; i++,
buffer += 8) {
51 (((uint64_t)
buffer[0] ) << 56) ^
52 (((uint64_t)
buffer[1] & 0xffL) << 48) ^
53 (((uint64_t)
buffer[2] & 0xffL) << 40) ^
54 (((uint64_t)
buffer[3] & 0xffL) << 32) ^
55 (((uint64_t)
buffer[4] & 0xffL) << 24) ^
56 (((uint64_t)
buffer[5] & 0xffL) << 16) ^
57 (((uint64_t)
buffer[6] & 0xffL) << 8) ^
58 (((uint64_t)
buffer[7] & 0xffL) );
74 for (r = 1; r <=
R; r++) {
79 C0[(int)(
K[0] >> 56) ] ^
80 C1[(int)(
K[7] >> 48) & 0xff] ^
81 C2[(int)(
K[6] >> 40) & 0xff] ^
82 C3[(int)(
K[5] >> 32) & 0xff] ^
83 C4[(int)(
K[4] >> 24) & 0xff] ^
84 C5[(int)(
K[3] >> 16) & 0xff] ^
85 C6[(int)(
K[2] >> 8) & 0xff] ^
86 C7[(int)(
K[1] ) & 0xff] ^
89 C0[(int)(
K[1] >> 56) ] ^
90 C1[(int)(
K[0] >> 48) & 0xff] ^
91 C2[(int)(
K[7] >> 40) & 0xff] ^
92 C3[(int)(
K[6] >> 32) & 0xff] ^
93 C4[(int)(
K[5] >> 24) & 0xff] ^
94 C5[(int)(
K[4] >> 16) & 0xff] ^
95 C6[(int)(
K[3] >> 8) & 0xff] ^
96 C7[(int)(
K[2] ) & 0xff];
98 C0[(int)(
K[2] >> 56) ] ^
99 C1[(int)(
K[1] >> 48) & 0xff] ^
100 C2[(int)(
K[0] >> 40) & 0xff] ^
101 C3[(int)(
K[7] >> 32) & 0xff] ^
102 C4[(int)(
K[6] >> 24) & 0xff] ^
103 C5[(int)(
K[5] >> 16) & 0xff] ^
104 C6[(int)(
K[4] >> 8) & 0xff] ^
105 C7[(int)(
K[3] ) & 0xff];
107 C0[(int)(
K[3] >> 56) ] ^
108 C1[(int)(
K[2] >> 48) & 0xff] ^
109 C2[(int)(
K[1] >> 40) & 0xff] ^
110 C3[(int)(
K[0] >> 32) & 0xff] ^
111 C4[(int)(
K[7] >> 24) & 0xff] ^
112 C5[(int)(
K[6] >> 16) & 0xff] ^
113 C6[(int)(
K[5] >> 8) & 0xff] ^
114 C7[(int)(
K[4] ) & 0xff];
116 C0[(int)(
K[4] >> 56) ] ^
117 C1[(int)(
K[3] >> 48) & 0xff] ^
118 C2[(int)(
K[2] >> 40) & 0xff] ^
119 C3[(int)(
K[1] >> 32) & 0xff] ^
120 C4[(int)(
K[0] >> 24) & 0xff] ^
121 C5[(int)(
K[7] >> 16) & 0xff] ^
122 C6[(int)(
K[6] >> 8) & 0xff] ^
123 C7[(int)(
K[5] ) & 0xff];
125 C0[(int)(
K[5] >> 56) ] ^
126 C1[(int)(
K[4] >> 48) & 0xff] ^
127 C2[(int)(
K[3] >> 40) & 0xff] ^
128 C3[(int)(
K[2] >> 32) & 0xff] ^
129 C4[(int)(
K[1] >> 24) & 0xff] ^
130 C5[(int)(
K[0] >> 16) & 0xff] ^
131 C6[(int)(
K[7] >> 8) & 0xff] ^
132 C7[(int)(
K[6] ) & 0xff];
134 C0[(int)(
K[6] >> 56) ] ^
135 C1[(int)(
K[5] >> 48) & 0xff] ^
136 C2[(int)(
K[4] >> 40) & 0xff] ^
137 C3[(int)(
K[3] >> 32) & 0xff] ^
138 C4[(int)(
K[2] >> 24) & 0xff] ^
139 C5[(int)(
K[1] >> 16) & 0xff] ^
140 C6[(int)(
K[0] >> 8) & 0xff] ^
141 C7[(int)(
K[7] ) & 0xff];
143 C0[(int)(
K[7] >> 56) ] ^
144 C1[(int)(
K[6] >> 48) & 0xff] ^
145 C2[(int)(
K[5] >> 40) & 0xff] ^
146 C3[(int)(
K[4] >> 32) & 0xff] ^
147 C4[(int)(
K[3] >> 24) & 0xff] ^
148 C5[(int)(
K[2] >> 16) & 0xff] ^
149 C6[(int)(
K[1] >> 8) & 0xff] ^
150 C7[(int)(
K[0] ) & 0xff];
163 C0[(int)(
state[0] >> 56) ] ^
164 C1[(int)(
state[7] >> 48) & 0xff] ^
165 C2[(int)(
state[6] >> 40) & 0xff] ^
166 C3[(int)(
state[5] >> 32) & 0xff] ^
167 C4[(int)(
state[4] >> 24) & 0xff] ^
168 C5[(int)(
state[3] >> 16) & 0xff] ^
169 C6[(int)(
state[2] >> 8) & 0xff] ^
170 C7[(int)(
state[1] ) & 0xff] ^
173 C0[(int)(
state[1] >> 56) ] ^
174 C1[(int)(
state[0] >> 48) & 0xff] ^
175 C2[(int)(
state[7] >> 40) & 0xff] ^
176 C3[(int)(
state[6] >> 32) & 0xff] ^
177 C4[(int)(
state[5] >> 24) & 0xff] ^
178 C5[(int)(
state[4] >> 16) & 0xff] ^
179 C6[(int)(
state[3] >> 8) & 0xff] ^
180 C7[(int)(
state[2] ) & 0xff] ^
183 C0[(int)(
state[2] >> 56) ] ^
184 C1[(int)(
state[1] >> 48) & 0xff] ^
185 C2[(int)(
state[0] >> 40) & 0xff] ^
186 C3[(int)(
state[7] >> 32) & 0xff] ^
187 C4[(int)(
state[6] >> 24) & 0xff] ^
188 C5[(int)(
state[5] >> 16) & 0xff] ^
189 C6[(int)(
state[4] >> 8) & 0xff] ^
190 C7[(int)(
state[3] ) & 0xff] ^
193 C0[(int)(
state[3] >> 56) ] ^
194 C1[(int)(
state[2] >> 48) & 0xff] ^
195 C2[(int)(
state[1] >> 40) & 0xff] ^
196 C3[(int)(
state[0] >> 32) & 0xff] ^
197 C4[(int)(
state[7] >> 24) & 0xff] ^
198 C5[(int)(
state[6] >> 16) & 0xff] ^
199 C6[(int)(
state[5] >> 8) & 0xff] ^
200 C7[(int)(
state[4] ) & 0xff] ^
203 C0[(int)(
state[4] >> 56) ] ^
204 C1[(int)(
state[3] >> 48) & 0xff] ^
205 C2[(int)(
state[2] >> 40) & 0xff] ^
206 C3[(int)(
state[1] >> 32) & 0xff] ^
207 C4[(int)(
state[0] >> 24) & 0xff] ^
208 C5[(int)(
state[7] >> 16) & 0xff] ^
209 C6[(int)(
state[6] >> 8) & 0xff] ^
210 C7[(int)(
state[5] ) & 0xff] ^
213 C0[(int)(
state[5] >> 56) ] ^
214 C1[(int)(
state[4] >> 48) & 0xff] ^
215 C2[(int)(
state[3] >> 40) & 0xff] ^
216 C3[(int)(
state[2] >> 32) & 0xff] ^
217 C4[(int)(
state[1] >> 24) & 0xff] ^
218 C5[(int)(
state[0] >> 16) & 0xff] ^
219 C6[(int)(
state[7] >> 8) & 0xff] ^
220 C7[(int)(
state[6] ) & 0xff] ^
223 C0[(int)(
state[6] >> 56) ] ^
224 C1[(int)(
state[5] >> 48) & 0xff] ^
225 C2[(int)(
state[4] >> 40) & 0xff] ^
226 C3[(int)(
state[3] >> 32) & 0xff] ^
227 C4[(int)(
state[2] >> 24) & 0xff] ^
228 C5[(int)(
state[1] >> 16) & 0xff] ^
229 C6[(int)(
state[0] >> 8) & 0xff] ^
230 C7[(int)(
state[7] ) & 0xff] ^
233 C0[(int)(
state[7] >> 56) ] ^
234 C1[(int)(
state[6] >> 48) & 0xff] ^
235 C2[(int)(
state[5] >> 40) & 0xff] ^
236 C3[(int)(
state[4] >> 32) & 0xff] ^
237 C4[(int)(
state[3] >> 24) & 0xff] ^
238 C5[(int)(
state[2] >> 16) & 0xff] ^
239 C6[(int)(
state[1] >> 8) & 0xff] ^
240 C7[(int)(
state[0] ) & 0xff] ^
273 uint64_t sourceBits =
len * 8;
275 int sourceGap = (8 - ((int)sourceBits & 7)) & 7;
276 int bufferRem =
context->buffer.bits & 7;
277 const unsigned char *source = input;
279 unsigned char *bitLength =
context->bitlength;
280 int bufferBits =
context->buffer.bits;
281 int bufferPos =
context->buffer.pos;
288 uint64_t
value = sourceBits;
289 for (i = 31, carry = 0; i >= 0 && (carry != 0 ||
value !=
L64(0)); i--) {
290 carry += bitLength[i] + ((uint32_t)
value & 0xff);
291 bitLength[i] = (
unsigned char)carry;
298 while (sourceBits > 8) {
303 b = ((source[sourcePos] << sourceGap) & 0xff) |
304 ((source[sourcePos + 1] & 0xff) >> (8 - sourceGap));
308 buffer[bufferPos++] |= (
unsigned char)(b >> bufferRem);
309 bufferBits += 8 - bufferRem;
318 bufferBits = bufferPos = 0;
320 buffer[bufferPos] = (
unsigned char) (b << (8 - bufferRem));
321 bufferBits += bufferRem;
331 if (sourceBits > 0) {
332 b = (source[sourcePos] << sourceGap) & 0xff;
336 buffer[bufferPos] |= b >> bufferRem;
340 if (bufferRem + sourceBits < 8) {
345 bufferBits += (int) sourceBits;
351 bufferBits += 8 - bufferRem;
352 sourceBits -= 8 - bufferRem;
364 bufferBits = bufferPos = 0;
366 buffer[bufferPos] = (
unsigned char) (b << (8 - bufferRem));
367 bufferBits += (int)sourceBits;
369 context->buffer.bits = bufferBits;
370 context->buffer.pos = bufferPos;
377 unsigned char *bitLength =
context->bitlength;
378 int bufferBits =
context->buffer.bits;
379 int bufferPos =
context->buffer.pos;
384 buffer[bufferPos] |= 0x80U >> (bufferBits & 7);
418 digest[0] = (
unsigned char)(
context->state[i] >> 56);
419 digest[1] = (
unsigned char)(
context->state[i] >> 48);
420 digest[2] = (
unsigned char)(
context->state[i] >> 40);
421 digest[3] = (
unsigned char)(
context->state[i] >> 32);
422 digest[4] = (
unsigned char)(
context->state[i] >> 24);
423 digest[5] = (
unsigned char)(
context->state[i] >> 16);
424 digest[6] = (
unsigned char)(
context->state[i] >> 8);
425 digest[7] = (
unsigned char)(
context->state[i] );
438 && ctx->buffer.pos >= 0
439 && ctx->buffer.pos < (
int)
sizeof(ctx->buffer.data)
440 && ctx->buffer.bits >= ctx->buffer.pos * 8
441 && ctx->buffer.bits < ctx->buffer.pos * 8 + 8) {
444 return r !=
SUCCESS ? r : -2000;
455 php_whirlpool_unserialize,
memset(ptr, 0, type->size)
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_spec(php_hashcontext_object *hash, const zval *zv, const char *spec)
hash(string $algo, string $data, bool $binary=false, array $options=[])
#define R(tables, key, h, i, t, l, r)
PHP_HASH_API void PHP_WHIRLPOOLFinal(unsigned char digest[64], PHP_WHIRLPOOL_CTX *context)
const php_hash_ops php_hash_whirlpool_ops
PHP_HASH_API void PHP_WHIRLPOOLInit(PHP_WHIRLPOOL_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
PHP_HASH_API void PHP_WHIRLPOOLUpdate(PHP_WHIRLPOOL_CTX *context, const unsigned char *input, size_t len)
void(* php_hash_final_func_t)(unsigned char *digest, void *context)
struct _php_hashcontext_object php_hashcontext_object
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_HASH_SERIALIZE_MAGIC_SPEC
#define PHP_WHIRLPOOL_SPEC
#define ZEND_ATTRIBUTE_UNUSED
#define ZEND_SECURE_ZERO(var, size)
struct _zend_array HashTable