1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes* @author Vladimir N. Molotkov
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes*/
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.security.tests.asn1.der;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ByteArrayInputStream;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.text.ParseException;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.text.SimpleDateFormat;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Date;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.TimeZone;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1GeneralizedTime;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.DerInputStream;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.DerOutputStream;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * ASN.1 DER test for GeneralizedTime type
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * @see http://asn1.elibel.tm.fr/en/standards/index.htm
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class DerGeneralizedTimeEDTest extends TestCase {
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private ASN1GeneralizedTime gTime = ASN1GeneralizedTime.getInstance();
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * GENERALIZED TIME DER Encoder test
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws ParseException
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testGeneralizedEncoder() throws Exception {
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // full fractional seconds
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Date myDate = getGmtDate(1101980374187L);
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] encoded =
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new DerOutputStream(gTime, myDate).encoded;
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String rep = new String(encoded, 2, encoded[1] & 0xff, "UTF-8");
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("full", "20041202093934.187Z", rep);
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // 2 digit fractional seconds (last 0 must be trimmed out)
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        myDate = getGmtDate(1101980374180L);
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoded =
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new DerOutputStream(gTime, myDate).encoded;
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        rep = new String(encoded, 2, encoded[1] & 0xff, "UTF-8");
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("2 fraction", "20041202093934.18Z", rep);
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // 1 digit fractional seconds (last 2 0s must be trimmed out)
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        myDate = getGmtDate(1101980374100L);
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoded =
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new DerOutputStream(gTime, myDate).encoded;
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        rep = new String(encoded, 2, encoded[1] & 0xff, "UTF-8");
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("1 fraction", "20041202093934.1Z", rep);
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // no fractional seconds (last 3 0s and "." must be trimmed out)
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        myDate = getGmtDate(1101980374000L);
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoded =
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new DerOutputStream(gTime, myDate).encoded;
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        rep = new String(encoded, 2, encoded[1] & 0xff, "UTF-8");
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("no fraction", "20041202093934Z", rep);
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // midnight
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SimpleDateFormat sdf =
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SimpleDateFormat("dd.MM.yyyy HH:mm");
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        myDate = sdf.parse("06.06.2004 00:00");
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoded =
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new DerOutputStream(gTime, myDate).encoded;
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        rep = new String(encoded, 2, encoded[1] & 0xff, "UTF-8");
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("midnight", "20040606000000Z", rep);
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * GENERALIZED TIME DER Encoder/Decoder test
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * (byte array case)
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws ParseException
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws IOException
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testGeneralizedEncoderDecoder01()
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        throws ParseException,
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes               IOException {
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        runTest(false);
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * GENERALIZED TIME DER Encoder/Decoder test
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * (InputStream case)
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws ParseException
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws IOException
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testGeneralizedEncoderDecoder02()
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        throws ParseException,
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes               IOException {
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        runTest(true);
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private final void runTest(boolean useInputStream)
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        throws IOException, ParseException {
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // full fractional seconds
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Date myDate = new Date(1101980374187L);
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] encoded =
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new DerOutputStream(gTime, myDate).encoded;
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        DerInputStream dis = useInputStream
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ? new DerInputStream(new ByteArrayInputStream(encoded))
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        : new DerInputStream(encoded);
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("full", myDate, gTime.decode(dis));
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // 2 digit fractional seconds (last 0 must be trimmed out)
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        myDate = new Date(1101980374180L);
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoded =
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new DerOutputStream(gTime, myDate).encoded;
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        dis = useInputStream
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ? new DerInputStream(new ByteArrayInputStream(encoded))
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        : new DerInputStream(encoded);
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("2 fraction", myDate, gTime.decode(dis));
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // 1 digit fractional seconds (last 2 0s must be trimmed out)
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        myDate = new Date(1101980374100L);
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoded =
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new DerOutputStream(gTime, myDate).encoded;
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        dis = useInputStream
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ? new DerInputStream(new ByteArrayInputStream(encoded))
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        : new DerInputStream(encoded);
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("1 fraction", myDate, gTime.decode(dis));
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // no fractional seconds (last 3 0s and "." must be trimmed out)
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        myDate = new Date(1101980374000L);
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoded =
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new DerOutputStream(gTime, myDate).encoded;
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        dis = useInputStream
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ? new DerInputStream(new ByteArrayInputStream(encoded))
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        : new DerInputStream(encoded);
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("no fraction", myDate, gTime.decode(dis));
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // midnight
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        myDate = new SimpleDateFormat("MM.dd.yyyy HH:mm").
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            parse("06.06.2004 00:00");
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoded =
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new DerOutputStream(gTime, myDate).encoded;
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        dis = useInputStream
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ? new DerInputStream(new ByteArrayInputStream(encoded))
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        : new DerInputStream(encoded);
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("midnight", myDate, gTime.decode(dis));
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // date 100 ms
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        myDate = new Date(100L);
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoded =
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new DerOutputStream(gTime, myDate).encoded;
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        dis = useInputStream
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ? new DerInputStream(new ByteArrayInputStream(encoded))
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        : new DerInputStream(encoded);
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("100ms", myDate, gTime.decode(dis));
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static Date getGmtDate(long mills) {
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new Date(mills);
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
177