private void SetKdfParameters(KdfParameters p)
        {
            if (p == null)
            {
                Debug.Assert(false); return;
            }

            KdfEngine kdf = KdfPool.Get(p.KdfUuid);

            if (kdf == null)
            {
                Debug.Assert(false); return;
            }

            for (int i = 0; i < m_cmbKdf.Items.Count; ++i)
            {
                string strKdf = (m_cmbKdf.Items[i] as string);
                if (string.IsNullOrEmpty(strKdf))
                {
                    Debug.Assert(false); continue;
                }

                if (strKdf.Equals(kdf.Name, StrUtil.CaseIgnoreCmp))
                {
                    bool bPrevInit = m_bInitializing;
                    m_bInitializing = true;                     // Prevent selection handler

                    m_cmbKdf.SelectedIndex = i;

                    m_bInitializing = bPrevInit;
                    break;
                }
            }

            if (kdf is AesKdf)
            {
                ulong uIt = p.GetUInt64(AesKdf.ParamRounds,
                                        PwDefs.DefaultKeyEncryptionRounds);
                SetKdfParameters(uIt, 1024, 2);
            }
            else if (kdf is Argon2Kdf)
            {
                ulong uIt = p.GetUInt64(Argon2Kdf.ParamIterations,
                                        Argon2Kdf.DefaultIterations);
                ulong uMem = p.GetUInt64(Argon2Kdf.ParamMemory,
                                         Argon2Kdf.DefaultMemory);
                uint uPar = p.GetUInt32(Argon2Kdf.ParamParallelism,
                                        Argon2Kdf.DefaultParallelism);
                SetKdfParameters(uIt, uMem, uPar);
            }
            // else { Debug.Assert(false); } // Plugins may provide other KDFs
        }
Esempio n. 2
0
		public override byte[] Transform(byte[] pbMsg, KdfParameters p)
		{
			if(pbMsg == null) throw new ArgumentNullException("pbMsg");
			if(p == null) throw new ArgumentNullException("p");

			Type tRounds = p.GetTypeOf(ParamRounds);
			if(tRounds == null) throw new ArgumentNullException("p.Rounds");
			if(tRounds != typeof(ulong)) throw new ArgumentOutOfRangeException("p.Rounds");
			ulong uRounds = p.GetUInt64(ParamRounds, 0);

			byte[] pbSeed = p.GetByteArray(ParamSeed);
			if(pbSeed == null) throw new ArgumentNullException("p.Seed");

			if(pbMsg.Length != 32)
			{
				Debug.Assert(false);
				pbMsg = CryptoUtil.HashSha256(pbMsg);
			}

			if(pbSeed.Length != 32)
			{
				Debug.Assert(false);
				pbSeed = CryptoUtil.HashSha256(pbSeed);
			}

			return TransformKey(pbMsg, pbSeed, uRounds);
		}
 private static void CheckKdf(KdfParameters param, TestKdfValues testEntryValues)
 {
     Assert.AreEqual(testEntryValues.KdfUuid, param.KdfUuid);
     if (param.KdfUuid.Equals(TestKdfValues.UuidAes))
     {
         Assert.AreEqual(testEntryValues.AesKeyTransformationRounds, param.GetUInt64(AesKdf.ParamRounds, 0));
     }
     else if (param.KdfUuid.Equals(TestKdfValues.UuidArgon2))
     {
         Assert.AreEqual(testEntryValues.Argon2Iterations, param.GetUInt64(Argon2Kdf.ParamIterations, 0));
         Assert.AreEqual(testEntryValues.Argon2Memory, param.GetUInt64(Argon2Kdf.ParamMemory, 0));
         Assert.AreEqual(testEntryValues.Argon2Parallelism, param.GetUInt32(Argon2Kdf.ParamParallelism, 0));
     }
     else
     {
         Assert.Fail("Kdf is not Aes or Argon2");
     }
 }