Path: blob/master/test/jdk/tools/jpackage/macosx/base/SigningBase.java
51505 views
/*1* Copyright (c) 2019, 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*/2223import java.nio.file.Path;24import java.util.List;2526import jdk.jpackage.test.TKit;27import jdk.jpackage.test.Executor;28import jdk.jpackage.test.Executor.Result;2930public class SigningBase {3132public static String DEV_NAME;33public static String APP_CERT;34public static String INSTALLER_CERT;35public static String KEYCHAIN;36static {37String value = System.getProperty("jpackage.mac.signing.key.user.name");38DEV_NAME = (value == null) ? "jpackage.openjdk.java.net" : value;39APP_CERT = "Developer ID Application: " + DEV_NAME;40INSTALLER_CERT = "Developer ID Installer: " + DEV_NAME;41value = System.getProperty("jpackage.mac.signing.keychain");42KEYCHAIN = (value == null) ? "jpackagerTest.keychain" : value;43}4445private static void checkString(List<String> result, String lookupString) {46TKit.assertTextStream(lookupString).predicate(47(line, what) -> line.trim().contains(what)).apply(result.stream());48}4950private static List<String> codesignResult(Path target, boolean signed) {51int exitCode = signed ? 0 : 1;52List<String> result = new Executor()53.setExecutable("/usr/bin/codesign")54.addArguments("--verify", "--deep", "--strict", "--verbose=2",55target.toString())56.saveOutput()57.execute(exitCode).getOutput();5859return result;60}6162private static void verifyCodesignResult(List<String> result, Path target,63boolean signed) {64result.stream().forEachOrdered(TKit::trace);65if (signed) {66String lookupString = target.toString() + ": valid on disk";67checkString(result, lookupString);68lookupString = target.toString() + ": satisfies its Designated Requirement";69checkString(result, lookupString);70} else {71String lookupString = target.toString()72+ ": code object is not signed at all";73checkString(result, lookupString);74}75}7677private static Result spctlResult(Path target, String type) {78Result result = new Executor()79.setExecutable("/usr/sbin/spctl")80.addArguments("-vvv", "--assess", "--type", type,81target.toString())82.saveOutput()83.executeWithoutExitCodeCheck();8485// allow exit code 3 for not being notarized86if (result.getExitCode() != 3) {87result.assertExitCodeIsZero();88}89return result;90}9192private static void verifySpctlResult(List<String> output, Path target,93String type, int exitCode) {94output.stream().forEachOrdered(TKit::trace);95String lookupString;9697if (exitCode == 0) {98lookupString = target.toString() + ": accepted";99checkString(output, lookupString);100} else if (exitCode == 3) {101// allow failure purely for not being notarized102lookupString = target.toString() + ": rejected";103checkString(output, lookupString);104}105106if (type.equals("install")) {107lookupString = "origin=" + INSTALLER_CERT;108} else {109lookupString = "origin=" + APP_CERT;110}111checkString(output, lookupString);112}113114private static List<String> pkgutilResult(Path target) {115List<String> result = new Executor()116.setExecutable("/usr/sbin/pkgutil")117.addArguments("--check-signature",118target.toString())119.executeAndGetOutput();120121return result;122}123124private static void verifyPkgutilResult(List<String> result) {125result.stream().forEachOrdered(TKit::trace);126String lookupString = "Status: signed by";127checkString(result, lookupString);128lookupString = "1. " + INSTALLER_CERT;129checkString(result, lookupString);130}131132public static void verifyCodesign(Path target, boolean signed) {133List<String> result = codesignResult(target, signed);134verifyCodesignResult(result, target, signed);135}136137public static void verifySpctl(Path target, String type) {138Result result = spctlResult(target, type);139List<String> output = result.getOutput();140141verifySpctlResult(output, target, type, result.getExitCode());142}143144public static void verifyPkgutil(Path target) {145List<String> result = pkgutilResult(target);146verifyPkgutilResult(result);147}148149}150151152