Asn1OctetString
using Org.BouncyCastle.Utilities;
using Org.BouncyCastle.Utilities.Encoders;
using System;
using System.IO;
namespace Org.BouncyCastle.Asn1
{
public abstract class Asn1OctetString : Asn1Object, Asn1OctetStringParser, IAsn1Convertible
{
internal class Meta : Asn1UniversalType
{
internal static readonly Asn1UniversalType Instance = new Meta();
private Meta()
: base(typeof(Asn1OctetString), 4)
{
}
internal override Asn1Object FromImplicitPrimitive(DerOctetString octetString)
{
return octetString;
}
internal override Asn1Object FromImplicitConstructed(Asn1Sequence sequence)
{
return sequence.ToAsn1OctetString();
}
}
internal static readonly byte[] EmptyOctets = Array.Empty<byte>();
internal readonly byte[] contents;
public Asn1OctetStringParser Parser => this;
public static Asn1OctetString GetInstance(object obj)
{
if (obj == null)
return null;
Asn1OctetString asn1OctetString = obj as Asn1OctetString;
if (asn1OctetString != null)
return asn1OctetString;
IAsn1Convertible asn1Convertible = obj as IAsn1Convertible;
if (asn1Convertible != null) {
if (!(obj is Asn1Object)) {
Asn1OctetString asn1OctetString2 = asn1Convertible.ToAsn1Object() as Asn1OctetString;
if (asn1OctetString2 != null)
return asn1OctetString2;
}
} else {
byte[] array = obj as byte[];
if (array != null)
try {
return (Asn1OctetString)Meta.Instance.FromByteArray(array);
} catch (IOException ex) {
throw new ArgumentException("failed to construct OCTET STRING from byte[]: " + ex.Message);
}
}
throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj), "obj");
}
public static Asn1OctetString GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return (Asn1OctetString)Meta.Instance.GetContextTagged(taggedObject, declaredExplicit);
}
public static Asn1OctetString GetOptional(Asn1Encodable element)
{
if (element == null)
throw new ArgumentNullException("element");
Asn1OctetString asn1OctetString = element as Asn1OctetString;
if (asn1OctetString != null)
return asn1OctetString;
return null;
}
public static Asn1OctetString GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return (Asn1OctetString)Meta.Instance.GetTagged(taggedObject, declaredExplicit);
}
internal Asn1OctetString(byte[] contents)
{
if (contents == null)
throw new ArgumentNullException("contents");
this.contents = contents;
}
internal Asn1OctetString(ReadOnlySpan<byte> contents)
{
this.contents = contents.ToArray();
}
public Stream GetOctetStream()
{
return new MemoryStream(contents, false);
}
public virtual byte[] GetOctets()
{
return contents;
}
public virtual int GetOctetsLength()
{
return GetOctets().Length;
}
internal ReadOnlyMemory<byte> GetOctetsMemory()
{
return GetOctets().AsMemory();
}
internal ReadOnlySpan<byte> GetOctetsSpan()
{
return GetOctets().AsSpan();
}
protected override int Asn1GetHashCode()
{
return Arrays.GetHashCode(GetOctets());
}
protected override bool Asn1Equals(Asn1Object asn1Object)
{
Asn1OctetString asn1OctetString = asn1Object as Asn1OctetString;
if (asn1OctetString != null)
return Arrays.AreEqual(GetOctets(), asn1OctetString.GetOctets());
return false;
}
public override string ToString()
{
return "#" + Hex.ToHexString(contents);
}
internal static Asn1OctetString CreatePrimitive(byte[] contents)
{
return DerOctetString.WithContents(contents);
}
}
}