libhasha 2.2.2
Loading...
Searching...
No Matches
primitive.h
Go to the documentation of this file.
1
2
3#ifndef __HASHA_INTERNAL_PRIMITIVE_H
4#define __HASHA_INTERNAL_PRIMITIVE_H
5
6#define ha_primitive_base_rot(fst, scd, bits, x, n) \
7 (((x)fst(n)) | ((x)scd(bits - (n))))
8#define ha_primitive_base_rotl(bits, x, n) \
9 ha_primitive_base_rot(<<, >>, bits, x, n)
10#define ha_primitive_base_rotr(bits, x, n) \
11 ha_primitive_base_rot(>>, <<, bits, x, n)
12
13#define ha_primitive_rotl32(x, n) ha_primitive_base_rotl(32, x, n)
14#define ha_primitive_rotl64(x, n) ha_primitive_base_rotl(64, x, n)
15
16#define ha_primitive_rotr32(x, n) ha_primitive_base_rotr(32, x, n)
17#define ha_primitive_rotr64(x, n) ha_primitive_base_rotr(64, x, n)
18
19#define ha_primitive_shr(x, n) ((x) >> (n))
20#define ha_primitive_shl(x, n) ((x) << (n))
21
22#define ha_primitive_ch(x, y, z) (((x) & (y)) ^ (~(x) & (z)))
23#define ha_primitive_maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
24
25/* md5 primitives */
26#define ha_primitive_md5_f(x, y, z) (((x) & (y)) | (~(x) & (z)))
27#define ha_primitive_md5_g(x, y, z) (((x) & (z)) | ((y) & ~(z)))
28#define ha_primitive_md5_h(x, y, z) ((x) ^ (y) ^ (z))
29#define ha_primitive_md5_i(x, y, z) ((y) ^ ((x) | ~(z)))
30
31/* sha2 primitives */
32/* Sigma [Σ] */
33#define ha_primitive_Sigma0_32(x) \
34 (ha_primitive_rotr32((x), 2) ^ ha_primitive_rotr32((x), 13) ^ \
35 ha_primitive_rotr32((x), 22))
36#define ha_primitive_Sigma0_64(x) \
37 (ha_primitive_rotr64(x, 28) ^ ha_primitive_rotr64(x, 34) ^ \
38 ha_primitive_rotr64(x, 39))
39
40#define ha_primitive_Sigma1_32(x) \
41 (ha_primitive_rotr32((x), 6) ^ ha_primitive_rotr32((x), 11) ^ \
42 ha_primitive_rotr32((x), 25))
43#define ha_primitive_Sigma1_64(x) \
44 (ha_primitive_rotr64(x, 14) ^ ha_primitive_rotr64(x, 18) ^ \
45 ha_primitive_rotr64(x, 41))
46
47/* sigma [σ] */
48#define ha_primitive_sigma0_32(x) \
49 (ha_primitive_rotr32((x), 7) ^ ha_primitive_rotr32((x), 18) ^ \
50 ha_primitive_shr(x, 3))
51#define ha_primitive_sigma0_64(x) \
52 (ha_primitive_rotr64(x, 1) ^ ha_primitive_rotr64(x, 8) ^ \
53 ha_primitive_shr(x, 7))
54
55#define ha_primitive_sigma1_32(x) \
56 (ha_primitive_rotr32((x), 17) ^ ha_primitive_rotr32((x), 19) ^ \
57 ((x) >> 10))
58#define ha_primitive_sigma1_64(x) \
59 (ha_primitive_rotr64(x, 19) ^ ha_primitive_rotr64(x, 61) ^ \
60 ha_primitive_shr(x, 6))
61
62#define ha_primitive_blake32_g(sigmatb, r, i, a, b, c, d) \
63 a += b + m[sigmatb[r][2 * i + 0]]; \
64 d ^= a; \
65 d = (d >> 16) | (d << 16); \
66 c += d; \
67 b ^= c; \
68 b = (b >> 12) | (b << 20); \
69 a += b + m[sigmatb[r][2 * i + 1]]; \
70 d ^= a; \
71 d = (d >> 8) | (d << 24); \
72 c += d; \
73 b ^= c; \
74 b = (b >> 7) | (b << 25);
75
76#define ha_primitive_blake64_g(sigmatb, r, i, a, b, c, d) \
77 a += b + m[sigmatb[r][2 * i + 0]]; \
78 d ^= a; \
79 d = (d >> 32) | (d << 32); \
80 c += d; \
81 b ^= c; \
82 b = (b >> 24) | (b << 40); \
83 a += b + m[sigmatb[r][2 * i + 1]]; \
84 d ^= a; \
85 d = (d >> 16) | (d << 48); \
86 c += d; \
87 b ^= c; \
88 b = (b >> 63) | (b << 1);
89
90#define ha_primitive_blake_round(sigmatb, g, i) \
91 g(sigmatb, i, 0, v[0], v[4], v[8], v[12]); \
92 g(sigmatb, i, 1, v[1], v[5], v[9], v[13]); \
93 g(sigmatb, i, 2, v[2], v[6], v[10], v[14]); \
94 g(sigmatb, i, 3, v[3], v[7], v[11], v[15]); \
95 g(sigmatb, i, 4, v[0], v[5], v[10], v[15]); \
96 g(sigmatb, i, 5, v[1], v[6], v[11], v[12]); \
97 g(sigmatb, i, 6, v[2], v[7], v[8], v[13]); \
98 g(sigmatb, i, 7, v[3], v[4], v[9], v[14]);
99
100#define ha_primitive_blake32_round(sigmatb, i) \
101 ha_primitive_blake_round(sigmatb, ha_primitive_blake32_g, i)
102
103#define ha_primitive_blake64_round(sigmatb, i) \
104 ha_primitive_blake_round(sigmatb, ha_primitive_blake64_g, i)
105
106#endif /* __HASHA_INTERNAL_PRIMITIVE_H */