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