Path: blob/master/test/jdk/sun/security/rsa/TestKeyFactory.java
41149 views
/*1* Copyright (c) 2003, 2021, 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 4853305 8023980 825471726* @summary Test KeyFactory of the new RSA provider27* @author Andreas Sterbenz28*/2930import java.io.*;31import java.util.*;3233import java.security.*;34import java.security.interfaces.*;35import java.security.spec.*;3637public class TestKeyFactory {3839private final static String BASE = System.getProperty("test.src", ".");4041private static final char[] password = "test12".toCharArray();4243private static final String PKCS1_PRIV_STR =44// the BASE64 string between -----BEGIN RSA PRIVATE KEY-----45// and -----END RSA PRIVATE KEY-----46"MIIEowIBAAKCAQEA0OIArlYES4X1XMTLDordtN/XIWFE1wvhl40RsHWM2n99+Stp" +47"CCJCcUb5FJ2/kefj/XRwB6p5IMpIZrHZqC8XXzlX5fpiFaSu2xnk17oWUKoErW27" +48"Stm098pU2RoUxWPKVl+42a8iVp8tijNElBNFALCGi0zXOhcTxMh0q1Wk0UhMJqam" +49"v5YnCKmT4THwwGYn/KeK3M7Qa+o5MoVBHLbeT9LJgEmSluVzIh44Lh6weX0bw72P" +50"8X2praOhbzg2B343MqS/rMLw6On+0i7ccEgp23vX9G5w85q4A5FSIrk4S/pyv5sO" +51"rwjCQKBW1TS0/2iB9zNkFMj5/+h7l2oqTT7sSQIDAQABAoIBADn6sXOynoiUC1IP" +52"sck8lGOTSjSSujfyrVCSsJlJV6qCfuX9va6rS8QDjjnBu531PtxoSHxoPizy2Pvg" +53"W+kKATPGR/am9DjLuFlKq7GRjoYfWyMEdVtGaKvq9ng4fBF6LHyjHz0VFrPyhQJ6" +54"TovHeXzCguYBkzAlnbAeb/vqzs/kABbOuSHVi7DsaixCoEX9zOptFYQw/l8rh68+" +55"UF2bpNNH3jOC1uN3vZtuSwCupqtN+2Mpkx2h04Rk75vWIhrnPeMgmcd3yP4LNZMR" +56"mfaynb63RRzVkNis7+NVk016SQ1oL79mrBvy5rBg3HeCeArwvqZAmOaWsLSWHzCy" +57"zlVlMTECgYEA6JlnMpC956Qi8HX5ye4Hu2ovBdbNGtH/TMkZmColJz9P7CvNkNIb" +58"Od6mvLMydbPHkhdBUDWD4rhiCKHrf5zKju1i24YqWcvuSGotWj4/KQ3+87mLZM+7" +59"daBsJBmSEVB80sgA9ItqSgOyNoNFpiDgFnlszAfb0n9XXEzB/pwSw1UCgYEA5eXI" +60"d+eKugugP+n6CluQfyxfN6WWCzfqWToCTTxPn2i12AiEssXy+kyLjupJVLWSivdo" +61"83wD5LuxFRGc9P+aKQERPhb0AFaxf1llUCXla65/x2So5xjMvtuzgQ0OktPJqJXq" +62"hYGunctsr5rje33+7vlx4xWkrL2PrQWzJabn7SUCgYEAqw3FesY/Ik7u8u+P1xSZ" +63"0xXvptek1oiAu7NYgzLbR9WjrQc5kbsyEojPDg6qmSyxI5q+iYIRj3YRgk+xpJNl" +64"0154SQCNvKPghJiw6aDFSifkytA01tp9/a8QWCwF433RjiFPsoekjvHQ6Y34dofO" +65"xDhf7lwJKPBFCrfYIqocklECgYAIPI9OHHGP8NKw94UJ0fX/WGug5sHVbQ9sWvOy" +66"KLMBlxLMxqFadlUaOpvVZvdxnX++ktajwpGxJDhX9OWWsYGobm1buB7N1E1Prrg+" +67"gt0RWpMhZa3Xeb/8Jorr2Lfo8sWK0LQyTE8hQCSIthfoWL9FeJJn/GKF/dSj8kxU" +68"0QIGMQKBgG/8U/zZ87DzfXS81P1p+CmH474wmou4KD2/zXp/lDR9+dlIUeijlIbU" +69"P6Y5xJvT33Y40giW9irShgDHjZgw0ap11K3b2HzLImdPEaBiENo735rpLs8WLK9H" +70"+yeRbiP2y9To7sTihm9Jrkctzp6sqFtKyye1+S21X1tMz8NGfXen";7172private static final String PKCS1_PUB_STR =73// the BASE64 string between -----BEGIN RSA PUBLIC KEY-----74// and -----END RSA PUBLIC KEY-----75"MIIBCgKCAQEA0OIArlYES4X1XMTLDordtN/XIWFE1wvhl40RsHWM2n99+StpCCJC" +76"cUb5FJ2/kefj/XRwB6p5IMpIZrHZqC8XXzlX5fpiFaSu2xnk17oWUKoErW27Stm0" +77"98pU2RoUxWPKVl+42a8iVp8tijNElBNFALCGi0zXOhcTxMh0q1Wk0UhMJqamv5Yn" +78"CKmT4THwwGYn/KeK3M7Qa+o5MoVBHLbeT9LJgEmSluVzIh44Lh6weX0bw72P8X2p" +79"raOhbzg2B343MqS/rMLw6On+0i7ccEgp23vX9G5w85q4A5FSIrk4S/pyv5sOrwjC" +80"QKBW1TS0/2iB9zNkFMj5/+h7l2oqTT7sSQIDAQAB";818283private static final PrivateKey P1_PRIV;84private static final PublicKey P1_PUB;8586static {87byte[] encodedPriv = Base64.getDecoder().decode(PKCS1_PRIV_STR);88P1_PRIV = new PrivateKey() {89@Override90public String getAlgorithm() {91return "RSA";92}93@Override94public String getFormat() {95return "PKCS#1";96}97@Override98public byte[] getEncoded() {99return encodedPriv.clone();100}101};102byte[] encodedPub = Base64.getDecoder().decode(PKCS1_PUB_STR);103P1_PUB = new PublicKey() {104@Override105public String getAlgorithm() {106return "RSA";107}108@Override109public String getFormat() {110return "PKCS#1";111}112@Override113public byte[] getEncoded() {114return encodedPub.clone();115}116};117}118119static KeyStore getKeyStore() throws Exception {120InputStream in = new FileInputStream(new File(BASE, "rsakeys.ks"));121KeyStore ks = KeyStore.getInstance("JKS");122ks.load(in, password);123in.close();124return ks;125}126127/**128* Test that key1 (reference key) and key2 (key to be tested) are129* equivalent130*/131private static void testKey(Key key1, Key key2) throws Exception {132if (key2.getAlgorithm().equals("RSA") == false) {133throw new Exception("Algorithm not RSA");134}135if (key1 instanceof PublicKey) {136if (key2.getFormat().equals("X.509") == false) {137throw new Exception("Format not X.509");138}139} else if (key1 instanceof PrivateKey) {140if (key2.getFormat().equals("PKCS#8") == false) {141throw new Exception("Format not PKCS#8: " + key2.getFormat());142}143}144// skip equals check when key1 is custom key145if (key1 != P1_PRIV && key1 != P1_PUB) {146if (!key1.equals(key2)) {147throw new Exception("Keys not equal");148}149}150151// only compare encodings if keys are of the same format152if (key1.getFormat().equals(key2.getFormat()) &&153!Arrays.equals(key1.getEncoded(), key2.getEncoded())) {154throw new Exception("Encodings not equal");155}156}157158private static void testPublic(KeyFactory kf, PublicKey key)159throws Exception {160System.out.println("Testing " + (key == P1_PUB? "PKCS#1" : "") +161" public key...");162163PublicKey key2 = (PublicKey)kf.translateKey(key);164KeySpec rsaSpec = kf.getKeySpec(key, RSAPublicKeySpec.class);165PublicKey key3 = kf.generatePublic(rsaSpec);166KeySpec x509Spec = kf.getKeySpec(key, X509EncodedKeySpec.class);167PublicKey key4 = kf.generatePublic(x509Spec);168if (key != P1_PUB) {169testKey(key, key);170}171testKey(key, key2);172testKey(key, key3);173testKey(key, key4);174175if (key.getFormat().equalsIgnoreCase("X.509")) {176KeySpec x509Spec2 = new X509EncodedKeySpec(key.getEncoded());177PublicKey key5 = kf.generatePublic(x509Spec2);178testKey(key, key5);179}180}181182private static void testPrivate(KeyFactory kf, PrivateKey key)183throws Exception {184System.out.println("Testing " + (key == P1_PRIV? "PKCS#1" : "") +185" private key...");186PrivateKey key2 = (PrivateKey)kf.translateKey(key);187KeySpec rsaSpec = kf.getKeySpec(key, RSAPrivateCrtKeySpec.class);188PrivateKey key3 = kf.generatePrivate(rsaSpec);189KeySpec pkcs8Spec = kf.getKeySpec(key, PKCS8EncodedKeySpec.class);190PrivateKey key4 = kf.generatePrivate(pkcs8Spec);191if (key != P1_PRIV) {192testKey(key, key);193}194testKey(key, key2);195testKey(key, key3);196testKey(key, key4);197if (key.getFormat().equalsIgnoreCase("PKCS#8")) {198KeySpec pkcs8Spec2 = new PKCS8EncodedKeySpec(key.getEncoded());199PrivateKey key5 = kf.generatePrivate(pkcs8Spec2);200testKey(key, key5);201}202203KeySpec rsaSpec2 = kf.getKeySpec(key, RSAPrivateKeySpec.class);204PrivateKey key6 = kf.generatePrivate(rsaSpec2);205testKey(key6, key6);206if (key instanceof RSAPrivateCrtKey) {207RSAPrivateCrtKey rsaKey = (RSAPrivateCrtKey)key;208KeySpec rsaSpec3 = new RSAPrivateCrtKeySpec(rsaKey.getModulus(),209rsaKey.getPublicExponent(), rsaKey.getPrivateExponent(), rsaKey.getPrimeP(), rsaKey.getPrimeQ(),210rsaKey.getPrimeExponentP(), rsaKey.getPrimeExponentQ(), rsaKey.getCrtCoefficient(), rsaKey.getParams());211PrivateKey key7 = kf.generatePrivate(rsaSpec3);212testKey(key6, key7);213}214}215216private static void test(KeyFactory kf, Key key) throws Exception {217if (key.getAlgorithm().equals("RSA") == false) {218System.out.println("Not an RSA key, ignoring");219}220if (key instanceof PublicKey) {221testPublic(kf, (PublicKey)key);222} else if (key instanceof PrivateKey) {223testPrivate(kf, (PrivateKey)key);224}225}226227public static void main(String[] args) throws Exception {228long start = System.currentTimeMillis();229KeyStore ks = getKeyStore();230KeyFactory kf = KeyFactory.getInstance("RSA", "SunRsaSign");231for (Enumeration e = ks.aliases(); e.hasMoreElements(); ) {232String alias = (String)e.nextElement();233Key key = null;234if (ks.isKeyEntry(alias)) {235test(kf, ks.getKey(alias, password));236test(kf, ks.getCertificate(alias).getPublicKey());237}238}239// repeat the test w/ PKCS#1 RSA Private Key240test(kf, P1_PRIV);241test(kf, P1_PUB);242243long stop = System.currentTimeMillis();244System.out.println("All tests passed (" + (stop - start) + " ms).");245}246}247248249