Pbkdf2Params
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 BigInteger KeyLength => m_keyLength?.Value;
public bool IsDefaultPrf => DefaultPrf.Equals(m_prf);
public AlgorithmIdentifier Prf => m_prf;
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);
}
}
}