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