private async Task Init(byte[] passwordInUTF8,ICanSHA256Hash hasher) { var hashedBuffer = hasher.Hash(passwordInUTF8); keyData = hashedBuffer; }
/// <summary> /// Construct a new cryptographically secure random stream object. /// </summary> /// <param name="genAlgorithm">Algorithm to use.</param> /// <param name="pbKey">Initialization key. Must not be <c>null</c> and /// must contain at least 1 byte.</param> /// <exception cref="System.ArgumentNullException">Thrown if the /// <paramref name="pbKey" /> parameter is <c>null</c>.</exception> /// <exception cref="System.ArgumentException">Thrown if the /// <paramref name="pbKey" /> parameter contains no bytes or the /// algorithm is unknown.</exception> public CryptoRandomStream(CrsAlgorithm genAlgorithm, byte[] pbKey, ICanSHA256Hash hasher) { _hasher = hasher; m_crsAlgorithm = genAlgorithm; uint uKeyLen = (uint)pbKey.Length; if (genAlgorithm == CrsAlgorithm.ArcFourVariant) { // Fill the state linearly m_pbState = new byte[256]; for (uint w = 0; w < 256; ++w) m_pbState[w] = (byte)w; unchecked { byte j = 0, t; uint inxKey = 0; for (uint w = 0; w < 256; ++w) // Key setup { j += (byte)(m_pbState[w] + pbKey[inxKey]); t = m_pbState[0]; // Swap entries m_pbState[0] = m_pbState[j]; m_pbState[j] = t; ++inxKey; if (inxKey >= uKeyLen) inxKey = 0; } } GetRandomBytes(512); // Increases security, see cryptanalysis } else if (genAlgorithm == CrsAlgorithm.Salsa20) { byte[] pbKey32 = _hasher.Hash(pbKey); byte[] pbIV = new byte[]{ 0xE8, 0x30, 0x09, 0x4B, 0x97, 0x20, 0x5D, 0x2A }; // Unique constant m_salsa20 = new Salsa20Cipher(pbKey32, pbIV); } else // Unknown algorithm { throw new UnknownAlgorithmException(); } }