SizeT AesCbc_Decode(CAesCbc *p, Byte *data, SizeT size) { if (size == 0) return 0; if (size < AES_BLOCK_SIZE) return AES_BLOCK_SIZE; size -= AES_BLOCK_SIZE; SizeT i; UInt32 in[4], out[4]; for (i = 0; i <= size; i += AES_BLOCK_SIZE, data += AES_BLOCK_SIZE) { in[0] = GetUi32(data); in[1] = GetUi32(data + 4); in[2] = GetUi32(data + 8); in[3] = GetUi32(data + 12); AesDecode32(out, in, p->aes.rkey, p->aes.numRounds2); SetUi32(data, p->prev[0] ^ out[0]); SetUi32(data + 4, p->prev[1] ^ out[1]); SetUi32(data + 8, p->prev[2] ^ out[2]); SetUi32(data + 12, p->prev[3] ^ out[3]); p->prev[0] = in[0]; p->prev[1] = in[1]; p->prev[2] = in[2]; p->prev[3] = in[3]; } return i; }
UInt32 MY_FAST_CALL AesCbcDecode(CAesCbc *cbc, Byte *data, UInt32 size) { UInt32 i; UInt32 in[4], out[4]; if (size == 0) return 0; if (size < AES_BLOCK_SIZE) return AES_BLOCK_SIZE; size -= AES_BLOCK_SIZE; for (i = 0; i <= size; i += AES_BLOCK_SIZE, data += AES_BLOCK_SIZE) { in[0] = GetUi32(data); in[1] = GetUi32(data + 4); in[2] = GetUi32(data + 8); in[3] = GetUi32(data + 12); AesDecode32(in, out, cbc->aes.rkey, cbc->aes.numRounds2); SetUi32(data, cbc->prev[0] ^ out[0]); SetUi32(data + 4, cbc->prev[1] ^ out[1]); SetUi32(data + 8, cbc->prev[2] ^ out[2]); SetUi32(data + 12, cbc->prev[3] ^ out[3]); cbc->prev[0] = in[0]; cbc->prev[1] = in[1]; cbc->prev[2] = in[2]; cbc->prev[3] = in[3]; } return i; }
void Aes_Decode32(const CAes *p, UInt32 *dest, const UInt32 *src) { AesDecode32(dest, src, p->rkey, p->numRounds2); }