1 /*
2  * Copyright (c) 1999, 2001, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  * @test
26  * @bug 4178326
27  * @summary Make sure reading/writing of different DER encoded string
28  * types works correctly.
29  */
30 
31 import java.io.*;
32 import sun.security.util.*;
33 
34 public class StringTypes {
35 
36     private static String s = null;
37     private static String fileName = "StringTypes.bin";
38 
main(String[] args)39     public static void main(String[] args) throws Exception {
40 
41         s = new String("This is just a test!");
42 
43         byte[] asciiBytes = s.getBytes("ASCII");
44         byte[] utf8Bytes = s.getBytes("UTF8");
45         byte[] iso8859_1Bytes = s.getBytes("ISO-8859-1");
46 
47         byte[] unicodeBytes = s.getBytes("UnicodeBigUnmarked");
48         byte[] unicodeBytes2 = getBytes(s);
49 
50         // test that unicode encoder is the correct one
51         if (!equalBytes(unicodeBytes, unicodeBytes2))
52           throw new Exception ("Problem with unicode encoder being used.");
53 
54         FileOutputStream fout = new FileOutputStream(fileName);
55         DerOutputStream derOut = new DerOutputStream();
56 
57         System.out.println("Writing Java string out as various DER" +
58                            " encoded Strings now...");
59         derOut.putUTF8String(s);
60         derOut.putPrintableString(s);
61         derOut.putIA5String(s);
62         derOut.putT61String(s);
63         derOut.putBMPString(s);
64 
65         derOut.derEncode(fout);
66         fout.close();
67 
68         FileInputStream fis = new FileInputStream(fileName);
69         byte[] data = new byte[fis.available()];
70         fis.read(data);
71         DerInputStream derIn = new DerInputStream(data);
72         fis.close();
73 
74         System.out.println("\nReading Strings back as DerValue's...\n");
75 
76         DerValue der;
77 
78         der = derIn.getDerValue();
79         verifyDER("UTF8", der, DerValue.tag_UTF8String, utf8Bytes);
80 
81         der = derIn.getDerValue();
82         verifyDER("Printable", der, DerValue.tag_PrintableString, asciiBytes);
83 
84         der = derIn.getDerValue();
85         verifyDER("IA5", der, DerValue.tag_IA5String, asciiBytes);
86 
87         der = derIn.getDerValue();
88         verifyDER("T61", der, DerValue.tag_T61String, iso8859_1Bytes);
89 
90         der = derIn.getDerValue();
91         verifyDER("BMP", der, DerValue.tag_BMPString, unicodeBytes);
92 
93         if (derIn.available() > 0)
94           throw new Exception("DerInputStream has extra data!");
95 
96 
97         derIn.reset();
98 
99         System.out.println("Reading Strings back as Strings...\n");
100 
101         verifyString("UTF8", derIn.getUTF8String());
102         verifyString("Printable", derIn.getPrintableString());
103         verifyString("IA5", derIn.getIA5String());
104         verifyString("T61", derIn.getT61String());
105         verifyString("BMP", derIn.getBMPString());
106 
107     }
108 
109     /**
110      * Return the unicode bytes in the string as a byte[]
111      */
getBytes(String s)112     private static byte[] getBytes(String s) {
113 
114         int len = s.length();
115         byte[] retVal = new byte[len*2]; // each unicode char is two bytes
116 
117         for (int i = 0, j = 0; i < len; i++, j+=2) {
118             retVal[j]   = (byte) (s.charAt(i)>>8);
119             retVal[j+1] = (byte) (s.charAt(i));
120         }
121 
122         return retVal;
123     }
124 
125     /* Compare two byte arrays */
equalBytes(byte[] a, byte[] b)126     private static boolean equalBytes(byte[] a, byte[] b) {
127 
128         int len1 = a.length;
129         int len2 = b.length;
130 
131         if (len1 != len2)
132             return false;
133 
134         for (int i = 0; i < len1 && i < len2; i++)
135             if (a[i] != b[i])
136                 return false;
137 
138         return true;
139     }
140 
141     /* Verify that the DER object is correct */
verifyDER(String type, DerValue der, byte tag, byte[] data)142     private static void verifyDER(String type,
143                                   DerValue der, byte tag,
144                                   byte[] data) throws Exception {
145         if (der.tag != tag)
146             throw new Exception("Problem with tag for " + type);
147 
148         if (!equalBytes(der.data.toByteArray(), data))
149             throw new Exception("Problem with data for " + type);
150 
151         System.out.println(type + " checks out OK");
152         System.out.println("Calling toString on it: " + der.toString() + "\n");
153     }
154 
verifyString(String type, String str)155     private static void verifyString(String type, String str)
156         throws Exception {
157 
158         if (!s.equals(str))
159             throw new Exception("Problem with string " + type);
160 
161         System.out.println(type + "String checks out OK\n");
162     }
163 
164 }
165