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/** 198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @author Stepan M. Mishura 208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.security.tests.asn1.der; 23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException; 25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Arrays; 26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1Exception; 28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1Oid; 29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.DerInputStream; 30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.DerOutputStream; 31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase; 33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/** 36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * ASN.1 DER test for OID type 37e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * 38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * @see http://asn1.elibel.tm.fr/en/standards/index.htm 39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class OidTest extends TestCase { 42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private static Object[][] oid = { 44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes //oid array format: string / int array / DER encoding 45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "0.0", // as string 46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 0, 0 }, // as int array 47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x01, 0x00 } }, 48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "0.0.3", // as string 50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 0, 0, 3 }, // as int array 51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x02, 0x00, 0x03 } }, 52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "0.1.3", // as string 54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 0, 1, 3 }, // as int array 55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x02, 0x01, 0x03 } }, 56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "0.5", // as string 58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 0, 5 }, // as int array 59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x01, 0x05 } }, 60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "0.39.3", // as string 62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 0, 39, 3 }, // as int array 63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x02, 0x27, 0x03 } }, 64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "1.0.3", // as string 66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 1, 0, 3 }, // as int array 67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x02, 0x28, 0x03 } }, 68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "1.1", // as string 70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 1, 1 }, // as int array 71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x01, 0x29 } }, 72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "1.2.1.2.1",// as string 74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 1, 2, 1, 2, 1 }, // as int array 75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x04, 0x2A, 0x01, 0x02, 0x01 } }, 76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { 78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "1.2.840.113554.1.2.2",// as string 79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 1, 2, 840, 113554, 1, 2, 2 }, // as int array 80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x09, 0x2A, (byte) 0x86, 0x48, 81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes (byte) 0x86, (byte) 0xF7, 0x12, 0x01, 0x02, 0x02 } }, 82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "1.39.3",// as string 84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 1, 39, 3 }, // as int array 85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x02, 0x4F, 0x03 } }, 86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "2.0.3",// as string 88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 2, 0, 3 }, // as int array 89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x02, 0x50, 0x03 } }, 90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "2.5.4.3",// as string 92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 2, 5, 4, 3 }, // as int array 93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x03, 0x55, 0x04, 0x03 } }, 94e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes // 95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "2.39.3", // as string 96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 2, 39, 3 }, // as int array 97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x02, 0x77, 0x03 } }, 98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "2.40.3", // as string 100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 2, 40, 3 }, // as int array 101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x02, 0x78, 0x03 } }, 102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "2.47", // as string 104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 2, 47 }, // as int array 105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x01, 0x7F } }, 106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "2.48", // as string 108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 2, 48 }, // as int array 109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x02, (byte) 0x81, 0x00 } }, 110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "2.48.5", // as string 112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 2, 48, 5 }, // as int array 113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x03, (byte) 0x81, 0x00, 0x05 } }, 114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { "2.100.3", // as string 116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new int[] { 2, 100, 3 }, // as int array 117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x03, (byte) 0x81, 0x34, 0x03 } } }; 118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void test_MappingToIntArray() throws IOException { 120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // oid decoder/encoder for testing 122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ASN1Oid asn1 = ASN1Oid.getInstance(); 123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // testing decoding 125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < oid.length; i++) { 126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int[] decoded = (int[]) asn1.decode(new DerInputStream( 128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes (byte[]) oid[i][2])); 129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Failed to decode oid: " + oid[i][0], // error message 131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Arrays.equals((int[]) oid[i][1], // expected array 132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes decoded)); 133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 134e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // testing encoding 136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < oid.length; i++) { 137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] encoded = new DerOutputStream(ASN1Oid.getInstance(), 139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes oid[i][1]).encoded; 140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Failed to encode oid: " + oid[i][0], // error message 142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Arrays.equals((byte[]) oid[i][2], // expected encoding 143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes encoded)); 144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testDecode_Invalid() throws IOException { 148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[][] invalid = new byte[][] { 1498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // wrong tag: tag is not 0x06 150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x02, 0x01, 0x00 }, 151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // wrong length: length is 0 152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x00 }, 153e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes // wrong content: bit 8 of the last byte is not 0 154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x06, 0x02, (byte) 0x81, (byte) 0x80 }, 1558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // wrong content: is not encoded in fewest number of bytes 1568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath //FIXME new byte[] { 0x06, 0x02, (byte) 0x80, (byte) 0x01 } 157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes }; 158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < invalid.length; i++) { 160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes DerInputStream in = new DerInputStream(invalid[i]); 162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ASN1Oid.getInstance().decode(in); 163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("No expected ASN1Exception for:" + i); 164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (ASN1Exception e) { 165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void test_MappingToString() throws IOException { 170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // oid decoder/encoder for testing 172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ASN1Oid asn1 = ASN1Oid.getInstanceForString(); 173e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // testing decoding 175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < oid.length; i++) { 176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Failed to decode oid: " + oid[i][0], // error message 177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes oid[i][0], // expected string 178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes asn1.decode(new DerInputStream((byte[]) oid[i][2]))); 179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // testing encoding 182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < oid.length; i++) { 183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Failed to encode oid: " + oid[i][0], // error message 184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Arrays.equals((byte[]) oid[i][2], // expected encoding 185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new DerOutputStream(asn1, oid[i][0]).encoded)); 186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 189