diff --git a/crypto/BouncyCastle.Android.csproj b/crypto/BouncyCastle.Android.csproj
index 1cf0d8384..b327e9414 100644
--- a/crypto/BouncyCastle.Android.csproj
+++ b/crypto/BouncyCastle.Android.csproj
@@ -69,6 +69,7 @@
<Compile Include="src\asn1\Asn1InputStream.cs" />
<Compile Include="src\asn1\Asn1Null.cs" />
<Compile Include="src\asn1\Asn1Object.cs" />
+ <Compile Include="src\asn1\Asn1ObjectDescriptor.cs" />
<Compile Include="src\asn1\Asn1OctetString.cs" />
<Compile Include="src\asn1\Asn1OutputStream.cs" />
<Compile Include="src\asn1\Asn1ParsingException.cs" />
diff --git a/crypto/BouncyCastle.csproj b/crypto/BouncyCastle.csproj
index a7dee10ff..1db300922 100644
--- a/crypto/BouncyCastle.csproj
+++ b/crypto/BouncyCastle.csproj
@@ -63,6 +63,7 @@
<Compile Include="src\asn1\Asn1InputStream.cs" />
<Compile Include="src\asn1\Asn1Null.cs" />
<Compile Include="src\asn1\Asn1Object.cs" />
+ <Compile Include="src\asn1\Asn1ObjectDescriptor.cs" />
<Compile Include="src\asn1\Asn1OctetString.cs" />
<Compile Include="src\asn1\Asn1OutputStream.cs" />
<Compile Include="src\asn1\Asn1ParsingException.cs" />
diff --git a/crypto/BouncyCastle.iOS.csproj b/crypto/BouncyCastle.iOS.csproj
index 5fbdb6d27..33bbdcf57 100644
--- a/crypto/BouncyCastle.iOS.csproj
+++ b/crypto/BouncyCastle.iOS.csproj
@@ -64,6 +64,7 @@
<Compile Include="src\asn1\Asn1InputStream.cs" />
<Compile Include="src\asn1\Asn1Null.cs" />
<Compile Include="src\asn1\Asn1Object.cs" />
+ <Compile Include="src\asn1\Asn1ObjectDescriptor.cs" />
<Compile Include="src\asn1\Asn1OctetString.cs" />
<Compile Include="src\asn1\Asn1OutputStream.cs" />
<Compile Include="src\asn1\Asn1ParsingException.cs" />
diff --git a/crypto/crypto.csproj b/crypto/crypto.csproj
index 173b4eef2..5e9459310 100644
--- a/crypto/crypto.csproj
+++ b/crypto/crypto.csproj
@@ -179,6 +179,11 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "src\asn1\Asn1ObjectDescriptor.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "src\asn1\ASN1OctetString.cs"
SubType = "Code"
BuildAction = "Compile"
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));
+ }
+ }
+}
|