aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu/java/security/x509/X500DistinguishedName.java
diff options
context:
space:
mode:
authorMichael Koch <konqueror@gmx.de>2003-04-30 07:23:42 +0000
committerMichael Koch <mkoch@gcc.gnu.org>2003-04-30 07:23:42 +0000
commit43905ff30b187d8d1d1dee50e722f47fd8a93144 (patch)
tree89373f6e7f4c07ae0c9c6eeebf05fcb7bbcdfa36 /libjava/gnu/java/security/x509/X500DistinguishedName.java
parent505b0fd661e21182856cfcf73ed6f39c707ac28b (diff)
downloadgcc-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.java824
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);
+ }
+}