Esempio n. 1
0
void sha256_transf(sha256_ctx *ctx, const unsigned char *message, unsigned int block_nb) {
    uint32 w[64], wv[8], t1, t2;
    const unsigned char *sub_block;
    int i;
#ifndef UNROLL_LOOPS
    int j;
#endif
    for (i = 0; i < (int) block_nb; i++) {
        sub_block = message + (i << 6);
#ifndef UNROLL_LOOPS
    for (j = 0; j < 16; j++) {
        PACK32(&sub_block[j << 2], &w[j]);
    }

    for (j = 16; j < 64; j++) {
        SHA256_SCR(j);
    }

    for (j = 0; j < 8; j++) {
        wv[j] = ctx->h[j];
    }

    for (j = 0; j < 64; j++) {
        t1 = wv[7] + SHA256_F2(wv[4]) + CH(wv[4], wv[5], wv[6])
                + sha256_k[j] + w[j];
        t2 = SHA256_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]);
        wv[7] = wv[6];
        wv[6] = wv[5];
        wv[5] = wv[4];
        wv[4] = wv[3] + t1;
        wv[3] = wv[2];
        wv[2] = wv[1];
        wv[1] = wv[0];
        wv[0] = t1 + t2;
    }

    for (j = 0; j < 8; j++) {
        ctx->h[j] += wv[j];
    }
#else
    PACK32(&sub_block[ 0], &w[ 0]);
    PACK32(&sub_block[ 4], &w[ 1]);
    PACK32(&sub_block[ 8], &w[ 2]);
    PACK32(&sub_block[12], &w[ 3]);
    PACK32(&sub_block[16], &w[ 4]);
    PACK32(&sub_block[20], &w[ 5]);
    PACK32(&sub_block[24], &w[ 6]);
    PACK32(&sub_block[28], &w[ 7]);
    PACK32(&sub_block[32], &w[ 8]);
    PACK32(&sub_block[36], &w[ 9]);
    PACK32(&sub_block[40], &w[10]);
    PACK32(&sub_block[44], &w[11]);
    PACK32(&sub_block[48], &w[12]);
    PACK32(&sub_block[52], &w[13]);
    PACK32(&sub_block[56], &w[14]);
    PACK32(&sub_block[60], &w[15]);
    SHA256_SCR(16);
    SHA256_SCR(17);
    SHA256_SCR(18);
    SHA256_SCR(19);
    SHA256_SCR(20);
    SHA256_SCR(21);
    SHA256_SCR(22);
    SHA256_SCR(23);
    SHA256_SCR(24);
    SHA256_SCR(25);
    SHA256_SCR(26);
    SHA256_SCR(27);
    SHA256_SCR(28);
    SHA256_SCR(29);
    SHA256_SCR(30);
    SHA256_SCR(31);
    SHA256_SCR(32);
    SHA256_SCR(33);
    SHA256_SCR(34);
    SHA256_SCR(35);
    SHA256_SCR(36);
    SHA256_SCR(37);
    SHA256_SCR(38);
    SHA256_SCR(39);
    SHA256_SCR(40);
    SHA256_SCR(41);
    SHA256_SCR(42);
    SHA256_SCR(43);
    SHA256_SCR(44);
    SHA256_SCR(45);
    SHA256_SCR(46);
    SHA256_SCR(47);
    SHA256_SCR(48);
    SHA256_SCR(49);
    SHA256_SCR(50);
    SHA256_SCR(51);
    SHA256_SCR(52);
    SHA256_SCR(53);
    SHA256_SCR(54);
    SHA256_SCR(55);
    SHA256_SCR(56);
    SHA256_SCR(57);
    SHA256_SCR(58);
    SHA256_SCR(59);
    SHA256_SCR(60);
    SHA256_SCR(61);
    SHA256_SCR(62);
    SHA256_SCR(63);
    wv[0] = ctx->h[0];
    wv[1] = ctx->h[1];
    wv[2] = ctx->h[2];
    wv[3] = ctx->h[3];
    wv[4] = ctx->h[4];
    wv[5] = ctx->h[5];
    wv[6] = ctx->h[6];
    wv[7] = ctx->h[7];
    SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 0);
    SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 1);
    SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 2);
    SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 3);
    SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 4);
    SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 5);
    SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 6);
    SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 7);
    SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 8);
    SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 9);
    SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 10);
    SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 11);
    SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 12);
    SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 13);
    SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 14);
    SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 15);
    SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 16);
    SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 17);
    SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 18);
    SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 19);
    SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 20);
    SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 21);
    SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 22);
    SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 23);
    SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 24);
    SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 25);
    SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 26);
    SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 27);
    SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 28);
    SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 29);
    SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 30);
    SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 31);
    SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 32);
    SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 33);
    SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 34);
    SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 35);
    SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 36);
    SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 37);
    SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 38);
    SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 39);
    SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 40);
    SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 41);
    SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 42);
    SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 43);
    SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 44);
    SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 45);
    SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 46);
    SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 47);
    SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 48);
    SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 49);
    SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 50);
    SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 51);
    SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 52);
    SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 53);
    SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 54);
    SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 55);
    SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 56);
    SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 57);
    SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 58);
    SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 59);
    SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 60);
    SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 61);
    SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 62);
    SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 63);
    ctx->h[0] += wv[0];
    ctx->h[1] += wv[1];
    ctx->h[2] += wv[2];
    ctx->h[3] += wv[3];
    ctx->h[4] += wv[4];
    ctx->h[5] += wv[5];
    ctx->h[6] += wv[6];
    ctx->h[7] += wv[7];
