AVAES *av_aes_init(uint8_t *key, int key_bits, int decrypt) {

    AVAES *a;

    int i, j, t, rconpointer = 0;

    uint8_t tk[8][4];

    int KC= key_bits>>5;

    int rounds= KC + 6;

    uint8_t  log8[256];

    uint8_t alog8[512];



    if(!sbox[255]){

        j=1;

        for(i=0; i<255; i++){

            alog8[i]=

            alog8[i+255]= j;

            log8[j]= i;

            j^= j+j;

            if(j>255) j^= 0x11B;

        }

        for(i=0; i<256; i++){

            j= i ? alog8[255-log8[i]] : 0;

            j ^= (j<<1) ^ (j<<2) ^ (j<<3) ^ (j<<4);

            j = (j ^ (j>>8) ^ 99) & 255;

            inv_sbox[j]= i;

            sbox    [i]= j;

        }

        init_multbl2(dec_multbl[0], (int[4]){0xe, 0x9, 0xd, 0xb}, log8, alog8, inv_sbox);

        init_multbl2(enc_multbl[0], (int[4]){0x2, 0x1, 0x1, 0x3}, log8, alog8, sbox);

    }



    if(key_bits!=128 && key_bits!=192 && key_bits!=256)

        return NULL;



    a= av_malloc(sizeof(AVAES));

    a->rounds= rounds;



    memcpy(tk, key, KC*4);



    for(t= 0; t < (rounds+1)*4;) {

        memcpy(a->round_key[0][t], tk, KC*4);

        t+= KC;



        for(i = 0; i < 4; i++)

            tk[0][i] ^= sbox[tk[KC-1][(i+1)&3]];

        tk[0][0] ^= rcon[rconpointer++];



        for(j = 1; j < KC; j++){

            if(KC != 8 || j != KC>>1)

                for(i = 0; i < 4; i++) tk[j][i] ^=      tk[j-1][i];

            else

                for(i = 0; i < 4; i++) tk[j][i] ^= sbox[tk[j-1][i]];

        }

    }



    if(decrypt){

        for(i=1; i<rounds; i++){

            for(j=0; j<16; j++)

                a->round_key[i][0][j]= sbox[a->round_key[i][0][j]];

            mix(a->round_key[i], dec_multbl);

        }

    }else{

        for(i=0; i<(rounds+1)>>1; i++){

            for(j=0; j<16; j++)

                FFSWAP(int, a->round_key[i][0][j], a->round_key[rounds-i][0][j]);

        }

    }



    return a;

}

AVAES *av_aes_init(uint8_t *key, int key_bits, int decrypt) {

    AVAES *a;

    int i, j, t, rconpointer = 0;

    uint8_t tk[8][4];

    int KC= key_bits>>5;

    int rounds= KC + 6;

    uint8_t  log8[256];

    uint8_t alog8[512];



    if(!sbox[255]){

        j=1;

        for(i=0; i<255; i++){

            alog8[i]=

            alog8[i+255]= j;

            log8[j]= i;

            j^= j+j;

            if(j>255) j^= 0x11B;

        }

        for(i=0; i<256; i++){

            j= i ? alog8[255-log8[i]] : 0;

            j ^= (j<<1) ^ (j<<2) ^ (j<<3) ^ (j<<4);

            j = (j ^ (j>>8) ^ 99) & 255;

            inv_sbox[j]= i;

            sbox    [i]= j;

        }

        init_multbl2(dec_multbl[0], (int[4]){0xe, 0x9, 0xd, 0xb}, log8, alog8, inv_sbox);

        init_multbl2(enc_multbl[0], (int[4]){0x2, 0x1, 0x1, 0x3}, log8, alog8, sbox);

    }



    if(key_bits!=128 && key_bits!=192 && key_bits!=256)

        return NULL;



    a= av_malloc(sizeof(AVAES));

    a->rounds= rounds;



    memcpy(tk, key, KC*4);



    for(t= 0; t < (rounds+1)*4;) {

        memcpy(a->round_key[0][t], tk, KC*4);

        t+= KC;



        for(i = 0; i < 4; i++)

            tk[0][i] ^= sbox[tk[KC-1][(i+1)&3]];

        tk[0][0] ^= rcon[rconpointer++];



        for(j = 1; j < KC; j++){

            if(KC != 8 || j != KC>>1)

                for(i = 0; i < 4; i++) tk[j][i] ^=      tk[j-1][i];

            else

                for(i = 0; i < 4; i++) tk[j][i] ^= sbox[tk[j-1][i]];

        }

    }



    if(decrypt){

        for(i=1; i<rounds; i++){

            for(j=0; j<16; j++)

                a->round_key[i][0][j]= sbox[a->round_key[i][0][j]];

            mix(a->round_key[i], dec_multbl);

        }

    }else{

        for(i=0; i<(rounds+1)>>1; i++){

            for(j=0; j<16; j++)

                FFSWAP(int, a->round_key[i][0][j], a->round_key[rounds-i][0][j]);

        }

    }



    return a;

}

