Path: blob/master/test/jdk/sun/security/tools/jarsigner/ConciseJarsigner.java
41152 views
/*1* Copyright (c) 2009, 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test25* @bug 6802846 8172529 822775826* @summary jarsigner needs enhanced cert validation(options)27* @library /test/lib28* @run main/timeout=240 ConciseJarsigner29*/3031import jdk.test.lib.Asserts;32import jdk.test.lib.SecurityTools;33import jdk.test.lib.process.OutputAnalyzer;3435import java.nio.file.Files;36import java.nio.file.Path;37import java.util.Calendar;38import java.util.List;3940public class ConciseJarsigner {4142static OutputAnalyzer kt(String cmd) throws Exception {43// Choose 2048-bit RSA to make sure it runs fine and fast. In44// fact, every keyalg/keysize combination is OK for this test.45return SecurityTools.keytool("-storepass changeit -keypass changeit "46+ "-keystore ks -keyalg rsa -keysize 2048 " + cmd);47}4849static void gencert(String owner, String cmd) throws Exception {50kt("-certreq -alias " + owner + " -file tmp.req");51kt("-gencert -infile tmp.req -outfile tmp.cert " + cmd);52kt("-import -alias " + owner + " -file tmp.cert");53}5455static OutputAnalyzer js(String cmd) throws Exception {56return SecurityTools.jarsigner("-debug " + cmd);57}5859public static void main(String[] args) throws Exception {6061Files.write(Path.of("A1"), List.of("a1"));62Files.write(Path.of("A2"), List.of("a2"));63Files.write(Path.of("A3"), List.of("a3"));64Files.write(Path.of("A4"), List.of("a4"));65Files.write(Path.of("A5"), List.of("a5"));66Files.write(Path.of("A6"), List.of("a6"));6768String year = "" + Calendar.getInstance().get(Calendar.YEAR);6970// ==========================================================71// First part: output format72// ==========================================================7374kt("-genkeypair -alias a1 -dname CN=a1 -validity 366");75kt("-genkeypair -alias a2 -dname CN=a2 -validity 366");7677// a.jar includes 8 unsigned, 2 signed by a1 and a2, 2 signed by a378SecurityTools.jar("cvf a.jar A1 A2");79js("-keystore ks -storepass changeit a.jar a1");80SecurityTools.jar("uvf a.jar A3 A4");81js("-keystore ks -storepass changeit a.jar a2");82SecurityTools.jar("uvf a.jar A5 A6");8384// Verify OK85js("-verify a.jar").shouldHaveExitValue(0);8687// 4(chainNotValidated)+16(hasUnsignedEntry)88js("-verify a.jar -strict").shouldHaveExitValue(20);8990// 16(hasUnsignedEntry)91js("-verify a.jar -strict -keystore ks -storepass changeit")92.shouldHaveExitValue(16);9394// 16(hasUnsignedEntry)+32(notSignedByAlias)95js("-verify a.jar a1 -strict -keystore ks -storepass changeit")96.shouldHaveExitValue(48);9798// 16(hasUnsignedEntry)99js("-verify a.jar a1 a2 -strict -keystore ks -storepass changeit")100.shouldHaveExitValue(16);101102// 12 entries all together103Asserts.assertTrue(js("-verify a.jar -verbose")104.asLines().stream()105.filter(s -> s.contains(year))106.count() == 12);107108// 12 entries all listed109Asserts.assertTrue(js("-verify a.jar -verbose:grouped")110.asLines().stream()111.filter(s -> s.contains(year))112.count() == 12);113114// 4 groups: MANIFST, unrelated, signed, unsigned115Asserts.assertTrue(js("-verify a.jar -verbose:summary")116.asLines().stream()117.filter(s -> s.contains(year))118.count() == 4);119120// still 4 groups, but MANIFEST group has no other file121Asserts.assertTrue(js("-verify a.jar -verbose:summary")122.asLines().stream()123.filter(s -> s.contains("more)"))124.count() == 3);125126// 5 groups: MANIFEST, unrelated, signed by a1/a2, signed by a2, unsigned127Asserts.assertTrue(js("-verify a.jar -verbose:summary -certs")128.asLines().stream()129.filter(s -> s.contains(year))130.count() == 5);131132// 2 for MANIFEST, 2*2 for A1/A2, 2 for A3/A4133Asserts.assertTrue(js("-verify a.jar -verbose -certs")134.asLines().stream()135.filter(s -> s.contains("[certificate"))136.count() == 8);137138// a1,a2 for MANIFEST, a1,a2 for A1/A2, a2 for A3/A4139Asserts.assertTrue(js("-verify a.jar -verbose:grouped -certs")140.asLines().stream()141.filter(s -> s.contains("[certificate"))142.count() == 5);143144// a1,a2 for MANIFEST, a1,a2 for A1/A2, a2 for A3/A4145Asserts.assertTrue(js("-verify a.jar -verbose:summary -certs")146.asLines().stream()147.filter(s -> s.contains("[certificate"))148.count() == 5);149150// still 5 groups, but MANIFEST group has no other file151Asserts.assertTrue(js("-verify a.jar -verbose:summary -certs")152.asLines().stream()153.filter(s -> s.contains("more)"))154.count() == 4);155156// ==========================================================157// Second part: exit code 2, 4, 8.158// 16 and 32 already covered in the first part159// ==========================================================160161kt("-genkeypair -alias ca -dname CN=ca -ext bc -validity 365");162kt("-genkeypair -alias expired -dname CN=expired");163gencert("expired", "-alias ca -startdate -10m");164kt("-genkeypair -alias notyetvalid -dname CN=notyetvalid");165gencert("notyetvalid", "-alias ca -startdate +1m");166kt("-genkeypair -alias badku -dname CN=badku");167gencert("badku", "-alias ca -ext KU=cRLSign -validity 365");168kt("-genkeypair -alias badeku -dname CN=badeku");169gencert("badeku", "-alias ca -ext EKU=sa -validity 365");170kt("-genkeypair -alias goodku -dname CN=goodku");171gencert("goodku", "-alias ca -ext KU=dig -validity 365");172kt("-genkeypair -alias goodeku -dname CN=goodeku");173gencert("goodeku", "-alias ca -ext EKU=codesign -validity 365");174175js("-strict -keystore ks -storepass changeit a.jar expired")176.shouldHaveExitValue(4);177178js("-strict -keystore ks -storepass changeit a.jar notyetvalid")179.shouldHaveExitValue(4);180181js("-strict -keystore ks -storepass changeit a.jar badku")182.shouldHaveExitValue(8);183184js("-strict -keystore ks -storepass changeit a.jar badeku")185.shouldHaveExitValue(8);186187js("-strict -keystore ks -storepass changeit a.jar goodku")188.shouldHaveExitValue(0);189190js("-strict -keystore ks -storepass changeit a.jar goodeku")191.shouldHaveExitValue(0);192193// badchain signed by ca1, but ca1 is removed later194kt("-genkeypair -alias badchain -dname CN=badchain -validity 365");195kt("-genkeypair -alias ca1 -dname CN=ca1 -ext bc -validity 365");196gencert("badchain", "-alias ca1 -validity 365");197198// save ca1.cert for easy replay199kt("-exportcert -file ca1.cert -alias ca1");200kt("-delete -alias ca1");201202js("-strict -keystore ks -storepass changeit a.jar badchain")203.shouldHaveExitValue(4);204205js("-verify a.jar").shouldHaveExitValue(0);206207// ==========================================================208// Third part: -certchain test209// ==========================================================210211// altchain signed by ca2212kt("-genkeypair -alias altchain -dname CN=altchain -validity 365");213kt("-genkeypair -alias ca2 -dname CN=ca2 -ext bc -validity 365");214kt("-certreq -alias altchain -file altchain.req");215Files.write(Path.of("certchain"), List.of(216kt("-gencert -alias ca2 -validity 365 -rfc -infile altchain.req")217.getOutput(),218kt("-exportcert -alias ca2 -rfc").getOutput()));219220// Self-signed cert does not work221js("-strict -keystore ks -storepass changeit a.jar altchain")222.shouldHaveExitValue(4);223224// -certchain works225js("-strict -keystore ks -storepass changeit -certchain certchain "226+ "a.jar altchain")227.shouldHaveExitValue(0);228229// if ca2 is removed and cert is imported, -certchain won't work230// because this certificate entry is not trusted231// save ca2.cert for easy replay232kt("-exportcert -file ca2.cert -alias ca2");233kt("-delete -alias ca2");234kt("-importcert -file certchain -alias altchain -noprompt");235js("-strict -keystore ks -storepass changeit "236+ "-certchain certchain a.jar altchain")237.shouldHaveExitValue(4);238239js("-verify a.jar").shouldHaveExitValue(0);240241// ==========================================================242// 8172529243// ==========================================================244245kt("-genkeypair -alias ee -dname CN=ee");246kt("-genkeypair -alias caone -dname CN=caone -ext bc:c");247kt("-genkeypair -alias catwo -dname CN=catwo -ext bc:c");248249kt("-certreq -alias ee -file ee.req");250kt("-certreq -alias catwo -file catwo.req");251252// This certchain contains a cross-signed weak catwo.cert253Files.write(Path.of("ee2"), List.of(254kt("-gencert -alias catwo -rfc -infile ee.req").getOutput(),255kt("-gencert -alias caone -sigalg MD5withRSA -rfc "256+ "-infile catwo.req").getOutput()));257258kt("-importcert -alias ee -file ee2");259260SecurityTools.jar("cvf a.jar A1");261js("-strict -keystore ks -storepass changeit a.jar ee")262.shouldHaveExitValue(0);263js("-strict -keystore ks -storepass changeit -verify a.jar")264.shouldHaveExitValue(0);265}266}267268269