CSPspEmu.Core.Crypto.Crypto.AES_cbc_decrypt C# (CSharp) Method

AES_cbc_decrypt() public static method

public static AES_cbc_decrypt ( AES_ctx ctx, byte src, byte dst, int size ) : void
ctx AES_ctx
src byte
dst byte
size int
return void
        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;
                }
            }
        }

Usage Example

Example #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="outbuff"></param>
        /// <param name="inbuff"></param>
        /// <param name="size"></param>
        /// <returns></returns>
        public void kirk_CMD7(byte *outbuff, byte *inbuff, int size)
        {
            check_initialized();

            var Header = (KIRK_AES128CBC_HEADER *)inbuff;

            if (Header->Mode != KirkMode.DecryptCbc)
            {
                throw (new KirkException(ResultEnum.PSP_KIRK_INVALID_MODE));
            }
            if (Header->Datasize == 0)
            {
                throw (new KirkException(ResultEnum.PSP_KIRK_DATA_SIZE_IS_ZERO));
            }

#if USE_DOTNET_CRYPTO
            var Output = DecryptAes(
                PointerUtils.PointerToByteArray(inbuff + sizeof(KIRK_AES128CBC_HEADER), size),
                _kirk_4_7_get_key(Header->KeySeed)
                );

            PointerUtils.ByteArrayToPointer(Output, outbuff);
#else
            kirk_4_7_get_key(Header->KeySeed, (key) =>
            {
                //Set the key
                Crypto.AES_ctx aesKey;
                Crypto.AES_set_key(&aesKey, key, 128);

                Crypto.AES_cbc_decrypt(&aesKey, inbuff + sizeof(KIRK_AES128CBC_HEADER), outbuff, size);
            });
#endif
        }
All Usage Examples Of CSPspEmu.Core.Crypto.Crypto::AES_cbc_decrypt