<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.0" />

Pbkdf2Params

public class Pbkdf2Params : Asn1Encodable
using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Math; using System; namespace Org.BouncyCastle.Asn1.Pkcs { public class Pbkdf2Params : Asn1Encodable { public static readonly AlgorithmIdentifier DefaultPrf = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdHmacWithSha1, DerNull.Instance); private readonly Asn1OctetString m_octStr; private readonly DerInteger m_iterationCount; private readonly DerInteger m_keyLength; private readonly AlgorithmIdentifier m_prf; public BigInteger IterationCount => m_iterationCount.Value; public DerInteger IterationCountObject => m_iterationCount; public BigInteger KeyLength => m_keyLength?.Value; public DerInteger KeyLengthObject => m_keyLength; public bool IsDefaultPrf => DefaultPrf.Equals(m_prf); public AlgorithmIdentifier Prf => m_prf; public Asn1OctetString Salt => m_octStr; public static Pbkdf2Params GetInstance(object obj) { if (obj == null) return null; Pbkdf2Params pbkdf2Params = obj as Pbkdf2Params; if (pbkdf2Params != null) return pbkdf2Params; return new Pbkdf2Params(Asn1Sequence.GetInstance(obj)); } public static Pbkdf2Params GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new Pbkdf2Params(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } public static Pbkdf2Params GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new Pbkdf2Params(Asn1Sequence.GetTagged(taggedObject, declaredExplicit)); } [Obsolete("Use 'GetInstance' instead")] public Pbkdf2Params(Asn1Sequence seq) { int count = seq.Count; int sequencePosition = 0; if (count < 2 || count > 4) throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq"); m_octStr = Asn1OctetString.GetInstance(seq[sequencePosition++]); m_iterationCount = DerInteger.GetInstance(seq[sequencePosition++]); m_keyLength = Asn1Utilities.ReadOptional(seq, ref sequencePosition, DerInteger.GetOptional); m_prf = (Asn1Utilities.ReadOptional(seq, ref sequencePosition, AlgorithmIdentifier.GetOptional) ?? DefaultPrf); if (sequencePosition != count) throw new ArgumentException("Unexpected elements in sequence", "seq"); } public Pbkdf2Params(byte[] salt, int iterationCount) : this(salt, iterationCount, null) { } public Pbkdf2Params(byte[] salt, int iterationCount, int keyLength) : this(salt, iterationCount, keyLength, null) { } public Pbkdf2Params(byte[] salt, int iterationCount, AlgorithmIdentifier prf) { m_octStr = DerOctetString.FromContents(salt); m_iterationCount = new DerInteger(iterationCount); m_keyLength = null; m_prf = (prf ?? DefaultPrf); } public Pbkdf2Params(byte[] salt, int iterationCount, int keyLength, AlgorithmIdentifier prf) { m_octStr = DerOctetString.FromContents(salt); m_iterationCount = new DerInteger(iterationCount); m_keyLength = new DerInteger(keyLength); m_prf = (prf ?? DefaultPrf); } public byte[] GetSalt() { return m_octStr.GetOctets(); } public override Asn1Object ToAsn1Object() { Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(4); asn1EncodableVector.Add(m_octStr, m_iterationCount); asn1EncodableVector.AddOptional(m_keyLength); if (!IsDefaultPrf) asn1EncodableVector.Add(m_prf); return new DerSequence(asn1EncodableVector); } } }