#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR) #pragma warning disable using System; using System.Collections; using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X500; using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509; using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities; namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.IsisMtt.X509 { /** * Attribute to indicate that the certificate holder may sign in the name of a * third person. *
* ISIS-MTT PROFILE: The corresponding ProcurationSyntax contains either the * name of the person who is represented (subcomponent thirdPerson) or a * reference to his/her base certificate (in the component signingFor, * subcomponent certRef), furthermore the optional components country and * typeSubstitution to indicate the country whose laws apply, and respectively * the type of procuration (e.g. manager, procuration, custody). *
** ISIS-MTT PROFILE: The GeneralName MUST be of type directoryName and MAY only * contain: - RFC3039 attributes, except pseudonym (countryName, commonName, * surname, givenName, serialNumber, organizationName, organizationalUnitName, * stateOrProvincename, localityName, postalAddress) and - SubjectDirectoryName * attributes (title, dateOfBirth, placeOfBirth, gender, countryOfCitizenship, * countryOfResidence and NameAtBirth). *
** ProcurationSyntax ::= SEQUENCE { * country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL, * typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL, * signingFor [3] EXPLICIT SigningFor * } * * SigningFor ::= CHOICE * { * thirdPerson GeneralName, * certRef IssuerSerial * } ** */ public class ProcurationSyntax : Asn1Encodable { private readonly string country; private readonly DirectoryString typeOfSubstitution; private readonly GeneralName thirdPerson; private readonly IssuerSerial certRef; public static ProcurationSyntax GetInstance( object obj) { if (obj == null || obj is ProcurationSyntax) { return (ProcurationSyntax) obj; } if (obj is Asn1Sequence) { return new ProcurationSyntax((Asn1Sequence) obj); } throw new ArgumentException("unknown object in factory: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.GetTypeName(obj), "obj"); } /** * Constructor from Asn1Sequence. * * The sequence is of type ProcurationSyntax: * *
* ProcurationSyntax ::= SEQUENCE { * country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL, * typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL, * signingFor [3] EXPLICIT SigningFor * } * * SigningFor ::= CHOICE * { * thirdPerson GeneralName, * certRef IssuerSerial * } ** * @param seq The ASN.1 sequence. */ private ProcurationSyntax( Asn1Sequence seq) { if (seq.Count < 1 || seq.Count > 3) throw new ArgumentException("Bad sequence size: " + seq.Count); IEnumerator e = seq.GetEnumerator(); while (e.MoveNext()) { Asn1TaggedObject o = Asn1TaggedObject.GetInstance(e.Current); switch (o.TagNo) { case 1: country = DerPrintableString.GetInstance(o, true).GetString(); break; case 2: typeOfSubstitution = DirectoryString.GetInstance(o, true); break; case 3: Asn1Object signingFor = o.GetObject(); if (signingFor is Asn1TaggedObject) { thirdPerson = GeneralName.GetInstance(signingFor); } else { certRef = IssuerSerial.GetInstance(signingFor); } break; default: throw new ArgumentException("Bad tag number: " + o.TagNo); } } } /** * Constructor from a given details. * * * Either
generalName
or certRef
MUST be
* null
.
*
* @param country The country code whose laws apply.
* @param typeOfSubstitution The type of procuration.
* @param certRef Reference to certificate of the person who is represented.
*/
public ProcurationSyntax(
string country,
DirectoryString typeOfSubstitution,
IssuerSerial certRef)
{
this.country = country;
this.typeOfSubstitution = typeOfSubstitution;
this.thirdPerson = null;
this.certRef = certRef;
}
/**
* Constructor from a given details.
*
*
* Either generalName
or certRef
MUST be
* null
.
*
* @param country The country code whose laws apply.
* @param typeOfSubstitution The type of procuration.
* @param thirdPerson The GeneralName of the person who is represented.
*/
public ProcurationSyntax(
string country,
DirectoryString typeOfSubstitution,
GeneralName thirdPerson)
{
this.country = country;
this.typeOfSubstitution = typeOfSubstitution;
this.thirdPerson = thirdPerson;
this.certRef = null;
}
public virtual string Country
{
get { return country; }
}
public virtual DirectoryString TypeOfSubstitution
{
get { return typeOfSubstitution; }
}
public virtual GeneralName ThirdPerson
{
get { return thirdPerson; }
}
public virtual IssuerSerial CertRef
{
get { return certRef; }
}
/**
* Produce an object suitable for an Asn1OutputStream.
*
* Returns:
*
* * ProcurationSyntax ::= SEQUENCE { * country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL, * typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL, * signingFor [3] EXPLICIT SigningFor * } * * SigningFor ::= CHOICE * { * thirdPerson GeneralName, * certRef IssuerSerial * } ** * @return an Asn1Object */ public override Asn1Object ToAsn1Object() { Asn1EncodableVector v = new Asn1EncodableVector(); if (country != null) { v.Add(new DerTaggedObject(true, 1, new DerPrintableString(country, true))); } v.AddOptionalTagged(true, 2, typeOfSubstitution); if (thirdPerson != null) { v.Add(new DerTaggedObject(true, 3, thirdPerson)); } else { v.Add(new DerTaggedObject(true, 3, certRef)); } return new DerSequence(v); } } } #pragma warning restore #endif