static void SHA3_transform()

in src/hash.c [398:458]


static void SHA3_transform(sha3 *sh)
{
    unsign64 C[5];
    unsign64 D[5];
    unsign64 B[5][5];

    for (int k=0; k<SHA3_ROUNDS; k++)
    {
        C[0]=sh->S[0][0]^sh->S[0][1]^sh->S[0][2]^sh->S[0][3]^sh->S[0][4];
        C[1]=sh->S[1][0]^sh->S[1][1]^sh->S[1][2]^sh->S[1][3]^sh->S[1][4];
        C[2]=sh->S[2][0]^sh->S[2][1]^sh->S[2][2]^sh->S[2][3]^sh->S[2][4];
        C[3]=sh->S[3][0]^sh->S[3][1]^sh->S[3][2]^sh->S[3][3]^sh->S[3][4];
        C[4]=sh->S[4][0]^sh->S[4][1]^sh->S[4][2]^sh->S[4][3]^sh->S[4][4];

        D[0]=C[4]^rotl(C[1],1);
        D[1]=C[0]^rotl(C[2],1);
        D[2]=C[1]^rotl(C[3],1);
        D[3]=C[2]^rotl(C[4],1);
        D[4]=C[3]^rotl(C[0],1);

        for (int i=0; i<5; i++)
            for (int j=0; j<5; j++)
                sh->S[i][j]^=D[i];  /* let the compiler unroll it! */

        B[0][0]=sh->S[0][0];
        B[1][3]=rotl(sh->S[0][1],36);
        B[2][1]=rotl(sh->S[0][2],3);
        B[3][4]=rotl(sh->S[0][3],41);
        B[4][2]=rotl(sh->S[0][4],18);

        B[0][2]=rotl(sh->S[1][0],1);
        B[1][0]=rotl(sh->S[1][1],44);
        B[2][3]=rotl(sh->S[1][2],10);
        B[3][1]=rotl(sh->S[1][3],45);
        B[4][4]=rotl(sh->S[1][4],2);

        B[0][4]=rotl(sh->S[2][0],62);
        B[1][2]=rotl(sh->S[2][1],6);
        B[2][0]=rotl(sh->S[2][2],43);
        B[3][3]=rotl(sh->S[2][3],15);
        B[4][1]=rotl(sh->S[2][4],61);

        B[0][1]=rotl(sh->S[3][0],28);
        B[1][4]=rotl(sh->S[3][1],55);
        B[2][2]=rotl(sh->S[3][2],25);
        B[3][0]=rotl(sh->S[3][3],21);
        B[4][3]=rotl(sh->S[3][4],56);

        B[0][3]=rotl(sh->S[4][0],27);
        B[1][1]=rotl(sh->S[4][1],20);
        B[2][4]=rotl(sh->S[4][2],39);
        B[3][2]=rotl(sh->S[4][3],8);
        B[4][0]=rotl(sh->S[4][4],14);

        for (int i=0; i<5; i++)
            for (int j=0; j<5; j++)
                sh->S[i][j]=B[i][j]^(~B[(i+1)%5][j]&B[(i+2)%5][j]);

        sh->S[0][0]^=RC[k];
    }
}