JarFileTest.java revision 19745ce89add193c0e13c18979a3c9fb25bee475
1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathpackage org.apache.harmony.tests.java.util.jar; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayOutputStream; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.File; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileOutputStream; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URL; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Permission; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Enumeration; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Attributes; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarEntry; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarFile; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarOutputStream; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Manifest; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipEntry; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipException; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipFile; 3819745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamathimport junit.framework.TestCase; 3919745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamathimport tests.support.resource.Support_Resources; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class JarFileTest extends TestCase { 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] getAllBytesFromStream(InputStream is) throws IOException { 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream bs = new ByteArrayOutputStream(); 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] buf = new byte[666]; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int iRead; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int off; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (is.available() > 0) { 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project iRead = is.read(buf, 0, buf.length); 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (iRead > 0) bs.write(buf, 0, iRead); 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return bs.toByteArray(); 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName = "hyts_patch.jar"; // a 'normal' jar file 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName2 = "hyts_patch2.jar"; 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName3 = "hyts_manifest1.jar"; 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName4 = "hyts_signed.jar"; 6657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName5 = "hyts_signed_inc.jar"; 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 69bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root private final String jarName6 = "hyts_signed_sha256withrsa.jar"; 70bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 71bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root private final String jarName7 = "hyts_signed_sha256digest_sha256withrsa.jar"; 72bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 7352c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root private final String jarName8 = "hyts_signed_sha512digest_sha512withecdsa.jar"; 7452c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 75bda6980df389e16edf907e5c516ee21e9e92883eKenny Root private final String jarName9 = "hyts_signed_sha256digest_sha256withecdsa.jar"; 76bda6980df389e16edf907e5c516ee21e9e92883eKenny Root 773de7083091497358d003bb889eba909f85b69fadKenny Root private final String authAttrsJar = "hyts_signed_authAttrs.jar"; 783de7083091497358d003bb889eba909f85b69fadKenny Root 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String entryName = "foo/bar/A.class"; 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String entryName3 = "coucou/FileAccess.class"; 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String integrateJar = "Integrate.jar"; 84d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 8557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson private final String integrateJarEntry = "Test.class"; 8657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 87d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntryJar = "EmptyEntries_signed.jar"; 88d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 89d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry1 = "subfolder/internalSubset01.js"; 90d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 91d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry2 = "svgtest.js"; 92d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 93d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry3 = "svgunit.js"; 94d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private File resources; 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // custom security manager 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = new SecurityManager() { 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final String forbidenPermissionName = "user.dir"; 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void checkPermission(Permission perm) { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (perm.getName().equals(forbidenPermissionName)) { 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SecurityException(); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void setUp() { 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resources = Support_Resources.createTempFolder(); 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 114229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File) 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_File() { 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file")); 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 133229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String) 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_lang_String() { 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile("Wrong.file"); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String fileName = (new File(resources, jarName)).getCanonicalPath(); 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(fileName); 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 153229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String, boolean) 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_lang_StringZ() { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile("Wrong.file", false); 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String fileName = (new File(resources, jarName)).getCanonicalPath(); 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(fileName, true); 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 173229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File, boolean) 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_FileZ() { 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file"), true); 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName), false); 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 192229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File, boolean, int) 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_FileZI() { 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file"), true, 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.OPEN_READ); 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName), false, 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.OPEN_READ); 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName), false, 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.OPEN_READ | ZipFile.OPEN_DELETE + 33); 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IllegalArgumentException"); 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalArgumentException e) { 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 22457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * Constructs JarFile object. 22557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * 226229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File) 227229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String) 22857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 22957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testConstructor_file() throws IOException { 23057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File f = new File(resources, jarName); 23157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 23257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue(new JarFile(f).getEntry(entryName).getName().equals( 23357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson entryName)); 23457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue(new JarFile(f.getPath()).getEntry(entryName).getName() 23557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson .equals(entryName)); 23657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 23757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 23857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 239229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#entries() 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_entries() throws Exception { 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note only (and all of) the following should be contained in the file 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * META-INF/ META-INF/MANIFEST.MF foo/ foo/bar/ foo/bar/A.class Blah.txt 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> e = jarFile.entries(); 24957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int i; 25057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (i = 0; e.hasMoreElements(); i++) { 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project e.nextElement(); 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 25357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertEquals(jarFile.size(), i); 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(6, i); 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_entries2() throws Exception { 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration.hasMoreElements(); 26557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("hasMoreElements() did not detect a closed jar file"); 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException e) { 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile = new JarFile(new File(resources, jarName)); 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration.nextElement(); 27457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("nextElement() did not detect closed jar file"); 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException e) { 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 281229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getEntryLjava_lang_String() throws IOException { 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Error in returned entry", 311, jarFile.getEntry( 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entryName).getSize()); 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test: " + e.toString()); 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (enumeration.hasMoreElements()) { 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getEntry(je.getName()); 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getEntry(je.getName()); 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fail("IllegalStateException expected."); 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ee) { // Per documentation exception 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // may be thrown. 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 318229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getJarEntryLjava_lang_String() throws IOException { 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Error in returned entry", 311, jarFile.getJarEntry( 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entryName).getSize()); 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test: " + e.toString()); 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (enumeration.hasMoreElements()) { 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getJarEntry(je.getName()); 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getJarEntry(je.getName()); 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fail("IllegalStateException expected."); 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ee) { // Per documentation exception 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // may be thrown. 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 35457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 355229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 35657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 35757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testGetJarEntry() throws Exception { 35857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 35957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jarFile = new JarFile(new File(resources, jarName)); 36057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertEquals("Error in returned entry", 311, jarFile.getEntry( 36157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson entryName).getSize()); 36257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.close(); 36357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 36457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // tests for signed jars 36557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // test all signed jars in the /Testres/Internal/SignedJars directory 36657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String jarDirUrl = Support_Resources 36757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson .getResourceURL("/../internalres/signedjars"); 36857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Vector<String> signedJars = new Vector<String>(); 36957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 37057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream is = new URL(jarDirUrl + "/jarlist.txt").openStream(); 37157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson while (is.available() > 0) { 37257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson StringBuilder linebuff = new StringBuilder(80); // Typical line 37357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // length 37457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson done: while (true) { 37557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int nextByte = is.read(); 37657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson switch (nextByte) { 37757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case -1: 37857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 37957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case (byte) '\r': 38057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 38157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // ignore 38257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 38357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 38457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case (byte) '\n': 38557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 38657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // ignore 38757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 38857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 38957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson default: 39057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson linebuff.append((char) nextByte); 39157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 39257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 39357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 39457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break; 39557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 39657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String line = linebuff.toString(); 39757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson signedJars.add(line); 39857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 39957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 40057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IOException e) { 40157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // no list of jars found 40257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 40357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 40457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (int i = 0; i < signedJars.size(); i++) { 40557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String jarName = signedJars.get(i); 40657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 40757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File file = Support_Resources.getExternalLocalFile(jarDirUrl 40857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + "/" + jarName); 40957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile = new JarFile(file, true); 41057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson boolean foundCerts = false; 41157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Enumeration<JarEntry> e = jarFile.entries(); 41257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson while (e.hasMoreElements()) { 41357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry entry = e.nextElement(); 41457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream is = jarFile.getInputStream(entry); 41557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.skip(100000); 41657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 41757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Certificate[] certs = entry.getCertificates(); 41857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (certs != null && certs.length > 0) { 41957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson foundCerts = true; 42057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break; 42157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 42257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 42357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue( 42457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson "No certificates found during signed jar test for jar \"" 42557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + jarName + "\"", foundCerts); 42657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IOException e) { 42757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during signed jar test for jar \"" + jarName 42857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + "\": " + e.toString()); 42957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 43057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 43157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 43257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 434229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getManifest() 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getManifest() { 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Test for method java.util.jar.Manifest 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // java.util.jar.JarFile.getManifest() 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Error--Manifest not returned", jarFile.getManifest()); 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 1st test: " + e.toString()); 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName2); 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName2)); 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNull("Error--should have returned null", jarFile 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 2nd test: " + e.toString()); 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // jarName3 was created using the following test 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName3); 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName3)); 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Should find manifest without verifying", jarFile 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 3rd test: " + e.toString()); 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this is used to create jarName3 used in the previous test 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Manifest manifest = new Manifest(); 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Attributes attributes = manifest.getMainAttributes(); 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributes.put(new Attributes.Name("Manifest-Version"), "1.0"); 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream manOut = new ByteArrayOutputStream(); 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project manifest.write(manOut); 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] manBytes = manOut.toByteArray(); 47619745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamath File file = File.createTempFile("hyts_manifest1", ".jar"); 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarOutputStream jarOut = new JarOutputStream(new FileOutputStream( 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file.getAbsolutePath())); 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry entry = new ZipEntry("META-INF/"); 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(0); 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = new ZipEntry(JarFile.MANIFEST_NAME); 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(manBytes.length); 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.write(manBytes); 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = new ZipEntry("myfile"); 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(1); 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.write(65); 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.close(); 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(file.getAbsolutePath(), false); 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Should find manifest without verifying", jar 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jar.close(); 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file.delete(); 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IOException 3"); 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName2); 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jF = new JarFile(new File(resources, jarName2)); 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jF.close(); 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jF.getManifest(); 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("FAILED: expected IllegalStateException"); 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ise) { 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected; 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 4th test: " + e.toString()); 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, "Broken_manifest.jar"); 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jf; 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jf = new JarFile(new File(resources, "Broken_manifest.jar")); 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jf.getManifest(); 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IOException expected."); 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected. 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 523229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry) 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 525703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // This test doesn't pass on RI. If entry size is set up incorrectly, 526703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // SecurityException is thrown. But SecurityException is thrown on RI only 527703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // if jar file is signed incorrectly. 52852c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root public void test_getInputStreamLjava_util_jar_JarEntry_subtest0() throws Exception { 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project File signedFile = null; 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName4); 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signedFile = new File(resources, jarName4); 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Failed to create local file 2: " + e); 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.read(); 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 3: " + e); 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] dummy = getAllBytesFromStream(in); 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNull("found certificates", entry.getCertificates()); 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 4: " + e); 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 55757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(1076); 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] dummy = getAllBytesFromStream(in); 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("SecurityException should be thrown."); 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 5: " + e); 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName5); 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signedFile = new File(resources, jarName5); 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Failed to create local file 5: " + e); 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 57957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("SecurityException should be thrown."); 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 5: " + e); 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 590bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 591bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root // SHA1 digest, SHA256withRSA signed JAR 59252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName6); 593bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 594bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root // SHA-256 digest, SHA256withRSA signed JAR 59552c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName7); 596bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 59752c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root // SHA-512 digest, SHA512withECDSA signed JAR 59852c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName8); 5993de7083091497358d003bb889eba909f85b69fadKenny Root 6003de7083091497358d003bb889eba909f85b69fadKenny Root // JAR with a signature that has PKCS#7 Authenticated Attributes 6013de7083091497358d003bb889eba909f85b69fadKenny Root checkSignedJar(authAttrsJar); 60252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root } 60352c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 604bda6980df389e16edf907e5c516ee21e9e92883eKenny Root /** 605bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * This test uses a jar file signed with an algorithm that has its own OID 606bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * that is valid as a signature type. SHA256withECDSA is an algorithm that 607bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * isn't combined as DigestAlgorithm + "with" + DigestEncryptionAlgorithm 608bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * like RSAEncryption needs to be. 609bda6980df389e16edf907e5c516ee21e9e92883eKenny Root */ 610bda6980df389e16edf907e5c516ee21e9e92883eKenny Root public void testJarFile_Signed_Valid_DigestEncryptionAlgorithm() throws Exception { 611bda6980df389e16edf907e5c516ee21e9e92883eKenny Root checkSignedJar(jarName9); 612bda6980df389e16edf907e5c516ee21e9e92883eKenny Root } 613bda6980df389e16edf907e5c516ee21e9e92883eKenny Root 61452c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root private void checkSignedJar(String jarName) throws Exception { 61552c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root Support_Resources.copyFile(resources, null, jarName); 61652c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 61752c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root File file = new File(resources, jarName); 618bda6980df389e16edf907e5c516ee21e9e92883eKenny Root boolean foundCerts = false; 61952c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 62052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root JarFile jarFile = new JarFile(file, true); 621bda6980df389e16edf907e5c516ee21e9e92883eKenny Root try { 62252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 623bda6980df389e16edf907e5c516ee21e9e92883eKenny Root Enumeration<JarEntry> e = jarFile.entries(); 624bda6980df389e16edf907e5c516ee21e9e92883eKenny Root while (e.hasMoreElements()) { 625bda6980df389e16edf907e5c516ee21e9e92883eKenny Root JarEntry entry = e.nextElement(); 626bda6980df389e16edf907e5c516ee21e9e92883eKenny Root InputStream is = jarFile.getInputStream(entry); 627bda6980df389e16edf907e5c516ee21e9e92883eKenny Root is.skip(100000); 628bda6980df389e16edf907e5c516ee21e9e92883eKenny Root is.close(); 629bda6980df389e16edf907e5c516ee21e9e92883eKenny Root Certificate[] certs = entry.getCertificates(); 630bda6980df389e16edf907e5c516ee21e9e92883eKenny Root if (certs != null && certs.length > 0) { 631bda6980df389e16edf907e5c516ee21e9e92883eKenny Root foundCerts = true; 632bda6980df389e16edf907e5c516ee21e9e92883eKenny Root break; 633bda6980df389e16edf907e5c516ee21e9e92883eKenny Root } 63452c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root } 635bda6980df389e16edf907e5c516ee21e9e92883eKenny Root } finally { 636bda6980df389e16edf907e5c516ee21e9e92883eKenny Root jarFile.close(); 637bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root } 63852c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 63952c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root assertTrue( 64052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root "No certificates found during signed jar test for jar \"" 64152c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root + jarName + "\"", foundCerts); 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The jar created by 1.4 which does not provide a 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm-Digest-Manifest-Main-Attributes entry in .SF file. 647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_Jar_created_before_java_5() throws IOException { 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Created_by_1_4.jar"; 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* The jar is intact, then everything is all right. */ 661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Integrate_Jar() throws IOException { 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Integrate.jar"; 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 66957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 67057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 67157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 67257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 67357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 67457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * The jar is intact, but the entry object is modified. 67557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 67657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testJarVerificationModifiedEntry() throws IOException { 67757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, integrateJar); 67857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File f = new File(resources, integrateJar); 67957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 68057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jarFile = new JarFile(f); 68157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson ZipEntry zipEntry = jarFile.getJarEntry(integrateJarEntry); 68257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry.setSize(zipEntry.getSize() + 1); 68357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 68457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 68557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile = new JarFile(f); 68657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry = jarFile.getJarEntry(integrateJarEntry); 68757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry.setSize(zipEntry.getSize() - 1); 68857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 68957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson //jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 69057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).read(new byte[5000], 0, 5000); 69157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 69257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (SecurityException e) { 69357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // desired 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If another entry is inserted into Manifest, no security exception will be 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown out. 700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_InsertEntry_in_Manifest_Jar() throws IOException { 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Inserted_Entry_Manifest.jar"; 703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int count = 0; 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count++; 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(5, count); 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If another entry is inserted into Manifest, no security exception will be 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown out. 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_Inserted_Entry_Manifest_with_DigestCode() 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Inserted_Entry_Manifest_with_DigestCode.jar"; 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int count = 0; 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count++; 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(5, count); 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The content of Test.class is modified, jarFile.getInputStream will not 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * throw security Exception, but it will anytime before the inputStream got 740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from getInputStream method has been read to end. 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Class() throws IOException { 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Class.jar"; 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* The content of Test.class has been tampered. */ 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = jarFile.getEntry("Test.class"); 754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jarFile.getInputStream(zipEntry); 755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] buffer = new byte[1024]; 756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (in.available() > 0) { 758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.read(buffer); 759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 76057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * In the Modified.jar, the main attributes of META-INF/MANIFEST.MF is 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * tampered manually. Hence the RI 5.0 JarFile.getInputStream of any 76957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * JarEntry will throw security exception. 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Manifest_MainAttributes() 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Manifest_MainAttributes.jar"; 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 78257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * It is all right in our original JarFile. If the Entry Attributes, for 791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example Test.class in our jar, the jarFile.getInputStream will throw 792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Security Exception. 793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Manifest_EntryAttributes() 795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Manifest_EntryAttributes.jar"; 797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("should throw Security Exception"); 806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the content of the .SA file is modified, no matter what it resides, 814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * JarFile.getInputStream of any JarEntry will throw Security Exception. 815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_SF_EntryAttributes() throws IOException { 817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_SF_EntryAttributes.jar"; 818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("should throw Security Exception"); 827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_close() throws IOException { 834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_SF_EntryAttributes.jar"; 835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Can not check IOException 844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 84557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 84657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 84757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * @throws IOException 848229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry) 84957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 85057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void test_getInputStreamLjava_util_jar_JarEntry() throws IOException { 85157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File localFile = null; 85257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 85357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 85457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson localFile = new File(resources, jarName); 85557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 85657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Failed to create local file: " + e); 85757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 85857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 85957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson byte[] b = new byte[1024]; 86057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 86157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(localFile); 86257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson java.io.InputStream is = jf.getInputStream(jf.getEntry(entryName)); 86357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // BEGIN android-removed 86457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // jf.close(); 86557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // END android-removed 86657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue("Returned invalid stream", is.available() > 0); 86757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int r = is.read(b, 0, 1024); 86857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 86957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson StringBuffer sb = new StringBuffer(r); 87057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (int i = 0; i < r; i++) { 87157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson sb.append((char) (b[i] & 0xff)); 87257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 87357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String contents = sb.toString(); 87457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue("Incorrect stream read", contents.indexOf("bar") > 0); 87557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // BEGIN android-added 87657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.close(); 87757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // END android-added 87857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 87957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during test: " + e.toString()); 88057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 88157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 88257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 88357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(localFile); 88457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream in = jf.getInputStream(new JarEntry("invalid")); 88557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertNull("Got stream for non-existent entry", in); 88657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 88757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during test 2: " + e); 88857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 88957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 89057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 89157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 89257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File signedFile = new File(resources, jarName); 89357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(signedFile); 89457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry jre = new JarEntry("foo/bar/A.class"); 89557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.getInputStream(jre); 89657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // InputStream returned in any way, exception can be thrown in case 89757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // of reading from this stream only. 89857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // fail("Should throw ZipException"); 89957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (ZipException ee) { 90057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // expected 90157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 90257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 90357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 90457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 90557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File signedFile = new File(resources, jarName); 90657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(signedFile); 90757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry jre = new JarEntry("foo/bar/A.class"); 90857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.close(); 90957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.getInputStream(jre); 91057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // InputStream returned in any way, exception can be thrown in case 91157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // of reading from this stream only. 91257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // The same for IOException 91357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Should throw IllegalStateException"); 91457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IllegalStateException ee) { 91557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // expected 91657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 91757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 918d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 919d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob /** 920d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob * The jar is intact, but the entry object is modified. 921d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob */ 922703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // Regression test for issue introduced by HARMONY-4569: signed archives containing files with size 0 could not get verified. 923d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob public void testJarVerificationEmptyEntry() throws IOException { 924d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob Support_Resources.copyFile(resources, null, emptyEntryJar); 925d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob File f = new File(resources, emptyEntryJar); 926d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 927d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob JarFile jarFile = new JarFile(f); 928d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 929d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob ZipEntry zipEntry = jarFile.getJarEntry(emptyEntry1); 930d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob int res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); 931d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 932d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 933d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob zipEntry = jarFile.getJarEntry(emptyEntry2); 934d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); 935d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 936d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 937d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob zipEntry = jarFile.getJarEntry(emptyEntry3); 938d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob res = jarFile.getInputStream(zipEntry).read(); 939d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 940d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob } 941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 942