diff options
author | Michael Koch <konqueror@gmx.de> | 2003-04-30 07:23:42 +0000 |
---|---|---|
committer | Michael Koch <mkoch@gcc.gnu.org> | 2003-04-30 07:23:42 +0000 |
commit | 43905ff30b187d8d1d1dee50e722f47fd8a93144 (patch) | |
tree | 89373f6e7f4c07ae0c9c6eeebf05fcb7bbcdfa36 /libjava/gnu/java/security/x509/X500DistinguishedName.java | |
parent | 505b0fd661e21182856cfcf73ed6f39c707ac28b (diff) | |
download | gcc-43905ff30b187d8d1d1dee50e722f47fd8a93144.zip gcc-43905ff30b187d8d1d1dee50e722f47fd8a93144.tar.gz gcc-43905ff30b187d8d1d1dee50e722f47fd8a93144.tar.bz2 |
Engine.java, [...]: New files from classpath.
2003-04-30 Michael Koch <konqueror@gmx.de>
* gnu/java/security/Engine.java,
gnu/java/security/OID.java,
gnu/java/security/der/BitString.java,
gnu/java/security/der/DER.java,
gnu/java/security/der/DERReader.java,
gnu/java/security/der/DERValue.java,
gnu/java/security/der/DERWriter.java,
gnu/java/security/provider/DSAKeyFactory.java,
gnu/java/security/provider/X509CertificateFactory.java,
gnu/java/security/x509/X500DistinguishedName.java,
gnu/java/security/x509/X509CRL.java,
gnu/java/security/x509/X509CRLEntry.java,
gnu/java/security/x509/X509Certificate.java,
java/security/cert/CRLSelector.java,
java/security/cert/CertPathBuilder.java,
java/security/cert/CertPathBuilderResult.java,
java/security/cert/CertPathBuilderSpi.java,
java/security/cert/CertPathParameters.java,
java/security/cert/CertPathValidator.java,
java/security/cert/CertPathValidatorResult.java,
java/security/cert/CertPathValidatorSpi.java,
java/security/cert/CertSelector.java,
java/security/cert/CertStore.java,
java/security/cert/CertStoreParameters.java,
java/security/cert/CertStoreSpi.java,
java/security/cert/CollectionCertStoreParameters.java,
java/security/cert/LDAPCertStoreParameters.java,
java/security/cert/PKIXBuilderParameters.java,
java/security/cert/PKIXCertPathBuilderResult.java,
java/security/cert/PKIXCertPathChecker.java,
java/security/cert/PKIXCertPathValidatorResult.java,
java/security/cert/PKIXParameters.java,
java/security/cert/PolicyNode.java,
java/security/cert/PolicyQualifierInfo.java,
java/security/cert/TrustAnchor.java,
javax/security/auth/x500/X500Principal.java:
New files from classpath.
* gnu/java/io/ASN1ParsingException.java,
gnu/java/io/Base64InputStream.java,
gnu/java/security/der/DEREncodingException.java,
gnu/java/security/provider/DSAParameters.java,
gnu/java/security/provider/DSASignature.java,
gnu/java/security/provider/Gnu.java,
gnu/java/security/provider/GnuDSAPrivateKey.java,
gnu/java/security/provider/GnuDSAPublicKey.java,
java/security/AlgorithmParameterGenerator.java,
java/security/AlgorithmParameters.java,
java/security/KeyFactory.java,
java/security/KeyPairGenerator.java,
java/security/KeyStore.java,
java/security/MessageDigest.java,
java/security/SecureClassLoader.java,
java/security/SecureRandom.java,
java/security/Security.java,
java/security/Signature.java,
java/security/cert/Certificate.java,
java/security/cert/CertificateFactory.java,
java/security/cert/CertificateFactorySpi.java,
java/security/cert/X509CRL.java,
java/security/cert/X509Certificate.java,
java/security/spec/DSAPublicKeySpec.java:
New versions from classpath.
* gnu/java/security/provider/DERReader.java,
gnu/java/security/provider/DERWriter.java,
java/security/Engine.java: Removed.
* Makefile.am
(java_source_files, javax_source_files): Added new files.
* Makefile.in: Regenerated.
From-SVN: r66283
Diffstat (limited to 'libjava/gnu/java/security/x509/X500DistinguishedName.java')
-rw-r--r-- | libjava/gnu/java/security/x509/X500DistinguishedName.java | 824 |
1 files changed, 824 insertions, 0 deletions
diff --git a/libjava/gnu/java/security/x509/X500DistinguishedName.java b/libjava/gnu/java/security/x509/X500DistinguishedName.java new file mode 100644 index 0000000..5284385 --- /dev/null +++ b/libjava/gnu/java/security/x509/X500DistinguishedName.java @@ -0,0 +1,824 @@ +/* X500DistinguishedName.java -- X.500 name. + Copyright (C) 2003 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + + +package gnu.java.security.x509; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.IOException; +import java.io.StreamTokenizer; +import java.io.StringReader; + +import java.security.Principal; + +import java.util.HashSet; +import java.util.LinkedList; + +import gnu.java.io.ASN1ParsingException; +import gnu.java.security.OID; +import gnu.java.security.der.DER; +import gnu.java.security.der.DERReader; +import gnu.java.security.der.DERValue; +import gnu.java.security.der.DERWriter; + +/** + * A X.500 distinguished name. Distinguished names are sequences of + * ATTRIB=VALUE pairs, where ATTRIB is one of the following: + * + * <table cellpadding="0" cellspacing="0" border="0"> + * <tr> + * <th bgcolor="#CCCCFF" align="left">Name</th> + * <th bgcolor="#CCCCFF" align="left">X.500 AttributeType</th> + * <th bgcolor="#CCCCFF" align="left">ObjectIdentifier</th> + * </tr> + * <tr> + * <td align="left">CN</td> + * <td align="left">commonName</td> + * <td align="left">2.5.4.3</td> + * </tr> + * <tr> + * <td align="left">C</td> + * <td align="left">countryName</td> + * <td align="left">2.5.4.6</td> + * </tr> + * <tr> + * <td align="left">L</td> + * <td align="left">localityName</td> + * <td align="left">2.5.4.7</td> + * </tr> + * <tr> + * <td align="left">ST</td> + * <td align="left">stateOrProvinceName</td> + * <td align="left">2.5.4.8</td> + * </tr> + * <tr> + * <td align="left">STREET</td> + * <td align="left">streetAddress</td> + * <td align="left">2.5.4.9</td> + * </tr> + * <tr> + * <td align="left">O</td> + * <td align="left">organizationName</td> + * <td align="left">2.5.4.10</td> + * </tr> + * <tr> + * <td align="left">OU</td> + * <td align="left">organizationUnitName</td> + * <td align="left">2.5.4.11</td> + * </tr> + * <tr> + * <td align="left">DC</td> + * <td align="left">domainComponent</td> + * <td align="left">0.9.2342.19200300.100.1.25</td> + * </tr> + * <tr> + * <td align="left">UID</td> + * <td align="left">userid</td> + * <td align="left"0.9.2342.19200300.100.1.1></td> + * </tr> + * <tr> + * <td align="left">DNQ or DNQUALIFIER(*)</td> + * <td align="left">domainNameQualifier</td> + * <td align="left">2.5.4.46</td> + * </tr> + * <tr> + * <td align="left">SURNAME(*)</td> + * <td align="left">name</td> + * <td align="left">2.5.4.41</td> + * </tr> + * <tr> + * <td align="left">GIVENNAME(*)</td> + * <td align="left">givenName</td> + * <td align="left">2.5.4.42</td> + * </tr> + * <tr> + * <td align="left">INITIALS(*)</td> + * <td align="left">initials</td> + * <td align="left">2.5.4.43</td> + * </tr> + * <tr> + * <td align="left">EMAILADDRESS(*)</td> + * <td align="left">emailAddress</td> + * <td align="left">2.5.4.44</td> + * </tr> + * </table> + * + * <p><i>(*) = attributes not specified in RFC1779 or RFC2253, but + * recognized anyway.</i> + * + * <p>Distinguished names of this form are used in the lightweight + * directory access protocol (LDAP) and in the issuer and subject fields + * of X.509 certificates. + * + * @author Casey Marshall (rsdio@metastatic.org) + * @see javax.security.auth.x500.X500Principal + * @status DER decoding/encoding works, RFC1779 and RFC2253 need to be + * made more robust. + */ +public class X500DistinguishedName +{ + + // Constants and fields. + // ------------------------------------------------------------------------ + + public static final OID CN = new OID("2.5.4.3"); + public static final OID C = new OID("2.5.4.6"); + public static final OID L = new OID("2.5.4.7"); + public static final OID ST = new OID("2.5.4.8"); + public static final OID STREET = new OID("2.5.4.9"); + public static final OID O = new OID("2.5.4.10"); + public static final OID OU = new OID("2.5.4.11"); + public static final OID T = new OID("2.5.4.12"); + public static final OID DNQ = new OID("2.5.4.46"); + public static final OID NAME = new OID("2.5.4.41"); + public static final OID GIVENNAME = new OID("2.5.4.42"); + public static final OID INITIALS = new OID("2.5.4.43"); + public static final OID GENERATION = new OID("2.5.4.44"); + public static final OID EMAIL = new OID("1.2.840.113549.1.9.1"); + public static final OID DC = new OID("0.9.2342.19200300.100.1.25"); + public static final OID UID = new OID("0.9.2342.19200300.100.1.1"); + + private String commonName; + private String country; + private String locality; + private String orgUnit; + private String organization; + private String street; + private String state; + private String title; + private String dnQualifier; + private String surname; + private String givenName; + private String initials; + private String generation; + private String email; + private String domainComponent; + private String userid; + + private String nameRFC1779; + private String nameRFC2253; + private String nameCanonical; + + private transient byte[] encoded; + + // Constructors. + // ------------------------------------------------------------------------ + + /** + * Create a new X500DistinguishedName from the RFC1779 or RFC2253 + * encoded form. + * + * @param name The encoded name. + * @throws IllegalArgumentException If the name cannot be parsed. + */ + public X500DistinguishedName(String name) + { + if (name == null) + throw new NullPointerException(); + try + { + parseDN(name, true); + } + catch (Exception e) + { + parseDN(name, false); + } + } + + /** + * Create a new X500DistinguishedName from the DER encoded bytes. + * + * @param encoded The encoded form. + * @throws IOException If the bytes are not a valid DER construct. + */ + public X500DistinguishedName(byte[] encoded) throws IOException + { + this(new ByteArrayInputStream(encoded)); + } + + /** + * Create a new X500DistinguishedName from the DER encoded bytes. + * + * @param encoded The encoded form. + * @throws IOException If the bytes are not a valid DER construct. + */ + public X500DistinguishedName(InputStream encoded) throws IOException + { + parseDER(encoded); + } + + // Instance methods. + // ------------------------------------------------------------------------ + + public boolean equals(Object o) + { + return + (commonName != null && + commonName.equals(((X500DistinguishedName) o).commonName)) && + (country != null && + country.equals(((X500DistinguishedName) o).country)) && + (locality != null && + locality.equals(((X500DistinguishedName) o).locality)) && + (orgUnit != null && + orgUnit.equals(((X500DistinguishedName) o).orgUnit)) && + (organization != null && + organization.equals(((X500DistinguishedName) o).organization)) && + (street != null && + street.equals(((X500DistinguishedName) o).street)) && + (state != null && + state.equals(((X500DistinguishedName) o).state)) && + (domainComponent != null && + domainComponent.equals(((X500DistinguishedName) o).domainComponent)) && + (title != null && + title.equals(((X500DistinguishedName) o).title)) && + (dnQualifier != null && + dnQualifier.equals(((X500DistinguishedName) o).dnQualifier)) && + (surname != null && + surname.equals(((X500DistinguishedName) o).surname)) && + (givenName != null && + givenName.equals(((X500DistinguishedName) o).givenName)) && + (initials != null && + initials.equals(((X500DistinguishedName) o).initials)) && + (generation != null && + generation.equals(((X500DistinguishedName) o).generation)) && + (email != null && + email.equals(((X500DistinguishedName) o).email)) && + (userid != null && + userid.equals(((X500DistinguishedName) o).userid)); + } + + public byte[] getEncoded() + { + if (encoded == null) + encoded = encodeDER(); + return (byte[]) encoded.clone(); + } + + private static String quote(String str) + { + if (str.indexOf(" ") > 0 || str.indexOf("\f") > 0 || + str.indexOf("\n") > 0 || str.indexOf("\r") > 0 || + str.indexOf("\t") > 0) + str = '"' + str + '"'; + // XXX needs regex + //return str.replaceAll("([,+\"\\<>;])", "\\\1"); + return str; + } + + public String toRFC1779() + { + if (nameRFC1779 != null) + return nameRFC1779; + StringBuffer buf = new StringBuffer(); + if (commonName != null) + buf.append("CN=").append(quote(commonName)).append(", "); + if (country != null) + buf.append("C=").append(quote(country)).append(", "); + if (locality != null) + buf.append("L=").append(quote(locality)).append(", "); + if (orgUnit != null) + buf.append("OU=").append(quote(orgUnit)).append(", "); + if (organization != null) + buf.append("O=").append(quote(organization)).append(", "); + if (street != null) + buf.append("STREET=").append(quote(street)).append(", "); + if (state != null) + buf.append("ST=").append(quote(state)).append(", "); + if (title != null) + buf.append(T).append("=").append(quote(title)).append(", "); + if (dnQualifier != null) + buf.append(DNQ).append("=").append(quote(dnQualifier)).append(", "); + if (surname != null) + buf.append(NAME).append("=").append(quote(surname)).append(", "); + if (givenName != null) + buf.append(GIVENNAME).append("=").append(quote(givenName)).append(", "); + if (initials != null) + buf.append(INITIALS).append("=").append(quote(initials)).append(", "); + if (generation != null) + buf.append(GENERATION).append("=").append(quote(generation)).append(", "); + if (email != null) + buf.append(EMAIL).append("=").append(quote(email)).append(", "); + if (domainComponent != null) + buf.append(DC).append("=").append(quote(domainComponent)).append(", "); + if (userid != null) + buf.append(UID).append("=").append(quote(userid)).append(", "); + // XXX escapes + return (nameRFC1779 = buf.substring(0, buf.length()-2)); + } + + public String toRFC2253() + { + if (nameRFC2253 != null) + return nameRFC2253; + StringBuffer buf = new StringBuffer(); + if (commonName != null) + buf.append("CN=").append(quote(commonName)).append(","); + if (country != null) + buf.append("C=").append(quote(country)).append(","); + if (locality != null) + buf.append("L=").append(quote(locality)).append(","); + if (orgUnit != null) + buf.append("OU=").append(quote(orgUnit)).append(","); + if (organization != null) + buf.append("O=").append(quote(organization)).append(","); + if (street != null) + buf.append("STREET=").append(quote(street)).append(","); + if (state != null) + buf.append("ST=").append(quote(state)).append(","); + if (title != null) + buf.append(T).append("=").append(quote(title)).append(","); + if (dnQualifier != null) + buf.append(DNQ).append("=").append(quote(dnQualifier)).append(","); + if (surname != null) + buf.append(NAME).append("=").append(quote(surname)).append(","); + if (givenName != null) + buf.append(GIVENNAME).append("=").append(quote(givenName)).append(","); + if (initials != null) + buf.append(INITIALS).append("=").append(quote(initials)).append(","); + if (generation != null) + buf.append(GENERATION).append("=").append(quote(generation)).append(","); + if (email != null) + buf.append(EMAIL).append("=").append(quote(email)).append(","); + if (domainComponent != null) + buf.append(DC).append("=").append(quote(domainComponent)).append(","); + if (userid != null) + buf.append(UID).append("=").append(quote(userid)).append(","); + // XXX escapes. + return (nameRFC2253 = buf.substring(0, buf.length()-1)); + } + + public String toCanonical() + { + if (nameCanonical != null) + return nameCanonical; + nameCanonical = toRFC2253(); + return nameCanonical; // XXX canonicalize + } + + public String getCommonName() + { + return commonName; + } + + public String getCountry() + { + return country; + } + + public String getLocality() + { + return locality; + } + + public String getOrganizationalUnit() + { + return orgUnit; + } + + public String getOrganization() + { + return organization; + } + + public String getStreet() + { + return street; + } + + public String getState() + { + return state; + } + + public String getTitle() + { + return title; + } + + public String getDNQualifier() + { + return dnQualifier; + } + + public String getSurname() + { + return surname; + } + + public String getGivenName() + { + return givenName; + } + + public String getInitials() + { + return initials; + } + + public String getGeneration() + { + return generation; + } + + public String getEmail() + { + return email; + } + + public String getDomain() + { + return domainComponent; + } + + public String getUserID() + { + return userid; + } + + // Own methods. + // ------------------------------------------------------------------------ + + private static String unquote(String str) + { + if (str.startsWith("\"") && str.endsWith("\"")) + str = str.substring(1, str.length()-1); + // XXX needs regex + //return str.replaceAll("\\([,+\"\\<>;])", "\1"); + return str; + } + + private void parseDN(String name, boolean rfc2253) + { + if (name.length() == 0) + throw new IllegalArgumentException("zero-length distinguished name"); + StreamTokenizer parse = new StreamTokenizer(new StringReader(name)); + parse.resetSyntax(); + parse.wordChars('\000', '~'); + parse.ordinaryChar('#'); + parse.ordinaryChar(','); + parse.ordinaryChar('='); + parse.ordinaryChar('<'); + parse.ordinaryChar('>'); + parse.ordinaryChar(';'); + parse.ordinaryChar('\\'); + parse.quoteChar('"'); + String attrib = null; + String value = null; + int token, lastToken = ','; + while (true) + { + try + { + token = parse.nextToken(); + } + catch (IOException ioe) + { + throw new IllegalArgumentException(); + } + switch (token) + { + case StreamTokenizer.TT_WORD: + if (lastToken == ',' || lastToken == '+' || + (!rfc2253 && lastToken == ';')) + attrib = parse.sval.trim(); + else if (lastToken == '=') + value = unquote(parse.sval.trim()); + else + throw new IllegalArgumentException(); + break; + case '"': + if (lastToken == '=') + value = parse.sval; + else + throw new IllegalArgumentException(); + break; + case ';': + if (rfc2253) + throw new IllegalArgumentException(); + case ',': + case '+': + if (attrib == null || value == null) + throw new IllegalArgumentException("extraneous separator"); + try + { + setAttribute(new OID(attrib), value); + } + catch (Exception x) + { + setAttribute(attrib, value); + } + attrib = null; + value = null; + break; + case '=': + break; + case StreamTokenizer.TT_EOF: + return; + default: + throw new IllegalArgumentException("unknown token " + (char)token + + " (" + token + ")"); + } + lastToken = token; + } + } + + private void parseDER(InputStream in) throws IOException + { + DERReader der = new DERReader(in); + DERValue name = der.read(); + if (!name.isConstructed()) + throw new ASN1ParsingException("badly formed Name"); + int len = 0; + while (len < name.getLength()) + { + DERValue rdn = der.read(); + if (rdn.getValue() != DER.CONSTRUCTED_VALUE) + throw new ASN1ParsingException("badly formed RDNSequence"); + int len2 = 0; + while (len2 < rdn.getLength()) + { + DERValue atav = der.read(); + if (atav.getValue() != DER.CONSTRUCTED_VALUE) + throw new ASN1ParsingException( + "badly formed AttributeTypeAndValue"); + OID atype = (OID) der.read().getValue(); + String aval = (String) der.read().getValue(); + setAttribute(atype, aval); + len2 += 1 + atav.getLength() + + DERWriter.definiteEncodingSize(atav.getLength()); + } + len += len2 + 1 + DERWriter.definiteEncodingSize(name.getLength()); + } + } + + private byte[] encodeDER() + { + try + { + LinkedList name = new LinkedList(); + if (commonName != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, CN)); + atav.add(new DERValue(DER.PRINTABLE_STRING, commonName)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (country != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, C)); + atav.add(new DERValue(DER.PRINTABLE_STRING, country)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (locality != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, L)); + atav.add(new DERValue(DER.PRINTABLE_STRING, locality)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (orgUnit != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, OU)); + atav.add(new DERValue(DER.PRINTABLE_STRING, orgUnit)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (organization != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, O)); + atav.add(new DERValue(DER.PRINTABLE_STRING, organization)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (street != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, STREET)); + atav.add(new DERValue(DER.PRINTABLE_STRING, street)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (state != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, ST)); + atav.add(new DERValue(DER.PRINTABLE_STRING, state)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (title != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, T)); + atav.add(new DERValue(DER.PRINTABLE_STRING, title)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (dnQualifier != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, DNQ)); + atav.add(new DERValue(DER.PRINTABLE_STRING, dnQualifier)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (surname != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, NAME)); + atav.add(new DERValue(DER.PRINTABLE_STRING, surname)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (givenName != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, GIVENNAME)); + atav.add(new DERValue(DER.PRINTABLE_STRING, givenName)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (initials != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, INITIALS)); + atav.add(new DERValue(DER.PRINTABLE_STRING, initials)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (generation != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, GENERATION)); + atav.add(new DERValue(DER.PRINTABLE_STRING, generation)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (email != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, EMAIL)); + atav.add(new DERValue(DER.PRINTABLE_STRING, email)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (domainComponent != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, DC)); + atav.add(new DERValue(DER.PRINTABLE_STRING, domainComponent)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + if (userid != null) + { + HashSet rdn = new HashSet(); + LinkedList atav = new LinkedList(); + atav.add(new DERValue(DER.OBJECT_IDENTIFIER, UID)); + atav.add(new DERValue(DER.PRINTABLE_STRING, userid)); + rdn.add(new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, atav)); + name.add(new DERValue(DER.CONSTRUCTED | DER.SET, rdn)); + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + DERWriter.write(out, new DERValue(DER.CONSTRUCTED|DER.SEQUENCE, name)); + return out.toByteArray(); + } + catch (IOException ioe) + { + throw new Error(ioe); + } + } + + private void setAttribute(String atype, String aval) + { + if (atype.equals("CN")) + commonName = aval; + else if (atype.equals("C")) + country = aval; + else if (atype.equals("L")) + locality = aval; + else if (atype.equals("ST")) + state = aval; + else if (atype.equals("STREET")) + street = aval; + else if (atype.equals("O")) + organization = aval; + else if (atype.equals("OU")) + orgUnit = aval; + else if (atype.equals("T")) + title = aval; + else if (atype.equals("DNQ") || atype.equals("DNQUALIFIER")) + dnQualifier = aval; + else if (atype.equals("SURNAME")) + surname = aval; + else if (atype.equals("GIVENNAME")) + givenName = aval; + else if (atype.equals("INITIALS")) + initials = aval; + else if (atype.equals("GENERATION")) + generation = aval; + else if (atype.equals("EMAILADDRESS")) + email = aval; + else if (atype.equals("DC")) + domainComponent = aval; + else if (atype.equals("UID")) + userid = aval; + else + throw new IllegalArgumentException("unknown attribute " + atype); + } + + private void setAttribute(OID atype, String aval) + { + if (atype.equals(CN)) + commonName = aval; + else if (atype.equals(C)) + country = aval; + else if (atype.equals(L)) + locality = aval; + else if (atype.equals(ST)) + state = aval; + else if (atype.equals(STREET)) + street = aval; + else if (atype.equals(O)) + organization = aval; + else if (atype.equals(OU)) + orgUnit = aval; + else if (atype.equals(T)) + title = aval; + else if (atype.equals(DNQ)) + dnQualifier = aval; + else if (atype.equals(NAME)) + surname = aval; + else if (atype.equals(GIVENNAME)) + givenName = aval; + else if (atype.equals(INITIALS)) + initials = aval; + else if (atype.equals(GENERATION)) + generation = aval; + else if (atype.equals(EMAIL)) + email = aval; + else if (atype.equals(DC)) + domainComponent = aval; + else if (atype.equals(UID)) + userid = aval; + else + throw new IllegalArgumentException("unknown attribute " + atype); + } +} |