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

TransformKeyBenchmark() public static method

Benchmark the TransformKey method. Within uMilliseconds ms, random keys will be transformed and the number of performed transformations are returned.
public static TransformKeyBenchmark ( uint uMilliseconds, ulong uStep ) : ulong
uMilliseconds uint Test duration in ms.
uStep ulong Stepping. /// should be a prime number. For fast processors /// (PCs) a value of 3001 is recommended, for slower processors (PocketPC) /// a value of 401 is recommended.
return ulong
        public static ulong TransformKeyBenchmark(uint uMilliseconds, ulong uStep)
        {
            ulong uRounds;

            // Try native method
            if(NativeLib.TransformKeyBenchmark256(uMilliseconds, out uRounds))
                return uRounds;

            byte[] pbKey = new byte[32];
            byte[] pbNewKey = new byte[32];
            for(int i = 0; i < pbKey.Length; ++i)
            {
                pbKey[i] = (byte)i;
                pbNewKey[i] = (byte)i;
            }

            #if KeePassUAP
            KeyParameter kp = new KeyParameter(pbKey);
            AesEngine aes = new AesEngine();
            aes.Init(true, kp);
            #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 = pbKey;
            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 PwDefs.DefaultKeyEncryptionRounds;
            }
            #endif

            uRounds = 0;
            int tStart = Environment.TickCount;
            while(true)
            {
                for(ulong j = 0; j < uStep; ++j)
                {
            #if KeePassUAP
                    aes.ProcessBlock(pbNewKey, 0, pbNewKey, 0);
                    aes.ProcessBlock(pbNewKey, 16, pbNewKey, 16);
            #else
                    iCrypt.TransformBlock(pbNewKey, 0, 16, pbNewKey, 0);
                    iCrypt.TransformBlock(pbNewKey, 16, 16, pbNewKey, 16);
            #endif
                }

                uRounds += uStep;
                if(uRounds < uStep) // Overflow check
                {
                    uRounds = ulong.MaxValue;
                    break;
                }

                uint tElapsed = (uint)(Environment.TickCount - tStart);
                if(tElapsed > uMilliseconds) break;
            }

            return uRounds;
        }