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 Alexander Y. Kleymenov 20 */ 21 22 package org.apache.harmony.security.tests.x509; 23 24 import java.io.IOException; 25 26 import junit.framework.TestCase; 27 28 import org.apache.harmony.security.x501.Name; 29 import org.apache.harmony.security.x509.EDIPartyName; 30 import org.apache.harmony.security.x509.GeneralName; 31 import org.apache.harmony.security.x509.GeneralNames; 32 import org.apache.harmony.security.x509.ORAddress; 33 import org.apache.harmony.security.x509.OtherName; 34 35 36 /** 37 * GeneralNameTest 38 */ 39 public class GeneralNameTest extends TestCase { 40 41 public void testGeneralName() { 42 try { 43 GeneralName san0 = 44 new GeneralName(new OtherName("1.2.3.4.5", new byte[] { 1, 2, 0, 1 })); 45 GeneralName san1 = new GeneralName(1, "rfc (at) 822.Name"); 46 GeneralName san2 = new GeneralName(2, "dNSName"); 47 GeneralName san3 = new GeneralName(new ORAddress()); 48 GeneralName san4 = new GeneralName(new Name("O=Organization")); 49 GeneralName san5 = 50 new GeneralName(new EDIPartyName("assigner", "party")); 51 GeneralName san6 = new GeneralName(6, "http://uniform.Resource.Id"); 52 GeneralName san7 = new GeneralName(7, "1.1.1.1"); 53 GeneralName san8 = new GeneralName(8, "1.2.3.4444.55555"); 54 55 GeneralNames sans_1 = new GeneralNames(); 56 sans_1.addName(san0); 57 sans_1.addName(san1); 58 sans_1.addName(san2); 59 sans_1.addName(san3); 60 sans_1.addName(san4); 61 sans_1.addName(san5); 62 sans_1.addName(san6); 63 sans_1.addName(san7); 64 sans_1.addName(san8); 65 66 byte[] encoding = GeneralNames.ASN1.encode(sans_1); 67 GeneralNames.ASN1.decode(encoding); 68 } catch (Exception e) { 69 // should not be thrown: 70 // provided string representations are correct 71 e.printStackTrace(); 72 } 73 } 74 75 public void testGeneralName1() throws Exception { 76 OtherName on = 77 new OtherName("1.2.3.4.5", new byte[] { 1, 2, 0, 1 }); 78 byte[] encoding = OtherName.ASN1.encode(on); 79 new GeneralName(0, encoding); 80 OtherName.ASN1.decode(encoding); 81 GeneralName gn = new GeneralName(on); 82 new GeneralName(0, gn.getEncodedName()); 83 assertEquals(gn, new GeneralName(0, gn.getEncodedName())); 84 } 85 86 /** 87 * ipStrToBytes method testing. 88 */ 89 public void testIpStrToBytes() throws Exception { 90 // Regression for HARMONY-727 91 Object[][] positives = { 92 { "010a:020b:3337:1000:FFFA:ABCD:9999:0000", 93 new int[] { 0x01, 0x0a, 0x02, 0x0b, 0x33, 0x37, 0x10, 0x00, 0xFF, 94 0xFA, 0xAB, 0xCD, 0x99, 0x99, 0x00, 0x00 } }, 95 { "010a:020b:3337:1000:FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e:0f10", 96 new int[] { 0x01, 0x0a, 0x02, 0x0b, 0x33, 0x37, 0x10, 0x00, 0xFF, 97 0xFA, 0xAB, 0xCD, 0x99, 0x99, 0x00, 0x00, 0x01, 0x02, 0x03, 98 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0b, 0x0c, 0x0D, 99 0x0e, 0x0f, 0x10 } }, 100 { "010a:020b:1133:1000:FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e:0f10", 101 new int[] { 0x01, 0x0a, 0x02, 0x0b, 0x11, 0x33, 0x10, 0x00, 0xFF, 102 0xFA, 0xAB, 0xCD, 0x99, 0x99, 0x00, 0x00, 0x01, 0x02, 0x03, 103 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0b, 0x0c, 0x0D, 104 0x0e, 0x0f, 0x10 } }, 105 { "010a:020b:1133:1000:FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e:0f10", 106 new int[] { 0x01, 0x0a, 0x02, 0x0b, 0x11, 0x33, 0x10, 0x00, 0xFF, 107 0xFA, 0xAB, 0xCD, 0x99, 0x99, 0x00, 0x00, 0x01, 0x02, 0x03, 108 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0b, 0x0c, 0x0D, 109 0x0e, 0x0f, 0x10 } }, 110 { "100.2.35.244", 111 new int[] { 100, 2, 35, 244 } }, 112 { "100.2.35.244/51.6.79.118", 113 new int[] { 100, 2, 35, 244, 51, 6, 79, 118 } }, 114 }; 115 String[] negatives = { 116 "010a:0000:3333:1000:FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e:0", 117 "010a:020b:3:1000:FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e:0f10", 118 "010a:020b:33:1000:FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e:0f10", 119 "010a:020b:333:1000:FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e:0f10", 120 "010a:020b:1133:10V0:FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e:0f10", 121 "010a:020b:1133:1000-FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e:0f10", 122 "010a:020b:1133:1000:FFFA:ABCD:9999", 123 "010a:020b:1133:1000:FFFA:ABCD:9999/0000:0102:0304:0506:0708:090A:0b0c:0D0e:0f10", 124 "010a:020b:1133:1000:FFFA:ABCD:9999:0000:0102/0304:0506:0708:090A:0b0c:0D0e:0f10", 125 "010a:020b:1133:1000:FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e:0f10:1234", 126 "100.2.35.244/51.6.79.118.119", 127 "100.2.35.244.115/79.118.119", 128 "100.2.35.244/79.118.119.1167", 129 "100.2.35.244/79.118.119.116.7", 130 "100.2.35.244.79/118.119.116.7", 131 "100.2.35/79/118.119.116.7", 132 "100.2.35.79/118/119.116.7", 133 "100.2..35.79/118/119.116.7", 134 "100.2.a.35.79/118/119.116.7", 135 "100.2.35.79/119.116.7-1", 136 "100.2.35.244.111", 137 "100.2.35.244/111", 138 "010a:020b:1133:1000:FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e0f10", 139 "010a:020b:1133:1000:FFFA:ABCD:9999:0000/0102:0304:0506:0708:090A:0b0c:0D0e0f:10", 140 "010a:020b:1133:1000:FFFA:ABCD:9999:0000/0102/0304:0506:0708:090A:0b0c:0D0e0f:10", 141 "010a:020b:1133:1000:FFFA:ABCD:9999:0000/0102030405060708090A0b0c:0D0e:0f10:ffff", 142 "010a:020b:1133:1000:FFFA:ABCD:9999:00000102030405060708090A/0b0c:0D0e:0f10:ffff", 143 }; 144 for (int i = 0; i < positives.length; i++) { 145 byte[] res = GeneralName.ipStrToBytes((String) positives[i][0]); 146 int[] ref = (int[]) positives[i][1]; 147 assertEquals("Length differs for " + positives[i][0], ref.length, res.length); 148 for (int j = 0; j < res.length; j++) { 149 assertEquals("Element differs for " + positives[i][0], (byte) ref[j], res[j]); 150 } 151 } 152 for (int n = 0; n < negatives.length; n++) { 153 String ip = negatives[n]; 154 try { 155 byte[] bts = GeneralName.ipStrToBytes(ip); 156 for (int i = 0; i < bts.length; i++) { 157 System.out.print((bts[i] & 0xFF) + " "); 158 } 159 System.out.println(""); 160 System.out.println(ip); 161 fail("No expected IOException was thrown for " + n); 162 } catch (IOException e) { 163 // expected 164 } 165 } 166 } 167 168 /** 169 * oidStrToInts method testing 170 */ 171 public void testOidStrToInts() throws Exception { 172 // Regression for HARMONY-727 173 Object[][] positives = { 174 { "1.2", new int[] { 1, 2 } }, 175 { "1.2.3.4.5", new int[] { 1, 2, 3, 4, 5 } }, 176 { "123.456.7890.1234567890", 177 new int[] { 123, 456, 7890, 1234567890 } }, }; 178 String[] negatives = { ".1.2", "1.2.", "11-22.44.22", "111..222" }; 179 for (int i = 0; i < positives.length; i++) { 180 int[] res = GeneralName.oidStrToInts((String) positives[i][0]); 181 int[] ref = (int[]) positives[i][1]; 182 assertEquals("Length differs for " + positives[i][0], ref.length, 183 res.length); 184 for (int j = 0; j < res.length; j++) { 185 if (res[j] != ref[j]) { 186 assertEquals("Element differs for " + positives[i][0], 187 (byte) ref[j], res[j]); 188 } 189 } 190 } 191 for (int i = 0; i < negatives.length; i++) { 192 try { 193 GeneralName.oidStrToInts(negatives[i]); 194 fail("Expected IOException was not thrown for " + negatives[i]); 195 } catch (IOException e) { 196 // expected 197 } 198 } 199 } 200 } 201