JarFileTest.java revision 119d05942e760b078fd8ac1ea133918ec15b8dbe
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; 2700bf89dd858de6c7eaca555210ba429a89193722Kenny Rootimport java.security.InvalidKeyException; 2800bf89dd858de6c7eaca555210ba429a89193722Kenny Rootimport java.security.InvalidParameterException; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Permission; 3000bf89dd858de6c7eaca555210ba429a89193722Kenny Rootimport java.security.PrivateKey; 3100bf89dd858de6c7eaca555210ba429a89193722Kenny Rootimport java.security.Provider; 3200bf89dd858de6c7eaca555210ba429a89193722Kenny Rootimport java.security.PublicKey; 3300bf89dd858de6c7eaca555210ba429a89193722Kenny Rootimport java.security.Security; 3400bf89dd858de6c7eaca555210ba429a89193722Kenny Rootimport java.security.SignatureException; 3500bf89dd858de6c7eaca555210ba429a89193722Kenny Rootimport java.security.SignatureSpi; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate; 3792408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Rootimport java.security.cert.X509Certificate; 38cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Rootimport java.util.Arrays; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Enumeration; 40ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Rootimport java.util.List; 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector; 42ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Rootimport java.util.concurrent.Callable; 43ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Rootimport java.util.concurrent.ExecutorService; 44ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Rootimport java.util.concurrent.Executors; 45ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Rootimport java.util.concurrent.Future; 46ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Rootimport java.util.concurrent.TimeUnit; 47ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Rootimport java.util.concurrent.TimeoutException; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Attributes; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarEntry; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarFile; 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarOutputStream; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Manifest; 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipEntry; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipException; 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipFile; 5619745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamathimport junit.framework.TestCase; 5719745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamathimport tests.support.resource.Support_Resources; 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class JarFileTest extends TestCase { 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] getAllBytesFromStream(InputStream is) throws IOException { 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream bs = new ByteArrayOutputStream(); 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] buf = new byte[666]; 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int iRead; 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int off; 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (is.available() > 0) { 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project iRead = is.read(buf, 0, buf.length); 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (iRead > 0) bs.write(buf, 0, iRead); 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return bs.toByteArray(); 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName = "hyts_patch.jar"; // a 'normal' jar file 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName2 = "hyts_patch2.jar"; 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName3 = "hyts_manifest1.jar"; 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName4 = "hyts_signed.jar"; 8457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName5 = "hyts_signed_inc.jar"; 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 87bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root private final String jarName6 = "hyts_signed_sha256withrsa.jar"; 88bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 89bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root private final String jarName7 = "hyts_signed_sha256digest_sha256withrsa.jar"; 90bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 9152c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root private final String jarName8 = "hyts_signed_sha512digest_sha512withecdsa.jar"; 9252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 93bda6980df389e16edf907e5c516ee21e9e92883eKenny Root private final String jarName9 = "hyts_signed_sha256digest_sha256withecdsa.jar"; 94bda6980df389e16edf907e5c516ee21e9e92883eKenny Root 953de7083091497358d003bb889eba909f85b69fadKenny Root private final String authAttrsJar = "hyts_signed_authAttrs.jar"; 963de7083091497358d003bb889eba909f85b69fadKenny Root 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String entryName = "foo/bar/A.class"; 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String entryName3 = "coucou/FileAccess.class"; 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String integrateJar = "Integrate.jar"; 102d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 10357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson private final String integrateJarEntry = "Test.class"; 10457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 105d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntryJar = "EmptyEntries_signed.jar"; 106d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 107ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root /* 108ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * /usr/bin/openssl genrsa 2048 > root1.pem 109ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * /usr/bin/openssl req -new -key root1.pem -out root1.csr -subj '/CN=root1' 110ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * /usr/bin/openssl x509 -req -days 3650 -in root1.csr -signkey root1.pem -out root1.crt 111ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * /usr/bin/openssl genrsa 2048 > root2.pem 112ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * /usr/bin/openssl req -new -key root2.pem -out root2.csr -subj '/CN=root2' 113ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * echo 4000 > root1.srl 114ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * echo 8000 > root2.srl 115ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * /usr/bin/openssl x509 -req -days 3650 -in root2.csr -CA root1.crt -CAkey root1.pem -out root2.crt 116ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * /usr/bin/openssl x509 -req -days 3650 -in root1.csr -CA root2.crt -CAkey root2.pem -out root1.crt 117ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * /usr/bin/openssl genrsa 2048 > signer.pem 118ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * /usr/bin/openssl req -new -key signer.pem -out signer.csr -subj '/CN=signer' 119ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * /usr/bin/openssl x509 -req -days 3650 -in signer.csr -CA root1.crt -CAkey root1.pem -out signer.crt 120ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * /usr/bin/openssl pkcs12 -inkey signer.pem -in signer.crt -export -out signer.p12 -name signer -passout pass:certloop 121ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * keytool -importkeystore -srckeystore signer.p12 -srcstoretype PKCS12 -destkeystore signer.jks -srcstorepass certloop -deststorepass certloop 122ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * cat signer.crt root1.crt root2.crt > chain.crt 123ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * zip -d hyts_certLoop.jar 'META-INF/*' 124ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * jarsigner -keystore signer.jks -certchain chain.crt -storepass certloop hyts_certLoop.jar signer 125ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root */ 126ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root private final String certLoopJar = "hyts_certLoop.jar"; 127ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root 128d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry1 = "subfolder/internalSubset01.js"; 129d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 130d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry2 = "svgtest.js"; 131d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 132d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry3 = "svgunit.js"; 133d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 134cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root private static final String VALID_CHAIN_JAR = "hyts_signed_validChain.jar"; 135cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 136cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root private static final String INVALID_CHAIN_JAR = "hyts_signed_invalidChain.jar"; 137cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 138a3d40b4064c0f4de77122eff9253da242877c938Kenny Root private static final String AMBIGUOUS_SIGNERS_JAR = "hyts_signed_ambiguousSignerArray.jar"; 139a3d40b4064c0f4de77122eff9253da242877c938Kenny Root 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private File resources; 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // custom security manager 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = new SecurityManager() { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final String forbidenPermissionName = "user.dir"; 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void checkPermission(Permission perm) { 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (perm.getName().equals(forbidenPermissionName)) { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SecurityException(); 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void setUp() { 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resources = Support_Resources.createTempFolder(); 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 159229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File) 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_File() { 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file")); 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 178229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String) 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_lang_String() { 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile("Wrong.file"); 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String fileName = (new File(resources, jarName)).getCanonicalPath(); 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(fileName); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 198229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String, boolean) 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_lang_StringZ() { 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile("Wrong.file", false); 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String fileName = (new File(resources, jarName)).getCanonicalPath(); 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(fileName, true); 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 218229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File, boolean) 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_FileZ() { 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file"), true); 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName), false); 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 237229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File, boolean, int) 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_FileZI() { 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file"), true, 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.OPEN_READ); 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName), false, 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.OPEN_READ); 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName), false, 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.OPEN_READ | ZipFile.OPEN_DELETE + 33); 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IllegalArgumentException"); 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalArgumentException e) { 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 26957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * Constructs JarFile object. 27057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * 271229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File) 272229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String) 27357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 27457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testConstructor_file() throws IOException { 27557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File f = new File(resources, jarName); 27657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 27757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue(new JarFile(f).getEntry(entryName).getName().equals( 27857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson entryName)); 27957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue(new JarFile(f.getPath()).getEntry(entryName).getName() 28057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson .equals(entryName)); 28157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 28257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 28357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 284229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#entries() 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_entries() throws Exception { 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note only (and all of) the following should be contained in the file 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * META-INF/ META-INF/MANIFEST.MF foo/ foo/bar/ foo/bar/A.class Blah.txt 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> e = jarFile.entries(); 29457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int i; 29557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (i = 0; e.hasMoreElements(); i++) { 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project e.nextElement(); 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 29857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertEquals(jarFile.size(), i); 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(6, i); 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_entries2() throws Exception { 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration.hasMoreElements(); 31057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("hasMoreElements() did not detect a closed jar file"); 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException e) { 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile = new JarFile(new File(resources, jarName)); 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration.nextElement(); 31957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("nextElement() did not detect closed jar file"); 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException e) { 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_getEntryLjava_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.getEntry( 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.getEntry(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.getEntry(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 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 363229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getJarEntryLjava_lang_String() throws IOException { 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Error in returned entry", 311, jarFile.getJarEntry( 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entryName).getSize()); 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test: " + e.toString()); 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (enumeration.hasMoreElements()) { 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getJarEntry(je.getName()); 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getJarEntry(je.getName()); 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fail("IllegalStateException expected."); 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ee) { // Per documentation exception 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // may be thrown. 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 39857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 39957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 400229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 40157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 40257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testGetJarEntry() throws Exception { 40357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 40457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jarFile = new JarFile(new File(resources, jarName)); 40557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertEquals("Error in returned entry", 311, jarFile.getEntry( 40657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson entryName).getSize()); 40757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.close(); 40857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 40957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // tests for signed jars 41057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // test all signed jars in the /Testres/Internal/SignedJars directory 41157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String jarDirUrl = Support_Resources 41257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson .getResourceURL("/../internalres/signedjars"); 41357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Vector<String> signedJars = new Vector<String>(); 41457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 41557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream is = new URL(jarDirUrl + "/jarlist.txt").openStream(); 41657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson while (is.available() > 0) { 41757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson StringBuilder linebuff = new StringBuilder(80); // Typical line 41857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // length 41957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson done: while (true) { 42057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int nextByte = is.read(); 42157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson switch (nextByte) { 42257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case -1: 42357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 42457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case (byte) '\r': 42557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 42657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // ignore 42757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 42857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 42957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case (byte) '\n': 43057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 43157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // ignore 43257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 43357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 43457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson default: 43557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson linebuff.append((char) nextByte); 43657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 43757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 43857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 43957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break; 44057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 44157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String line = linebuff.toString(); 44257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson signedJars.add(line); 44357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 44457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 44557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IOException e) { 44657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // no list of jars found 44757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 44857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 44957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (int i = 0; i < signedJars.size(); i++) { 45057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String jarName = signedJars.get(i); 45157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 45257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File file = Support_Resources.getExternalLocalFile(jarDirUrl 45357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + "/" + jarName); 45457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile = new JarFile(file, true); 45557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson boolean foundCerts = false; 45657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Enumeration<JarEntry> e = jarFile.entries(); 45757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson while (e.hasMoreElements()) { 45857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry entry = e.nextElement(); 45957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream is = jarFile.getInputStream(entry); 46057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.skip(100000); 46157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 46257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Certificate[] certs = entry.getCertificates(); 46357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (certs != null && certs.length > 0) { 46457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson foundCerts = true; 46557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break; 46657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 46757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 46857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue( 46957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson "No certificates found during signed jar test for jar \"" 47057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + jarName + "\"", foundCerts); 47157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IOException e) { 47257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during signed jar test for jar \"" + jarName 47357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + "\": " + e.toString()); 47457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 47557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 47657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 47757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 479229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getManifest() 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getManifest() { 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Test for method java.util.jar.Manifest 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // java.util.jar.JarFile.getManifest() 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Error--Manifest not returned", jarFile.getManifest()); 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 1st test: " + e.toString()); 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName2); 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName2)); 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNull("Error--should have returned null", jarFile 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 2nd test: " + e.toString()); 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // jarName3 was created using the following test 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName3); 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName3)); 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Should find manifest without verifying", jarFile 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 3rd test: " + e.toString()); 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this is used to create jarName3 used in the previous test 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Manifest manifest = new Manifest(); 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Attributes attributes = manifest.getMainAttributes(); 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributes.put(new Attributes.Name("Manifest-Version"), "1.0"); 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream manOut = new ByteArrayOutputStream(); 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project manifest.write(manOut); 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] manBytes = manOut.toByteArray(); 52119745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamath File file = File.createTempFile("hyts_manifest1", ".jar"); 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarOutputStream jarOut = new JarOutputStream(new FileOutputStream( 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file.getAbsolutePath())); 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry entry = new ZipEntry("META-INF/"); 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(0); 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = new ZipEntry(JarFile.MANIFEST_NAME); 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(manBytes.length); 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.write(manBytes); 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = new ZipEntry("myfile"); 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(1); 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.write(65); 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.close(); 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(file.getAbsolutePath(), false); 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Should find manifest without verifying", jar 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jar.close(); 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file.delete(); 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IOException 3"); 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName2); 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jF = new JarFile(new File(resources, jarName2)); 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jF.close(); 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jF.getManifest(); 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("FAILED: expected IllegalStateException"); 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ise) { 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected; 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 4th test: " + e.toString()); 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, "Broken_manifest.jar"); 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jf; 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jf = new JarFile(new File(resources, "Broken_manifest.jar")); 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jf.getManifest(); 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IOException expected."); 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected. 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 568229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry) 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 570703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // This test doesn't pass on RI. If entry size is set up incorrectly, 571703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // SecurityException is thrown. But SecurityException is thrown on RI only 572703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // if jar file is signed incorrectly. 57352c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root public void test_getInputStreamLjava_util_jar_JarEntry_subtest0() throws Exception { 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project File signedFile = null; 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName4); 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signedFile = new File(resources, jarName4); 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Failed to create local file 2: " + e); 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.read(); 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 3: " + e); 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] dummy = getAllBytesFromStream(in); 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNull("found certificates", entry.getCertificates()); 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 4: " + e); 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 605119d05942e760b078fd8ac1ea133918ec15b8dbeYi Kong JarEntry entry = jar.getJarEntry(entryName3); 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(1076); 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] dummy = getAllBytesFromStream(in); 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("SecurityException should be thrown."); 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 5: " + e); 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName5); 620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signedFile = new File(resources, jarName5); 621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Failed to create local file 5: " + e); 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 62457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("SecurityException should be thrown."); 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 5: " + e); 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 635bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 636bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root // SHA1 digest, SHA256withRSA signed JAR 63752c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName6); 638bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 639bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root // SHA-256 digest, SHA256withRSA signed JAR 64052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName7); 641bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 64252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root // SHA-512 digest, SHA512withECDSA signed JAR 64352c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName8); 6443de7083091497358d003bb889eba909f85b69fadKenny Root 6453de7083091497358d003bb889eba909f85b69fadKenny Root // JAR with a signature that has PKCS#7 Authenticated Attributes 6463de7083091497358d003bb889eba909f85b69fadKenny Root checkSignedJar(authAttrsJar); 647ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root 648ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root // JAR with certificates that loop 649ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root checkSignedJar(certLoopJar, 3); 65052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root } 65152c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 652bda6980df389e16edf907e5c516ee21e9e92883eKenny Root /** 653bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * This test uses a jar file signed with an algorithm that has its own OID 654bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * that is valid as a signature type. SHA256withECDSA is an algorithm that 655bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * isn't combined as DigestAlgorithm + "with" + DigestEncryptionAlgorithm 656bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * like RSAEncryption needs to be. 657bda6980df389e16edf907e5c516ee21e9e92883eKenny Root */ 658bda6980df389e16edf907e5c516ee21e9e92883eKenny Root public void testJarFile_Signed_Valid_DigestEncryptionAlgorithm() throws Exception { 659bda6980df389e16edf907e5c516ee21e9e92883eKenny Root checkSignedJar(jarName9); 660bda6980df389e16edf907e5c516ee21e9e92883eKenny Root } 661bda6980df389e16edf907e5c516ee21e9e92883eKenny Root 662ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root /** 663ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * Checks that a JAR is signed correctly with a signature length of 1. 664ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root */ 66552c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root private void checkSignedJar(String jarName) throws Exception { 666ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root checkSignedJar(jarName, 1); 667ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root } 66852c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 669ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root /** 670ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * Checks that a JAR is signed correctly with a signature length of sigLength. 671ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root */ 672ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root private void checkSignedJar(String jarName, final int sigLength) throws Exception { 673ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root Support_Resources.copyFile(resources, null, jarName); 67452c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 675ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root final File file = new File(resources, jarName); 676ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root 677ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root ExecutorService executor = Executors.newSingleThreadExecutor(); 678ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root Future<Boolean> future = executor.submit(new Callable<Boolean>() { 679ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root @Override 680ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root public Boolean call() throws Exception { 681ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root JarFile jarFile = new JarFile(file, true); 682ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root try { 683ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root Enumeration<JarEntry> e = jarFile.entries(); 684ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root while (e.hasMoreElements()) { 685ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root JarEntry entry = e.nextElement(); 686ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root InputStream is = jarFile.getInputStream(entry); 687ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root is.skip(100000); 688ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root is.close(); 689ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root Certificate[] certs = entry.getCertificates(); 690ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root if (certs != null && certs.length > 0) { 691ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root assertEquals(sigLength, certs.length); 692ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root return true; 693ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root } 694ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root } 695ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root return false; 696ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root } finally { 697ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root jarFile.close(); 698bda6980df389e16edf907e5c516ee21e9e92883eKenny Root } 69952c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root } 700ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root }); 701ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root executor.shutdown(); 702ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root final boolean foundCerts; 703ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root try { 704ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root foundCerts = future.get(10, TimeUnit.SECONDS); 705ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root } catch (TimeoutException e) { 706ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root fail("Could not finish building chain; possibly confused by loops"); 707ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root return; // Not actually reached. 708bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root } 70952c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 71052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root assertTrue( 71152c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root "No certificates found during signed jar test for jar \"" 71252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root + jarName + "\"", foundCerts); 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 715d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root private static class Results { 716d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root public Certificate[] certificates; 717d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root public CodeSigner[] signers; 718d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root } 719d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root 720fe821d0a3d96518107489e22b37f664632472c41Kenny Root private Results getSignedJarCerts(String jarName) throws Exception { 721cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root Support_Resources.copyFile(resources, null, jarName); 722cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 723cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root File file = new File(resources, jarName); 724d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root Results results = new Results(); 725cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 726fe821d0a3d96518107489e22b37f664632472c41Kenny Root JarFile jarFile = new JarFile(file, true, ZipFile.OPEN_READ); 727cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root try { 728cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 729cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root Enumeration<JarEntry> e = jarFile.entries(); 730cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root while (e.hasMoreElements()) { 731cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root JarEntry entry = e.nextElement(); 732cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root InputStream is = jarFile.getInputStream(entry); 733cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root // Skip bytes because we have to read the entire file for it to read signatures. 734cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root is.skip(entry.getSize()); 735cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root is.close(); 736cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root Certificate[] certs = entry.getCertificates(); 737d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root CodeSigner[] signers = entry.getCodeSigners(); 738cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root if (certs != null && certs.length > 0) { 739d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root results.certificates = certs; 740d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root results.signers = signers; 741cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root break; 742cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 743cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 744cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } finally { 745cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root jarFile.close(); 746cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 747cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 748d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root return results; 749cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 750cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 751fe821d0a3d96518107489e22b37f664632472c41Kenny Root public void testJarFile_Signed_ValidChain() throws Exception { 752fe821d0a3d96518107489e22b37f664632472c41Kenny Root Results result = getSignedJarCerts(VALID_CHAIN_JAR); 753d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertNotNull(result); 75433aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals(Arrays.deepToString(result.certificates), 3, result.certificates.length); 755d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length); 75633aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals(3, result.signers[0].getSignerCertPath().getCertificates().size()); 75733aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=fake-chain", ((X509Certificate) result.certificates[0]).getSubjectDN().toString()); 75833aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=intermediate1", ((X509Certificate) result.certificates[1]).getSubjectDN().toString()); 75933aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=root1", ((X509Certificate) result.certificates[2]).getSubjectDN().toString()); 760cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 761cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 762fe821d0a3d96518107489e22b37f664632472c41Kenny Root public void testJarFile_Signed_InvalidChain() throws Exception { 763fe821d0a3d96518107489e22b37f664632472c41Kenny Root Results result = getSignedJarCerts(INVALID_CHAIN_JAR); 764d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertNotNull(result); 76533aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals(Arrays.deepToString(result.certificates), 3, result.certificates.length); 766d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length); 76733aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals(3, result.signers[0].getSignerCertPath().getCertificates().size()); 76833aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=fake-chain", ((X509Certificate) result.certificates[0]).getSubjectDN().toString()); 76933aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=intermediate1", ((X509Certificate) result.certificates[1]).getSubjectDN().toString()); 77033aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=root1", ((X509Certificate) result.certificates[2]).getSubjectDN().toString()); 771cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 772cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 773a3d40b4064c0f4de77122eff9253da242877c938Kenny Root public void testJarFile_Signed_AmbiguousSigners() throws Exception { 774cdd4aae90277f2182420526c14b9d77a9e7f1203Kenny Root Results result = getSignedJarCerts(AMBIGUOUS_SIGNERS_JAR); 775a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertNotNull(result); 776a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(Arrays.deepToString(result.certificates), 2, result.certificates.length); 777a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(Arrays.deepToString(result.signers), 2, result.signers.length); 778a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(1, result.signers[0].getSignerCertPath().getCertificates().size()); 779a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(1, result.signers[1].getSignerCertPath().getCertificates().size()); 780a3d40b4064c0f4de77122eff9253da242877c938Kenny Root } 781a3d40b4064c0f4de77122eff9253da242877c938Kenny Root 782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The jar created by 1.4 which does not provide a 784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm-Digest-Manifest-Main-Attributes entry in .SF file. 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_Jar_created_before_java_5() throws IOException { 787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Created_by_1_4.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 while (entries.hasMoreElements()) { 793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* The jar is intact, then everything is all right. */ 799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Integrate_Jar() throws IOException { 800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Integrate.jar"; 801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 80757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 80857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 80957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 81057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 81157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 81257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * The jar is intact, but the entry object is modified. 81357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 81457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testJarVerificationModifiedEntry() throws IOException { 81557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, integrateJar); 81657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File f = new File(resources, integrateJar); 81757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 81857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jarFile = new JarFile(f); 81957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson ZipEntry zipEntry = jarFile.getJarEntry(integrateJarEntry); 82057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry.setSize(zipEntry.getSize() + 1); 82157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 82257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 82357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile = new JarFile(f); 82457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry = jarFile.getJarEntry(integrateJarEntry); 82557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry.setSize(zipEntry.getSize() - 1); 82657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 82757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson //jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 82857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).read(new byte[5000], 0, 5000); 82957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 83057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (SecurityException e) { 83157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // desired 832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If another entry is inserted into Manifest, no security exception will be 837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown out. 838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_InsertEntry_in_Manifest_Jar() throws IOException { 840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Inserted_Entry_Manifest.jar"; 841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int count = 0; 846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count++; 851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(5, count); 853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If another entry is inserted into Manifest, no security exception will be 857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown out. 858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_Inserted_Entry_Manifest_with_DigestCode() 860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Inserted_Entry_Manifest_with_DigestCode.jar"; 862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int count = 0; 867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count++; 871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(5, count); 873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The content of Test.class is modified, jarFile.getInputStream will not 877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * throw security Exception, but it will anytime before the inputStream got 878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from getInputStream method has been read to end. 879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Class() throws IOException { 881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Class.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 jarFile.getInputStream(zipEntry); 889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* The content of Test.class has been tampered. */ 891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = jarFile.getEntry("Test.class"); 892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jarFile.getInputStream(zipEntry); 893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] buffer = new byte[1024]; 894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (in.available() > 0) { 896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.read(buffer); 897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 89857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * In the Modified.jar, the main attributes of META-INF/MANIFEST.MF is 906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * tampered manually. Hence the RI 5.0 JarFile.getInputStream of any 90757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * JarEntry will throw security exception. 908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Manifest_MainAttributes() 910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Manifest_MainAttributes.jar"; 912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 92057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * It is all right in our original JarFile. If the Entry Attributes, for 929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example Test.class in our jar, the jarFile.getInputStream will throw 930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Security Exception. 931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Manifest_EntryAttributes() 933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Manifest_EntryAttributes.jar"; 935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("should throw Security Exception"); 944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the content of the .SA file is modified, no matter what it resides, 952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * JarFile.getInputStream of any JarEntry will throw Security Exception. 953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_SF_EntryAttributes() throws IOException { 955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_SF_EntryAttributes.jar"; 956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("should throw Security Exception"); 965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_close() throws IOException { 972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_SF_EntryAttributes.jar"; 973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Can not check IOException 982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 98357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 98457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 98557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * @throws IOException 986229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry) 98757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 98857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void test_getInputStreamLjava_util_jar_JarEntry() throws IOException { 98957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File localFile = null; 99057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 99157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 99257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson localFile = new File(resources, jarName); 99357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 99457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Failed to create local file: " + e); 99557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 99657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 99757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson byte[] b = new byte[1024]; 99857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 99957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(localFile); 100057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson java.io.InputStream is = jf.getInputStream(jf.getEntry(entryName)); 100157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // BEGIN android-removed 100257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // jf.close(); 100357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // END android-removed 100457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue("Returned invalid stream", is.available() > 0); 100557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int r = is.read(b, 0, 1024); 100657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 100757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson StringBuffer sb = new StringBuffer(r); 100857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (int i = 0; i < r; i++) { 100957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson sb.append((char) (b[i] & 0xff)); 101057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 101157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String contents = sb.toString(); 101257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue("Incorrect stream read", contents.indexOf("bar") > 0); 101357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // BEGIN android-added 101457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.close(); 101557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // END android-added 101657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 101757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during test: " + e.toString()); 101857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 101957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 102057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 102157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(localFile); 102257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream in = jf.getInputStream(new JarEntry("invalid")); 102357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertNull("Got stream for non-existent entry", in); 102457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 102557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during test 2: " + e); 102657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 102757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 102857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 102957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 103057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File signedFile = new File(resources, jarName); 103157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(signedFile); 103257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry jre = new JarEntry("foo/bar/A.class"); 103357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.getInputStream(jre); 103457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // InputStream returned in any way, exception can be thrown in case 103557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // of reading from this stream only. 103657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // fail("Should throw ZipException"); 103757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (ZipException ee) { 103857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // expected 103957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 104057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 104157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 104257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 104357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File signedFile = new File(resources, jarName); 104457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(signedFile); 104557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry jre = new JarEntry("foo/bar/A.class"); 104657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.close(); 104757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.getInputStream(jre); 104857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // InputStream returned in any way, exception can be thrown in case 104957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // of reading from this stream only. 105057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // The same for IOException 105157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Should throw IllegalStateException"); 105257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IllegalStateException ee) { 105357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // expected 105457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 105557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 1056d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1057d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob /** 1058d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob * The jar is intact, but the entry object is modified. 1059d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob */ 1060703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // Regression test for issue introduced by HARMONY-4569: signed archives containing files with size 0 could not get verified. 1061d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob public void testJarVerificationEmptyEntry() throws IOException { 1062d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob Support_Resources.copyFile(resources, null, emptyEntryJar); 1063d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob File f = new File(resources, emptyEntryJar); 1064d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1065d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob JarFile jarFile = new JarFile(f); 1066d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1067d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob ZipEntry zipEntry = jarFile.getJarEntry(emptyEntry1); 1068d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob int res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); 1069d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 1070d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1071d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob zipEntry = jarFile.getJarEntry(emptyEntry2); 1072d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); 1073d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 1074d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1075d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob zipEntry = jarFile.getJarEntry(emptyEntry3); 1076d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob res = jarFile.getInputStream(zipEntry).read(); 1077d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 1078d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob } 107900bf89dd858de6c7eaca555210ba429a89193722Kenny Root 108000bf89dd858de6c7eaca555210ba429a89193722Kenny Root public void testJarFile_BadSignatureProvider_Success() throws Exception { 108100bf89dd858de6c7eaca555210ba429a89193722Kenny Root Security.insertProviderAt(new JarFileBadProvider(), 1); 108200bf89dd858de6c7eaca555210ba429a89193722Kenny Root try { 108300bf89dd858de6c7eaca555210ba429a89193722Kenny Root // Needs a JAR with "RSA" as digest encryption algorithm 108400bf89dd858de6c7eaca555210ba429a89193722Kenny Root checkSignedJar(jarName6); 108500bf89dd858de6c7eaca555210ba429a89193722Kenny Root } finally { 108600bf89dd858de6c7eaca555210ba429a89193722Kenny Root Security.removeProvider(JarFileBadProvider.NAME); 108700bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 108800bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 108900bf89dd858de6c7eaca555210ba429a89193722Kenny Root 109000bf89dd858de6c7eaca555210ba429a89193722Kenny Root public static class JarFileBadProvider extends Provider { 109100bf89dd858de6c7eaca555210ba429a89193722Kenny Root public static final String NAME = "JarFileBadProvider"; 109200bf89dd858de6c7eaca555210ba429a89193722Kenny Root 109300bf89dd858de6c7eaca555210ba429a89193722Kenny Root public JarFileBadProvider() { 109400bf89dd858de6c7eaca555210ba429a89193722Kenny Root super(NAME, 1.0, "Bad provider for JarFileTest"); 109500bf89dd858de6c7eaca555210ba429a89193722Kenny Root 109600bf89dd858de6c7eaca555210ba429a89193722Kenny Root put("Signature.RSA", NotReallyASignature.class.getName()); 109700bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 109800bf89dd858de6c7eaca555210ba429a89193722Kenny Root 109900bf89dd858de6c7eaca555210ba429a89193722Kenny Root /** 110000bf89dd858de6c7eaca555210ba429a89193722Kenny Root * This should never be instantiated, so everything throws an exception. 110100bf89dd858de6c7eaca555210ba429a89193722Kenny Root */ 110200bf89dd858de6c7eaca555210ba429a89193722Kenny Root public static class NotReallyASignature extends SignatureSpi { 110300bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 110400bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected void engineInitVerify(PublicKey publicKey) throws InvalidKeyException { 110500bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 110600bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 110700bf89dd858de6c7eaca555210ba429a89193722Kenny Root 110800bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 110900bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected void engineInitSign(PrivateKey privateKey) throws InvalidKeyException { 111000bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 111100bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 111200bf89dd858de6c7eaca555210ba429a89193722Kenny Root 111300bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 111400bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected void engineUpdate(byte b) throws SignatureException { 111500bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 111600bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 111700bf89dd858de6c7eaca555210ba429a89193722Kenny Root 111800bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 111900bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected void engineUpdate(byte[] b, int off, int len) throws SignatureException { 112000bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 112100bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 112200bf89dd858de6c7eaca555210ba429a89193722Kenny Root 112300bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 112400bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected byte[] engineSign() throws SignatureException { 112500bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 112600bf89dd858de6c7eaca555210ba429a89193722Kenny Root return null; 112700bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 112800bf89dd858de6c7eaca555210ba429a89193722Kenny Root 112900bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 113000bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected boolean engineVerify(byte[] sigBytes) throws SignatureException { 113100bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 113200bf89dd858de6c7eaca555210ba429a89193722Kenny Root return false; 113300bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 113400bf89dd858de6c7eaca555210ba429a89193722Kenny Root 113500bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 113600bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected void engineSetParameter(String param, Object value) 113700bf89dd858de6c7eaca555210ba429a89193722Kenny Root throws InvalidParameterException { 113800bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 113900bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 114000bf89dd858de6c7eaca555210ba429a89193722Kenny Root 114100bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 114200bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected Object engineGetParameter(String param) throws InvalidParameterException { 114300bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 114400bf89dd858de6c7eaca555210ba429a89193722Kenny Root return null; 114500bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 114600bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 114700bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 1149