using System; using Org.BouncyCastle.Math; namespace Org.BouncyCastle.Asn1.X509 { /** * Class for containing a restriction object subtrees in NameConstraints. See * RFC 3280. * *
*
* GeneralSubtree ::= SEQUENCE
* {
* baseName GeneralName,
* minimum [0] BaseDistance DEFAULT 0,
* maximum [1] BaseDistance OPTIONAL
* }
*
*
* @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:
{
minimum = DerInteger.GetInstance(Asn1TaggedObject.GetInstance(seq[1]));
maximum = DerInteger.GetInstance(Asn1TaggedObject.GetInstance(seq[2]));
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.
*
* If minimum is null, zero is assumed, if
* maximum is null, maximum is absent.
* GeneralSubtree ::= SEQUENCE
* {
* baseName GeneralName,
* minimum [0] BaseDistance DEFAULT 0,
* maximum [1] BaseDistance OPTIONAL
* }
*
*
* @return a DERObject
*/
public override Asn1Object ToAsn1Object()
{
Asn1EncodableVector v = new Asn1EncodableVector(baseName);
if (minimum != null && minimum.Value.SignValue != 0)
{
v.Add(new DerTaggedObject(false, 0, minimum));
}
if (maximum != null)
{
v.Add(new DerTaggedObject(false, 1, maximum));
}
return new DerSequence(v);
}
}
}