Cast5CbcParameters
using Org.BouncyCastle.Utilities;
using System;
namespace Org.BouncyCastle.Asn1.Misc
{
public class Cast5CbcParameters : Asn1Encodable
{
private readonly Asn1OctetString m_iv;
private readonly DerInteger m_keyLength;
public Asn1OctetString IV => m_iv;
public int KeyLength => m_keyLength.IntValueExact;
public static Cast5CbcParameters GetInstance(object o)
{
if (o == null)
return null;
Cast5CbcParameters cast5CbcParameters = o as Cast5CbcParameters;
if (cast5CbcParameters != null)
return cast5CbcParameters;
return new Cast5CbcParameters(Asn1Sequence.GetInstance(o));
}
public static Cast5CbcParameters GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new Cast5CbcParameters(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
}
public static Cast5CbcParameters GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new Cast5CbcParameters(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
}
private Cast5CbcParameters(Asn1Sequence seq)
{
int count = seq.Count;
int sequencePosition = 0;
if (count < 1 || count > 2)
throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
m_iv = (Asn1Utilities.ReadOptional(seq, ref sequencePosition, Asn1OctetString.GetOptional) ?? new DerOctetString(new byte[8]));
m_keyLength = DerInteger.GetInstance(seq[sequencePosition++]);
if (sequencePosition != count)
throw new ArgumentException("Unexpected elements in sequence", "seq");
}
public Cast5CbcParameters(byte[] iv, int keyLength)
{
m_iv = new DerOctetString(iv ?? new byte[8]);
m_keyLength = new DerInteger(keyLength);
}
public byte[] GetIV()
{
return Arrays.Clone(m_iv.GetOctets());
}
public override Asn1Object ToAsn1Object()
{
if (!IsDefaultIV(m_iv))
return new DerSequence(m_iv, m_keyLength);
return new DerSequence(m_keyLength);
}
private static bool IsDefaultIV(Asn1OctetString iv)
{
if (iv.GetOctetsLength() == 8)
return Arrays.AreAllZeroes(iv.GetOctets(), 0, 8);
return false;
}
}
}