AVAES *FUNC_0(uint8_t *key, int key_bits, int decrypt) {

    AVAES *a;

    int VAR_0, VAR_1, VAR_2, VAR_3 = 0;

    uint8_t tk[8][4];

    int VAR_4= key_bits>>5;

    int VAR_5= VAR_4 + 6;

    uint8_t  log8[256];

    uint8_t alog8[512];



    if(!sbox[255]){

        VAR_1=1;

        for(VAR_0=0; VAR_0<255; VAR_0++){

            alog8[VAR_0]=

            alog8[VAR_0+255]= VAR_1;

            log8[VAR_1]= VAR_0;

            VAR_1^= VAR_1+VAR_1;

            if(VAR_1>255) VAR_1^= 0x11B;

        }

        for(VAR_0=0; VAR_0<256; VAR_0++){

            VAR_1= VAR_0 ? alog8[255-log8[VAR_0]] : 0;

            VAR_1 ^= (VAR_1<<1) ^ (VAR_1<<2) ^ (VAR_1<<3) ^ (VAR_1<<4);

            VAR_1 = (VAR_1 ^ (VAR_1>>8) ^ 99) & 255;

            inv_sbox[VAR_1]= VAR_0;

            sbox    [VAR_0]= VAR_1;

        }

        init_multbl2(dec_multbl[0], (int[4]){0xe, 0x9, 0xd, 0xb}, log8, alog8, inv_sbox);

        init_multbl2(enc_multbl[0], (int[4]){0x2, 0x1, 0x1, 0x3}, log8, alog8, sbox);

    }



    if(key_bits!=128 && key_bits!=192 && key_bits!=256)

        return NULL;



    a= av_malloc(sizeof(AVAES));

    a->VAR_5= VAR_5;



    memcpy(tk, key, VAR_4*4);



    for(VAR_2= 0; VAR_2 < (VAR_5+1)*4;) {

        memcpy(a->round_key[0][VAR_2], tk, VAR_4*4);

        VAR_2+= VAR_4;



        for(VAR_0 = 0; VAR_0 < 4; VAR_0++)

            tk[0][VAR_0] ^= sbox[tk[VAR_4-1][(VAR_0+1)&3]];

        tk[0][0] ^= rcon[VAR_3++];



        for(VAR_1 = 1; VAR_1 < VAR_4; VAR_1++){

            if(VAR_4 != 8 || VAR_1 != VAR_4>>1)

                for(VAR_0 = 0; VAR_0 < 4; VAR_0++) tk[VAR_1][VAR_0] ^=      tk[VAR_1-1][VAR_0];

            else

                for(VAR_0 = 0; VAR_0 < 4; VAR_0++) tk[VAR_1][VAR_0] ^= sbox[tk[VAR_1-1][VAR_0]];

        }

    }



    if(decrypt){

        for(VAR_0=1; VAR_0<VAR_5; VAR_0++){

            for(VAR_1=0; VAR_1<16; VAR_1++)

                a->round_key[VAR_0][0][VAR_1]= sbox[a->round_key[VAR_0][0][VAR_1]];

            mix(a->round_key[VAR_0], dec_multbl);

        }

    }else{

        for(VAR_0=0; VAR_0<(VAR_5+1)>>1; VAR_0++){

            for(VAR_1=0; VAR_1<16; VAR_1++)

                FFSWAP(int, a->round_key[VAR_0][0][VAR_1], a->round_key[VAR_5-VAR_0][0][VAR_1]);

        }

    }



    return a;

}

