summary refs log tree commit diff
path: root/crypto/src/asn1
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/src/asn1
parentDerGraphicString refactoring (diff)
downloadBouncyCastle.NET-ed25519-142674bc475ef138a077644fc2296de2c067b73d.tar.xz
Add Asn1ObjectDescriptor
Diffstat (limited to 'crypto/src/asn1')
-rw-r--r--crypto/src/asn1/Asn1ObjectDescriptor.cs108
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));
+        }
+    }
+}