using System; using System.Collections; using Org.BouncyCastle.Asn1.X500; using Org.BouncyCastle.Asn1.X509; namespace 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: " + obj.GetType().Name, "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 vec = new Asn1EncodableVector(); if (country != null) { vec.Add(new DerTaggedObject(true, 1, new DerPrintableString(country, true))); } if (typeOfSubstitution != null) { vec.Add(new DerTaggedObject(true, 2, typeOfSubstitution)); } if (thirdPerson != null) { vec.Add(new DerTaggedObject(true, 3, thirdPerson)); } else { vec.Add(new DerTaggedObject(true, 3, certRef)); } return new DerSequence(vec); } } }