KeePassLib.Cryptography.KeyDerivation.AesKdf.TransformKeyManaged C# (CSharp) Method

TransformKeyManaged() static private method

static private TransformKeyManaged ( Array pbNewKey32, Array pbKeySeed32, ulong uNumRounds ) : bool
pbNewKey32 Array
pbKeySeed32 Array
uNumRounds ulong
return bool
		internal 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 u = 0; u < uNumRounds; ++u)
			{
				aes.ProcessBlock(pbNewKey32, 0, pbNewKey32, 0);
				aes.ProcessBlock(pbNewKey32, 16, pbNewKey32, 16);
			}

			aes.Reset();
#else
			byte[] pbIV = new byte[16];

			using(SymmetricAlgorithm a = CryptoUtil.CreateAes())
			{
				if(a.BlockSize != 128) // AES block size
				{
					Debug.Assert(false);
					a.BlockSize = 128;
				}
				a.KeySize = 256;
				a.Mode = CipherMode.ECB;

				using(ICryptoTransform t = a.CreateEncryptor(pbKeySeed32, pbIV))
				{
					// !t.CanReuseTransform -- doesn't work with Mono
					if((t == null) || (t.InputBlockSize != 16) ||
						(t.OutputBlockSize != 16))
					{
						Debug.Assert(false);
						return false;
					}

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

			return true;
		}