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 Stepan M. Mishura 20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes*/ 21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.security.tests.asn1.der; 23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException; 25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.ArrayList; 26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Arrays; 27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1Boolean; 29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1Exception; 30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1SequenceOf; 31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.BerInputStream; 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 SequenceOf type 40e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * 41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * @see http://asn1.elibel.tm.fr/en/standards/index.htm 42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class SequenceOfTest extends TestCase { 45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private static ASN1SequenceOf sequenceOf = new ASN1SequenceOf(ASN1Boolean 47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getInstance()); 48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Test Cases 51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private static Object[][] testcases = new Object[][] { 54e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes // format: object to encode / byte array 55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // sequence : empty sequence 57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new Object[] { new ArrayList(), new byte[] { 0x30, 0x00 } }, 58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // sequence : false 60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new Object[] { (new MyArray()).addMy(Boolean.FALSE), 61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x30, 0x03, 0x01, 0x01, 0x00 } }, 62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // sequence : true 64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new Object[] { (new MyArray()).addMy(Boolean.TRUE), 65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x30, 0x03, 0x01, 0x01, (byte) 0xFF } }, 66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // sequence : true, false 68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new Object[] { 69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes (new MyArray()).addMy(Boolean.TRUE).addMy(Boolean.FALSE), 70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new byte[] { 0x30, 0x06, // sequence of 71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 0x01, 0x01, (byte) 0xFF, // true 72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 0x01, 0x01, 0x00 } //false 73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes }, 74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 75e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes //TODO add testcase for another ASN.1 type` 76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes }; 78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testDecode_Valid() throws IOException { 80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < testcases.length; i++) { 82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes DerInputStream in = new DerInputStream((byte[]) testcases[i][1]); 84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Test case: " + i, testcases[i][0], sequenceOf 85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .decode(in)); 86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (ASN1Exception e) { 87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("Test case: " + i + "\n" + e.getMessage()); 88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes //FIXME need testcase for decoding invalid encodings 93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testEncode() throws IOException { 95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < testcases.length; i++) { 97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes DerOutputStream out = new DerOutputStream(sequenceOf, 98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes testcases[i][0]); 99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Test case: " + i, Arrays.equals( 100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes (byte[]) testcases[i][1], out.encoded)); 101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testVerify() throws IOException { 105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ASN1SequenceOf seqVerify = new ASN1SequenceOf(ASN1Boolean.getInstance()) { 107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public Object getDecodedObject(BerInputStream in) 109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throws IOException { 110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throw new IOException( 111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "Method getDecodedObject MUST not be invoked"); 112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes }; 114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < testcases.length; i++) { 116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes DerInputStream in = new DerInputStream((byte[]) testcases[i][1]); 117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes in.setVerify(); 118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes seqVerify.decode(in); 119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Support class 124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public static class MyArray extends ArrayList { 126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public MyArray addMy(Object o) { 128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes add(o); 129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return this; 130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 132e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes} 133