Path: blob/master/test/jdk/sun/security/x509/X509CertImpl/V3Certificate.java
41153 views
/*1* Copyright (c) 2015, 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 8049237 824215126* @modules java.base/sun.security.x50927* java.base/sun.security.util28* jdk.crypto.ec29* @summary This test generates V3 certificate with all the supported30* extensions. Writes back the generated certificate in to a file and checks for31* equality with the original certificate.32*/3334import java.io.File;35import java.io.FileInputStream;36import java.io.FileOutputStream;37import java.io.IOException;38import java.io.InputStream;39import java.io.OutputStream;40import java.io.PrintWriter;41import java.security.InvalidKeyException;42import java.security.KeyPair;43import java.security.KeyPairGenerator;44import java.security.MessageDigest;45import java.security.NoSuchAlgorithmException;46import java.security.NoSuchProviderException;47import java.security.PrivateKey;48import java.security.PublicKey;49import java.security.Signature;50import java.security.SignatureException;51import java.security.cert.CertificateException;52import java.security.cert.CertificateFactory;53import java.security.cert.X509Certificate;54import java.util.Base64;55import java.util.Calendar;56import java.util.Date;57import java.util.TimeZone;58import sun.security.util.BitArray;59import sun.security.util.ObjectIdentifier;60import sun.security.x509.*;6162import static java.lang.System.out;6364public class V3Certificate {6566public static final String V3_FILE = "certV3";67public static final String V3_B64_FILE = "certV3.b64";6869public static void main(String[] args) throws IOException,70NoSuchAlgorithmException, InvalidKeyException, CertificateException,71NoSuchProviderException, SignatureException {7273boolean success = true;7475success &= test("RSA", "SHA256withRSA", 2048);76success &= test("DSA", "SHA256withDSA", 2048);77success &= test("EC", "SHA256withECDSA", 384);7879if (!success) {80throw new RuntimeException("At least one test case failed");81}82}8384public static boolean test(String algorithm, String sigAlg, int keyLength)85throws IOException,86NoSuchAlgorithmException,87InvalidKeyException,88CertificateException,89NoSuchProviderException,90SignatureException {9192byte[] issuerId = {1, 2, 3, 4, 5};93byte[] subjectId = {6, 7, 8, 9, 10};94boolean testResult = true;9596// Subject and Issuer97X500Name subject = new X500Name("test", "Oracle", "Santa Clara",98"US");99X500Name issuer = subject;100101// Generate keys and sign102KeyPairGenerator keyGen = KeyPairGenerator.getInstance(algorithm);103keyGen.initialize(keyLength);104KeyPair pair = keyGen.generateKeyPair();105PublicKey publicKey = pair.getPublic();106PrivateKey privateKey = pair.getPrivate();107MessageDigest md = MessageDigest.getInstance("SHA");108byte[] keyId = md.digest(publicKey.getEncoded());109110Signature signature = Signature.getInstance(sigAlg);111signature.initSign(privateKey);112113// Validity interval114Date firstDate = new Date();115Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("PST"));116cal.set(2014, 03, 10, 12, 30, 30);117Date lastDate = cal.getTime();118CertificateValidity interval = new CertificateValidity(firstDate,119lastDate);120121// Certificate Info122X509CertInfo cert = new X509CertInfo();123124cert.set(X509CertInfo.VERSION,125new CertificateVersion(CertificateVersion.V3));126cert.set(X509CertInfo.SERIAL_NUMBER,127new CertificateSerialNumber((int) (firstDate.getTime() / 1000)));128cert.set(X509CertInfo.ALGORITHM_ID,129new CertificateAlgorithmId(AlgorithmId.get(sigAlg)));130cert.set(X509CertInfo.SUBJECT, subject);131cert.set(X509CertInfo.KEY, new CertificateX509Key(publicKey));132cert.set(X509CertInfo.VALIDITY, interval);133cert.set(X509CertInfo.ISSUER, issuer);134135cert.set(X509CertInfo.ISSUER_ID,136new UniqueIdentity(137new BitArray(issuerId.length * 8 - 2, issuerId)));138cert.set(X509CertInfo.SUBJECT_ID, new UniqueIdentity(subjectId));139140// Create Extensions141CertificateExtensions exts = new CertificateExtensions();142143GeneralNameInterface mailInf = new RFC822Name("[email protected]");144GeneralName mail = new GeneralName(mailInf);145GeneralNameInterface dnsInf = new DNSName("Oracle.com");146GeneralName dns = new GeneralName(dnsInf);147GeneralNameInterface uriInf = new URIName("http://www.Oracle.com");148GeneralName uri = new GeneralName(uriInf);149150// localhost151byte[] address = new byte[]{127, 0, 0, 1};152153GeneralNameInterface ipInf = new IPAddressName(address);154GeneralName ip = new GeneralName(ipInf);155156GeneralNameInterface oidInf =157new OIDName(ObjectIdentifier.of("1.2.3.4"));158GeneralName oid = new GeneralName(oidInf);159160SubjectAlternativeNameExtension subjectName161= new SubjectAlternativeNameExtension();162IssuerAlternativeNameExtension issuerName163= new IssuerAlternativeNameExtension();164165GeneralNames subjectNames166= (GeneralNames) subjectName.167get(SubjectAlternativeNameExtension.SUBJECT_NAME);168169GeneralNames issuerNames170= (GeneralNames) issuerName.171get(IssuerAlternativeNameExtension.ISSUER_NAME);172173subjectNames.add(mail);174subjectNames.add(dns);175subjectNames.add(uri);176177issuerNames.add(ip);178issuerNames.add(oid);179180cal.set(2000, 11, 15, 12, 30, 30);181lastDate = cal.getTime();182PrivateKeyUsageExtension pkusage183= new PrivateKeyUsageExtension(firstDate, lastDate);184185KeyUsageExtension usage = new KeyUsageExtension();186usage.set(KeyUsageExtension.CRL_SIGN, true);187usage.set(KeyUsageExtension.DIGITAL_SIGNATURE, true);188usage.set(KeyUsageExtension.NON_REPUDIATION, true);189190KeyIdentifier kid = new KeyIdentifier(keyId);191SerialNumber sn = new SerialNumber(42);192AuthorityKeyIdentifierExtension aki193= new AuthorityKeyIdentifierExtension(kid, subjectNames, sn);194195SubjectKeyIdentifierExtension ski196= new SubjectKeyIdentifierExtension(keyId);197198BasicConstraintsExtension cons199= new BasicConstraintsExtension(true, 10);200201PolicyConstraintsExtension pce = new PolicyConstraintsExtension(2, 4);202203exts.set(SubjectAlternativeNameExtension.NAME, subjectName);204exts.set(IssuerAlternativeNameExtension.NAME, issuerName);205exts.set(PrivateKeyUsageExtension.NAME, pkusage);206exts.set(KeyUsageExtension.NAME, usage);207exts.set(AuthorityKeyIdentifierExtension.NAME, aki);208exts.set(SubjectKeyIdentifierExtension.NAME, ski);209exts.set(BasicConstraintsExtension.NAME, cons);210exts.set(PolicyConstraintsExtension.NAME, pce);211cert.set(X509CertInfo.EXTENSIONS, exts);212213// Generate and sign X509CertImpl214X509CertImpl crt = new X509CertImpl(cert);215crt.sign(privateKey, sigAlg);216crt.verify(publicKey);217218try (FileOutputStream fos = new FileOutputStream(new File(V3_FILE));219FileOutputStream fos_b64220= new FileOutputStream(new File(V3_B64_FILE));221PrintWriter pw = new PrintWriter(fos_b64)) {222crt.encode((OutputStream) fos);223fos.flush();224225// Certificate boundaries/226pw.println("-----BEGIN CERTIFICATE-----");227pw.flush();228fos_b64.write(Base64.getMimeEncoder().encode(crt.getEncoded()));229fos_b64.flush();230pw.println("-----END CERTIFICATE-----");231}232233out.println("*** Certificate ***");234out.println(crt);235out.println("*** End Certificate ***");236237X509Certificate x2 = generateCertificate(V3_FILE);238if (!x2.equals(crt)) {239out.println("*** Certificate mismatch ***");240testResult = false;241}242243X509Certificate x3 = generateCertificate(V3_B64_FILE);244if (!x3.equals(crt)) {245out.println("*** Certificate mismatch ***");246testResult = false;247}248249return testResult;250}251252static X509Certificate generateCertificate(String certFile) {253try (InputStream inStrm = new FileInputStream(certFile)) {254CertificateFactory cf = CertificateFactory.getInstance("X509");255X509Certificate x2256= (X509Certificate) cf.generateCertificate(inStrm);257return x2;258} catch (CertificateException | IOException e) {259throw new RuntimeException("Exception while "260+ "genrating certificate for " + certFile, e);261}262}263}264265266