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