author | phh |
Sat, 30 Nov 2019 14:33:05 -0800 | |
changeset 59330 | 5b96c12f909d |
parent 54521 | 8de62c4af8c7 |
permissions | -rw-r--r-- |
22578
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
1 |
/* |
45180 | 2 |
* Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. |
22578
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
4 |
* |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
8 |
* |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
13 |
* accompanied this code). |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
14 |
* |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU General Public License version |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
18 |
* |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
21 |
* questions. |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
22 |
*/ |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
23 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
24 |
/** |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
25 |
* @test |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
26 |
* @bug 8031572 |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
27 |
* @summary jarsigner -verify exits with 0 when a jar file is not properly signed |
30820 | 28 |
* @modules java.base/sun.security.tools.keytool |
29 |
* jdk.jartool/sun.security.tools.jarsigner |
|
30 |
* jdk.jartool/sun.tools.jar |
|
24036
16da2a111dd3
8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents:
22578
diff
changeset
|
31 |
* @run main EntriesOrder |
22578
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
32 |
*/ |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
33 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
34 |
import java.io.FileInputStream; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
35 |
import java.io.FileOutputStream; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
36 |
import java.nio.file.Files; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
37 |
import java.nio.file.Paths; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
38 |
import java.security.cert.Certificate; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
39 |
import java.util.*; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
40 |
import java.util.jar.JarEntry; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
41 |
import java.util.jar.JarFile; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
42 |
import java.util.jar.JarInputStream; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
43 |
import java.util.zip.ZipEntry; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
44 |
import java.util.zip.ZipOutputStream; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
45 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
46 |
public class EntriesOrder { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
47 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
48 |
public static void main(String[] args) throws Exception { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
49 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
50 |
String[] entries = { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
51 |
"META-INF/", |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
52 |
"META-INF/MANIFEST.MF", |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
53 |
"META-INF/A.RSA", |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
54 |
"META-INF/A.SF", |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
55 |
"META-INF/inf", |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
56 |
"a"}; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
57 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
58 |
Map<String,byte[]> content = new HashMap<>(); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
59 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
60 |
// We will create a jar containing entries above. Try all permutations |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
61 |
// and confirm 1) When opened as a JarFile, we can always get 3 signed |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
62 |
// ones (MANIFEST, inf, a), and 2) When opened as a JarInputStream, |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
63 |
// when the order is correct (MANIFEST at beginning, followed by RSA/SF, |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
64 |
// directory ignored), we can get 2 signed ones (inf, a). |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
65 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
66 |
// Prepares raw files |
54521
8de62c4af8c7
8180573: Refactor sun/security/tools shell tests to plain java tests
weijun
parents:
47216
diff
changeset
|
67 |
Files.write(Paths.get("a"), List.of("a")); |
22578
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
68 |
Files.createDirectory(Paths.get("META-INF/")); |
54521
8de62c4af8c7
8180573: Refactor sun/security/tools shell tests to plain java tests
weijun
parents:
47216
diff
changeset
|
69 |
Files.write(Paths.get("META-INF/inf"), List.of("inf")); |
22578
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
70 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
71 |
// Pack, sign, and extract to get all files |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
72 |
sun.tools.jar.Main m = |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
73 |
new sun.tools.jar.Main(System.out, System.err, "jar"); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
74 |
if (!m.run("cvf a.jar a META-INF/inf".split(" "))) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
75 |
throw new Exception("jar creation failed"); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
76 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
77 |
sun.security.tools.keytool.Main.main( |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
78 |
("-keystore jks -storepass changeit -keypass changeit -dname" + |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
79 |
" CN=A -alias a -genkeypair -keyalg rsa").split(" ")); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
80 |
sun.security.tools.jarsigner.Main.main( |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
81 |
"-keystore jks -storepass changeit a.jar a".split(" ")); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
82 |
m = new sun.tools.jar.Main(System.out, System.err, "jar"); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
83 |
if (!m.run("xvf a.jar".split(" "))) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
84 |
throw new Exception("jar extraction failed"); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
85 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
86 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
87 |
// Data |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
88 |
for (String s: entries) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
89 |
if (!s.endsWith("/")) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
90 |
content.put(s, Files.readAllBytes(Paths.get(s))); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
91 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
92 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
93 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
94 |
// Test |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
95 |
for (List<String> perm: Permute(entries)) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
96 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
97 |
// Recreate a jar |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
98 |
try (ZipOutputStream zos |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
99 |
= new ZipOutputStream(new FileOutputStream("x.jar"))) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
100 |
for (String e: perm) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
101 |
zos.putNextEntry(new ZipEntry(e)); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
102 |
if (Paths.get(e).toFile().isDirectory()) continue; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
103 |
zos.write(content.get(e)); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
104 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
105 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
106 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
107 |
// Open with JarFile, number of signed entries should be 3. |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
108 |
int cc = 0; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
109 |
try (JarFile jf = new JarFile("x.jar")) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
110 |
Enumeration<JarEntry> jes = jf.entries(); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
111 |
while (jes.hasMoreElements()) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
112 |
JarEntry je = jes.nextElement(); |
45180 | 113 |
jf.getInputStream(je).readAllBytes(); |
22578
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
114 |
Certificate[] certs = je.getCertificates(); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
115 |
if (certs != null && certs.length > 0) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
116 |
cc++; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
117 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
118 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
119 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
120 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
121 |
if (cc != 3) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
122 |
System.out.println(perm + " - jf - " + cc); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
123 |
throw new Exception(); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
124 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
125 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
126 |
// Open with JarInputStream |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
127 |
int signed; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
128 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
129 |
perm.remove("META-INF/"); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
130 |
if (perm.get(0).equals("META-INF/MANIFEST.MF") && |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
131 |
perm.get(1).contains("/A.") && |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
132 |
perm.get(2).contains("/A.")) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
133 |
signed = 2; // Good order |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
134 |
} else { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
135 |
signed = 0; // Bad order. In this case, the number of signed |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
136 |
// entries is not documented. Just test impl. |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
137 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
138 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
139 |
cc = 0; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
140 |
try (JarInputStream jis |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
141 |
= new JarInputStream(new FileInputStream("x.jar"))) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
142 |
while (true) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
143 |
JarEntry je = jis.getNextJarEntry(); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
144 |
if (je == null) break; |
45180 | 145 |
jis.readAllBytes(); |
22578
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
146 |
Certificate[] certs = je.getCertificates(); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
147 |
if (certs != null && certs.length > 0) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
148 |
cc++; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
149 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
150 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
151 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
152 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
153 |
if (cc != signed) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
154 |
System.out.println(perm + " - jis - " + cc + " " + signed); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
155 |
throw new Exception(); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
156 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
157 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
158 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
159 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
160 |
// Helper method to return all permutations of an array. Each output can |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
161 |
// be altered without damaging the iteration process. |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
162 |
static Iterable<List<String>> Permute(String[] entries) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
163 |
return new Iterable<List<String>>() { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
164 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
165 |
int s = entries.length; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
166 |
long c = factorial(s) - 1; // number of permutations |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
167 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
168 |
private long factorial(int n) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
169 |
return (n == 1) ? 1: (n * factorial(n-1)); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
170 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
171 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
172 |
@Override |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
173 |
public Iterator<List<String>> iterator() { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
174 |
return new Iterator<List<String>>() { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
175 |
@Override |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
176 |
public boolean hasNext() { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
177 |
return c >= 0; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
178 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
179 |
|
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
180 |
@Override |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
181 |
public List<String> next() { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
182 |
if (c < 0) return null; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
183 |
List<String> result = new ArrayList<>(s); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
184 |
LinkedList<String> source = new LinkedList<>( |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
185 |
Arrays.asList(entries)); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
186 |
// Treat c as a integer with different radixes at |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
187 |
// different digits, i.e. at digit 0, radix is s; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
188 |
// at digit 1, radix is s-1. Thus a s-digit number |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
189 |
// is able to represent s! different values. |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
190 |
long n = c; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
191 |
for (int i=s; i>=1; i--) { |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
192 |
int x = (int)(n % i); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
193 |
result.add(source.remove(x)); |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
194 |
n = n / i; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
195 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
196 |
c--; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
197 |
return result; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
198 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
199 |
}; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
200 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
201 |
}; |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
202 |
} |
ff8d54ac7c5c
8031572: jarsigner -verify exits with 0 when a jar file is not properly signed
weijun
parents:
diff
changeset
|
203 |
} |