diff options
Diffstat (limited to 'core/src/test/java/org/spongycastle/asn1/test/X500NameTest.java')
-rw-r--r-- | core/src/test/java/org/spongycastle/asn1/test/X500NameTest.java | 771 |
1 files changed, 771 insertions, 0 deletions
diff --git a/core/src/test/java/org/spongycastle/asn1/test/X500NameTest.java b/core/src/test/java/org/spongycastle/asn1/test/X500NameTest.java new file mode 100644 index 00000000..09a597d3 --- /dev/null +++ b/core/src/test/java/org/spongycastle/asn1/test/X500NameTest.java @@ -0,0 +1,771 @@ +package org.spongycastle.asn1.test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import org.spongycastle.asn1.ASN1Encodable; +import org.spongycastle.asn1.ASN1EncodableVector; +import org.spongycastle.asn1.ASN1GeneralizedTime; +import org.spongycastle.asn1.ASN1InputStream; +import org.spongycastle.asn1.ASN1ObjectIdentifier; +import org.spongycastle.asn1.ASN1OutputStream; +import org.spongycastle.asn1.ASN1Primitive; +import org.spongycastle.asn1.ASN1Sequence; +import org.spongycastle.asn1.ASN1Set; +import org.spongycastle.asn1.ASN1String; +import org.spongycastle.asn1.ASN1TaggedObject; +import org.spongycastle.asn1.DERIA5String; +import org.spongycastle.asn1.DERPrintableString; +import org.spongycastle.asn1.DERSequence; +import org.spongycastle.asn1.DERSet; +import org.spongycastle.asn1.DERTaggedObject; +import org.spongycastle.asn1.DERUTF8String; +import org.spongycastle.asn1.x500.RDN; +import org.spongycastle.asn1.x500.X500Name; +import org.spongycastle.asn1.x500.X500NameBuilder; +import org.spongycastle.asn1.x500.style.BCStrictStyle; +import org.spongycastle.asn1.x500.style.BCStyle; +import org.spongycastle.asn1.x500.style.IETFUtils; +import org.spongycastle.asn1.x509.X509DefaultEntryConverter; +import org.spongycastle.util.encoders.Hex; +import org.spongycastle.util.test.SimpleTest; + +public class X500NameTest + extends SimpleTest +{ + String[] subjects = + { + "C=AU,ST=Victoria,L=South Melbourne,O=Connect 4 Pty Ltd,OU=Webserver Team,CN=www2.connect4.com.au,E=webmaster@connect4.com.au", + "C=AU,ST=Victoria,L=South Melbourne,O=Connect 4 Pty Ltd,OU=Certificate Authority,CN=Connect 4 CA,E=webmaster@connect4.com.au", + "C=AU,ST=QLD,CN=SSLeay/rsa test cert", + "C=US,O=National Aeronautics and Space Administration,SERIALNUMBER=16+CN=Steve Schoch", + "E=cooke@issl.atl.hp.com,C=US,OU=Hewlett Packard Company (ISSL),CN=Paul A. Cooke", + "O=Sun Microsystems Inc,CN=store.sun.com", + "unstructuredAddress=192.168.1.33,unstructuredName=pixfirewall.ciscopix.com,CN=pixfirewall.ciscopix.com", + "CN=*.canal-plus.com,OU=Provided by TBS INTERNET http://www.tbs-certificats.com/,OU=\\ CANAL \\+,O=CANAL\\+DISTRIBUTION,L=issy les moulineaux,ST=Hauts de Seine,C=FR", + "O=Bouncy Castle,CN=www.bouncycastle.org\\ ", + "O=Bouncy Castle,CN=c:\\\\fred\\\\bob", + }; + + String[] hexSubjects = + { + "CN=\\20Test\\20X,O=\\20Test,C=GB", // input + "CN=\\ Test X,O=\\ Test,C=GB", // expected + "CN=\\20Test\\20X\\20,O=\\20Test,C=GB", // input + "CN=\\ Test X\\ ,O=\\ Test,C=GB" // expected + }; + + public String getName() + { + return "X500Name"; + } + + private static X500Name fromBytes( + byte[] bytes) + throws IOException + { + return X500Name.getInstance(new ASN1InputStream(new ByteArrayInputStream(bytes)).readObject()); + } + + private ASN1Encodable createEntryValue(ASN1ObjectIdentifier oid, String value) + { + X500NameBuilder builder = new X500NameBuilder(BCStyle.INSTANCE); + + builder.addRDN(oid, value); + + X500Name name = builder.build(); + + ASN1Sequence seq = (ASN1Sequence)name.toASN1Primitive(); + ASN1Set set = ASN1Set.getInstance(seq.getObjectAt(0).toASN1Primitive()); + seq = (ASN1Sequence)set.getObjectAt(0); + + return seq.getObjectAt(1); + } + + private ASN1Encodable createEntryValueFromString(ASN1ObjectIdentifier oid, String value) + { + X500NameBuilder builder = new X500NameBuilder(BCStyle.INSTANCE); + + builder.addRDN(oid, value); + + X500Name name = new X500Name(builder.build().toString()); + + ASN1Sequence seq = (ASN1Sequence)name.toASN1Primitive(); + ASN1Set set = ASN1Set.getInstance(seq.getObjectAt(0).toASN1Primitive()); + seq = (ASN1Sequence)set.getObjectAt(0); + + return seq.getObjectAt(1); + } + + private void testEncodingPrintableString(ASN1ObjectIdentifier oid, String value) + { + ASN1Encodable converted = createEntryValue(oid, value); + if (!(converted instanceof DERPrintableString)) + { + fail("encoding for " + oid + " not printable string"); + } + } + + private void testEncodingIA5String(ASN1ObjectIdentifier oid, String value) + { + ASN1Encodable converted = createEntryValue(oid, value); + if (!(converted instanceof DERIA5String)) + { + fail("encoding for " + oid + " not IA5String"); + } + } + + private void testEncodingUTF8String(ASN1ObjectIdentifier oid, String value) + throws IOException + { + ASN1Encodable converted = createEntryValue(oid, value); + if (!(converted instanceof DERUTF8String)) + { + fail("encoding for " + oid + " not IA5String"); + } + if (!value.equals((DERUTF8String.getInstance(converted.toASN1Primitive().getEncoded()).getString()))) + { + fail("decoding not correct"); + } + } + + private void testEncodingGeneralizedTime(ASN1ObjectIdentifier oid, String value) + { + ASN1Encodable converted = createEntryValue(oid, value); + if (!(converted instanceof ASN1GeneralizedTime)) + { + fail("encoding for " + oid + " not GeneralizedTime"); + } + converted = createEntryValueFromString(oid, value); + if (!(converted instanceof ASN1GeneralizedTime)) + { + fail("encoding for " + oid + " not GeneralizedTime"); + } + } + + public void performTest() + throws Exception + { + ietfUtilsTest(); + + testEncodingPrintableString(BCStyle.C, "AU"); + testEncodingPrintableString(BCStyle.SERIALNUMBER, "123456"); + testEncodingPrintableString(BCStyle.DN_QUALIFIER, "123456"); + testEncodingIA5String(BCStyle.EmailAddress, "test@test.com"); + testEncodingIA5String(BCStyle.DC, "test"); + // correct encoding + testEncodingGeneralizedTime(BCStyle.DATE_OF_BIRTH, "#180F32303032303132323132323232305A"); + // compatibility encoding + testEncodingGeneralizedTime(BCStyle.DATE_OF_BIRTH, "20020122122220Z"); + testEncodingUTF8String(BCStyle.CN, "Mörsky"); + + // + // composite + // + X500NameBuilder builder = new X500NameBuilder(BCStyle.INSTANCE); + + builder.addRDN(BCStyle.C, "AU"); + builder.addRDN(BCStyle.O, "The Legion of the Bouncy Castle"); + builder.addRDN(BCStyle.L, "Melbourne"); + builder.addRDN(BCStyle.ST, "Victoria"); + builder.addRDN(BCStyle.E, "feedback-crypto@bouncycastle.org"); + + X500Name name1 = builder.build(); + + if (!name1.equals(name1)) + { + fail("Failed same object test"); + } + +// if (!name1.equals(name1, true)) +// { +// fail("Failed same object test - in Order"); +// } + + builder = new X500NameBuilder(BCStyle.INSTANCE); + + builder.addRDN(BCStyle.C, "AU"); + builder.addRDN(BCStyle.O, "The Legion of the Bouncy Castle"); + builder.addRDN(BCStyle.L, "Melbourne"); + builder.addRDN(BCStyle.ST, "Victoria"); + builder.addRDN(BCStyle.E, "feedback-crypto@bouncycastle.org"); + + X500Name name2 = builder.build(); + + if (!name1.equals(name2)) + { + fail("Failed same name test"); + } + +// if (!name1.equals(name2, true)) +// { +// fail("Failed same name test - in Order"); +// } + + if (name1.hashCode() != name2.hashCode()) + { + fail("Failed same name test - in Order"); + } + + X500NameBuilder builder1 = new X500NameBuilder(BCStyle.INSTANCE); + + builder.addRDN(BCStyle.C, "AU"); + builder.addRDN(BCStyle.O, "The Legion of the Bouncy Castle"); + builder.addRDN(BCStyle.L, "Melbourne"); + builder.addRDN(BCStyle.ST, "Victoria"); + builder.addRDN(BCStyle.E, "feedback-crypto@bouncycastle.org"); + + X500NameBuilder builder2 = new X500NameBuilder(BCStyle.INSTANCE); + + builder.addRDN(BCStyle.E, "feedback-crypto@bouncycastle.org"); + builder.addRDN(BCStyle.C, "AU"); + builder.addRDN(BCStyle.O, "The Legion of the Bouncy Castle"); + builder.addRDN(BCStyle.L, "Melbourne"); + builder.addRDN(BCStyle.ST, "Victoria"); + + name1 = builder1.build(); + name2 = builder2.build(); + + if (!name1.equals(name2)) + { + fail("Failed reverse name test"); + } + + if (name1.hashCode() != name2.hashCode()) + { + fail("Failed reverse name test hashCode"); + } + +// if (name1.equals(name2, true)) +// { +// fail("Failed reverse name test - in Order"); +// } +// +// if (!name1.equals(name2, false)) +// { +// fail("Failed reverse name test - in Order false"); +// } + +// Vector oids = name1.getOIDs(); +// if (!compareVectors(oids, ord1)) +// { +// fail("oid comparison test"); +// } + /* + Vector val1 = new Vector(); + + val1.addElement("AU"); + val1.addElement("The Legion of the Bouncy Castle"); + val1.addElement("Melbourne"); + val1.addElement("Victoria"); + val1.addElement("feedback-crypto@bouncycastle.org"); + + name1 = new X500Name(ord1, val1); + + Vector values = name1.getValues(); + if (!compareVectors(values, val1)) + { + fail("value comparison test"); + } + + ord2 = new Vector(); + + ord2.addElement(X500Name.ST); + ord2.addElement(X500Name.ST); + ord2.addElement(X500Name.L); + ord2.addElement(X500Name.O); + ord2.addElement(X500Name.C); + + name1 = new X500Name(ord1, attrs); + name2 = new X500Name(ord2, attrs); + + if (name1.equals(name2)) + { + fail("Failed different name test"); + } + + ord2 = new Vector(); + + ord2.addElement(X500Name.ST); + ord2.addElement(X500Name.L); + ord2.addElement(X500Name.O); + ord2.addElement(X500Name.C); + + name1 = new X500Name(ord1, attrs); + name2 = new X500Name(ord2, attrs); + + if (name1.equals(name2)) + { + fail("Failed subset name test"); + } + + compositeTest(); + */ + ByteArrayOutputStream bOut; + ASN1OutputStream aOut; + ASN1InputStream aIn; + /* + // + // getValues test + // + Vector v1 = name1.getValues(X500Name.O); + + if (v1.size() != 1 || !v1.elementAt(0).equals("The Legion of the Bouncy Castle")) + { + fail("O test failed"); + } + + Vector v2 = name1.getValues(X500Name.L); + + if (v2.size() != 1 || !v2.elementAt(0).equals("Melbourne")) + { + fail("L test failed"); + } + */ + // + // general subjects test + // + for (int i = 0; i != subjects.length; i++) + { + X500Name name = new X500Name(subjects[i]); + + bOut = new ByteArrayOutputStream(); + aOut = new ASN1OutputStream(bOut); + + aOut.writeObject(name); + + aIn = new ASN1InputStream(new ByteArrayInputStream(bOut.toByteArray())); + + name = X500Name.getInstance(aIn.readObject()); + if (!name.toString().equals(subjects[i])) + { + fail("failed regeneration test " + i + " got: " + name.toString() + " expected " + subjects[i]); + } + } + + for (int i = 0; i < hexSubjects.length; i += 2) + { + X500Name name = new X500Name(hexSubjects[i]); + + bOut = new ByteArrayOutputStream(); + aOut = new ASN1OutputStream(bOut); + + aOut.writeObject(name); + + aIn = new ASN1InputStream(new ByteArrayInputStream(bOut.toByteArray())); + + name = X500Name.getInstance(aIn.readObject()); + if (!name.toString().equals(hexSubjects[i + 1])) + { + fail("failed hex regeneration test " + i + " got: " + name.toString() + " expected " + subjects[i]); + } + } + + // + // sort test + // + X500Name unsorted = new X500Name("SERIALNUMBER=BBB + CN=AA"); + + if (!fromBytes(unsorted.getEncoded()).toString().equals("CN=AA+SERIALNUMBER=BBB")) + { + fail("failed sort test 1"); + } + + unsorted = new X500Name("CN=AA + SERIALNUMBER=BBB"); + + if (!fromBytes(unsorted.getEncoded()).toString().equals("CN=AA+SERIALNUMBER=BBB")) + { + fail("failed sort test 2"); + } + + unsorted = new X500Name("SERIALNUMBER=B + CN=AA"); + + if (!fromBytes(unsorted.getEncoded()).toString().equals("SERIALNUMBER=B+CN=AA")) + { + fail("failed sort test 3"); + } + + unsorted = new X500Name("CN=AA + SERIALNUMBER=B"); + + if (!fromBytes(unsorted.getEncoded()).toString().equals("SERIALNUMBER=B+CN=AA")) + { + fail("failed sort test 4"); + } + + // + // equality tests + // + equalityTest(new X500Name("CN=The Legion"), new X500Name("CN=The Legion")); + equalityTest(new X500Name("CN= The Legion"), new X500Name("CN=The Legion")); + equalityTest(new X500Name("CN=The Legion "), new X500Name("CN=The Legion")); + equalityTest(new X500Name("CN= The Legion "), new X500Name("CN=The Legion")); + equalityTest(new X500Name("CN= the legion "), new X500Name("CN=The Legion")); + + equalityTest(new X500Name("CN= the legion+C=AU, O=Legion "), new X500Name("CN=The Legion+C=AU, O=Legion")); + // # test + + X500Name n1 = new X500Name("SERIALNUMBER=8,O=ABC,CN=ABC Class 3 CA,C=LT"); + X500Name n2 = new X500Name("2.5.4.5=8,O=ABC,CN=ABC Class 3 CA,C=LT"); + X500Name n3 = new X500Name("2.5.4.5=#130138,O=ABC,CN=ABC Class 3 CA,C=LT"); + + equalityTest(n1, n2); + equalityTest(n2, n3); + equalityTest(n3, n1); + + n1 = new X500Name("2.5.4.5=#130138,CN=SSC Class 3 CA,O=UAB Skaitmeninio sertifikavimo centras,C=LT"); + n2 = new X500Name("SERIALNUMBER=#130138,CN=SSC Class 3 CA,O=UAB Skaitmeninio sertifikavimo centras,C=LT"); + n3 = X500Name.getInstance(ASN1Primitive.fromByteArray(Hex.decode("3063310b3009060355040613024c54312f302d060355040a1326" + + "55414220536b6169746d656e696e696f20736572746966696b6176696d6f2063656e74726173311730150603550403130e53534320436c6173732033204341310a30080603550405130138"))); + + equalityTest(n1, n2); + equalityTest(n2, n3); + equalityTest(n3, n1); + + n1 = new X500Name("SERIALNUMBER=8,O=XX,CN=ABC Class 3 CA,C=LT"); + n2 = new X500Name("2.5.4.5=8,O=,CN=ABC Class 3 CA,C=LT"); + +// if (n1.equals(n2)) +// { +// fail("empty inequality check failed"); +// } + + n1 = new X500Name("SERIALNUMBER=8,O=,CN=ABC Class 3 CA,C=LT"); + n2 = new X500Name("2.5.4.5=8,O=,CN=ABC Class 3 CA,C=LT"); + + equalityTest(n1, n2); + + equalityTest(X500Name.getInstance(BCStrictStyle.INSTANCE, n1), X500Name.getInstance(BCStrictStyle.INSTANCE, n2)); + + n2 = new X500Name("C=LT,2.5.4.5=8,O=,CN=ABC Class 3 CA"); + + equalityTest(n1, n2); + + if (X500Name.getInstance(BCStrictStyle.INSTANCE, n1).equals(X500Name.getInstance(BCStrictStyle.INSTANCE, n2))) + { + fail("strict comparison failed"); + } + + // + // inequality to sequences + // + name1 = new X500Name("CN=The Legion"); + + if (name1.equals(new DERSequence())) + { + fail("inequality test with sequence"); + } + + if (name1.equals(new DERSequence(new DERSet()))) + { + fail("inequality test with sequence and set"); + } + + ASN1EncodableVector v = new ASN1EncodableVector(); + + v.add(new ASN1ObjectIdentifier("1.1")); + v.add(new ASN1ObjectIdentifier("1.1")); + if (name1.equals(new DERSequence(new DERSet(new DERSet(v))))) + { + fail("inequality test with sequence and bad set"); + } + + if (name1.equals(new DERSequence(new DERSet(new DERSet(v))))) + { + fail("inequality test with sequence and bad set"); + } + + if (name1.equals(new DERSequence(new DERSet(new DERSequence())))) + { + fail("inequality test with sequence and short sequence"); + } + + if (name1.equals(new DERSequence(new DERSet(new DERSequence())))) + { + fail("inequality test with sequence and short sequence"); + } + + v = new ASN1EncodableVector(); + + v.add(new ASN1ObjectIdentifier("1.1")); + v.add(new DERSequence()); + + if (name1.equals(new DERSequence(new DERSet(new DERSequence(v))))) + { + fail("inequality test with sequence and bad sequence"); + } + + if (name1.equals(null)) + { + fail("inequality test with null"); + } + +// if (name1.equals(null, true)) +// { +// fail("inequality test with null"); +// } + + // + // this is contrived but it checks sorting of sets with equal elements + // + unsorted = new X500Name("CN=AA + CN=AA + CN=AA"); + + ASN1ObjectIdentifier[] types = unsorted.getAttributeTypes(); + if (types.length != 3 || !types[0].equals(BCStyle.CN) || !types[1].equals(BCStyle.CN) || !types[2].equals(BCStyle.CN)) + { + fail("types not matched correctly"); + } + + // general type test + X500Name nested = new X500Name("CN=AA + CN=AA, C=AU"); + + types = nested.getAttributeTypes(); + if (types.length != 3 || !types[0].equals(BCStyle.CN) || !types[1].equals(BCStyle.CN) || !types[2].equals(BCStyle.C)) + { + fail("nested types not matched correctly"); + } + // + // tagging test - only works if CHOICE implemented + // + ASN1TaggedObject tag = new DERTaggedObject(false, 1, new X500Name("CN=AA")); + + if (!tag.isExplicit()) + { + fail("failed to explicitly tag CHOICE object"); + } + + X500Name name = X500Name.getInstance(tag, false); + + if (!name.equals(new X500Name("CN=AA"))) + { + fail("failed to recover tagged name"); + } + + DERUTF8String testString = new DERUTF8String("The Legion of the Bouncy Castle"); + byte[] encodedBytes = testString.getEncoded(); + byte[] hexEncodedBytes = Hex.encode(encodedBytes); + String hexEncodedString = "#" + new String(hexEncodedBytes); + + DERUTF8String converted = (DERUTF8String) + new X509DefaultEntryConverter().getConvertedValue( + BCStyle.L , hexEncodedString); + + if (!converted.equals(testString)) + { + fail("failed X509DefaultEntryConverter test"); + } + + // + // try escaped. + // + converted = (DERUTF8String) + new X509DefaultEntryConverter().getConvertedValue( + BCStyle.L , "\\" + hexEncodedString); + + if (!converted.equals(new DERUTF8String(hexEncodedString))) + { + fail("failed X509DefaultEntryConverter test got " + converted + " expected: " + hexEncodedString); + } + + // + // try a weird value + // + X500Name n = new X500Name("CN=\\#nothex#string"); + + if (!n.toString().equals("CN=\\#nothex#string")) + { + fail("# string not properly escaped."); + } + + RDN[] vls = n.getRDNs(BCStyle.CN); + if (vls.length != 1 || !getValue(vls[0]).equals("#nothex#string")) + { + fail("escaped # not reduced properly"); + } + + types = n.getAttributeTypes(); + if (types.length != 1 || !types[0].equals(BCStyle.CN)) + { + fail("type not matched correctly"); + } + + n = new X500Name("CN=\"a+b\""); + + vls = n.getRDNs(BCStyle.CN); + if (vls.length != 1 || !getValue(vls[0]).equals("a+b")) + { + fail("escaped + not reduced properly"); + } + + n = new X500Name("CN=a\\+b"); + + vls = n.getRDNs(BCStyle.CN); + if (vls.length != 1 || !getValue(vls[0]).equals("a+b")) + { + fail("escaped + not reduced properly"); + } + + if (!n.toString().equals("CN=a\\+b")) + { + fail("+ in string not properly escaped."); + } + + n = new X500Name("CN=a\\=b"); + + vls = n.getRDNs(BCStyle.CN); + if (vls.length != 1 || !getValue(vls[0]).equals("a=b")) + { + fail("escaped = not reduced properly"); + } + + if (!n.toString().equals("CN=a\\=b")) + { + fail("= in string not properly escaped."); + } + + n = new X500Name("TELEPHONENUMBER=\"+61999999999\""); + + vls = n.getRDNs(BCStyle.TELEPHONE_NUMBER); + if (vls.length != 1 || !getValue(vls[0]).equals("+61999999999")) + { + fail("telephonenumber escaped + not reduced properly"); + } + + n = new X500Name("TELEPHONENUMBER=\\+61999999999"); + + vls = n.getRDNs(BCStyle.TELEPHONE_NUMBER); + if (vls.length != 1 || !getValue(vls[0]).equals("+61999999999")) + { + fail("telephonenumber escaped + not reduced properly"); + } + + // test query methods + if (!"E".equals(BCStyle.INSTANCE.oidToDisplayName(BCStyle.EmailAddress))) + { + fail("display name for E incorrect"); + } + + String[] aliases = BCStyle.INSTANCE.oidToAttrNames(BCStyle.EmailAddress); + if (aliases.length != 2) + { + fail("no aliases found"); + } + if (!("e".equals(aliases[0]) || "e".equals(aliases[1]))) + { + fail("first alias name for E incorrect"); + } + if (!("emailaddress".equals(aliases[0]) || "emailaddress".equals(aliases[1]))) + { + fail("second alias name for E incorrect"); + } + + if (BCStyle.INSTANCE.oidToDisplayName(new ASN1ObjectIdentifier("1.2.1")) != null) + { + fail("unknown oid matched!"); + } + + if (BCStyle.INSTANCE.oidToAttrNames(new ASN1ObjectIdentifier("1.2.1")).length != 0) + { + fail("unknown oid matched aliases!"); + } + } + + private String getValue(RDN vl) + { + return ((ASN1String)vl.getFirst().getValue()).getString(); + } + + private void ietfUtilsTest() + throws Exception + { + IETFUtils.valueToString(new DERUTF8String(" ")); + } + + /* + private boolean compareVectors(Vector a, Vector b) // for compatibility with early JDKs + { + if (a.size() != b.size()) + { + return false; + } + + for (int i = 0; i != a.size(); i++) + { + if (!a.elementAt(i).equals(b.elementAt(i))) + { + return false; + } + } + + return true; + } + + private void compositeTest() + throws IOException + { + // + // composite test + // + byte[] enc = Hex.decode("305e310b300906035504061302415531283026060355040a0c1f546865204c6567696f6e206f662074686520426f756e637920436173746c653125301006035504070c094d656c626f75726e653011060355040b0c0a4173636f742056616c65"); + ASN1InputStream aIn = new ASN1InputStream(new ByteArrayInputStream(enc)); + + X500Name n = X500Name.getInstance(aIn.readObject()); + + if (!n.toString().equals("C=AU,O=The Legion of the Bouncy Castle,L=Melbourne+OU=Ascot Vale")) + { + fail("Failed composite to string test got: " + n.toString()); + } + + if (!n.toString(true, X500Name.DefaultSymbols).equals("L=Melbourne+OU=Ascot Vale,O=The Legion of the Bouncy Castle,C=AU")) + { + fail("Failed composite to string test got: " + n.toString(true, X500Name.DefaultSymbols)); + } + + n = new X500Name(true, "L=Melbourne+OU=Ascot Vale,O=The Legion of the Bouncy Castle,C=AU"); + if (!n.toString().equals("C=AU,O=The Legion of the Bouncy Castle,L=Melbourne+OU=Ascot Vale")) + { + fail("Failed composite to string reversal test got: " + n.toString()); + } + + n = new X500Name("C=AU, O=The Legion of the Bouncy Castle, L=Melbourne + OU=Ascot Vale"); + + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + ASN1OutputStream aOut = new ASN1OutputStream(bOut); + + aOut.writeObject(n); + + byte[] enc2 = bOut.toByteArray(); + + if (!Arrays.areEqual(enc, enc2)) + { + fail("Failed composite string to encoding test"); + } + + // + // dud name test - handle empty DN without barfing. + // + n = new X500Name("C=CH,O=,OU=dummy,CN=mail@dummy.com"); + + n = X500Name.getInstance(ASN1Object.fromByteArray(n.getEncoded())); + } + */ + private void equalityTest(X500Name name1, X500Name name2) + { + if (!name1.equals(name2)) + { + fail("equality test failed for " + name1 + " : " + name2); + } + + if (name1.hashCode() != name2.hashCode()) + { + fail("hashCodeTest test failed for " + name1 + " : " + name2); + } + } + + + public static void main( + String[] args) + { + runTest(new X500NameTest()); + } +} |