void salsa10Process(salsa10Param* mp) { uint32_t X[16]; int i; for (i = 0; i < 16; ++i) { #ifdef WORDS_BIGENDIAN /* XXX untested */ X[i] = swapu32(mp->data[i]); #else X[i] = mp->data[i]; #endif } for (i = 10; i > 0; --i) { X[ 4] ^= ROTL32(X[ 0]+X[12], 6); X[ 8] ^= ROTL32(X[ 4]+X[ 0],17); X[12] += ROTL32(X[ 8]|X[ 4],16); X[ 0] += ROTL32(X[12]^X[ 8], 5); X[ 9] += ROTL32(X[ 5]|X[ 1], 8); X[13] += ROTL32(X[ 9]|X[ 5], 7); X[ 1] ^= ROTL32(X[13]+X[ 9],17); X[ 5] += ROTL32(X[ 1]^X[13],12); X[14] ^= ROTL32(X[10]+X[ 6], 7); X[ 2] += ROTL32(X[14]^X[10],15); X[ 6] ^= ROTL32(X[ 2]+X[14],13); X[10] ^= ROTL32(X[ 6]+X[ 2],15); X[ 3] += ROTL32(X[15]|X[11],20); X[ 7] ^= ROTL32(X[ 3]+X[15],16); X[11] += ROTL32(X[ 7]^X[ 3], 7); X[15] += ROTL32(X[11]^X[ 7], 8); X[ 1] += ROTL32(X[ 0]|X[ 3], 8)^i;X[ 2] ^= ROTL32(X[ 1]+X[ 0],14); X[ 3] ^= ROTL32(X[ 2]+X[ 1], 6); X[ 0] += ROTL32(X[ 3]^X[ 2],18); X[ 6] += ROTL32(X[ 5]^X[ 4], 8); X[ 7] += ROTL32(X[ 6]^X[ 5],12); X[ 4] += ROTL32(X[ 7]|X[ 6],13); X[ 5] ^= ROTL32(X[ 4]+X[ 7],15); X[11] ^= ROTL32(X[10]+X[ 9],18); X[ 8] += ROTL32(X[11]^X[10],11); X[ 9] ^= ROTL32(X[ 8]+X[11], 8); X[10] += ROTL32(X[ 9]|X[ 8], 6); X[12] += ROTL32(X[15]^X[14],17); X[13] ^= ROTL32(X[12]+X[15],15); X[14] += ROTL32(X[13]|X[12], 9); X[15] += ROTL32(X[14]^X[13], 7); } for (i = 0; i < 16; ++i) X[i] += mp->data[i]; /* CBC chaining on stream cipher blocks. */ for (i = 0; i < 16; i++) mp->h[i] += X[i]; }
void sha1Process(sha1Param* sp) { register uint32_t a, b, c, d, e; register uint32_t *w; register byte t; #if WORDS_BIGENDIAN w = sp->data + 16; #else w = sp->data; t = 16; while (t--) { register uint32_t temp = swapu32(*w); *(w++) = temp; } #endif t = 64; while (t--) { register uint32_t temp = w[-3] ^ w[-8] ^ w[-14] ^ w[-16]; *(w++) = ROTL32(temp, 1); } w = sp->data; a = sp->h[0]; b = sp->h[1]; c = sp->h[2]; d = sp->h[3]; e = sp->h[4]; SUBROUND1(a,b,c,d,e,w[ 0],k[0]); SUBROUND1(e,a,b,c,d,w[ 1],k[0]); SUBROUND1(d,e,a,b,c,w[ 2],k[0]); SUBROUND1(c,d,e,a,b,w[ 3],k[0]); SUBROUND1(b,c,d,e,a,w[ 4],k[0]); SUBROUND1(a,b,c,d,e,w[ 5],k[0]); SUBROUND1(e,a,b,c,d,w[ 6],k[0]); SUBROUND1(d,e,a,b,c,w[ 7],k[0]); SUBROUND1(c,d,e,a,b,w[ 8],k[0]); SUBROUND1(b,c,d,e,a,w[ 9],k[0]); SUBROUND1(a,b,c,d,e,w[10],k[0]); SUBROUND1(e,a,b,c,d,w[11],k[0]); SUBROUND1(d,e,a,b,c,w[12],k[0]); SUBROUND1(c,d,e,a,b,w[13],k[0]); SUBROUND1(b,c,d,e,a,w[14],k[0]); SUBROUND1(a,b,c,d,e,w[15],k[0]); SUBROUND1(e,a,b,c,d,w[16],k[0]); SUBROUND1(d,e,a,b,c,w[17],k[0]); SUBROUND1(c,d,e,a,b,w[18],k[0]); SUBROUND1(b,c,d,e,a,w[19],k[0]); SUBROUND2(a,b,c,d,e,w[20],k[1]); SUBROUND2(e,a,b,c,d,w[21],k[1]); SUBROUND2(d,e,a,b,c,w[22],k[1]); SUBROUND2(c,d,e,a,b,w[23],k[1]); SUBROUND2(b,c,d,e,a,w[24],k[1]); SUBROUND2(a,b,c,d,e,w[25],k[1]); SUBROUND2(e,a,b,c,d,w[26],k[1]); SUBROUND2(d,e,a,b,c,w[27],k[1]); SUBROUND2(c,d,e,a,b,w[28],k[1]); SUBROUND2(b,c,d,e,a,w[29],k[1]); SUBROUND2(a,b,c,d,e,w[30],k[1]); SUBROUND2(e,a,b,c,d,w[31],k[1]); SUBROUND2(d,e,a,b,c,w[32],k[1]); SUBROUND2(c,d,e,a,b,w[33],k[1]); SUBROUND2(b,c,d,e,a,w[34],k[1]); SUBROUND2(a,b,c,d,e,w[35],k[1]); SUBROUND2(e,a,b,c,d,w[36],k[1]); SUBROUND2(d,e,a,b,c,w[37],k[1]); SUBROUND2(c,d,e,a,b,w[38],k[1]); SUBROUND2(b,c,d,e,a,w[39],k[1]); SUBROUND3(a,b,c,d,e,w[40],k[2]); SUBROUND3(e,a,b,c,d,w[41],k[2]); SUBROUND3(d,e,a,b,c,w[42],k[2]); SUBROUND3(c,d,e,a,b,w[43],k[2]); SUBROUND3(b,c,d,e,a,w[44],k[2]); SUBROUND3(a,b,c,d,e,w[45],k[2]); SUBROUND3(e,a,b,c,d,w[46],k[2]); SUBROUND3(d,e,a,b,c,w[47],k[2]); SUBROUND3(c,d,e,a,b,w[48],k[2]); SUBROUND3(b,c,d,e,a,w[49],k[2]); SUBROUND3(a,b,c,d,e,w[50],k[2]); SUBROUND3(e,a,b,c,d,w[51],k[2]); SUBROUND3(d,e,a,b,c,w[52],k[2]); SUBROUND3(c,d,e,a,b,w[53],k[2]); SUBROUND3(b,c,d,e,a,w[54],k[2]); SUBROUND3(a,b,c,d,e,w[55],k[2]); SUBROUND3(e,a,b,c,d,w[56],k[2]); SUBROUND3(d,e,a,b,c,w[57],k[2]); SUBROUND3(c,d,e,a,b,w[58],k[2]); SUBROUND3(b,c,d,e,a,w[59],k[2]); SUBROUND4(a,b,c,d,e,w[60],k[3]); SUBROUND4(e,a,b,c,d,w[61],k[3]); SUBROUND4(d,e,a,b,c,w[62],k[3]); SUBROUND4(c,d,e,a,b,w[63],k[3]); SUBROUND4(b,c,d,e,a,w[64],k[3]); SUBROUND4(a,b,c,d,e,w[65],k[3]); SUBROUND4(e,a,b,c,d,w[66],k[3]); SUBROUND4(d,e,a,b,c,w[67],k[3]); SUBROUND4(c,d,e,a,b,w[68],k[3]); SUBROUND4(b,c,d,e,a,w[69],k[3]); SUBROUND4(a,b,c,d,e,w[70],k[3]); SUBROUND4(e,a,b,c,d,w[71],k[3]); SUBROUND4(d,e,a,b,c,w[72],k[3]); SUBROUND4(c,d,e,a,b,w[73],k[3]); SUBROUND4(b,c,d,e,a,w[74],k[3]); SUBROUND4(a,b,c,d,e,w[75],k[3]); SUBROUND4(e,a,b,c,d,w[76],k[3]); SUBROUND4(d,e,a,b,c,w[77],k[3]); SUBROUND4(c,d,e,a,b,w[78],k[3]); SUBROUND4(b,c,d,e,a,w[79],k[3]); sp->h[0] += a; sp->h[1] += b; sp->h[2] += c; sp->h[3] += d; sp->h[4] += e; }
void ripemd256Process(ripemd256Param* mp) { register uint32_t la, lb, lc, ld; register uint32_t ra, rb, rc, rd; register uint32_t temp; register uint32_t* x; #ifdef WORDS_BIGENDIAN register byte t; #endif x = mp->data; #ifdef WORDS_BIGENDIAN t = 16; while (t--) { temp = swapu32(*x); *(x++) = temp; } x = mp->data; #endif la = mp->h[0]; lb = mp->h[1]; lc = mp->h[2]; ld = mp->h[3]; ra = mp->h[4]; rb = mp->h[5]; rc = mp->h[6]; rd = mp->h[7]; /* In theory OpenMP would allows us to do the 'left' and 'right' sections in parallel, * but in practice the overhead make the code much slower */ /* left round 1 */ LSR1(la, lb, lc, ld, x[ 0], 11); LSR1(ld, la, lb, lc, x[ 1], 14); LSR1(lc, ld, la, lb, x[ 2], 15); LSR1(lb, lc, ld, la, x[ 3], 12); LSR1(la, lb, lc, ld, x[ 4], 5); LSR1(ld, la, lb, lc, x[ 5], 8); LSR1(lc, ld, la, lb, x[ 6], 7); LSR1(lb, lc, ld, la, x[ 7], 9); LSR1(la, lb, lc, ld, x[ 8], 11); LSR1(ld, la, lb, lc, x[ 9], 13); LSR1(lc, ld, la, lb, x[10], 14); LSR1(lb, lc, ld, la, x[11], 15); LSR1(la, lb, lc, ld, x[12], 6); LSR1(ld, la, lb, lc, x[13], 7); LSR1(lc, ld, la, lb, x[14], 9); LSR1(lb, lc, ld, la, x[15], 8); /* right round 1 */ RSR1(ra, rb, rc, rd, x[ 5], 8); RSR1(rd, ra, rb, rc, x[14], 9); RSR1(rc, rd, ra, rb, x[ 7], 9); RSR1(rb, rc, rd, ra, x[ 0], 11); RSR1(ra, rb, rc, rd, x[ 9], 13); RSR1(rd, ra, rb, rc, x[ 2], 15); RSR1(rc, rd, ra, rb, x[11], 15); RSR1(rb, rc, rd, ra, x[ 4], 5); RSR1(ra, rb, rc, rd, x[13], 7); RSR1(rd, ra, rb, rc, x[ 6], 7); RSR1(rc, rd, ra, rb, x[15], 8); RSR1(rb, rc, rd, ra, x[ 8], 11); RSR1(ra, rb, rc, rd, x[ 1], 14); RSR1(rd, ra, rb, rc, x[10], 14); RSR1(rc, rd, ra, rb, x[ 3], 12); RSR1(rb, rc, rd, ra, x[12], 6); temp = la; la = ra; ra = temp; /* left round 2 */ LSR2(la, lb, lc, ld, x[ 7], 7); LSR2(ld, la, lb, lc, x[ 4], 6); LSR2(lc, ld, la, lb, x[13], 8); LSR2(lb, lc, ld, la, x[ 1], 13); LSR2(la, lb, lc, ld, x[10], 11); LSR2(ld, la, lb, lc, x[ 6], 9); LSR2(lc, ld, la, lb, x[15], 7); LSR2(lb, lc, ld, la, x[ 3], 15); LSR2(la, lb, lc, ld, x[12], 7); LSR2(ld, la, lb, lc, x[ 0], 12); LSR2(lc, ld, la, lb, x[ 9], 15); LSR2(lb, lc, ld, la, x[ 5], 9); LSR2(la, lb, lc, ld, x[ 2], 11); LSR2(ld, la, lb, lc, x[14], 7); LSR2(lc, ld, la, lb, x[11], 13); LSR2(lb, lc, ld, la, x[ 8], 12); /* right round 2 */ RSR2(ra, rb, rc, rd, x[ 6], 9); RSR2(rd, ra, rb, rc, x[11], 13); RSR2(rc, rd, ra, rb, x[ 3], 15); RSR2(rb, rc, rd, ra, x[ 7], 7); RSR2(ra, rb, rc, rd, x[ 0], 12); RSR2(rd, ra, rb, rc, x[13], 8); RSR2(rc, rd, ra, rb, x[ 5], 9); RSR2(rb, rc, rd, ra, x[10], 11); RSR2(ra, rb, rc, rd, x[14], 7); RSR2(rd, ra, rb, rc, x[15], 7); RSR2(rc, rd, ra, rb, x[ 8], 12); RSR2(rb, rc, rd, ra, x[12], 7); RSR2(ra, rb, rc, rd, x[ 4], 6); RSR2(rd, ra, rb, rc, x[ 9], 15); RSR2(rc, rd, ra, rb, x[ 1], 13); RSR2(rb, rc, rd, ra, x[ 2], 11); temp = lb; lb = rb; rb = temp; /* left round 3 */ LSR3(la, lb, lc, ld, x[ 3], 11); LSR3(ld, la, lb, lc, x[10], 13); LSR3(lc, ld, la, lb, x[14], 6); LSR3(lb, lc, ld, la, x[ 4], 7); LSR3(la, lb, lc, ld, x[ 9], 14); LSR3(ld, la, lb, lc, x[15], 9); LSR3(lc, ld, la, lb, x[ 8], 13); LSR3(lb, lc, ld, la, x[ 1], 15); LSR3(la, lb, lc, ld, x[ 2], 14); LSR3(ld, la, lb, lc, x[ 7], 8); LSR3(lc, ld, la, lb, x[ 0], 13); LSR3(lb, lc, ld, la, x[ 6], 6); LSR3(la, lb, lc, ld, x[13], 5); LSR3(ld, la, lb, lc, x[11], 12); LSR3(lc, ld, la, lb, x[ 5], 7); LSR3(lb, lc, ld, la, x[12], 5); /* right round 3 */ RSR3(ra, rb, rc, rd, x[15], 9); RSR3(rd, ra, rb, rc, x[ 5], 7); RSR3(rc, rd, ra, rb, x[ 1], 15); RSR3(rb, rc, rd, ra, x[ 3], 11); RSR3(ra, rb, rc, rd, x[ 7], 8); RSR3(rd, ra, rb, rc, x[14], 6); RSR3(rc, rd, ra, rb, x[ 6], 6); RSR3(rb, rc, rd, ra, x[ 9], 14); RSR3(ra, rb, rc, rd, x[11], 12); RSR3(rd, ra, rb, rc, x[ 8], 13); RSR3(rc, rd, ra, rb, x[12], 5); RSR3(rb, rc, rd, ra, x[ 2], 14); RSR3(ra, rb, rc, rd, x[10], 13); RSR3(rd, ra, rb, rc, x[ 0], 13); RSR3(rc, rd, ra, rb, x[ 4], 7); RSR3(rb, rc, rd, ra, x[13], 5); temp = lc; lc = rc; rc = temp; /* left round 4 */ LSR4(la, lb, lc, ld, x[ 1], 11); LSR4(ld, la, lb, lc, x[ 9], 12); LSR4(lc, ld, la, lb, x[11], 14); LSR4(lb, lc, ld, la, x[10], 15); LSR4(la, lb, lc, ld, x[ 0], 14); LSR4(ld, la, lb, lc, x[ 8], 15); LSR4(lc, ld, la, lb, x[12], 9); LSR4(lb, lc, ld, la, x[ 4], 8); LSR4(la, lb, lc, ld, x[13], 9); LSR4(ld, la, lb, lc, x[ 3], 14); LSR4(lc, ld, la, lb, x[ 7], 5); LSR4(lb, lc, ld, la, x[15], 6); LSR4(la, lb, lc, ld, x[14], 8); LSR4(ld, la, lb, lc, x[ 5], 6); LSR4(lc, ld, la, lb, x[ 6], 5); LSR4(lb, lc, ld, la, x[ 2], 12); /* right round 4 */ RSR4(ra, rb, rc, rd, x[ 8], 15); RSR4(rd, ra, rb, rc, x[ 6], 5); RSR4(rc, rd, ra, rb, x[ 4], 8); RSR4(rb, rc, rd, ra, x[ 1], 11); RSR4(ra, rb, rc, rd, x[ 3], 14); RSR4(rd, ra, rb, rc, x[11], 14); RSR4(rc, rd, ra, rb, x[15], 6); RSR4(rb, rc, rd, ra, x[ 0], 14); RSR4(ra, rb, rc, rd, x[ 5], 6); RSR4(rd, ra, rb, rc, x[12], 9); RSR4(rc, rd, ra, rb, x[ 2], 12); RSR4(rb, rc, rd, ra, x[13], 9); RSR4(ra, rb, rc, rd, x[ 9], 12); RSR4(rd, ra, rb, rc, x[ 7], 5); RSR4(rc, rd, ra, rb, x[10], 15); RSR4(rb, rc, rd, ra, x[14], 8); temp = ld; ld = rd; rd = temp; /* combine results */ mp->h[0] += la; mp->h[1] += lb; mp->h[2] += lc; mp->h[3] += ld; mp->h[4] += ra; mp->h[5] += rb; mp->h[6] += rc; mp->h[7] += rd; }
void md4Process(md4Param *mp) /*@modifies mp @*/ { uint32_t a, b, c, d; register uint32_t* w; #ifdef WORDS_BIGENDIAN register byte t; #endif w = mp->data; #ifdef WORDS_BIGENDIAN t = 16; while (t--) { register uint32_t temp = swapu32(*w); *(w++) = temp; } w = mp->data; #endif a = mp->h[0]; b = mp->h[1]; c = mp->h[2]; d = mp->h[3]; FF (a, b, c, d, w[ 0], 3); FF (d, a, b, c, w[ 1], 7); FF (c, d, a, b, w[ 2], 11); FF (b, c, d, a, w[ 3], 19); FF (a, b, c, d, w[ 4], 3); FF (d, a, b, c, w[ 5], 7); FF (c, d, a, b, w[ 6], 11); FF (b, c, d, a, w[ 7], 19); FF (a, b, c, d, w[ 8], 3); FF (d, a, b, c, w[ 9], 7); FF (c, d, a, b, w[10], 11); FF (b, c, d, a, w[11], 19); FF (a, b, c, d, w[12], 3); FF (d, a, b, c, w[13], 7); FF (c, d, a, b, w[14], 11); FF (b, c, d, a, w[15], 19); GG (a, b, c, d, w[ 0], 3); GG (d, a, b, c, w[ 4], 5); GG (c, d, a, b, w[ 8], 9); GG (b, c, d, a, w[12], 13); GG (a, b, c, d, w[ 1], 3); GG (d, a, b, c, w[ 5], 5); GG (c, d, a, b, w[ 9], 9); GG (b, c, d, a, w[13], 13); GG (a, b, c, d, w[ 2], 3); GG (d, a, b, c, w[ 6], 5); GG (c, d, a, b, w[10], 9); GG (b, c, d, a, w[14], 13); GG (a, b, c, d, w[ 3], 3); GG (d, a, b, c, w[ 7], 5); GG (c, d, a, b, w[11], 9); GG (b, c, d, a, w[15], 13); HH (a, b, c, d, w[ 0], 3); HH (d, a, b, c, w[ 8], 9); HH (c, d, a, b, w[ 4], 11); HH (b, c, d, a, w[12], 15); HH (a, b, c, d, w[ 2], 3); HH (d, a, b, c, w[10], 9); HH (c, d, a, b, w[ 6], 11); HH (b, c, d, a, w[14], 15); HH (a, b, c, d, w[ 1], 3); HH (d, a, b, c, w[ 9], 9); HH (c, d, a, b, w[ 5], 11); HH (b, c, d, a, w[13], 15); HH (a, b, c, d, w[ 3], 3); HH (d, a, b, c, w[11], 9); HH (c, d, a, b, w[ 7], 11); HH (b, c, d, a, w[15], 15); mp->h[0] += a; mp->h[1] += b; mp->h[2] += c; mp->h[3] += d; }