1 package org.bouncycastle.asn1.test; 2 3 import java.io.IOException; 4 5 import org.bouncycastle.asn1.ASN1EncodableVector; 6 import org.bouncycastle.asn1.ASN1InputStream; 7 import org.bouncycastle.asn1.ASN1Integer; 8 import org.bouncycastle.asn1.ASN1ObjectIdentifier; 9 import org.bouncycastle.asn1.ASN1Primitive; 10 import org.bouncycastle.asn1.ASN1TaggedObject; 11 import org.bouncycastle.asn1.DERIA5String; 12 import org.bouncycastle.asn1.DEROctetString; 13 import org.bouncycastle.asn1.DERPrintableString; 14 import org.bouncycastle.asn1.DERUTF8String; 15 import org.bouncycastle.asn1.DLApplicationSpecific; 16 import org.bouncycastle.asn1.DLExternal; 17 import org.bouncycastle.asn1.DLSequence; 18 import org.bouncycastle.asn1.DLSet; 19 import org.bouncycastle.asn1.DLTaggedObject; 20 import org.bouncycastle.util.test.SimpleTest; 21 22 /** 23 * Class checking the correct functionality of DLExternal 24 */ 25 public class DLExternalTest 26 extends SimpleTest 27 { 28 29 /** 30 * Checks that the values are correctly instantiated 31 * 32 * @throws Exception Will be thrown if there was an 33 * error while performing the test 34 */ testInstantiationByVector()35 public void testInstantiationByVector() 36 throws Exception 37 { 38 ASN1EncodableVector vec = new ASN1EncodableVector(); 39 String dvdType; 40 String ecType; 41 try 42 { 43 new DLExternal(vec); 44 fail("exception expected"); 45 } 46 catch (IllegalArgumentException iae) 47 { 48 isEquals("check message", "too few objects in input vector", iae.getMessage()); 49 } 50 51 vec.add(new DERUTF8String("something completely different")); 52 try 53 { 54 new DLExternal(vec); 55 fail("exception expected"); 56 } 57 catch (IllegalArgumentException iae) 58 { 59 isEquals("check message", "too few objects in input vector", iae.getMessage()); 60 } 61 vec.add(new DLTaggedObject(true, 1, new ASN1Integer(1234567890L))); 62 63 DLExternal dle = new DLExternal(vec); 64 65 isEquals("check direct reference", null, dle.getDirectReference()); 66 isEquals("check indirect reference", null, dle.getIndirectReference()); 67 isTrue("check data value descriptor", dle.getDataValueDescriptor() != null); 68 dvdType = dle.getDataValueDescriptor().getClass().getName(); 69 isEquals("check type of value descriptor: " + dvdType, DERUTF8String.class.getName(), dvdType); 70 isEquals("check value", "something completely different", ((DERUTF8String)dle.getDataValueDescriptor()).getString()); 71 isEquals("check encoding", 1, dle.getEncoding()); 72 isTrue("check existence of external content", dle.getExternalContent() != null); 73 ecType = dle.getExternalContent().getClass().getName(); 74 isEquals("check type of external content: " + ecType, ASN1Integer.class.getName(), ecType); 75 isEquals("check value of external content", "1234567890", ((ASN1Integer)dle.getExternalContent()).getValue().toString()); 76 77 vec = new ASN1EncodableVector(); 78 vec.add(new ASN1Integer(9L)); 79 vec.add(new DERUTF8String("something completely different")); 80 vec.add(new DLTaggedObject(true, 1, new ASN1Integer(1234567890L))); 81 dle = new DLExternal(vec); 82 83 isEquals("check direct reference", null, dle.getDirectReference()); 84 isTrue("check existence of indirect reference", dle.getIndirectReference() != null); 85 isEquals("check indirect reference", "9", dle.getIndirectReference().getValue().toString()); 86 isTrue("check existence of data value descriptor", dle.getDataValueDescriptor() != null); 87 dvdType = dle.getDataValueDescriptor().getClass().getName(); 88 isEquals("check type of value descriptor: " + dvdType, DERUTF8String.class.getName(), dvdType); 89 isEquals("check value", "something completely different", ((DERUTF8String)dle.getDataValueDescriptor()).getString()); 90 isEquals("check encoding", 1, dle.getEncoding()); 91 isTrue("check existence of external content", dle.getExternalContent() != null); 92 ecType = dle.getExternalContent().getClass().getName(); 93 isEquals("check type of external content: " + ecType, ASN1Integer.class.getName(), ecType); 94 isEquals("check value of external content", "1234567890", ((ASN1Integer)dle.getExternalContent()).getValue().toString()); 95 96 dle = new DLExternal(createRealDataExample()); 97 checkRealDataExample(dle); 98 } 99 100 /** 101 * Checks that a DLExternal is created from DER encoded bytes correctly. 102 * This is done by creating the DER encoded data by using <code>getEncoded</code> 103 * 104 * @throws Exception Will be thrown if there was an 105 * error while performing the test 106 */ testReadEncoded()107 public void testReadEncoded() 108 throws Exception 109 { 110 DLExternal dle = new DLExternal(createRealDataExample()); 111 112 ASN1InputStream ais = new ASN1InputStream(dle.getEncoded()); 113 ASN1Primitive ap = ais.readObject(); 114 isTrue("check ais returned an object", ap != null); 115 isEquals("check returned type: " + ap.getClass(), DLExternal.class.getName(), ap.getClass().getName()); 116 checkRealDataExample((DLExternal)ap); 117 ais.close(); 118 } 119 checkRealDataExample(DLExternal dle)120 private void checkRealDataExample(DLExternal dle) 121 throws IOException 122 { 123 //System.out.println(ASN1Dump.dumpAsString(dle, true)); 124 isEquals("check direct reference", "2.1.1", String.valueOf(dle.getDirectReference())); 125 isEquals("check indirect reference", "9", String.valueOf(dle.getIndirectReference())); 126 isEquals("check data value decriptor", "example data representing the User Data of an OSI.6 ConnectP containing an MSBind with username and password", String.valueOf(dle.getDataValueDescriptor())); 127 isEquals("check encoding", 2, dle.getEncoding()); 128 129 ASN1Primitive content = dle.getExternalContent(); 130 isTrue("check existence of content", content != null); 131 isTrue("check type is a tagged object: " + content.getClass(), content instanceof ASN1TaggedObject); 132 133 ASN1TaggedObject msBind = (ASN1TaggedObject)content; 134 isEquals("check tag", 16, msBind.getTagNo()); 135 isEquals("check explicit", true, msBind.isExplicit()); 136 isEquals("check tagged object is a DLSet: " + msBind.getObject().getClass(), DLSet.class.getName(), msBind.getObject().getClass().getName()); 137 138 DLSet msBindSet = (DLSet)msBind.getObject(); 139 isEquals("check number of elements", 2, msBindSet.size()); 140 isEquals("check first element in set: " + msBindSet.getObjectAt(0).getClass(), DLApplicationSpecific.class.getName(), msBindSet.getObjectAt(0).getClass().getName()); 141 142 DLApplicationSpecific objectName = (DLApplicationSpecific)msBindSet.getObjectAt(0); 143 isEquals("check tag number", 0, objectName.getApplicationTag()); 144 isEquals("check application object: " + objectName.getObject().getClass(), DLSequence.class.getName(), objectName.getObject().getClass().getName()); 145 DLSequence objNameElems = (DLSequence)objectName.getObject(); 146 isEquals("check number of elements", 4, objNameElems.size()); 147 isEquals("check first element in set: " + objNameElems.getObjectAt(0).getClass(), DLApplicationSpecific.class.getName(), objNameElems.getObjectAt(0).getClass().getName()); 148 DLApplicationSpecific objNameAppl = (DLApplicationSpecific)objNameElems.getObjectAt(0); 149 isEquals("check application number", 0, objNameAppl.getApplicationTag()); 150 isEquals("check application object: " + objNameAppl.getObject().getClass(), DERPrintableString.class.getName(), objNameAppl.getObject().getClass().getName()); 151 isEquals("check C", "de", ((DERPrintableString)objNameAppl.getObject()).getString()); 152 isEquals("check second element in set: " + objNameElems.getObjectAt(1).getClass(), DLApplicationSpecific.class.getName(), objNameElems.getObjectAt(1).getClass().getName()); 153 objNameAppl = (DLApplicationSpecific)objNameElems.getObjectAt(1); 154 isEquals("check application number", 2, objNameAppl.getApplicationTag()); 155 isEquals("check application object: " + objNameAppl.getObject().getClass(), DERPrintableString.class.getName(), objNameAppl.getObject().getClass().getName()); 156 isEquals("check A", "viaT", ((DERPrintableString)objNameAppl.getObject()).getString()); 157 isEquals("check third element in set: " + objNameElems.getObjectAt(2).getClass(), DLTaggedObject.class.getName(), objNameElems.getObjectAt(2).getClass().getName()); 158 DLTaggedObject objNameTagged = (DLTaggedObject)objNameElems.getObjectAt(2); 159 isEquals("check tag number", 3, objNameTagged.getTagNo()); 160 isEquals("check implicit", false, objNameTagged.isExplicit()); 161 isEquals("check tagged object: " + objNameTagged.getObject().getClass(), DEROctetString.class.getName(), objNameTagged.getObject().getClass().getName()); 162 isEquals("check O", "Organization", new String(((DEROctetString)objNameTagged.getObject()).getOctets(), "8859_1")); 163 isEquals("check fourth element in set: " + objNameElems.getObjectAt(3).getClass(), DLTaggedObject.class.getName(), objNameElems.getObjectAt(3).getClass().getName()); 164 objNameTagged = (DLTaggedObject)objNameElems.getObjectAt(3); 165 isEquals("check tag number", 5, objNameTagged.getTagNo()); 166 isEquals("check implicit", true, objNameTagged.isExplicit()); 167 isEquals("check tagged object: " + objNameTagged.getObject().getClass(), DLTaggedObject.class.getName(), objNameTagged.getObject().getClass().getName()); 168 objNameTagged = (DLTaggedObject)objNameTagged.getObject(); 169 isEquals("check tag number", 0, objNameTagged.getTagNo()); 170 isEquals("check implicit", false, objNameTagged.isExplicit()); 171 isEquals("check tagged object: " + objNameTagged.getObject().getClass(), DEROctetString.class.getName(), objNameTagged.getObject().getClass().getName()); 172 isEquals("check CN", "Common Name", new String(((DEROctetString)objNameTagged.getObject()).getOctets(), "8859_1")); 173 174 isEquals("check second element in set: " + msBind.getObject().getClass(), DLTaggedObject.class.getName(), msBindSet.getObjectAt(1).getClass().getName()); 175 DLTaggedObject password = (DLTaggedObject)msBindSet.getObjectAt(1); 176 isEquals("check tag number", 2, password.getTagNo()); 177 isEquals("check explicit", true, password.isExplicit()); 178 isEquals("check tagged object: " + password.getObject().getClass(), DERIA5String.class.getName(), password.getObject().getClass().getName()); 179 isEquals("check password", "SomePassword", ((DERIA5String)password.getObject()).getString()); 180 } 181 createRealDataExample()182 private ASN1EncodableVector createRealDataExample() 183 throws IOException 184 { 185 ASN1EncodableVector vec = new ASN1EncodableVector(); 186 187 vec.add(new ASN1ObjectIdentifier("2.1.1")); 188 vec.add(new ASN1Integer(9)); 189 vec.add(new DERUTF8String("example data representing the User Data of an OSI.6 ConnectP containing an MSBind with username and password")); 190 191 ASN1EncodableVector objectNameVec = new ASN1EncodableVector(); 192 objectNameVec.add(new DLApplicationSpecific(0, new DERPrintableString("de"))); 193 objectNameVec.add(new DLApplicationSpecific(2, new DERPrintableString("viaT"))); 194 objectNameVec.add(new DLTaggedObject(false, 3, new DEROctetString("Organization".getBytes("8859_1")))); 195 objectNameVec.add(new DLTaggedObject(true, 5, new DLTaggedObject(false, 0, new DEROctetString("Common Name".getBytes("8859_1"))))); 196 197 DLApplicationSpecific objectName = new DLApplicationSpecific(0, new DLSequence(objectNameVec)); 198 DLTaggedObject password = new DLTaggedObject(true, 2, new DERIA5String("SomePassword")); 199 ASN1EncodableVector msBindVec = new ASN1EncodableVector(); 200 msBindVec.add(objectName); 201 msBindVec.add(password); 202 DLSet msBindSet = new DLSet(msBindVec); 203 DLTaggedObject msBind = new DLTaggedObject(true, 16, msBindSet); 204 205 vec.add(new DLTaggedObject(true, 2, msBind)); // the encoding is actually 0 but that's also the default 206 return vec; 207 } 208 getName()209 public String getName() 210 { 211 return "DLExternal"; 212 } 213 performTest()214 public void performTest() 215 throws Exception 216 { 217 testInstantiationByVector(); 218 testReadEncoded(); 219 } 220 221 /** 222 * Main method to start testing manually outside production 223 * 224 * @param args Calling arguments (not used here) 225 */ main(String[] args)226 public static void main(String[] args) 227 { 228 runTest(new DLExternalTest()); 229 } 230 } 231