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

TransformKey() private static method

Transform the current key uNumRounds times.
private static TransformKey ( byte pbOriginalKey32, byte pbKeySeed32, ulong uNumRounds ) : byte[]
pbOriginalKey32 byte The original key which will be transformed. /// This parameter won't be modified.
pbKeySeed32 byte Seed used for key transformations. Must not /// be null. This parameter won't be modified.
uNumRounds ulong Transformation count.
return byte[]
        private static byte[] TransformKey(byte[] pbOriginalKey32, byte[] pbKeySeed32,
            ulong uNumRounds)
        {
            Debug.Assert((pbOriginalKey32 != null) && (pbOriginalKey32.Length == 32));
            if(pbOriginalKey32 == null) throw new ArgumentNullException("pbOriginalKey32");
            if(pbOriginalKey32.Length != 32) throw new ArgumentException();

            Debug.Assert((pbKeySeed32 != null) && (pbKeySeed32.Length == 32));
            if(pbKeySeed32 == null) throw new ArgumentNullException("pbKeySeed32");
            if(pbKeySeed32.Length != 32) throw new ArgumentException();

            byte[] pbNewKey = new byte[32];
            Array.Copy(pbOriginalKey32, pbNewKey, pbNewKey.Length);

            try
            {
                // Try to use the native library first
                if(NativeLib.TransformKey256(pbNewKey, pbKeySeed32, uNumRounds))
                    return (new SHA256Managed()).ComputeHash(pbNewKey);

                if(!TransformKeyManaged(pbNewKey, pbKeySeed32, uNumRounds))
                    return null;

                return (new SHA256Managed()).ComputeHash(pbNewKey);
            }
            finally { MemUtil.ZeroByteArray(pbNewKey); }
        }