提交Unity 联机Pro

This commit is contained in:
PC-20230316NUNE\Administrator
2024-08-17 14:27:18 +08:00
parent f00193b000
commit 894100ae37
7448 changed files with 854473 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public abstract class Asn1Generator
{
private Stream _out;
protected Asn1Generator(
Stream outStream)
{
_out = outStream;
}
protected Stream Out
{
get { return _out; }
}
public abstract void AddObject(Asn1Encodable obj);
public abstract void AddObject(Asn1Object obj);
public abstract Stream GetRawOutputStream();
public abstract void Close();
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bdc81b96ab45ff94098a67c1dcf27e23
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,17 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public interface Asn1OctetStringParser
: IAsn1Convertible
{
/// <summary>Return the content of the OCTET STRING as a <see cref="Stream"/>.</summary>
/// <returns>A <see cref="Stream"/> represnting the OCTET STRING's content.</returns>
Stream GetOctetStream();
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cc7b00883ebe075438a06d46defe0b35
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public interface Asn1SequenceParser
: IAsn1Convertible
{
IAsn1Convertible ReadObject();
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 945f35756f280754580483acdd35d1f3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public interface Asn1SetParser
: IAsn1Convertible
{
IAsn1Convertible ReadObject();
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e5c4059ebe7ac0240878ec76e191d1ad
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,248 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class Asn1StreamParser
{
private readonly Stream _in;
private readonly int _limit;
private readonly byte[][] tmpBuffers;
public Asn1StreamParser(Stream input)
: this(input, Asn1InputStream.FindLimit(input))
{
}
public Asn1StreamParser(byte[] encoding)
: this(new MemoryStream(encoding, false), encoding.Length)
{
}
public Asn1StreamParser(Stream input, int limit)
: this(input, limit, new byte[16][])
{
}
internal Asn1StreamParser(Stream input, int limit, byte[][] tmpBuffers)
{
if (!input.CanRead)
throw new ArgumentException("Expected stream to be readable", "input");
this._in = input;
this._limit = limit;
this.tmpBuffers = tmpBuffers;
}
public virtual IAsn1Convertible ReadObject()
{
int tagHdr = _in.ReadByte();
if (tagHdr < 0)
return null;
return ImplParseObject(tagHdr);
}
internal IAsn1Convertible ImplParseObject(int tagHdr)
{
// turn off looking for "00" while we resolve the tag
Set00Check(false);
//
// calculate tag number
//
int tagNo = Asn1InputStream.ReadTagNumber(_in, tagHdr);
//
// calculate length
//
int length = Asn1InputStream.ReadLength(_in, _limit,
tagNo == Asn1Tags.BitString || tagNo == Asn1Tags.OctetString || tagNo == Asn1Tags.Sequence ||
tagNo == Asn1Tags.Set || tagNo == Asn1Tags.External);
if (length < 0) // indefinite-length method
{
if (0 == (tagHdr & Asn1Tags.Constructed))
throw new IOException("indefinite-length primitive encoding encountered");
IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(_in, _limit);
Asn1StreamParser sp = new Asn1StreamParser(indIn, _limit, tmpBuffers);
int tagClass = tagHdr & Asn1Tags.Private;
if (0 != tagClass)
return new BerTaggedObjectParser(tagClass, tagNo, sp);
return sp.ParseImplicitConstructedIL(tagNo);
}
else
{
DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(_in, length, _limit);
if (0 == (tagHdr & Asn1Tags.Flags))
return ParseImplicitPrimitive(tagNo, defIn);
Asn1StreamParser sp = new Asn1StreamParser(defIn, defIn.Remaining, tmpBuffers);
int tagClass = tagHdr & Asn1Tags.Private;
if (0 != tagClass)
{
bool isConstructed = (tagHdr & Asn1Tags.Constructed) != 0;
return new DLTaggedObjectParser(tagClass, tagNo, isConstructed, sp);
}
return sp.ParseImplicitConstructedDL(tagNo);
}
}
internal Asn1Object LoadTaggedDL(int tagClass, int tagNo, bool constructed)
{
if (!constructed)
{
byte[] contentsOctets = ((DefiniteLengthInputStream)_in).ToArray();
return Asn1TaggedObject.CreatePrimitive(tagClass, tagNo, contentsOctets);
}
Asn1EncodableVector contentsElements = ReadVector();
return Asn1TaggedObject.CreateConstructedDL(tagClass, tagNo, contentsElements);
}
internal Asn1Object LoadTaggedIL(int tagClass, int tagNo)
{
Asn1EncodableVector contentsElements = ReadVector();
return Asn1TaggedObject.CreateConstructedIL(tagClass, tagNo, contentsElements);
}
internal IAsn1Convertible ParseImplicitConstructedDL(int univTagNo)
{
switch (univTagNo)
{
case Asn1Tags.BitString:
// TODO[asn1] DLConstructedBitStringParser
return new BerBitStringParser(this);
case Asn1Tags.External:
return new DerExternalParser(this);
case Asn1Tags.OctetString:
// TODO[asn1] DLConstructedOctetStringParser
return new BerOctetStringParser(this);
case Asn1Tags.Set:
return new DerSetParser(this);
case Asn1Tags.Sequence:
return new DerSequenceParser(this);
default:
throw new Asn1Exception("unknown DL object encountered: 0x" + univTagNo.ToString("X"));
}
}
internal IAsn1Convertible ParseImplicitConstructedIL(int univTagNo)
{
switch (univTagNo)
{
case Asn1Tags.BitString:
return new BerBitStringParser(this);
case Asn1Tags.External:
// TODO[asn1] BERExternalParser
return new DerExternalParser(this);
case Asn1Tags.OctetString:
return new BerOctetStringParser(this);
case Asn1Tags.Sequence:
return new BerSequenceParser(this);
case Asn1Tags.Set:
return new BerSetParser(this);
default:
throw new Asn1Exception("unknown BER object encountered: 0x" + univTagNo.ToString("X"));
}
}
internal IAsn1Convertible ParseImplicitPrimitive(int univTagNo)
{
return ParseImplicitPrimitive(univTagNo, (DefiniteLengthInputStream)_in);
}
internal IAsn1Convertible ParseImplicitPrimitive(int univTagNo, DefiniteLengthInputStream defIn)
{
// Some primitive encodings can be handled by parsers too...
switch (univTagNo)
{
case Asn1Tags.BitString:
return new DLBitStringParser(defIn);
case Asn1Tags.External:
throw new Asn1Exception("externals must use constructed encoding (see X.690 8.18)");
case Asn1Tags.OctetString:
return new DerOctetStringParser(defIn);
case Asn1Tags.Set:
throw new Asn1Exception("sequences must use constructed encoding (see X.690 8.9.1/8.10.1)");
case Asn1Tags.Sequence:
throw new Asn1Exception("sets must use constructed encoding (see X.690 8.11.1/8.12.1)");
}
try
{
return Asn1InputStream.CreatePrimitiveDerObject(univTagNo, defIn, tmpBuffers);
}
catch (ArgumentException e)
{
throw new Asn1Exception("corrupted stream detected", e);
}
}
internal IAsn1Convertible ParseObject(int univTagNo)
{
if (univTagNo < 0 || univTagNo > 30)
throw new ArgumentException("invalid universal tag number: " + univTagNo, "univTagNo");
int tagHdr = _in.ReadByte();
if (tagHdr < 0)
return null;
if ((tagHdr & ~Asn1Tags.Constructed) != univTagNo)
throw new IOException("unexpected identifier encountered: " + tagHdr);
return ImplParseObject(tagHdr);
}
internal Asn1TaggedObjectParser ParseTaggedObject()
{
int tagHdr = _in.ReadByte();
if (tagHdr< 0)
return null;
int tagClass = tagHdr & Asn1Tags.Private;
if (0 == tagClass)
throw new Asn1Exception("no tagged object found");
return (Asn1TaggedObjectParser)ImplParseObject(tagHdr);
}
// TODO[asn1] Prefer 'LoadVector'
internal Asn1EncodableVector ReadVector()
{
int tagHdr = _in.ReadByte();
if (tagHdr < 0)
return new Asn1EncodableVector(0);
Asn1EncodableVector v = new Asn1EncodableVector();
do
{
IAsn1Convertible obj = ImplParseObject(tagHdr);
v.Add(obj.ToAsn1Object());
}
while ((tagHdr = _in.ReadByte()) >= 0);
return v;
}
private void Set00Check(bool enabled)
{
if (_in is IndefiniteLengthInputStream indef)
{
indef.SetEofOn00(enabled);
}
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 12d648f2463b0b34a8a0756dbb9d6bfb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,39 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public interface Asn1TaggedObjectParser
: IAsn1Convertible
{
int TagClass { get; }
int TagNo { get; }
bool HasContextTag(int tagNo);
bool HasTag(int tagClass, int tagNo);
/// <exception cref="IOException"/>
IAsn1Convertible ParseBaseUniversal(bool declaredExplicit, int baseTagNo);
/// <summary>Needed for open types, until we have better type-guided parsing support.</summary>
/// <remarks>
/// Use sparingly for other purposes, and prefer <see cref="ParseExplicitBaseTagged"/> or
/// <see cref="ParseBaseUniversal(bool, int)"/> where possible. Before using, check for matching tag
/// <see cref="TagClass">class</see> and <see cref="TagNo">number</see>.
/// </remarks>
/// <exception cref="IOException"/>
IAsn1Convertible ParseExplicitBaseObject();
/// <exception cref="IOException"/>
Asn1TaggedObjectParser ParseExplicitBaseTagged();
/// <exception cref="IOException"/>
Asn1TaggedObjectParser ParseImplicitBaseTagged(int baseTagClass, int baseTagNo);
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e183ed6c26f0fac4caebd14e56080e86
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,36 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public interface Asn1BitStringParser
: IAsn1Convertible
{
/// <summary>Return a <see cref="Stream"/> representing the contents of the BIT STRING. The final byte, if any,
/// may include pad bits. See <see cref="PadBits"/>.</summary>
/// <returns>A <see cref="Stream"/> with its source as the BIT STRING content.</returns>
/// <exception cref="IOException"/>
Stream GetBitStream();
/// <summary>Return a <see cref="Stream"/> representing the contents of the BIT STRING, where the content is
/// expected to be octet-aligned (this will be automatically checked during parsing).</summary>
/// <returns>A <see cref="Stream"/> with its source as the BIT STRING content.</returns>
/// <exception cref="IOException"/>
Stream GetOctetStream();
/// <summary>Return the number of pad bits, if any, in the final byte, if any, read from
/// <see cref="GetBitStream"/>.</summary>
/// <remarks>
/// This number is in the range zero to seven. That number of the least significant bits of the final byte, if
/// any, are not part of the contents and should be ignored. NOTE: Must be called AFTER the stream has been
/// fully processed. (Does not need to be called if <see cref="GetOctetStream"/> was used instead of
/// <see cref="GetBitStream"/>.
/// </remarks>
/// <returns>The number of pad bits. In the range zero to seven.</returns>
int PadBits { get; }
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 24137e6820af97b4bb29831a34398f8f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,80 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public abstract class Asn1Encodable
: IAsn1Convertible
{
public const string Der = "DER";
public const string Ber = "BER";
public virtual void EncodeTo(Stream output)
{
ToAsn1Object().EncodeTo(output);
}
public virtual void EncodeTo(Stream output, string encoding)
{
ToAsn1Object().EncodeTo(output, encoding);
}
public byte[] GetEncoded()
{
MemoryStream bOut = new MemoryStream();
ToAsn1Object().EncodeTo(bOut);
return bOut.ToArray();
}
public byte[] GetEncoded(string encoding)
{
MemoryStream bOut = new MemoryStream();
ToAsn1Object().EncodeTo(bOut, encoding);
return bOut.ToArray();
}
/**
* Return the DER encoding of the object, null if the DER encoding can not be made.
*
* @return a DER byte array, null otherwise.
*/
public byte[] GetDerEncoded()
{
try
{
return GetEncoded(Der);
}
catch (IOException)
{
return null;
}
}
public sealed override int GetHashCode()
{
return ToAsn1Object().CallAsn1GetHashCode();
}
public sealed override bool Equals(
object obj)
{
if (obj == this)
return true;
IAsn1Convertible other = obj as IAsn1Convertible;
if (other == null)
return false;
Asn1Object o1 = ToAsn1Object();
Asn1Object o2 = other.ToAsn1Object();
return o1 == o2 || (null != o2 && o1.CallAsn1Equals(o2));
}
public abstract Asn1Object ToAsn1Object();
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1b69b682df6ac1845b77ec1b6bf0427d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,248 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Collections.Generic;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
/**
* Mutable class for building ASN.1 constructed objects such as SETs or SEQUENCEs.
*/
public class Asn1EncodableVector
: IEnumerable<Asn1Encodable>
{
internal static readonly Asn1Encodable[] EmptyElements = new Asn1Encodable[0];
private const int DefaultCapacity = 10;
private Asn1Encodable[] elements;
private int elementCount;
private bool copyOnWrite;
public static Asn1EncodableVector FromEnumerable(IEnumerable<Asn1Encodable> e)
{
Asn1EncodableVector v = new Asn1EncodableVector();
foreach (Asn1Encodable obj in e)
{
v.Add(obj);
}
return v;
}
public Asn1EncodableVector()
: this(DefaultCapacity)
{
}
public Asn1EncodableVector(int initialCapacity)
{
if (initialCapacity < 0)
throw new ArgumentException("must not be negative", "initialCapacity");
this.elements = (initialCapacity == 0) ? EmptyElements : new Asn1Encodable[initialCapacity];
this.elementCount = 0;
this.copyOnWrite = false;
}
public Asn1EncodableVector(Asn1Encodable element)
: this()
{
Add(element);
}
public Asn1EncodableVector(Asn1Encodable element1, Asn1Encodable element2)
: this()
{
Add(element1);
Add(element2);
}
public Asn1EncodableVector(params Asn1Encodable[] v)
: this()
{
Add(v);
}
public void Add(Asn1Encodable element)
{
if (null == element)
throw new ArgumentNullException("element");
int capacity = elements.Length;
int minCapacity = elementCount + 1;
if ((minCapacity > capacity) | copyOnWrite)
{
Reallocate(minCapacity);
}
this.elements[elementCount] = element;
this.elementCount = minCapacity;
}
public void Add(Asn1Encodable element1, Asn1Encodable element2)
{
Add(element1);
Add(element2);
}
public void Add(params Asn1Encodable[] objs)
{
foreach (Asn1Encodable obj in objs)
{
Add(obj);
}
}
public void AddOptional(Asn1Encodable element)
{
if (element != null)
{
Add(element);
}
}
public void AddOptional(Asn1Encodable element1, Asn1Encodable element2)
{
if (element1 != null)
{
Add(element1);
}
if (element2 != null)
{
Add(element2);
}
}
public void AddOptional(params Asn1Encodable[] elements)
{
if (elements != null)
{
foreach (var element in elements)
{
if (element != null)
{
Add(element);
}
}
}
}
public void AddOptionalTagged(bool isExplicit, int tagNo, Asn1Encodable obj)
{
if (null != obj)
{
Add(new DerTaggedObject(isExplicit, tagNo, obj));
}
}
public void AddOptionalTagged(bool isExplicit, int tagClass, int tagNo, Asn1Encodable obj)
{
if (null != obj)
{
Add(new DerTaggedObject(isExplicit, tagClass, tagNo, obj));
}
}
public void AddAll(Asn1EncodableVector other)
{
if (null == other)
throw new ArgumentNullException("other");
int otherElementCount = other.Count;
if (otherElementCount < 1)
return;
int capacity = elements.Length;
int minCapacity = elementCount + otherElementCount;
if ((minCapacity > capacity) | copyOnWrite)
{
Reallocate(minCapacity);
}
int i = 0;
do
{
Asn1Encodable otherElement = other[i];
if (null == otherElement)
throw new NullReferenceException("'other' elements cannot be null");
this.elements[elementCount + i] = otherElement;
}
while (++i < otherElementCount);
this.elementCount = minCapacity;
}
public Asn1Encodable this[int index]
{
get
{
if (index >= elementCount)
throw new IndexOutOfRangeException(index + " >= " + elementCount);
return elements[index];
}
}
public int Count
{
get { return elementCount; }
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<Asn1Encodable> GetEnumerator()
{
IEnumerable<Asn1Encodable> e = CopyElements();
return e.GetEnumerator();
}
internal Asn1Encodable[] CopyElements()
{
if (0 == elementCount)
return EmptyElements;
Asn1Encodable[] copy = new Asn1Encodable[elementCount];
Array.Copy(elements, 0, copy, 0, elementCount);
return copy;
}
internal Asn1Encodable[] TakeElements()
{
if (0 == elementCount)
return EmptyElements;
if (elements.Length == elementCount)
{
this.copyOnWrite = true;
return elements;
}
Asn1Encodable[] copy = new Asn1Encodable[elementCount];
Array.Copy(elements, 0, copy, 0, elementCount);
return copy;
}
private void Reallocate(int minCapacity)
{
int oldCapacity = elements.Length;
int newCapacity = System.Math.Max(oldCapacity, minCapacity + (minCapacity >> 1));
Asn1Encodable[] copy = new Asn1Encodable[newCapacity];
Array.Copy(elements, 0, copy, 0, elementCount);
this.elements = copy;
this.copyOnWrite = false;
}
internal static Asn1Encodable[] CloneElements(Asn1Encodable[] elements)
{
return elements.Length < 1 ? EmptyElements : (Asn1Encodable[])elements.Clone();
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e3245f80405a56e41ad1c7af42022aea
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,35 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using System.Runtime.Serialization;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
[Serializable]
public class Asn1Exception
: IOException
{
public Asn1Exception()
: base()
{
}
public Asn1Exception(string message)
: base(message)
{
}
public Asn1Exception(string message, Exception innerException)
: base(message, innerException)
{
}
protected Asn1Exception(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bbd822b3cbfd4b643a313c46df1ee0a7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,266 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Globalization;
using System.IO;
using System.Text;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
/// <summary>GeneralizedTime ASN.1 type</summary>
public class Asn1GeneralizedTime
: Asn1Object
{
internal class Meta : Asn1UniversalType
{
internal static readonly Asn1UniversalType Instance = new Meta();
private Meta() : base(typeof(Asn1GeneralizedTime), Asn1Tags.GeneralizedTime) { }
internal override Asn1Object FromImplicitPrimitive(DerOctetString octetString)
{
return CreatePrimitive(octetString.GetOctets());
}
}
public static Asn1GeneralizedTime GetInstance(object obj)
{
if (obj == null)
return null;
if (obj is Asn1GeneralizedTime asn1GeneralizedTime)
return asn1GeneralizedTime;
if (obj is IAsn1Convertible asn1Convertible)
{
Asn1Object asn1Object = asn1Convertible.ToAsn1Object();
if (asn1Object is Asn1GeneralizedTime converted)
return converted;
}
else if (obj is byte[] bytes)
{
try
{
return (Asn1GeneralizedTime)Meta.Instance.FromByteArray(bytes);
}
catch (IOException e)
{
throw new ArgumentException("failed to construct generalized time from byte[]: " + e.Message);
}
}
throw new ArgumentException("illegal object in GetInstance: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(obj), nameof(obj));
}
public static Asn1GeneralizedTime GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return (Asn1GeneralizedTime)Meta.Instance.GetContextInstance(taggedObject, declaredExplicit);
}
private readonly string m_timeString;
private readonly bool m_timeStringCanonical;
private readonly DateTime m_dateTime;
public Asn1GeneralizedTime(string timeString)
{
m_timeString = timeString ?? throw new ArgumentNullException(nameof(timeString));
m_timeStringCanonical = false; // TODO Dynamic check?
try
{
m_dateTime = FromString(timeString);
}
catch (FormatException e)
{
throw new ArgumentException("invalid date string: " + e.Message);
}
}
public Asn1GeneralizedTime(DateTime dateTime)
{
dateTime = dateTime.ToUniversalTime();
m_dateTime = dateTime;
m_timeString = ToStringCanonical(dateTime);
m_timeStringCanonical = true;
}
// TODO TimeZoneInfo or other locale-specific constructors?
internal Asn1GeneralizedTime(byte[] contents)
: this(Encoding.ASCII.GetString(contents))
{
}
public string TimeString => m_timeString;
public DateTime ToDateTime()
{
return m_dateTime;
}
internal byte[] GetContents(int encoding)
{
if (encoding == Asn1OutputStream.EncodingDer && !m_timeStringCanonical)
return Encoding.ASCII.GetBytes(ToStringCanonical(m_dateTime));
return Encoding.ASCII.GetBytes(m_timeString);
}
internal override IAsn1Encoding GetEncoding(int encoding)
{
return new PrimitiveEncoding(Asn1Tags.Universal, Asn1Tags.GeneralizedTime, GetContents(encoding));
}
internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo)
{
return new PrimitiveEncoding(tagClass, tagNo, GetContents(encoding));
}
protected override bool Asn1Equals(Asn1Object asn1Object)
{
if (!(asn1Object is Asn1GeneralizedTime that))
return false;
// TODO Performance
return Arrays.AreEqual(
this.GetContents(Asn1OutputStream.EncodingDer),
that.GetContents(Asn1OutputStream.EncodingDer));
}
protected override int Asn1GetHashCode()
{
// TODO Performance
return Arrays.GetHashCode(
this.GetContents(Asn1OutputStream.EncodingDer));
}
internal static Asn1GeneralizedTime CreatePrimitive(byte[] contents)
{
return new Asn1GeneralizedTime(contents);
}
private static DateTime FromString(string s)
{
if (s.Length < 10)
throw new FormatException();
s = s.Replace(',', '.');
if (Org.BouncyCastle.Utilities.Platform.EndsWith(s, "Z"))
{
switch (s.Length)
{
case 11: return ParseUtc(s, @"yyyyMMddHH\Z");
case 13: return ParseUtc(s, @"yyyyMMddHHmm\Z");
case 15: return ParseUtc(s, @"yyyyMMddHHmmss\Z");
case 17: return ParseUtc(s, @"yyyyMMddHHmmss.f\Z");
case 18: return ParseUtc(s, @"yyyyMMddHHmmss.ff\Z");
case 19: return ParseUtc(s, @"yyyyMMddHHmmss.fff\Z");
case 20: return ParseUtc(s, @"yyyyMMddHHmmss.ffff\Z");
case 21: return ParseUtc(s, @"yyyyMMddHHmmss.fffff\Z");
case 22: return ParseUtc(s, @"yyyyMMddHHmmss.ffffff\Z");
case 23: return ParseUtc(s, @"yyyyMMddHHmmss.fffffff\Z");
default:
throw new FormatException();
}
}
int signIndex = IndexOfSign(s, System.Math.Max(10, s.Length - 5));
if (signIndex < 0)
{
switch (s.Length)
{
case 10: return ParseLocal(s, @"yyyyMMddHH");
case 12: return ParseLocal(s, @"yyyyMMddHHmm");
case 14: return ParseLocal(s, @"yyyyMMddHHmmss");
case 16: return ParseLocal(s, @"yyyyMMddHHmmss.f");
case 17: return ParseLocal(s, @"yyyyMMddHHmmss.ff");
case 18: return ParseLocal(s, @"yyyyMMddHHmmss.fff");
case 19: return ParseLocal(s, @"yyyyMMddHHmmss.ffff");
case 20: return ParseLocal(s, @"yyyyMMddHHmmss.fffff");
case 21: return ParseLocal(s, @"yyyyMMddHHmmss.ffffff");
case 22: return ParseLocal(s, @"yyyyMMddHHmmss.fffffff");
default:
throw new FormatException();
}
}
if (signIndex == s.Length - 5)
{
switch (s.Length)
{
case 15: return ParseTimeZone(s, @"yyyyMMddHHzzz");
case 17: return ParseTimeZone(s, @"yyyyMMddHHmmzzz");
case 19: return ParseTimeZone(s, @"yyyyMMddHHmmsszzz");
case 21: return ParseTimeZone(s, @"yyyyMMddHHmmss.fzzz");
case 22: return ParseTimeZone(s, @"yyyyMMddHHmmss.ffzzz");
case 23: return ParseTimeZone(s, @"yyyyMMddHHmmss.fffzzz");
case 24: return ParseTimeZone(s, @"yyyyMMddHHmmss.ffffzzz");
case 25: return ParseTimeZone(s, @"yyyyMMddHHmmss.fffffzzz");
case 26: return ParseTimeZone(s, @"yyyyMMddHHmmss.ffffffzzz");
case 27: return ParseTimeZone(s, @"yyyyMMddHHmmss.fffffffzzz");
default:
throw new FormatException();
}
}
if (signIndex == s.Length - 3)
{
switch (s.Length)
{
case 13: return ParseTimeZone(s, @"yyyyMMddHHzz");
case 15: return ParseTimeZone(s, @"yyyyMMddHHmmzz");
case 17: return ParseTimeZone(s, @"yyyyMMddHHmmsszz");
case 19: return ParseTimeZone(s, @"yyyyMMddHHmmss.fzz");
case 20: return ParseTimeZone(s, @"yyyyMMddHHmmss.ffzz");
case 21: return ParseTimeZone(s, @"yyyyMMddHHmmss.fffzz");
case 22: return ParseTimeZone(s, @"yyyyMMddHHmmss.ffffzz");
case 23: return ParseTimeZone(s, @"yyyyMMddHHmmss.fffffzz");
case 24: return ParseTimeZone(s, @"yyyyMMddHHmmss.ffffffzz");
case 25: return ParseTimeZone(s, @"yyyyMMddHHmmss.fffffffzz");
default:
throw new FormatException();
}
}
throw new FormatException();
}
private static int IndexOfSign(string s, int startIndex)
{
int index = Org.BouncyCastle.Utilities.Platform.IndexOf(s, '+', startIndex);
if (index < 0)
{
index = Org.BouncyCastle.Utilities.Platform.IndexOf(s, '-', startIndex);
}
return index;
}
private static DateTime ParseLocal(string s, string format)
{
return DateTime.ParseExact(s, format, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AssumeLocal);
}
private static DateTime ParseTimeZone(string s, string format)
{
return DateTime.ParseExact(s, format, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AdjustToUniversal);
}
private static DateTime ParseUtc(string s, string format)
{
return DateTime.ParseExact(s, format, DateTimeFormatInfo.InvariantInfo,
DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
}
private static string ToStringCanonical(DateTime dateTime)
{
return dateTime.ToUniversalTime().ToString(@"yyyyMMddHHmmss.FFFFFFFK", DateTimeFormatInfo.InvariantInfo);
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d717ef26a13ca4645a37a12bf5d48229
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,471 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
/**
* a general purpose ASN.1 decoder - note: this class differs from the
* others in that it returns null after it has read the last object in
* the stream. If an ASN.1 Null is encountered a Der/BER Null object is
* returned.
*/
public class Asn1InputStream
: FilterStream
{
private readonly int limit;
internal byte[][] tmpBuffers;
internal static int FindLimit(Stream input)
{
if (input is LimitedInputStream limited)
return limited.Limit;
if (input is Asn1InputStream asn1)
return asn1.Limit;
if (input is MemoryStream memory)
return Convert.ToInt32(memory.Length - memory.Position);
return int.MaxValue;
}
public Asn1InputStream(Stream input)
: this(input, FindLimit(input))
{
}
/**
* Create an ASN1InputStream based on the input byte array. The length of DER objects in
* the stream is automatically limited to the length of the input array.
*
* @param input array containing ASN.1 encoded data.
*/
public Asn1InputStream(byte[] input)
: this(new MemoryStream(input, false), input.Length)
{
}
/**
* Create an ASN1InputStream where no DER object will be longer than limit.
*
* @param input stream containing ASN.1 encoded data.
* @param limit maximum size of a DER encoded object.
*/
public Asn1InputStream(Stream input, int limit)
: this(input, limit, new byte[16][])
{
}
internal Asn1InputStream(Stream input, int limit, byte[][] tmpBuffers)
: base(input)
{
this.limit = limit;
this.tmpBuffers = tmpBuffers;
}
protected override void Dispose(bool disposing)
{
tmpBuffers = null;
base.Dispose(disposing);
}
/**
* build an object given its tag and the number of bytes to construct it from.
*/
private Asn1Object BuildObject(int tagHdr, int tagNo, int length)
{
// TODO[asn1] Special-case zero length first?
DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(s, length, limit);
if (0 == (tagHdr & Asn1Tags.Flags))
return CreatePrimitiveDerObject(tagNo, defIn, tmpBuffers);
int tagClass = tagHdr & Asn1Tags.Private;
if (0 != tagClass)
{
bool isConstructed = (tagHdr & Asn1Tags.Constructed) != 0;
return ReadTaggedObjectDL(tagClass, tagNo, isConstructed, defIn);
}
switch (tagNo)
{
case Asn1Tags.BitString:
return BuildConstructedBitString(ReadVector(defIn));
case Asn1Tags.OctetString:
return BuildConstructedOctetString(ReadVector(defIn));
case Asn1Tags.Sequence:
return CreateDLSequence(defIn);
case Asn1Tags.Set:
return CreateDLSet(defIn);
case Asn1Tags.External:
return DLSequence.FromVector(ReadVector(defIn)).ToAsn1External();
default:
throw new IOException("unknown tag " + tagNo + " encountered");
}
}
internal Asn1Object ReadTaggedObjectDL(int tagClass, int tagNo, bool constructed, DefiniteLengthInputStream defIn)
{
if (!constructed)
{
byte[] contentsOctets = defIn.ToArray();
return Asn1TaggedObject.CreatePrimitive(tagClass, tagNo, contentsOctets);
}
Asn1EncodableVector contentsElements = ReadVector(defIn);
return Asn1TaggedObject.CreateConstructedDL(tagClass, tagNo, contentsElements);
}
internal virtual Asn1EncodableVector ReadVector()
{
Asn1Object o = ReadObject();
if (null == o)
return new Asn1EncodableVector(0);
Asn1EncodableVector v = new Asn1EncodableVector();
do
{
v.Add(o);
}
while ((o = ReadObject()) != null);
return v;
}
internal virtual Asn1EncodableVector ReadVector(DefiniteLengthInputStream defIn)
{
int remaining = defIn.Remaining;
if (remaining < 1)
return new Asn1EncodableVector(0);
return new Asn1InputStream(defIn, remaining, tmpBuffers).ReadVector();
}
internal virtual Asn1Sequence CreateDLSequence(DefiniteLengthInputStream defIn)
{
return DLSequence.FromVector(ReadVector(defIn));
}
internal virtual Asn1Set CreateDLSet(DefiniteLengthInputStream defIn)
{
return DLSet.FromVector(ReadVector(defIn));
}
public Asn1Object ReadObject()
{
int tagHdr = s.ReadByte();
if (tagHdr <= 0)
{
if (tagHdr == 0)
throw new IOException("unexpected end-of-contents marker");
return null;
}
int tagNo = ReadTagNumber(s, tagHdr);
int length = ReadLength(s, limit, false);
if (length >= 0)
{
// definite-length
try
{
return BuildObject(tagHdr, tagNo, length);
}
catch (ArgumentException e)
{
throw new Asn1Exception("corrupted stream detected", e);
}
}
// indefinite-length
if (0 == (tagHdr & Asn1Tags.Constructed))
throw new IOException("indefinite-length primitive encoding encountered");
IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(s, limit);
Asn1StreamParser sp = new Asn1StreamParser(indIn, limit, tmpBuffers);
int tagClass = tagHdr & Asn1Tags.Private;
if (0 != tagClass)
return sp.LoadTaggedIL(tagClass, tagNo);
switch (tagNo)
{
case Asn1Tags.BitString:
return BerBitStringParser.Parse(sp);
case Asn1Tags.OctetString:
return BerOctetStringParser.Parse(sp);
case Asn1Tags.Sequence:
return BerSequenceParser.Parse(sp);
case Asn1Tags.Set:
return BerSetParser.Parse(sp);
case Asn1Tags.External:
// TODO[asn1] BerExternalParser
return DerExternalParser.Parse(sp);
default:
throw new IOException("unknown BER object encountered");
}
}
internal virtual DerBitString BuildConstructedBitString(Asn1EncodableVector contentsElements)
{
DerBitString[] bitStrings = new DerBitString[contentsElements.Count];
for (int i = 0; i != bitStrings.Length; i++)
{
DerBitString bitString = contentsElements[i] as DerBitString;
if (null == bitString)
throw new Asn1Exception("unknown object encountered in constructed BIT STRING: "
+ Org.BouncyCastle.Utilities.Platform.GetTypeName(contentsElements[i]));
bitStrings[i] = bitString;
}
return new DLBitString(BerBitString.FlattenBitStrings(bitStrings), false);
}
internal virtual Asn1OctetString BuildConstructedOctetString(Asn1EncodableVector contentsElements)
{
Asn1OctetString[] octetStrings = new Asn1OctetString[contentsElements.Count];
for (int i = 0; i != octetStrings.Length; i++)
{
Asn1OctetString octetString = contentsElements[i] as Asn1OctetString;
if (null == octetString)
throw new Asn1Exception("unknown object encountered in constructed OCTET STRING: "
+ Org.BouncyCastle.Utilities.Platform.GetTypeName(contentsElements[i]));
octetStrings[i] = octetString;
}
// Note: No DLOctetString available
return new DerOctetString(BerOctetString.FlattenOctetStrings(octetStrings));
}
internal virtual int Limit
{
get { return limit; }
}
internal static int ReadTagNumber(Stream s, int tagHdr)
{
int tagNo = tagHdr & 0x1f;
//
// with tagged object tag number is bottom 5 bits, or stored at the start of the content
//
if (tagNo == 0x1f)
{
int b = s.ReadByte();
if (b < 31)
{
if (b < 0)
throw new EndOfStreamException("EOF found inside tag value.");
throw new IOException("corrupted stream - high tag number < 31 found");
}
tagNo = b & 0x7f;
// X.690-0207 8.1.2.4.2
// "c) bits 7 to 1 of the first subsequent octet shall not all be zero."
if (0 == tagNo)
throw new IOException("corrupted stream - invalid high tag number found");
while ((b & 0x80) != 0)
{
if (((uint)tagNo >> 24) != 0U)
throw new IOException("Tag number more than 31 bits");
tagNo <<= 7;
b = s.ReadByte();
if (b < 0)
throw new EndOfStreamException("EOF found inside tag value.");
tagNo |= b & 0x7f;
}
}
return tagNo;
}
internal static int ReadLength(Stream s, int limit, bool isParsing)
{
int length = s.ReadByte();
if (0U == ((uint)length >> 7))
{
// definite-length short form
return length;
}
if (0x80 == length)
{
// indefinite-length
return -1;
}
if (length < 0)
{
throw new EndOfStreamException("EOF found when length expected");
}
if (0xFF == length)
{
throw new IOException("invalid long form definite-length 0xFF");
}
int octetsCount = length & 0x7F, octetsPos = 0;
length = 0;
do
{
int octet = s.ReadByte();
if (octet < 0)
throw new EndOfStreamException("EOF found reading length");
if (((uint)length >> 23) != 0U)
throw new IOException("long form definite-length more than 31 bits");
length = (length << 8) + octet;
}
while (++octetsPos < octetsCount);
if (length >= limit && !isParsing) // after all we must have read at least 1 byte
throw new IOException("corrupted stream - out of bounds length found: " + length + " >= " + limit);
return length;
}
private static byte[] GetBuffer(DefiniteLengthInputStream defIn, byte[][] tmpBuffers)
{
int len = defIn.Remaining;
if (len >= tmpBuffers.Length)
{
return defIn.ToArray();
}
byte[] buf = tmpBuffers[len];
if (buf == null)
{
buf = tmpBuffers[len] = new byte[len];
}
defIn.ReadAllIntoByteArray(buf);
return buf;
}
private static char[] GetBmpCharBuffer(DefiniteLengthInputStream defIn)
{
int remainingBytes = defIn.Remaining;
if (0 != (remainingBytes & 1))
throw new IOException("malformed BMPString encoding encountered");
char[] str = new char[remainingBytes / 2];
int stringPos = 0;
byte[] buf = new byte[8];
while (remainingBytes >= 8)
{
if (Streams.ReadFully(defIn, buf, 0, 8) != 8)
throw new EndOfStreamException("EOF encountered in middle of BMPString");
str[stringPos ] = (char)((buf[0] << 8) | (buf[1] & 0xFF));
str[stringPos + 1] = (char)((buf[2] << 8) | (buf[3] & 0xFF));
str[stringPos + 2] = (char)((buf[4] << 8) | (buf[5] & 0xFF));
str[stringPos + 3] = (char)((buf[6] << 8) | (buf[7] & 0xFF));
stringPos += 4;
remainingBytes -= 8;
}
if (remainingBytes > 0)
{
if (Streams.ReadFully(defIn, buf, 0, remainingBytes) != remainingBytes)
throw new EndOfStreamException("EOF encountered in middle of BMPString");
int bufPos = 0;
do
{
int b1 = buf[bufPos++] << 8;
int b2 = buf[bufPos++] & 0xFF;
str[stringPos++] = (char)(b1 | b2);
}
while (bufPos < remainingBytes);
}
if (0 != defIn.Remaining || str.Length != stringPos)
throw new InvalidOperationException();
return str;
}
internal static Asn1Object CreatePrimitiveDerObject(int tagNo, DefiniteLengthInputStream defIn,
byte[][] tmpBuffers)
{
switch (tagNo)
{
case Asn1Tags.BmpString:
return DerBmpString.CreatePrimitive(GetBmpCharBuffer(defIn));
case Asn1Tags.Boolean:
return DerBoolean.CreatePrimitive(GetBuffer(defIn, tmpBuffers));
case Asn1Tags.Enumerated:
// TODO Ideally only clone if we used a buffer
return DerEnumerated.CreatePrimitive(GetBuffer(defIn, tmpBuffers), true);
case Asn1Tags.ObjectIdentifier:
// TODO Ideally only clone if we used a buffer
return DerObjectIdentifier.CreatePrimitive(GetBuffer(defIn, tmpBuffers), true);
}
byte[] bytes = defIn.ToArray();
switch (tagNo)
{
case Asn1Tags.BitString:
return DerBitString.CreatePrimitive(bytes);
case Asn1Tags.GeneralizedTime:
return Asn1GeneralizedTime.CreatePrimitive(bytes);
case Asn1Tags.GeneralString:
return DerGeneralString.CreatePrimitive(bytes);
case Asn1Tags.GraphicString:
return DerGraphicString.CreatePrimitive(bytes);
case Asn1Tags.IA5String:
return DerIA5String.CreatePrimitive(bytes);
case Asn1Tags.Integer:
return DerInteger.CreatePrimitive(bytes);
case Asn1Tags.Null:
return Asn1Null.CreatePrimitive(bytes);
case Asn1Tags.NumericString:
return DerNumericString.CreatePrimitive(bytes);
case Asn1Tags.ObjectDescriptor:
return Asn1ObjectDescriptor.CreatePrimitive(bytes);
case Asn1Tags.OctetString:
return Asn1OctetString.CreatePrimitive(bytes);
case Asn1Tags.PrintableString:
return DerPrintableString.CreatePrimitive(bytes);
case Asn1Tags.RelativeOid:
return Asn1RelativeOid.CreatePrimitive(bytes, false);
case Asn1Tags.T61String:
return DerT61String.CreatePrimitive(bytes);
case Asn1Tags.UniversalString:
return DerUniversalString.CreatePrimitive(bytes);
case Asn1Tags.UtcTime:
return Asn1UtcTime.CreatePrimitive(bytes);
case Asn1Tags.Utf8String:
return DerUtf8String.CreatePrimitive(bytes);
case Asn1Tags.VideotexString:
return DerVideotexString.CreatePrimitive(bytes);
case Asn1Tags.VisibleString:
return DerVisibleString.CreatePrimitive(bytes);
default:
throw new IOException("unknown tag " + tagNo + " encountered");
}
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e252ac704e464264d8409a56a0bb3eb3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,81 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
/**
* A Null object.
*/
public abstract class Asn1Null
: Asn1Object
{
internal class Meta : Asn1UniversalType
{
internal static readonly Asn1UniversalType Instance = new Meta();
private Meta() : base(typeof(Asn1Null), Asn1Tags.Null) {}
internal override Asn1Object FromImplicitPrimitive(DerOctetString octetString)
{
return CreatePrimitive(octetString.GetOctets());
}
}
public static Asn1Null GetInstance(object obj)
{
if (obj == null)
return null;
if (obj is Asn1Null asn1Null)
return asn1Null;
if (obj is IAsn1Convertible asn1Convertible)
{
Asn1Object asn1Object = asn1Convertible.ToAsn1Object();
if (asn1Object is Asn1Null converted)
return converted;
}
else if (obj is byte[] bytes)
{
try
{
return (Asn1Null)Meta.Instance.FromByteArray(bytes);
}
catch (IOException e)
{
throw new ArgumentException("failed to construct NULL from byte[]: " + e.Message);
}
}
throw new ArgumentException("illegal object in GetInstance: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(obj));
}
public static Asn1Null GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return (Asn1Null)Meta.Instance.GetContextInstance(taggedObject, declaredExplicit);
}
internal Asn1Null()
{
}
public override string ToString()
{
return "NULL";
}
internal static Asn1Null CreatePrimitive(byte[] contents)
{
if (0 != contents.Length)
throw new InvalidOperationException("malformed NULL encoding encountered");
return DerNull.Instance;
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2b6ffeb7c543040429c96c7fa0041261
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,95 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public abstract class Asn1Object
: Asn1Encodable
{
public override void EncodeTo(Stream output)
{
Asn1OutputStream asn1Out = Asn1OutputStream.Create(output);
GetEncoding(asn1Out.Encoding).Encode(asn1Out);
asn1Out.FlushInternal();
}
public override void EncodeTo(Stream output, string encoding)
{
Asn1OutputStream asn1Out = Asn1OutputStream.Create(output, encoding);
GetEncoding(asn1Out.Encoding).Encode(asn1Out);
asn1Out.FlushInternal();
}
public bool Equals(Asn1Object other)
{
return this == other || Asn1Equals(other);
}
/// <summary>Create a base ASN.1 object from a byte array.</summary>
/// <param name="data">The byte array to parse.</param>
/// <returns>The base ASN.1 object represented by the byte array.</returns>
/// <exception cref="IOException">
/// If there is a problem parsing the data, or parsing an object did not exhaust the available data.
/// </exception>
public static Asn1Object FromByteArray(
byte[] data)
{
try
{
MemoryStream input = new MemoryStream(data, false);
Asn1InputStream asn1 = new Asn1InputStream(input, data.Length);
Asn1Object result = asn1.ReadObject();
if (input.Position != input.Length)
throw new IOException("extra data found after object");
return result;
}
catch (InvalidCastException)
{
throw new IOException("cannot recognise object in byte array");
}
}
/// <summary>Read a base ASN.1 object from a stream.</summary>
/// <param name="inStr">The stream to parse.</param>
/// <returns>The base ASN.1 object represented by the byte array.</returns>
/// <exception cref="IOException">If there is a problem parsing the data.</exception>
public static Asn1Object FromStream(
Stream inStr)
{
try
{
return new Asn1InputStream(inStr).ReadObject();
}
catch (InvalidCastException)
{
throw new IOException("cannot recognise object in stream");
}
}
public sealed override Asn1Object ToAsn1Object()
{
return this;
}
internal abstract IAsn1Encoding GetEncoding(int encoding);
internal abstract IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo);
protected abstract bool Asn1Equals(Asn1Object asn1Object);
protected abstract int Asn1GetHashCode();
internal bool CallAsn1Equals(Asn1Object obj)
{
return Asn1Equals(obj);
}
internal int CallAsn1GetHashCode()
{
return Asn1GetHashCode();
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 86b4801bceb05f54ab0490784feb75c1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,125 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public sealed class Asn1ObjectDescriptor
: Asn1Object
{
internal class Meta : Asn1UniversalType
{
internal static readonly Asn1UniversalType Instance = new Meta();
private Meta() : base(typeof(Asn1ObjectDescriptor), Asn1Tags.ObjectDescriptor) {}
internal override Asn1Object FromImplicitPrimitive(DerOctetString octetString)
{
return new Asn1ObjectDescriptor(
(DerGraphicString)DerGraphicString.Meta.Instance.FromImplicitPrimitive(octetString));
}
internal override Asn1Object FromImplicitConstructed(Asn1Sequence sequence)
{
return new Asn1ObjectDescriptor(
(DerGraphicString)DerGraphicString.Meta.Instance.FromImplicitConstructed(sequence));
}
}
/**
* 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)
return null;
if (obj is Asn1ObjectDescriptor asn1ObjectDescriptor)
return asn1ObjectDescriptor;
if (obj is IAsn1Convertible asn1Convertible)
{
Asn1Object asn1Object = asn1Convertible.ToAsn1Object();
if (asn1Object is Asn1ObjectDescriptor converted)
return converted;
}
else if (obj is byte[] bytes)
{
try
{
return (Asn1ObjectDescriptor)Meta.Instance.FromByteArray(bytes);
}
catch (IOException e)
{
throw new ArgumentException("failed to construct object descriptor from byte[]: " + e.Message);
}
}
throw new ArgumentException("illegal object in GetInstance: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(obj), "obj");
}
/**
* Return an ObjectDescriptor from a tagged object.
*
* @param taggedObject the tagged object holding the object we want.
* @param declaredExplicit 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 declaredExplicit)
{
return (Asn1ObjectDescriptor)Meta.Instance.GetContextInstance(taggedObject, declaredExplicit);
}
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 IAsn1Encoding GetEncoding(int encoding)
{
return m_baseGraphicString.GetEncodingImplicit(encoding, Asn1Tags.Universal, Asn1Tags.ObjectDescriptor);
}
internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo)
{
return m_baseGraphicString.GetEncodingImplicit(encoding, tagClass, tagNo);
}
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.Equals(that.m_baseGraphicString);
}
internal static Asn1ObjectDescriptor CreatePrimitive(byte[] contents)
{
return new Asn1ObjectDescriptor(DerGraphicString.CreatePrimitive(contents));
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ef670ce0aae993744a256d3bb7362b31
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,136 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public abstract class Asn1OctetString
: Asn1Object, Asn1OctetStringParser
{
internal class Meta : Asn1UniversalType
{
internal static readonly Asn1UniversalType Instance = new Meta();
private Meta() : base(typeof(Asn1OctetString), Asn1Tags.OctetString) {}
internal override Asn1Object FromImplicitPrimitive(DerOctetString octetString)
{
return octetString;
}
internal override Asn1Object FromImplicitConstructed(Asn1Sequence sequence)
{
return sequence.ToAsn1OctetString();
}
}
internal static readonly byte[] EmptyOctets = new byte[0];
/**
* return an Octet string from the given object.
*
* @param obj the object we want converted.
* @exception ArgumentException if the object cannot be converted.
*/
public static Asn1OctetString GetInstance(object obj)
{
if (obj == null)
return null;
if (obj is Asn1OctetString asn1OctetString)
return asn1OctetString;
if (obj is IAsn1Convertible asn1Convertible)
{
Asn1Object asn1Object = asn1Convertible.ToAsn1Object();
if (asn1Object is Asn1OctetString converted)
return converted;
}
else if (obj is byte[] bytes)
{
try
{
return (Asn1OctetString)Meta.Instance.FromByteArray(bytes);
}
catch (IOException e)
{
throw new ArgumentException("failed to construct OCTET STRING from byte[]: " + e.Message);
}
}
throw new ArgumentException("illegal object in GetInstance: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(obj), "obj");
}
/**
* return an octet string from a tagged object.
*
* @param taggedObject the tagged object holding the object we want.
* @param declaredExplicit true if the object is meant to be explicitly tagged false otherwise.
* @exception ArgumentException if the tagged object cannot be converted.
*/
public static Asn1OctetString GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return (Asn1OctetString)Meta.Instance.GetContextInstance(taggedObject, declaredExplicit);
}
internal readonly byte[] contents;
/**
* @param string the octets making up the octet string.
*/
internal Asn1OctetString(byte[] contents)
{
if (null == contents)
throw new ArgumentNullException("contents");
this.contents = contents;
}
public Stream GetOctetStream()
{
return new MemoryStream(contents, false);
}
public Asn1OctetStringParser Parser
{
get { return this; }
}
public virtual byte[] GetOctets()
{
return contents;
}
protected override int Asn1GetHashCode()
{
return Arrays.GetHashCode(GetOctets());
}
protected override bool Asn1Equals(
Asn1Object asn1Object)
{
DerOctetString other = asn1Object as DerOctetString;
if (other == null)
return false;
return Arrays.AreEqual(GetOctets(), other.GetOctets());
}
public override string ToString()
{
return "#" + Hex.ToHexString(contents);
}
internal static Asn1OctetString CreatePrimitive(byte[] contents)
{
return new DerOctetString(contents);
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 605a6b277ffde7640a895840c2243816
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,192 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using System.Diagnostics;
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
using System.Buffers.Binary;
using System.Numerics;
#endif
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class Asn1OutputStream
: FilterStream
{
internal const int EncodingBer = 1;
internal const int EncodingDer = 2;
public static Asn1OutputStream Create(Stream output)
{
return new Asn1OutputStream(output);
}
public static Asn1OutputStream Create(Stream output, string encoding)
{
if (Asn1Encodable.Der.Equals(encoding))
{
return new DerOutputStream(output);
}
else
{
return new Asn1OutputStream(output);
}
}
internal Asn1OutputStream(Stream os)
: base(os)
{
}
public virtual void WriteObject(Asn1Encodable asn1Encodable)
{
if (null == asn1Encodable)
throw new ArgumentNullException("asn1Encodable");
asn1Encodable.ToAsn1Object().GetEncoding(this.Encoding).Encode(this);
FlushInternal();
}
public virtual void WriteObject(Asn1Object asn1Object)
{
if (null == asn1Object)
throw new ArgumentNullException("asn1Object");
asn1Object.GetEncoding(this.Encoding).Encode(this);
FlushInternal();
}
internal void EncodeContents(IAsn1Encoding[] contentsEncodings)
{
for (int i = 0, count = contentsEncodings.Length; i < count; ++i)
{
contentsEncodings[i].Encode(this);
}
}
internal virtual int Encoding
{
get { return EncodingBer; }
}
internal void FlushInternal()
{
// Placeholder to support future internal buffering
}
internal void WriteDL(int dl)
{
if (dl < 128)
{
Debug.Assert(dl >= 0);
WriteByte((byte)dl);
return;
}
#if false && (NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_)
Span<byte> encoding = stackalloc byte[5];
BinaryPrimitives.WriteUInt32BigEndian(encoding[1..], (uint)dl);
int leadingZeroBytes = BitOperations.LeadingZeroCount((uint)dl) / 8;
encoding[leadingZeroBytes] = (byte)(0x84 - leadingZeroBytes);
Write(encoding[leadingZeroBytes..]);
#else
byte[] stack = new byte[5];
int pos = stack.Length;
do
{
stack[--pos] = (byte)dl;
dl >>= 8;
}
while (dl > 0);
int count = stack.Length - pos;
stack[--pos] = (byte)(0x80 | count);
Write(stack, pos, count + 1);
#endif
}
internal void WriteIdentifier(int tagClass, int tagNo)
{
if (tagNo < 31)
{
WriteByte((byte)(tagClass | tagNo));
return;
}
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
Span<byte> stack = stackalloc byte[6];
#else
byte[] stack = new byte[6];
#endif
int pos = stack.Length;
stack[--pos] = (byte)(tagNo & 0x7F);
while (tagNo > 127)
{
tagNo >>= 7;
stack[--pos] = (byte)(tagNo & 0x7F | 0x80);
}
stack[--pos] = (byte)(tagClass | 0x1F);
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
Write(stack[pos..]);
#else
Write(stack, pos, stack.Length - pos);
#endif
}
internal static IAsn1Encoding[] GetContentsEncodings(int encoding, Asn1Encodable[] elements)
{
int count = elements.Length;
IAsn1Encoding[] contentsEncodings = new IAsn1Encoding[count];
for (int i = 0; i < count; ++i)
{
contentsEncodings[i] = elements[i].ToAsn1Object().GetEncoding(encoding);
}
return contentsEncodings;
}
internal static int GetLengthOfContents(IAsn1Encoding[] contentsEncodings)
{
int contentsLength = 0;
for (int i = 0, count = contentsEncodings.Length; i < count; ++i)
{
contentsLength += contentsEncodings[i].GetLength();
}
return contentsLength;
}
internal static int GetLengthOfDL(int dl)
{
if (dl < 128)
return 1;
int length = 2;
while ((dl >>= 8) > 0)
{
++length;
}
return length;
}
internal static int GetLengthOfIdentifier(int tagNo)
{
if (tagNo < 31)
return 1;
int length = 2;
while ((tagNo >>= 7) > 0)
{
++length;
}
return length;
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ca2e340a1bd44254cac396effbb16cda
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,34 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Runtime.Serialization;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
[Serializable]
public class Asn1ParsingException
: InvalidOperationException
{
public Asn1ParsingException()
: base()
{
}
public Asn1ParsingException(string message)
: base(message)
{
}
public Asn1ParsingException(string message, Exception innerException)
: base(message, innerException)
{
}
protected Asn1ParsingException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e565a5f2f13a702468596b17c248ac68
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,320 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using System.Text;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Math;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class Asn1RelativeOid
: Asn1Object
{
internal class Meta : Asn1UniversalType
{
internal static readonly Asn1UniversalType Instance = new Meta();
private Meta() : base(typeof(Asn1RelativeOid), Asn1Tags.RelativeOid) {}
internal override Asn1Object FromImplicitPrimitive(DerOctetString octetString)
{
return CreatePrimitive(octetString.GetOctets(), false);
}
}
public static Asn1RelativeOid FromContents(byte[] contents)
{
return CreatePrimitive(contents, true);
}
public static Asn1RelativeOid GetInstance(object obj)
{
if (obj == null)
return null;
if (obj is Asn1RelativeOid asn1RelativeOid)
return asn1RelativeOid;
if (obj is IAsn1Convertible asn1Convertible)
{
Asn1Object asn1Object = asn1Convertible.ToAsn1Object();
if (asn1Object is Asn1RelativeOid converted)
return converted;
}
else if (obj is byte[] bytes)
{
try
{
return (Asn1RelativeOid)FromByteArray(bytes);
}
catch (IOException e)
{
throw new ArgumentException("failed to construct relative OID from byte[]: " + e.Message);
}
}
throw new ArgumentException("illegal object in GetInstance: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(obj), "obj");
}
public static Asn1RelativeOid GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return (Asn1RelativeOid)Meta.Instance.GetContextInstance(taggedObject, declaredExplicit);
}
private const long LongLimit = (long.MaxValue >> 7) - 0x7F;
private readonly string identifier;
private byte[] contents;
public Asn1RelativeOid(string identifier)
{
if (identifier == null)
throw new ArgumentNullException("identifier");
if (!IsValidIdentifier(identifier, 0))
throw new FormatException("string " + identifier + " not a relative OID");
this.identifier = identifier;
}
private Asn1RelativeOid(Asn1RelativeOid oid, string branchID)
{
if (!IsValidIdentifier(branchID, 0))
throw new FormatException("string " + branchID + " not a valid relative OID branch");
this.identifier = oid.Id + "." + branchID;
}
private Asn1RelativeOid(byte[] contents, bool clone)
{
this.identifier = ParseContents(contents);
this.contents = clone ? Arrays.Clone(contents) : contents;
}
public virtual Asn1RelativeOid Branch(string branchID)
{
return new Asn1RelativeOid(this, branchID);
}
public string Id
{
get { return identifier; }
}
public override string ToString()
{
return identifier;
}
protected override bool Asn1Equals(Asn1Object asn1Object)
{
Asn1RelativeOid that = asn1Object as Asn1RelativeOid;
return null != that
&& this.identifier == that.identifier;
}
protected override int Asn1GetHashCode()
{
return identifier.GetHashCode();
}
internal override IAsn1Encoding GetEncoding(int encoding)
{
return new PrimitiveEncoding(Asn1Tags.Universal, Asn1Tags.RelativeOid, GetContents());
}
internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo)
{
return new PrimitiveEncoding(tagClass, tagNo, GetContents());
}
private void DoOutput(MemoryStream bOut)
{
OidTokenizer tok = new OidTokenizer(identifier);
while (tok.HasMoreTokens)
{
string token = tok.NextToken();
if (token.Length <= 18)
{
WriteField(bOut, long.Parse(token));
}
else
{
WriteField(bOut, new BigInteger(token));
}
}
}
private byte[] GetContents()
{
lock (this)
{
if (contents == null)
{
MemoryStream bOut = new MemoryStream();
DoOutput(bOut);
contents = bOut.ToArray();
}
return contents;
}
}
internal static Asn1RelativeOid CreatePrimitive(byte[] contents, bool clone)
{
return new Asn1RelativeOid(contents, clone);
}
internal static bool IsValidIdentifier(string identifier, int from)
{
int digitCount = 0;
int pos = identifier.Length;
while (--pos >= from)
{
char ch = identifier[pos];
if (ch == '.')
{
if (0 == digitCount || (digitCount > 1 && identifier[pos + 1] == '0'))
return false;
digitCount = 0;
}
else if ('0' <= ch && ch <= '9')
{
++digitCount;
}
else
{
return false;
}
}
if (0 == digitCount || (digitCount > 1 && identifier[pos + 1] == '0'))
return false;
return true;
}
internal static void WriteField(Stream outputStream, long fieldValue)
{
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
Span<byte> result = stackalloc byte[9];
#else
byte[] result = new byte[9];
#endif
int pos = 8;
result[pos] = (byte)((int)fieldValue & 0x7F);
while (fieldValue >= (1L << 7))
{
fieldValue >>= 7;
result[--pos] = (byte)((int)fieldValue | 0x80);
}
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
outputStream.Write(result[pos..]);
#else
outputStream.Write(result, pos, 9 - pos);
#endif
}
internal static void WriteField(Stream outputStream, BigInteger fieldValue)
{
int byteCount = (fieldValue.BitLength + 6) / 7;
if (byteCount == 0)
{
outputStream.WriteByte(0);
}
else
{
BigInteger tmpValue = fieldValue;
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
Span<byte> tmp = byteCount <= 16
? stackalloc byte[byteCount]
: new byte[byteCount];
#else
byte[] tmp = new byte[byteCount];
#endif
for (int i = byteCount - 1; i >= 0; i--)
{
tmp[i] = (byte)(tmpValue.IntValue | 0x80);
tmpValue = tmpValue.ShiftRight(7);
}
tmp[byteCount - 1] &= 0x7F;
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
outputStream.Write(tmp);
#else
outputStream.Write(tmp, 0, tmp.Length);
#endif
}
}
private static string ParseContents(byte[] contents)
{
StringBuilder objId = new StringBuilder();
long value = 0;
BigInteger bigValue = null;
bool first = true;
for (int i = 0; i != contents.Length; i++)
{
int b = contents[i];
if (value <= LongLimit)
{
value += b & 0x7F;
if ((b & 0x80) == 0)
{
if (first)
{
first = false;
}
else
{
objId.Append('.');
}
objId.Append(value);
value = 0;
}
else
{
value <<= 7;
}
}
else
{
if (bigValue == null)
{
bigValue = BigInteger.ValueOf(value);
}
bigValue = bigValue.Or(BigInteger.ValueOf(b & 0x7F));
if ((b & 0x80) == 0)
{
if (first)
{
first = false;
}
else
{
objId.Append('.');
}
objId.Append(bigValue);
bigValue = null;
value = 0;
}
else
{
bigValue = bigValue.ShiftLeft(7);
}
}
}
return objId.ToString();
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ae6c5229271568c4f968518558270b85
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,284 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Collections.Generic;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Collections;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public abstract class Asn1Sequence
: Asn1Object, IEnumerable<Asn1Encodable>
{
internal class Meta : Asn1UniversalType
{
internal static readonly Asn1UniversalType Instance = new Meta();
private Meta() : base(typeof(Asn1Sequence), Asn1Tags.Sequence) {}
internal override Asn1Object FromImplicitConstructed(Asn1Sequence sequence)
{
return sequence;
}
}
/**
* return an Asn1Sequence from the given object.
*
* @param obj the object we want converted.
* @exception ArgumentException if the object cannot be converted.
*/
public static Asn1Sequence GetInstance(object obj)
{
if (obj == null)
return null;
if (obj is Asn1Sequence asn1Sequence)
return asn1Sequence;
if (obj is IAsn1Convertible asn1Convertible)
{
Asn1Object asn1Object = asn1Convertible.ToAsn1Object();
if (asn1Object is Asn1Sequence converted)
return converted;
}
else if (obj is byte[] bytes)
{
try
{
return (Asn1Sequence)Meta.Instance.FromByteArray(bytes);
}
catch (IOException e)
{
throw new ArgumentException("failed to construct sequence from byte[]: " + e.Message);
}
}
throw new ArgumentException("illegal object in GetInstance: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(obj), "obj");
}
/**
* Return an ASN1 sequence from a tagged object. There is a special
* case here, if an object appears to have been explicitly tagged on
* reading but we were expecting it to be implicitly tagged in the
* normal course of events it indicates that we lost the surrounding
* sequence - so we need to add it back (this will happen if the tagged
* object is a sequence that contains other sequences). If you are
* dealing with implicitly tagged sequences you really <b>should</b>
* be using this method.
*
* @param taggedObject the tagged object.
* @param declaredExplicit true if the object is meant to be explicitly tagged, false otherwise.
* @exception ArgumentException if the tagged object cannot be converted.
*/
public static Asn1Sequence GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return (Asn1Sequence)Meta.Instance.GetContextInstance(taggedObject, declaredExplicit);
}
// NOTE: Only non-readonly to support LazyDLSequence
internal Asn1Encodable[] elements;
protected internal Asn1Sequence()
{
this.elements = Asn1EncodableVector.EmptyElements;
}
protected internal Asn1Sequence(Asn1Encodable element)
{
if (null == element)
throw new ArgumentNullException(nameof(element));
this.elements = new Asn1Encodable[]{ element };
}
protected internal Asn1Sequence(Asn1Encodable element1, Asn1Encodable element2)
{
if (null == element1)
throw new ArgumentNullException(nameof(element1));
if (null == element2)
throw new ArgumentNullException(nameof(element2));
this.elements = new Asn1Encodable[]{ element1, element2 };
}
protected internal Asn1Sequence(params Asn1Encodable[] elements)
{
if (Arrays.IsNullOrContainsNull(elements))
throw new NullReferenceException("'elements' cannot be null, or contain null");
this.elements = Asn1EncodableVector.CloneElements(elements);
}
internal Asn1Sequence(Asn1Encodable[] elements, bool clone)
{
this.elements = clone ? Asn1EncodableVector.CloneElements(elements) : elements;
}
protected internal Asn1Sequence(Asn1EncodableVector elementVector)
{
if (null == elementVector)
throw new ArgumentNullException("elementVector");
this.elements = elementVector.TakeElements();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public virtual IEnumerator<Asn1Encodable> GetEnumerator()
{
IEnumerable<Asn1Encodable> e = elements;
return e.GetEnumerator();
}
private class Asn1SequenceParserImpl
: Asn1SequenceParser
{
private readonly Asn1Sequence outer;
private readonly int max;
private int index;
public Asn1SequenceParserImpl(
Asn1Sequence outer)
{
this.outer = outer;
// NOTE: Call Count here to 'force' a LazyDerSequence
this.max = outer.Count;
}
public IAsn1Convertible ReadObject()
{
if (index == max)
return null;
Asn1Encodable obj = outer[index++];
if (obj is Asn1Sequence)
return ((Asn1Sequence)obj).Parser;
if (obj is Asn1Set)
return ((Asn1Set)obj).Parser;
// NB: Asn1OctetString implements Asn1OctetStringParser directly
// if (obj is Asn1OctetString)
// return ((Asn1OctetString)obj).Parser;
return obj;
}
public Asn1Object ToAsn1Object()
{
return outer;
}
}
public virtual Asn1SequenceParser Parser
{
get { return new Asn1SequenceParserImpl(this); }
}
/**
* return the object at the sequence position indicated by index.
*
* @param index the sequence number (starting at zero) of the object
* @return the object at the sequence position indicated by index.
*/
public virtual Asn1Encodable this[int index]
{
get { return elements[index]; }
}
public virtual int Count
{
get { return elements.Length; }
}
public virtual T[] MapElements<T>(Func<Asn1Encodable, T> func)
{
// NOTE: Call Count here to 'force' a LazyDerSequence
int count = Count;
T[] result = new T[count];
for (int i = 0; i < count; ++i)
{
result[i] = func(elements[i]);
}
return result;
}
public virtual Asn1Encodable[] ToArray()
{
return Asn1EncodableVector.CloneElements(elements);
}
protected override int Asn1GetHashCode()
{
// NOTE: Call Count here to 'force' a LazyDerSequence
int i = Count;
int hc = i + 1;
while (--i >= 0)
{
hc *= 257;
hc ^= elements[i].ToAsn1Object().CallAsn1GetHashCode();
}
return hc;
}
protected override bool Asn1Equals(Asn1Object asn1Object)
{
Asn1Sequence that = asn1Object as Asn1Sequence;
if (null == that)
return false;
// NOTE: Call Count here (on both) to 'force' a LazyDerSequence
int count = this.Count;
if (that.Count != count)
return false;
for (int i = 0; i < count; ++i)
{
Asn1Object o1 = this.elements[i].ToAsn1Object();
Asn1Object o2 = that.elements[i].ToAsn1Object();
if (!o1.Equals(o2))
return false;
}
return true;
}
public override string ToString()
{
return CollectionUtilities.ToString(elements);
}
// TODO[asn1] Preferably return an Asn1BitString[] (doesn't exist yet)
internal DerBitString[] GetConstructedBitStrings()
{
return MapElements(DerBitString.GetInstance);
}
internal Asn1OctetString[] GetConstructedOctetStrings()
{
return MapElements(Asn1OctetString.GetInstance);
}
// TODO[asn1] Preferably return an Asn1BitString (doesn't exist yet)
internal abstract DerBitString ToAsn1BitString();
// TODO[asn1] Preferably return an Asn1External (doesn't exist yet)
internal abstract DerExternal ToAsn1External();
internal abstract Asn1OctetString ToAsn1OctetString();
internal abstract Asn1Set ToAsn1Set();
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 251efabb5e3250d49ad3fb7b45d68d01
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,331 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Collections;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public abstract class Asn1Set
: Asn1Object, IEnumerable<Asn1Encodable>
{
internal class Meta : Asn1UniversalType
{
internal static readonly Asn1UniversalType Instance = new Meta();
private Meta() : base(typeof(Asn1Set), Asn1Tags.Set) {}
internal override Asn1Object FromImplicitConstructed(Asn1Sequence sequence)
{
return sequence.ToAsn1Set();
}
}
/**
* return an ASN1Set from the given object.
*
* @param obj the object we want converted.
* @exception ArgumentException if the object cannot be converted.
*/
public static Asn1Set GetInstance(object obj)
{
if (obj == null)
return null;
if (obj is Asn1Set asn1Set)
return asn1Set;
if (obj is IAsn1Convertible asn1Convertible)
{
Asn1Object asn1Object = asn1Convertible.ToAsn1Object();
if (asn1Object is Asn1Set converted)
return converted;
}
else if (obj is byte[] bytes)
{
try
{
return (Asn1Set)Meta.Instance.FromByteArray(bytes);
}
catch (IOException e)
{
throw new ArgumentException("failed to construct set from byte[]: " + e.Message);
}
}
throw new ArgumentException("illegal object in GetInstance: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(obj), "obj");
}
/**
* Return an ASN1 set from a tagged object. There is a special
* case here, if an object appears to have been explicitly tagged on
* reading but we were expecting it to be implicitly tagged in the
* normal course of events it indicates that we lost the surrounding
* set - so we need to add it back (this will happen if the tagged
* object is a sequence that contains other sequences). If you are
* dealing with implicitly tagged sets you really <b>should</b>
* be using this method.
*
* @param taggedObject the tagged object.
* @param declaredExplicit true if the object is meant to be explicitly tagged false otherwise.
* @exception ArgumentException if the tagged object cannot be converted.
*/
public static Asn1Set GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return (Asn1Set)Meta.Instance.GetContextInstance(taggedObject, declaredExplicit);
}
// NOTE: Only non-readonly to support LazyDLSet
internal Asn1Encodable[] elements;
internal bool isSorted;
protected internal Asn1Set()
{
this.elements = Asn1EncodableVector.EmptyElements;
this.isSorted = true;
}
protected internal Asn1Set(Asn1Encodable element)
{
if (null == element)
throw new ArgumentNullException("element");
this.elements = new Asn1Encodable[]{ element };
this.isSorted = true;
}
protected internal Asn1Set(Asn1Encodable[] elements, bool doSort)
{
if (Arrays.IsNullOrContainsNull(elements))
throw new NullReferenceException("'elements' cannot be null, or contain null");
Asn1Encodable[] tmp = Asn1EncodableVector.CloneElements(elements);
if (doSort && tmp.Length >= 2)
{
tmp = Sort(tmp);
}
this.elements = tmp;
this.isSorted = doSort || tmp.Length < 2;
}
protected internal Asn1Set(Asn1EncodableVector elementVector, bool doSort)
{
if (null == elementVector)
throw new ArgumentNullException("elementVector");
Asn1Encodable[] tmp;
if (doSort && elementVector.Count >= 2)
{
tmp = Sort(elementVector.CopyElements());
}
else
{
tmp = elementVector.TakeElements();
}
this.elements = tmp;
this.isSorted = doSort || tmp.Length < 2;
}
protected internal Asn1Set(bool isSorted, Asn1Encodable[] elements)
{
this.elements = elements;
this.isSorted = isSorted || elements.Length < 2;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public virtual IEnumerator<Asn1Encodable> GetEnumerator()
{
IEnumerable<Asn1Encodable> e = elements;
return e.GetEnumerator();
}
/**
* return the object at the set position indicated by index.
*
* @param index the set number (starting at zero) of the object
* @return the object at the set position indicated by index.
*/
public virtual Asn1Encodable this[int index]
{
get { return elements[index]; }
}
public virtual int Count
{
get { return elements.Length; }
}
public virtual T[] MapElements<T>(Func<Asn1Encodable, T> func)
{
// NOTE: Call Count here to 'force' a LazyDerSet
int count = Count;
T[] result = new T[count];
for (int i = 0; i < count; ++i)
{
result[i] = func(elements[i]);
}
return result;
}
public virtual Asn1Encodable[] ToArray()
{
return Asn1EncodableVector.CloneElements(elements);
}
private class Asn1SetParserImpl
: Asn1SetParser
{
private readonly Asn1Set outer;
private readonly int max;
private int index;
public Asn1SetParserImpl(
Asn1Set outer)
{
this.outer = outer;
// NOTE: Call Count here to 'force' a LazyDerSet
this.max = outer.Count;
}
public IAsn1Convertible ReadObject()
{
if (index == max)
return null;
Asn1Encodable obj = outer[index++];
if (obj is Asn1Sequence)
return ((Asn1Sequence)obj).Parser;
if (obj is Asn1Set)
return ((Asn1Set)obj).Parser;
// NB: Asn1OctetString implements Asn1OctetStringParser directly
// if (obj is Asn1OctetString)
// return ((Asn1OctetString)obj).Parser;
return obj;
}
public virtual Asn1Object ToAsn1Object()
{
return outer;
}
}
public Asn1SetParser Parser
{
get { return new Asn1SetParserImpl(this); }
}
protected override int Asn1GetHashCode()
{
// NOTE: Call Count here to 'force' a LazyDerSet
int i = Count;
int hc = i + 1;
while (--i >= 0)
{
hc *= 257;
hc ^= elements[i].ToAsn1Object().CallAsn1GetHashCode();
}
return hc;
}
protected override bool Asn1Equals(Asn1Object asn1Object)
{
Asn1Set that = asn1Object as Asn1Set;
if (null == that)
return false;
// NOTE: Call Count here (on both) to 'force' a LazyDerSet
int count = this.Count;
if (that.Count != count)
return false;
for (int i = 0; i < count; ++i)
{
Asn1Object o1 = this.elements[i].ToAsn1Object();
Asn1Object o2 = that.elements[i].ToAsn1Object();
if (!o1.Equals(o2))
return false;
}
return true;
}
public override string ToString()
{
return CollectionUtilities.ToString(elements);
}
internal static Asn1Encodable[] Sort(Asn1Encodable[] elements)
{
int count = elements.Length;
if (count < 2)
return elements;
byte[][] keys = new byte[count][];
for (int i = 0; i < count; ++i)
{
keys[i] = elements[i].GetEncoded(Der);
}
Array.Sort(keys, elements, new DerComparer());
return elements;
}
private class DerComparer
: IComparer<byte[]>
{
public int Compare(byte[] a, byte[] b)
{
Debug.Assert(a.Length >= 2 && b.Length >= 2);
/*
* NOTE: Set elements in DER encodings are ordered first according to their tags (class and
* number); the CONSTRUCTED bit is not part of the tag.
*
* For SET-OF, this is unimportant. All elements have the same tag and DER requires them to
* either all be in constructed form or all in primitive form, according to that tag. The
* elements are effectively ordered according to their content octets.
*
* For SET, the elements will have distinct tags, and each will be in constructed or
* primitive form accordingly. Failing to ignore the CONSTRUCTED bit could therefore lead to
* ordering inversions.
*/
int a0 = a[0] & ~Asn1Tags.Constructed;
int b0 = b[0] & ~Asn1Tags.Constructed;
if (a0 != b0)
return a0 < b0 ? -1 : 1;
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
int compareLength = System.Math.Min(a.Length, b.Length) - 1;
return a.AsSpan(1, compareLength).SequenceCompareTo(b.AsSpan(1, compareLength));
#else
int len = System.Math.Min(a.Length, b.Length);
for (int i = 1; i < len; ++i)
{
byte ai = a[i], bi = b[i];
if (ai != bi)
return ai < bi ? -1 : 1;
}
Debug.Assert(a.Length == b.Length);
return 0;
#endif
}
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: db687a85bbc7c7240b1b2f57359d0c46
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,35 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
internal sealed class Asn1Tag
{
internal static Asn1Tag Create(int tagClass, int tagNo)
{
return new Asn1Tag(tagClass, tagNo);
}
private readonly int m_tagClass;
private readonly int m_tagNo;
private Asn1Tag(int tagClass, int tagNo)
{
m_tagClass = tagClass;
m_tagNo = tagNo;
}
internal int TagClass
{
get { return m_tagClass; }
}
internal int TagNo
{
get { return m_tagNo; }
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 86fc5dd31416c1b4797892dbb3a76111
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,409 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
/**
* ASN.1 TaggedObject - in ASN.1 notation this is any object preceded by
* a [n] where n is some number - these are assumed to follow the construction
* rules (as with sequences).
*/
public abstract class Asn1TaggedObject
: Asn1Object, Asn1TaggedObjectParser
{
private const int DeclaredExplicit = 1;
private const int DeclaredImplicit = 2;
// TODO It will probably be better to track parsing constructed vs primitive instead
private const int ParsedExplicit = 3;
private const int ParsedImplicit = 4;
public static Asn1TaggedObject GetInstance(object obj)
{
if (obj == null)
return null;
if (obj is Asn1TaggedObject asn1TaggedObject)
return asn1TaggedObject;
if (obj is IAsn1Convertible asn1Convertible)
{
Asn1Object asn1Object = asn1Convertible.ToAsn1Object();
if (asn1Object is Asn1TaggedObject converted)
return converted;
}
else if (obj is byte[] bytes)
{
try
{
return CheckedCast(FromByteArray(bytes));
}
catch (IOException e)
{
throw new ArgumentException("failed to construct tagged object from byte[]: " + e.Message);
}
}
throw new ArgumentException("illegal object in GetInstance: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(obj), "obj");
}
public static Asn1TaggedObject GetInstance(object obj, int tagClass)
{
if (obj == null)
throw new ArgumentNullException(nameof(obj));
Asn1TaggedObject taggedObject = GetInstance(obj);
if (tagClass != taggedObject.TagClass)
throw new ArgumentException("unexpected tag in GetInstance: " + Asn1Utilities.GetTagText(taggedObject));
return taggedObject;
}
public static Asn1TaggedObject GetInstance(object obj, int tagClass, int tagNo)
{
if (obj == null)
throw new ArgumentNullException(nameof(obj));
Asn1TaggedObject taggedObject = GetInstance(obj);
if (!taggedObject.HasTag(tagClass, tagNo))
throw new ArgumentException("unexpected tag in GetInstance: " + Asn1Utilities.GetTagText(taggedObject));
return taggedObject;
}
public static Asn1TaggedObject GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
if (Asn1Tags.ContextSpecific != taggedObject.TagClass)
throw new InvalidOperationException("this method only valid for CONTEXT_SPECIFIC tags");
if (declaredExplicit)
return taggedObject.GetExplicitBaseTagged();
throw new ArgumentException("this method not valid for implicitly tagged tagged objects");
}
internal readonly int explicitness;
internal readonly int tagClass;
internal readonly int tagNo;
internal readonly Asn1Encodable obj;
/**
* @param explicitly true if the object is explicitly tagged.
* @param tagNo the tag number for this object.
* @param obj the tagged object.
*/
protected Asn1TaggedObject(bool isExplicit, int tagNo, Asn1Encodable obj)
: this(isExplicit, Asn1Tags.ContextSpecific, tagNo, obj)
{
}
protected Asn1TaggedObject(bool isExplicit, int tagClass, int tagNo, Asn1Encodable obj)
: this(isExplicit ? DeclaredExplicit : DeclaredImplicit, tagClass, tagNo, obj)
{
}
internal Asn1TaggedObject(int explicitness, int tagClass, int tagNo, Asn1Encodable obj)
{
if (null == obj)
throw new ArgumentNullException("obj");
if (Asn1Tags.Universal == tagClass || (tagClass & Asn1Tags.Private) != tagClass)
throw new ArgumentException("invalid tag class: " + tagClass, "tagClass");
this.explicitness = (obj is IAsn1Choice) ? DeclaredExplicit : explicitness;
this.tagClass = tagClass;
this.tagNo = tagNo;
this.obj = obj;
}
protected override bool Asn1Equals(Asn1Object asn1Object)
{
Asn1TaggedObject that = asn1Object as Asn1TaggedObject;
if (null == that || this.tagNo != that.tagNo || this.tagClass != that.tagClass)
return false;
if (this.explicitness != that.explicitness)
{
/*
* TODO This seems incorrect for some cases of implicit tags e.g. if one is a
* declared-implicit SET and the other a parsed object.
*/
if (this.IsExplicit() != that.IsExplicit())
return false;
}
Asn1Object p1 = this.obj.ToAsn1Object();
Asn1Object p2 = that.obj.ToAsn1Object();
if (p1 == p2)
return true;
if (!this.IsExplicit())
{
try
{
byte[] d1 = this.GetEncoded();
byte[] d2 = that.GetEncoded();
return Arrays.AreEqual(d1, d2);
}
catch (IOException)
{
return false;
}
}
return p1.CallAsn1Equals(p2);
}
protected override int Asn1GetHashCode()
{
return (tagClass * 7919) ^ tagNo ^ (IsExplicit() ? 0x0F : 0xF0) ^ obj.ToAsn1Object().CallAsn1GetHashCode();
}
public int TagClass
{
get { return tagClass; }
}
public int TagNo
{
get { return tagNo; }
}
public bool HasContextTag(int tagNo)
{
return this.tagClass == Asn1Tags.ContextSpecific && this.tagNo == tagNo;
}
public bool HasTag(int tagClass, int tagNo)
{
return this.tagClass == tagClass && this.tagNo == tagNo;
}
/**
* return whether or not the object may be explicitly tagged.
* <p>
* Note: if the object has been read from an input stream, the only
* time you can be sure if isExplicit is returning the true state of
* affairs is if it returns false. An implicitly tagged object may appear
* to be explicitly tagged, so you need to understand the context under
* which the reading was done as well, see GetObject below.</p>
*/
public bool IsExplicit()
{
// TODO New methods like 'IsKnownExplicit' etc. to distinguish uncertain cases?
switch (explicitness)
{
case DeclaredExplicit:
case ParsedExplicit:
return true;
default:
return false;
}
}
internal bool IsParsed()
{
switch (explicitness)
{
case ParsedExplicit:
case ParsedImplicit:
return true;
default:
return false;
}
}
/**
* return whatever was following the tag.
* <p>
* Note: tagged objects are generally context dependent if you're
* trying to extract a tagged object you should be going via the
* appropriate GetInstance method.</p>
*/
public Asn1Object GetObject()
{
if (Asn1Tags.ContextSpecific != TagClass)
throw new InvalidOperationException("this method only valid for CONTEXT_SPECIFIC tags");
return obj.ToAsn1Object();
}
/**
* Needed for open types, until we have better type-guided parsing support. Use sparingly for other
* purposes, and prefer {@link #getExplicitBaseTagged()}, {@link #getImplicitBaseTagged(int, int)} or
* {@link #getBaseUniversal(boolean, int)} where possible. Before using, check for matching tag
* {@link #getTagClass() class} and {@link #getTagNo() number}.
*/
public Asn1Encodable GetBaseObject()
{
return obj;
}
/**
* Needed for open types, until we have better type-guided parsing support. Use
* sparingly for other purposes, and prefer {@link #getExplicitBaseTagged()} or
* {@link #getBaseUniversal(boolean, int)} where possible. Before using, check
* for matching tag {@link #getTagClass() class} and {@link #getTagNo() number}.
*/
public Asn1Encodable GetExplicitBaseObject()
{
if (!IsExplicit())
throw new InvalidOperationException("object implicit - explicit expected.");
return obj;
}
public Asn1TaggedObject GetExplicitBaseTagged()
{
if (!IsExplicit())
throw new InvalidOperationException("object implicit - explicit expected.");
return CheckedCast(obj.ToAsn1Object());
}
public Asn1TaggedObject GetImplicitBaseTagged(int baseTagClass, int baseTagNo)
{
if (Asn1Tags.Universal == baseTagClass || (baseTagClass & Asn1Tags.Private) != baseTagClass)
throw new ArgumentException("invalid base tag class: " + baseTagClass, "baseTagClass");
switch (explicitness)
{
case DeclaredExplicit:
throw new InvalidOperationException("object explicit - implicit expected.");
case DeclaredImplicit:
{
Asn1TaggedObject declared = CheckedCast(obj.ToAsn1Object());
return Asn1Utilities.CheckTag(declared, baseTagClass, baseTagNo);
}
// Parsed; return a virtual tag (i.e. that couldn't have been present in the encoding)
default:
return ReplaceTag(baseTagClass, baseTagNo);
}
}
public Asn1Object GetBaseUniversal(bool declaredExplicit, int tagNo)
{
Asn1UniversalType universalType = Asn1UniversalTypes.Get(tagNo);
if (null == universalType)
throw new ArgumentException("unsupported UNIVERSAL tag number: " + tagNo, "tagNo");
return GetBaseUniversal(declaredExplicit, universalType);
}
internal Asn1Object GetBaseUniversal(bool declaredExplicit, Asn1UniversalType universalType)
{
if (declaredExplicit)
{
if (!IsExplicit())
throw new InvalidOperationException("object explicit - implicit expected.");
return universalType.CheckedCast(obj.ToAsn1Object());
}
if (DeclaredExplicit == explicitness)
throw new InvalidOperationException("object explicit - implicit expected.");
Asn1Object baseObject = obj.ToAsn1Object();
switch (explicitness)
{
case ParsedExplicit:
return universalType.FromImplicitConstructed(RebuildConstructed(baseObject));
case ParsedImplicit:
{
if (baseObject is Asn1Sequence asn1Sequence)
return universalType.FromImplicitConstructed(asn1Sequence);
return universalType.FromImplicitPrimitive((DerOctetString)baseObject);
}
default:
return universalType.CheckedCast(baseObject);
}
}
public IAsn1Convertible ParseBaseUniversal(bool declaredExplicit, int baseTagNo)
{
Asn1Object asn1Object = GetBaseUniversal(declaredExplicit, baseTagNo);
switch (baseTagNo)
{
case Asn1Tags.BitString:
return ((DerBitString)asn1Object).Parser;
case Asn1Tags.OctetString:
return ((Asn1OctetString)asn1Object).Parser;
case Asn1Tags.Sequence:
return ((Asn1Sequence)asn1Object).Parser;
case Asn1Tags.Set:
return ((Asn1Set)asn1Object).Parser;
}
return asn1Object;
}
public IAsn1Convertible ParseExplicitBaseObject()
{
return GetExplicitBaseObject();
}
public Asn1TaggedObjectParser ParseExplicitBaseTagged()
{
return GetExplicitBaseTagged();
}
public Asn1TaggedObjectParser ParseImplicitBaseTagged(int baseTagClass, int baseTagNo)
{
return GetImplicitBaseTagged(baseTagClass, baseTagNo);
}
public override string ToString()
{
return Asn1Utilities.GetTagText(tagClass, tagNo) + obj;
}
internal abstract string Asn1Encoding { get; }
internal abstract Asn1Sequence RebuildConstructed(Asn1Object asn1Object);
internal abstract Asn1TaggedObject ReplaceTag(int tagClass, int tagNo);
internal static Asn1Object CreateConstructedDL(int tagClass, int tagNo, Asn1EncodableVector contentsElements)
{
bool maybeExplicit = (contentsElements.Count == 1);
return maybeExplicit
? new DLTaggedObject(ParsedExplicit, tagClass, tagNo, contentsElements[0])
: new DLTaggedObject(ParsedImplicit, tagClass, tagNo, DLSequence.FromVector(contentsElements));
}
internal static Asn1Object CreateConstructedIL(int tagClass, int tagNo, Asn1EncodableVector contentsElements)
{
bool maybeExplicit = (contentsElements.Count == 1);
return maybeExplicit
? new BerTaggedObject(ParsedExplicit, tagClass, tagNo, contentsElements[0])
: new BerTaggedObject(ParsedImplicit, tagClass, tagNo, BerSequence.FromVector(contentsElements));
}
internal static Asn1Object CreatePrimitive(int tagClass, int tagNo, byte[] contentsOctets)
{
// Note: !CONSTRUCTED => IMPLICIT
return new DLTaggedObject(ParsedImplicit, tagClass, tagNo, new DerOctetString(contentsOctets));
}
private static Asn1TaggedObject CheckedCast(Asn1Object asn1Object)
{
Asn1TaggedObject taggedObject = asn1Object as Asn1TaggedObject;
if (null != taggedObject)
return taggedObject;
throw new InvalidOperationException("unexpected object: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(asn1Object));
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8dc761d7a5e48814998a495824555f3a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,53 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class Asn1Tags
{
public const int Boolean = 0x01;
public const int Integer = 0x02;
public const int BitString = 0x03;
public const int OctetString = 0x04;
public const int Null = 0x05;
public const int ObjectIdentifier = 0x06;
public const int ObjectDescriptor = 0x07;
public const int External = 0x08;
public const int Real = 0x09;
public const int Enumerated = 0x0a;
public const int EmbeddedPdv = 0x0b;
public const int Utf8String = 0x0c;
public const int RelativeOid = 0x0d;
// NOTE: 14-15 are reserved.
public const int Sequence = 0x10;
public const int SequenceOf = 0x10; // for completeness
public const int Set = 0x11;
public const int SetOf = 0x11; // for completeness
public const int NumericString = 0x12;
public const int PrintableString = 0x13;
public const int T61String = 0x14;
public const int VideotexString = 0x15;
public const int IA5String = 0x16;
public const int UtcTime = 0x17;
public const int GeneralizedTime = 0x18;
public const int GraphicString = 0x19;
public const int VisibleString = 0x1a;
public const int GeneralString = 0x1b;
public const int UniversalString = 0x1c;
public const int UnrestrictedString = 0x1d;
public const int BmpString = 0x1e;
public const int Constructed = 0x20;
public const int Universal = 0x00;
public const int Application = 0x40;
public const int ContextSpecific = 0x80;
public const int Private = 0xC0;
public const int Flags = 0xE0;
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1d609f8d10b0a5c469fd85eb4b389e30
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,33 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
internal abstract class Asn1Type
{
internal readonly Type m_platformType;
internal Asn1Type(Type platformType)
{
m_platformType = platformType;
}
internal Type PlatformType
{
get { return m_platformType; }
}
public sealed override bool Equals(object that)
{
return this == that;
}
public sealed override int GetHashCode()
{
return base.GetHashCode();
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ffac7d6916dbabc449fd3c8f9f3b51c5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,63 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
#if UNITY_WSA && !UNITY_EDITOR && !ENABLE_IL2CPP
using System.TypeFix;
#endif
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
internal abstract class Asn1UniversalType
: Asn1Type
{
internal readonly Asn1Tag m_tag;
internal Asn1UniversalType(Type platformType, int tagNo)
: base(platformType)
{
m_tag = Asn1Tag.Create(Asn1Tags.Universal, tagNo);
}
internal Asn1Object CheckedCast(Asn1Object asn1Object)
{
if (PlatformType.IsInstanceOfType(asn1Object))
return asn1Object;
throw new InvalidOperationException("unexpected object: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(asn1Object));
}
internal virtual Asn1Object FromImplicitPrimitive(DerOctetString octetString)
{
throw new InvalidOperationException("unexpected implicit primitive encoding");
}
internal virtual Asn1Object FromImplicitConstructed(Asn1Sequence sequence)
{
throw new InvalidOperationException("unexpected implicit constructed encoding");
}
/// <exception cref="IOException"/>
internal Asn1Object FromByteArray(byte[] bytes)
{
return CheckedCast(Asn1Object.FromByteArray(bytes));
}
internal Asn1Object GetContextInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
if (Asn1Tags.ContextSpecific != taggedObject.TagClass)
throw new InvalidOperationException("this method only valid for CONTEXT_SPECIFIC tags");
return CheckedCast(taggedObject.GetBaseUniversal(declaredExplicit, this));
}
internal Asn1Tag Tag
{
get { return m_tag; }
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1449dc3fb760c69478b79ac2d2d26975
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,78 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
internal sealed class Asn1UniversalTypes
{
private Asn1UniversalTypes()
{
}
internal static Asn1UniversalType Get(int tagNo)
{
switch (tagNo)
{
case Asn1Tags.Boolean:
return DerBoolean.Meta.Instance;
case Asn1Tags.Integer:
return DerInteger.Meta.Instance;
case Asn1Tags.BitString:
return DerBitString.Meta.Instance;
case Asn1Tags.OctetString:
return Asn1OctetString.Meta.Instance;
case Asn1Tags.Null:
return Asn1Null.Meta.Instance;
case Asn1Tags.ObjectIdentifier:
return DerObjectIdentifier.Meta.Instance;
case Asn1Tags.ObjectDescriptor: // [UNIVERSAL 7] IMPLICIT GraphicString
return Asn1ObjectDescriptor.Meta.Instance;
case Asn1Tags.External:
return DerExternal.Meta.Instance;
case Asn1Tags.Enumerated:
return DerEnumerated.Meta.Instance;
case Asn1Tags.Utf8String: // [UNIVERSAL 12] IMPLICIT OCTET STRING (encode as if)
return DerUtf8String.Meta.Instance;
case Asn1Tags.RelativeOid:
return Asn1RelativeOid.Meta.Instance;
case Asn1Tags.Sequence:
return Asn1Sequence.Meta.Instance;
case Asn1Tags.Set:
return Asn1Set.Meta.Instance;
case Asn1Tags.NumericString: // [UNIVERSAL 18] IMPLICIT OCTET STRING (encode as if)
return DerNumericString.Meta.Instance;
case Asn1Tags.PrintableString: // [UNIVERSAL 19] IMPLICIT OCTET STRING (encode as if)
return DerPrintableString.Meta.Instance;
case Asn1Tags.T61String: // [UNIVERSAL 20] IMPLICIT OCTET STRING (encode as if)
return DerT61String.Meta.Instance;
case Asn1Tags.VideotexString: // [UNIVERSAL 21] IMPLICIT OCTET STRING (encode as if)
return DerVideotexString.Meta.Instance;
case Asn1Tags.IA5String: // [UNIVERSAL 22] IMPLICIT OCTET STRING (encode as if)
return DerIA5String.Meta.Instance;
case Asn1Tags.UtcTime: // [UNIVERSAL 23] IMPLICIT VisibleString (restricted values)
return Asn1UtcTime.Meta.Instance;
case Asn1Tags.GeneralizedTime: // [UNIVERSAL 24] IMPLICIT VisibleString (restricted values)
return Asn1GeneralizedTime.Meta.Instance;
case Asn1Tags.GraphicString: // [UNIVERSAL 25] IMPLICIT OCTET STRING (encode as if)
return DerGraphicString.Meta.Instance;
case Asn1Tags.VisibleString: // [UNIVERSAL 26] IMPLICIT OCTET STRING (encode as if)
return DerVisibleString.Meta.Instance;
case Asn1Tags.GeneralString: // [UNIVERSAL 27] IMPLICIT OCTET STRING (encode as if)
return DerGeneralString.Meta.Instance;
case Asn1Tags.UniversalString: // [UNIVERSAL 28] IMPLICIT OCTET STRING (encode as if)
return DerUniversalString.Meta.Instance;
case Asn1Tags.BmpString: // [UNIVERSAL 30] IMPLICIT OCTET STRING (encode as if)
return DerBmpString.Meta.Instance;
case Asn1Tags.Real:
case Asn1Tags.EmbeddedPdv:
case Asn1Tags.UnrestrictedString:
default:
return null;
}
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 839094e1a57356a4eaefab55a4481ef9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,257 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Globalization;
using System.IO;
using System.Text;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Date;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
/// <summary>UTCTime ASN.1 type</summary>
public class Asn1UtcTime
: Asn1Object
{
internal class Meta : Asn1UniversalType
{
internal static readonly Asn1UniversalType Instance = new Meta();
private Meta() : base(typeof(Asn1UtcTime), Asn1Tags.UtcTime) {}
internal override Asn1Object FromImplicitPrimitive(DerOctetString octetString)
{
return CreatePrimitive(octetString.GetOctets());
}
}
/**
* return a UTC Time from the passed in object.
*
* @exception ArgumentException if the object cannot be converted.
*/
public static Asn1UtcTime GetInstance(object obj)
{
if (obj == null)
return null;
if (obj is Asn1UtcTime asn1UtcTime)
return asn1UtcTime;
if (obj is IAsn1Convertible asn1Convertible)
{
Asn1Object asn1Object = asn1Convertible.ToAsn1Object();
if (asn1Object is Asn1UtcTime converted)
return converted;
}
else if (obj is byte[] bytes)
{
try
{
return (Asn1UtcTime)Meta.Instance.FromByteArray(bytes);
}
catch (IOException e)
{
throw new ArgumentException("failed to construct UTC time from byte[]: " + e.Message);
}
}
throw new ArgumentException("illegal object in GetInstance: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(obj), nameof(obj));
}
public static Asn1UtcTime GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return (Asn1UtcTime)Meta.Instance.GetContextInstance(taggedObject, declaredExplicit);
}
private readonly string m_timeString;
private readonly DateTime m_dateTime;
private readonly bool m_dateTimeLocked;
private readonly int m_twoDigitYearMax;
public Asn1UtcTime(string timeString)
{
m_timeString = timeString ?? throw new ArgumentNullException(nameof(timeString));
try
{
m_dateTime = FromString(timeString, out m_twoDigitYearMax);
m_dateTimeLocked = false;
}
catch (FormatException e)
{
throw new ArgumentException("invalid date string: " + e.Message);
}
}
public Asn1UtcTime(DateTime dateTime)
{
dateTime = DateTimeUtilities.WithPrecisionSecond(dateTime.ToUniversalTime());
m_dateTime = dateTime;
m_dateTimeLocked = true;
m_timeString = ToStringCanonical(dateTime, out m_twoDigitYearMax);
}
public Asn1UtcTime(DateTime dateTime, int twoDigitYearMax)
{
dateTime = DateTimeUtilities.WithPrecisionSecond(dateTime.ToUniversalTime());
Validate(dateTime, twoDigitYearMax);
m_dateTime = dateTime;
m_dateTimeLocked = true;
m_timeString = ToStringCanonical(dateTime);
m_twoDigitYearMax = twoDigitYearMax;
}
internal Asn1UtcTime(byte[] contents)
// NOTE: Non-ASCII characters will produce '?' characters, which will fail DateTime parsing
: this(Encoding.ASCII.GetString(contents))
{
}
public string TimeString => m_timeString;
public DateTime ToDateTime()
{
return m_dateTime;
}
public DateTime ToDateTime(int twoDigitYearMax)
{
if (InRange(m_dateTime, twoDigitYearMax))
return m_dateTime;
if (m_dateTimeLocked)
throw new InvalidOperationException();
int twoDigitYear = m_dateTime.Year % 100;
int twoDigitYearCutoff = twoDigitYearMax % 100;
int diff = twoDigitYear - twoDigitYearCutoff;
int newYear = twoDigitYearMax + diff;
if (diff > 0)
{
newYear -= 100;
}
return m_dateTime.AddYears(newYear - m_dateTime.Year);
}
public DateTime ToDateTime(Calendar calendar)
{
return ToDateTime(calendar.TwoDigitYearMax);
}
/// <summary>Return an adjusted date in the range of 1950 - 2049.</summary>
public DateTime ToAdjustedDateTime()
{
return ToDateTime(2049);
}
public int TwoDigitYearMax => m_twoDigitYearMax;
internal byte[] GetContents(int encoding)
{
if (encoding == Asn1OutputStream.EncodingDer && m_timeString.Length != 13)
{
string canonical = ToStringCanonical(m_dateTime);
return Encoding.ASCII.GetBytes(canonical);
}
return Encoding.ASCII.GetBytes(m_timeString);
}
internal override IAsn1Encoding GetEncoding(int encoding)
{
return new PrimitiveEncoding(Asn1Tags.Universal, Asn1Tags.UtcTime, GetContents(encoding));
}
internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo)
{
return new PrimitiveEncoding(tagClass, tagNo, GetContents(encoding));
}
protected override bool Asn1Equals(Asn1Object asn1Object)
{
if (!(asn1Object is Asn1UtcTime that))
return false;
// TODO Performance
return Arrays.AreEqual(
this.GetContents(Asn1OutputStream.EncodingDer),
that.GetContents(Asn1OutputStream.EncodingDer));
}
protected override int Asn1GetHashCode()
{
// TODO Performance
return Arrays.GetHashCode(
this.GetContents(Asn1OutputStream.EncodingDer));
}
public override string ToString()
{
return m_timeString;
}
internal static Asn1UtcTime CreatePrimitive(byte[] contents)
{
return new Asn1UtcTime(contents);
}
private static DateTime FromString(string s, out int twoDigitYearMax)
{
var provider = DateTimeFormatInfo.InvariantInfo;
twoDigitYearMax = provider.Calendar.TwoDigitYearMax;
switch (s.Length)
{
case 11:
return DateTime.ParseExact(s, @"yyMMddHHmm\Z", provider,
DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
case 13:
return DateTime.ParseExact(s, @"yyMMddHHmmss\Z", provider,
DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
case 15:
return DateTime.ParseExact(s, @"yyMMddHHmmzzz", provider, DateTimeStyles.AdjustToUniversal);
case 17:
return DateTime.ParseExact(s, @"yyMMddHHmmsszzz", provider, DateTimeStyles.AdjustToUniversal);
default:
throw new FormatException();
}
}
private static bool InRange(DateTime dateTime, int twoDigitYearMax)
{
return (uint)(twoDigitYearMax - dateTime.Year) < 100;
}
private static string ToStringCanonical(DateTime dateTime, out int twoDigitYearMax)
{
var provider = DateTimeFormatInfo.InvariantInfo;
twoDigitYearMax = provider.Calendar.TwoDigitYearMax;
Validate(dateTime, twoDigitYearMax);
return dateTime.ToString(@"yyMMddHHmmss\Z", provider);
}
private static string ToStringCanonical(DateTime dateTime)
{
return dateTime.ToString(@"yyMMddHHmmss\Z", DateTimeFormatInfo.InvariantInfo);
}
private static void Validate(DateTime dateTime, int twoDigitYearMax)
{
if (!InRange(dateTime, twoDigitYearMax))
throw new ArgumentOutOfRangeException(nameof(dateTime));
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: edf61982cdff33c408181b8d191ae7ce
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,333 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public abstract class Asn1Utilities
{
internal static Asn1TaggedObject CheckTag(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
{
if (!taggedObject.HasTag(tagClass, tagNo))
{
string expected = GetTagText(tagClass, tagNo);
string found = GetTagText(taggedObject);
throw new InvalidOperationException("Expected " + expected + " tag but found " + found);
}
return taggedObject;
}
internal static Asn1TaggedObjectParser CheckTag(Asn1TaggedObjectParser taggedObjectParser, int tagClass,
int tagNo)
{
if (!taggedObjectParser.HasTag(tagClass, tagNo))
{
string expected = GetTagText(tagClass, tagNo);
string found = GetTagText(taggedObjectParser);
throw new InvalidOperationException("Expected " + expected + " tag but found " + found);
}
return taggedObjectParser;
}
internal static string GetTagText(Asn1Tag tag)
{
return GetTagText(tag.TagClass, tag.TagNo);
}
public static string GetTagText(Asn1TaggedObject taggedObject)
{
return GetTagText(taggedObject.TagClass, taggedObject.TagNo);
}
public static string GetTagText(Asn1TaggedObjectParser taggedObjectParser)
{
return GetTagText(taggedObjectParser.TagClass, taggedObjectParser.TagNo);
}
public static string GetTagText(int tagClass, int tagNo)
{
switch (tagClass)
{
case Asn1Tags.Application:
return "[APPLICATION " + tagNo + "]";
case Asn1Tags.ContextSpecific:
return "[CONTEXT " + tagNo + "]";
case Asn1Tags.Private:
return "[PRIVATE " + tagNo + "]";
default:
return "[UNIVERSAL " + tagNo + "]";
}
}
/*
* Wrappers for Asn1TaggedObject.GetExplicitBaseObject
*/
public static Asn1Encodable GetExplicitBaseObject(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
{
return CheckTag(taggedObject, tagClass, tagNo).GetExplicitBaseObject();
}
public static Asn1Encodable GetExplicitContextBaseObject(Asn1TaggedObject taggedObject, int tagNo)
{
return GetExplicitBaseObject(taggedObject, Asn1Tags.ContextSpecific, tagNo);
}
public static Asn1Encodable TryGetExplicitBaseObject(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
{
if (!taggedObject.HasTag(tagClass, tagNo))
return null;
return taggedObject.GetExplicitBaseObject();
}
public static Asn1Encodable TryGetExplicitContextBaseObject(Asn1TaggedObject taggedObject, int tagNo)
{
return TryGetExplicitBaseObject(taggedObject, Asn1Tags.ContextSpecific, tagNo);
}
/*
* Wrappers for Asn1TaggedObject.GetExplicitBaseTagged
*/
public static Asn1TaggedObject GetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
{
return CheckTag(taggedObject, tagClass, tagNo).GetExplicitBaseTagged();
}
public static Asn1TaggedObject GetExplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo)
{
return GetExplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific, tagNo);
}
public static Asn1TaggedObject TryGetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
{
if (!taggedObject.HasTag(tagClass, tagNo))
return null;
return taggedObject.GetExplicitBaseTagged();
}
public static Asn1TaggedObject TryGetExplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo)
{
return TryGetExplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific, tagNo);
}
/*
* Wrappers for Asn1TaggedObject.GetImplicitBaseTagged
*/
public static Asn1TaggedObject GetImplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo,
int baseTagClass, int baseTagNo)
{
return CheckTag(taggedObject, tagClass, tagNo).GetImplicitBaseTagged(baseTagClass, baseTagNo);
}
public static Asn1TaggedObject GetImplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo,
int baseTagClass, int baseTagNo)
{
return GetImplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific, tagNo, baseTagClass, baseTagNo);
}
public static Asn1TaggedObject TryGetImplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo,
int baseTagClass, int baseTagNo)
{
if (!taggedObject.HasTag(tagClass, tagNo))
return null;
return taggedObject.GetImplicitBaseTagged(baseTagClass, baseTagNo);
}
public static Asn1TaggedObject TryGetImplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo,
int baseTagClass, int baseTagNo)
{
return TryGetImplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific, tagNo, baseTagClass, baseTagNo);
}
/*
* Wrappers for Asn1TaggedObject.GetBaseUniversal
*/
public static Asn1Object GetBaseUniversal(Asn1TaggedObject taggedObject, int tagClass, int tagNo,
bool declaredExplicit, int baseTagNo)
{
return CheckTag(taggedObject, tagClass, tagNo).GetBaseUniversal(declaredExplicit, baseTagNo);
}
public static Asn1Object GetContextBaseUniversal(Asn1TaggedObject taggedObject, int tagNo,
bool declaredExplicit, int baseTagNo)
{
return GetBaseUniversal(taggedObject, Asn1Tags.ContextSpecific, tagNo, declaredExplicit, baseTagNo);
}
public static Asn1Object TryGetBaseUniversal(Asn1TaggedObject taggedObject, int tagClass, int tagNo,
bool declaredExplicit, int baseTagNo)
{
if (!taggedObject.HasTag(tagClass, tagNo))
return null;
return taggedObject.GetBaseUniversal(declaredExplicit, baseTagNo);
}
public static Asn1Object TryGetContextBaseUniversal(Asn1TaggedObject taggedObject, int tagNo,
bool declaredExplicit, int baseTagNo)
{
return TryGetBaseUniversal(taggedObject, Asn1Tags.ContextSpecific, tagNo, declaredExplicit, baseTagNo);
}
/*
* Wrappers for Asn1TaggedObjectParser.ParseExplicitBaseTagged
*/
/// <exception cref="IOException"/>
public static Asn1TaggedObjectParser ParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser,
int tagClass, int tagNo)
{
return CheckTag(taggedObjectParser, tagClass, tagNo).ParseExplicitBaseTagged();
}
/// <exception cref="IOException"/>
public static Asn1TaggedObjectParser ParseExplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser,
int tagNo)
{
return ParseExplicitBaseTagged(taggedObjectParser, Asn1Tags.ContextSpecific, tagNo);
}
/// <exception cref="IOException"/>
public static Asn1TaggedObjectParser TryParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser,
int tagClass, int tagNo)
{
if (!taggedObjectParser.HasTag(tagClass, tagNo))
return null;
return taggedObjectParser.ParseExplicitBaseTagged();
}
/// <exception cref="IOException"/>
public static Asn1TaggedObjectParser TryParseExplicitContextBaseTagged(
Asn1TaggedObjectParser taggedObjectParser, int tagNo)
{
return TryParseExplicitBaseTagged(taggedObjectParser, Asn1Tags.ContextSpecific, tagNo);
}
/*
* Wrappers for Asn1TaggedObjectParser.ParseImplicitBaseTagged
*/
/// <exception cref="IOException"/>
public static Asn1TaggedObjectParser ParseImplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser,
int tagClass, int tagNo, int baseTagClass, int baseTagNo)
{
return CheckTag(taggedObjectParser, tagClass, tagNo).ParseImplicitBaseTagged(baseTagClass, baseTagNo);
}
/// <exception cref="IOException"/>
public static Asn1TaggedObjectParser ParseImplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser,
int tagNo, int baseTagClass, int baseTagNo)
{
return ParseImplicitBaseTagged(taggedObjectParser, Asn1Tags.ContextSpecific, tagNo, baseTagClass,
baseTagNo);
}
/// <exception cref="IOException"/>
public static Asn1TaggedObjectParser TryParseImplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser,
int tagClass, int tagNo, int baseTagClass, int baseTagNo)
{
if (!taggedObjectParser.HasTag(tagClass, tagNo))
return null;
return taggedObjectParser.ParseImplicitBaseTagged(baseTagClass, baseTagNo);
}
/// <exception cref="IOException"/>
public static Asn1TaggedObjectParser TryParseImplicitContextBaseTagged(
Asn1TaggedObjectParser taggedObjectParser, int tagNo, int baseTagClass, int baseTagNo)
{
return TryParseImplicitBaseTagged(taggedObjectParser, Asn1Tags.ContextSpecific, tagNo, baseTagClass,
baseTagNo);
}
/*
* Wrappers for Asn1TaggedObjectParser.ParseBaseUniversal
*/
/// <exception cref="IOException"/>
public static IAsn1Convertible ParseBaseUniversal(Asn1TaggedObjectParser taggedObjectParser, int tagClass,
int tagNo, bool declaredExplicit, int baseTagNo)
{
return CheckTag(taggedObjectParser, tagClass, tagNo).ParseBaseUniversal(declaredExplicit, baseTagNo);
}
/// <exception cref="IOException"/>
public static IAsn1Convertible ParseContextBaseUniversal(Asn1TaggedObjectParser taggedObjectParser, int tagNo,
bool declaredExplicit, int baseTagNo)
{
return ParseBaseUniversal(taggedObjectParser, Asn1Tags.ContextSpecific, tagNo, declaredExplicit, baseTagNo);
}
/// <exception cref="IOException"/>
public static IAsn1Convertible TryParseBaseUniversal(Asn1TaggedObjectParser taggedObjectParser, int tagClass,
int tagNo, bool declaredExplicit, int baseTagNo)
{
if (!taggedObjectParser.HasTag(tagClass, tagNo))
return null;
return taggedObjectParser.ParseBaseUniversal(declaredExplicit, baseTagNo);
}
/// <exception cref="IOException"/>
public static IAsn1Convertible TryParseContextBaseUniversal(Asn1TaggedObjectParser taggedObjectParser,
int tagNo, bool declaredExplicit, int baseTagNo)
{
return TryParseBaseUniversal(taggedObjectParser, Asn1Tags.ContextSpecific, tagNo, declaredExplicit,
baseTagNo);
}
/*
* Wrappers for Asn1TaggedObjectParser.ParseExplicitBaseObject
*/
/// <exception cref="IOException"/>
public static IAsn1Convertible ParseExplicitBaseObject(Asn1TaggedObjectParser taggedObjectParser, int tagClass,
int tagNo)
{
return CheckTag(taggedObjectParser, tagClass, tagNo).ParseExplicitBaseObject();
}
/// <exception cref="IOException"/>
public static IAsn1Convertible ParseExplicitContextBaseObject(Asn1TaggedObjectParser taggedObjectParser,
int tagNo)
{
return ParseExplicitBaseObject(taggedObjectParser, Asn1Tags.ContextSpecific, tagNo);
}
/// <exception cref="IOException"/>
public static IAsn1Convertible TryParseExplicitBaseObject(Asn1TaggedObjectParser taggedObjectParser,
int tagClass, int tagNo)
{
if (!taggedObjectParser.HasTag(tagClass, tagNo))
return null;
return taggedObjectParser.ParseExplicitBaseObject();
}
/// <exception cref="IOException"/>
public static IAsn1Convertible TryParseExplicitContextBaseObject(Asn1TaggedObjectParser taggedObjectParser,
int tagNo)
{
return TryParseExplicitBaseObject(taggedObjectParser, Asn1Tags.ContextSpecific, tagNo);
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 62e229680bdece24987221dc054bce7d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,142 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Diagnostics;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class BerBitString
: DerBitString
{
private const int DefaultSegmentLimit = 1000;
internal static byte[] FlattenBitStrings(DerBitString[] bitStrings)
{
int count = bitStrings.Length;
switch (count)
{
case 0:
// No bits
return new byte[]{ 0 };
case 1:
return bitStrings[0].contents;
default:
{
int last = count - 1, totalLength = 0;
for (int i = 0; i < last; ++i)
{
byte[] elementContents = bitStrings[i].contents;
if (elementContents[0] != 0)
throw new ArgumentException("only the last nested bitstring can have padding", "bitStrings");
totalLength += elementContents.Length - 1;
}
// Last one can have padding
byte[] lastElementContents = bitStrings[last].contents;
byte padBits = lastElementContents[0];
totalLength += lastElementContents.Length;
byte[] contents = new byte[totalLength];
contents[0] = padBits;
int pos = 1;
for (int i = 0; i < count; ++i)
{
byte[] elementContents = bitStrings[i].contents;
int length = elementContents.Length - 1;
Array.Copy(elementContents, 1, contents, pos, length);
pos += length;
}
Debug.Assert(pos == totalLength);
return contents;
}
}
}
private readonly int segmentLimit;
private readonly DerBitString[] elements;
public BerBitString(byte data, int padBits)
: base(data, padBits)
{
this.elements = null;
this.segmentLimit = DefaultSegmentLimit;
}
public BerBitString(byte[] data)
: this(data, 0)
{
}
public BerBitString(byte[] data, int padBits)
: this(data, padBits, DefaultSegmentLimit)
{
}
public BerBitString(byte[] data, int padBits, int segmentLimit)
: base(data, padBits)
{
this.elements = null;
this.segmentLimit = segmentLimit;
}
public BerBitString(int namedBits)
: base(namedBits)
{
this.elements = null;
this.segmentLimit = DefaultSegmentLimit;
}
public BerBitString(Asn1Encodable obj)
: this(obj.GetDerEncoded(), 0)
{
}
public BerBitString(DerBitString[] elements)
: this(elements, DefaultSegmentLimit)
{
}
public BerBitString(DerBitString[] elements, int segmentLimit)
: base(FlattenBitStrings(elements), false)
{
this.elements = elements;
this.segmentLimit = segmentLimit;
}
internal BerBitString(byte[] contents, bool check)
: base(contents, check)
{
this.elements = null;
this.segmentLimit = DefaultSegmentLimit;
}
internal override IAsn1Encoding GetEncoding(int encoding)
{
if (Asn1OutputStream.EncodingBer != encoding)
return base.GetEncoding(encoding);
if (null == elements)
return new PrimitiveEncoding(Asn1Tags.Universal, Asn1Tags.BitString, contents);
return new ConstructedILEncoding(Asn1Tags.Universal, Asn1Tags.BitString,
Asn1OutputStream.GetContentsEncodings(encoding, elements));
}
internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo)
{
if (Asn1OutputStream.EncodingBer != encoding)
return base.GetEncodingImplicit(encoding, tagClass, tagNo);
if (null == elements)
return new PrimitiveEncoding(tagClass, tagNo, contents);
return new ConstructedILEncoding(tagClass, tagNo,
Asn1OutputStream.GetContentsEncodings(encoding, elements));
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2e6d38188b772c2409c7dad9240d601a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public abstract class BerGenerator
: Asn1Generator
{
private bool _tagged = false;
private bool _isExplicit;
private int _tagNo;
protected BerGenerator(
Stream outStream)
: base(outStream)
{
}
protected BerGenerator(
Stream outStream,
int tagNo,
bool isExplicit)
: base(outStream)
{
_tagged = true;
_isExplicit = isExplicit;
_tagNo = tagNo;
}
public override void AddObject(Asn1Encodable obj)
{
obj.EncodeTo(Out);
}
public override void AddObject(Asn1Object obj)
{
obj.EncodeTo(Out);
}
public override Stream GetRawOutputStream()
{
return Out;
}
public override void Close()
{
WriteBerEnd();
}
private void WriteHdr(
int tag)
{
Out.WriteByte((byte) tag);
Out.WriteByte(0x80);
}
protected void WriteBerHeader(
int tag)
{
if (_tagged)
{
int tagNum = _tagNo | Asn1Tags.ContextSpecific;
if (_isExplicit)
{
WriteHdr(tagNum | Asn1Tags.Constructed);
WriteHdr(tag);
}
else
{
if ((tag & Asn1Tags.Constructed) != 0)
{
WriteHdr(tagNum | Asn1Tags.Constructed);
}
else
{
WriteHdr(tagNum);
}
}
}
else
{
WriteHdr(tag);
}
}
protected void WriteBerBody(
Stream contentStream)
{
Streams.PipeAll(contentStream, Out);
}
protected void WriteBerEnd()
{
Out.WriteByte(0x00);
Out.WriteByte(0x00);
if (_tagged && _isExplicit) // write extra end for tag header
{
Out.WriteByte(0x00);
Out.WriteByte(0x00);
}
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ebf471a1d43735f4aa2425eda406c2d7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,162 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class BerOctetStringGenerator
: BerGenerator
{
public BerOctetStringGenerator(Stream outStream)
: base(outStream)
{
WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.OctetString);
}
public BerOctetStringGenerator(
Stream outStream,
int tagNo,
bool isExplicit)
: base(outStream, tagNo, isExplicit)
{
WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.OctetString);
}
public Stream GetOctetOutputStream()
{
return GetOctetOutputStream(new byte[1000]); // limit for CER encoding.
}
public Stream GetOctetOutputStream(
int bufSize)
{
return bufSize < 1
? GetOctetOutputStream()
: GetOctetOutputStream(new byte[bufSize]);
}
public Stream GetOctetOutputStream(
byte[] buf)
{
return new BufferedBerOctetStream(this, buf);
}
private class BufferedBerOctetStream
: BaseOutputStream
{
private byte[] _buf;
private int _off;
private readonly BerOctetStringGenerator _gen;
private readonly Asn1OutputStream _derOut;
internal BufferedBerOctetStream(
BerOctetStringGenerator gen,
byte[] buf)
{
_gen = gen;
_buf = buf;
_off = 0;
_derOut = Asn1OutputStream.Create(_gen.Out, Asn1Encodable.Der);
}
public override void Write(byte[] buffer, int offset, int count)
{
Streams.ValidateBufferArguments(buffer, offset, count);
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
Write(buffer.AsSpan(offset, count));
#else
int bufLen = _buf.Length;
int available = bufLen - _off;
if (count < available)
{
Array.Copy(buffer, offset, _buf, _off, count);
_off += count;
return;
}
int pos = 0;
if (_off > 0)
{
Array.Copy(buffer, offset, _buf, _off, available);
pos = available;
DerOctetString.Encode(_derOut, _buf, 0, bufLen);
//_off = 0;
}
int remaining;
while ((remaining = count - pos) >= bufLen)
{
DerOctetString.Encode(_derOut, buffer, offset + pos, bufLen);
pos += bufLen;
}
Array.Copy(buffer, offset + pos, _buf, 0, remaining);
this._off = remaining;
#endif
}
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
public override void Write(ReadOnlySpan<byte> buffer)
{
int bufLen = _buf.Length;
int available = bufLen - _off;
if (buffer.Length < available)
{
buffer.CopyTo(_buf.AsSpan(_off));
_off += buffer.Length;
return;
}
if (_off > 0)
{
DerOctetString.Encode(_derOut, _buf.AsSpan(0, _off), buffer[..available]);
buffer = buffer[available..];
//_off = 0;
}
while (buffer.Length >= bufLen)
{
DerOctetString.Encode(_derOut, buffer[..bufLen]);
buffer = buffer[bufLen..];
}
buffer.CopyTo(_buf.AsSpan());
_off = buffer.Length;
}
#endif
public override void WriteByte(byte value)
{
_buf[_off++] = value;
if (_off == _buf.Length)
{
DerOctetString.Encode(_derOut, _buf, 0, _off);
_off = 0;
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (_off != 0)
{
DerOctetString.Encode(_derOut, _buf, 0, _off);
}
_derOut.FlushInternal();
_gen.WriteBerEnd();
}
base.Dispose(disposing);
}
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d5318cc9ca270a547b9434252273ff30
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,44 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class BerOctetStringParser
: Asn1OctetStringParser
{
private readonly Asn1StreamParser _parser;
internal BerOctetStringParser(Asn1StreamParser parser)
{
_parser = parser;
}
public Stream GetOctetStream()
{
return new ConstructedOctetStream(_parser);
}
public Asn1Object ToAsn1Object()
{
try
{
return Parse(_parser);
}
catch (IOException e)
{
throw new Asn1ParsingException("IOException converting stream to byte array: " + e.Message, e);
}
}
internal static BerOctetString Parse(Asn1StreamParser sp)
{
return new BerOctetString(Streams.ReadAll(new ConstructedOctetStream(sp)));
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f349002b9962c3f449219681235b114a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,28 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class BerSequenceGenerator
: BerGenerator
{
public BerSequenceGenerator(
Stream outStream)
: base(outStream)
{
WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.Sequence);
}
public BerSequenceGenerator(
Stream outStream,
int tagNo,
bool isExplicit)
: base(outStream, tagNo, isExplicit)
{
WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.Sequence);
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 39e69b682926f0348a2f183f3d1c8913
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,34 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class BerSequenceParser
: Asn1SequenceParser
{
private readonly Asn1StreamParser _parser;
internal BerSequenceParser(Asn1StreamParser parser)
{
this._parser = parser;
}
public IAsn1Convertible ReadObject()
{
return _parser.ReadObject();
}
public Asn1Object ToAsn1Object()
{
return Parse(_parser);
}
internal static BerSequence Parse(Asn1StreamParser sp)
{
return new BerSequence(sp.ReadVector());
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6d593cc0e2b63d14a8aeed9ce0369876
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,28 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class BerSetGenerator
: BerGenerator
{
public BerSetGenerator(
Stream outStream)
: base(outStream)
{
WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.Set);
}
public BerSetGenerator(
Stream outStream,
int tagNo,
bool isExplicit)
: base(outStream, tagNo, isExplicit)
{
WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.Set);
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0fbdbc3f5ccf9f446b5a5b30159adca1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,34 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class BerSetParser
: Asn1SetParser
{
private readonly Asn1StreamParser _parser;
internal BerSetParser(Asn1StreamParser parser)
{
this._parser = parser;
}
public IAsn1Convertible ReadObject()
{
return _parser.ReadObject();
}
public Asn1Object ToAsn1Object()
{
return Parse(_parser);
}
internal static BerSet Parse(Asn1StreamParser sp)
{
return new BerSet(sp.ReadVector());
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0260d4642cd5cf94c965eb9cd0ea9635
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,84 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
internal class BerTaggedObjectParser
: Asn1TaggedObjectParser
{
internal readonly int m_tagClass;
internal readonly int m_tagNo;
internal readonly Asn1StreamParser m_parser;
internal BerTaggedObjectParser(int tagClass, int tagNo, Asn1StreamParser parser)
{
m_tagClass = tagClass;
m_tagNo = tagNo;
m_parser = parser;
}
public virtual bool IsConstructed
{
get { return true; }
}
public int TagClass
{
get { return m_tagClass; }
}
public int TagNo
{
get { return m_tagNo; }
}
public bool HasContextTag(int tagNo)
{
return m_tagClass == Asn1Tags.ContextSpecific && m_tagNo == tagNo;
}
public bool HasTag(int tagClass, int tagNo)
{
return m_tagClass == tagClass && m_tagNo == tagNo;
}
public virtual IAsn1Convertible ParseBaseUniversal(bool declaredExplicit, int baseTagNo)
{
if (declaredExplicit)
return m_parser.ParseObject(baseTagNo);
return m_parser.ParseImplicitConstructedIL(baseTagNo);
}
public virtual IAsn1Convertible ParseExplicitBaseObject()
{
return m_parser.ReadObject();
}
public virtual Asn1TaggedObjectParser ParseExplicitBaseTagged()
{
return m_parser.ParseTaggedObject();
}
public virtual Asn1TaggedObjectParser ParseImplicitBaseTagged(int baseTagClass, int baseTagNo)
{
return new BerTaggedObjectParser(baseTagClass, baseTagNo, m_parser);
}
public virtual Asn1Object ToAsn1Object()
{
try
{
return m_parser.LoadTaggedIL(TagClass, TagNo);
}
catch (IOException e)
{
throw new Asn1ParsingException(e.Message);
}
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 59190053596d8924a9902581e3b94f46
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,3 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2d565bd50647e32459915b52caf8d736
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,2 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f60af26f2a3ecad4ab67ab32b5796bbe
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,60 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
/// <summary>A parser for indefinite-length BIT STRINGs.</summary>
internal class BerBitStringParser
: Asn1BitStringParser
{
private readonly Asn1StreamParser m_parser;
private ConstructedBitStream m_bitStream;
internal BerBitStringParser(Asn1StreamParser parser)
{
m_parser = parser;
}
public Stream GetOctetStream()
{
return m_bitStream = new ConstructedBitStream(m_parser, true);
}
public Stream GetBitStream()
{
return m_bitStream = new ConstructedBitStream(m_parser, false);
}
public int PadBits
{
get { return m_bitStream.PadBits; }
}
public Asn1Object ToAsn1Object()
{
try
{
return Parse(m_parser);
}
catch (IOException e)
{
throw new Asn1ParsingException("IOException converting stream to byte array: " + e.Message, e);
}
}
internal static BerBitString Parse(Asn1StreamParser sp)
{
ConstructedBitStream bitStream = new ConstructedBitStream(sp, false);
byte[] data = Streams.ReadAll(bitStream);
int padBits = bitStream.PadBits;
return new BerBitString(data, padBits);
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0935e7c4731287a488fd95f8f9670666
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,112 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Diagnostics;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class BerOctetString
: DerOctetString
{
private const int DefaultSegmentLimit = 1000;
public static BerOctetString FromSequence(Asn1Sequence seq)
{
int count = seq.Count;
Asn1OctetString[] v = new Asn1OctetString[count];
for (int i = 0; i < count; ++i)
{
v[i] = GetInstance(seq[i]);
}
return new BerOctetString(v);
}
internal static byte[] FlattenOctetStrings(Asn1OctetString[] octetStrings)
{
int count = octetStrings.Length;
switch (count)
{
case 0:
return EmptyOctets;
case 1:
return octetStrings[0].contents;
default:
{
int totalOctets = 0;
for (int i = 0; i < count; ++i)
{
totalOctets += octetStrings[i].contents.Length;
}
byte[] str = new byte[totalOctets];
int pos = 0;
for (int i = 0; i < count; ++i)
{
byte[] octets = octetStrings[i].contents;
Array.Copy(octets, 0, str, pos, octets.Length);
pos += octets.Length;
}
Debug.Assert(pos == totalOctets);
return str;
}
}
}
private readonly int segmentLimit;
private readonly Asn1OctetString[] elements;
public BerOctetString(byte[] contents)
: this(contents, DefaultSegmentLimit)
{
}
public BerOctetString(Asn1OctetString[] elements)
: this(elements, DefaultSegmentLimit)
{
}
public BerOctetString(byte[] contents, int segmentLimit)
: this(contents, null, segmentLimit)
{
}
public BerOctetString(Asn1OctetString[] elements, int segmentLimit)
: this(FlattenOctetStrings(elements), elements, segmentLimit)
{
}
private BerOctetString(byte[] contents, Asn1OctetString[] elements, int segmentLimit)
: base(contents)
{
this.elements = elements;
this.segmentLimit = segmentLimit;
}
internal override IAsn1Encoding GetEncoding(int encoding)
{
if (Asn1OutputStream.EncodingBer != encoding)
return base.GetEncoding(encoding);
if (null == elements)
return new PrimitiveEncoding(Asn1Tags.Universal, Asn1Tags.OctetString, contents);
return new ConstructedILEncoding(Asn1Tags.Universal, Asn1Tags.OctetString,
Asn1OutputStream.GetContentsEncodings(encoding, elements));
}
internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo)
{
if (Asn1OutputStream.EncodingBer != encoding)
return base.GetEncodingImplicit(encoding, tagClass, tagNo);
if (null == elements)
return new PrimitiveEncoding(tagClass, tagNo, contents);
return new ConstructedILEncoding(tagClass, tagNo,
Asn1OutputStream.GetContentsEncodings(encoding, elements));
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d06a07cbd3b71a74f8cb664efab20cd0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,3 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4acf00c72bf317e489e931a8c0c3c3da
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,101 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class BerSequence
: DerSequence
{
public static new readonly BerSequence Empty = new BerSequence();
public static new BerSequence FromVector(Asn1EncodableVector elementVector)
{
return elementVector.Count < 1 ? Empty : new BerSequence(elementVector);
}
/**
* create an empty sequence
*/
public BerSequence()
: base()
{
}
/**
* create a sequence containing one object
*/
public BerSequence(Asn1Encodable element)
: base(element)
{
}
/**
* create a sequence containing two objects
*/
public BerSequence(Asn1Encodable element1, Asn1Encodable element2)
: base(element1, element2)
{
}
public BerSequence(params Asn1Encodable[] elements)
: base(elements)
{
}
/**
* create a sequence containing a vector of objects.
*/
public BerSequence(Asn1EncodableVector elementVector)
: base(elementVector)
{
}
internal BerSequence(Asn1Encodable[] elements, bool clone)
: base(elements, clone)
{
}
internal override IAsn1Encoding GetEncoding(int encoding)
{
if (Asn1OutputStream.EncodingBer != encoding)
return base.GetEncoding(encoding);
return new ConstructedILEncoding(Asn1Tags.Universal, Asn1Tags.Sequence,
Asn1OutputStream.GetContentsEncodings(encoding, elements));
}
internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo)
{
if (Asn1OutputStream.EncodingBer != encoding)
return base.GetEncodingImplicit(encoding, tagClass, tagNo);
return new ConstructedILEncoding(tagClass, tagNo,
Asn1OutputStream.GetContentsEncodings(encoding, elements));
}
internal override DerBitString ToAsn1BitString()
{
return new BerBitString(GetConstructedBitStrings());
}
internal override DerExternal ToAsn1External()
{
// TODO There is currently no BerExternal class (or ToDLObject/ToDerObject)
//return ((Asn1Sequence)ToDLObject()).ToAsn1External();
return new DLSequence(elements).ToAsn1External();
}
internal override Asn1OctetString ToAsn1OctetString()
{
return new BerOctetString(GetConstructedOctetStrings());
}
internal override Asn1Set ToAsn1Set()
{
return new BerSet(false, elements);
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c5bc0026174da4a4e878a4914a50457b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,73 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
public class BerSet
: DerSet
{
public static new readonly BerSet Empty = new BerSet();
public static new BerSet FromVector(Asn1EncodableVector elementVector)
{
return elementVector.Count < 1 ? Empty : new BerSet(elementVector);
}
/**
* create an empty set
*/
public BerSet()
: base()
{
}
/**
* create a set containing one object
*/
public BerSet(Asn1Encodable element)
: base(element)
{
}
public BerSet(params Asn1Encodable[] elements)
: base(elements, false)
{
}
/**
* create a set containing a vector of objects.
*/
public BerSet(Asn1EncodableVector elementVector)
: base(elementVector, false)
{
}
internal BerSet(bool isSorted, Asn1Encodable[] elements)
: base(isSorted, elements)
{
}
internal override IAsn1Encoding GetEncoding(int encoding)
{
if (Asn1OutputStream.EncodingBer != encoding)
return base.GetEncoding(encoding);
return new ConstructedILEncoding(Asn1Tags.Universal, Asn1Tags.Set,
Asn1OutputStream.GetContentsEncodings(encoding, elements));
}
internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo)
{
if (Asn1OutputStream.EncodingBer != encoding)
return base.GetEncodingImplicit(encoding, tagClass, tagNo);
return new ConstructedILEncoding(tagClass, tagNo,
Asn1OutputStream.GetContentsEncodings(encoding, elements));
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 01890d0dd345cff48bdbba411a658317
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,92 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
/**
* BER TaggedObject - in ASN.1 notation this is any object preceded by
* a [n] where n is some number - these are assumed to follow the construction
* rules (as with sequences).
*/
public class BerTaggedObject
: DerTaggedObject
{
/**
* @param tagNo the tag number for this object.
* @param obj the tagged object.
*/
public BerTaggedObject(int tagNo, Asn1Encodable obj)
: base(true, tagNo, obj)
{
}
public BerTaggedObject(int tagClass, int tagNo, Asn1Encodable obj)
: base(true, tagClass, tagNo, obj)
{
}
/**
* @param isExplicit true if an explicitly tagged object.
* @param tagNo the tag number for this object.
* @param obj the tagged object.
*/
public BerTaggedObject(bool isExplicit, int tagNo, Asn1Encodable obj)
: base(isExplicit, tagNo, obj)
{
}
public BerTaggedObject(bool isExplicit, int tagClass, int tagNo, Asn1Encodable obj)
: base(isExplicit, tagClass, tagNo, obj)
{
}
internal BerTaggedObject(int explicitness, int tagClass, int tagNo, Asn1Encodable obj)
: base(explicitness, tagClass, tagNo, obj)
{
}
internal override string Asn1Encoding
{
get { return Ber; }
}
internal override IAsn1Encoding GetEncoding(int encoding)
{
if (Asn1OutputStream.EncodingBer != encoding)
return base.GetEncoding(encoding);
Asn1Object baseObject = GetBaseObject().ToAsn1Object();
if (!IsExplicit())
return baseObject.GetEncodingImplicit(encoding, TagClass, TagNo);
return new ConstructedILEncoding(TagClass, TagNo, new IAsn1Encoding[]{ baseObject.GetEncoding(encoding) });
}
internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo)
{
if (Asn1OutputStream.EncodingBer != encoding)
return base.GetEncodingImplicit(encoding, tagClass, tagNo);
Asn1Object baseObject = GetBaseObject().ToAsn1Object();
if (!IsExplicit())
return baseObject.GetEncodingImplicit(encoding, tagClass, tagNo);
return new ConstructedILEncoding(tagClass, tagNo, new IAsn1Encoding[]{ baseObject.GetEncoding(encoding) });
}
internal override Asn1Sequence RebuildConstructed(Asn1Object asn1Object)
{
return new BerSequence(asn1Object);
}
internal override Asn1TaggedObject ReplaceTag(int tagClass, int tagNo)
{
return new BerTaggedObject(explicitness, tagClass, tagNo, obj);
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cb57ca2d9225e0340bc7c9ef54c0bd13
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,192 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
internal class ConstructedBitStream
: BaseInputStream
{
private readonly Asn1StreamParser m_parser;
private readonly bool m_octetAligned;
private bool m_first = true;
private int m_padBits = 0;
private Asn1BitStringParser m_currentParser;
private Stream m_currentStream;
internal ConstructedBitStream(Asn1StreamParser parser, bool octetAligned)
{
m_parser = parser;
m_octetAligned = octetAligned;
}
internal int PadBits
{
get { return m_padBits; }
}
public override int Read(byte[] buffer, int offset, int count)
{
Streams.ValidateBufferArguments(buffer, offset, count);
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
return Read(buffer.AsSpan(offset, count));
#else
if (count < 1)
return 0;
if (m_currentStream == null)
{
if (!m_first)
return 0;
m_currentParser = GetNextParser();
if (m_currentParser == null)
return 0;
m_first = false;
m_currentStream = m_currentParser.GetBitStream();
}
int totalRead = 0;
for (;;)
{
int numRead = m_currentStream.Read(buffer, offset + totalRead, count - totalRead);
if (numRead > 0)
{
totalRead += numRead;
if (totalRead == count)
return totalRead;
}
else
{
m_padBits = m_currentParser.PadBits;
m_currentParser = GetNextParser();
if (m_currentParser == null)
{
m_currentStream = null;
return totalRead;
}
m_currentStream = m_currentParser.GetBitStream();
}
}
#endif
}
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || _UNITY_2021_2_OR_NEWER_
public override int Read(Span<byte> buffer)
{
if (buffer.IsEmpty)
return 0;
if (m_currentStream == null)
{
if (!m_first)
return 0;
m_currentParser = GetNextParser();
if (m_currentParser == null)
return 0;
m_first = false;
m_currentStream = m_currentParser.GetBitStream();
}
int totalRead = 0;
for (;;)
{
int numRead = m_currentStream.Read(buffer[totalRead..]);
if (numRead > 0)
{
totalRead += numRead;
if (totalRead == buffer.Length)
return totalRead;
}
else
{
m_padBits = m_currentParser.PadBits;
m_currentParser = GetNextParser();
if (m_currentParser == null)
{
m_currentStream = null;
return totalRead;
}
m_currentStream = m_currentParser.GetBitStream();
}
}
}
#endif
public override int ReadByte()
{
if (m_currentStream == null)
{
if (!m_first)
return -1;
m_currentParser = GetNextParser();
if (m_currentParser == null)
return -1;
m_first = false;
m_currentStream = m_currentParser.GetBitStream();
}
for (;;)
{
int b = m_currentStream.ReadByte();
if (b >= 0)
return b;
m_padBits = m_currentParser.PadBits;
m_currentParser = GetNextParser();
if (m_currentParser == null)
{
m_currentStream = null;
return -1;
}
m_currentStream = m_currentParser.GetBitStream();
}
}
private Asn1BitStringParser GetNextParser()
{
IAsn1Convertible asn1Obj = m_parser.ReadObject();
if (asn1Obj == null)
{
if (m_octetAligned && m_padBits != 0)
throw new IOException("expected octet-aligned bitstring, but found padBits: " + m_padBits);
return null;
}
if (asn1Obj is Asn1BitStringParser)
{
if (m_padBits != 0)
throw new IOException("only the last nested bitstring can have padding");
return (Asn1BitStringParser)asn1Obj;
}
throw new IOException("unknown object encountered: " + Org.BouncyCastle.Utilities.Platform.GetTypeName(asn1Obj));
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 86bbb9386c084ce47a3672ac12a5afa1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,39 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
internal class ConstructedDLEncoding
: IAsn1Encoding
{
private readonly int m_tagClass;
private readonly int m_tagNo;
private readonly IAsn1Encoding[] m_contentsElements;
private readonly int m_contentsLength;
internal ConstructedDLEncoding(int tagClass, int tagNo, IAsn1Encoding[] contentsElements)
{
m_tagClass = tagClass;
m_tagNo = tagNo;
m_contentsElements = contentsElements;
m_contentsLength = Asn1OutputStream.GetLengthOfContents(contentsElements);
}
void IAsn1Encoding.Encode(Asn1OutputStream asn1Out)
{
asn1Out.WriteIdentifier(Asn1Tags.Constructed | m_tagClass, m_tagNo);
asn1Out.WriteDL(m_contentsLength);
asn1Out.EncodeContents(m_contentsElements);
}
int IAsn1Encoding.GetLength()
{
return Asn1OutputStream.GetLengthOfIdentifier(m_tagNo)
+ Asn1OutputStream.GetLengthOfDL(m_contentsLength)
+ m_contentsLength;
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 95ca1443910ef7d48b13c585349fd261
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,39 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
internal class ConstructedILEncoding
: IAsn1Encoding
{
private readonly int m_tagClass;
private readonly int m_tagNo;
private readonly IAsn1Encoding[] m_contentsElements;
internal ConstructedILEncoding(int tagClass, int tagNo, IAsn1Encoding[] contentsElements)
{
m_tagClass = tagClass;
m_tagNo = tagNo;
m_contentsElements = contentsElements;
}
void IAsn1Encoding.Encode(Asn1OutputStream asn1Out)
{
asn1Out.WriteIdentifier(Asn1Tags.Constructed | m_tagClass, m_tagNo);
asn1Out.WriteByte(0x80);
asn1Out.EncodeContents(m_contentsElements);
asn1Out.WriteByte(0x00);
asn1Out.WriteByte(0x00);
}
int IAsn1Encoding.GetLength()
{
return Asn1OutputStream.GetLengthOfIdentifier(m_tagNo)
+ 3
+ Asn1OutputStream.GetLengthOfContents(m_contentsElements);
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8ddca6f0e8886b5409e7379e9d09dc77
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,37 @@
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1
{
internal class ConstructedLazyDLEncoding
: IAsn1Encoding
{
private readonly int m_tagClass;
private readonly int m_tagNo;
private readonly byte[] m_contentsOctets;
internal ConstructedLazyDLEncoding(int tagClass, int tagNo, byte[] contentsOctets)
{
m_tagClass = tagClass;
m_tagNo = tagNo;
m_contentsOctets = contentsOctets;
}
void IAsn1Encoding.Encode(Asn1OutputStream asn1Out)
{
asn1Out.WriteIdentifier(Asn1Tags.Constructed | m_tagClass, m_tagNo);
asn1Out.WriteDL(m_contentsOctets.Length);
asn1Out.Write(m_contentsOctets, 0, m_contentsOctets.Length);
}
int IAsn1Encoding.GetLength()
{
return Asn1OutputStream.GetLengthOfIdentifier(m_tagNo)
+ Asn1OutputStream.GetLengthOfDL(m_contentsOctets.Length)
+ m_contentsOctets.Length;
}
}
}
#pragma warning restore
#endif

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c7c2fedd867a2bf41bb4a45ced6041d4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Some files were not shown because too many files have changed in this diff Show More