diff options
Diffstat (limited to 'crypto/src/asn1')
-rw-r--r-- | crypto/src/asn1/Asn1ObjectDescriptor.cs | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/crypto/src/asn1/Asn1ObjectDescriptor.cs b/crypto/src/asn1/Asn1ObjectDescriptor.cs new file mode 100644 index 000000000..8472043e7 --- /dev/null +++ b/crypto/src/asn1/Asn1ObjectDescriptor.cs @@ -0,0 +1,108 @@ +using System; + +using Org.BouncyCastle.Utilities; + +namespace Org.BouncyCastle.Asn1 +{ + public sealed class Asn1ObjectDescriptor + : Asn1Object + { + /** + * Return an ObjectDescriptor from the passed in object. + * + * @param obj an ASN1ObjectDescriptor or an object that can be converted into one. + * @exception IllegalArgumentException if the object cannot be converted. + * @return an ASN1ObjectDescriptor instance, or null. + */ + public static Asn1ObjectDescriptor GetInstance(object obj) + { + if (obj == null || obj is Asn1ObjectDescriptor) + { + return (Asn1ObjectDescriptor)obj; + } + else if (obj is Asn1Encodable) + { + Asn1Object asn1 = ((Asn1Encodable)obj).ToAsn1Object(); + if (asn1 is Asn1ObjectDescriptor) + return (Asn1ObjectDescriptor)asn1; + } + if (obj is byte[]) + { + try + { + return GetInstance(FromByteArray((byte[])obj)); + } + catch (Exception e) + { + throw new ArgumentException("encoding error in GetInstance: " + e.ToString(), "obj"); + } + } + + throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj), "obj"); + } + + /** + * Return an ObjectDescriptor from a tagged object. + * + * @param taggedObject the tagged object holding the object we want. + * @param explicit true if the object is meant to be explicitly tagged, + * false otherwise. + * @exception IllegalArgumentException if the tagged object cannot be converted. + * @return an ASN1ObjectDescriptor instance, or null. + */ + public static Asn1ObjectDescriptor GetInstance(Asn1TaggedObject taggedObject, bool isExplicit) + { + Asn1Object baseObject = taggedObject.GetObject(); + + if (isExplicit || baseObject is Asn1ObjectDescriptor) + { + return GetInstance(baseObject); + } + + return new Asn1ObjectDescriptor(new DerGraphicString(((Asn1OctetString)baseObject).GetOctets())); + } + + private readonly DerGraphicString m_baseGraphicString; + + public Asn1ObjectDescriptor(DerGraphicString baseGraphicString) + { + if (null == baseGraphicString) + throw new ArgumentNullException("baseGraphicString"); + + this.m_baseGraphicString = baseGraphicString; + } + + public DerGraphicString BaseGraphicString + { + get { return m_baseGraphicString; } + } + + internal override int EncodedLength(bool withID) + { + return m_baseGraphicString.EncodedLength(withID); + } + + internal override void Encode(Asn1OutputStream asn1Out, bool withID) + { + asn1Out.WriteIdentifier(withID, Asn1Tags.ObjectDescriptor); + m_baseGraphicString.Encode(asn1Out, false); + } + + protected override int Asn1GetHashCode() + { + return ~m_baseGraphicString.CallAsn1GetHashCode(); + } + + protected override bool Asn1Equals(Asn1Object asn1Object) + { + Asn1ObjectDescriptor that = asn1Object as Asn1ObjectDescriptor; + return null != that + && this.m_baseGraphicString.CallAsn1Equals(that.m_baseGraphicString); + } + + internal static Asn1ObjectDescriptor CreatePrimitive(byte[] contents) + { + return new Asn1ObjectDescriptor(DerGraphicString.CreatePrimitive(contents)); + } + } +} |