• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17 
18 /**
19  * @author Stepan M. Mishura
20  */
21 
22 package org.apache.harmony.security.tests.asn1.der;
23 
24 import java.io.IOException;
25 import java.util.ArrayList;
26 import java.util.Arrays;
27 
28 import org.apache.harmony.security.asn1.ASN1Boolean;
29 import org.apache.harmony.security.asn1.ASN1Constants;
30 import org.apache.harmony.security.asn1.ASN1Explicit;
31 import org.apache.harmony.security.asn1.ASN1SequenceOf;
32 import org.apache.harmony.security.asn1.ASN1Type;
33 import org.apache.harmony.security.asn1.DerInputStream;
34 import org.apache.harmony.security.asn1.DerOutputStream;
35 
36 import junit.framework.TestCase;
37 
38 
39 /**
40  * ASN.1 DER test for Explicitly tagged type
41  *
42  * @see http://asn1.elibel.tm.fr/en/standards/index.htm
43  */
44 
45 public class ExplicitTest extends TestCase {
46 
47     private static ASN1SequenceOf sequence = new ASN1SequenceOf(ASN1Boolean
48             .getInstance());
49 
50     private static Object[][] taggedType;
51 
setUp()52     protected void setUp() throws Exception {
53         super.setUp();
54 
55         taggedType = new Object[][] {
56                 //format: object to encode / ASN.1 tagged type / byte array
57 
58                 //
59                 // Boolean = false
60                 //
61 
62                 // [UNIVERSAL 5] Boolean
63                 new Object[] {
64                         Boolean.FALSE,
65                         new byte[] { 0x25, 0x03, 0x01, 0x01, 0x00 },
66                         new ASN1Explicit(ASN1Constants.CLASS_UNIVERSAL, 5,
67                                 ASN1Boolean.getInstance()) },
68 
69                 // [APPLICATION 5] Boolean
70                 new Object[] {
71                         Boolean.FALSE,
72                         new byte[] { 0x65, 0x03, 0x01, 0x01, 0x00 },
73                         new ASN1Explicit(ASN1Constants.CLASS_APPLICATION, 5,
74                                 ASN1Boolean.getInstance()) },
75 
76                 // [CONTEXT-SPECIFIC 5] Boolean
77                 new Object[] {
78                         Boolean.FALSE,
79                         new byte[] { (byte) 0xA5, 0x03, 0x01, 0x01, 0x00 },
80                         new ASN1Explicit(ASN1Constants.CLASS_CONTEXTSPECIFIC,
81                                 5, ASN1Boolean.getInstance()) },
82 
83                 // [5] Boolean (default = CONTEXT-SPECIFIC)
84                 new Object[] { Boolean.FALSE,
85                         new byte[] { (byte) 0xA5, 0x03, 0x01, 0x01, 0x00 },
86                         new ASN1Explicit(5, ASN1Boolean.getInstance()) },
87 
88                 // [PRIVATE 5] Boolean
89                 new Object[] {
90                         Boolean.FALSE,
91                         new byte[] { (byte) 0xE5, 0x03, 0x01, 0x01, 0x00 },
92                         new ASN1Explicit(ASN1Constants.CLASS_PRIVATE, 5,
93                                 ASN1Boolean.getInstance()) },
94 
95                 //
96                 // Boolean = true
97                 //
98 
99                 // [UNIVERSAL 5] Boolean
100                 new Object[] {
101                         Boolean.TRUE,
102                         new byte[] { 0x25, 0x03, 0x01, 0x01, (byte) 0xFF },
103                         new ASN1Explicit(ASN1Constants.CLASS_UNIVERSAL, 5,
104                                 ASN1Boolean.getInstance()) },
105 
106                 // [APPLICATION 5] Boolean
107                 new Object[] {
108                         Boolean.TRUE,
109                         new byte[] { 0x65, 0x03, 0x01, 0x01, (byte) 0xFF },
110                         new ASN1Explicit(ASN1Constants.CLASS_APPLICATION, 5,
111                                 ASN1Boolean.getInstance()) },
112 
113                 // [CONTEXT-SPECIFIC 5] Boolean
114                 new Object[] {
115                         Boolean.TRUE,
116                         new byte[] { (byte) 0xA5, 0x03, 0x01, 0x01, (byte) 0xFF },
117                         new ASN1Explicit(ASN1Constants.CLASS_CONTEXTSPECIFIC,
118                                 5, ASN1Boolean.getInstance()) },
119 
120                 // [5] Boolean (default = CONTEXT-SPECIFIC)
121                 new Object[] {
122                         Boolean.TRUE,
123                         new byte[] { (byte) 0xA5, 0x03, 0x01, 0x01, (byte) 0xFF },
124                         new ASN1Explicit(ASN1Constants.CLASS_CONTEXTSPECIFIC,
125                                 5, ASN1Boolean.getInstance()) },
126 
127                 // [PRIVATE 5] Boolean
128                 new Object[] {
129                         Boolean.TRUE,
130                         new byte[] { (byte) 0xE5, 0x03, 0x01, 0x01, (byte) 0xFF },
131                         new ASN1Explicit(ASN1Constants.CLASS_PRIVATE, 5,
132                                 ASN1Boolean.getInstance()) },
133                 //
134                 // SequenceOf - testing constructed ASN.1 type
135                 //
136 
137                 // [UNIVERSAL 5] SequenceOf
138                 new Object[] {
139                         new ArrayList(),
140                         new byte[] { 0x25, 0x02, 0x30, 0x00 },
141                         new ASN1Explicit(ASN1Constants.CLASS_UNIVERSAL, 5,
142                                 sequence) },
143 
144                 // [APPLICATION 5] SequenceOf
145                 new Object[] {
146                         new ArrayList(),
147                         new byte[] { 0x65, 0x02, 0x30, 0x00 },
148                         new ASN1Explicit(ASN1Constants.CLASS_APPLICATION, 5,
149                                 sequence) },
150 
151                 // [CONTEXT-SPECIFIC 5] SequenceOf
152                 new Object[] {
153                         new ArrayList(),
154                         new byte[] { (byte) 0xA5, 0x02, 0x30, 0x00 },
155                         new ASN1Explicit(ASN1Constants.CLASS_CONTEXTSPECIFIC,
156                                 5, sequence) },
157 
158                 // [5] SequenceOf (default = CONTEXT-SPECIFIC)
159                 new Object[] {
160                         new ArrayList(),
161                         new byte[] { (byte) 0xA5, 0x02, 0x30, 0x00 },
162                         new ASN1Explicit(ASN1Constants.CLASS_CONTEXTSPECIFIC,
163                                 5, sequence) },
164 
165                 // [PRIVATE 5] SequenceOf
166                 new Object[] {
167                         new ArrayList(),
168                         new byte[] { (byte) 0xE5, 0x02, 0x30, 0x00 },
169                         new ASN1Explicit(ASN1Constants.CLASS_PRIVATE, 5,
170                                 sequence) } };
171     }
172 
testDecode_Valid()173     public void testDecode_Valid() throws IOException {
174 
175         for (int i = 0; i < taggedType.length; i++) {
176             DerInputStream in = new DerInputStream((byte[]) taggedType[i][1]);
177             assertEquals("Test case: " + i, taggedType[i][0],
178                     ((ASN1Type) taggedType[i][2]).decode(in));
179         }
180     }
181 
182     //FIXME need testcase for decoding invalid encodings
183 
testEncode()184     public void testEncode() throws IOException {
185 
186         for (int i = 0; i < taggedType.length; i++) {
187             DerOutputStream out = new DerOutputStream(
188                     (ASN1Type) taggedType[i][2], taggedType[i][0]);
189             assertTrue("Test case: " + i, Arrays.equals(
190                     (byte[]) taggedType[i][1], out.encoded));
191         }
192     }
193 }
194