FileDocCategorySizeDatePackage
X509Name.javaAPI DocAzureus 3.0.3.424396Tue Jun 08 05:12:56 BST 2004org.bouncycastle.asn1.x509

X509Name

public class X509Name extends Object implements DEREncodable

Fields Summary
public static final DERObjectIdentifier
C
country code - StringType(SIZE(2))
public static final DERObjectIdentifier
O
organization - StringType(SIZE(1..64))
public static final DERObjectIdentifier
OU
organizational unit name - StringType(SIZE(1..64))
public static final DERObjectIdentifier
T
Title
public static final DERObjectIdentifier
CN
common name - StringType(SIZE(1..64))
public static final DERObjectIdentifier
SN
device serial number name - StringType(SIZE(1..64))
public static final DERObjectIdentifier
L
locality name - StringType(SIZE(1..64))
public static final DERObjectIdentifier
ST
state, or province name - StringType(SIZE(1..64))
public static final DERObjectIdentifier
SURNAME
Naming attributes of type X520name
public static final DERObjectIdentifier
GIVENNAME
public static final DERObjectIdentifier
INITIALS
public static final DERObjectIdentifier
GENERATION
public static final DERObjectIdentifier
EmailAddress
Email address (RSA PKCS#9 extension) - IA5String.

Note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here.

public static final DERObjectIdentifier
E
email address in Verisign certificates
public static final DERObjectIdentifier
DC
public static final DERObjectIdentifier
UID
LDAP User id.
public static Hashtable
OIDLookUp
look up table translating OID values into their common symbols - this static is scheduled for deletion
public static boolean
DefaultReverse
determines whether or not strings should be processed and printed from back to front.
public static Hashtable
DefaultSymbols
default look up table translating OID values into their common symbols following the convention in RFC 2253 with a few extras
public static Hashtable
RFC2253Symbols
look up table translating OID values into their common symbols following the convention in RFC 2253 with a few extras
public static Hashtable
SymbolLookUp
look up table translating string values into their OIDS - this static is scheduled for deletion
public static Hashtable
DefaultLookUp
look up table translating common symbols into their OIDS.
private Vector
ordering
private Vector
values
private Vector
added
private ASN1Sequence
seq
Constructors Summary
public X509Name(ASN1Sequence seq)
Constructor from ASN1Sequence the principal will be a list of constructed sets, each containing an (OID, String) pair.

        this.seq = seq;

        Enumeration e = seq.getObjects();

        while (e.hasMoreElements())
        {
            ASN1Set         set = (ASN1Set)e.nextElement();

			for (int i = 0; i < set.size(); i++) 
			{
				   ASN1Sequence s = (ASN1Sequence)set.getObjectAt(i);
				   
				   ordering.addElement(s.getObjectAt(0));
				   values.addElement(((DERString) s.getObjectAt(1)).getString());
				   added.addElement((i != 0) ? Boolean.TRUE : Boolean.FALSE);
			}
        }
    
public X509Name(Hashtable attributes)
constructor from a table of attributes.

it's is assumed the table contains OID/String pairs, and the contents of the table are copied into an internal table as part of the construction process.

Note: if the name you are trying to generate should be following a specific ordering, you should use the constructor with the ordering specified below.

        this(null, attributes);
    
public X509Name(Vector ordering, Hashtable attributes)
Constructor from a table of attributes with ordering.

it's is assumed the table contains OID/String pairs, and the contents of the table are copied into an internal table as part of the construction process. The ordering vector should contain the OIDs in the order they are meant to be encoded or printed in toString.

        if (ordering != null)
        {
            for (int i = 0; i != ordering.size(); i++)
            {
                this.ordering.addElement(ordering.elementAt(i));
                this.added.addElement(Boolean.FALSE);
            }
        }
        else
        {
            Enumeration     e = attributes.keys();

            while (e.hasMoreElements())
            {
                this.ordering.addElement(e.nextElement());
				this.added.addElement(Boolean.FALSE);
            }
        }

        for (int i = 0; i != this.ordering.size(); i++)
        {
            DERObjectIdentifier     oid = (DERObjectIdentifier)this.ordering.elementAt(i);

            if (attributes.get(oid) == null)
            {
                throw new IllegalArgumentException("No attribute for object id - " + oid.getId() + " - passed to distinguished name");
            }

            this.values.addElement(attributes.get(oid)); // copy the hash table
        }
    
public X509Name(Vector oids, Vector values)
Takes two vectors one of the oids and the other of the values.

        if (oids.size() != values.size())
        {
            throw new IllegalArgumentException("oids vector must be same length as values.");
        }

        for (int i = 0; i < oids.size(); i++)
        {
            this.ordering.addElement(oids.elementAt(i));
            this.values.addElement(values.elementAt(i));
			this.added.addElement(Boolean.FALSE);
        }
    
public X509Name(String dirName)
Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or some such, converting it into an ordered set of name attributes.

        this(DefaultReverse, DefaultLookUp, dirName);
    
public X509Name(boolean reverse, String dirName)
Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or some such, converting it into an ordered set of name attributes. If reverse is true, create the encoded version of the sequence starting from the last element in the string.

        this(reverse, DefaultLookUp, dirName);
    
public X509Name(boolean reverse, Hashtable lookUp, String dirName)
Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or some such, converting it into an ordered set of name attributes. lookUp should provide a table of lookups, indexed by lowercase only strings and yielding a DERObjectIdentifier, other than that OID. and numeric oids will be processed automatically.
If reverse is true, create the encoded version of the sequence starting from the last element in the string.

param
reverse true if we should start scanning from the end (RFC 2553).
param
lookUp table of names and their oids.
param
dirName the X.500 string to be parsed.

        X509NameTokenizer   nTok = new X509NameTokenizer(dirName);

        while (nTok.hasMoreTokens())
        {
            String  token = nTok.nextToken();
            int     index = token.indexOf('=");

            if (index == -1)
            {
                throw new IllegalArgumentException("badly formated directory string");
            }

            String              name = token.substring(0, index);
            String              value = token.substring(index + 1);
            DERObjectIdentifier oid = null;

            if (name.toUpperCase().startsWith("OID."))
            {
                oid = new DERObjectIdentifier(name.substring(4));
            }
            else if (name.charAt(0) >= '0" && name.charAt(0) <= '9")
            {
                oid = new DERObjectIdentifier(name);
            }
            else
            {
                oid = (DERObjectIdentifier)lookUp.get(name.toLowerCase());
                if (oid == null)
                {
                    throw new IllegalArgumentException("Unknown object id - " + name + " - passed to distinguished name");
                }
            }

            this.ordering.addElement(oid);
            this.values.addElement(value);
            this.added.addElement(Boolean.FALSE);
        }

        if (reverse)
        {
            Vector  o = new Vector();
            Vector  v = new Vector();

            for (int i = this.ordering.size() - 1; i >= 0; i--)
            {
                o.addElement(this.ordering.elementAt(i));
                v.addElement(this.values.elementAt(i));
				this.added.addElement(Boolean.FALSE);
            }

            this.ordering = o;
            this.values = v;
        }
    
Methods Summary
private voidappendValue(java.lang.StringBuffer buf, java.util.Hashtable oidSymbols, DERObjectIdentifier oid, java.lang.String value)

        String  sym = (String)oidSymbols.get(oid);

        if (sym != null)
        {
            buf.append(sym);
        }
        else
        {
            buf.append(oid.getId());
        }

        buf.append("=");

        int     index = buf.length();

        buf.append(value);

        int     end = buf.length();

        while (index != end)
        {
            if ((buf.charAt(index) == ',")
               || (buf.charAt(index) == '"")
               || (buf.charAt(index) == '\\")
               || (buf.charAt(index) == '+")
               || (buf.charAt(index) == '<")
               || (buf.charAt(index) == '>")
               || (buf.charAt(index) == ';"))
            {
                buf.insert(index, "\\");
                index++;
                end++;
            }

            index++;
        }
    
private booleancanBePrintable(java.lang.String str)
return false if we have characters out of the range of a printable string, true otherwise.

        for (int i = str.length() - 1; i >= 0; i--)
        {
            if (str.charAt(i) > 0x007f)
            {
                return false;
            }
        }

        return true;
    
public booleanequals(java.lang.Object _obj, boolean inOrder)

param
inOrder if true the order of both X509 names must be the same, as well as the values associated with each element.

        if (_obj == this)
        {
            return true;
        }

        if (!inOrder)
        {
            return this.equals(_obj);
        }

        if (_obj == null || !(_obj instanceof X509Name))
        {
            return false;
        }
        
        X509Name _oxn          = (X509Name)_obj;
        int      _orderingSize = ordering.size();

        if (_orderingSize != _oxn.ordering.size()) 
        {
			return false;
		}
		
		for(int i = 0; i < _orderingSize; i++) 
		{
			String  _oid   = ((DERObjectIdentifier)ordering.elementAt(i)).getId();
			String  _val   = (String)values.elementAt(i);
			
            String _oOID = ((DERObjectIdentifier)_oxn.ordering.elementAt(i)).getId();
            String _oVal = (String)_oxn.values.elementAt(i);

            if (_oid.equals(_oOID))
            {
                _val = _val.trim().toLowerCase();
                _oVal = _oVal.trim().toLowerCase();
                if (_val.equals(_oVal))
                {
                    continue;
                }
                else
                {
                    StringBuffer    v1 = new StringBuffer();
                    StringBuffer    v2 = new StringBuffer();

                    if (_val.length() != 0)
                    {
                        char    c1 = _val.charAt(0);

                        v1.append(c1);

                        for (int k = 1; k < _val.length(); k++)
                        {
                            char    c2 = _val.charAt(k);
                            if (!(c1 == ' " && c2 == ' "))
                            {
                                v1.append(c2);
                            }
                            c1 = c2;
                        }
                    }

                    if (_oVal.length() != 0)
                    {
                        char    c1 = _oVal.charAt(0);

                        v2.append(c1);

                        for (int k = 1; k < _oVal.length(); k++)
                        {
                            char    c2 = _oVal.charAt(k);
                            if (!(c1 == ' " && c2 == ' "))
                            {
                                v2.append(c2);
                            }
                            c1 = c2;
                        }
                    }

                    if (!v1.toString().equals(v2.toString()))
                    {
                        return false;
                    }
                }
            }
        }

		return true;
	
public booleanequals(java.lang.Object _obj)
test for equality - note: case is ignored.

        if (_obj == this)
        {
            return true;
        }

        if (_obj == null || !(_obj instanceof X509Name))
        {
            return false;
        }
        
        X509Name _oxn          = (X509Name)_obj;
        
        if (this.getDERObject().equals(_oxn.getDERObject()))
        {
        	return true;
        }
        
        int      _orderingSize = ordering.size();

        if (_orderingSize != _oxn.ordering.size()) 
        {
			return false;
		}
		
		boolean[] _indexes = new boolean[_orderingSize];

		for(int i = 0; i < _orderingSize; i++) 
		{
			boolean _found = false;
			String  _oid   = ((DERObjectIdentifier)ordering.elementAt(i)).getId();
			String  _val   = (String)values.elementAt(i);
			
			for(int j = 0; j < _orderingSize; j++) 
			{
				if(_indexes[j] == true)
				{
					continue;
				}
				
				String _oOID = ((DERObjectIdentifier)_oxn.ordering.elementAt(j)).getId();
				String _oVal = (String)_oxn.values.elementAt(j);

				if (_oid.equals(_oOID))
                {
                    _val = _val.trim().toLowerCase();
                    _oVal = _oVal.trim().toLowerCase();
                    if (_val.equals(_oVal))
                    {
                        _indexes[j] = true;
                        _found      = true;
                        break;
                    }
                    else
                    {
                        StringBuffer    v1 = new StringBuffer();
                        StringBuffer    v2 = new StringBuffer();

                        if (_val.length() != 0)
                        {
                            char    c1 = _val.charAt(0);

                            v1.append(c1);

                            for (int k = 1; k < _val.length(); k++)
                            {
                                char    c2 = _val.charAt(k);
                                if (!(c1 == ' " && c2 == ' "))
                                {
                                    v1.append(c2);
                                }
                                c1 = c2;
                            }
                        }

                        if (_oVal.length() != 0)
                        {
                            char    c1 = _oVal.charAt(0);

                            v2.append(c1);

                            for (int k = 1; k < _oVal.length(); k++)
                            {
                                char    c2 = _oVal.charAt(k);
                                if (!(c1 == ' " && c2 == ' "))
                                {
                                    v2.append(c2);
                                }
                                c1 = c2;
                            }
                        }

                        if (v1.toString().equals(v2.toString()))
                        {
                            _indexes[j] = true;
                            _found      = true;
                            break;
                        }
                    }
                }
			}

			if(!_found)
			{
				return false;
			}
		}
		
		return true;
	
public DERObjectgetDERObject()

        if (seq == null)
        {
            ASN1EncodableVector  vec = new ASN1EncodableVector();

            for (int i = 0; i != ordering.size(); i++)
            {
                ASN1EncodableVector     v = new ASN1EncodableVector();
                DERObjectIdentifier     oid = (DERObjectIdentifier)ordering.elementAt(i);

                v.add(oid);

                String  str = (String)values.elementAt(i);

                if (oid.equals(EmailAddress))
                {
                    v.add(new DERIA5String(str));
                }
                else
                {
                    if (canBePrintable(str))
                    {
                        v.add(new DERPrintableString(str));
                    }
                    else
                    {
                        v.add(new DERUTF8String(str));
                    }
                }

                vec.add(new DERSet(new DERSequence(v)));
            }

            seq = new DERSequence(vec);
        }

        return seq;
    
public static org.bouncycastle.asn1.x509.X509NamegetInstance(ASN1TaggedObject obj, boolean explicit)


       
         
                  
    
        return getInstance(ASN1Sequence.getInstance(obj, explicit));
    
public static org.bouncycastle.asn1.x509.X509NamegetInstance(java.lang.Object obj)

        if (obj == null || obj instanceof X509Name)
        {
            return (X509Name)obj;
        }
        else if (obj instanceof ASN1Sequence)
        {
            return new X509Name((ASN1Sequence)obj);
        }

        throw new IllegalArgumentException("unknown object in factory");
    
public java.util.VectorgetOIDs()
return a vector of the oids in the name, in the order they were found.

        Vector  v = new Vector();

        for (int i = 0; i != ordering.size(); i++)
        {
            v.addElement(ordering.elementAt(i));
        }

        return v;
    
public java.util.VectorgetValues()
return a vector of the values found in the name, in the order they were found.

        Vector  v = new Vector();

        for (int i = 0; i != values.size(); i++)
        {
            v.addElement(values.elementAt(i));
        }

        return v;
    
public inthashCode()

        ASN1Sequence  seq = (ASN1Sequence)this.getDERObject();
        Enumeration   e = seq.getObjects();
        int           hashCode = 0;

        while (e.hasMoreElements())
        {
            hashCode ^= e.nextElement().hashCode();
        }

        return hashCode;
    
public java.lang.StringtoString(boolean reverse, java.util.Hashtable oidSymbols)
convert the structure to a string - if reverse is true the oids and values are listed out starting with the last element in the sequence (ala RFC 2253), otherwise the string will begin with the first element of the structure. If no string definition for the oid is found in oidSymbols the string value of the oid is added. Two standard symbol tables are provided DefaultSymbols, and RFC2253Symbols as part of this class.

param
reverse if true start at the end of the sequence and work back.
param
oidSymbols look up table strings for oids.

        StringBuffer            buf = new StringBuffer();
        boolean                 first = true;

        if (reverse)
        {
            for (int i = ordering.size() - 1; i >= 0; i--)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
					if (((Boolean)added.elementAt(i + 1)).booleanValue())
					{
						buf.append(" + ");
					}
					else
					{
						buf.append(",");
					}
                }

                appendValue(buf, oidSymbols, 
                            (DERObjectIdentifier)ordering.elementAt(i),
                            (String)values.elementAt(i));
            }
        }
        else
        {
            for (int i = 0; i < ordering.size(); i++)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                	if (((Boolean)added.elementAt(i)).booleanValue())
                	{
                		buf.append(" + ");
                	}
                	else
                	{
						buf.append(",");
                	}
                }

                appendValue(buf, oidSymbols, 
                            (DERObjectIdentifier)ordering.elementAt(i),
                            (String)values.elementAt(i));
            }
        }

        return buf.toString();
    
public java.lang.StringtoString()

        return toString(DefaultReverse, DefaultSymbols);