rendered paste body#include <emmintrin.h>typedef __m128i BIT;#define XOR(a,b) _mm_xor_si128(a,b)#define AND(a,b) _mm_and_si128(a,b)#define OR(a,b) _mm_or_si128(a,b)#define NOT(a) _mm_xor_si128(a,one)#define IDXINCHAINBITS 14#define fa(a,b,c,d,e,r)\ t0 = a;\ t1 = b;\ t2 = c;\ t3 = d;\ t4 = e;\ t5 = XOR( t1, t2);\ t6 = XOR( t5, t3);\ t7 = AND( t1, t6);\ t8 = XOR( t7, t2);\ t9 = AND( t2, t3);\ t10 = XOR( t9, t4);\ t11 = AND( t1, t5);\ t12 = XOR(t11,t10);\ t13 = AND( t4,t12);\ t14 = XOR(t13, t8);\ t15 = XOR( t6,t12);\ t16 = AND( t0,t15);\ t17 = XOR(t16,t14);\ r = t17#define fb(a,b,c,d,e,r)\ t0 = a;\ t1 = b;\ t2 = c;\ t3 = d;\ t4 = e;\ t5 = XOR( t3, t4);\ t6 = XOR( t0, t1);\ t7 = XOR( t6, t5);\ t8 = AND( t0, t7);\ t9 = XOR( t8, t5);\ t10 = AND( t2, t7);\ t11 = XOR(t10, t9);\ r = t11#define fc(a,b,c,d,e,r)\ t0 = a;\ t1 = b;\ t2 = c;\ t3 = d;\ t4 = e;\ t5 = NOT( t4);\ t6 = XOR( t5, t2);\ t7 = AND( t0, t1);\ t8 = XOR( t7, t6);\ t9 = AND( t1, t8);\ t10 = XOR( t9, t2);\ t11 = OR( t0, t6);\ t12 = XOR(t11, t1);\ t13 = AND( t3,t12);\ t14 = XOR(t13,t10);\ r = t14#define fd(a,b,c,d,e,r)\ t0 = a;\ t1 = b;\ t2 = c;\ t3 = d;\ t4 = e;\ t5 = XOR( t1, t2);\ t6 = XOR( t5, t0);\ t7 = AND( t3, t6);\ t8 = XOR( t7, t2);\ t9 = XOR( t4, t6);\ t10 = AND( t4, t9);\ t11 = XOR(t10, t8);\ r = t11#define fe(a,b,c,d,r)\ t0 = a;\ t1 = b;\ t2 = c;\ t3 = d;\ t4 = OR( t0, t3);\ t5 = AND( t1, t3);\ t6 = XOR( t5, t4);\ t7 = XOR( t0, t1);\ t8 = AND( t2, t7);\ t9 = XOR( t8, t6);\ r = t9#define fg(a,b,c,d,r)\ t0 = a;\ t1 = b;\ t2 = c;\ t3 = d;\ t4 = OR( t2, t3);\ t5 = AND( t0, t2);\ t6 = XOR( t5, t4);\ t7 = XOR( t0, t3);\ t8 = AND( t1, t7);\ t9 = XOR( t8, t6);\ r = t9#define fh(a,b,c,d,rh,rl)\ t0 = a;\ t1 = b;\ t2 = c;\ t3 = d;\ t4 = XOR( t0, t2);\ t5 = XOR( t4, t1);\ t6 = AND( t1, t5);\ t7 = XOR( t6, t0);\ t8 = AND( t3, t4);\ t9 = XOR( t8, t7);\ t10 = AND( t5, t9);\ t11 = XOR(t10, t4);\ t12 = AND( t3, t9);\ t13 = XOR(t12,t11);\ rl=t9;\ rh=t13inline void bs_update_k(BIT *k){ BIT t; int i; t = XOR(XOR(k[0], k[2]), XOR(k[19], k[17])); for(i = 0; i < 39; i++) k[i] = k[i+1]; k[39] = t;}inline void bs_update_x(BIT *x, BIT *k){ BIT t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17; BIT f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16; BIT g1,g2,g3,g4; BIT hh,hl; int i; BIT one; one = _mm_set1_epi32(-1); fa(k[39], k[31], x[39], x[31], x[23], f1 ); fb(k[38], k[30], x[38], x[30], x[22], f2 ); fc(k[23], k[15], k[ 7], x[15], x[ 7], f3 ); fd(k[22], k[14], k[ 6], x[14], x[ 6], f4 ); fa(k[37], k[29], x[37], x[29], x[21], f5 ); fb(k[36], k[28], x[36], x[28], x[20], f6 ); fc(k[21], k[13], k[ 5], x[13], x[ 5], f7 ); fd(k[20], k[12], k[ 4], x[12], x[ 4], f8 ); fa(k[35], k[27], x[35], x[27], x[19], f9 ); fb(k[34], k[26], x[34], x[26], x[18], f10); fc(k[19], k[11], k[ 3], x[11], x[ 3], f11); fd(k[18], k[10], k[ 2], x[10], x[ 2], f12); fa(k[33], k[25], x[33], x[25], x[17], f13); fb(k[32], k[24], x[32], x[24], x[16], f14); fe(k[17], k[ 9], k[ 1], x[ 9], f15); fe(k[16], k[ 8], k[ 0], x[ 8], f16); fg( f1, f2, f3, f4, g1); fg( f5, f6, f7, f8, g2); fg( f9, f10, f11, f12, g3); fg(f13, f14, f15, f16, g4); fh(g1, g2, g3, g4, hh, hl); hh = XOR(hh, x[1]); hl = XOR(hl, x[0]); for(i = 0; i < 38; i++) x[i] = x[i+2]; x[39] = hh; x[38] = hl;}inline void bs_dst40_2(BIT *x1, BIT *x2, BIT *k){ int rd; for(rd = 0; rd < 200; rd++) { bs_update_x(x1, k); bs_update_x(x2, k); if(rd % 3 == 0) bs_update_k(k); }}inline void bs_x2k(BIT *x1, BIT *x2, BIT *k, unsigned int tablenum, unsigned int idxinchain){ int i; BIT one; one = _mm_set1_epi32(-1); if(tablenum < 5) { for(i = 0; i < 24; i++) k[i] = x1[i]; for(i = 0; i < 16; i++) k[24 + i] = x2[i]; for(i = 0; i < 8; i++) k[tablenum * 8 + i] = XOR(k[tablenum * 8 + i], x2[16 + i]); } else { tablenum -= 5; for(i = 0; i < 24; i++) k[i] = x2[i]; for(i = 0; i < 16; i++) k[24 + i] = x1[i]; for(i = 0; i < 8; i++) k[tablenum * 8 + i] = XOR(k[tablenum * 8 + i], x1[16 + i]); } for(i = 0; i < IDXINCHAINBITS; i++) { if(idxinchain & (1 << i)) { k[i] = XOR(k[i], one); } }}int bs_rainbow_rebuild(const unsigned long long *keys, const int *chainlens, unsigned int rsp0, unsigned int rsp1, unsigned int tablenum){ BIT x1[40], x2[40], k[40], brsp0[24], brsp1[24], tb; unsigned int i, j, t = 0; int curchain; tb = _mm_setzero_si128(); for(j = 0; j < 24; j++) { if(rsp0 & (1 << j)) brsp0[j] = _mm_set1_epi32(-1); else brsp0[j] = _mm_setzero_si128(); if(rsp1 & (1 << j)) brsp1[j] = _mm_set1_epi32(-1); else brsp1[j] = _mm_setzero_si128(); } for(j = 0; j < 40; j++) { for(i = 0; i < 128; i++) { t <<= 1; t |= (keys[i] >> j) & 1; if(i % 32 == 31) { tb = _mm_slli_si128(tb, 4); tb = OR(tb, _mm_cvtsi32_si128(t)); } } k[j] = tb; } i = 0; curchain = 127; while(curchain >= 0) { for(;i < chainlens[curchain]; i++) { for(j = 0; j < 40; j++) { x1[j] = _mm_setzero_si128(); x2[j] = _mm_setzero_si128(); } x2[0] = _mm_set1_epi32(-1); bs_dst40_2(x1, x2, k); bs_x2k(x1, x2, k, tablenum, i); } tb = _mm_setzero_si128(); for(j = 0; j < 24; j++) tb = OR(tb, XOR(x1[j], brsp0[j])); for(j = 0; j < 24; j++) tb = OR(tb, XOR(x2[j], brsp1[j])); tb = AND(tb, _mm_srli_si128(tb, 8)); tb = AND(tb, _mm_srli_si128(tb, 4)); t = _mm_cvtsi128_si32(tb); if(t != 0xFFFFFFFF) return curchain; curchain--; } return -1;}