Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java
38855 views
/*1* Copyright (c) 2006, 2016, 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 6405536 6414980 805197226* @summary Make sure that we can parse certificates using various named curves27* and verify their signatures28* @author Andreas Sterbenz29* @library ..30* @library ../../../../java/security/testlibrary31* @run main/othervm ReadCertificates32* @run main/othervm ReadCertificates sm policy33*/3435import java.io.File;36import java.io.FileInputStream;37import java.io.InputStream;38import java.security.InvalidKeyException;39import java.security.NoSuchAlgorithmException;40import java.security.NoSuchProviderException;41import java.security.Provider;42import java.security.PublicKey;43import java.security.SecureRandom;44import java.security.SignatureException;45import java.security.cert.CertificateException;46import java.security.cert.CertificateFactory;47import java.security.cert.X509Certificate;48import java.security.interfaces.ECPublicKey;49import java.security.spec.ECParameterSpec;50import java.util.ArrayList;51import java.util.Arrays;52import java.util.Collection;53import java.util.LinkedHashMap;54import java.util.List;55import java.util.Map;56import javax.security.auth.x500.X500Principal;5758public class ReadCertificates extends PKCS11Test {5960private static CertificateFactory factory;6162private static SecureRandom random;6364private static Collection<X509Certificate> readCertificates(File file) throws Exception {65System.out.println("Loading " + file.getName() + "...");66Collection<X509Certificate> certs;67try (InputStream in = new FileInputStream(file)) {68certs = (Collection<X509Certificate>)factory.generateCertificates(in);69}70return certs;71}7273public static void main(String[] args) throws Exception {74main(new ReadCertificates(), args);75}7677@Override78public void main(Provider p) throws Exception {79if (p.getService("Signature", "SHA1withECDSA") == null) {80System.out.println("Provider does not support ECDSA, skipping...");81return;82}8384/*85* PKCS11Test.main will remove this provider if needed86*/87Providers.setAt(p, 1);8889random = new SecureRandom();90factory = CertificateFactory.getInstance("X.509");91try {92// clear certificate cache in from a previous run with a different93// provider (undocumented hack for the Sun provider)94factory.generateCertificate(null);95} catch (CertificateException e) {96// ignore97}98Map<X500Principal,X509Certificate> certs = new LinkedHashMap<>();99100File dir = new File(BASE, "certs");101File closedDir = new File(CLOSED_BASE, "certs");102File[] files = concat(dir.listFiles(), closedDir.listFiles());103Arrays.sort(files);104for (File file : files) {105if (file.isFile() == false) {106continue;107}108Collection<X509Certificate> certList = readCertificates(file);109for (X509Certificate cert : certList) {110X509Certificate old = certs.put(cert.getSubjectX500Principal(), cert);111if (old != null) {112System.out.println("Duplicate subject:");113System.out.println("Old Certificate: " + old);114System.out.println("New Certificate: " + cert);115throw new Exception(file.getPath());116}117}118}119System.out.println("OK: " + certs.size() + " certificates.");120121// Get supported curves122List<ECParameterSpec> supportedEC = getKnownCurves(p);123124System.out.println("Test Certs:\n");125for (X509Certificate cert : certs.values()) {126X509Certificate issuer = certs.get(cert.getIssuerX500Principal());127System.out.print("Verifying " + cert.getSubjectX500Principal() +128"... ");129PublicKey key = issuer.getPublicKey();130// Check if curve is supported131if (issuer.getPublicKey() instanceof ECPublicKey) {132if (!checkSupport(supportedEC,133((ECPublicKey)key).getParams())) {134System.out.println("Curve not found. Skipped.");135continue;136}137}138139try {140cert.verify(key, p.getName());141System.out.println("Pass.");142} catch (NoSuchAlgorithmException e) {143System.out.println("Warning: " + e.getMessage() +144". Trying another provider...");145cert.verify(key);146} catch (CertificateException | InvalidKeyException |147NoSuchProviderException | SignatureException e) {148System.out.println(e.getMessage());149if (key instanceof ECPublicKey) {150System.out.println("Failed.\n\tCurve: " +151((ECPublicKey)key).getParams() +152"\n\tSignature Alg: " + cert.getSigAlgName());153} else {154System.out.println("Key: "+key.toString());155}156157System.err.println("Verifying " + cert.getSubjectX500Principal());158e.printStackTrace();159}160}161162// try some random invalid signatures to make sure we get the correct163// error164System.out.println("Checking incorrect signatures...");165List<X509Certificate> certList = new ArrayList<>(certs.values());166for (int i = 0; i < 20; i++) {167X509Certificate cert, signer;168do {169cert = getRandomCert(certList);170signer = getRandomCert(certList);171} while (cert.getIssuerX500Principal().equals(signer.getSubjectX500Principal()));172try {173PublicKey signerPublicKey = signer.getPublicKey();174cert.verify(signerPublicKey);175// Ignore false positives176if (cert.getPublicKey().equals(signerPublicKey)) {177System.out.println("OK: self-signed certificate detected");178} else {179throw new Exception("Verified invalid signature");180}181} catch (SignatureException | InvalidKeyException e) {182System.out.println("OK: " + e);183}184}185186System.out.println("OK");187}188189private static X509Certificate getRandomCert(List<X509Certificate> certs) {190int n = random.nextInt(certs.size());191return certs.get(n);192}193194}195196197