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 }
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"); } }