summary refs log tree commit diff
path: root/crypto
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2021-11-06 16:38:28 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2021-11-06 16:38:28 +0700
commit142674bc475ef138a077644fc2296de2c067b73d (patch)
tree7f31599763a687d45345655623e6f7fb8f801610 /crypto
parentDerGraphicString refactoring (diff)
downloadBouncyCastle.NET-ed25519-142674bc475ef138a077644fc2296de2c067b73d.tar.xz
Add Asn1ObjectDescriptor
Diffstat (limited to 'crypto')
-rw-r--r--crypto/BouncyCastle.Android.csproj1
-rw-r--r--crypto/BouncyCastle.csproj1
-rw-r--r--crypto/BouncyCastle.iOS.csproj1
-rw-r--r--crypto/crypto.csproj5
-rw-r--r--crypto/src/asn1/Asn1ObjectDescriptor.cs108
5 files changed, 116 insertions, 0 deletions
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));
+        }
+    }
+}