#endif
    }
}
Esempio n. 2
0
void sha512_transf(sha512_ctx *ctx, const unsigned char *message,
                   unsigned int block_nb)
{
    uint64 w[80];
    uint64 wv[8];
    uint64 t1, t2;
    const unsigned char *sub_block;
    int i, j;

    for (i = 0; i < (int) block_nb; i++) {
        sub_block = message + (i << 7);

#ifndef UNROLL_LOOPS
        for (j = 0; j < 16; j++) {
            PACK64(&sub_block[j << 3], &w[j]);
        }

        for (j = 16; j < 80; j++) {
            SHA512_SCR(j);
        }

        for (j = 0; j < 8; j++) {
            wv[j] = ctx->h[j];
        }

        for (j = 0; j < 80; j++) {
            t1 = wv[7] + SHA512_F2(wv[4]) + CH(wv[4], wv[5], wv[6])
                + sha512_k[j] + w[j];
            t2 = SHA512_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]);
            wv[7] = wv[6];
            wv[6] = wv[5];
            wv[5] = wv[4];
            wv[4] = wv[3] + t1;
            wv[3] = wv[2];
            wv[2] = wv[1];
            wv[1] = wv[0];
            wv[0] = t1 + t2;
        }

        for (j = 0; j < 8; j++) {
            ctx->h[j] += wv[j];
        }
#else
        PACK64(&sub_block[  0], &w[ 0]); PACK64(&sub_block[  8], &w[ 1]);
        PACK64(&sub_block[ 16], &w[ 2]); PACK64(&sub_block[ 24], &w[ 3]);
        PACK64(&sub_block[ 32], &w[ 4]); PACK64(&sub_block[ 40], &w[ 5]);
        PACK64(&sub_block[ 48], &w[ 6]); PACK64(&sub_block[ 56], &w[ 7]);
        PACK64(&sub_block[ 64], &w[ 8]); PACK64(&sub_block[ 72], &w[ 9]);
        PACK64(&sub_block[ 80], &w[10]); PACK64(&sub_block[ 88], &w[11]);
        PACK64(&sub_block[ 96], &w[12]); PACK64(&sub_block[104], &w[13]);
        PACK64(&sub_block[112], &w[14]); PACK64(&sub_block[120], &w[15]);


        SHA512_SCR(16); SHA512_SCR(17); SHA512_SCR(18); SHA512_SCR(19);
        SHA512_SCR(20); SHA512_SCR(21); SHA512_SCR(22); SHA512_SCR(23);
        SHA512_SCR(24); SHA512_SCR(25); SHA512_SCR(26); SHA512_SCR(27);
        SHA512_SCR(28); SHA512_SCR(29); SHA512_SCR(30); SHA512_SCR(31);
        SHA512_SCR(32); SHA512_SCR(33); SHA512_SCR(34); SHA512_SCR(35);
        SHA512_SCR(36); SHA512_SCR(37); SHA512_SCR(38); SHA512_SCR(39);
        SHA512_SCR(40); SHA512_SCR(41); SHA512_SCR(42); SHA512_SCR(43);
        SHA512_SCR(44); SHA512_SCR(45); SHA512_SCR(46); SHA512_SCR(47);
        SHA512_SCR(48); SHA512_SCR(49); SHA512_SCR(50); SHA512_SCR(51);
        SHA512_SCR(52); SHA512_SCR(53); SHA512_SCR(54); SHA512_SCR(55);
        SHA512_SCR(56); SHA512_SCR(57); SHA512_SCR(58); SHA512_SCR(59);
        SHA512_SCR(60); SHA512_SCR(61); SHA512_SCR(62); SHA512_SCR(63);
        SHA512_SCR(64); SHA512_SCR(65); SHA512_SCR(66); SHA512_SCR(67);
        SHA512_SCR(68); SHA512_SCR(69); SHA512_SCR(70); SHA512_SCR(71);
        SHA512_SCR(72); SHA512_SCR(73); SHA512_SCR(74); SHA512_SCR(75);
        SHA512_SCR(76); SHA512_SCR(77); SHA512_SCR(78); SHA512_SCR(79);

        wv[0] = ctx->h[0]; wv[1] = ctx->h[1];
        wv[2] = ctx->h[2]; wv[3] = ctx->h[3];
        wv[4] = ctx->h[4]; wv[5] = ctx->h[5];
        wv[6] = ctx->h[6]; wv[7] = ctx->h[7];

        j = 0;

        do {
            SHA512_EXP(0,1,2,3,4,5,6,7,j); j++;
            SHA512_EXP(7,0,1,2,3,4,5,6,j); j++;
            SHA512_EXP(6,7,0,1,2,3,4,5,j); j++;
            SHA512_EXP(5,6,7,0,1,2,3,4,j); j++;
            SHA512_EXP(4,5,6,7,0,1,2,3,j); j++;
            SHA512_EXP(3,4,5,6,7,0,1,2,j); j++;
            SHA512_EXP(2,3,4,5,6,7,0,1,j); j++;
            SHA512_EXP(1,2,3,4,5,6,7,0,j); j++;
        } while (j < 80);

        ctx->h[0] += wv[0]; ctx->h[1] += wv[1];
        ctx->h[2] += wv[2]; ctx->h[3] += wv[3];
        ctx->h[4] += wv[4]; ctx->h[5] += wv[5];
        ctx->h[6] += wv[6]; ctx->h[7] += wv[7];
#endif /* !UNROLL_LOOPS */
    }
}