AVAES *FUNC_0(uint8_t *key, int key_bits, int decrypt) { AVAES *a; int VAR_0, VAR_1, VAR_2, VAR_3 = 0; uint8_t tk[8][4]; int VAR_4= key_bits>>5; int VAR_5= VAR_4 + 6; uint8_t  log8[256]; uint8_t alog8[512]; if(!sbox[255]){ VAR_1=1; for(VAR_0=0; VAR_0<255; VAR_0++){ alog8[VAR_0]=
alog8[VAR_0+255]= VAR_1; log8[VAR_1]= VAR_0; VAR_1^= VAR_1+VAR_1; if(VAR_1>255) VAR_1^= 0x11B; } for(VAR_0=0; VAR_0<256; VAR_0++){ VAR_1= VAR_0 ? alog8[255-log8[VAR_0]] : 0; VAR_1 ^= (VAR_1<<1) ^ (VAR_1<<2) ^ (VAR_1<<3) ^ (VAR_1<<4); VAR_1 = (VAR_1 ^ (VAR_1>>8) ^ 99) & 255; inv_sbox[VAR_1]= VAR_0; sbox    [VAR_0]= VAR_1; } init_multbl2(dec_multbl[0], (int[4]){0xe, 0x9, 0xd, 0xb}, log8, alog8, inv_sbox); init_multbl2(enc_multbl[0], (int[4]){0x2, 0x1, 0x1, 0x3}, log8, alog8, sbox); } if(key_bits!=128 && key_bits!=192 && key_bits!=256)
return NULL; a= av_malloc(sizeof(AVAES)); a->VAR_5= VAR_5; memcpy(tk, key, VAR_4*4); for(VAR_2= 0; VAR_2 < (VAR_5+1)*4;) { memcpy(a->round_key[0][VAR_2], tk, VAR_4*4); VAR_2+= VAR_4; for(VAR_0 = 0; VAR_0 < 4; VAR_0++) tk[0][VAR_0] ^= sbox[tk[VAR_4-1][(VAR_0+1)&3]]; tk[0][0] ^= rcon[VAR_3++]; for(VAR_1 = 1; VAR_1 < VAR_4; VAR_1++){ if(VAR_4 != 8 || VAR_1 != VAR_4>>1)
for(VAR_0 = 0; VAR_0 < 4; VAR_0++) tk[VAR_1][VAR_0] ^=      tk[VAR_1-1][VAR_0]; else
for(VAR_0 = 0; VAR_0 < 4; VAR_0++) tk[VAR_1][VAR_0] ^= sbox[tk[VAR_1-1][VAR_0]]; } } if(decrypt){ for(VAR_0=1; VAR_0<VAR_5; VAR_0++){ for(VAR_1=0; VAR_1<16; VAR_1++) a->round_key[VAR_0][0][VAR_1]= sbox[a->round_key[VAR_0][0][VAR_1]]; mix(a->round_key[VAR_0], dec_multbl); } }else{ for(VAR_0=0; VAR_0<(VAR_5+1)>>1; VAR_0++){ for(VAR_1=0; VAR_1<16; VAR_1++) FFSWAP(int, a->round_key[VAR_0][0][VAR_1], a->round_key[VAR_5-VAR_0][0][VAR_1]); } } return a; }