Path: blob/master/test/jdk/sun/security/tools/keytool/KeyToolTest.java
41152 views
/*1* Copyright (c) 2005, 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 6251120 8231950 824215126* @summary Testing keytool27*28* Run through autotest.sh and manualtest.sh29*30* Testing non-PKCS11 keystores:31* echo | java -Dfile KeyToolTest32*33* Testing NSS PKCS11 keystores:34* # testing NSS35* # make sure the NSS db files are in current directory and writable36* echo | java -Dnss -Dnss.lib=/path/to/libsoftokn3.so KeyToolTest37*38* ATTENTION:39* Exception in thread "main" java.security.ProviderException:40* sun.security.pkcs11.wrapper.PKCS11Exception: CKR_KEY_SIZE_RANGE41* at sun.security.pkcs11.P11Signature.engineSign(P11Signature.java:420)42* ...43* Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_KEY_SIZE_RANGE44* at sun.security.pkcs11.wrapper.PKCS11.C_SignFinal(Native Method)45* at sun.security.pkcs11.P11Signature.engineSign(P11Signature.java:391)46* ...47* been observed. Possibly a Solaris bug48*49* ATTENTION:50* NSS PKCS11 config file are changed, DSA not supported now.51*52* @library /test/lib53* @modules java.base/sun.security.tools.keytool54* java.base/sun.security.util55* java.base/sun.security.x50956* @run main/othervm/timeout=600 -Dfile KeyToolTest57*/5859import java.nio.file.Files;60import java.nio.file.Paths;61import java.security.KeyStore;62import sun.security.x509.*;63import java.io.*;64import java.security.KeyPairGenerator;65import java.security.NoSuchAlgorithmException;66import java.util.*;67import java.security.cert.X509Certificate;68import jdk.test.lib.util.FileUtils;69import sun.security.util.ObjectIdentifier;707172public class KeyToolTest {7374// The stdout and stderr outputs after a keytool run75String out;76String err;7778// the output of println() in KeyTool.run79String ex;8081String lastInput = "", lastCommand = "";82private static final boolean debug =83System.getProperty("debug") != null;8485static final String NSS_P11_ARG =86"-keystore NONE -storetype PKCS11 -providerName SunPKCS11-nss " +87"-addprovider SunPKCS11 " +88"-providerArg p11-nss.txt ";89// Use -providerClass here, to confirm it still works for SunPKCS11.90static final String NSS_SRC_P11_ARG =91"-srckeystore NONE -srcstoretype PKCS11 " +92"-srcproviderName SunPKCS11-nss " +93"-providerClass sun.security.pkcs11.SunPKCS11 " +94"-providerArg p11-nss.txt ";95static final String NZZ_P11_ARG =96"-keystore NONE -storetype PKCS11 -providerName SunPKCS11-nzz " +97"-addprovider SunPKCS11 " +98"-providerArg p11-nzz.txt ";99static final String NZZ_SRC_P11_ARG =100"-srckeystore NONE -srcstoretype PKCS11 " +101"-srcproviderName SunPKCS11-nzz " +102"-addprovider SunPKCS11 " +103"-providerArg p11-nzz.txt ";104105String p11Arg, srcP11Arg;106107/** Creates a new instance of KeyToolTest */108KeyToolTest() {109// so that there is "Warning" and not translated into other language110Locale.setDefault(Locale.US);111}112113/**114* Helper, removes a file115*/116void remove(String filename) {117if (debug) {118System.err.println("Removing " + filename);119}120try{121FileUtils.deleteFileIfExistsWithRetry(Paths.get(filename));122}catch(IOException e) {123throw new RuntimeException("Error deleting " + filename, e);124}125}126127/**128* Run a set of keytool command with given terminal input.129* @param input the terminal inputs, the characters typed by human130* if <code>cmd</code> is running on a terminal131* @param cmd the argument of a keytool command line132* @throws if keytool goes wrong in some place133*/134void test(String input, String cmd) throws Exception {135lastInput = input;136lastCommand = cmd;137138// "X" is appended so that we can precisely test how input is consumed139HumanInputStream in = new HumanInputStream(input+"X");140test(in, cmd);141// make sure the input string is no more no less142if(in.read() != 'X' || in.read() != -1)143throw new Exception("Input not consumed exactly");144}145146void test(InputStream in, String cmd) throws Exception {147148// save the original 3 streams149if (debug) {150System.err.println(cmd);151} else {152System.err.print(".");153}154PrintStream p1 = System.out;155PrintStream p2 = System.err;156InputStream i1 = System.in;157158ByteArrayOutputStream b1 = new ByteArrayOutputStream();159ByteArrayOutputStream b2 = new ByteArrayOutputStream();160161try {162System.setIn(in);163System.setOut(new PrintStream(b1));164System.setErr(new PrintStream(b2));165166// since System.in is overrided, the167// sun.security.tools.keytool.Main.main() method will168// never block at user input169170// use -debug so that main() will throw an Exception171// instead of calling System.exit()172sun.security.tools.keytool.Main.main(("-debug "+cmd).split("\\s+"));173} finally {174out = b1.toString();175err = b2.toString();176ex = out; // now it goes to System.out177System.setIn(i1);178System.setOut(p1);179System.setErr(p2);180}181}182183/**184* Call this method if you expect test(input, cmd) should go OK185*/186void testOK(String input, String cmd) throws Exception {187try {188// Workaround for "8057810: Make SHA256withDSA the default189// jarsigner and keytool algorithm for DSA keys". Unfortunately190// SunPKCS11-NSS does not support SHA256withDSA yet.191if (cmd.contains("p11-nss.txt") && cmd.contains("-genkey")192&& cmd.contains("DSA")) {193cmd += " -sigalg SHA1withDSA -keysize 1024";194}195test(input, cmd);196} catch(Exception e) {197afterFail(input, cmd, "OK");198throw e;199}200}201202/**203* Call this method if you expect test(input, cmd) should fail and throw204* an exception205*/206void testFail(String input, String cmd) throws Exception {207boolean ok;208try {209test(input, cmd);210ok = true;211} catch(Exception e) {212if (e instanceof MissingResourceException) {213ok = true;214} else {215ok = false;216}217}218if(ok) {219afterFail(input, cmd, "FAIL");220throw new RuntimeException();221}222}223224/**225* Call this method if you expect test(input, cmd) should go OK226*/227void testOK(InputStream is, String cmd) throws Exception {228try {229test(is, cmd);230} catch(Exception e) {231afterFail("", cmd, "OK");232throw e;233}234}235236/**237* Call this method if you expect test(input, cmd) should fail and throw238* an exception239*/240void testFail(InputStream is, String cmd) throws Exception {241boolean ok;242try {243test(is, cmd);244ok = true;245} catch(Exception e) {246ok = false;247}248if(ok) {249afterFail("", cmd, "FAIL");250throw new RuntimeException();251}252}253254/**255* Call this method if you just want to run the command and does256* not care if it succeeds or fails.257*/258void testAnyway(String input, String cmd) {259try {260test(input, cmd);261} catch(Exception e) {262;263}264}265266/**267* Helper method, print some output after a test does not do as expected268*/269void afterFail(String input, String cmd, String should) {270if (cmd.contains("p11-nss.txt")) {271cmd = "-J-Dnss.lib=" + System.getProperty("nss.lib") + " " + cmd;272}273System.err.println("\nTest fails for the command ---\n" +274"keytool " + cmd + "\nOr its debug version ---\n" +275"keytool -debug " + cmd);276277System.err.println("The command result should be " + should +278", but it's not. Try run the command manually and type" +279" these input into it: ");280char[] inputChars = input.toCharArray();281282for (int i=0; i<inputChars.length; i++) {283char ch = inputChars[i];284if (ch == '\n') System.err.print("ENTER ");285else if (ch == ' ') System.err.print("SPACE ");286else System.err.print(ch + " ");287}288System.err.println("");289290System.err.println("ERR is:\n"+err);291System.err.println("OUT is:\n"+out);292}293294void assertTrue(boolean bool, String msg) {295if (debug) {296System.err.println("If not " + bool + ", " + msg);297} else {298System.err.print("v");299}300if(!bool) {301afterFail(lastInput, lastCommand, "TRUE");302System.err.println(msg);303throw new RuntimeException(msg);304}305}306307void assertTrue(boolean bool) {308assertTrue(bool, "well...");309}310/**311* Helper method, load a keystore312* @param file file for keystore, null or "NONE" for PKCS11313* @pass password for the keystore314* @type keystore type315* @returns the KeyStore object316* @exception Exception if anything goes wrong317*/318KeyStore loadStore(String file, String pass, String type) throws Exception {319KeyStore ks = KeyStore.getInstance(type);320FileInputStream is = null;321if (file != null && !file.equals("NONE")) {322is = new FileInputStream(file);323}324ks.load(is, pass.toCharArray());325is.close();326return ks;327}328329/**330* The test suite.331* Maybe it's better to put this outside the KeyToolTest class332*/333void testAll() throws Exception {334KeyStore ks;335336remove("x.jks");337remove("x.jceks");338remove("x.p12");339remove("x2.jceks");340remove("x2.jks");341remove("x.jks.p1.cert");342343// name changes: genkeypair, importcert, exportcert344remove("x.jks");345remove("x.jks.p1.cert");346testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +347"-keypass changeit -genkeypair -keyalg DSA -alias p1 -dname CN=olala");348testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +349"-exportcert -alias p1 -file x.jks.p1.cert");350ks = loadStore("x.jks", "changeit", "JKS");351assertTrue(ks.getKey("p1", "changeit".toCharArray()) != null,352"key not DSA");353assertTrue(new File("x.jks.p1.cert").exists(), "p1 export err");354testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +355"-delete -alias p1");356// importcert, prompt for Yes/No357testOK("y\n", "-keystore x.jks -storetype JKS -storepass changeit " +358"-importcert -alias c1 -file x.jks.p1.cert");359// importcert, -noprompt360testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +361"-importcert -alias c2 -file x.jks.p1.cert -noprompt");362ks = loadStore("x.jks", "changeit", "JKS");363assertTrue(ks.getCertificate("c1") != null, "import c1 err");364365// v3366byte[] encoded = ks.getCertificate("c1").getEncoded();367X509CertImpl certImpl = new X509CertImpl(encoded);368assertTrue(certImpl.getVersion() == 3, "Version is not 3");369370// changealias and keyclone371testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +372"-keypass changeit -genkeypair -keyalg DSA -alias p1 -dname CN=olala");373testOK("changeit\n", "-keystore x.jks -storetype JKS " +374"-changealias -alias p1 -destalias p11");375testOK("changeit\n", "-keystore x.jks -storetype JKS " +376"-changealias -alias c1 -destalias c11");377// press ENTER when prompt for p111's keypass378testOK("changeit\n\n", "-keystore x.jks -storetype JKS " +379"-keyclone -alias p11 -destalias p111");380ks = loadStore("x.jks", "changeit", "JKS");381assertTrue(!ks.containsAlias("p1"), "there is no p1");382assertTrue(!ks.containsAlias("c1"), "there is no c1");383assertTrue(ks.containsAlias("p11"), "there is p11");384assertTrue(ks.containsAlias("c11"), "there is c11");385assertTrue(ks.containsAlias("p111"), "there is p111");386387// genSecKey388remove("x.jceks");389// DES, no need keysize390testOK("changeit\nchangeit\n\n", "-keystore x.jceks -storetype JCEKS " +391"-genseckey -keyalg DES -alias s1");392// DES, keysize cannot be 128393testFail("changeit\n\n", "-keystore x.jceks -storetype JCEKS " +394"-genseckey -keyalg DES -alias s11 -keysize 128");395// DESede. no need keysize396testOK("changeit\n\n", "-keystore x.jceks -storetype JCEKS " +397"-genseckey -keyalg DESede -alias s2");398// AES, need keysize399testFail("changeit\n\n", "-keystore x.jceks -storetype AES " +400"-genseckey -keyalg Rijndael -alias s3");401testOK("changeit\n\n", "-keystore x.jceks -storetype JCEKS " +402"-genseckey -keyalg AES -alias s3 -keysize 128");403// about keypass404// can accept storepass405testOK("\n", "-keystore x.jceks -storetype JCEKS -storepass changeit " +406"-genseckey -keyalg DES -alias s4");407// or a new one408testOK("keypass\nkeypass\n", "-keystore x.jceks -storetype JCEKS " +409"-storepass changeit -genseckey -keyalg DES -alias s5");410// keypass must be valid (prompt 3 times)411testOK("bad\n\bad\nkeypass\nkeypass\n", "-keystore x.jceks " +412"-storetype JCEKS -storepass changeit -genseckey " +413"-keyalg DES -alias s6");414// keypass must be valid (prompt 3 times)415testFail("bad\n\bad\nbad\n", "-keystore x.jceks -storetype JCEKS " +416"-storepass changeit -genseckey -keyalg DES -alias s7");417// keypass must be valid (prompt 3 times)418testFail("bad\n\bad\nbad\nkeypass\n", "-keystore x.jceks " +419"-storetype JCEKS -storepass changeit -genseckey -keyalg DES -alias s7");420ks = loadStore("x.jceks", "changeit", "JCEKS");421assertTrue(ks.getKey("s1", "changeit".toCharArray())422.getAlgorithm().equalsIgnoreCase("DES"), "s1 is DES");423assertTrue(ks.getKey("s1", "changeit".toCharArray())424.getEncoded().length == 8, "DES is 56");425assertTrue(ks.getKey("s2", "changeit".toCharArray())426.getEncoded().length == 24, "DESede is 168");427assertTrue(ks.getKey("s2", "changeit".toCharArray())428.getAlgorithm().equalsIgnoreCase("DESede"), "s2 is DESede");429assertTrue(ks.getKey("s3", "changeit".toCharArray())430.getAlgorithm().equalsIgnoreCase("AES"), "s3 is AES");431assertTrue(ks.getKey("s4", "changeit".toCharArray())432.getAlgorithm().equalsIgnoreCase("DES"), "s4 is DES");433assertTrue(ks.getKey("s5", "keypass".toCharArray())434.getAlgorithm().equalsIgnoreCase("DES"), "s5 is DES");435assertTrue(ks.getKey("s6", "keypass".toCharArray())436.getAlgorithm().equalsIgnoreCase("DES"), "s6 is DES");437assertTrue(!ks.containsAlias("s7"), "s7 not created");438439// maybe we needn't test this, one day JKS will support SecretKey440//testFail("changeit\nchangeit\n", "-keystore x.jks -storetype JKS " +441// "-genseckey -keyalg AES -alias s3 -keysize 128");442443// importKeyStore444remove("x.jks");445remove("x.jceks");446// create 2 entries...447testOK("changeit\nchangeit\n\n", "-keystore x.jceks -storetype JCEKS " +448"-genkeypair -keyalg DSA -alias p1 -dname CN=Olala");449testOK("", "-keystore x.jceks -storetype JCEKS -storepass changeit " +450"-importcert -alias c1 -file x.jks.p1.cert -noprompt");451ks = loadStore("x.jceks", "changeit", "JCEKS");452assertTrue(ks.size() == 2, "2 entries in JCEKS");453// import, shouldn't mention destalias/srckeypass/destkeypass454// if srcalias is no given455testFail("changeit\nchangeit\n", "-importkeystore " +456"-srckeystore x.jceks -srcstoretype JCEKS " +457"-destkeystore x.jks -deststoretype JKS -destalias pp");458testFail("changeit\nchangeit\n", "-importkeystore " +459"-srckeystore x.jceks -srcstoretype JCEKS " +460"-destkeystore x.jks -deststoretype JKS -srckeypass changeit");461testFail("changeit\nchangeit\n", "-importkeystore " +462"-srckeystore x.jceks -srcstoretype JCEKS " +463"-destkeystore x.jks -deststoretype JKS -destkeypass changeit");464// normal import465testOK("changeit\nchangeit\nchangeit\n", "-importkeystore " +466"-srckeystore x.jceks -srcstoretype JCEKS " +467"-destkeystore x.jks -deststoretype JKS");468ks = loadStore("x.jks", "changeit", "JKS");469assertTrue(ks.size() == 2, "2 entries in JKS");470// import again, type yes to overwrite old entries471testOK("changeit\nchangeit\ny\ny\n", "-importkeystore " +472"-srckeystore x.jceks -srcstoretype JCEKS " +473"-destkeystore x.jks -deststoretype JKS");474ks = loadStore("x.jks", "changeit", "JKS");475// import again, specify -nopromt476testOK("changeit\nchangeit\n", "-importkeystore " +477"-srckeystore x.jceks -srcstoretype JCEKS " +478"-destkeystore x.jks -deststoretype JKS -noprompt");479assertTrue(err.indexOf("Warning") != -1, "noprompt will warn");480ks = loadStore("x.jks", "changeit", "JKS");481assertTrue(ks.size() == 2, "2 entries in JKS");482// import again, type into new aliases when prompted483testOK("changeit\nchangeit\n\ns1\n\ns2\n", "-importkeystore " +484"-srckeystore x.jceks -srcstoretype JCEKS " +485"-destkeystore x.jks -deststoretype JKS");486ks = loadStore("x.jks", "changeit", "JKS");487assertTrue(ks.size() == 4, "4 entries in JKS");488489// importkeystore single490// normal491remove("x.jks");492testOK("changeit\nchangeit\nchangeit\n", "-importkeystore " +493"-srckeystore x.jceks -srcstoretype JCEKS " +494"-destkeystore x.jks -deststoretype JKS -srcalias p1");495ks = loadStore("x.jks", "changeit", "JKS");496assertTrue(ks.size() == 1, "1 entries in JKS");497// overwrite498testOK("changeit\nchangeit\ny\n", "-importkeystore " +499"-srckeystore x.jceks -srcstoretype JCEKS " +500"-destkeystore x.jks -deststoretype JKS -srcalias p1");501ks = loadStore("x.jks", "changeit", "JKS");502assertTrue(ks.size() == 1, "1 entries in JKS");503// noprompt504testOK("changeit\nchangeit\n", "-importkeystore " +505"-srckeystore x.jceks -srcstoretype JCEKS " +506"-destkeystore x.jks -deststoretype JKS " +507"-srcalias p1 -noprompt");508ks = loadStore("x.jks", "changeit", "JKS");509assertTrue(ks.size() == 1, "1 entries in JKS");510// rename511testOK("changeit\nchangeit\n", "-importkeystore " +512"-srckeystore x.jceks -srcstoretype JCEKS " +513"-destkeystore x.jks -deststoretype JKS " +514"-srcalias p1 -destalias p2");515ks = loadStore("x.jks", "changeit", "JKS");516assertTrue(ks.size() == 2, "2 entries in JKS");517// another rename518testOK("changeit\nchangeit\n\nnewalias\n", "-importkeystore " +519"-srckeystore x.jceks -srcstoretype JCEKS " +520"-destkeystore x.jks -deststoretype JKS -srcalias p1");521ks = loadStore("x.jks", "changeit", "JKS");522assertTrue(ks.size() == 3, "3 entries in JKS");523524// importkeystore single, different keypass525remove("x.jks");526// generate entry with different keypass527testOK("changeit\nkeypass\nkeypass\n", "-keystore x.jceks " +528"-storetype JCEKS -genkeypair -keyalg DSA -alias p2 -dname CN=Olala");529// prompt530testOK("changeit\nchangeit\nchangeit\nkeypass\n", "-importkeystore " +531"-srckeystore x.jceks -srcstoretype JCEKS " +532"-destkeystore x.jks -deststoretype JKS -srcalias p2");533ks = loadStore("x.jks", "changeit", "JKS");534assertTrue(ks.size() == 1, "1 entries in JKS");535// diff destkeypass536testOK("changeit\nchangeit\nkeypass\n", "-importkeystore " +537"-srckeystore x.jceks -srcstoretype JCEKS " +538"-destkeystore x.jks -deststoretype JKS " +539"-srcalias p2 -destalias p3 -destkeypass keypass2");540ks = loadStore("x.jks", "changeit", "JKS");541assertTrue(ks.size() == 2, "2 entries in JKS");542assertTrue(ks.getKey("p2", "keypass".toCharArray()) != null,543"p2 has old password");544assertTrue(ks.getKey("p3", "keypass2".toCharArray()) != null,545"p3 has new password");546547// importkeystore single, cert548remove("x.jks");549// normal550testOK("changeit\nchangeit\nchangeit\n", "-importkeystore " +551"-srckeystore x.jceks -srcstoretype JCEKS " +552"-destkeystore x.jks -deststoretype JKS -srcalias c1");553// in fact srcstorepass can be ignored554testOK("changeit\n\n", "-importkeystore " +555"-srckeystore x.jceks -srcstoretype JCEKS " +556"-destkeystore x.jks -deststoretype JKS " +557"-srcalias c1 -destalias c2");558assertTrue(err.indexOf("WARNING") != -1, "But will warn");559// 2nd import, press y to overwrite ...560testOK("changeit\n\ny\n", "-importkeystore " +561"-srckeystore x.jceks -srcstoretype JCEKS " +562"-destkeystore x.jks -deststoretype JKS " +563"-srcalias c1 -destalias c2");564// ... or rename565testOK("changeit\n\n\nc3\n", "-importkeystore " +566"-srckeystore x.jceks -srcstoretype JCEKS " +567"-destkeystore x.jks -deststoretype JKS " +568"-srcalias c1 -destalias c2");569ks = loadStore("x.jks", "changeit", "JKS");570// c1, c2, c3571assertTrue(ks.size() == 3, "3 entries in JKS");572573// importkeystore, secretkey574remove("x.jks");575// create SecretKeyEntry576testOK("changeit\n\n", "-keystore x.jceks -storetype JCEKS " +577"-genseckey -keyalg DES -alias s1");578// create SecretKeyEntry579testOK("changeit\n\n", "-keystore x.jceks -storetype JCEKS " +580"-genseckey -keyalg DES -alias s2");581// remove the keypass!=storepass one582testOK("changeit\n", "-keystore x.jceks -storetype JCEKS " +583"-delete -alias p2");584ks = loadStore("x.jceks", "changeit", "JCEKS");585// p1, c1, s1, s2586assertTrue(ks.size() == 4, "4 entries in JCEKS");587// normal588testOK("changeit\nchangeit\nchangeit\n", "-importkeystore " +589"-srckeystore x.jceks -srcstoretype JCEKS " +590"-destkeystore x.jks -deststoretype JKS -srcalias s1");591assertTrue(err.indexOf("not imported") != -1, "Not imported");592assertTrue(err.indexOf("Cannot store non-PrivateKeys") != -1,593"Not imported");594595// Importing a JCEKS keystore to a JKS one. Will warn596// for the 2 SecretKey entries597598remove("x.jks");599// Two "no" answers to bypass warnings600// normal601testOK("\n\n", "-srcstorepass changeit -deststorepass changeit " +602"-importkeystore -srckeystore x.jceks -srcstoretype JCEKS " +603"-destkeystore x.jks -deststoretype JKS");604assertTrue(err.indexOf("s1 not") != -1, "s1 not");605assertTrue(err.indexOf("s2 not") != -1, "s2 not");606assertTrue(err.indexOf("c1 success") != -1, "c1 success");607assertTrue(err.indexOf("p1 success") != -1, "p1 success");608remove("x.jks");609// One "yes" to stop610// normal611testOK("yes\n", "-srcstorepass changeit -deststorepass changeit " +612"-importkeystore -srckeystore x.jceks -srcstoretype JCEKS " +613"-destkeystore x.jks -deststoretype JKS");614// maybe c1 or p1 has been imported before s1 or s2 is touched,615// anyway we know yesNo is only asked once.616617// pkcs12618remove("x.jks");619// JKS prompt for keypass620testFail("changeit\nchangeit\n", "-keystore x.jks -storetype JKS " +621"-genkeypair -alias p1 -dname CN=olala");622remove("x.jks");623// just type ENTER means keypass=storepass624testOK("changeit\nchangeit\n\n", "-keystore x.jks -storetype JKS " +625"-genkeypair -keyalg DSA -alias p1 -dname CN=olala");626remove("x.p12");627// PKCS12 only need storepass628testOK("", "-keystore x.p12 -storetype PKCS12 -storepass changeit " +629"-genkeypair -keyalg DSA -alias p0 -dname CN=olala");630testOK("changeit\n", "-keystore x.p12 -storetype PKCS12 " +631"-genkeypair -keyalg DSA -alias p1 -dname CN=olala");632// when specify keypass, make sure keypass==storepass...633testOK("changeit\n", "-keystore x.p12 -keypass changeit " +634"-storetype PKCS12 -genkeypair -keyalg DSA -alias p3 -dname CN=olala");635assertTrue(err.indexOf("Warning") == -1,636"PKCS12 silent when keypass == storepass");637// otherwise, print a warning638testOK("changeit\n", "-keystore x.p12 -keypass another" +639" -storetype PKCS12 -genkeypair -keyalg DSA -alias p2 -dname CN=olala");640assertTrue(err.indexOf("Warning") != -1,641"PKCS12 warning when keypass != storepass");642// no -keypasswd for PKCS12643testFail("", "-keystore x.p12 -storepass changeit -storetype PKCS12" +644" -keypasswd -new changeit -alias p3");645testOK("", "-keystore x.p12 -storepass changeit -storetype PKCS12 " +646"-changealias -alias p3 -destalias p33");647testOK("", "-keystore x.p12 -storepass changeit -storetype PKCS12 " +648"-keyclone -alias p33 -destalias p3");649650// pkcs12651remove("x.p12");652// PKCS12 only need storepass653testOK("", "-keystore x.p12 -storetype PKCS12 -storepass changeit " +654"-genkeypair -keyalg DSA -alias p0 -dname CN=olala");655testOK("", "-storepass changeit -keystore x.p12 -storetype PKCS12 " +656"-genkeypair -keyalg DSA -alias p1 -dname CN=olala");657// when specify keypass, make sure keypass==storepass...658testOK("", "-storepass changeit -keystore x.p12 -keypass changeit " +659"-storetype PKCS12 -genkeypair -keyalg DSA -alias p3 -dname CN=olala");660assertTrue(err.indexOf("Warning") == -1,661"PKCS12 silent when keypass == storepass");662// otherwise, print a warning663testOK("", "-storepass changeit -keystore x.p12 -keypass another " +664"-storetype PKCS12 -genkeypair -keyalg DSA -alias p2 -dname CN=olala");665assertTrue(err.indexOf("Warning") != -1,666"PKCS12 warning when keypass != storepass");667668remove("x.jks");669remove("x.jceks");670remove("x.p12");671remove("x2.jceks");672remove("x2.jks");673remove("x.jks.p1.cert");674}675676void testPKCS11() throws Exception {677KeyStore ks;678// pkcs11, the password maybe different and maybe PKCS11 not supported679680// in case last test is not executed successfully681testAnyway("", p11Arg + "-storepass test12 -delete -alias p1");682testAnyway("", p11Arg + "-storepass test12 -delete -alias p2");683testAnyway("", p11Arg + "-storepass test12 -delete -alias p3");684testAnyway("", p11Arg + "-storepass test12 -delete -alias nss");685686testOK("", p11Arg + "-storepass test12 -list");687assertTrue(out.indexOf("Your keystore contains 0 entries") != -1,688"*** MAKE SURE YOU HAVE NO ENTRIES IN YOUR PKCS11 KEYSTORE " +689"BEFORE THIS TEST ***");690691testOK("", p11Arg +692"-storepass test12 -genkeypair -keyalg DSA -alias p1 -dname CN=olala");693testOK("test12\n", p11Arg + "-genkeypair -keyalg DSA -alias p2 -dname CN=olala2");694// cannot provide keypass for PKCS11695testFail("test12\n", p11Arg +696"-keypass test12 -genkeypair -keyalg DSA -alias p3 -dname CN=olala3");697// cannot provide keypass for PKCS11698testFail("test12\n", p11Arg +699"-keypass nonsense -genkeypair -keyalg DSA -alias p3 -dname CN=olala3");700701testOK("", p11Arg + "-storepass test12 -list");702assertTrue(out.indexOf("Your keystore contains 2 entries") != -1,703"2 entries in p11");704705testOK("test12\n", p11Arg + "-alias p1 -changealias -destalias p3");706testOK("", p11Arg + "-storepass test12 -list -alias p3");707testFail("", p11Arg + "-storepass test12 -list -alias p1");708709testOK("test12\n", p11Arg + "-alias p3 -keyclone -destalias p1");710// in PKCS11, keyclone will delete old711testFail("", p11Arg + "-storepass test12 -list -alias p3");712testOK("", p11Arg + "-storepass test12 -list -alias p1");713714// cannot change password for PKCS11715testFail("test12\n", p11Arg + "-alias p1 -keypasswd -new another");716717testOK("", p11Arg + "-storepass test12 -list");718assertTrue(out.indexOf("Your keystore contains 2 entries") != -1,719"2 entries in p11");720721testOK("", p11Arg + "-storepass test12 -delete -alias p1");722testOK("", p11Arg + "-storepass test12 -delete -alias p2");723724testOK("", p11Arg + "-storepass test12 -list");725assertTrue(out.indexOf("Your keystore contains 0 entries") != -1,726"*** MAKE SURE YOU HAVE NO ENTRIES IN YOUR PKCS11 KEYSTORE" +727" BEFORE THIS TEST ***");728}729730void testPKCS11ImportKeyStore() throws Exception {731732KeyStore ks;733testOK("", p11Arg +734"-storepass test12 -genkeypair -keyalg DSA -alias p1 -dname CN=olala");735testOK("test12\n", p11Arg + "-genkeypair -keyalg DSA -alias p2 -dname CN=olala2");736// test importkeystore for pkcs11737738remove("x.jks");739// pkcs11 -> jks740testOK("changeit\nchangeit\ntest12\n", srcP11Arg +741("-importkeystore -destkeystore x.jks -deststoretype JKS " +742"-srcalias p1"));743assertTrue(err.indexOf("not imported") != -1,744"cannot import key without destkeypass");745ks = loadStore("x.jks", "changeit", "JKS");746assertTrue(!ks.containsAlias("p1"), "p1 is not imported");747748testOK("changeit\ntest12\n", srcP11Arg +749("-importkeystore -destkeystore x.jks -deststoretype JKS " +750"-srcalias p1 -destkeypass changeit"));751testOK("changeit\ntest12\n", srcP11Arg +752("-importkeystore -destkeystore x.jks -deststoretype JKS " +753"-srcalias p2 -destkeypass changeit"));754ks = loadStore("x.jks", "changeit", "JKS");755assertTrue(ks.containsAlias("p1"), "p1 is imported");756assertTrue(ks.containsAlias("p2"), "p2 is imported");757// jks -> pkcs11758testOK("", p11Arg + "-storepass test12 -delete -alias p1");759testOK("", p11Arg + "-storepass test12 -delete -alias p2");760testOK("test12\nchangeit\n", p11Arg +761"-importkeystore -srckeystore x.jks -srcstoretype JKS");762testOK("", p11Arg + "-storepass test12 -list -alias p1");763testOK("", p11Arg + "-storepass test12 -list -alias p2");764testOK("", p11Arg + "-storepass test12 -list");765assertTrue(out.indexOf("Your keystore contains 2 entries") != -1,766"2 entries in p11");767// clean up768testOK("", p11Arg + "-storepass test12 -delete -alias p1");769testOK("", p11Arg + "-storepass test12 -delete -alias p2");770testOK("", p11Arg + "-storepass test12 -list");771assertTrue(out.indexOf("Your keystore contains 0 entries") != -1,772"empty p11");773774remove("x.jks");775}776777// Selected sqeTest778void sqeTest() throws Exception {779FileOutputStream fos = new FileOutputStream("badkeystore");780for (int i=0; i<100; i++) {781fos.write(i);782}783fos.close();784785sqeCsrTest();786sqePrintcertTest();787sqeDeleteTest();788sqeExportTest();789sqeGenkeyTest();790sqeImportTest();791sqeKeyclonetest();792sqeKeypasswdTest();793sqeListTest();794sqeSelfCertTest();795sqeStorepassTest();796797remove("badkeystore");798}799800// Import: cacert, prompt, trusted, non-trusted, bad chain, not match801void sqeImportTest() throws Exception {802KeyStore ks;803remove("x.jks");804testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +805"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");806testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +807"-exportcert -file x.jks.p1.cert");808/* deleted */ testOK("", "-keystore x.jks -storetype JKS " +809"-storepass changeit -delete -alias mykey");810testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +811"-importcert -file x.jks.p1.cert -noprompt");812/* deleted */ testOK("", "-keystore x.jks -storetype JKS " +813"-storepass changeit -delete -alias mykey");814testOK("yes\n", "-keystore x.jks -storetype JKS -storepass changeit " +815"-importcert -file x.jks.p1.cert");816ks = loadStore("x.jks", "changeit", "JKS");817assertTrue(ks.containsAlias("mykey"), "imported");818/* deleted */ testOK("", "-keystore x.jks -storetype JKS " +819"-storepass changeit -delete -alias mykey");820testOK("\n", "-keystore x.jks -storetype JKS -storepass changeit " +821"-importcert -file x.jks.p1.cert");822ks = loadStore("x.jks", "changeit", "JKS");823assertTrue(!ks.containsAlias("mykey"), "imported");824testOK("no\n", "-keystore x.jks -storetype JKS -storepass changeit " +825"-importcert -file x.jks.p1.cert");826ks = loadStore("x.jks", "changeit", "JKS");827assertTrue(!ks.containsAlias("mykey"), "imported");828testFail("no\n", "-keystore x.jks -storetype JKS -storepass changeit " +829"-importcert -file nonexist");830testFail("no\n", "-keystore x.jks -storetype JKS -storepass changeit " +831"-importcert -file x.jks");832remove("x.jks");833}834// keyclone: exist. nonexist err, cert err, dest exist, misc835void sqeKeyclonetest() throws Exception {836remove("x.jks");837testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +838"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");839// new pass840testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +841"-keypass changeit -new newpass -keyclone -dest p0");842// new pass843testOK("\n", "-keystore x.jks -storetype JKS -storepass changeit " +844"-keypass changeit -keyclone -dest p1");845testOK("\n", "-keystore x.jks -storetype JKS -storepass changeit " +846"-keyclone -dest p2");847testFail("\n", "-keystore x.jks -storetype JKS -storepass changeit " +848"-keyclone -dest p2");849testFail("\n", "-keystore x.jks -storetype JKS -storepass changeit " +850"-keyclone -dest p3 -alias noexist");851// no cert852testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +853"-exportcert -file x.jks.p1.cert");854testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +855"-delete -alias mykey");856testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +857"-importcert -file x.jks.p1.cert -noprompt");858// new pass859testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +860"-keypass changeit -new newpass -keyclone -dest p0");861remove("x.jks");862}863// keypasswd: exist, short, nonexist err, cert err, misc864void sqeKeypasswdTest() throws Exception {865remove("x.jks");866testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +867"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");868testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +869"-keypass changeit -keypasswd -new newpass");870/*change back*/ testOK("", "-keystore x.jks -storetype JKS " +871"-storepass changeit -keypass newpass -keypasswd -new changeit");872testOK("newpass\nnewpass\n", "-keystore x.jks -storetype JKS " +873"-storepass changeit -keypass changeit -keypasswd");874/*change back*/ testOK("", "-keystore x.jks -storetype JKS " +875"-storepass changeit -keypass newpass -keypasswd -new changeit");876testOK("new\nnew\nnewpass\nnewpass\n", "-keystore x.jks " +877"-storetype JKS -storepass changeit -keypass changeit -keypasswd");878/*change back*/ testOK("", "-keystore x.jks -storetype JKS " +879"-storepass changeit -keypass newpass -keypasswd -new changeit");880testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +881"-keypasswd -new newpass");882/*change back*/ testOK("", "-keystore x.jks -storetype JKS " +883"-storepass changeit -keypass newpass -keypasswd -new changeit");884testOK("changeit\n", "-keystore x.jks -storetype JKS " +885"-keypasswd -new newpass");886/*change back*/ testOK("", "-keystore x.jks -storetype JKS " +887"-storepass changeit -keypass newpass -keypasswd -new changeit");888testFail("", "-keystore x.jks -storetype JKS -storepass badpass " +889"-keypass changeit -keypasswd -new newpass");890testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +891"-keypass bad -keypasswd -new newpass");892// no cert893testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +894"-exportcert -file x.jks.p1.cert");895testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +896"-delete -alias mykey");897testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +898"-importcert -file x.jks.p1.cert -noprompt");899testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +900"-keypass changeit -keypasswd -new newpass");901// diff pass902testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +903"-delete -alias mykey");904testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +905"-keypass keypass -genkeypair -keyalg DSA -dname CN=olala");906testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +907"-keypasswd -new newpass");908testOK("keypass\n", "-keystore x.jks -storetype JKS " +909"-storepass changeit -keypasswd -new newpass");910// i hate those misc test911remove("x.jks");912}913// list: -f -alias, exist, nonexist err;914// otherwise, check all shows, -rfc shows more, and misc915void sqeListTest() throws Exception {916remove("x.jks");917testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +918"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");919testOK("", "-keystore x.jks -storetype JKS -storepass changeit -list");920testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +921"-list -alias mykey");922testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +923"-list -alias notexist");924testFail("", "-keystore x.jks -storetype JKS -storepass badpass " +925"-list -alias mykey");926// keypass ignore927testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +928"-keypass badpass -list -alias mykey");929testOK("\n", "-keystore x.jks -storetype JKS -list");930assertTrue(err.indexOf("WARNING") != -1, "no storepass");931testOK("changeit\n", "-keystore x.jks -storetype JKS -list");932assertTrue(err.indexOf("WARNING") == -1, "has storepass");933testFail("badpass\n", "-keystore x.jks -storetype JKS -list");934// misc935testFail("", "-keystore aa\\bb//cc -storepass changeit -list");936testFail("", "-keystore nonexisting -storepass changeit -list");937testFail("", "-keystore badkeystore -storepass changeit -list");938remove("x.jks");939}940// selfcert: exist, non-exist err, cert err, sig, dname, wrong keypass, misc941void sqeSelfCertTest() throws Exception {942remove("x.jks");943testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +944"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");945testOK("", "-keystore x.jks -storetype JKS -storepass changeit -selfcert");946testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +947"-keypass changeit -selfcert");948// not exist949testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +950"-keypass changeit -selfcert -alias nonexisting");951testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +952"-keypass changeit -selfcert -dname CN=NewName");953// sig not compatible954testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +955"-keypass changeit -selfcert -sigalg MD5withRSA");956// bad pass957testFail("", "-keystore x.jks -storetype JKS -storepass wrong " +958"-keypass changeit -selfcert");959// bad pass960testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +961"-keypass wrong -selfcert");962//misc963testFail("", "-keystore nonexist -storepass changeit " +964"-keypass changeit -selfcert");965testFail("", "-keystore aa//dd\\gg -storepass changeit " +966"-keypass changeit -selfcert");967// diff pass968remove("x.jks");969testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +970"-keypass keypass -genkeypair -keyalg DSA -dname CN=olala");971testFail("", "-keystore x.jks -storetype JKS " +972"-storepass changeit -selfcert");973testOK("keypass\n", "-keystore x.jks -storetype JKS " +974"-storepass changeit -selfcert");975976testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +977"-exportcert -file x.jks.p1.cert");978testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +979"-delete -alias mykey");980testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +981"-importcert -file x.jks.p1.cert -noprompt");982// certentry cannot do selfcert983testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +984"-selfcert");985remove("x.jks");986}987// storepass: bad old, short new, misc988void sqeStorepassTest() throws Exception {989remove("x.jks");990testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +991"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");992// all in arg993testOK("", "-storepasswd -keystore x.jks -storetype JKS " +994"-storepass changeit -new newstore");995/* Change back */ testOK("", "-storepasswd -keystore x.jks" +996" -storetype JKS -storepass newstore -new changeit");997// all not in arg, new twice998testOK("changeit\nnewstore\nnewstore\n", "-storepasswd " +999"-keystore x.jks -storetype JKS");1000/* Change back */ testOK("", "-storepasswd -keystore x.jks " +1001"-storetype JKS -storepass newstore -new changeit");1002// new in arg1003testOK("changeit\n", "-storepasswd -keystore x.jks " +1004"-storetype JKS -new newstore");1005/* Change back */ testOK("", "-storepasswd -keystore x.jks " +1006"-storetype JKS -storepass newstore -new changeit");1007// old in arg1008testOK("newstore\nnewstore\n", "-storepasswd -keystore x.jks " +1009"-storetype JKS -storepass changeit");1010/* Change back */ testOK("", "-storepasswd -keystore x.jks " +1011"-storetype JKS -storepass newstore -new changeit");1012// old in arg1013testOK("new\nnew\nnewstore\nnewstore\n", "-storepasswd " +1014"-keystore x.jks -storetype JKS -storepass changeit");1015/* Change back */ testOK("", "-storepasswd -keystore x.jks " +1016"-storetype JKS -storepass newstore -new changeit");1017// bad old1018testFail("", "-storepasswd -keystore x.jks -storetype JKS " +1019"-storepass badold -new newstore");1020// short new1021testFail("", "-storepasswd -keystore x.jks -storetype JKS " +1022"-storepass changeit -new new");1023// misc1024// non exist1025testFail("", "-storepasswd -keystore nonexist " +1026"-storepass changeit -new newstore");1027// bad file1028testFail("", "-storepasswd -keystore badkeystore " +1029"-storepass changeit -new newstore");1030// bad file1031testFail("", "-storepasswd -keystore aa\\bb//cc//dd " +1032"-storepass changeit -new newstore");1033remove("x.jks");1034}10351036void sqeGenkeyTest() throws Exception {10371038remove("x.jks");1039testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1040"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");1041testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1042"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");1043testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1044"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala -alias newentry");1045testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1046"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala -alias newentry");1047testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1048"-keypass changeit -genkeypair -dname CN=olala -keyalg DSA " +1049"-alias n1");1050testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1051"-keypass changeit -genkeypair -dname CN=olala -keyalg RSA " +1052"-alias n2");1053testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1054"-keypass changeit -genkeypair -dname CN=olala " +1055"-keyalg NoSuchAlg -alias n3");1056testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1057"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala -keysize 56 " +1058"-alias n4");1059testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1060"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala -keysize 999 " +1061"-alias n5");1062testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1063"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala -keysize 512 " +1064"-alias n6");1065testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1066"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala -keysize 1024 " +1067"-alias n7");1068testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1069"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala " +1070"-sigalg NoSuchAlg -alias n8");1071testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1072"-keypass changeit -genkeypair -dname CN=olala -keyalg RSA " +1073"-sigalg MD2withRSA -alias n9");1074testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1075"-keypass changeit -genkeypair -dname CN=olala -keyalg RSA " +1076"-sigalg MD5withRSA -alias n10");1077testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1078"-keypass changeit -genkeypair -dname CN=olala -keyalg RSA " +1079"-sigalg SHA1withRSA -alias n11");1080testFail("", "-keystore aa\\bb//cc\\dd -storepass changeit " +1081"-keypass changeit -genkeypair -dname CN=olala -keyalg RSA " +1082"-sigalg NoSuchAlg -alias n12");1083testFail("", "-keystore badkeystore -storepass changeit " +1084"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala " +1085"-alias n14");1086testFail("", "-keystore x.jks -storetype JKS -storepass badpass " +1087"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala -alias n16");1088testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1089"-keypass changeit -genkeypair -keyalg DSA -dname CNN=olala -alias n17");1090remove("x.jks");1091}10921093void sqeExportTest() throws Exception {1094remove("x.jks");1095// nonexist1096testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1097"-export -file mykey.cert -alias mykey");1098testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1099"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");1100testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1101"-export -file mykey.cert -alias mykey");1102testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1103"-delete -alias mykey");1104testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1105"-import -file mykey.cert -noprompt -alias c1");1106testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1107"-export -file mykey.cert2 -alias c1");1108testFail("", "-keystore aa\\bb//cc\\dd -storepass changeit " +1109"-export -file mykey.cert2 -alias c1");1110testFail("", "-keystore nonexistkeystore -storepass changeit " +1111"-export -file mykey.cert2 -alias c1");1112testFail("", "-keystore badkeystore -storepass changeit " +1113"-export -file mykey.cert2 -alias c1");1114testFail("", "-keystore x.jks -storetype JKS -storepass badpass " +1115"-export -file mykey.cert2 -alias c1");1116remove("mykey.cert");1117remove("mykey.cert2");1118remove("x.jks");1119}11201121void sqeDeleteTest() throws Exception {1122remove("x.jks");1123// nonexist1124testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1125"-delete -alias mykey");1126testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1127"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");1128testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1129"-delete -alias mykey");1130testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1131"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");1132// keystore name illegal1133testFail("", "-keystore aa\\bb//cc\\dd -storepass changeit " +1134"-delete -alias mykey");1135// keystore not exist1136testFail("", "-keystore nonexistkeystore -storepass changeit " +1137"-delete -alias mykey");1138// keystore invalid1139testFail("", "-keystore badkeystore -storepass changeit " +1140"-delete -alias mykey");1141// wrong pass1142testFail("", "-keystore x.jks -storetype JKS -storepass xxxxxxxx " +1143"-delete -alias mykey");1144remove("x.jks");1145}11461147void sqeCsrTest() throws Exception {1148remove("x.jks");1149remove("x.jks.p1.cert");1150remove("csr1");1151// PrivateKeyEntry can do certreq1152testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1153"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala -keysize 1024");1154testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1155"-certreq -file csr1 -alias mykey");1156testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1157"-certreq -file csr1");1158testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1159"-certreq -file csr1 -sigalg SHA1withDSA");1160// unmatched sigalg1161testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1162"-certreq -file csr1 -sigalg MD5withRSA");1163// misc test1164// bad storepass1165testFail("", "-keystore x.jks -storetype JKS -storepass badstorepass " +1166"-certreq -file csr1");1167// storepass from terminal1168testOK("changeit\n", "-keystore x.jks -storetype JKS " +1169"-certreq -file csr1");1170// must provide storepass1171testFail("\n", "-keystore x.jks -storetype JKS " +1172"-certreq -file csr1");1173// bad keypass1174testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1175"-keypass badkeypass -certreq -file csr1");1176// bad filepath1177testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1178"-certreq -file aa\\bb//cc\\dd");1179// non-existing keystore1180testFail("", "-keystore noexistks -storepass changeit " +1181"-certreq -file csr1");1182// Try the RSA private key1183testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1184"-delete -alias mykey");1185testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1186"-keypass changeit -genkeypair -dname CN=olala -keyalg RSA");1187testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1188"-certreq -file csr1 -alias mykey");1189testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1190"-certreq -file csr1");1191// unmatched sigalg1192testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1193"-certreq -file csr1 -sigalg SHA1withDSA");1194testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1195"-certreq -file csr1 -sigalg MD5withRSA");1196// TrustedCertificateEntry cannot do certreq1197testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1198"-exportcert -file x.jks.p1.cert");1199testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1200"-delete -alias mykey");1201testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1202"-importcert -file x.jks.p1.cert -noprompt");1203testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1204"-certreq -file csr1 -alias mykey");1205testFail("", "-keystore x.jks -storetype JKS -storepass changeit " +1206"-certreq -file csr1");1207remove("x.jks");1208remove("x.jks.p1.cert");1209remove("csr1");1210}12111212void sqePrintcertTest() throws Exception {1213remove("x.jks");1214remove("mykey.cert");1215remove("myweakkey.cert");1216testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1217"-keypass changeit -genkeypair -keyalg DSA -dname CN=olala");1218testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1219"-export -file mykey.cert -alias mykey");1220testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1221"-keypass changeit -genkeypair -dname CN=weak -keyalg rsa " +1222"-keysize 512 -sigalg MD5withRSA -alias myweakkey");1223testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +1224"-export -file myweakkey.cert -alias myweakkey");1225testFail("", "-printcert -file badkeystore");1226testFail("", "-printcert -file a/b/c/d");1227testOK("", "-printcert -file mykey.cert");1228testOK("", "-printcert -file myweakkey.cert");1229FileInputStream fin = new FileInputStream("mykey.cert");1230testOK(fin, "-printcert");1231fin.close();1232remove("x.jks");1233remove("mykey.cert");1234remove("myweakkey.cert");1235}12361237// 8074935: jdk8 keytool doesn't validate pem files for RFC 1421 correctness1238static void checkPem(String file) throws Exception {1239boolean maybeLast = false;1240for (String s: Files.readAllLines(Paths.get(file))) {1241if (s.isEmpty()) continue;1242if (s.startsWith("---")) continue;1243if (maybeLast) {1244throw new Exception("Last line already seen");1245}1246if (s.length() > 64) {1247throw new Exception(s);1248}1249if (s.length() < 64) {1250maybeLast = true;1251}1252}1253}12541255void v3extTest(String keyAlg) throws Exception {1256KeyStore ks;1257remove("x.jks");1258String simple = "-keystore x.jks -storetype JKS -storepass changeit " +1259"-keypass changeit -noprompt -keyalg " + keyAlg + " ";1260String pre = simple + "-genkeypair -keyalg DSA -dname CN=Olala -alias ";12611262// Version and SKID1263testOK("", pre + "o1");12641265ks = loadStore("x.jks", "changeit", "JKS");1266assertTrue(((X509Certificate)ks.getCertificate("o1")).getVersion() == 3);1267assertTrue(((X509CertImpl)ks.getCertificate("o1"))1268.getSubjectKeyIdentifierExtension() != null);12691270// BC1271testOK("", pre + "b1 -ext BC:critical");1272testOK("", pre + "b2 -ext BC");1273testOK("", pre + "b3 -ext bc");1274testOK("", pre + "b4 -ext BasicConstraints");1275testOK("", pre + "b5 -ext basicconstraints");1276testOK("", pre + "b6 -ext BC=ca:true,pathlen:12");1277testOK("", pre + "b7 -ext BC=ca:false");1278testOK("", pre + "b8 -ext BC:critical=ca:false");1279testOK("", pre + "b9 -ext BC=12");12801281ks = loadStore("x.jks", "changeit", "JKS");1282assertTrue(((X509CertImpl)ks.getCertificate("b1"))1283.getBasicConstraintsExtension().isCritical());1284assertTrue(!((X509CertImpl)ks.getCertificate("b2"))1285.getBasicConstraintsExtension().isCritical());1286assertTrue(((X509CertImpl)ks.getCertificate("b8"))1287.getBasicConstraintsExtension().isCritical());1288assertTrue(((X509Certificate)ks.getCertificate("b1"))1289.getBasicConstraints() == Integer.MAX_VALUE);1290assertTrue(((X509Certificate)ks.getCertificate("b2"))1291.getBasicConstraints() == Integer.MAX_VALUE);1292assertTrue(((X509Certificate)ks.getCertificate("b3"))1293.getBasicConstraints() == Integer.MAX_VALUE);1294assertTrue(((X509Certificate)ks.getCertificate("b4"))1295.getBasicConstraints() == Integer.MAX_VALUE);1296assertTrue(((X509Certificate)ks.getCertificate("b5"))1297.getBasicConstraints() == Integer.MAX_VALUE);1298assertTrue(((X509Certificate)ks.getCertificate("b6"))1299.getBasicConstraints() == 12);1300assertTrue(((X509Certificate)ks.getCertificate("b7"))1301.getBasicConstraints() == -1);1302assertTrue(((X509Certificate)ks.getCertificate("b9"))1303.getBasicConstraints() == 12);13041305// KU1306testOK("", pre + "ku1 -ext KeyUsage:critical=digitalsignature");1307testOK("", pre + "ku2 -ext KU=digitalSignature");1308testOK("", pre + "ku3 -ext KU=ds");1309testOK("", pre + "ku4 -ext KU=dig");1310// ambigous value1311testFail("", pre + "ku5 -ext KU=d");1312// cRLSign cannot be cs1313testFail("", pre + "ku6 -ext KU=cs");1314testOK("", pre + "ku11 -ext KU=nr");1315// ke means keyAgreement and keyCertSign...1316testFail("", pre + "ku12 -ext KU=ke");1317testOK("", pre + "ku12 -ext KU=keyE");1318testOK("", pre + "ku12a -ext KU=kE"); // kE is only keyEncipherment1319// de also means decipherOnly1320testOK("", pre + "ku13a -ext KU=de"); // de is decipherOnly1321testOK("", pre + "ku13b -ext KU=dE"); // dE is dataEncipherment1322testOK("", pre + "ku13 -ext KU=dataE");1323testOK("", pre + "ku14 -ext KU=ka");1324testOK("", pre + "ku15 -ext KU=kcs");1325testOK("", pre + "ku16 -ext KU=crls");1326testOK("", pre + "ku17 -ext KU=eo");1327testOK("", pre + "ku18 -ext KU=do");1328testOK("", pre + "ku19 -ext KU=cc");13291330testOK("", pre + "ku017 -ext KU=ds,cc,eo");1331testOK("", pre + "ku135 -ext KU=nr,dataEncipherment,keyCertSign");1332testOK("", pre + "ku246 -ext KU=keyEnc,cRL,keyA");1333testOK("", pre + "ku1234 -ext KU=ka,da,keyE,nonR");13341335ks = loadStore("x.jks", "changeit", "JKS");1336class CheckKU {1337void check(KeyStore ks, String alias, int... pos) throws Exception {1338System.err.print("x");1339boolean[] bs = ((X509Certificate)ks.getCertificate(alias))1340.getKeyUsage();1341bs = Arrays.copyOf(bs, 9);1342for (int i=0; i<bs.length; i++) {1343boolean found = false;1344for (int p: pos) {1345if (p == i) found = true;1346}1347if (!found ^ bs[i]) {1348// OK1349} else {1350throw new RuntimeException("KU not match at " + i +1351": " + found + " vs " + bs[i]);1352}1353}1354}1355}1356CheckKU c = new CheckKU();1357assertTrue(((X509CertImpl)ks.getCertificate("ku1"))1358.getExtension(PKIXExtensions.KeyUsage_Id).isCritical());1359assertTrue(!((X509CertImpl)ks.getCertificate("ku2"))1360.getExtension(PKIXExtensions.KeyUsage_Id).isCritical());1361c.check(ks, "ku1", 0);1362c.check(ks, "ku2", 0);1363c.check(ks, "ku3", 0);1364c.check(ks, "ku4", 0);1365c.check(ks, "ku11", 1);1366c.check(ks, "ku12", 2);1367c.check(ks, "ku13", 3);1368c.check(ks, "ku14", 4);1369c.check(ks, "ku15", 5);1370c.check(ks, "ku16", 6);1371c.check(ks, "ku17", 7);1372c.check(ks, "ku18", 8);1373c.check(ks, "ku19", 1);1374c.check(ks, "ku11", 1);1375c.check(ks, "ku11", 1);1376c.check(ks, "ku11", 1);1377c.check(ks, "ku017", 0, 1, 7);1378c.check(ks, "ku135", 1, 3, 5);1379c.check(ks, "ku246", 6, 2, 4);1380c.check(ks, "ku1234", 1, 2, 3, 4);13811382// EKU1383testOK("", pre + "eku1 -ext EKU:critical=sa");1384testOK("", pre + "eku2 -ext ExtendedKeyUsage=ca");1385testOK("", pre + "eku3 -ext EKU=cs");1386testOK("", pre + "eku4 -ext EKU=ep");1387testOK("", pre + "eku8 -ext EKU=ts");1388testFail("", pre + "eku9 -ext EKU=os");1389testOK("", pre + "eku9 -ext EKU=ocsps");1390testOK("", pre + "eku10 -ext EKU=any");1391testOK("", pre + "eku11 -ext EKU=1.2.3.4,1.3.5.7,ep");1392testFail("", pre + "eku12 -ext EKU=c");1393testFail("", pre + "eku12 -ext EKU=nothing");13941395ks = loadStore("x.jks", "changeit", "JKS");1396class CheckEKU {1397void check(KeyStore ks, String alias, String... pos) throws Exception {1398System.err.print("x");1399List<String> bs = ((X509Certificate)ks.getCertificate(alias))1400.getExtendedKeyUsage();1401int found = 0;1402for (String p: pos) {1403if (bs.contains(p)) {1404found++;1405} else {1406throw new RuntimeException("EKU: not included " + p);1407}1408}1409if (found != bs.size()) {1410throw new RuntimeException("EKU: more items than expected");1411}1412}1413}1414CheckEKU cx = new CheckEKU();1415assertTrue(((X509CertImpl)ks.getCertificate("eku1"))1416.getExtension(PKIXExtensions.ExtendedKeyUsage_Id).isCritical());1417assertTrue(!((X509CertImpl)ks.getCertificate("eku2"))1418.getExtension(PKIXExtensions.ExtendedKeyUsage_Id).isCritical());1419cx.check(ks, "eku1", "1.3.6.1.5.5.7.3.1");1420cx.check(ks, "eku2", "1.3.6.1.5.5.7.3.2");1421cx.check(ks, "eku3", "1.3.6.1.5.5.7.3.3");1422cx.check(ks, "eku4", "1.3.6.1.5.5.7.3.4");1423cx.check(ks, "eku8", "1.3.6.1.5.5.7.3.8");1424cx.check(ks, "eku9", "1.3.6.1.5.5.7.3.9");1425cx.check(ks, "eku10", "2.5.29.37.0");1426cx.check(ks, "eku11", "1.3.6.1.5.5.7.3.4", "1.2.3.4", "1.3.5.7");14271428// SAN1429testOK("", pre+"san1 -ext san:critical=email:[email protected]");1430testOK("", pre+"san2 -ext san=uri:http://me.org");1431testOK("", pre+"san3 -ext san=dns:me.org");1432testOK("", pre+"san4 -ext san=ip:192.168.0.1");1433testOK("", pre+"san5 -ext san=oid:1.2.3.4");1434testOK("", pre+"san6 -ext san=dns:1abc.com"); //begin with digit1435testOK("", pre+"san235 -ext san=uri:http://me.org,dns:me.org,oid:1.2.3.4");14361437ks = loadStore("x.jks", "changeit", "JKS");1438class CheckSAN {1439// Please sort items with name type1440void check(KeyStore ks, String alias, int type, Object... items)1441throws Exception {1442int pos = 0;1443System.err.print("x");1444Object[] names = null;1445if (type == 0) names = ((X509Certificate)ks.getCertificate(alias))1446.getSubjectAlternativeNames().toArray();1447else names = ((X509Certificate)ks.getCertificate(alias))1448.getIssuerAlternativeNames().toArray();1449Arrays.sort(names, new Comparator() {1450public int compare(Object o1, Object o2) {1451int i1 = (Integer)((List)o1).get(0);1452int i2 = (Integer)((List)o2).get(0);1453return i1 - i2;1454}1455});1456for (Object o: names) {1457List l = (List)o;1458for (Object o2: l) {1459if (!items[pos++].equals(o2)) {1460throw new RuntimeException("Not equals at " + pos1461+ ": " + items[pos-1] + " vs " + o2);1462}1463}1464}1465if (pos != items.length) {1466throw new RuntimeException("Extra items, pos is " + pos);1467}1468}1469}1470CheckSAN csan = new CheckSAN();1471assertTrue(((X509CertImpl)ks.getCertificate("san1"))1472.getSubjectAlternativeNameExtension().isCritical());1473assertTrue(!((X509CertImpl)ks.getCertificate("san2"))1474.getSubjectAlternativeNameExtension().isCritical());1475csan.check(ks, "san1", 0, 1, "[email protected]");1476csan.check(ks, "san2", 0, 6, "http://me.org");1477csan.check(ks, "san3", 0, 2, "me.org");1478csan.check(ks, "san4", 0, 7, "192.168.0.1");1479csan.check(ks, "san5", 0, 8, "1.2.3.4");1480csan.check(ks, "san235", 0, 2, "me.org", 6, "http://me.org", 8, "1.2.3.4");14811482// IAN1483testOK("", pre+"ian1 -ext ian:critical=email:[email protected]");1484testOK("", pre+"ian2 -ext ian=uri:http://me.org");1485testOK("", pre+"ian3 -ext ian=dns:me.org");1486testOK("", pre+"ian4 -ext ian=ip:192.168.0.1");1487testOK("", pre+"ian5 -ext ian=oid:1.2.3.4");1488testOK("", pre+"ian235 -ext ian=uri:http://me.org,dns:me.org,oid:1.2.3.4");14891490ks = loadStore("x.jks", "changeit", "JKS");1491assertTrue(((X509CertImpl)ks.getCertificate("ian1"))1492.getIssuerAlternativeNameExtension().isCritical());1493assertTrue(!((X509CertImpl)ks.getCertificate("ian2"))1494.getIssuerAlternativeNameExtension().isCritical());1495csan.check(ks, "ian1", 1, 1, "[email protected]");1496csan.check(ks, "ian2", 1, 6, "http://me.org");1497csan.check(ks, "ian3", 1, 2, "me.org");1498csan.check(ks, "ian4", 1, 7, "192.168.0.1");1499csan.check(ks, "ian5", 1, 8, "1.2.3.4");1500csan.check(ks, "ian235", 1, 2, "me.org", 6, "http://me.org", 8, "1.2.3.4");15011502// SIA1503testOK("", pre+"sia1 -ext sia=care:uri:ldap://ca.com/cn=CA");1504testOK("", pre+"sia2 -ext sia=ts:email:[email protected]");1505testFail("SIA never critical", pre +1506"sia3 -ext sia:critical=ts:email:[email protected]");15071508ks = loadStore("x.jks", "changeit", "JKS");1509class CheckSia {1510void check(KeyStore ks, String alias, int type, Object... items)1511throws Exception {1512int pos = 0;1513System.err.print("x");1514AccessDescription[] ads = null;1515if (type == 0) {1516SubjectInfoAccessExtension siae = (SubjectInfoAccessExtension)1517((X509CertImpl)ks.getCertificate(alias))1518.getExtension(PKIXExtensions.SubjectInfoAccess_Id);1519ads = siae.getAccessDescriptions()1520.toArray(new AccessDescription[0]);1521} else {1522AuthorityInfoAccessExtension aiae =1523(AuthorityInfoAccessExtension)1524((X509CertImpl)ks.getCertificate(alias))1525.getExtension(PKIXExtensions.AuthInfoAccess_Id);1526ads = aiae.getAccessDescriptions()1527.toArray(new AccessDescription[0]);1528}1529Arrays.sort(ads, new Comparator<AccessDescription>() {1530@Override1531public int compare(AccessDescription o1,1532AccessDescription o2) {1533return o1.getAccessMethod().toString()1534.compareTo(o2.getAccessMethod().toString());1535}1536});1537for (AccessDescription ad: ads) {1538if (!ad.getAccessMethod().equals(items[pos++]) ||1539!new Integer(ad.getAccessLocation().getType())1540.equals(items[pos++])) {1541throw new RuntimeException("Not same type at " + pos);1542}1543String name = null;1544switch (ad.getAccessLocation().getType()) {1545case 1:1546name = ((RFC822Name)ad.getAccessLocation()1547.getName()).getName();1548break;1549case 6:1550name = ((URIName)ad.getAccessLocation()1551.getName()).getURI().toString();1552break;1553default:1554throw new RuntimeException("Not implemented: " + ad);1555}1556if (!name.equals(items[pos++])) {1557throw new Exception("Name not same for " + ad +1558" at pos " + pos);1559}1560}1561}1562}1563CheckSia csia = new CheckSia();1564assertTrue(!((X509CertImpl)ks.getCertificate("sia1"))1565.getExtension(PKIXExtensions.SubjectInfoAccess_Id).isCritical());1566csia.check(ks, "sia1", 0,1567AccessDescription.Ad_CAREPOSITORY_Id, 6, "ldap://ca.com/cn=CA");1568csia.check(ks, "sia2",15690, AccessDescription.Ad_TIMESTAMPING_Id, 1, "[email protected]");15701571// AIA1572testOK("", pre+"aia1 -ext aia=cai:uri:ldap://ca.com/cn=CA");1573testOK("", pre+"aia2 -ext aia=ocsp:email:[email protected]");1574testFail("AIA never critical", pre +1575"aia3 -ext aia:critical=ts:email:[email protected]");15761577ks = loadStore("x.jks", "changeit", "JKS");1578assertTrue(!((X509CertImpl)ks.getCertificate("aia1"))1579.getExtension(PKIXExtensions.AuthInfoAccess_Id).isCritical());1580csia.check(ks, "aia1", 1,1581AccessDescription.Ad_CAISSUERS_Id, 6, "ldap://ca.com/cn=CA");1582csia.check(ks, "aia2", 1,1583AccessDescription.Ad_OCSP_Id, 1, "[email protected]");15841585// OID1586testOK("", pre+"oid1 -ext 1.2.3:critical=0102");1587testOK("", pre+"oid2 -ext 1.2.3");1588testOK("", pre+"oid12 -ext 1.2.3 -ext 1.2.4=01:02:03");15891590ks = loadStore("x.jks", "changeit", "JKS");1591class CheckOid {1592void check(KeyStore ks, String alias, String oid, byte[] value)1593throws Exception {1594int pos = 0;1595System.err.print("x");1596Extension ex = ((X509CertImpl)ks.getCertificate(alias))1597.getExtension(ObjectIdentifier.of(oid));1598if (!Arrays.equals(value, ex.getValue())) {1599throw new RuntimeException("Not same content in " +1600alias + " for " + oid);1601}1602}1603}1604CheckOid coid = new CheckOid();1605assertTrue(((X509CertImpl)ks.getCertificate("oid1"))1606.getExtension(ObjectIdentifier.of("1.2.3")).isCritical());1607assertTrue(!((X509CertImpl)ks.getCertificate("oid2"))1608.getExtension(ObjectIdentifier.of("1.2.3")).isCritical());1609coid.check(ks, "oid1", "1.2.3", new byte[]{1,2});1610coid.check(ks, "oid2", "1.2.3", new byte[]{});1611coid.check(ks, "oid12", "1.2.3", new byte[]{});1612coid.check(ks, "oid12", "1.2.4", new byte[]{1,2,3});16131614// honored1615testOK("", pre+"ca");1616testOK("", pre+"a");1617// request: BC,KU,1.2.3,1.2.4,1.2.51618testOK("", simple+"-alias a -certreq " +1619"-ext BC=1 -ext KU=crl " +1620"-ext 1.2.3=01 -ext 1.2.4:critical=0102 -ext 1.2.5=010203 " +1621"-rfc -file test.req");1622// printcertreq1623testOK("", "-printcertreq -file test.req");1624checkPem("test.req");1625// issue: deny KU, change criticality of 1.2.3 and 1.2.4,1626// change content of BC, add 2.3.41627testOK("", simple+"-gencert -alias ca -infile test.req -ext " +1628"honored=all,-KU,1.2.3:critical,1.2.4:non-critical " +1629"-ext BC=2 -ext 2.3.4=01020304 " +1630"-debug -rfc -outfile test.cert");1631checkPem("test.cert");1632testOK("", simple+"-importcert -file test.cert -alias a");1633ks = loadStore("x.jks", "changeit", "JKS");1634X509CertImpl a = (X509CertImpl)ks.getCertificate("a");1635assertTrue(a.getAuthorityKeyIdentifierExtension() != null);1636assertTrue(a.getSubjectKeyIdentifierExtension() != null);1637assertTrue(a.getKeyUsage() == null);1638assertTrue(a.getExtension(ObjectIdentifier.of("1.2.3")).isCritical());1639assertTrue(!a.getExtension(ObjectIdentifier.of("1.2.4")).isCritical());1640assertTrue(!a.getExtension(ObjectIdentifier.of("1.2.5")).isCritical());1641assertTrue(a.getExtensionValue("1.2.3").length == 3);1642assertTrue(a.getExtensionValue("1.2.4").length == 4);1643assertTrue(a.getExtensionValue("1.2.5").length == 5);1644assertTrue(a.getBasicConstraints() == 2);1645assertTrue(!a.getExtension(ObjectIdentifier.of("2.3.4")).isCritical());1646assertTrue(a.getExtensionValue("2.3.4").length == 6);16471648// 8073181: keytool -ext honored not working correctly1649testOK("", simple+"-gencert -alias ca -infile test.req -ext " +1650"honored=1.2.3,KU,1.2.4:critical " +1651"-debug -rfc -outfile test2.cert");1652testOK("", simple+"-importcert -file test2.cert -alias b");1653ks = loadStore("x.jks", "changeit", "JKS");1654X509CertImpl b = (X509CertImpl)ks.getCertificate("b");1655assertTrue(!b.getExtension(ObjectIdentifier.of("1.2.3")).isCritical());1656assertTrue(b.getExtension(ObjectIdentifier.of("1.2.4")).isCritical());16571658// 8073182: keytool may generate duplicate extensions1659testOK("", pre+"dup -ext bc=2 -ext 2.5.29.19=30030101FF -ext bc=3");1660ks = loadStore("x.jks", "changeit", "JKS");1661X509CertImpl dup = (X509CertImpl)ks.getCertificate("dup");1662assertTrue(dup.getBasicConstraints() == 3);16631664remove("x.jks");1665remove("test.req");1666remove("test.cert");1667}16681669void i18nTest() throws Exception {1670// 1. keytool -help1671remove("x.jks");1672testOK("", "-help");16731674// 2. keytool -genkey -keyalg DSA -v -keysize 512 Enter "a" for the keystore1675// password. Check error (password too short). Enter "password" for1676// the keystore password. Hit 'return' for "first and last name",1677// "organizational unit", "City", "State", and "Country Code".1678// Type "yes" when they ask you if everything is correct.1679// Type 'return' for new key password.1680testOK("a\npassword\npassword\nMe\nHere\nNow\nPlace\nPlace\nUS\nyes\n\n",1681"-genkey -keyalg DSA -v -keysize 512 -keystore x.jks -storetype JKS");1682// 3. keytool -list -v -storepass password1683testOK("", "-list -v -storepass password -keystore x.jks -storetype JKS");1684// 4. keytool -list -v Type "a" for the keystore password.1685// Check error (wrong keystore password).1686testFail("a\n", "-list -v -keystore x.jks -storetype JKS");1687assertTrue(ex.indexOf("password was incorrect") != -1);1688// 5. keytool - -keyalg DSA -v -keysize 512 Enter "password" as the password.1689// Check error (alias 'mykey' already exists).1690testFail("password\n", "-genkey -keyalg DSA -v -keysize 512" +1691" -keystore x.jks -storetype JKS");1692assertTrue(ex.indexOf("alias <mykey> already exists") != -1);1693// 6. keytool -genkey -keyalg DSA -v -keysize 512 -alias mykey2 -storepass password1694// Hit 'return' for "first and last name", "organizational unit", "City",1695// "State", and "Country Code". Type "yes" when they ask you if1696// everything is correct. Type 'return' for new key password.1697testOK("\n\n\n\n\n\nyes\n\n", "-genkey -keyalg DSA -v -keysize 512 -alias mykey2" +1698" -storepass password -keystore x.jks -storetype JKS");1699// 7. keytool -list -v Type 'password' for the store password.1700testOK("password\n", "-list -v -keystore x.jks -storetype JKS");1701// 8. keytool -keypasswd -v -alias mykey2 -storepass password1702// Type "a" for the new key password. Type "aaaaaa" for the new key1703// password. Type "bbbbbb" when re-entering the new key password.1704// Type "a" for the new key password. Check Error (too many failures).1705testFail("a\naaaaaa\nbbbbbb\na\n", "-keypasswd -v -alias mykey2" +1706" -storepass password -keystore x.jks -storetype JKS");1707assertTrue(ex.indexOf("Too many failures - try later") != -1);1708// 9. keytool -keypasswd -v -alias mykey2 -storepass password1709// Type "aaaaaa" for the new key password. Type "aaaaaa"1710// when re-entering the new key password.1711testOK("aaaaaa\naaaaaa\n", "-keypasswd -v -alias mykey2 " +1712"-storepass password -keystore x.jks -storetype JKS");1713// 10. keytool -selfcert -v -alias mykey -storepass password1714testOK("", "-selfcert -v -alias mykey -storepass password " +1715"-keystore x.jks -storetype JKS");1716// 11. keytool -list -v -storepass password1717testOK("", "-list -v -storepass password -keystore x.jks -storetype JKS");1718// 12. keytool -export -v -alias mykey -file cert -storepass password1719remove("cert");1720testOK("", "-export -v -alias mykey -file cert -storepass password " +1721"-keystore x.jks -storetype JKS");1722// 13. keytool -import -v -file cert -storepass password1723// Check error (Certificate reply and cert are the same)1724testFail("", "-import -v -file cert -storepass password" +1725" -keystore x.jks -storetype JKS");1726assertTrue(ex.indexOf("Certificate reply and certificate" +1727" in keystore are identical") != -1);1728// 14. keytool -printcert -file cert1729testOK("", "-printcert -file cert -keystore x.jks -storetype JKS");1730remove("cert");1731// 15. keytool -list -storepass password -addprovider SUN1732testOK("", "-list -storepass password" +1733" -addprovider SUN" +1734" -keystore x.jks -storetype JKS");17351736//Error tests17371738// 1. keytool -storepasswd -storepass password -new abc1739// Check error (password too short)1740testFail("", "-storepasswd -storepass password -new abc");1741assertTrue(ex.indexOf("New password must be at least 6 characters") != -1);1742// Changed, no NONE needed now1743// 2. keytool -list -storetype PKCS11 Check error (-keystore must be NONE)1744//testFail("", "-list -storetype PKCS11");1745//assertTrue(err.indexOf("keystore must be NONE") != -1);1746// 3. keytool -storepasswd -storetype PKCS11 -keystore NONE1747// Check error (unsupported operation)1748testFail("", "-storepasswd -storetype PKCS11 -keystore NONE");1749assertTrue(ex.indexOf("UnsupportedOperationException") != -1);1750// 4. keytool -keypasswd -storetype PKCS11 -keystore NONE1751// Check error (unsupported operation)1752testFail("", "-keypasswd -storetype PKCS11 -keystore NONE");1753assertTrue(ex.indexOf("UnsupportedOperationException") != -1);1754// 5. keytool -list -protected -storepass password1755// Check error (password can not be specified with -protected)1756testFail("", "-list -protected -storepass password " +1757"-keystore x.jks -storetype JKS");1758assertTrue(ex.indexOf("if -protected is specified, then") != -1);1759// 6. keytool -keypasswd -protected -keypass password1760// Check error (password can not be specified with -protected)1761testFail("", "-keypasswd -protected -keypass password " +1762"-keystore x.jks -storetype JKS");1763assertTrue(ex.indexOf("if -protected is specified, then") != -1);1764// 7. keytool -keypasswd -protected -new password1765// Check error (password can not be specified with -protected)1766testFail("", "-keypasswd -protected -new password " +1767"-keystore x.jks -storetype JKS");1768assertTrue(ex.indexOf("if -protected is specified, then") != -1);1769remove("x.jks");1770}17711772void i18nPKCS11Test() throws Exception {1773//PKCS#11 tests17741775// 1. sccs edit cert8.db key3.db1776//Runtime.getRuntime().exec("/usr/bin/sccs edit cert8.db key3.db");1777testOK("", p11Arg + ("-storepass test12 -genkey -alias genkey" +1778" -dname cn=genkey -keysize 512 -keyalg rsa"));1779testOK("", p11Arg + "-storepass test12 -list");1780testOK("", p11Arg + "-storepass test12 -list -alias genkey");1781testOK("", p11Arg +1782"-storepass test12 -certreq -alias genkey -file genkey.certreq");1783testOK("", p11Arg +1784"-storepass test12 -export -alias genkey -file genkey.cert");1785testOK("", "-printcert -file genkey.cert");1786testOK("", p11Arg +1787"-storepass test12 -selfcert -alias genkey -dname cn=selfCert");1788testOK("", p11Arg +1789"-storepass test12 -list -alias genkey -v");1790assertTrue(out.indexOf("Owner: CN=selfCert") != -1);1791//(check that cert subject DN is [cn=selfCert])1792testOK("", p11Arg + "-storepass test12 -delete -alias genkey");1793testOK("", p11Arg + "-storepass test12 -list");1794assertTrue(out.indexOf("Your keystore contains 0 entries") != -1);1795//(check for empty database listing)1796//Runtime.getRuntime().exec("/usr/bin/sccs unedit cert8.db key3.db");1797remove("genkey.cert");1798remove("genkey.certreq");1799// 12. sccs unedit cert8.db key3.db1800}18011802// tesing new option -srcProviderName1803void sszzTest() throws Exception {1804testAnyway("", NSS_P11_ARG+"-delete -alias nss -storepass test12");1805testAnyway("", NZZ_P11_ARG+"-delete -alias nss -storepass test12");1806testOK("", NSS_P11_ARG+"-genkeypair -keyalg DSA -dname CN=NSS " +1807"-alias nss -storepass test12");1808testOK("", NSS_SRC_P11_ARG + NZZ_P11_ARG +1809"-importkeystore -srcstorepass test12 -deststorepass test12");1810testAnyway("", NSS_P11_ARG+"-delete -alias nss -storepass test12");1811testAnyway("", NZZ_P11_ARG+"-delete -alias nss -storepass test12");1812}18131814public static void main(String[] args) throws Exception {1815Locale reservedLocale = Locale.getDefault();1816try {1817// first test if HumanInputStream really acts like a human being1818HumanInputStream.test();1819KeyToolTest t = new KeyToolTest();18201821if (System.getProperty("file") != null) {1822t.sqeTest();1823t.testAll();1824t.i18nTest();1825t.v3extTest("RSA");1826t.v3extTest("DSA");1827boolean testEC = true;1828try {1829KeyPairGenerator.getInstance("EC");1830} catch (NoSuchAlgorithmException nae) {1831testEC = false;1832}1833if (testEC) t.v3extTest("EC");1834}18351836if (System.getProperty("nss") != null) {1837t.srcP11Arg = NSS_SRC_P11_ARG;1838t.p11Arg = NSS_P11_ARG;18391840t.testPKCS11();18411842// FAIL:1843// 1. we still don't have srcprovidername yet1844// 2. cannot store privatekey into NSS keystore1845// java.security.KeyStoreException: sun.security.pkcs111846// .wrapper.PKCS11Exception: CKR_TEMPLATE_INCOMPLETE.1847//t.testPKCS11ImportKeyStore();18481849t.i18nPKCS11Test();1850//FAIL: currently PKCS11-NSS does not support1851// 2 NSS KeyStores to be loaded at the same time1852//t.sszzTest();1853}18541855System.out.println("Test pass!!!");1856} finally {1857// restore the reserved locale1858Locale.setDefault(reservedLocale);1859}1860}1861}18621863class TestException extends Exception {1864public TestException(String e) {1865super(e);1866}1867}18681869/**1870* HumanInputStream tries to act like a human sitting in front of a computer1871* terminal typing on the keyboard while the keytool program is running.1872*1873* keytool has called InputStream.read() and BufferedReader.readLine() in1874* various places. a call to B.readLine() will try to buffer as much input as1875* possible. Thus, a trivial InputStream will find it impossible to feed1876* anything to I.read() after a B.readLine() call.1877*1878* This is why i create HumanInputStream, which will only send a single line1879* to B.readLine(), no more, no less, and the next I.read() can have a chance1880* to read the exact character right after "\n".1881*1882* I don't know why HumanInputStream works.1883*/1884class HumanInputStream extends InputStream {1885byte[] src;1886int pos;1887int length;1888boolean inLine;1889int stopIt;18901891public HumanInputStream(String input) {1892src = input.getBytes();1893pos = 0;1894length = src.length;1895stopIt = 0;1896inLine = false;1897}18981899// the trick: when called through read(byte[], int, int),1900// return -1 twice after "\n"19011902@Override public int read() throws IOException {1903int re;1904if(pos < length) {1905re = src[pos];1906if(inLine) {1907if(stopIt > 0) {1908stopIt--;1909re = -1;1910} else {1911if(re == '\n') {1912stopIt = 2;1913}1914pos++;1915}1916} else {1917pos++;1918}1919} else {1920re = -1;//throw new IOException("NO MORE TO READ");1921}1922//if (re < 32) System.err.printf("[%02d]", re);1923//else System.err.printf("[%c]", (char)re);1924return re;1925}1926@Override public int read(byte[] buffer, int offset, int len) {1927inLine = true;1928try {1929int re = super.read(buffer, offset, len);1930return re;1931} catch(Exception e) {1932throw new RuntimeException("HumanInputStream error");1933} finally {1934inLine = false;1935}1936}1937@Override public int available() {1938if(pos < length) return 1;1939return 0;1940}19411942// test part1943static void assertTrue(boolean bool) {1944if(!bool)1945throw new RuntimeException();1946}19471948public static void test() throws Exception {19491950class Tester {1951HumanInputStream is;1952BufferedReader reader;1953Tester(String s) {1954is = new HumanInputStream(s);1955reader = new BufferedReader(new InputStreamReader(is));1956}19571958// three kinds of test method1959// 1. read byte by byte from InputStream1960void testStreamReadOnce(int expection) throws Exception {1961assertTrue(is.read() == expection);1962}1963void testStreamReadMany(String expection) throws Exception {1964char[] keys = expection.toCharArray();1965for(int i=0; i<keys.length; i++) {1966assertTrue(is.read() == keys[i]);1967}1968}1969// 2. read a line with a newly created Reader1970void testReaderReadline(String expection) throws Exception {1971String s = new BufferedReader(new InputStreamReader(is)).readLine();1972if(s == null) assertTrue(expection == null);1973else assertTrue(s.equals(expection));1974}1975// 3. read a line with the old Reader1976void testReaderReadline2(String expection) throws Exception {1977String s = reader.readLine();1978if(s == null) assertTrue(expection == null);1979else assertTrue(s.equals(expection));1980}1981}19821983Tester test;19841985test = new Tester("111\n222\n\n444\n\n");1986test.testReaderReadline("111");1987test.testReaderReadline("222");1988test.testReaderReadline("");1989test.testReaderReadline("444");1990test.testReaderReadline("");1991test.testReaderReadline(null);19921993test = new Tester("111\n222\n\n444\n\n");1994test.testReaderReadline2("111");1995test.testReaderReadline2("222");1996test.testReaderReadline2("");1997test.testReaderReadline2("444");1998test.testReaderReadline2("");1999test.testReaderReadline2(null);20002001test = new Tester("111\n222\n\n444\n\n");2002test.testReaderReadline2("111");2003test.testReaderReadline("222");2004test.testReaderReadline2("");2005test.testReaderReadline2("444");2006test.testReaderReadline("");2007test.testReaderReadline2(null);20082009test = new Tester("1\n2");2010test.testStreamReadMany("1\n2");2011test.testStreamReadOnce(-1);20122013test = new Tester("12\n234");2014test.testStreamReadOnce('1');2015test.testReaderReadline("2");2016test.testStreamReadOnce('2');2017test.testReaderReadline2("34");2018test.testReaderReadline2(null);20192020test = new Tester("changeit\n");2021test.testStreamReadMany("changeit\n");2022test.testReaderReadline(null);20232024test = new Tester("changeit\nName\nCountry\nYes\n");2025test.testStreamReadMany("changeit\n");2026test.testReaderReadline("Name");2027test.testReaderReadline("Country");2028test.testReaderReadline("Yes");2029test.testReaderReadline(null);20302031test = new Tester("Me\nHere\n");2032test.testReaderReadline2("Me");2033test.testReaderReadline2("Here");2034}2035}203620372038