diff options
Diffstat (limited to 'crypto/src/asn1/pkcs/SafeBag.cs')
-rw-r--r-- | crypto/src/asn1/pkcs/SafeBag.cs | 75 |
1 files changed, 34 insertions, 41 deletions
diff --git a/crypto/src/asn1/pkcs/SafeBag.cs b/crypto/src/asn1/pkcs/SafeBag.cs index 8b35a6717..9f8dbb8cc 100644 --- a/crypto/src/asn1/pkcs/SafeBag.cs +++ b/crypto/src/asn1/pkcs/SafeBag.cs @@ -1,7 +1,5 @@ using System; -using Org.BouncyCastle.Asn1; - namespace Org.BouncyCastle.Asn1.Pkcs { public class SafeBag @@ -9,65 +7,60 @@ namespace Org.BouncyCastle.Asn1.Pkcs { public static SafeBag GetInstance(object obj) { - if (obj is SafeBag) - return (SafeBag)obj; if (obj == null) return null; + if (obj is SafeBag safeBag) + return safeBag; return new SafeBag(Asn1Sequence.GetInstance(obj)); } - private readonly DerObjectIdentifier bagID; - private readonly Asn1Object bagValue; - private readonly Asn1Set bagAttributes; + public static SafeBag GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) + { + return new SafeBag(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); + } + + private readonly DerObjectIdentifier m_bagID; + private readonly Asn1Object m_bagValue; + private readonly Asn1Set m_bagAttributes; - public SafeBag( - DerObjectIdentifier oid, - Asn1Object obj) + private SafeBag(Asn1Sequence seq) { - this.bagID = oid; - this.bagValue = obj; - this.bagAttributes = null; + int count = seq.Count, pos = 0; + if (count < 2 || count > 3) + throw new ArgumentException("Bad sequence size: " + count, nameof(seq)); + + m_bagID = DerObjectIdentifier.GetInstance(seq[pos++]); + m_bagValue = Asn1TaggedObject.GetInstance(seq[pos++], Asn1Tags.ContextSpecific, 0) + .GetExplicitBaseObject().ToAsn1Object(); + m_bagAttributes = Asn1Utilities.ReadOptional(seq, ref pos, Asn1Set.GetOptional); + + if (pos != count) + throw new ArgumentException("Unexpected elements in sequence", nameof(seq)); } - public SafeBag( - DerObjectIdentifier oid, - Asn1Object obj, - Asn1Set bagAttributes) + public SafeBag(DerObjectIdentifier oid, Asn1Object obj) + : this(oid, obj, null) { - this.bagID = oid; - this.bagValue = obj; - this.bagAttributes = bagAttributes; } - private SafeBag(Asn1Sequence seq) + public SafeBag(DerObjectIdentifier oid, Asn1Object obj, Asn1Set bagAttributes) { - this.bagID = (DerObjectIdentifier)seq[0]; - this.bagValue = ((Asn1TaggedObject)seq[1]).GetExplicitBaseObject().ToAsn1Object(); - if (seq.Count == 3) - { - this.bagAttributes = (Asn1Set)seq[2]; - } + m_bagID = oid ?? throw new ArgumentNullException(nameof(oid)); + m_bagValue = obj ?? throw new ArgumentNullException(nameof(obj)); + m_bagAttributes = bagAttributes; } - public DerObjectIdentifier BagID - { - get { return bagID; } - } + public DerObjectIdentifier BagID => m_bagID; - public Asn1Object BagValue - { - get { return bagValue; } - } + public Asn1Object BagValue => m_bagValue; - public Asn1Set BagAttributes - { - get { return bagAttributes; } - } + public Asn1Set BagAttributes => m_bagAttributes; public override Asn1Object ToAsn1Object() { - Asn1EncodableVector v = new Asn1EncodableVector(bagID, new DerTaggedObject(0, bagValue)); - v.AddOptional(bagAttributes); + Asn1EncodableVector v = new Asn1EncodableVector(3); + v.Add(m_bagID, new DerTaggedObject(0, m_bagValue)); + v.AddOptional(m_bagAttributes); return new DerSequence(v); } } |