Skip to content

Instantly share code, notes, and snippets.

@ershovio
Created March 8, 2015 12:54
Show Gist options
  • Save ershovio/e62c696644adb13bdd14 to your computer and use it in GitHub Desktop.
Save ershovio/e62c696644adb13bdd14 to your computer and use it in GitHub Desktop.
#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