116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.asn1.x500.style;
216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.Hashtable;
416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Encodable;
616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERIA5String;
816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERPrintableString;
916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.x500.RDN;
1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.x500.X500Name;
1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.x500.X500NameStyle;
1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic class RFC4519Style
1453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro	extends AbstractX500NameStyle
1516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{
16bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier businessCategory = new ASN1ObjectIdentifier("2.5.4.15").intern();
17bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier c = new ASN1ObjectIdentifier("2.5.4.6").intern();
18bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier cn = new ASN1ObjectIdentifier("2.5.4.3").intern();
19bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier dc = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.25").intern();
20bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier description = new ASN1ObjectIdentifier("2.5.4.13").intern();
21bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier destinationIndicator = new ASN1ObjectIdentifier("2.5.4.27").intern();
22bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier distinguishedName = new ASN1ObjectIdentifier("2.5.4.49").intern();
23bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier dnQualifier = new ASN1ObjectIdentifier("2.5.4.46").intern();
24bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier enhancedSearchGuide = new ASN1ObjectIdentifier("2.5.4.47").intern();
25bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier facsimileTelephoneNumber = new ASN1ObjectIdentifier("2.5.4.23").intern();
26bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier generationQualifier = new ASN1ObjectIdentifier("2.5.4.44").intern();
27bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier givenName = new ASN1ObjectIdentifier("2.5.4.42").intern();
28bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier houseIdentifier = new ASN1ObjectIdentifier("2.5.4.51").intern();
29bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier initials = new ASN1ObjectIdentifier("2.5.4.43").intern();
30bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier internationalISDNNumber = new ASN1ObjectIdentifier("2.5.4.25").intern();
31bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier l = new ASN1ObjectIdentifier("2.5.4.7").intern();
32bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier member = new ASN1ObjectIdentifier("2.5.4.31").intern();
33bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier name = new ASN1ObjectIdentifier("2.5.4.41").intern();
34bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier o = new ASN1ObjectIdentifier("2.5.4.10").intern();
35bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier ou = new ASN1ObjectIdentifier("2.5.4.11").intern();
36bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier owner = new ASN1ObjectIdentifier("2.5.4.32").intern();
37bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier physicalDeliveryOfficeName = new ASN1ObjectIdentifier("2.5.4.19").intern();
38bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier postalAddress = new ASN1ObjectIdentifier("2.5.4.16").intern();
39bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier postalCode = new ASN1ObjectIdentifier("2.5.4.17").intern();
40bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier postOfficeBox = new ASN1ObjectIdentifier("2.5.4.18").intern();
41bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier preferredDeliveryMethod = new ASN1ObjectIdentifier("2.5.4.28").intern();
42bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier registeredAddress = new ASN1ObjectIdentifier("2.5.4.26").intern();
43bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier roleOccupant = new ASN1ObjectIdentifier("2.5.4.33").intern();
44bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier searchGuide = new ASN1ObjectIdentifier("2.5.4.14").intern();
45bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier seeAlso = new ASN1ObjectIdentifier("2.5.4.34").intern();
46bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier serialNumber = new ASN1ObjectIdentifier("2.5.4.5").intern();
47bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier sn = new ASN1ObjectIdentifier("2.5.4.4").intern();
48bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier st = new ASN1ObjectIdentifier("2.5.4.8").intern();
49bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier street = new ASN1ObjectIdentifier("2.5.4.9").intern();
50bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier telephoneNumber = new ASN1ObjectIdentifier("2.5.4.20").intern();
51bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier teletexTerminalIdentifier = new ASN1ObjectIdentifier("2.5.4.22").intern();
52bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier telexNumber = new ASN1ObjectIdentifier("2.5.4.21").intern();
53bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier title = new ASN1ObjectIdentifier("2.5.4.12").intern();
54bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier uid = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.1").intern();
55bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier uniqueMember = new ASN1ObjectIdentifier("2.5.4.50").intern();
56bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier userPassword = new ASN1ObjectIdentifier("2.5.4.35").intern();
57bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier x121Address = new ASN1ObjectIdentifier("2.5.4.24").intern();
58bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static final ASN1ObjectIdentifier x500UniqueIdentifier = new ASN1ObjectIdentifier("2.5.4.45").intern();
5916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
6016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
6116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * default look up table translating OID values into their common symbols following
6216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * the convention in RFC 2253 with a few extras
6316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
6416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private static final Hashtable DefaultSymbols = new Hashtable();
6516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
6616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
6716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * look up table translating common symbols into their OIDS.
6816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
6916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private static final Hashtable DefaultLookUp = new Hashtable();
7016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
7116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static
7216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
7316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(businessCategory, "businessCategory");
7416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(c, "c");
7516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(cn, "cn");
7616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(dc, "dc");
7716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(description, "description");
7816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(destinationIndicator, "destinationIndicator");
7916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(distinguishedName, "distinguishedName");
8016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(dnQualifier, "dnQualifier");
8116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(enhancedSearchGuide, "enhancedSearchGuide");
8216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(facsimileTelephoneNumber, "facsimileTelephoneNumber");
8316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(generationQualifier, "generationQualifier");
8416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(givenName, "givenName");
8516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(houseIdentifier, "houseIdentifier");
8616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(initials, "initials");
8716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(internationalISDNNumber, "internationalISDNNumber");
8816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(l, "l");
8916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(member, "member");
9016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(name, "name");
9116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(o, "o");
9216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(ou, "ou");
9316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(owner, "owner");
9416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(physicalDeliveryOfficeName, "physicalDeliveryOfficeName");
9516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(postalAddress, "postalAddress");
9616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(postalCode, "postalCode");
9716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(postOfficeBox, "postOfficeBox");
9816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(preferredDeliveryMethod, "preferredDeliveryMethod");
9916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(registeredAddress, "registeredAddress");
10016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(roleOccupant, "roleOccupant");
10116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(searchGuide, "searchGuide");
10216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(seeAlso, "seeAlso");
10316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(serialNumber, "serialNumber");
10416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(sn, "sn");
10516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(st, "st");
10616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(street, "street");
10716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(telephoneNumber, "telephoneNumber");
10816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(teletexTerminalIdentifier, "teletexTerminalIdentifier");
10916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(telexNumber, "telexNumber");
11016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(title, "title");
11116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(uid, "uid");
11216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(uniqueMember, "uniqueMember");
11316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(userPassword, "userPassword");
11416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(x121Address, "x121Address");
11516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(x500UniqueIdentifier, "x500UniqueIdentifier");
11616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
11716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("businesscategory", businessCategory);
11816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("c", c);
11916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("cn", cn);
12016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("dc", dc);
12116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("description", description);
12216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("destinationindicator", destinationIndicator);
12316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("distinguishedname", distinguishedName);
12416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("dnqualifier", dnQualifier);
12516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("enhancedsearchguide", enhancedSearchGuide);
12616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("facsimiletelephonenumber", facsimileTelephoneNumber);
12716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("generationqualifier", generationQualifier);
12816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("givenname", givenName);
12916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("houseidentifier", houseIdentifier);
13016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("initials", initials);
13116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("internationalisdnnumber", internationalISDNNumber);
13216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("l", l);
13316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("member", member);
13416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("name", name);
13516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("o", o);
13616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("ou", ou);
13716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("owner", owner);
13816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("physicaldeliveryofficename", physicalDeliveryOfficeName);
13916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("postaladdress", postalAddress);
14016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("postalcode", postalCode);
14116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("postofficebox", postOfficeBox);
14216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("preferreddeliverymethod", preferredDeliveryMethod);
14316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("registeredaddress", registeredAddress);
14416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("roleoccupant", roleOccupant);
14516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("searchguide", searchGuide);
14616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("seealso", seeAlso);
14716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("serialnumber", serialNumber);
14816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("sn", sn);
14916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("st", st);
15016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("street", street);
15116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("telephonenumber", telephoneNumber);
15216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("teletexterminalidentifier", teletexTerminalIdentifier);
15316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("telexnumber", telexNumber);
15416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("title", title);
15516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("uid", uid);
15616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("uniquemember", uniqueMember);
15716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("userpassword", userPassword);
15816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("x121address", x121Address);
15916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("x500uniqueidentifier", x500UniqueIdentifier);
16016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        // TODO: need to add correct matching for equality comparisons.
16216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
16316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    /**
16580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro     * Singleton instance.
16680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro     */
16780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    public static final X500NameStyle INSTANCE = new RFC4519Style();
16880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
16980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    protected final Hashtable defaultLookUp;
17080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    protected final Hashtable defaultSymbols;
17180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
17216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    protected RFC4519Style()
17316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
17480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        defaultSymbols = copyHashTable(DefaultSymbols);
17580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        defaultLookUp = copyHashTable(DefaultLookUp);
17616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
17716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
17853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    protected ASN1Encodable encodeStringValue(ASN1ObjectIdentifier oid,
17953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    		String value) {
18053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    	if (oid.equals(dc))
18116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
18253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            return new DERIA5String(value);
18316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
18453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        else if (oid.equals(c) || oid.equals(serialNumber) || oid.equals(dnQualifier)
18553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            || oid.equals(telephoneNumber))
18616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
18753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            return new DERPrintableString(value);
18816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
18916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
19053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    	return super.encodeStringValue(oid, value);
19116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
19216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
19316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public String oidToDisplayName(ASN1ObjectIdentifier oid)
19416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
19516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return (String)DefaultSymbols.get(oid);
19616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
19716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
19816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public String[] oidToAttrNames(ASN1ObjectIdentifier oid)
19916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
20080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        return IETFUtils.findAttrNamesForOID(oid, defaultLookUp);
20116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
20216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
20316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public ASN1ObjectIdentifier attrNameToOID(String attrName)
20416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
20580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        return IETFUtils.decodeAttrName(attrName, defaultLookUp);
20616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
20716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
20816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    // parse backwards
20916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public RDN[] fromString(String dirName)
21016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
21116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RDN[] tmp = IETFUtils.rDNsFromString(dirName, this);
21216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RDN[] res = new RDN[tmp.length];
21316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
21416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i != tmp.length; i++)
21516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
21616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            res[res.length - i - 1] = tmp[i];
21716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
21816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
21916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return res;
22016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
22116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
22216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    // convert in reverse
22316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public String toString(X500Name name)
22416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
22516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        StringBuffer buf = new StringBuffer();
22616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean first = true;
22716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
22816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RDN[] rdns = name.getRDNs();
22916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
23016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = rdns.length - 1; i >= 0; i--)
23116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
23216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (first)
23316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
23416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                first = false;
23516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
23616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            else
23716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
23816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                buf.append(',');
23916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
24016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
24180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            IETFUtils.appendRDN(buf, rdns[i], defaultSymbols);
24216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
24316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
24416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return buf.toString();
24516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
24680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
24753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
24816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro}
249