Move PBKDF2 to new module, add some new Interop methods
[NovacoinLibrary.git] / Novacoin / ScryptHash256.cs
index ae4f0dd..90c2f8f 100644 (file)
@@ -2,8 +2,6 @@
 using System.Collections.Generic;
 using System.Linq;
 
-using System.Security.Cryptography;
-
 namespace Novacoin
 {
     /// <summary>
@@ -31,7 +29,7 @@ namespace Novacoin
             uint[] V = new uint[(131072 + 63) / sizeof(uint)];
 
             byte[] dataBytes = inputBytes.ToArray();
-            byte[] keyBytes1 = PBKDF2Sha256GetBytes(128, dataBytes, dataBytes, 1);
+            byte[] keyBytes1 = CryptoUtils.PBKDF2_Sha256(128, dataBytes, dataBytes, 1);
             uint[] X = Interop.ToUInt32Array(keyBytes1);
 
             uint i, j, k;
@@ -52,62 +50,11 @@ namespace Novacoin
             }
 
             byte[] xBytes = Interop.LEBytes(X);
-            byte[] keyBytes2 = PBKDF2Sha256GetBytes(32, dataBytes, xBytes, 1);
+            byte[] keyBytes2 = CryptoUtils.PBKDF2_Sha256(32, dataBytes, xBytes, 1);
 
             return new ScryptHash256(keyBytes2);
         }
 
-        private static byte[] PBKDF2Sha256GetBytes(int dklen, byte[] password, byte[] salt, int iterationCount)
-        {
-            using (var hmac = new HMACSHA256(password))
-            {
-                int hashLength = hmac.HashSize / 8;
-                if ((hmac.HashSize & 7) != 0)
-                    hashLength++;
-                int keyLength = dklen / hashLength;
-                if ((long)dklen > (0xFFFFFFFFL * hashLength) || dklen < 0)
-                    throw new ArgumentOutOfRangeException("dklen");
-                if (dklen % hashLength != 0)
-                    keyLength++;
-                byte[] extendedkey = new byte[salt.Length + 4];
-                Buffer.BlockCopy(salt, 0, extendedkey, 0, salt.Length);
-                using (var ms = new System.IO.MemoryStream())
-                {
-                    for (int i = 0; i < keyLength; i++)
-                    {
-                        extendedkey[salt.Length] = (byte)(((i + 1) >> 24) & 0xFF);
-                        extendedkey[salt.Length + 1] = (byte)(((i + 1) >> 16) & 0xFF);
-                        extendedkey[salt.Length + 2] = (byte)(((i + 1) >> 8) & 0xFF);
-                        extendedkey[salt.Length + 3] = (byte)(((i + 1)) & 0xFF);
-                        byte[] u = hmac.ComputeHash(extendedkey);
-                        Array.Clear(extendedkey, salt.Length, 4);
-                        byte[] f = u;
-                        for (int j = 1; j < iterationCount; j++)
-                        {
-                            u = hmac.ComputeHash(u);
-                            for (int k = 0; k < f.Length; k++)
-                            {
-                                f[k] ^= u[k];
-                            }
-                        }
-                        ms.Write(f, 0, f.Length);
-                        Array.Clear(u, 0, u.Length);
-                        Array.Clear(f, 0, f.Length);
-                    }
-                    byte[] dk = new byte[dklen];
-                    ms.Position = 0;
-                    ms.Read(dk, 0, dklen);
-                    ms.Position = 0;
-                    for (long i = 0; i < ms.Length; i++)
-                    {
-                        ms.WriteByte(0);
-                    }
-                    Array.Clear(extendedkey, 0, extendedkey.Length);
-                    return dk;
-                }
-            }
-        }
-
         private static void xor_salsa8(ref uint[] B, int indexB, ref uint[] Bx, int indexBx)
         {
             uint x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15;