public static void AES_cbc_decrypt(AES_ctx* ctx, byte* src, byte* dst, int size)
{
var _block_buff = new byte[16];
var _block_buff_previous = new byte[16];
fixed (byte* block_buff = _block_buff)
fixed (byte* block_buff_previous = _block_buff_previous)
{
memcpy(block_buff, src, 16);
memcpy(block_buff_previous, src, 16);
AES_decrypt(ctx, src, dst);
dst += 16;
src += 16;
int i;
for(i = 16; i < size; i+=16)
{
//step1: backup current block for next block decrypt
memcpy(block_buff, src, 16);
//step2: copy current block to destination
memcpy(dst, src, 16);
//step3: decrypt current buffer in place
AES_decrypt(ctx, dst, dst);
//step4: XOR current buffer with previous buffer
xor_128(dst, block_buff_previous, dst);
//step5: swap buffers
memcpy(block_buff_previous, block_buff, 16);
dst += 16;
src += 16;
}
}
}