X509Name.java
上传用户:lior1029
上传日期:2013-05-07
资源大小:209k
文件大小:18k
源码类别:

CA认证

开发平台:

Java

  1. package org.bouncycastle.asn1.x509;
  2. import java.io.*;
  3. import java.util.*;
  4. import org.bouncycastle.asn1.*;
  5. public class X509Name
  6.     implements DEREncodable
  7. {
  8.     /**
  9.      * country code - StringType(SIZE(2))
  10.      */
  11.     public static final DERObjectIdentifier C = new DERObjectIdentifier("2.5.4.6");
  12.     /**
  13.      * organization - StringType(SIZE(1..64))
  14.      */
  15.     public static final DERObjectIdentifier O = new DERObjectIdentifier("2.5.4.10");
  16.     /**
  17.      * organizational unit name - StringType(SIZE(1..64))
  18.      */
  19.     public static final DERObjectIdentifier OU = new DERObjectIdentifier("2.5.4.11");
  20.     /**
  21.      * Title
  22.      */
  23.     public static final DERObjectIdentifier T = new DERObjectIdentifier("2.5.4.12");
  24.     /**
  25.      * common name - StringType(SIZE(1..64))
  26.      */
  27.     public static final DERObjectIdentifier CN = new DERObjectIdentifier("2.5.4.3");
  28.     /**
  29.      * device serial number name - StringType(SIZE(1..64))
  30.      */
  31.     public static final DERObjectIdentifier SN = new DERObjectIdentifier("2.5.4.5");
  32.     /**
  33.      * locality name - StringType(SIZE(1..64))
  34.      */
  35.     public static final DERObjectIdentifier L = new DERObjectIdentifier("2.5.4.7");
  36.     /**
  37.      * state, or province name - StringType(SIZE(1..64))
  38.      */
  39.     public static final DERObjectIdentifier ST = new DERObjectIdentifier("2.5.4.8");
  40.     /**
  41.      * Naming attributes of type X520name
  42.      */
  43.     public static final DERObjectIdentifier SURNAME = new DERObjectIdentifier("2.5.4.4");
  44.     public static final DERObjectIdentifier GIVENNAME = new DERObjectIdentifier("2.5.4.42");
  45.     public static final DERObjectIdentifier INITIALS = new DERObjectIdentifier("2.5.4.43");
  46.     public static final DERObjectIdentifier GENERATION = new DERObjectIdentifier("2.5.4.44");
  47.     /**
  48.      * email address (RSA PKCS#9 extension) - IA5String
  49.      * <p>
  50.      * note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here.
  51.      */
  52.     public static final DERObjectIdentifier EmailAddress = new DERObjectIdentifier("1.2.840.113549.1.9.1");
  53. /**
  54.  * email address in Verisign certificates
  55.  */
  56. public static final DERObjectIdentifier E = EmailAddress;
  57.     /*
  58.      * others...
  59.      */
  60.     public static final DERObjectIdentifier DC = new DERObjectIdentifier("0.9.2342.19200300.100.1.25");
  61.     /**
  62.      * LDAP User id.
  63.      */
  64.     public static final DERObjectIdentifier UID = new DERObjectIdentifier("0.9.2342.19200300.100.1.1");
  65.     /**
  66.      * look up table translating OID values into their common symbols - this static is scheduled for deletion
  67.      */
  68.     public static Hashtable OIDLookUp = new Hashtable();
  69.     /**
  70.      * determines whether or not strings should be processed and printed
  71.      * from back to front.
  72.      */
  73.     public static boolean DefaultReverse = false;
  74.     /**
  75.      * default look up table translating OID values into their common symbols following
  76.      * the convention in RFC 2253 with a few extras
  77.      */
  78.     public static Hashtable DefaultSymbols = OIDLookUp;
  79.     /**
  80.      * look up table translating OID values into their common symbols following the convention in RFC 2253
  81.      * with a few extras
  82.      */
  83.     public static Hashtable RFC2253Symbols = new Hashtable();
  84.     /**
  85.      * look up table translating string values into their OIDS -
  86.      * this static is scheduled for deletion
  87.      */
  88.     public static Hashtable SymbolLookUp = new Hashtable();
  89.     /**
  90.      * look up table translating common symbols into their OIDS.
  91.      */
  92.     public static Hashtable DefaultLookUp = SymbolLookUp;
  93.     static
  94.     {
  95.         DefaultSymbols.put(C, "C");
  96.         DefaultSymbols.put(O, "O");
  97.         DefaultSymbols.put(T, "T");
  98.         DefaultSymbols.put(OU, "OU");
  99.         DefaultSymbols.put(CN, "CN");
  100.         DefaultSymbols.put(L, "L");
  101.         DefaultSymbols.put(ST, "ST");
  102.         DefaultSymbols.put(SN, "SN");
  103.         DefaultSymbols.put(EmailAddress, "E");
  104.         DefaultSymbols.put(DC, "DC");
  105.         DefaultSymbols.put(UID, "UID");
  106.         DefaultSymbols.put(SURNAME, "SURNAME");
  107.         DefaultSymbols.put(GIVENNAME, "GIVENNAME");
  108.         DefaultSymbols.put(INITIALS, "INITIALS");
  109.         DefaultSymbols.put(GENERATION, "GENERATION");
  110.         RFC2253Symbols.put(C, "C");
  111.         RFC2253Symbols.put(O, "O");
  112.         RFC2253Symbols.put(T, "T");
  113.         RFC2253Symbols.put(OU, "OU");
  114.         RFC2253Symbols.put(CN, "CN");
  115.         RFC2253Symbols.put(L, "L");
  116.         RFC2253Symbols.put(ST, "ST");
  117.         RFC2253Symbols.put(SN, "SN");
  118.         RFC2253Symbols.put(EmailAddress, "EMAILADDRESS");
  119.         RFC2253Symbols.put(DC, "DC");
  120.         RFC2253Symbols.put(UID, "UID");
  121.         RFC2253Symbols.put(SURNAME, "SURNAME");
  122.         RFC2253Symbols.put(GIVENNAME, "GIVENNAME");
  123.         RFC2253Symbols.put(INITIALS, "INITIALS");
  124.         RFC2253Symbols.put(GENERATION, "GENERATION");
  125.         DefaultLookUp.put("c", C);
  126.         DefaultLookUp.put("o", O);
  127.         DefaultLookUp.put("t", T);
  128.         DefaultLookUp.put("ou", OU);
  129.         DefaultLookUp.put("cn", CN);
  130.         DefaultLookUp.put("l", L);
  131.         DefaultLookUp.put("st", ST);
  132.         DefaultLookUp.put("sn", SN);
  133.         DefaultLookUp.put("emailaddress", E);
  134.         DefaultLookUp.put("dc", DC);
  135.         DefaultLookUp.put("e", E);
  136.         DefaultLookUp.put("uid", UID);
  137.         DefaultLookUp.put("surname", SURNAME);
  138.         DefaultLookUp.put("givenname", GIVENNAME);
  139.         DefaultLookUp.put("initials", INITIALS);
  140.         DefaultLookUp.put("generation", GENERATION);
  141.     }
  142.     private Vector                  ordering = new Vector();
  143.     private Vector                  values = new Vector();
  144.     private ASN1Sequence            seq;
  145.     public static X509Name getInstance(
  146.         ASN1TaggedObject obj,
  147.         boolean          explicit)
  148.     {
  149.         return getInstance(ASN1Sequence.getInstance(obj, explicit));
  150.     }
  151.     public static X509Name getInstance(
  152.         Object  obj)
  153.     {
  154.         if (obj == null || obj instanceof X509Name)
  155.         {
  156.             return (X509Name)obj;
  157.         }
  158.         else if (obj instanceof ASN1Sequence)
  159.         {
  160.             return new X509Name((ASN1Sequence)obj);
  161.         }
  162.         throw new IllegalArgumentException("unknown object in factory");
  163.     }
  164.     /**
  165.      * Constructor from ASN1Sequence
  166.      *
  167.      * the principal will be a list of constructed sets, each containing an (OID, String) pair.
  168.      */
  169.     public X509Name(
  170.         ASN1Sequence  seq)
  171.     {
  172.         this.seq = seq;
  173.         Enumeration e = seq.getObjects();
  174.         while (e.hasMoreElements())
  175.         {
  176.             ASN1Set         set = (ASN1Set)e.nextElement();
  177.             ASN1Sequence    s = (ASN1Sequence)set.getObjectAt(0);
  178.             ordering.addElement(s.getObjectAt(0));
  179.             values.addElement(((DERString)s.getObjectAt(1)).getString());
  180.         }
  181.     }
  182.     /**
  183.      * constructor from a table of attributes.
  184.      * <p>
  185.      * it's is assumed the table contains OID/String pairs, and the contents
  186.      * of the table are copied into an internal table as part of the 
  187.      * construction process.
  188.      * <p>
  189.      * <b>Note:</b> if the name you are trying to generate should be
  190.      * following a specific ordering, you should use the constructor
  191.      * with the ordering specified below.
  192.      */
  193.     public X509Name(
  194.         Hashtable  attributes)
  195.     {
  196.         this(null, attributes);
  197.     }
  198.     /**
  199.      * constructor from a table of attributes with ordering.
  200.      * <p>
  201.      * it's is assumed the table contains OID/String pairs, and the contents
  202.      * of the table are copied into an internal table as part of the 
  203.      * construction process. The ordering vector should contain the OIDs
  204.      * in the order they are meant to be encoded or printed in toString.
  205.      */
  206.     public X509Name(
  207.         Vector      ordering,
  208.         Hashtable   attributes)
  209.     {
  210.         if (ordering != null)
  211.         {
  212.             for (int i = 0; i != ordering.size(); i++)
  213.             {
  214.                 this.ordering.addElement(ordering.elementAt(i));
  215.             }
  216.         }
  217.         else
  218.         {
  219.             Enumeration     e = attributes.keys();
  220.             while (e.hasMoreElements())
  221.             {
  222.                 this.ordering.addElement(e.nextElement());
  223.             }
  224.         }
  225.         for (int i = 0; i != this.ordering.size(); i++)
  226.         {
  227.             DERObjectIdentifier     oid = (DERObjectIdentifier)this.ordering.elementAt(i);
  228.             if (attributes.get(oid) == null)
  229.             {
  230.                 throw new IllegalArgumentException("No attribute for object id - " + oid.getId() + " - passed to distinguished name");
  231.             }
  232.             this.values.addElement(attributes.get(oid)); // copy the hash table
  233.         }
  234.     }
  235.     /**
  236.      * takes two vectors one of the oids and the other of the values.
  237.      */
  238.     public X509Name(
  239.         Vector  ordering,
  240.         Vector  values)
  241.     {
  242.         if (ordering.size() != values.size())
  243.         {
  244.             throw new IllegalArgumentException("ordering vector must be same length as values.");
  245.         }
  246.         for (int i = 0; i < ordering.size(); i++)
  247.         {
  248.             this.ordering.addElement(ordering.elementAt(i));
  249.             this.values.addElement(values.elementAt(i));
  250.         }
  251.     }
  252.     /**
  253.      * takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
  254.      * some such, converting it into an ordered set of name attributes.
  255.      */
  256.     public X509Name(
  257.         String  dirName)
  258.     {
  259.         this(DefaultReverse, DefaultLookUp, dirName);
  260.     }
  261.     /**
  262.      * takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
  263.      * some such, converting it into an ordered set of name attributes. If reverse
  264.      * is true, create the encoded version of the sequence starting from the
  265.      * last element in the string.
  266.      */
  267.     public X509Name(
  268.         boolean reverse,
  269.         String  dirName)
  270.     {
  271.         this(reverse, DefaultLookUp, dirName);
  272.     }
  273.     /**
  274.      * takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
  275.      * some such, converting it into an ordered set of name attributes. lookUp 
  276.      * should provide a table of lookups, indexed by lowercase only strings and
  277.      * yielding a DERObjectIdentifier, other than that OID. and numeric oids
  278.      * will be processed automatically.
  279.      * <p>
  280.      * If reverse is true, create the encoded version of the sequence starting
  281.      * from the last element in the string.
  282.      */
  283.     public X509Name(
  284.         boolean     reverse,
  285.         Hashtable   lookUp,
  286.         String      dirName)
  287.     {
  288.         X509NameTokenizer   nTok = new X509NameTokenizer(dirName);
  289.         while (nTok.hasMoreTokens())
  290.         {
  291.             String  token = nTok.nextToken();
  292.             int     index = token.indexOf('=');
  293.             if (index == -1)
  294.             {
  295.                 throw new IllegalArgumentException("badly formated directory string");
  296.             }
  297.             String              name = token.substring(0, index);
  298.             String              value = token.substring(index + 1);
  299.             DERObjectIdentifier oid = null;
  300.             if (name.toUpperCase().startsWith("OID."))
  301.             {
  302.                 oid = new DERObjectIdentifier(name.substring(4));
  303.             }
  304.             else if (name.charAt(0) >= '0' && name.charAt(0) <= '9')
  305.             {
  306.                 oid = new DERObjectIdentifier(name);
  307.             }
  308.             else
  309.             {
  310.                 oid = (DERObjectIdentifier)lookUp.get(name.toLowerCase());
  311.                 if (oid == null)
  312.                 {
  313.                     throw new IllegalArgumentException("Unknown object id - " + name + " - passed to distinguished name");
  314.                 }
  315.             }
  316.             this.ordering.addElement(oid);
  317.             this.values.addElement(value);
  318.         }
  319.         if (reverse)
  320.         {
  321.             Vector  o = new Vector();
  322.             Vector  v = new Vector();
  323.             for (int i = this.ordering.size() - 1; i >= 0; i--)
  324.             {
  325.                 o.addElement(this.ordering.elementAt(i));
  326.                 v.addElement(this.values.elementAt(i));
  327.             }
  328.             this.ordering = o;
  329.             this.values = v;
  330.         }
  331.     }
  332.     /**
  333.      * return false if we have characters out of the range of a printable
  334.      * string, true otherwise.
  335.      */
  336.     private boolean canBePrintable(
  337.         String  str)
  338.     {
  339.         for (int i = str.length() - 1; i >= 0; i--)
  340.         {
  341.             if (str.charAt(i) > 0x007f)
  342.             {
  343.                 return false;
  344.             }
  345.         }
  346.         return true;
  347.     }
  348.     public DERObject getDERObject()
  349.     {
  350.         if (seq == null)
  351.         {
  352.             ASN1EncodableVector  vec = new ASN1EncodableVector();
  353.             for (int i = 0; i != ordering.size(); i++)
  354.             {
  355.                 ASN1EncodableVector     v = new ASN1EncodableVector();
  356.                 DERObjectIdentifier     oid = (DERObjectIdentifier)ordering.elementAt(i);
  357.                 v.add(oid);
  358.                 String  str = (String)values.elementAt(i);
  359.                 if (oid.equals(EmailAddress))
  360.                 {
  361.                     v.add(new DERIA5String(str));
  362.                 }
  363.                 else
  364.                 {
  365.                     if (canBePrintable(str))
  366.                     {
  367.                         v.add(new DERPrintableString(str));
  368.                     }
  369.                     else
  370.                     {
  371.                         v.add(new DERUTF8String(str));
  372.                     }
  373.                 }
  374.                 vec.add(new DERSet(new DERSequence(v)));
  375.             }
  376.             seq = new DERSequence(vec);
  377.         }
  378.         return seq;
  379.     }
  380.     /**
  381.      * test for equality - note: case is ignored.
  382.      */
  383.     public boolean equals(Object _obj) 
  384.     {
  385.         if (_obj == this)
  386.         {
  387.             return true;
  388.         }
  389.         if (_obj == null || !(_obj instanceof X509Name))
  390.         {
  391.             return false;
  392.         }
  393.         
  394.         X509Name _oxn          = (X509Name)_obj;
  395.         int      _orderingSize = ordering.size();
  396.         if (_orderingSize != _oxn.ordering.size()) 
  397.         {
  398. return false;
  399. }
  400. boolean[] _indexes = new boolean[_orderingSize];
  401. for(int i = 0; i < _orderingSize; i++) 
  402. {
  403. boolean _found = false;
  404. String  _oid   = ((DERObjectIdentifier)ordering.elementAt(i)).getId();
  405. String  _val   = (String)values.elementAt(i);
  406. for(int j = 0; j < _orderingSize; j++) 
  407. {
  408. if(_indexes[j] == true)
  409. {
  410. continue;
  411. }
  412. String _oOID = ((DERObjectIdentifier)_oxn.ordering.elementAt(j)).getId();
  413. String _oVal = (String)_oxn.values.elementAt(j);
  414.                 // was equalsIgnoreCase but MIDP doesn't like that.
  415. if(_oid.equals(_oOID) && _val.toLowerCase().equals(_oVal.toLowerCase()))
  416. {
  417. _indexes[j] = true;
  418. _found      = true;
  419. break;
  420. }
  421. }
  422. if(!_found)
  423. {
  424. return false;
  425. }
  426. }
  427. return true;
  428. }
  429.     public int hashCode()
  430.     {
  431.         ASN1Sequence  seq = (ASN1Sequence)this.getDERObject();
  432.         Enumeration   e = seq.getObjects();
  433.         int           hashCode = 0;
  434.         while (e.hasMoreElements())
  435.         {
  436.             hashCode ^= e.nextElement().hashCode();
  437.         }
  438.         return hashCode;
  439.     }
  440.     private void appendValue(
  441.         StringBuffer        buf,
  442.         Hashtable           oidSymbols,
  443.         DERObjectIdentifier oid,
  444.         String              value)
  445.     {
  446.         String  sym = (String)oidSymbols.get(oid);
  447.         if (sym != null)
  448.         {
  449.             buf.append(sym);
  450.         }
  451.         else
  452.         {
  453.             buf.append(((DERObjectIdentifier)oid).getId());
  454.         }
  455.         buf.append("=");
  456.         int     index = buf.length();
  457.         buf.append(value);
  458.         int     end = buf.length();
  459.         while (index != end)
  460.         {
  461.             if ((buf.charAt(index) == ',')
  462.                || (buf.charAt(index) == '"')
  463.                || (buf.charAt(index) == '\')
  464.                || (buf.charAt(index) == '+')
  465.                || (buf.charAt(index) == '<')
  466.                || (buf.charAt(index) == '>')
  467.                || (buf.charAt(index) == ';'))
  468.             {
  469.                 buf.insert(index, "\");
  470.                 index++;
  471.                 end++;
  472.             }
  473.             index++;
  474.         }
  475.     }
  476.     /**
  477.      * convert the structure to a string - if reverse is true the
  478.      * oids and values are listed out starting with the last element
  479.      * in the sequence (ala RFC 2253), otherwise the string will begin
  480.      * with the first element of the structure. If no string definition
  481.      * for the oid is found in oidSymbols the string value of the oid is
  482.      * added. Two standard symbol tables are provided DefaultSymbols, and
  483.      * RFC2253Symbols as part of this class.
  484.      *
  485.      * @param reverse if true start at the end of the sequence and work back.
  486.      * @param oidSymbols look up table strings for oids.
  487.      */
  488.     public String toString(
  489.         boolean     reverse,
  490.         Hashtable   oidSymbols)
  491.     {
  492.         StringBuffer            buf = new StringBuffer();
  493.         boolean                 first = true;
  494.         if (reverse)
  495.         {
  496.             for (int i = ordering.size() - 1; i >= 0; i--)
  497.             {
  498.                 if (first)
  499.                 {
  500.                     first = false;
  501.                 }
  502.                 else
  503.                 {
  504.                     buf.append(",");
  505.                 }
  506.                 appendValue(buf, oidSymbols, 
  507.                             (DERObjectIdentifier)ordering.elementAt(i),
  508.                             (String)values.elementAt(i));
  509.             }
  510.         }
  511.         else
  512.         {
  513.             for (int i = 0; i < ordering.size(); i++)
  514.             {
  515.                 if (first)
  516.                 {
  517.                     first = false;
  518.                 }
  519.                 else
  520.                 {
  521.                     buf.append(",");
  522.                 }
  523.                 appendValue(buf, oidSymbols, 
  524.                             (DERObjectIdentifier)ordering.elementAt(i),
  525.                             (String)values.elementAt(i));
  526.             }
  527.         }
  528.         return buf.toString();
  529.     }
  530.     public String toString()
  531.     {
  532.         return toString(DefaultReverse, DefaultSymbols);
  533.     }
  534. }