Example #1
0
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];
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
}