Exemplo n.º 1
0
void intel_AES_dec192_CBC(UCHAR *cipherText,UCHAR *plainText,UCHAR *key,size_t numBlocks,UCHAR *iv)
{
    DEFINE_ROUND_KEYS
    sAesData aesData;
    aesData.in_block = cipherText;
    aesData.out_block = plainText;
    aesData.expanded_key = expandedKey;
    aesData.num_blocks = numBlocks;
    aesData.iv = iv;

    iDecExpandKey192(key,expandedKey);
    iDec192_CBC(&aesData);
}
Exemplo n.º 2
0
void tDecAES::dec(u8* ctbuf, u8* ptbuf, u32 numblocks, u8* iv)
{
    // Fast ASM impl:
    if (m_useASM)
    {
        sAesData data;
        data.in_block = ctbuf;
        data.out_block = ptbuf;
        data.expanded_key = m_expandedKey;
        data.iv = iv;
        data.num_blocks = numblocks;
        if (m_opmode == kOpModeCBC && iv)
        {
            switch (m_keylen)
            {
                case k128bit: iDec128_CBC(&data); break;
                case k192bit: iDec192_CBC(&data); break;
                case k256bit: iDec256_CBC(&data); break;
                default: throw eInvalidArgument("The keylen parameter is not valid!");
            }
        }
        else
        {
            switch (m_keylen)
            {
                case k128bit: iDec128(&data); break;
                case k192bit: iDec192(&data); break;
                case k256bit: iDec256(&data); break;
                default: throw eInvalidArgument("The keylen parameter is not valid!");
            }
        }
    }

    // Fallback impl:
    else
    {
        u32* rk = m_rk;
        int Nr = m_Nr;
        if (m_opmode == kOpModeCBC && iv)
        {
            u8 ct[AES_BLOCK_SIZE];
            for (u32 i = 0; numblocks > 0; i+=AES_BLOCK_SIZE, --numblocks)
            {
                for (u32 j = 0; j < AES_BLOCK_SIZE; j++)
                    ct[j] = ctbuf[i+j];
                rijndaelDecrypt(rk, Nr, ct, ptbuf+i);
                for (u32 j = 0; j < AES_BLOCK_SIZE; j++)
                {
                    ptbuf[i+j] ^= iv[j];
                    iv[j] = ct[j];
                }
            }
        }
        else
        {
            for (u32 i = 0; numblocks > 0; i+=AES_BLOCK_SIZE, --numblocks)
            {
                rijndaelDecrypt(rk, Nr, ctbuf+i, ptbuf+i);
            }
        }
    }
}