All pastes #897021 Raw Edit

Unbenannt

public c v1 · immutable
·published 2008-02-09 03:36 UTC
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;}