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 * @modules java.base/sun.security.util
30 */
31
32import java.io.*;
33import sun.security.util.*;
34
35public class StringTypes {
36
37    private static String s = null;
38    private static String fileName = "StringTypes.bin";
39
40    public static void main(String[] args) throws Exception {
41
42        s = new String("This is just a test!");
43
44        byte[] asciiBytes = s.getBytes("ASCII");
45        byte[] utf8Bytes = s.getBytes("UTF8");
46        byte[] iso8859_1Bytes = s.getBytes("ISO-8859-1");
47
48        byte[] unicodeBytes = s.getBytes("UnicodeBigUnmarked");
49        byte[] unicodeBytes2 = getBytes(s);
50
51        // test that unicode encoder is the correct one
52        if (!equalBytes(unicodeBytes, unicodeBytes2))
53          throw new Exception ("Problem with unicode encoder being used.");
54
55        FileOutputStream fout = new FileOutputStream(fileName);
56        DerOutputStream derOut = new DerOutputStream();
57
58        System.out.println("Writing Java string out as various DER" +
59                           " encoded Strings now...");
60        derOut.putUTF8String(s);
61        derOut.putPrintableString(s);
62        derOut.putIA5String(s);
63        derOut.putT61String(s);
64        derOut.putBMPString(s);
65
66        derOut.derEncode(fout);
67        fout.close();
68
69        FileInputStream fis = new FileInputStream(fileName);
70        byte[] data = new byte[fis.available()];
71        fis.read(data);
72        DerInputStream derIn = new DerInputStream(data);
73        fis.close();
74
75        System.out.println("\nReading Strings back as DerValue's...\n");
76
77        DerValue der;
78
79        der = derIn.getDerValue();
80        verifyDER("UTF8", der, DerValue.tag_UTF8String, utf8Bytes);
81
82        der = derIn.getDerValue();
83        verifyDER("Printable", der, DerValue.tag_PrintableString, asciiBytes);
84
85        der = derIn.getDerValue();
86        verifyDER("IA5", der, DerValue.tag_IA5String, asciiBytes);
87
88        der = derIn.getDerValue();
89        verifyDER("T61", der, DerValue.tag_T61String, iso8859_1Bytes);
90
91        der = derIn.getDerValue();
92        verifyDER("BMP", der, DerValue.tag_BMPString, unicodeBytes);
93
94        if (derIn.available() > 0)
95          throw new Exception("DerInputStream has extra data!");
96
97
98        derIn.reset();
99
100        System.out.println("Reading Strings back as Strings...\n");
101
102        verifyString("UTF8", derIn.getUTF8String());
103        verifyString("Printable", derIn.getPrintableString());
104        verifyString("IA5", derIn.getIA5String());
105        verifyString("T61", derIn.getT61String());
106        verifyString("BMP", derIn.getBMPString());
107
108    }
109
110    /**
111     * Return the unicode bytes in the string as a byte[]
112     */
113    private static byte[] getBytes(String s) {
114
115        int len = s.length();
116        byte[] retVal = new byte[len*2]; // each unicode char is two bytes
117
118        for (int i = 0, j = 0; i < len; i++, j+=2) {
119            retVal[j]   = (byte) (s.charAt(i)>>8);
120            retVal[j+1] = (byte) (s.charAt(i));
121        }
122
123        return retVal;
124    }
125
126    /* Compare two byte arrays */
127    private static boolean equalBytes(byte[] a, byte[] b) {
128
129        int len1 = a.length;
130        int len2 = b.length;
131
132        if (len1 != len2)
133            return false;
134
135        for (int i = 0; i < len1 && i < len2; i++)
136            if (a[i] != b[i])
137                return false;
138
139        return true;
140    }
141
142    /* Verify that the DER object is correct */
143    private static void verifyDER(String type,
144                                  DerValue der, byte tag,
145                                  byte[] data) throws Exception {
146        if (der.tag != tag)
147            throw new Exception("Problem with tag for " + type);
148
149        if (!equalBytes(der.data.toByteArray(), data))
150            throw new Exception("Problem with data for " + type);
151
152        System.out.println(type + " checks out OK");
153        System.out.println("Calling toString on it: " + der.toString() + "\n");
154    }
155
156    private static void verifyString(String type, String str)
157        throws Exception {
158
159        if (!s.equals(str))
160            throw new Exception("Problem with string " + type);
161
162        System.out.println(type + "String checks out OK\n");
163    }
164
165}
166