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