You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
4.1 KiB
189 lines
4.1 KiB
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR) |
|
#pragma warning disable |
|
using System; |
|
|
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Math; |
|
|
|
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509 |
|
{ |
|
/** |
|
* Class for containing a restriction object subtrees in NameConstraints. See |
|
* RFC 3280. |
|
* |
|
* <pre> |
|
* |
|
* GeneralSubtree ::= SEQUENCE |
|
* { |
|
* baseName GeneralName, |
|
* minimum [0] BaseDistance DEFAULT 0, |
|
* maximum [1] BaseDistance OPTIONAL |
|
* } |
|
* </pre> |
|
* |
|
* @see org.bouncycastle.asn1.x509.NameConstraints |
|
* |
|
*/ |
|
public class GeneralSubtree |
|
: Asn1Encodable |
|
{ |
|
private readonly GeneralName baseName; |
|
private readonly DerInteger minimum; |
|
private readonly DerInteger maximum; |
|
|
|
private GeneralSubtree( |
|
Asn1Sequence seq) |
|
{ |
|
baseName = GeneralName.GetInstance(seq[0]); |
|
|
|
switch (seq.Count) |
|
{ |
|
case 1: |
|
break; |
|
case 2: |
|
{ |
|
Asn1TaggedObject o = Asn1TaggedObject.GetInstance(seq[1]); |
|
switch (o.TagNo) |
|
{ |
|
case 0: |
|
minimum = DerInteger.GetInstance(o, false); |
|
break; |
|
case 1: |
|
maximum = DerInteger.GetInstance(o, false); |
|
break; |
|
default: |
|
throw new ArgumentException("Bad tag number: " + o.TagNo); |
|
} |
|
break; |
|
} |
|
case 3: |
|
{ |
|
{ |
|
Asn1TaggedObject oMin = Asn1TaggedObject.GetInstance(seq[1]); |
|
if (oMin.TagNo != 0) |
|
throw new ArgumentException("Bad tag number for 'minimum': " + oMin.TagNo); |
|
minimum = DerInteger.GetInstance(oMin, false); |
|
} |
|
|
|
{ |
|
Asn1TaggedObject oMax = Asn1TaggedObject.GetInstance(seq[2]); |
|
if (oMax.TagNo != 1) |
|
throw new ArgumentException("Bad tag number for 'maximum': " + oMax.TagNo); |
|
maximum = DerInteger.GetInstance(oMax, false); |
|
} |
|
|
|
break; |
|
} |
|
default: |
|
throw new ArgumentException("Bad sequence size: " + seq.Count); |
|
} |
|
} |
|
|
|
/** |
|
* Constructor from a given details. |
|
* |
|
* According RFC 3280, the minimum and maximum fields are not used with any |
|
* name forms, thus minimum MUST be zero, and maximum MUST be absent. |
|
* <p> |
|
* If minimum is <code>null</code>, zero is assumed, if |
|
* maximum is <code>null</code>, maximum is absent.</p> |
|
* |
|
* @param baseName |
|
* A restriction. |
|
* @param minimum |
|
* Minimum |
|
* |
|
* @param maximum |
|
* Maximum |
|
*/ |
|
public GeneralSubtree( |
|
GeneralName baseName, |
|
BigInteger minimum, |
|
BigInteger maximum) |
|
{ |
|
this.baseName = baseName; |
|
if (minimum != null) |
|
{ |
|
this.minimum = new DerInteger(minimum); |
|
} |
|
if (maximum != null) |
|
{ |
|
this.maximum = new DerInteger(maximum); |
|
} |
|
} |
|
|
|
public GeneralSubtree( |
|
GeneralName baseName) |
|
: this(baseName, null, null) |
|
{ |
|
} |
|
|
|
public static GeneralSubtree GetInstance( |
|
Asn1TaggedObject o, |
|
bool isExplicit) |
|
{ |
|
return new GeneralSubtree(Asn1Sequence.GetInstance(o, isExplicit)); |
|
} |
|
|
|
public static GeneralSubtree GetInstance( |
|
object obj) |
|
{ |
|
if (obj == null) |
|
{ |
|
return null; |
|
} |
|
|
|
if (obj is GeneralSubtree) |
|
{ |
|
return (GeneralSubtree) obj; |
|
} |
|
|
|
return new GeneralSubtree(Asn1Sequence.GetInstance(obj)); |
|
} |
|
|
|
public GeneralName Base |
|
{ |
|
get { return baseName; } |
|
} |
|
|
|
public BigInteger Minimum |
|
{ |
|
get { return minimum == null ? BigInteger.Zero : minimum.Value; } |
|
} |
|
|
|
public BigInteger Maximum |
|
{ |
|
get { return maximum == null ? null : maximum.Value; } |
|
} |
|
|
|
/** |
|
* Produce an object suitable for an Asn1OutputStream. |
|
* |
|
* Returns: |
|
* |
|
* <pre> |
|
* GeneralSubtree ::= SEQUENCE |
|
* { |
|
* baseName GeneralName, |
|
* minimum [0] BaseDistance DEFAULT 0, |
|
* maximum [1] BaseDistance OPTIONAL |
|
* } |
|
* </pre> |
|
* |
|
* @return a DERObject |
|
*/ |
|
public override Asn1Object ToAsn1Object() |
|
{ |
|
Asn1EncodableVector v = new Asn1EncodableVector(baseName); |
|
|
|
if (minimum != null && !minimum.HasValue(0)) |
|
{ |
|
v.Add(new DerTaggedObject(false, 0, minimum)); |
|
} |
|
|
|
v.AddOptionalTagged(false, 1, maximum); |
|
return new DerSequence(v); |
|
} |
|
} |
|
} |
|
#pragma warning restore |
|
#endif
|
|
|