26#define round(tables, k1, k2) \
28 l ^= tables[0][t & 0xff] ^ tables[1][(t >> 8) & 0xff] ^ \
29 tables[2][(t >> 16) & 0xff] ^ tables[3][t >> 24]; \
31 r ^= tables[0][t & 0xff] ^ tables[1][(t >> 8) & 0xff] ^ \
32 tables[2][(t >> 16) & 0xff] ^ tables[3][t >> 24];
34#define R(tables, key, h, i, t, l, r) \
37 round(tables, key[0], key[1]) \
38 round(tables, key[2], key[3]) \
39 round(tables, key[4], key[5]) \
40 round(tables, key[6], key[7]) \
41 round(tables, key[0], key[1]) \
42 round(tables, key[2], key[3]) \
43 round(tables, key[4], key[5]) \
44 round(tables, key[6], key[7]) \
45 round(tables, key[0], key[1]) \
46 round(tables, key[2], key[3]) \
47 round(tables, key[4], key[5]) \
48 round(tables, key[6], key[7]) \
49 round(tables, key[7], key[6]) \
50 round(tables, key[5], key[4]) \
51 round(tables, key[3], key[2]) \
52 round(tables, key[1], key[0]) \
68 key[0] = (w[0] & 0x000000ff) | ((w[2] & 0x000000ff) << 8) | \
69 ((w[4] & 0x000000ff) << 16) | ((w[6] & 0x000000ff) << 24); \
70 key[1] = ((w[0] & 0x0000ff00) >> 8) | (w[2] & 0x0000ff00) | \
71 ((w[4] & 0x0000ff00) << 8) | ((w[6] & 0x0000ff00) << 16); \
72 key[2] = ((w[0] & 0x00ff0000) >> 16) | ((w[2] & 0x00ff0000) >> 8) | \
73 (w[4] & 0x00ff0000) | ((w[6] & 0x00ff0000) << 8); \
74 key[3] = ((w[0] & 0xff000000) >> 24) | ((w[2] & 0xff000000) >> 16) | \
75 ((w[4] & 0xff000000) >> 8) | (w[6] & 0xff000000); \
76 key[4] = (w[1] & 0x000000ff) | ((w[3] & 0x000000ff) << 8) | \
77 ((w[5] & 0x000000ff) << 16) | ((w[7] & 0x000000ff) << 24); \
78 key[5] = ((w[1] & 0x0000ff00) >> 8) | (w[3] & 0x0000ff00) | \
79 ((w[5] & 0x0000ff00) << 8) | ((w[7] & 0x0000ff00) << 16); \
80 key[6] = ((w[1] & 0x00ff0000) >> 16) | ((w[3] & 0x00ff0000) >> 8) | \
81 (w[5] & 0x00ff0000) | ((w[7] & 0x00ff0000) << 8); \
82 key[7] = ((w[1] & 0xff000000) >> 24) | ((w[3] & 0xff000000) >> 16) | \
83 ((w[5] & 0xff000000) >> 8) | (w[7] & 0xff000000);
112 x[0] ^= 0xff00ff00; \
113 x[1] ^= 0xff00ff00; \
114 x[2] ^= 0x00ff00ff; \
115 x[3] ^= 0x00ff00ff; \
116 x[4] ^= 0x00ffff00; \
117 x[5] ^= 0xff0000ff; \
118 x[6] ^= 0x000000ff; \
125#define SHIFT12(u, m, s) \
126 u[0] = m[0] ^ s[6]; \
127 u[1] = m[1] ^ s[7]; \
128 u[2] = m[2] ^ (s[0] << 16) ^ (s[0] >> 16) ^ (s[0] & 0xffff) ^ \
129 (s[1] & 0xffff) ^ (s[1] >> 16) ^ (s[2] << 16) ^ s[6] ^ (s[6] << 16) ^ \
130 (s[7] & 0xffff0000) ^ (s[7] >> 16); \
131 u[3] = m[3] ^ (s[0] & 0xffff) ^ (s[0] << 16) ^ (s[1] & 0xffff) ^ \
132 (s[1] << 16) ^ (s[1] >> 16) ^ (s[2] << 16) ^ (s[2] >> 16) ^ \
133 (s[3] << 16) ^ s[6] ^ (s[6] << 16) ^ (s[6] >> 16) ^ (s[7] & 0xffff) ^ \
134 (s[7] << 16) ^ (s[7] >> 16); \
136 (s[0] & 0xffff0000) ^ (s[0] << 16) ^ (s[0] >> 16) ^ \
137 (s[1] & 0xffff0000) ^ (s[1] >> 16) ^ (s[2] << 16) ^ (s[2] >> 16) ^ \
138 (s[3] << 16) ^ (s[3] >> 16) ^ (s[4] << 16) ^ (s[6] << 16) ^ \
139 (s[6] >> 16) ^(s[7] & 0xffff) ^ (s[7] << 16) ^ (s[7] >> 16); \
140 u[5] = m[5] ^ (s[0] << 16) ^ (s[0] >> 16) ^ (s[0] & 0xffff0000) ^ \
141 (s[1] & 0xffff) ^ s[2] ^ (s[2] >> 16) ^ (s[3] << 16) ^ (s[3] >> 16) ^ \
142 (s[4] << 16) ^ (s[4] >> 16) ^ (s[5] << 16) ^ (s[6] << 16) ^ \
143 (s[6] >> 16) ^ (s[7] & 0xffff0000) ^ (s[7] << 16) ^ (s[7] >> 16); \
144 u[6] = m[6] ^ s[0] ^ (s[1] >> 16) ^ (s[2] << 16) ^ s[3] ^ (s[3] >> 16) ^ \
145 (s[4] << 16) ^ (s[4] >> 16) ^ (s[5] << 16) ^ (s[5] >> 16) ^ s[6] ^ \
146 (s[6] << 16) ^ (s[6] >> 16) ^ (s[7] << 16); \
147 u[7] = m[7] ^ (s[0] & 0xffff0000) ^ (s[0] << 16) ^ (s[1] & 0xffff) ^ \
148 (s[1] << 16) ^ (s[2] >> 16) ^ (s[3] << 16) ^ s[4] ^ (s[4] >> 16) ^ \
149 (s[5] << 16) ^ (s[5] >> 16) ^ (s[6] >> 16) ^ (s[7] & 0xffff) ^ \
150 (s[7] << 16) ^ (s[7] >> 16);
152#define SHIFT16(h, v, u) \
153 v[0] = h[0] ^ (u[1] << 16) ^ (u[0] >> 16); \
154 v[1] = h[1] ^ (u[2] << 16) ^ (u[1] >> 16); \
155 v[2] = h[2] ^ (u[3] << 16) ^ (u[2] >> 16); \
156 v[3] = h[3] ^ (u[4] << 16) ^ (u[3] >> 16); \
157 v[4] = h[4] ^ (u[5] << 16) ^ (u[4] >> 16); \
158 v[5] = h[5] ^ (u[6] << 16) ^ (u[5] >> 16); \
159 v[6] = h[6] ^ (u[7] << 16) ^ (u[6] >> 16); \
160 v[7] = h[7] ^ (u[0] & 0xffff0000) ^ (u[0] << 16) ^ (u[7] >> 16) ^ \
161 (u[1] & 0xffff0000) ^ (u[1] << 16) ^ (u[6] << 16) ^ (u[7] & 0xffff0000);
163#define SHIFT61(h, v) \
164 h[0] = (v[0] & 0xffff0000) ^ (v[0] << 16) ^ (v[0] >> 16) ^ (v[1] >> 16) ^ \
165 (v[1] & 0xffff0000) ^ (v[2] << 16) ^ (v[3] >> 16) ^ (v[4] << 16) ^ \
166 (v[5] >> 16) ^ v[5] ^ (v[6] >> 16) ^ (v[7] << 16) ^ (v[7] >> 16) ^ \
168 h[1] = (v[0] << 16) ^ (v[0] >> 16) ^ (v[0] & 0xffff0000) ^ (v[1] & 0xffff) ^ \
169 v[2] ^ (v[2] >> 16) ^ (v[3] << 16) ^ (v[4] >> 16) ^ (v[5] << 16) ^ \
170 (v[6] << 16) ^ v[6] ^ (v[7] & 0xffff0000) ^ (v[7] >> 16); \
171 h[2] = (v[0] & 0xffff) ^ (v[0] << 16) ^ (v[1] << 16) ^ (v[1] >> 16) ^ \
172 (v[1] & 0xffff0000) ^ (v[2] << 16) ^ (v[3] >> 16) ^ v[3] ^ (v[4] << 16) ^ \
173 (v[5] >> 16) ^ v[6] ^ (v[6] >> 16) ^ (v[7] & 0xffff) ^ (v[7] << 16) ^ \
175 h[3] = (v[0] << 16) ^ (v[0] >> 16) ^ (v[0] & 0xffff0000) ^ \
176 (v[1] & 0xffff0000) ^ (v[1] >> 16) ^ (v[2] << 16) ^ (v[2] >> 16) ^ v[2] ^ \
177 (v[3] << 16) ^ (v[4] >> 16) ^ v[4] ^ (v[5] << 16) ^ (v[6] << 16) ^ \
178 (v[7] & 0xffff) ^ (v[7] >> 16); \
179 h[4] = (v[0] >> 16) ^ (v[1] << 16) ^ v[1] ^ (v[2] >> 16) ^ v[2] ^ \
180 (v[3] << 16) ^ (v[3] >> 16) ^ v[3] ^ (v[4] << 16) ^ (v[5] >> 16) ^ \
181 v[5] ^ (v[6] << 16) ^ (v[6] >> 16) ^ (v[7] << 16); \
182 h[5] = (v[0] << 16) ^ (v[0] & 0xffff0000) ^ (v[1] << 16) ^ (v[1] >> 16) ^ \
183 (v[1] & 0xffff0000) ^ (v[2] << 16) ^ v[2] ^ (v[3] >> 16) ^ v[3] ^ \
184 (v[4] << 16) ^ (v[4] >> 16) ^ v[4] ^ (v[5] << 16) ^ (v[6] << 16) ^ \
185 (v[6] >> 16) ^ v[6] ^ (v[7] << 16) ^ (v[7] >> 16) ^ (v[7] & 0xffff0000); \
186 h[6] = v[0] ^ v[2] ^ (v[2] >> 16) ^ v[3] ^ (v[3] << 16) ^ v[4] ^ \
187 (v[4] >> 16) ^ (v[5] << 16) ^ (v[5] >> 16) ^ v[5] ^ (v[6] << 16) ^ \
188 (v[6] >> 16) ^ v[6] ^ (v[7] << 16) ^ v[7]; \
189 h[7] = v[0] ^ (v[0] >> 16) ^ (v[1] << 16) ^ (v[1] >> 16) ^ (v[2] << 16) ^ \
190 (v[3] >> 16) ^ v[3] ^ (v[4] << 16) ^ v[4] ^ (v[5] >> 16) ^ v[5] ^ \
191 (v[6] << 16) ^ (v[6] >> 16) ^ (v[7] << 16) ^ v[7];
193#define PASS(tables) \
196 R((tables), key, h, i, t, l, r); \
209 uint32_t l, r, t,
key[8],
u[8],
v[8], w[8],
s[8], *h =
context->state, *m =
data;
214 for (i = 0; i < 8; i += 2) {
226 uint32_t
data[8], temp = 0;
228 for (i = 0,
j = 0; i < 8; ++i,
j += 4) {
229 data[i] = ((uint32_t) input[
j]) | (((uint32_t) input[
j + 1]) << 8) |
230 (((uint32_t) input[
j + 2]) << 16) | (((uint32_t) input[
j + 3]) << 24);
241 context->tables = &tables_test;
247 context->tables = &tables_crypto;
250static const uint32_t MAX32 = 0xffffffffLU;
254 if ((MAX32 -
context->count[0]) < (
len * 8)) {
266 size_t i = 0, r = (
context->length +
len) % 32;
274 for (; i + 32 <=
len; i += 32) {
275 GostTransform(
context, input + i);
280 context->length = (
unsigned char)r;
286 uint32_t i,
j, l[8] = {0};
297 for (i = 0,
j = 0;
j < 32; i++,
j += 4) {
298 digest[
j] = (
unsigned char) (
context->state[i] & 0xff);
299 digest[
j + 1] = (
unsigned char) ((
context->state[i] >> 8) & 0xff);
300 digest[
j + 2] = (
unsigned char) ((
context->state[i] >> 16) & 0xff);
301 digest[
j + 3] = (
unsigned char) ((
context->state[i] >> 24) & 0xff);
313 && ctx->length <
sizeof(ctx->buffer)) {
316 return r !=
SUCCESS ? r : -2000;
327 php_gost_unserialize,
342 php_gost_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=[])
PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
const php_hash_ops php_hash_gost_crypto_ops
PHP_HASH_API void PHP_GOSTInitCrypto(PHP_GOST_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
const php_hash_ops php_hash_gost_ops
PHP_HASH_API void PHP_GOSTUpdate(PHP_GOST_CTX *context, const unsigned char *input, size_t len)
PHP_HASH_API void PHP_GOSTFinal(unsigned char digest[32], PHP_GOST_CTX *context)
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
unsigned char key[REFLECTION_KEY_LEN]
#define ZEND_ATTRIBUTE_UNUSED
#define ZEND_SECURE_ZERO(var, size)
struct _zend_array HashTable