Пример #1
0
static void DVBCSA_INLINE
dvbcsa_bs_stream_sbox3(dvbcsa_bs_word_t fa, dvbcsa_bs_word_t fb,
		       dvbcsa_bs_word_t fc, dvbcsa_bs_word_t fd,
		       dvbcsa_bs_word_t fe,
		       dvbcsa_bs_word_t *sa, dvbcsa_bs_word_t *sb)
{
  dvbcsa_bs_word_t tmp0, tmp1, tmp2;

  tmp0 = BS_XOR (fa, BS_XOR (fb, BS_XOR (BS_AND (fc, BS_OR (fa, fd)), fd)));
  tmp1 = BS_XOR (BS_AND (fa, fc), BS_OR (BS_XOR (fa, fd), BS_XOR (BS_OR (fb, fc), BS_NOT (fd))));
  tmp2 = BS_XOR (fa, BS_XOR (BS_AND (BS_XOR (fb, fc), fd), fc));

  *sa = BS_XOR (tmp0, BS_AND (BS_NOT (fe), tmp1));
  *sb = BS_XOR (tmp2, fe);
}
Пример #2
0
static AYCW_INLINE void aycw_bs_stream_sbox2(dvbcsa_bs_word_t *fa, dvbcsa_bs_word_t *fb,
               dvbcsa_bs_word_t *fc, dvbcsa_bs_word_t *fd,
               dvbcsa_bs_word_t *fe,
               dvbcsa_bs_word_t *sa, dvbcsa_bs_word_t *sb)
{
  dvbcsa_bs_word_t tmp0, tmp1, tmp2, tmp3;

  tmp0 = BS_XOR (*fa, BS_XOR (BS_AND (*fb, BS_OR (*fc, *fd)), BS_XOR (*fc, BS_NOT (*fd))));
  tmp1 = BS_OR (BS_AND (*fa, BS_XOR (*fb, *fd)), BS_AND (BS_OR (*fa, *fb), *fc));
  tmp2 = BS_XOR (BS_AND (*fb, *fd), BS_OR (BS_AND (*fa, *fd), BS_XOR (*fb, BS_NOT (*fc))));
  tmp3 = BS_OR (BS_AND (*fa, *fd), BS_XOR (*fa, BS_XOR (*fb, BS_AND (*fc, *fd))));

  *sa = BS_XOR (tmp0, BS_AND (*fe, tmp1));
  *sb = BS_XOR (tmp2, BS_AND (*fe, tmp3));
}
Пример #3
0
/****** execute round **************/
AYCW_INLINE void aycw__vRound(aycw_tstPQXYZ     *stPQXYZ,
                              aycw_tstCDEF      *stCDEF ,
                              aycw_tstRegister  *stRegister,
                              dvbcsa_bs_word_t  *BS_Streambit0,
                              dvbcsa_bs_word_t  *BS_Streambit1)
{

    uint8 k;
    dvbcsa_bs_word_t tmp0,tmp4,tmp1,tmp3;
    uint8 b;
    dvbcsa_bs_word_t  BS_TMP_B[5];
    dvbcsa_bs_word_t  BS_TMP_B_Result[4];
    dvbcsa_bs_word_t  BS_Bout[4];
    dvbcsa_bs_word_t  BS_Enew[4];


    aycw__ShiftRegisterLeft( stRegister->A_BS, 4, 80);
    for (k = 0; k < 4; k++)
    {
        stRegister->A_BS[k] = stRegister->A_BS[k+40]; 
        BS_XOREQ(stRegister->A_BS[k], stPQXYZ->BS_X[k]);

    }

    for (k = 0; k < 4; k++)
    {

        //A: 0x0000000bb6510468 
        //B: 0x00000006baf6a610
    //  BS_ConverToDoubleArray(&tmpDoubleArray,B_BS,40);
        BS_TMP_B[k] = BS_XOR(stRegister->B_BS[k+6*4], stRegister->B_BS[k+9*4]);
    //  BS_ConverToByteArray(&tmpByteArray,BS_TMP_B,4);
        BS_TMP_B[k] = BS_XOR(BS_TMP_B[k], stPQXYZ->BS_Y[k]);
    //  BS_ConverToIntArray(tmpIntArray,B_BS,40);
#if Init    
        BS_TMP_B[k] = BS_TMP_B[k] ^ A_tBITVALUE(&u32IV, 0, k);   
        BS_ConverToIntArray(tmpIntArray,B_BS,40);
#endif
        BS_TMP_B_Result[k]  = BS_AND(BS_TMP_B[k], BS_NOT(stPQXYZ->BS_P)); //Die nicht zu rotierenden Daten zunächst zwischenspeichern.

    //  BS_ConverToIntArray(tmpIntArray,B_BS,40);
        //B: 0x00000006baf6a617

    }
    for (k = 4; k > 0; k--)
    {
        BS_TMP_B[k] = BS_TMP_B[k-1];
    }
    BS_TMP_B[0] = BS_TMP_B[4];

    aycw__ShiftRegisterLeft( stRegister->B_BS, 4, 80);

    for ( k = 0; k < 4; k++)
    {
        stRegister->B_BS[k] = BS_OR(BS_AND(BS_TMP_B[k], stPQXYZ->BS_P), BS_TMP_B_Result[k]);
    }
//  BS_ConverToIntArray(tmpIntArray,B_BS,40);

//  BS_ConverToDoubleArray(&tmpDoubleArray,B_BS,40);

    /********** execute combiner calc **********/
    /* calc of bout*/
    /*
    Bout 3 := b2,0  b5,1  b6,2  b8,3
    Bout 2 := b5,0  b7,1  b2,3  b3,2
    Bout 1 := b4,3  b7,2  b3,0  b4,1
    Bout 0 := b8,2  b5,3  b2,1  b7,0
    */
    /*12 25 30 37*/
    /*    10000000 01000010000000000001000000000000 */
    /*15 18 24 33*/
    /*   00000010 00000001000001001000000000000000 */
    /*16 21 23 34*/
    /*  00000100 00000000101000010000000000000000 */
    /*13 27 32 38*/
    /* 01000001 00001000000000000010000000000000 */

    /*8  21  26  35*/
    /*extra_B[3] = BS_XOR (BS_XOR (BS_XOR (B[2][0], B[5][1]), B[6][2]), B[8][3]);
    extra_B[2] = BS_XOR (BS_XOR (BS_XOR (B[5][0], B[7][1]), B[2][3]), B[3][2]);
    extra_B[1] = BS_XOR (BS_XOR (BS_XOR (B[4][3], B[7][2]), B[3][0]), B[4][1]);
    extra_B[0] = BS_XOR (BS_XOR (BS_XOR (B[8][2], B[5][3]), B[2][1]), B[7][0]);*/
/*
#define shiftB 4
    BS_Bout[3] = stRegister->B_BS[2*4 + 0 + shiftB ] ^ stRegister->B_BS[5*4 + 1 + shiftB ]  ^ stRegister->B_BS[6*4 + 2 + shiftB ] ^ stRegister->B_BS[8*4 + 3  + shiftB ] ;
    BS_Bout[2] = stRegister->B_BS[5*4 + 0 + shiftB ] ^ stRegister->B_BS[7*4 + 1 + shiftB ]  ^ stRegister->B_BS[2*4 + 3 + shiftB ] ^ stRegister->B_BS[3*4 + 2  + shiftB ] ;
    BS_Bout[1] = stRegister->B_BS[4*4 + 3 + shiftB ] ^ stRegister->B_BS[7*4 + 2 + shiftB ]  ^ stRegister->B_BS[3*4 + 0 + shiftB ] ^ stRegister->B_BS[4*4 + 1  + shiftB ] ;
    BS_Bout[0] = stRegister->B_BS[8*4 + 2 + shiftB ] ^ stRegister->B_BS[5*4 + 3 + shiftB ]  ^ stRegister->B_BS[2*4 + 1 + shiftB ] ^ stRegister->B_BS[7*4 + 0  + shiftB ] ;
*/
    BS_Bout[3] = BS_XOR(BS_XOR(stRegister->B_BS[12], stRegister->B_BS[25]), BS_XOR(stRegister->B_BS[30], stRegister->B_BS[39]));
    BS_Bout[2] = BS_XOR(BS_XOR(stRegister->B_BS[24], stRegister->B_BS[33]), BS_XOR(stRegister->B_BS[15], stRegister->B_BS[18]));
    BS_Bout[1] = BS_XOR(BS_XOR(stRegister->B_BS[23], stRegister->B_BS[34]), BS_XOR(stRegister->B_BS[16], stRegister->B_BS[21]));
    BS_Bout[0] = BS_XOR(BS_XOR(stRegister->B_BS[38], stRegister->B_BS[27]), BS_XOR(stRegister->B_BS[13], stRegister->B_BS[32]));

    /*
    Bout[3] = B_BS[1*4 + 0 ] ^ B_BS[4*4 + 1 ]  ^ B_BS[5*4 + 2 ] ^ B_BS[7*4 + 3  ] ;
    Bout[2] = B_BS[4*4 + 0 ] ^ B_BS[6*4 + 1 ]  ^ B_BS[1*4 + 3 ] ^ B_BS[2*4 + 2  ] ;
    Bout[1] = B_BS[3*4 + 3 ] ^ B_BS[6*4 + 2 ]  ^ B_BS[2*4 + 0 ] ^ B_BS[3*4 + 1  ] ;
    Bout[0] = B_BS[7*4 + 2 ] ^ B_BS[4*4 + 3 ]  ^ B_BS[1*4 + 1 ] ^ B_BS[6*4 + 0  ] ;
    */


    /* calc of D */
    for (k = 0; k < 4; k++)
    {
        /*   use old E????*/
        stCDEF->BS_D[k] = BS_XOR(BS_XOR(BS_Bout[k], stCDEF->BS_E [k]), stPQXYZ->BS_Z[k]);
    //  BS_ConverToByteArray(&tmpByteArray,BS_E,4);
    //  BS_ConverToByteArray(&tmpByteArray,BS_Z,4);
    }
//  BS_ConverToByteArray(&tmpByteArray,BS_D,4);

    for (b = 0; b < 4; b++)
        BS_Enew[b] = stCDEF->BS_F[b];

    tmp0 = BS_XOR (stPQXYZ->BS_Z[0], stCDEF->BS_E[0]);
    tmp1 = BS_AND (stPQXYZ->BS_Z[0], stCDEF->BS_E[0]);
    stCDEF->BS_F[0] = BS_XOR (stCDEF->BS_E[0], BS_AND (stPQXYZ->BS_Q, BS_XOR (stPQXYZ->BS_Z[0], stCDEF->BS_C)));
    tmp3 = BS_AND (tmp0, stCDEF->BS_C);
    tmp4 = BS_OR (tmp1, tmp3);

    tmp0 = BS_XOR (stPQXYZ->BS_Z[1], stCDEF->BS_E[1]);
    tmp1 = BS_AND (stPQXYZ->BS_Z[1], stCDEF->BS_E[1]);
    stCDEF->BS_F[1] = BS_XOR (stCDEF->BS_E[1], BS_AND (stPQXYZ->BS_Q, BS_XOR (stPQXYZ->BS_Z[1], tmp4)));
    tmp3 = BS_AND (tmp0, tmp4);
    tmp4 = BS_OR (tmp1, tmp3);

    tmp0 = BS_XOR (stPQXYZ->BS_Z[2], stCDEF->BS_E[2]);
    tmp1 = BS_AND (stPQXYZ->BS_Z[2], stCDEF->BS_E[2]);
    stCDEF->BS_F[2] = BS_XOR (stCDEF->BS_E[2], BS_AND (stPQXYZ->BS_Q, BS_XOR (stPQXYZ->BS_Z[2], tmp4)));
    tmp3 = BS_AND (tmp0, tmp4);
    tmp4 = BS_OR (tmp1, tmp3);

    tmp0 = BS_XOR (stPQXYZ->BS_Z[3], stCDEF->BS_E[3]);
    tmp1 = BS_AND (stPQXYZ->BS_Z[3], stCDEF->BS_E[3]);
    stCDEF->BS_F[3] = BS_XOR (stCDEF->BS_E[3], BS_AND (stPQXYZ->BS_Q, BS_XOR (stPQXYZ->BS_Z[3], tmp4)));
    tmp3 = BS_AND (tmp0, tmp4);
    stCDEF->BS_C = BS_XOR (stCDEF->BS_C, BS_AND (stPQXYZ->BS_Q, BS_XOR (BS_OR (tmp1, tmp3), stCDEF->BS_C)));    // ultimate carry

    for (b = 0; b < 4; b++)
        stCDEF->BS_E[b] = BS_Enew[b];

    aycw__vCaculatePQXYZ(stRegister->A_BS, stPQXYZ);

    /* calc stream bit */
    *BS_Streambit0 = BS_XOR(stCDEF->BS_D[0],  stCDEF->BS_D[1]);
    *BS_Streambit1 = BS_XOR(stCDEF->BS_D[2],  stCDEF->BS_D[3]);

}
Пример #4
0
/****** execute init round **************/
AYCW_INLINE void aycw__vInitRound(uint8 j, uint8 u8Byte,
                                  aycw_tstPQXYZ * stPQXYZ ,
                                  aycw_tstCDEF *stCDEF, 
                                  aycw_tstRegister *stRegister,
                                  dvbcsa_bs_word_t *bs_data_sb0)
{

    uint8 k;
    dvbcsa_bs_word_t /*tmp,*/tmp0,tmp4,tmp1,tmp3;
    uint8 b;
    /*uint8 u32IV;*/
    dvbcsa_bs_word_t  BS_TMP_B[5];
    dvbcsa_bs_word_t  BS_TMP_B_Result[4];
    dvbcsa_bs_word_t  BS_Bout[4];
    dvbcsa_bs_word_t  BS_Enew[4];
/*
    if (j & 0x1) // all odd
    {
        u32IV = (iv >> 4 | (iv << 4));
    }
    else
    {
        u32IV = iv;
    }
*/
    aycw__ShiftRegisterLeft( stRegister->A_BS, 4, 44);
    for (k = 0; k < 4; k++)
    {
        stRegister->A_BS[k] = stRegister->A_BS[k+40]; 
        BS_XOREQ(stRegister->A_BS[k],stPQXYZ->BS_X[k]);
        BS_XOREQ(stRegister->A_BS[k],stCDEF->BS_D[k]);              /* data, byte, bit */
        BS_XOREQ(stRegister->A_BS[k],( (j & 0x1)?bs_data_sb0[k+u8Byte*8]:bs_data_sb0[k+4+u8Byte*8]));
    }

    for (k = 0; k < 4; k++)
    {

        BS_TMP_B[k] = BS_XOR(stRegister->B_BS[k+6*4], stRegister->B_BS[k+9*4]);
        BS_TMP_B[k] = BS_XOR(BS_TMP_B[k], stPQXYZ->BS_Y[k]);

        // OPTIMIZEME: optimizeable by using the upper A_tBITVALUE calculation
        /*tmp = (j & 0x1)?bs_data_sb0[k+4+u8Byte*8]:bs_data_sb0[k+u8Byte*8];
        tmp0 = aycw__BitExpandOfByteToBsWord(&u32IV, 0, k); 
        if (tmp0 != tmp)
            return 0;*/
        BS_TMP_B[k] = BS_XOR(BS_TMP_B[k], ( (j & 0x1)?bs_data_sb0[k+4+u8Byte*8]:bs_data_sb0[k+u8Byte*8]));

        BS_TMP_B_Result[k]  = BS_AND(BS_TMP_B[k], BS_NOT(stPQXYZ->BS_P)); //Die nicht zu rotierenden Daten zunächst zwischenspeichern.

    }
    /* yet rotate B */
    /* OPTIMIZEME: write into B directly?? */
    for (k = 4; k > 0; k--)
    {
        BS_TMP_B[k] = BS_TMP_B[k-1];
    }
    BS_TMP_B[0] = BS_TMP_B[4];

    /* B must not be moved by 4 before handling is finished */
    aycw__ShiftRegisterLeft(stRegister->B_BS, 4, 44);

    /* now write the result, both rotated and unrotated */
    for ( k = 0; k < 4; k++)
    {             // rotated         //not rotated
        stRegister->B_BS[k] = BS_OR(BS_AND(BS_TMP_B[k], stPQXYZ->BS_P), BS_TMP_B_Result[k]);
    }

    /********** Combiner calculation **********/
    /* calc bout
    Bout 3 := b2,0  b5,1  b6,2  b8,3
    Bout 2 := b5,0  b7,1  b2,3  b3,2
    Bout 1 := b4,3  b7,2  b3,0  b4,1
    Bout 0 := b8,2  b5,3  b2,1  b7,0
    */
    /*
#define shiftB 4
    BS_Bout[3] = stRegister->B_BS[2*4 + 0 + shiftB ] ^ stRegister->B_BS[5*4 + 1 + shiftB ]  ^ stRegister->B_BS[6*4 + 2 + shiftB ] ^ stRegister->B_BS[8*4 + 3  + shiftB ] ;
    BS_Bout[2] = stRegister->B_BS[5*4 + 0 + shiftB ] ^ stRegister->B_BS[7*4 + 1 + shiftB ]  ^ stRegister->B_BS[2*4 + 3 + shiftB ] ^ stRegister->B_BS[3*4 + 2  + shiftB ] ;
    BS_Bout[1] = stRegister->B_BS[4*4 + 3 + shiftB ] ^ stRegister->B_BS[7*4 + 2 + shiftB ]  ^ stRegister->B_BS[3*4 + 0 + shiftB ] ^ stRegister->B_BS[4*4 + 1  + shiftB ] ;
    BS_Bout[0] = stRegister->B_BS[8*4 + 2 + shiftB ] ^ stRegister->B_BS[5*4 + 3 + shiftB ]  ^ stRegister->B_BS[2*4 + 1 + shiftB ] ^ stRegister->B_BS[7*4 + 0  + shiftB ] ;

*/
    BS_Bout[3] = BS_XOR(BS_XOR(stRegister->B_BS[12], stRegister->B_BS[25]),  BS_XOR(stRegister->B_BS[30], stRegister->B_BS[39]));
    BS_Bout[2] = BS_XOR(BS_XOR(stRegister->B_BS[24], stRegister->B_BS[33]),  BS_XOR(stRegister->B_BS[15], stRegister->B_BS[18]));
    BS_Bout[1] = BS_XOR(BS_XOR(stRegister->B_BS[23], stRegister->B_BS[34]),  BS_XOR(stRegister->B_BS[16], stRegister->B_BS[21]));
    BS_Bout[0] = BS_XOR(BS_XOR(stRegister->B_BS[38], stRegister->B_BS[27]),  BS_XOR(stRegister->B_BS[13], stRegister->B_BS[32]));

    /* calc D */
    for (k = 0; k < 4; k++)
    {
        stCDEF->BS_D[k] = BS_XOR(BS_XOR(BS_Bout[k], stCDEF->BS_E[k]), stPQXYZ->BS_Z[k]);
    }


    for (b = 0; b < 4; b++)
        BS_Enew[b] = stCDEF->BS_F[b];

    tmp0 = BS_XOR (stPQXYZ->BS_Z[0], stCDEF->BS_E[0]);
    tmp1 = BS_AND (stPQXYZ->BS_Z[0], stCDEF->BS_E[0]);
    stCDEF->BS_F[0] = BS_XOR (stCDEF->BS_E[0], BS_AND (stPQXYZ->BS_Q, BS_XOR (stPQXYZ->BS_Z[0], stCDEF->BS_C)));
    tmp3 = BS_AND (tmp0, stCDEF->BS_C);
    tmp4 = BS_OR (tmp1, tmp3);

    tmp0 = BS_XOR (stPQXYZ->BS_Z[1], stCDEF->BS_E[1]);
    tmp1 = BS_AND (stPQXYZ->BS_Z[1], stCDEF->BS_E[1]);
    stCDEF->BS_F[1] = BS_XOR (stCDEF->BS_E[1], BS_AND (stPQXYZ->BS_Q, BS_XOR (stPQXYZ->BS_Z[1], tmp4)));
    tmp3 = BS_AND (tmp0, tmp4);
    tmp4 = BS_OR (tmp1, tmp3);

    tmp0 = BS_XOR (stPQXYZ->BS_Z[2], stCDEF->BS_E[2]);
    tmp1 = BS_AND (stPQXYZ->BS_Z[2], stCDEF->BS_E[2]);
    stCDEF->BS_F[2] = BS_XOR (stCDEF->BS_E[2], BS_AND (stPQXYZ->BS_Q, BS_XOR (stPQXYZ->BS_Z[2], tmp4)));
    tmp3 = BS_AND (tmp0, tmp4);
    tmp4 = BS_OR (tmp1, tmp3);

    tmp0 = BS_XOR (stPQXYZ->BS_Z[3], stCDEF->BS_E[3]);
    tmp1 = BS_AND (stPQXYZ->BS_Z[3], stCDEF->BS_E[3]);
    stCDEF->BS_F[3] = BS_XOR (stCDEF->BS_E[3], BS_AND (stPQXYZ->BS_Q, BS_XOR (stPQXYZ->BS_Z[3], tmp4)));
    tmp3 = BS_AND (tmp0, tmp4);
    stCDEF->BS_C = BS_XOR (stCDEF->BS_C, BS_AND (stPQXYZ->BS_Q, BS_XOR (BS_OR (tmp1, tmp3), stCDEF->BS_C)));    // ultimate carry

    for (b = 0; b < 4; b++)
        stCDEF->BS_E[b] = BS_Enew[b];

    aycw__vCaculatePQXYZ(stRegister->A_BS, stPQXYZ);

}