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 /** 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 305229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getEntryLjava_lang_String() throws IOException { 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Error in returned entry", 311, jarFile.getEntry( 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entryName).getSize()); 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test: " + e.toString()); 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (enumeration.hasMoreElements()) { 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getEntry(je.getName()); 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getEntry(je.getName()); 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fail("IllegalStateException expected."); 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ee) { // Per documentation exception 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // may be thrown. 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 342229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getJarEntryLjava_lang_String() throws IOException { 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Error in returned entry", 311, jarFile.getJarEntry( 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entryName).getSize()); 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test: " + e.toString()); 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (enumeration.hasMoreElements()) { 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getJarEntry(je.getName()); 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getJarEntry(je.getName()); 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fail("IllegalStateException expected."); 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ee) { // Per documentation exception 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // may be thrown. 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 37857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 379229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 38057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 38157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testGetJarEntry() throws Exception { 38257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 38357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jarFile = new JarFile(new File(resources, jarName)); 38457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertEquals("Error in returned entry", 311, jarFile.getEntry( 38557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson entryName).getSize()); 38657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.close(); 38757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 38857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // tests for signed jars 38957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // test all signed jars in the /Testres/Internal/SignedJars directory 39057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String jarDirUrl = Support_Resources 39157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson .getResourceURL("/../internalres/signedjars"); 39257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Vector<String> signedJars = new Vector<String>(); 39357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 39457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream is = new URL(jarDirUrl + "/jarlist.txt").openStream(); 39557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson while (is.available() > 0) { 39657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson StringBuilder linebuff = new StringBuilder(80); // Typical line 39757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // length 39857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson done: while (true) { 39957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int nextByte = is.read(); 40057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson switch (nextByte) { 40157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case -1: 40257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 40357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case (byte) '\r': 40457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 40557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // ignore 40657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 40757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 40857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case (byte) '\n': 40957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 41057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // ignore 41157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 41257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 41357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson default: 41457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson linebuff.append((char) nextByte); 41557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 41657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 41757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 41857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break; 41957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 42057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String line = linebuff.toString(); 42157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson signedJars.add(line); 42257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 42357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 42457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IOException e) { 42557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // no list of jars found 42657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 42757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 42857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (int i = 0; i < signedJars.size(); i++) { 42957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String jarName = signedJars.get(i); 43057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 43157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File file = Support_Resources.getExternalLocalFile(jarDirUrl 43257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + "/" + jarName); 43357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile = new JarFile(file, true); 43457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson boolean foundCerts = false; 43557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Enumeration<JarEntry> e = jarFile.entries(); 43657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson while (e.hasMoreElements()) { 43757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry entry = e.nextElement(); 43857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream is = jarFile.getInputStream(entry); 43957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.skip(100000); 44057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 44157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Certificate[] certs = entry.getCertificates(); 44257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (certs != null && certs.length > 0) { 44357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson foundCerts = true; 44457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break; 44557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 44657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 44757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue( 44857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson "No certificates found during signed jar test for jar \"" 44957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + jarName + "\"", foundCerts); 45057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IOException e) { 45157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during signed jar test for jar \"" + jarName 45257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + "\": " + e.toString()); 45357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 45457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 45557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 45657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 458229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getManifest() 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getManifest() { 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Test for method java.util.jar.Manifest 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // java.util.jar.JarFile.getManifest() 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Error--Manifest not returned", jarFile.getManifest()); 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 1st test: " + e.toString()); 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName2); 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName2)); 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNull("Error--should have returned null", jarFile 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 2nd test: " + e.toString()); 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // jarName3 was created using the following test 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName3); 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName3)); 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Should find manifest without verifying", jarFile 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 3rd test: " + e.toString()); 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this is used to create jarName3 used in the previous test 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Manifest manifest = new Manifest(); 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Attributes attributes = manifest.getMainAttributes(); 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributes.put(new Attributes.Name("Manifest-Version"), "1.0"); 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream manOut = new ByteArrayOutputStream(); 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project manifest.write(manOut); 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] manBytes = manOut.toByteArray(); 50019745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamath File file = File.createTempFile("hyts_manifest1", ".jar"); 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarOutputStream jarOut = new JarOutputStream(new FileOutputStream( 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file.getAbsolutePath())); 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry entry = new ZipEntry("META-INF/"); 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(0); 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = new ZipEntry(JarFile.MANIFEST_NAME); 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(manBytes.length); 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.write(manBytes); 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = new ZipEntry("myfile"); 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(1); 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.write(65); 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.close(); 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(file.getAbsolutePath(), false); 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Should find manifest without verifying", jar 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jar.close(); 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file.delete(); 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IOException 3"); 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName2); 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jF = new JarFile(new File(resources, jarName2)); 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jF.close(); 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jF.getManifest(); 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("FAILED: expected IllegalStateException"); 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ise) { 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected; 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 4th test: " + e.toString()); 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, "Broken_manifest.jar"); 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jf; 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jf = new JarFile(new File(resources, "Broken_manifest.jar")); 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jf.getManifest(); 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IOException expected."); 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected. 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 547229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry) 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 549703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // This test doesn't pass on RI. If entry size is set up incorrectly, 550703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // SecurityException is thrown. But SecurityException is thrown on RI only 551703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // if jar file is signed incorrectly. 55252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root public void test_getInputStreamLjava_util_jar_JarEntry_subtest0() throws Exception { 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project File signedFile = null; 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName4); 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signedFile = new File(resources, jarName4); 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Failed to create local file 2: " + e); 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.read(); 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 3: " + e); 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] dummy = getAllBytesFromStream(in); 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNull("found certificates", entry.getCertificates()); 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 4: " + e); 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 58157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 584119d05942e760b078fd8ac1ea133918ec15b8dbeYi Kong JarEntry entry = jar.getJarEntry(entryName3); 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(1076); 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] dummy = getAllBytesFromStream(in); 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("SecurityException should be thrown."); 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 5: " + e); 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName5); 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signedFile = new File(resources, jarName5); 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Failed to create local file 5: " + e); 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("SecurityException should be thrown."); 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 5: " + e); 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 614bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 615bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root // SHA1 digest, SHA256withRSA signed JAR 61652c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName6); 617bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 618bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root // SHA-256 digest, SHA256withRSA signed JAR 61952c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName7); 620bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root 62152c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root // SHA-512 digest, SHA512withECDSA signed JAR 62252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root checkSignedJar(jarName8); 6233de7083091497358d003bb889eba909f85b69fadKenny Root 6243de7083091497358d003bb889eba909f85b69fadKenny Root // JAR with a signature that has PKCS#7 Authenticated Attributes 6253de7083091497358d003bb889eba909f85b69fadKenny Root checkSignedJar(authAttrsJar); 626ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root 627ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root // JAR with certificates that loop 628ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root checkSignedJar(certLoopJar, 3); 62952c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root } 63052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 631bda6980df389e16edf907e5c516ee21e9e92883eKenny Root /** 632bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * This test uses a jar file signed with an algorithm that has its own OID 633bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * that is valid as a signature type. SHA256withECDSA is an algorithm that 634bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * isn't combined as DigestAlgorithm + "with" + DigestEncryptionAlgorithm 635bda6980df389e16edf907e5c516ee21e9e92883eKenny Root * like RSAEncryption needs to be. 636bda6980df389e16edf907e5c516ee21e9e92883eKenny Root */ 637bda6980df389e16edf907e5c516ee21e9e92883eKenny Root public void testJarFile_Signed_Valid_DigestEncryptionAlgorithm() throws Exception { 638bda6980df389e16edf907e5c516ee21e9e92883eKenny Root checkSignedJar(jarName9); 639bda6980df389e16edf907e5c516ee21e9e92883eKenny Root } 640bda6980df389e16edf907e5c516ee21e9e92883eKenny Root 641ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root /** 642ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * Checks that a JAR is signed correctly with a signature length of 1. 643ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root */ 64452c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root private void checkSignedJar(String jarName) throws Exception { 645ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root checkSignedJar(jarName, 1); 646ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root } 64752c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 648ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root /** 649ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root * Checks that a JAR is signed correctly with a signature length of sigLength. 650ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root */ 651ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root private void checkSignedJar(String jarName, final int sigLength) throws Exception { 652ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root Support_Resources.copyFile(resources, null, jarName); 65352c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 654ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root final File file = new File(resources, jarName); 655ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root 656ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root ExecutorService executor = Executors.newSingleThreadExecutor(); 657ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root Future<Boolean> future = executor.submit(new Callable<Boolean>() { 658ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root @Override 659ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root public Boolean call() throws Exception { 660ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root JarFile jarFile = new JarFile(file, true); 661ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root try { 662ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root Enumeration<JarEntry> e = jarFile.entries(); 663ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root while (e.hasMoreElements()) { 664ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root JarEntry entry = e.nextElement(); 665ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root InputStream is = jarFile.getInputStream(entry); 666ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root is.skip(100000); 667ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root is.close(); 668ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root Certificate[] certs = entry.getCertificates(); 669ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root if (certs != null && certs.length > 0) { 670ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root assertEquals(sigLength, certs.length); 671ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root return true; 672ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root } 673ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root } 674ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root return false; 675ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root } finally { 676ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root jarFile.close(); 677bda6980df389e16edf907e5c516ee21e9e92883eKenny Root } 67852c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root } 679ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root }); 680ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root executor.shutdown(); 681ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root final boolean foundCerts; 682ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root try { 683ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root foundCerts = future.get(10, TimeUnit.SECONDS); 684ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root } catch (TimeoutException e) { 685ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root fail("Could not finish building chain; possibly confused by loops"); 686ef7f5a16547089a7cdba9e48d780720f606ff54aKenny Root return; // Not actually reached. 687bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root } 68852c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root 68952c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root assertTrue( 69052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root "No certificates found during signed jar test for jar \"" 69152c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root + jarName + "\"", foundCerts); 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 694d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root private static class Results { 695d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root public Certificate[] certificates; 696d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root public CodeSigner[] signers; 697d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root } 698d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root 699fe821d0a3d96518107489e22b37f664632472c41Kenny Root private Results getSignedJarCerts(String jarName) throws Exception { 700cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root Support_Resources.copyFile(resources, null, jarName); 701cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 702cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root File file = new File(resources, jarName); 703d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root Results results = new Results(); 704cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 705fe821d0a3d96518107489e22b37f664632472c41Kenny Root JarFile jarFile = new JarFile(file, true, ZipFile.OPEN_READ); 706cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root try { 707cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 708cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root Enumeration<JarEntry> e = jarFile.entries(); 709cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root while (e.hasMoreElements()) { 710cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root JarEntry entry = e.nextElement(); 711cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root InputStream is = jarFile.getInputStream(entry); 712cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root // Skip bytes because we have to read the entire file for it to read signatures. 713cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root is.skip(entry.getSize()); 714cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root is.close(); 715cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root Certificate[] certs = entry.getCertificates(); 716d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root CodeSigner[] signers = entry.getCodeSigners(); 717cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root if (certs != null && certs.length > 0) { 718d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root results.certificates = certs; 719d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root results.signers = signers; 720cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root break; 721cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 722cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 723cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } finally { 724cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root jarFile.close(); 725cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 726cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 727d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root return results; 728cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 729cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 730fe821d0a3d96518107489e22b37f664632472c41Kenny Root public void testJarFile_Signed_ValidChain() throws Exception { 731fe821d0a3d96518107489e22b37f664632472c41Kenny Root Results result = getSignedJarCerts(VALID_CHAIN_JAR); 732d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertNotNull(result); 73333aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals(Arrays.deepToString(result.certificates), 3, result.certificates.length); 734d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length); 73533aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals(3, result.signers[0].getSignerCertPath().getCertificates().size()); 73633aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=fake-chain", ((X509Certificate) result.certificates[0]).getSubjectDN().toString()); 73733aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=intermediate1", ((X509Certificate) result.certificates[1]).getSubjectDN().toString()); 73833aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=root1", ((X509Certificate) result.certificates[2]).getSubjectDN().toString()); 739cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 740cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 741fe821d0a3d96518107489e22b37f664632472c41Kenny Root public void testJarFile_Signed_InvalidChain() throws Exception { 742fe821d0a3d96518107489e22b37f664632472c41Kenny Root Results result = getSignedJarCerts(INVALID_CHAIN_JAR); 743d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertNotNull(result); 74433aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals(Arrays.deepToString(result.certificates), 3, result.certificates.length); 745d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length); 74633aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals(3, result.signers[0].getSignerCertPath().getCertificates().size()); 74733aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=fake-chain", ((X509Certificate) result.certificates[0]).getSubjectDN().toString()); 74833aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=intermediate1", ((X509Certificate) result.certificates[1]).getSubjectDN().toString()); 74933aeb892a68274a5ec67f374f86c7b5cb06d1890Kenny Root assertEquals("CN=root1", ((X509Certificate) result.certificates[2]).getSubjectDN().toString()); 750cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root } 751cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root 752a3d40b4064c0f4de77122eff9253da242877c938Kenny Root public void testJarFile_Signed_AmbiguousSigners() throws Exception { 753cdd4aae90277f2182420526c14b9d77a9e7f1203Kenny Root Results result = getSignedJarCerts(AMBIGUOUS_SIGNERS_JAR); 754a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertNotNull(result); 755a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(Arrays.deepToString(result.certificates), 2, result.certificates.length); 756a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(Arrays.deepToString(result.signers), 2, result.signers.length); 757a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(1, result.signers[0].getSignerCertPath().getCertificates().size()); 758a3d40b4064c0f4de77122eff9253da242877c938Kenny Root assertEquals(1, result.signers[1].getSignerCertPath().getCertificates().size()); 759a3d40b4064c0f4de77122eff9253da242877c938Kenny Root } 760a3d40b4064c0f4de77122eff9253da242877c938Kenny Root 761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The jar created by 1.4 which does not provide a 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm-Digest-Manifest-Main-Attributes entry in .SF file. 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_Jar_created_before_java_5() throws IOException { 766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Created_by_1_4.jar"; 767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* The jar is intact, then everything is all right. */ 778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Integrate_Jar() throws IOException { 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Integrate.jar"; 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 78657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 78757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 78857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 78957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 79057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 79157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * The jar is intact, but the entry object is modified. 79257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 79357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testJarVerificationModifiedEntry() throws IOException { 79457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, integrateJar); 79557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File f = new File(resources, integrateJar); 79657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 79757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jarFile = new JarFile(f); 79857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson ZipEntry zipEntry = jarFile.getJarEntry(integrateJarEntry); 79957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry.setSize(zipEntry.getSize() + 1); 80057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 80157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 80257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile = new JarFile(f); 80357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry = jarFile.getJarEntry(integrateJarEntry); 80457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry.setSize(zipEntry.getSize() - 1); 80557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 80657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson //jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 80757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).read(new byte[5000], 0, 5000); 80857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 80957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (SecurityException e) { 81057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // desired 811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If another entry is inserted into Manifest, no security exception will be 816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown out. 817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_InsertEntry_in_Manifest_Jar() throws IOException { 819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Inserted_Entry_Manifest.jar"; 820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int count = 0; 825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count++; 830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(5, count); 832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If another entry is inserted into Manifest, no security exception will be 836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown out. 837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_Inserted_Entry_Manifest_with_DigestCode() 839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Inserted_Entry_Manifest_with_DigestCode.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 ZipEntry zipEntry = entries.nextElement(); 848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count++; 850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(5, count); 852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The content of Test.class is modified, jarFile.getInputStream will not 856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * throw security Exception, but it will anytime before the inputStream got 857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from getInputStream method has been read to end. 858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Class() throws IOException { 860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Class.jar"; 861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* The content of Test.class has been tampered. */ 870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = jarFile.getEntry("Test.class"); 871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jarFile.getInputStream(zipEntry); 872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] buffer = new byte[1024]; 873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (in.available() > 0) { 875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.read(buffer); 876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * In the Modified.jar, the main attributes of META-INF/MANIFEST.MF is 885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * tampered manually. Hence the RI 5.0 JarFile.getInputStream of any 88657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * JarEntry will throw security exception. 887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Manifest_MainAttributes() 889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Manifest_MainAttributes.jar"; 891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 89957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * It is all right in our original JarFile. If the Entry Attributes, for 908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example Test.class in our jar, the jarFile.getInputStream will throw 909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Security Exception. 910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Manifest_EntryAttributes() 912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Manifest_EntryAttributes.jar"; 914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("should throw Security Exception"); 923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the content of the .SA file is modified, no matter what it resides, 931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * JarFile.getInputStream of any JarEntry will throw Security Exception. 932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_SF_EntryAttributes() throws IOException { 934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_SF_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 public void test_close() throws IOException { 951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_SF_EntryAttributes.jar"; 952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Can not check IOException 961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 96257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 96357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 96457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * @throws IOException 965229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry) 96657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 96757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void test_getInputStreamLjava_util_jar_JarEntry() throws IOException { 96857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File localFile = null; 96957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 97057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 97157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson localFile = new File(resources, jarName); 97257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 97357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Failed to create local file: " + e); 97457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 97557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 97657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson byte[] b = new byte[1024]; 97757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 97857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(localFile); 97957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson java.io.InputStream is = jf.getInputStream(jf.getEntry(entryName)); 98057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // BEGIN android-removed 98157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // jf.close(); 98257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // END android-removed 98357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue("Returned invalid stream", is.available() > 0); 98457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int r = is.read(b, 0, 1024); 98557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 98657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson StringBuffer sb = new StringBuffer(r); 98757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (int i = 0; i < r; i++) { 98857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson sb.append((char) (b[i] & 0xff)); 98957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 99057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String contents = sb.toString(); 99157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue("Incorrect stream read", contents.indexOf("bar") > 0); 99257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // BEGIN android-added 99357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.close(); 99457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // END android-added 99557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 99657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during test: " + e.toString()); 99757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 99857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 99957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 100057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(localFile); 100157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream in = jf.getInputStream(new JarEntry("invalid")); 100257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertNull("Got stream for non-existent entry", in); 100357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 100457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during test 2: " + e); 100557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 100657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 100757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 100857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 100957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File signedFile = new File(resources, jarName); 101057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(signedFile); 101157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry jre = new JarEntry("foo/bar/A.class"); 101257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.getInputStream(jre); 101357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // InputStream returned in any way, exception can be thrown in case 101457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // of reading from this stream only. 101557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // fail("Should throw ZipException"); 101657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (ZipException ee) { 101757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // expected 101857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 101957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 102057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 102157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 102257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File signedFile = new File(resources, jarName); 102357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(signedFile); 102457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry jre = new JarEntry("foo/bar/A.class"); 102557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.close(); 102657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.getInputStream(jre); 102757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // InputStream returned in any way, exception can be thrown in case 102857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // of reading from this stream only. 102957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // The same for IOException 103057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Should throw IllegalStateException"); 103157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IllegalStateException ee) { 103257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // expected 103357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 103457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 1035d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1036d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob /** 1037d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob * The jar is intact, but the entry object is modified. 1038d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob */ 1039703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // Regression test for issue introduced by HARMONY-4569: signed archives containing files with size 0 could not get verified. 1040d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob public void testJarVerificationEmptyEntry() throws IOException { 1041d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob Support_Resources.copyFile(resources, null, emptyEntryJar); 1042d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob File f = new File(resources, emptyEntryJar); 1043d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1044d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob JarFile jarFile = new JarFile(f); 1045d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1046d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob ZipEntry zipEntry = jarFile.getJarEntry(emptyEntry1); 1047d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob int res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); 1048d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 1049d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1050d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob zipEntry = jarFile.getJarEntry(emptyEntry2); 1051d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); 1052d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 1053d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 1054d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob zipEntry = jarFile.getJarEntry(emptyEntry3); 1055d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob res = jarFile.getInputStream(zipEntry).read(); 1056d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 1057d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob } 105800bf89dd858de6c7eaca555210ba429a89193722Kenny Root 105900bf89dd858de6c7eaca555210ba429a89193722Kenny Root public void testJarFile_BadSignatureProvider_Success() throws Exception { 106000bf89dd858de6c7eaca555210ba429a89193722Kenny Root Security.insertProviderAt(new JarFileBadProvider(), 1); 106100bf89dd858de6c7eaca555210ba429a89193722Kenny Root try { 106200bf89dd858de6c7eaca555210ba429a89193722Kenny Root // Needs a JAR with "RSA" as digest encryption algorithm 106300bf89dd858de6c7eaca555210ba429a89193722Kenny Root checkSignedJar(jarName6); 106400bf89dd858de6c7eaca555210ba429a89193722Kenny Root } finally { 106500bf89dd858de6c7eaca555210ba429a89193722Kenny Root Security.removeProvider(JarFileBadProvider.NAME); 106600bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 106700bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 106800bf89dd858de6c7eaca555210ba429a89193722Kenny Root 106900bf89dd858de6c7eaca555210ba429a89193722Kenny Root public static class JarFileBadProvider extends Provider { 107000bf89dd858de6c7eaca555210ba429a89193722Kenny Root public static final String NAME = "JarFileBadProvider"; 107100bf89dd858de6c7eaca555210ba429a89193722Kenny Root 107200bf89dd858de6c7eaca555210ba429a89193722Kenny Root public JarFileBadProvider() { 107300bf89dd858de6c7eaca555210ba429a89193722Kenny Root super(NAME, 1.0, "Bad provider for JarFileTest"); 107400bf89dd858de6c7eaca555210ba429a89193722Kenny Root 107500bf89dd858de6c7eaca555210ba429a89193722Kenny Root put("Signature.RSA", NotReallyASignature.class.getName()); 107600bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 107700bf89dd858de6c7eaca555210ba429a89193722Kenny Root 107800bf89dd858de6c7eaca555210ba429a89193722Kenny Root /** 107900bf89dd858de6c7eaca555210ba429a89193722Kenny Root * This should never be instantiated, so everything throws an exception. 108000bf89dd858de6c7eaca555210ba429a89193722Kenny Root */ 108100bf89dd858de6c7eaca555210ba429a89193722Kenny Root public static class NotReallyASignature extends SignatureSpi { 108200bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 108300bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected void engineInitVerify(PublicKey publicKey) throws InvalidKeyException { 108400bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 108500bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 108600bf89dd858de6c7eaca555210ba429a89193722Kenny Root 108700bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 108800bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected void engineInitSign(PrivateKey privateKey) throws InvalidKeyException { 108900bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 109000bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 109100bf89dd858de6c7eaca555210ba429a89193722Kenny Root 109200bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 109300bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected void engineUpdate(byte b) throws SignatureException { 109400bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 109500bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 109600bf89dd858de6c7eaca555210ba429a89193722Kenny Root 109700bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 109800bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected void engineUpdate(byte[] b, int off, int len) throws SignatureException { 109900bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 110000bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 110100bf89dd858de6c7eaca555210ba429a89193722Kenny Root 110200bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 110300bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected byte[] engineSign() throws SignatureException { 110400bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 110500bf89dd858de6c7eaca555210ba429a89193722Kenny Root return null; 110600bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 110700bf89dd858de6c7eaca555210ba429a89193722Kenny Root 110800bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 110900bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected boolean engineVerify(byte[] sigBytes) throws SignatureException { 111000bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 111100bf89dd858de6c7eaca555210ba429a89193722Kenny Root return false; 111200bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 111300bf89dd858de6c7eaca555210ba429a89193722Kenny Root 111400bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 111500bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected void engineSetParameter(String param, Object value) 111600bf89dd858de6c7eaca555210ba429a89193722Kenny Root throws InvalidParameterException { 111700bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 111800bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 111900bf89dd858de6c7eaca555210ba429a89193722Kenny Root 112000bf89dd858de6c7eaca555210ba429a89193722Kenny Root @Override 112100bf89dd858de6c7eaca555210ba429a89193722Kenny Root protected Object engineGetParameter(String param) throws InvalidParameterException { 112200bf89dd858de6c7eaca555210ba429a89193722Kenny Root fail("Should not call this provider"); 112300bf89dd858de6c7eaca555210ba429a89193722Kenny Root return null; 112400bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 112500bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 112600bf89dd858de6c7eaca555210ba429a89193722Kenny Root } 1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 1128