JarFileTest.java revision a3d40b4064c0f4de77122eff9253da242877c938
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; 26d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Rootimport java.security.CodeSigner; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Permission; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate; 29cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Rootimport java.util.Arrays; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Enumeration; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Attributes; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarEntry; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarFile; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarOutputStream; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Manifest; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipEntry; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipException; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipFile; 4019745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamathimport junit.framework.TestCase; 4119745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamathimport tests.support.resource.Support_Resources; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class JarFileTest extends TestCase { 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] getAllBytesFromStream(InputStream is) throws IOException { 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream bs = new ByteArrayOutputStream(); 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] buf = new byte[666]; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int iRead; 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int off; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (is.available() > 0) { 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project iRead = is.read(buf, 0, buf.length); 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (iRead > 0) bs.write(buf, 0, iRead); 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return bs.toByteArray(); 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName = "hyts_patch.jar"; // a 'normal' jar file 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName2 = "hyts_patch2.jar"; 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName3 = "hyts_manifest1.jar"; 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName4 = "hyts_signed.jar"; 6857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName5 = "hyts_signed_inc.jar"; 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 71bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root private final String jarName6 = "hyts_signed_sha256withrsa.jar"; 72bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 73bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root private final String jarName7 = "hyts_signed_sha256digest_sha256withrsa.jar"; 74bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 7552c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root private final String jarName8 = "hyts_signed_sha512digest_sha512withecdsa.jar"; 7652c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 77bda6980df389e16edf907e5c516ee21e9e92883eKenny Root private final String jarName9 = "hyts_signed_sha256digest_sha256withecdsa.jar"; 78bda6980df389e16edf907e5c516ee21e9e92883eKenny Root 793de7083091497358d003bb889eba909f85b69fadKenny Root private final String authAttrsJar = "hyts_signed_authAttrs.jar"; 803de7083091497358d003bb889eba909f85b69fadKenny Root 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String entryName = "foo/bar/A.class"; 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String entryName3 = "coucou/FileAccess.class"; 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 85d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String integrateJar = "Integrate.jar"; 86d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 8757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson private final String integrateJarEntry = "Test.class"; 8857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 89d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntryJar = "EmptyEntries_signed.jar"; 90d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 91d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry1 = "subfolder/internalSubset01.js"; 92d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 93d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry2 = "svgtest.js"; 94d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 95d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry3 = "svgunit.js"; 96d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 97cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root private static final String VALID_CHAIN_JAR = "hyts_signed_validChain.jar"; 98cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 99cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root private static final String INVALID_CHAIN_JAR = "hyts_signed_invalidChain.jar"; 100cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 101a3d40b4064c0f4de77122eff9253da242877c938Kenny Root private static final String AMBIGUOUS_SIGNERS_JAR = "hyts_signed_ambiguousSignerArray.jar"; 102a3d40b4064c0f4de77122eff9253da242877c938Kenny Root 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private File resources; 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // custom security manager 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = new SecurityManager() { 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final String forbidenPermissionName = "user.dir"; 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void checkPermission(Permission perm) { 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (perm.getName().equals(forbidenPermissionName)) { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SecurityException(); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void setUp() { 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resources = Support_Resources.createTempFolder(); 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 122229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File) 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_File() { 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file")); 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 141229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String) 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_lang_String() { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile("Wrong.file"); 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String fileName = (new File(resources, jarName)).getCanonicalPath(); 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(fileName); 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 161229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String, boolean) 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_lang_StringZ() { 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile("Wrong.file", false); 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String fileName = (new File(resources, jarName)).getCanonicalPath(); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(fileName, true); 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 181229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File, boolean) 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_FileZ() { 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file"), true); 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName), false); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 200229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File, boolean, int) 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_FileZI() { 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file"), true, 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.OPEN_READ); 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 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); 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName), false, 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.OPEN_READ | ZipFile.OPEN_DELETE + 33); 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IllegalArgumentException"); 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalArgumentException e) { 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 23257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * Constructs JarFile object. 23357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * 234229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File) 235229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String) 23657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 23757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testConstructor_file() throws IOException { 23857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File f = new File(resources, jarName); 23957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 24057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue(new JarFile(f).getEntry(entryName).getName().equals( 24157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson entryName)); 24257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue(new JarFile(f.getPath()).getEntry(entryName).getName() 24357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson .equals(entryName)); 24457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 24557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 24657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 247229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#entries() 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_entries() throws Exception { 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note only (and all of) the following should be contained in the file 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * META-INF/ META-INF/MANIFEST.MF foo/ foo/bar/ foo/bar/A.class Blah.txt 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> e = jarFile.entries(); 25757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int i; 25857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (i = 0; e.hasMoreElements(); i++) { 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project e.nextElement(); 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 26157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertEquals(jarFile.size(), i); 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(6, i); 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_entries2() throws Exception { 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration.hasMoreElements(); 27357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("hasMoreElements() did not detect a closed jar file"); 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException e) { 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile = new JarFile(new File(resources, jarName)); 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration.nextElement(); 28257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("nextElement() did not detect closed jar file"); 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException e) { 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 289229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getEntryLjava_lang_String() throws IOException { 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Error in returned entry", 311, jarFile.getEntry( 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entryName).getSize()); 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test: " + e.toString()); 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (enumeration.hasMoreElements()) { 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getEntry(je.getName()); 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getEntry(je.getName()); 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fail("IllegalStateException expected."); 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ee) { // Per documentation exception 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // may be thrown. 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 326229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getJarEntryLjava_lang_String() throws IOException { 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Error in returned entry", 311, jarFile.getJarEntry( 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entryName).getSize()); 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test: " + e.toString()); 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (enumeration.hasMoreElements()) { 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getJarEntry(je.getName()); 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getJarEntry(je.getName()); 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fail("IllegalStateException expected."); 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ee) { // Per documentation exception 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // may be thrown. 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 36257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 363229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 36457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 36557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testGetJarEntry() throws Exception { 36657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 36757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jarFile = new JarFile(new File(resources, jarName)); 36857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertEquals("Error in returned entry", 311, jarFile.getEntry( 36957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson entryName).getSize()); 37057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.close(); 37157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 37257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // tests for signed jars 37357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // test all signed jars in the /Testres/Internal/SignedJars directory 37457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String jarDirUrl = Support_Resources 37557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson .getResourceURL("/../internalres/signedjars"); 37657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Vector<String> signedJars = new Vector<String>(); 37757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 37857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream is = new URL(jarDirUrl + "/jarlist.txt").openStream(); 37957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson while (is.available() > 0) { 38057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson StringBuilder linebuff = new StringBuilder(80); // Typical line 38157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // length 38257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson done: while (true) { 38357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int nextByte = is.read(); 38457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson switch (nextByte) { 38557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case -1: 38657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 38757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case (byte) '\r': 38857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 38957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // ignore 39057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 39157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 39257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case (byte) '\n': 39357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 39457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // ignore 39557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 39657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 39757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson default: 39857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson linebuff.append((char) nextByte); 39957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 40057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 40157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 40257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break; 40357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 40457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String line = linebuff.toString(); 40557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson signedJars.add(line); 40657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 40757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 40857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IOException e) { 40957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // no list of jars found 41057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 41157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 41257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (int i = 0; i < signedJars.size(); i++) { 41357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String jarName = signedJars.get(i); 41457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 41557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File file = Support_Resources.getExternalLocalFile(jarDirUrl 41657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + "/" + jarName); 41757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile = new JarFile(file, true); 41857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson boolean foundCerts = false; 41957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Enumeration<JarEntry> e = jarFile.entries(); 42057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson while (e.hasMoreElements()) { 42157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry entry = e.nextElement(); 42257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream is = jarFile.getInputStream(entry); 42357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.skip(100000); 42457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 42557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Certificate[] certs = entry.getCertificates(); 42657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (certs != null && certs.length > 0) { 42757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson foundCerts = true; 42857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break; 42957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 43057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 43157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue( 43257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson "No certificates found during signed jar test for jar \"" 43357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + jarName + "\"", foundCerts); 43457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IOException e) { 43557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during signed jar test for jar \"" + jarName 43657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + "\": " + e.toString()); 43757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 43857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 43957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 44057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 442229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getManifest() 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getManifest() { 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Test for method java.util.jar.Manifest 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // java.util.jar.JarFile.getManifest() 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Error--Manifest not returned", jarFile.getManifest()); 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 1st test: " + e.toString()); 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName2); 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName2)); 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNull("Error--should have returned null", jarFile 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 2nd test: " + e.toString()); 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // jarName3 was created using the following test 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName3); 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName3)); 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Should find manifest without verifying", jarFile 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 3rd test: " + e.toString()); 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this is used to create jarName3 used in the previous test 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Manifest manifest = new Manifest(); 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Attributes attributes = manifest.getMainAttributes(); 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributes.put(new Attributes.Name("Manifest-Version"), "1.0"); 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream manOut = new ByteArrayOutputStream(); 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project manifest.write(manOut); 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] manBytes = manOut.toByteArray(); 48419745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamath File file = File.createTempFile("hyts_manifest1", ".jar"); 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarOutputStream jarOut = new JarOutputStream(new FileOutputStream( 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file.getAbsolutePath())); 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry entry = new ZipEntry("META-INF/"); 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(0); 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = new ZipEntry(JarFile.MANIFEST_NAME); 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(manBytes.length); 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.write(manBytes); 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = new ZipEntry("myfile"); 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(1); 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.write(65); 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.close(); 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(file.getAbsolutePath(), false); 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Should find manifest without verifying", jar 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jar.close(); 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file.delete(); 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IOException 3"); 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName2); 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jF = new JarFile(new File(resources, jarName2)); 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jF.close(); 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jF.getManifest(); 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("FAILED: expected IllegalStateException"); 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ise) { 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected; 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 4th test: " + e.toString()); 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, "Broken_manifest.jar"); 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jf; 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jf = new JarFile(new File(resources, "Broken_manifest.jar")); 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jf.getManifest(); 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IOException expected."); 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected. 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 531229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry) 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 533703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // This test doesn't pass on RI. If entry size is set up incorrectly, 534703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // SecurityException is thrown. But SecurityException is thrown on RI only 535703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // if jar file is signed incorrectly. 53652c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root public void test_getInputStreamLjava_util_jar_JarEntry_subtest0() throws Exception { 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project File signedFile = null; 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName4); 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signedFile = new File(resources, jarName4); 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Failed to create local file 2: " + e); 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.read(); 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 3: " + e); 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] dummy = getAllBytesFromStream(in); 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNull("found certificates", entry.getCertificates()); 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 4: " + e); 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 56557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(1076); 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] dummy = getAllBytesFromStream(in); 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("SecurityException should be thrown."); 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 5: " + e); 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName5); 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signedFile = new File(resources, jarName5); 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Failed to create local file 5: " + e); 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 58757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("SecurityException should be thrown."); 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 5: " + e); 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 598bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 599bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root // SHA1 digest, SHA256withRSA signed JAR 60052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName6); 601bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 602bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root // SHA-256 digest, SHA256withRSA signed JAR 60352c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName7); 604bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 60552c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root // SHA-512 digest, SHA512withECDSA signed JAR 60652c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName8); 6073de7083091497358d003bb889eba909f85b69fadKenny Root 6083de7083091497358d003bb889eba909f85b69fadKenny Root // JAR with a signature that has PKCS#7 Authenticated Attributes 6093de7083091497358d003bb889eba909f85b69fadKenny Root checkSignedJar(authAttrsJar); 61052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root } 61152c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 612bda6980df389e16edf907e5c516ee21e9e92883eKenny Root /** 613bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * This test uses a jar file signed with an algorithm that has its own OID 614bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * that is valid as a signature type. SHA256withECDSA is an algorithm that 615bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * isn't combined as DigestAlgorithm + "with" + DigestEncryptionAlgorithm 616bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * like RSAEncryption needs to be. 617bda6980df389e16edf907e5c516ee21e9e92883eKenny Root */ 618bda6980df389e16edf907e5c516ee21e9e92883eKenny Root public void testJarFile_Signed_Valid_DigestEncryptionAlgorithm() throws Exception { 619bda6980df389e16edf907e5c516ee21e9e92883eKenny Root checkSignedJar(jarName9); 620bda6980df389e16edf907e5c516ee21e9e92883eKenny Root } 621bda6980df389e16edf907e5c516ee21e9e92883eKenny Root 62252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root private void checkSignedJar(String jarName) throws Exception { 62352c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root Support_Resources.copyFile(resources, null, jarName); 62452c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 62552c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root File file = new File(resources, jarName); 626bda6980df389e16edf907e5c516ee21e9e92883eKenny Root boolean foundCerts = false; 62752c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 62852c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root JarFile jarFile = new JarFile(file, true); 629bda6980df389e16edf907e5c516ee21e9e92883eKenny Root try { 63052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 631bda6980df389e16edf907e5c516ee21e9e92883eKenny Root Enumeration<JarEntry> e = jarFile.entries(); 632bda6980df389e16edf907e5c516ee21e9e92883eKenny Root while (e.hasMoreElements()) { 633bda6980df389e16edf907e5c516ee21e9e92883eKenny Root JarEntry entry = e.nextElement(); 634bda6980df389e16edf907e5c516ee21e9e92883eKenny Root InputStream is = jarFile.getInputStream(entry); 635bda6980df389e16edf907e5c516ee21e9e92883eKenny Root is.skip(100000); 636bda6980df389e16edf907e5c516ee21e9e92883eKenny Root is.close(); 637bda6980df389e16edf907e5c516ee21e9e92883eKenny Root Certificate[] certs = entry.getCertificates(); 638bda6980df389e16edf907e5c516ee21e9e92883eKenny Root if (certs != null && certs.length > 0) { 639bda6980df389e16edf907e5c516ee21e9e92883eKenny Root foundCerts = true; 640bda6980df389e16edf907e5c516ee21e9e92883eKenny Root break; 641bda6980df389e16edf907e5c516ee21e9e92883eKenny Root } 64252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root } 643bda6980df389e16edf907e5c516ee21e9e92883eKenny Root } finally { 644bda6980df389e16edf907e5c516ee21e9e92883eKenny Root jarFile.close(); 645bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root } 64652c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 64752c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root assertTrue( 64852c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root "No certificates found during signed jar test for jar \"" 64952c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root + jarName + "\"", foundCerts); 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 652d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root private static class Results { 653d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root public Certificate[] certificates; 654d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root public CodeSigner[] signers; 655d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root } 656d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root 657d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root private Results getSignedJarCerts(String jarName, boolean chainCheck) throws Exception { 658cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root Support_Resources.copyFile(resources, null, jarName); 659cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 660cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root File file = new File(resources, jarName); 661d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root Results results = new Results(); 662cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 663cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root JarFile jarFile = new JarFile(file, true, ZipFile.OPEN_READ, chainCheck); 664cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root try { 665cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 666cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root Enumeration<JarEntry> e = jarFile.entries(); 667cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root while (e.hasMoreElements()) { 668cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root JarEntry entry = e.nextElement(); 669cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root InputStream is = jarFile.getInputStream(entry); 670cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root // Skip bytes because we have to read the entire file for it to read signatures. 671cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root is.skip(entry.getSize()); 672cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root is.close(); 673cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root Certificate[] certs = entry.getCertificates(); 674d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root CodeSigner[] signers = entry.getCodeSigners(); 675cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root if (certs != null && certs.length > 0) { 676d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root results.certificates = certs; 677d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root results.signers = signers; 678cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root break; 679cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 680cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 681cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } finally { 682cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root jarFile.close(); 683cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 684cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 685d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root return results; 686cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 687cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 688cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root public void testJarFile_Signed_ValidChain_NoCheck() throws Exception { 689d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root Results result = getSignedJarCerts(VALID_CHAIN_JAR, false); 690d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertNotNull(result); 691d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.certificates), 2, result.certificates.length); 692d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length); 693d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(2, result.signers[0].getSignerCertPath().getCertificates().size()); 694cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 695cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 696cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root public void testJarFile_Signed_ValidChain_Check() throws Exception { 697d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root Results result = getSignedJarCerts(VALID_CHAIN_JAR, true); 698d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertNotNull(result); 699d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.certificates), 2, result.certificates.length); 700d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length); 701d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(2, result.signers[0].getSignerCertPath().getCertificates().size()); 702cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 703cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 704cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root public void testJarFile_Signed_InvalidChain_NoCheck() throws Exception { 705d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root Results result = getSignedJarCerts(INVALID_CHAIN_JAR, false); 706d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertNotNull(result); 707d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.certificates), 2, result.certificates.length); 708d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length); 709d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(2, result.signers[0].getSignerCertPath().getCertificates().size()); 710cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 711cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 712cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root public void testJarFile_Signed_InvalidChain_Check() throws Exception { 713d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root Results result = getSignedJarCerts(INVALID_CHAIN_JAR, true); 714d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertNotNull(result); 715d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.certificates), 1, result.certificates.length); 716d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length); 717d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(1, result.signers[0].getSignerCertPath().getCertificates().size()); 718cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 719cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 720a3d40b4064c0f4de77122eff9253da242877c938Kenny Root public void testJarFile_Signed_AmbiguousSigners() throws Exception { 721a3d40b4064c0f4de77122eff9253da242877c938Kenny Root Results result = getSignedJarCerts(AMBIGUOUS_SIGNERS_JAR, false); 722a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertNotNull(result); 723a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(Arrays.deepToString(result.certificates), 2, result.certificates.length); 724a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(Arrays.deepToString(result.signers), 2, result.signers.length); 725a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(1, result.signers[0].getSignerCertPath().getCertificates().size()); 726a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(1, result.signers[1].getSignerCertPath().getCertificates().size()); 727a3d40b4064c0f4de77122eff9253da242877c938Kenny Root } 728a3d40b4064c0f4de77122eff9253da242877c938Kenny Root 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The jar created by 1.4 which does not provide a 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm-Digest-Manifest-Main-Attributes entry in .SF file. 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_Jar_created_before_java_5() throws IOException { 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Created_by_1_4.jar"; 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* The jar is intact, then everything is all right. */ 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Integrate_Jar() throws IOException { 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Integrate.jar"; 748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 75457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 75557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 75657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 75757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 75857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 75957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * The jar is intact, but the entry object is modified. 76057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 76157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testJarVerificationModifiedEntry() throws IOException { 76257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, integrateJar); 76357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File f = new File(resources, integrateJar); 76457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 76557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jarFile = new JarFile(f); 76657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson ZipEntry zipEntry = jarFile.getJarEntry(integrateJarEntry); 76757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry.setSize(zipEntry.getSize() + 1); 76857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 76957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 77057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile = new JarFile(f); 77157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry = jarFile.getJarEntry(integrateJarEntry); 77257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry.setSize(zipEntry.getSize() - 1); 77357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 77457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson //jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 77557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).read(new byte[5000], 0, 5000); 77657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 77757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (SecurityException e) { 77857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // desired 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If another entry is inserted into Manifest, no security exception will be 784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown out. 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_InsertEntry_in_Manifest_Jar() throws IOException { 787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Inserted_Entry_Manifest.jar"; 788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int count = 0; 793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count++; 798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(5, count); 800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If another entry is inserted into Manifest, no security exception will be 804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown out. 805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_Inserted_Entry_Manifest_with_DigestCode() 807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Inserted_Entry_Manifest_with_DigestCode.jar"; 809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int count = 0; 814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count++; 818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(5, count); 820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The content of Test.class is modified, jarFile.getInputStream will not 824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * throw security Exception, but it will anytime before the inputStream got 825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from getInputStream method has been read to end. 826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Class() throws IOException { 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Class.jar"; 829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* The content of Test.class has been tampered. */ 838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = jarFile.getEntry("Test.class"); 839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jarFile.getInputStream(zipEntry); 840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] buffer = new byte[1024]; 841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (in.available() > 0) { 843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.read(buffer); 844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 84557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * In the Modified.jar, the main attributes of META-INF/MANIFEST.MF is 853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * tampered manually. Hence the RI 5.0 JarFile.getInputStream of any 85457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * JarEntry will throw security exception. 855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Manifest_MainAttributes() 857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Manifest_MainAttributes.jar"; 859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 86757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * It is all right in our original JarFile. If the Entry Attributes, for 876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example Test.class in our jar, the jarFile.getInputStream will throw 877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Security Exception. 878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Manifest_EntryAttributes() 880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Manifest_EntryAttributes.jar"; 882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("should throw Security Exception"); 891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the content of the .SA file is modified, no matter what it resides, 899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * JarFile.getInputStream of any JarEntry will throw Security Exception. 900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_SF_EntryAttributes() throws IOException { 902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_SF_EntryAttributes.jar"; 903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("should throw Security Exception"); 912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_close() throws IOException { 919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_SF_EntryAttributes.jar"; 920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Can not check IOException 929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 93057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 93157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 93257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * @throws IOException 933229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry) 93457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 93557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void test_getInputStreamLjava_util_jar_JarEntry() throws IOException { 93657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File localFile = null; 93757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 93857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 93957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson localFile = new File(resources, jarName); 94057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 94157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Failed to create local file: " + e); 94257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 94357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 94457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson byte[] b = new byte[1024]; 94557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 94657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(localFile); 94757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson java.io.InputStream is = jf.getInputStream(jf.getEntry(entryName)); 94857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // BEGIN android-removed 94957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // jf.close(); 95057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // END android-removed 95157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue("Returned invalid stream", is.available() > 0); 95257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int r = is.read(b, 0, 1024); 95357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 95457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson StringBuffer sb = new StringBuffer(r); 95557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (int i = 0; i < r; i++) { 95657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson sb.append((char) (b[i] & 0xff)); 95757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 95857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String contents = sb.toString(); 95957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue("Incorrect stream read", contents.indexOf("bar") > 0); 96057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // BEGIN android-added 96157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.close(); 96257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // END android-added 96357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 96457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during test: " + e.toString()); 96557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 96657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 96757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 96857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(localFile); 96957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream in = jf.getInputStream(new JarEntry("invalid")); 97057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertNull("Got stream for non-existent entry", in); 97157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 97257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during test 2: " + e); 97357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 97457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 97557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 97657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 97757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File signedFile = new File(resources, jarName); 97857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(signedFile); 97957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry jre = new JarEntry("foo/bar/A.class"); 98057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.getInputStream(jre); 98157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // InputStream returned in any way, exception can be thrown in case 98257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // of reading from this stream only. 98357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // fail("Should throw ZipException"); 98457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (ZipException ee) { 98557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // expected 98657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 98757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 98857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 98957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 99057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File signedFile = new File(resources, jarName); 99157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(signedFile); 99257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry jre = new JarEntry("foo/bar/A.class"); 99357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.close(); 99457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.getInputStream(jre); 99557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // InputStream returned in any way, exception can be thrown in case 99657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // of reading from this stream only. 99757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // The same for IOException 99857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Should throw IllegalStateException"); 99957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IllegalStateException ee) { 100057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // expected 100157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 100257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 1003d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1004d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob /** 1005d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob * The jar is intact, but the entry object is modified. 1006d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob */ 1007703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // Regression test for issue introduced by HARMONY-4569: signed archives containing files with size 0 could not get verified. 1008d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob public void testJarVerificationEmptyEntry() throws IOException { 1009d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob Support_Resources.copyFile(resources, null, emptyEntryJar); 1010d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob File f = new File(resources, emptyEntryJar); 1011d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1012d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob JarFile jarFile = new JarFile(f); 1013d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1014d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob ZipEntry zipEntry = jarFile.getJarEntry(emptyEntry1); 1015d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob int res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); 1016d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 1017d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1018d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob zipEntry = jarFile.getJarEntry(emptyEntry2); 1019d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); 1020d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 1021d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1022d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob zipEntry = jarFile.getJarEntry(emptyEntry3); 1023d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob res = jarFile.getInputStream(zipEntry).read(); 1024d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 1025d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob } 1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 1027