package org.spongycastle.asn1.esf; import java.util.Enumeration; import org.spongycastle.asn1.ASN1EncodableVector; import org.spongycastle.asn1.ASN1Object; import org.spongycastle.asn1.ASN1Primitive; import org.spongycastle.asn1.ASN1Sequence; import org.spongycastle.asn1.DERSequence; import org.spongycastle.asn1.DERTaggedObject; import org.spongycastle.asn1.DERUTF8String; import org.spongycastle.asn1.x500.DirectoryString; /** * Signer-Location attribute (RFC3126). * * <pre> * SignerLocation ::= SEQUENCE { * countryName [0] DirectoryString OPTIONAL, * localityName [1] DirectoryString OPTIONAL, * postalAddress [2] PostalAddress OPTIONAL } * * PostalAddress ::= SEQUENCE SIZE(1..6) OF DirectoryString * </pre> */ public class SignerLocation extends ASN1Object { private DERUTF8String countryName; private DERUTF8String localityName; private ASN1Sequence postalAddress; private SignerLocation( ASN1Sequence seq) { Enumeration e = seq.getObjects(); while (e.hasMoreElements()) { DERTaggedObject o = (DERTaggedObject)e.nextElement(); switch (o.getTagNo()) { case 0: DirectoryString countryNameDirectoryString = DirectoryString.getInstance(o, true); this.countryName = new DERUTF8String(countryNameDirectoryString.getString()); break; case 1: DirectoryString localityNameDirectoryString = DirectoryString.getInstance(o, true); this.localityName = new DERUTF8String(localityNameDirectoryString.getString()); break; case 2: if (o.isExplicit()) { this.postalAddress = ASN1Sequence.getInstance(o, true); } else // handle erroneous implicitly tagged sequences { this.postalAddress = ASN1Sequence.getInstance(o, false); } if (postalAddress != null && postalAddress.size() > 6) { throw new IllegalArgumentException("postal address must contain less than 6 strings"); } break; default: throw new IllegalArgumentException("illegal tag"); } } } public SignerLocation( DERUTF8String countryName, DERUTF8String localityName, ASN1Sequence postalAddress) { if (postalAddress != null && postalAddress.size() > 6) { throw new IllegalArgumentException("postal address must contain less than 6 strings"); } if (countryName != null) { this.countryName = DERUTF8String.getInstance(countryName.toASN1Primitive()); } if (localityName != null) { this.localityName = DERUTF8String.getInstance(localityName.toASN1Primitive()); } if (postalAddress != null) { this.postalAddress = ASN1Sequence.getInstance(postalAddress.toASN1Primitive()); } } public static SignerLocation getInstance( Object obj) { if (obj == null || obj instanceof SignerLocation) { return (SignerLocation)obj; } return new SignerLocation(ASN1Sequence.getInstance(obj)); } public DERUTF8String getCountryName() { return countryName; } public DERUTF8String getLocalityName() { return localityName; } public ASN1Sequence getPostalAddress() { return postalAddress; } /** * <pre> * SignerLocation ::= SEQUENCE { * countryName [0] DirectoryString OPTIONAL, * localityName [1] DirectoryString OPTIONAL, * postalAddress [2] PostalAddress OPTIONAL } * * PostalAddress ::= SEQUENCE SIZE(1..6) OF DirectoryString * * DirectoryString ::= CHOICE { * teletexString TeletexString (SIZE (1..MAX)), * printableString PrintableString (SIZE (1..MAX)), * universalString UniversalString (SIZE (1..MAX)), * utf8String UTF8String (SIZE (1.. MAX)), * bmpString BMPString (SIZE (1..MAX)) } * </pre> */ public ASN1Primitive toASN1Primitive() { ASN1EncodableVector v = new ASN1EncodableVector(); if (countryName != null) { v.add(new DERTaggedObject(true, 0, countryName)); } if (localityName != null) { v.add(new DERTaggedObject(true, 1, localityName)); } if (postalAddress != null) { v.add(new DERTaggedObject(true, 2, postalAddress)); } return new DERSequence(v); } }