Created
March 8, 2015 12:54
-
-
Save a-v-ershov/e62c696644adb13bdd14 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
#include<immintrin.h> | |
#include<time.h> | |
#define XOR(a, b) _mm256_xor_si256(a, b) | |
#define AND(a, b) _mm256_and_si256(a, b) | |
#define OR(a, b) _mm256_or_si256(a, b) | |
#define AND_NOT(a, b) _mm256_andnot_si256(a, b) | |
#define ADD(a, b) _mm256_add_epi32(a, b) | |
inline __m256i f1(__m256i v1, __m256i v2, __m256i v3){ | |
return OR(AND(v1, v2), AND_NOT(v1, v3)); | |
} | |
inline __m256i f2(__m256i v1, __m256i v2, __m256i v3){ | |
return XOR(XOR(v1, v2), v3); | |
} | |
inline __m256i f3(__m256i v1, __m256i v2, __m256i v3){ | |
return OR(AND(v2, v3), OR(AND(v1, v2), AND(v1, v3))); | |
} | |
__m256i hash_func(__m256i* blocks){ | |
__m256i a1, a2; // initial values | |
a1 = _mm256_set_epi32(0x5ab883bd, 0x3fc5f80b, 0x4912876c, 0xc4cfbac6, 0x787c624e, 0xc1133dde, 0x648333d1, 0xfc61dd3e); | |
a2 = _mm256_set_epi32(0xc8699d28, 0xd772c544, 0x8a5f11cb, 0x30124f1e, 0x94aab8e6, 0x328d7ae7, 0x6d16c23d, 0x9042920d); | |
__m256i k[4]; //values for addition in round | |
k[0] = _mm256_set_epi32(0xcb8a1485, 0x163e7e7e, 0xdb1447c5, 0x98a7a162, 0x03ea3010, 0x56731bf5, 0x4a02a036, 0xd65065c4); | |
k[1] = _mm256_set_epi32(0x4ee543d5, 0x6bfe3e7d, 0xfa547e8c, 0x7321a8b8, 0x9d2c855d, 0x4158efaa, 0xe05f38eb, 0xde146cd1); | |
k[2] = _mm256_set_epi32(0x8e2c5f55, 0xce7cc282, 0xec4773f7, 0x41ea5d00, 0xb200bdc4, 0x6188a7a9, 0xaea73530, 0x5a65c230); | |
k[3] = _mm256_set_epi32(0x06fe9f19, 0x78c5ef7d, 0xf8e3d4d2, 0x77f9f11a, 0xa8c3f68b, 0xcd27f883, 0x44b2b05e, 0x4dcdeece); | |
int i = 0; | |
for (i = 0; i < 57; ++i){ | |
__m256i tmp = ADD(a1, f1(a1, a2, blocks[i])); | |
tmp = (ADD(tmp, a2), ADD(blocks[i], k[0])); | |
a2 = a1; | |
a1 = tmp; | |
} | |
for (i = 57; i < 114; ++i){ | |
__m256i tmp = ADD(a1, f2(a1, a2, blocks[i])); | |
tmp = (ADD(tmp, a2), ADD(blocks[i], k[1])); | |
a2 = a1; | |
a1 = tmp; | |
} | |
for (i = 114; i < 128; ++i){ | |
__m256i tmp = ADD(a1, f3(a1, a2, blocks[i])); | |
tmp = (ADD(tmp, a2), ADD(blocks[i], k[2])); | |
a2 = a1; | |
a1 = tmp; | |
} | |
for (i = 128; i < 171; ++i){ | |
__m256i block = XOR(blocks[i - 42], blocks[i - 84], blocks[i - 128]); | |
__m256i tmp = ADD(a1, f3(a1, a2, block)); | |
tmp = (ADD(tmp, a2), ADD(block, k[2])); | |
a2 = a1; | |
a1 = tmp; | |
} | |
return XOR(a1, a2); | |
} | |
//generates one 4kb block | |
__m256i* generate_key1(){ | |
__m256i res[128]; | |
srand(time(NULL)); | |
int i = 0; | |
for (; i < 128; ++i){ | |
res[i] = _mm256_set_epi32(rand(), rand(), rand(), rand(), rand(), rand(), rand(), rand()); | |
} | |
return res; | |
} | |
int main(){ | |
__m256i tmp = _mm256_set_epi32(0xcb8a1485, 0x163e7e7e, 0xdb1447c5, 0x98a7a162, 0x03ea3010, 0x56731bf5, 0x4a02a036, 0xd65065c4); | |
__m256i* keys = generate_key1(); | |
for (int i = 0; i < 1000000; ++i){ | |
tmp = hash_func(keys); | |
} | |
int s = 8; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment