X509Namepublic class X509Name extends Object implements DEREncodable
Fields Summary |
---|
public static final DERObjectIdentifier | Ccountry code - StringType(SIZE(2)) | public static final DERObjectIdentifier | Oorganization - StringType(SIZE(1..64)) | public static final DERObjectIdentifier | OUorganizational unit name - StringType(SIZE(1..64)) | public static final DERObjectIdentifier | TTitle | public static final DERObjectIdentifier | CNcommon name - StringType(SIZE(1..64)) | public static final DERObjectIdentifier | SNdevice serial number name - StringType(SIZE(1..64)) | public static final DERObjectIdentifier | Llocality name - StringType(SIZE(1..64)) | public static final DERObjectIdentifier | STstate, or province name - StringType(SIZE(1..64)) | public static final DERObjectIdentifier | SURNAMENaming attributes of type X520name | public static final DERObjectIdentifier | GIVENNAME | public static final DERObjectIdentifier | INITIALS | public static final DERObjectIdentifier | GENERATION | public static final DERObjectIdentifier | EmailAddressEmail 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 | Eemail address in Verisign certificates | public static final DERObjectIdentifier | DC | public static final DERObjectIdentifier | UIDLDAP User id. | public static Hashtable | OIDLookUplook up table translating OID values into their common symbols - this static is scheduled for deletion | public static boolean | DefaultReversedetermines whether or not strings should be processed and printed
from back to front. | public static Hashtable | DefaultSymbolsdefault look up table translating OID values into their common symbols following
the convention in RFC 2253 with a few extras | public static Hashtable | RFC2253Symbolslook up table translating OID values into their common symbols following the convention in RFC 2253
with a few extras | public static Hashtable | SymbolLookUplook up table translating string values into their OIDS -
this static is scheduled for deletion | public static Hashtable | DefaultLookUplook 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.
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 void | appendValue(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 boolean | canBePrintable(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 boolean | equals(java.lang.Object _obj, boolean inOrder)
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 boolean | equals(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 DERObject | getDERObject()
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.X509Name | getInstance(ASN1TaggedObject obj, boolean explicit)
return getInstance(ASN1Sequence.getInstance(obj, explicit));
| public static org.bouncycastle.asn1.x509.X509Name | getInstance(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.Vector | getOIDs()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.Vector | getValues()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 int | hashCode()
ASN1Sequence seq = (ASN1Sequence)this.getDERObject();
Enumeration e = seq.getObjects();
int hashCode = 0;
while (e.hasMoreElements())
{
hashCode ^= e.nextElement().hashCode();
}
return hashCode;
| public java.lang.String | toString(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.
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.String | toString()
return toString(DefaultReverse, DefaultSymbols);
|
|