void ComputeBlock(uint pos) { BitPacking.BEBytesFromUInt32(pos, this._saltBuffer, this._saltBuffer.Length - 4); ComputeHmac(this._saltBuffer, this._digestT1); Array.Copy(this._digestT1, this._digest, this._digestT1.Length); for (var i = 1; i < this._iterations; i++) { ComputeHmac(this._digestT1, this._digestT1); for (var j = 0; j < this._digest.Length; j++) { this._digest[j] ^= this._digestT1[j]; } } Security.Clear(this._digestT1); }
static byte[] MFcrypt(byte[] P, byte[] S, int cost, int blockSize, int parallel, int?maxThreads) { var MFLen = blockSize * 128; if (maxThreads == null) { maxThreads = int.MaxValue; } if (!BitMath.IsPositivePowerOf2(cost)) { throw Exceptions.ArgumentOutOfRange("cost", "Cost must be a positive power of 2."); } Check.Range("blockSize", blockSize, 1, int.MaxValue / 128); Check.Range("parallel", parallel, 1, int.MaxValue / MFLen); Check.Range("maxThreads", (int)maxThreads, 1, int.MaxValue); #if !NETCORE byte[] B = Pbkdf2.ComputeDerivedKey(new HMACSHA256(P), S, 1, parallel * MFLen); #else var mac = new HMac(new Sha256Digest()); mac.Init(new KeyParameter(P)); var B = Pbkdf2.ComputeDerivedKey(mac, S, 1, parallel * MFLen); #endif var B0 = new uint[B.Length / 4]; for (var i = 0; i < B0.Length; i++) { B0[i] = BitPacking.UInt32FromLEBytes(B, i * 4); } ThreadSMixCalls(B0, MFLen, cost, blockSize, parallel, (int)maxThreads); for (var i = 0; i < B0.Length; i++) { BitPacking.LEBytesFromUInt32(B0[i], B, i * 4); } Security.Clear(B0); return(B); }