KeePassLib.Keys.CompositeKey.TransformKeyManaged C# (CSharp) Method

TransformKeyManaged() public static method

public static TransformKeyManaged ( byte pbNewKey32, byte pbKeySeed32, ulong uNumRounds ) : bool
pbNewKey32 byte
pbKeySeed32 byte
uNumRounds ulong
return bool
        public static bool TransformKeyManaged(byte[] pbNewKey32, byte[] pbKeySeed32,
            ulong uNumRounds)
        {
            #if KeePassUAP
            KeyParameter kp = new KeyParameter(pbKeySeed32);
            AesEngine aes = new AesEngine();
            aes.Init(true, kp);

            for(ulong i = 0; i < uNumRounds; ++i)
            {
                aes.ProcessBlock(pbNewKey32, 0, pbNewKey32, 0);
                aes.ProcessBlock(pbNewKey32, 16, pbNewKey32, 16);
            }
            #else
            byte[] pbIV = new byte[16];
            Array.Clear(pbIV, 0, pbIV.Length);

            RijndaelManaged r = new RijndaelManaged();
            if(r.BlockSize != 128) // AES block size
            {
                Debug.Assert(false);
                r.BlockSize = 128;
            }

            r.IV = pbIV;
            r.Mode = CipherMode.ECB;
            r.KeySize = 256;
            r.Key = pbKeySeed32;
            ICryptoTransform iCrypt = r.CreateEncryptor();

            // !iCrypt.CanReuseTransform -- doesn't work with Mono
            if((iCrypt == null) || (iCrypt.InputBlockSize != 16) ||
                (iCrypt.OutputBlockSize != 16))
            {
                Debug.Assert(false, "Invalid ICryptoTransform.");
                Debug.Assert((iCrypt.InputBlockSize == 16), "Invalid input block size!");
                Debug.Assert((iCrypt.OutputBlockSize == 16), "Invalid output block size!");
                return false;
            }

            for(ulong i = 0; i < uNumRounds; ++i)
            {
                iCrypt.TransformBlock(pbNewKey32, 0, 16, pbNewKey32, 0);
                iCrypt.TransformBlock(pbNewKey32, 16, 16, pbNewKey32, 16);
            }
            #endif

            return true;
        }