diff options
Diffstat (limited to 'crypto/src/asn1/misc/CAST5CBCParameters.cs')
-rw-r--r-- | crypto/src/asn1/misc/CAST5CBCParameters.cs | 74 |
1 files changed, 39 insertions, 35 deletions
diff --git a/crypto/src/asn1/misc/CAST5CBCParameters.cs b/crypto/src/asn1/misc/CAST5CBCParameters.cs index 3adafe05f..1dc3dbe39 100644 --- a/crypto/src/asn1/misc/CAST5CBCParameters.cs +++ b/crypto/src/asn1/misc/CAST5CBCParameters.cs @@ -1,6 +1,5 @@ using System; -using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Asn1.Misc @@ -8,51 +7,48 @@ namespace Org.BouncyCastle.Asn1.Misc public class Cast5CbcParameters : Asn1Encodable { - private readonly DerInteger keyLength; - private readonly Asn1OctetString iv; - - public static Cast5CbcParameters GetInstance( - object o) + public static Cast5CbcParameters GetInstance(object o) { - if (o is Cast5CbcParameters) - { - return (Cast5CbcParameters) o; - } - - if (o is Asn1Sequence) - { - return new Cast5CbcParameters((Asn1Sequence) o); - } - - throw new ArgumentException("unknown object in Cast5CbcParameters factory"); + if (o == null) + return null; + if (o is Cast5CbcParameters cast5CbcParameters) + return cast5CbcParameters; + return new Cast5CbcParameters(Asn1Sequence.GetInstance(o)); } - public Cast5CbcParameters( - byte[] iv, - int keyLength) + public static Cast5CbcParameters GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { - this.iv = new DerOctetString(iv); - this.keyLength = new DerInteger(keyLength); + return new Cast5CbcParameters(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } - private Cast5CbcParameters( - Asn1Sequence seq) + private readonly Asn1OctetString m_iv; + private readonly DerInteger m_keyLength; + + private Cast5CbcParameters(Asn1Sequence seq) { - if (seq.Count != 2) - throw new ArgumentException("Wrong number of elements in sequence", "seq"); + int count = seq.Count, pos = 0; + if (count < 1 || count > 2) + throw new ArgumentException("Bad sequence size: " + count, nameof(seq)); + + m_iv = Asn1Utilities.ReadOptional(seq, ref pos, Asn1OctetString.GetOptional) + ?? new DerOctetString(new byte[8]); + m_keyLength = DerInteger.GetInstance(seq[pos++]); - iv = (Asn1OctetString) seq[0]; - keyLength = (DerInteger) seq[1]; + if (pos != count) + throw new ArgumentException("Unexpected elements in sequence", nameof(seq)); } - public Asn1OctetString IV => iv; + public Cast5CbcParameters(byte[] iv, int keyLength) + { + m_iv = new DerOctetString(iv ?? new byte[8]); + m_keyLength = new DerInteger(keyLength); + } + + public Asn1OctetString IV => m_iv; - public byte[] GetIV() => Arrays.Clone(iv.GetOctets()); + public byte[] GetIV() => Arrays.Clone(m_iv.GetOctets()); - public int KeyLength - { - get { return keyLength.IntValueExact; } - } + public int KeyLength => m_keyLength.IntValueExact; /** * Produce an object suitable for an Asn1OutputStream. @@ -67,7 +63,15 @@ namespace Org.BouncyCastle.Asn1.Misc */ public override Asn1Object ToAsn1Object() { - return new DerSequence(iv, keyLength); + return IsDefaultIV(m_iv) + ? new DerSequence(m_keyLength) + : new DerSequence(m_iv, m_keyLength); + } + + private static bool IsDefaultIV(Asn1OctetString iv) + { + return iv.GetOctetsLength() == 8 + && Arrays.AreAllZeroes(iv.GetOctets(), 0, 8); } } } |