Example #1
0
        /* CryptoNight Step 2:  Iteratively encrypt the results from Keccak
         * to fill the large scratchpad
         */
        public static byte[] FillScratchpad(CNState cnState, ICryptoNight cnParams)
        {
            /* Expand our initial key into many for each round of pseudo aes */
            byte[] expandedKeys = AES.ExpandKey(cnState.GetAESKey(), cnParams.Intrinsics);

            /* Our large scratchpad, 2MB in default CN */
            byte[] scratchpad = new byte[cnParams.Memory];

            byte[] text = cnState.GetText();

            if (cnParams.Intrinsics && Aes.IsSupported && Sse2.IsSupported)
            {
                /* Fill the scratchpad with AES encryption of text */
                for (int i = 0; i < cnParams.InitRounds; i++)
                {
                    AES.AESPseudoRoundNative(expandedKeys, text);

                    /* Write text to the scratchpad, at the offset
                     * i * InitSizeByte */
                    Buffer.BlockCopy(text, 0, scratchpad, i * Constants.INIT_SIZE_BYTE, text.Length);
                }
            }
            else
            {
                /* Fill the scratchpad with AES encryption of text */
                for (int i = 0; i < cnParams.InitRounds; i++)
                {
                    AES.AESPseudoRound(expandedKeys, text, cnParams.Intrinsics);

                    /* Write text to the scratchpad, at the offset
                     * i * InitSizeByte */
                    Buffer.BlockCopy(text, 0, scratchpad, i * Constants.INIT_SIZE_BYTE, text.Length);
                }
            }

            return(scratchpad);
        }