Path: blob/master/test/jdk/sun/security/rsa/pss/PSSKeyCompatibility.java
41153 views
/*1* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223import java.io.ByteArrayInputStream;24import java.security.Key;25import java.security.KeyFactory;26import java.security.NoSuchAlgorithmException;27import java.security.NoSuchProviderException;28import java.security.PrivateKey;29import java.security.PublicKey;30import java.security.cert.Certificate;31import java.security.cert.CertificateException;32import java.security.cert.CertificateFactory;33import java.security.interfaces.RSAPrivateCrtKey;34import java.security.interfaces.RSAPublicKey;35import java.security.spec.InvalidKeySpecException;36import java.security.spec.PKCS8EncodedKeySpec;37import java.security.spec.RSAPrivateCrtKeySpec;38import java.security.spec.RSAPublicKeySpec;39import java.security.spec.X509EncodedKeySpec;40import java.util.Arrays;41import java.util.Base64;4243/**44* @test45* @bug 824233546* @summary OpenSSL generated compatibility test with RSASSA-PSS Java.47* @run main PSSKeyCompatibility48*/49public class PSSKeyCompatibility {5051private static final String ALGO = "RSASSA-PSS";52private static final String OID = "1.2.840.113549.1.1.10";53private static final String PROVIDER = "SunRsaSign";5455public static void main(String[] args) {5657boolean result = true;58for (String algo : new String[]{ALGO, OID}) {59System.out.println("With : " + algo);60result &= validateCert(algo, PROVIDER, PUBLIC_256);61result &= validateCert(algo, PROVIDER, PUBLIC_384);62result &= validateCert(algo, PROVIDER, PUBLIC_512);6364result &= validatePrivate(algo, PROVIDER, PRIVATE);65}66if (!result) {67throw new RuntimeException("Some test cases failed");68}69}7071private static boolean validatePrivate(String algorithm, String provider,72String type) {7374try {75KeyFactory kf = KeyFactory.getInstance(algorithm, provider);76PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(77Base64.getMimeDecoder().decode(type));78PrivateKey priv = kf.generatePrivate(privSpec);7980RSAPrivateCrtKey crtKey = (RSAPrivateCrtKey) priv;81PrivateKey priv1 = kf.generatePrivate(new RSAPrivateCrtKeySpec(82crtKey.getModulus(),83crtKey.getPublicExponent(),84crtKey.getPrivateExponent(),85crtKey.getPrimeP(),86crtKey.getPrimeQ(),87crtKey.getPrimeExponentP(),88crtKey.getPrimeExponentQ(),89crtKey.getCrtCoefficient(),90crtKey.getParams()91));92equals(priv, priv1);93} catch (NoSuchAlgorithmException | InvalidKeySpecException94| NoSuchProviderException e) {95e.printStackTrace(System.out);96return false;97}98System.out.println("PASSED - validatePrivate");99return true;100}101102private static boolean validateCert(String algorithm, String provider,103String type) {104105try {106CertificateFactory cf = CertificateFactory.getInstance("X.509");107Certificate cert = cf.generateCertificate(108new ByteArrayInputStream(type.getBytes()));109System.out.println(cert);110KeyFactory kf = KeyFactory.getInstance(algorithm, provider);111X509EncodedKeySpec pubSpec = kf.getKeySpec(112cert.getPublicKey(), X509EncodedKeySpec.class);113PublicKey pub = kf.generatePublic(pubSpec);114PublicKey pub1 = kf.generatePublic(new RSAPublicKeySpec(115((RSAPublicKey) pub).getModulus(),116((RSAPublicKey) pub).getPublicExponent(),117((RSAPublicKey) pub).getParams()));118equals(cert.getPublicKey(), pub);119equals(pub, pub1);120} catch (CertificateException | NoSuchAlgorithmException121| InvalidKeySpecException | NoSuchProviderException e) {122e.printStackTrace(System.out);123return false;124}125System.out.println("PASSED - validateCert");126return true;127}128129private static void equals(Key orig, Key gen) {130if (!orig.equals(gen) && orig.hashCode() != gen.hashCode()131&& !Arrays.equals(orig.getEncoded(), gen.getEncoded())) {132throw new RuntimeException("Key mismatch found");133}134}135136//rsa_pss_pss_sha256137private static final String PRIVATE138= "MIIEvAIBADALBgkqhkiG9w0BAQoEggSoMIIEpAIBAAKCAQEAu1qb8PZ8vMrX08Gf\n"139+ "y9mx7c5NHymdPIpdDvaiYkpRfYGXp3Jpx7A0Hq01QY0OUu+0sCd5IbiVoVGqM4cq\n"140+ "r2e4eyYnbgJEF7Tg8Ipu70cOUCZLj/fYNAjvFjv4+lxQYRCZHUH+lWPDPtJWKELx\n"141+ "iIsAL5tglfyrQrdWLaOiZKlJ49DrYKU6PYqELxdQ1lw3r8iBbgGJP2podGD0rMWw\n"142+ "nGX4pl9C7dYA+FV2yDirpH+OMNGOqB5QCe2WcsMLMzLPxJxOpqU8lCuscXR0VZuV\n"143+ "krgztGJcq4J0eqp05jvMWii4vW/KSIh9bndVmS2QIU7YArI8RMXtbSHdE0hXAkh+\n"144+ "Phb6/QIDAQABAoIBAQC4gbJDKquLTYQhYXTaT4h/toSS5OuZfHXKz675d1ErdZ2B\n"145+ "ZRaxdmDNuSxSYvSxTqm2NRmA0QRiu0cPudSaq12twdRg7VBbvGEt4lb/xA1fd2dA\n"146+ "4AcGr6mtTuCSxqjN/oebnat3OalFS+VXfx3Yp3NGbxE+hHewm1b+WUELOwCunhYw\n"147+ "WJxs5dR0APiqzknveFgkOSDRbMYhwN6ZIrAmZH0wkGI7ufssnp9LEVDkoQCaFHlW\n"148+ "bUpBHV1YxMCgAD/Azoo7MtedoO/+qnu1h26VhMVMCQL1DymZAnWd5kXumP9PG9j9\n"149+ "z2JwIdYc7wkLVoSHJmjuXn/Sa/X7YCTGNk5Qwp/tAoGBAPJIWN3b6FPasnAevD2O\n"150+ "04l1nnNrjNmu7aMGTTH5CrDseI7y/nqbSC18pOivRLmvhkON26I/Gu8GPKBteZAV\n"151+ "OHKPc4RM11nvv9CyN4yDp0g76pPXLPXRRN/HV0RfBkmaiE6rpS07ue8FDUZmqb9+\n"152+ "T8LV2eCYL7gYnIxsctzEQ8tXAoGBAMX2H7wpZVqHlGW94FF2pLp82q2cP80PBD+Z\n"153+ "TglUVHy957EGPqEzxAWf3saORMDXyme7o0eSHJ1tikNTqAb+//zg5JexNEZSv6cR\n"154+ "trAxuUT7kgjdJaD2i2BjlJyGG6fiXHcxC8lBvnFiWrC+qihTKDPdwWXdEOwzqCdL\n"155+ "0eBbKAvLAoGAKDjah/p6F3G3LeXsWkvb0nY0V/UC7SCdUvM43ZL6s2SOnyy4EqK0\n"156+ "2NhYiEiQoEMDhzOFwum3Dvd6GSgThlf/hwVJqC0Zk1S6A2uSzUEOBG/uAZ03WZfk\n"157+ "V0JAupkL8iw1dNoKEfhYZdXw3j8s7x2JIE9gXGjngyiS1L0sVHpAxwECgYB78csS\n"158+ "23RLB0JhpU2yk6812ABu3LqRoEpPq6PRcYxogdpz2u4RrkCYKO2psd/YQgPHiRMF\n"159+ "N7VU2AXOe61jm/sZEJHvbBLHyP2YFB4nGSrfxwc7J4Ns0ZCYbCDbE5hzN+Ye9oVj\n"160+ "oBcmFKelq+sLzm0IdFqndY8n5HvvBqjEaS6cmwKBgQDM5VsMKnGuqy5pozamgABu\n"161+ "/z3f8ATzPVr85LiEWP7qB9Y1JIFuTma3IVlULtab2S4rhrHqQNy6qA6Be9fKKPwE\n"162+ "TCmM/SDdolcz2d0rC2VDO+pc1RPluDpB/Ag8aHkV58azQASHHvAKBckIe7fay2t2\n"163+ "j4FaKzM/ieY3WSapIbjf3w==";164165/*166* Certificate: Data: Version: 3 (0x2)167* Serial Number: 11:4c:35:8c:63:47:91:1d:c1:c8:0f:c2:6f:d0:bd:8b:8f:89:e3:6c168* Signature Algorithm: rsassaPss169* Hash Algorithm: sha256170* Mask Algorithm: mgf1 with sha256171* Salt Length: 0xDE172* Trailer Field: 0xBC (default)173* Issuer: CN = localhost174* Validity Not Before: Apr 8 06:01:37 2020 GMT175* Not After : Apr 3 06:01:37 2040 GMT176* Subject: CN = localhost177* Subject Public Key Info: Public178* Key Algorithm: rsassaPss179* RSA-PSS Public-Key: (2048 bit)180*/181private static final String PUBLIC_256 = "-----BEGIN CERTIFICATE-----\n"182+ "MIIDaTCCAiCgAwIBAgIUe9ijWtZJGfoH6whOTEIc+J/T1vswPgYJKoZIhvcNAQEK\n"183+ "MDGgDTALBglghkgBZQMEAgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogQC\n"184+ "AgDeMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0yMDAzMTcwNjM4MDdaFw00MDAz\n"185+ "MTIwNjM4MDdaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASAwCwYJKoZIhvcNAQEK\n"186+ "A4IBDwAwggEKAoIBAQC7Wpvw9ny8ytfTwZ/L2bHtzk0fKZ08il0O9qJiSlF9gZen\n"187+ "cmnHsDQerTVBjQ5S77SwJ3khuJWhUaozhyqvZ7h7JiduAkQXtODwim7vRw5QJkuP\n"188+ "99g0CO8WO/j6XFBhEJkdQf6VY8M+0lYoQvGIiwAvm2CV/KtCt1Yto6JkqUnj0Otg\n"189+ "pTo9ioQvF1DWXDevyIFuAYk/amh0YPSsxbCcZfimX0Lt1gD4VXbIOKukf44w0Y6o\n"190+ "HlAJ7ZZywwszMs/EnE6mpTyUK6xxdHRVm5WSuDO0YlyrgnR6qnTmO8xaKLi9b8pI\n"191+ "iH1ud1WZLZAhTtgCsjxExe1tId0TSFcCSH4+Fvr9AgMBAAGjUzBRMB0GA1UdDgQW\n"192+ "BBSDV090I9jEWvpjZ7fgO+GGocVgaDAfBgNVHSMEGDAWgBSDV090I9jEWvpjZ7fg\n"193+ "O+GGocVgaDAPBgNVHRMBAf8EBTADAQH/MD4GCSqGSIb3DQEBCjAxoA0wCwYJYIZI\n"194+ "AWUDBAIBoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAaIEAgIA3gOCAQEAVl99\n"195+ "g2F0H9YzEtvG5NjSGq8uCW5dLQd5DcXNfyfSLlUBwCTaZXncrc5/3DLYN1mWRQm2\n"196+ "pCwmoGVzslwcLNENldTYogCc0Pc3YeG81wTBq0Tt6zS8RsDR3jhCFSDTVOjOoe0R\n"197+ "kdYRd9d2pLg2ZOzAJXa6GLrFA+3Vv3dFFh8FhGB9CcVsyPQDzWhXQ0IwukHK+AMY\n"198+ "6x1h12/CGQfrzBhrUtwbV+9iZN3lVsBYEFNKVz8Ca7H80YC4bsEHAHeR5nIUFk82\n"199+ "kYuOBhcfC10oz+NdM1KbyAX8/4Uf7S3aBca27GTr1vP6tkmybonRHnZRoELNo1RQ\n"200+ "wM0XPciACllEAJCVrQ==\n"201+ "-----END CERTIFICATE-----";202203/*204* Certificate: Data: Version: 3 (0x2)205* Serial Number: 32:f5:cf:23:71:d3:7f:16:10:5d:6e:c7:25:82:ee:7f:a8:ec:27:80206* Signature Algorithm: rsassaPss207* Hash Algorithm: sha384208* Mask Algorithm: mgf1 with sha384209* Salt Length: 0xCE210* Trailer Field: 0xBC (default)211* Issuer: CN = localhost212* Validity Not Before: Apr 8 06:01:37 2020 GMT213* Not After : Apr 3 06:01:37 2040 GMT214* Subject: CN = localhost215* Subject Public Key Info: Public216* Key Algorithm: rsassaPss217* RSA-PSS Public-Key: (2048 bit)218*/219private static final String PUBLIC_384 = "-----BEGIN CERTIFICATE-----\n"220+ "MIIDaTCCAiCgAwIBAgIUAeOnPMUidJHBqZbvhJWcH/05h0MwPgYJKoZIhvcNAQEK\n"221+ "MDGgDTALBglghkgBZQMEAgKhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAICogQC\n"222+ "AgDOMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0yMDAzMTcwNzI2MzFaFw00MDAz\n"223+ "MTIwNzI2MzFaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASAwCwYJKoZIhvcNAQEK\n"224+ "A4IBDwAwggEKAoIBAQDPgUMdvdYOeVahvAp92RNG55plAlUyEdowNmIpEbyZOlEM\n"225+ "Jc+7VqMt1K/+ZX1MkAGrFjV635p3c0NqI6qyv57cXA7VT92aYp9S0l4t7Cb2DQ6Y\n"226+ "D+1jPNYTpYoMoI8ZPA486RGpnBtmRp9KRSkAoLS6AngCABE7OxuE0MrYKhbJ/8Lq\n"227+ "Ss627FDXK+7aLCbEdLbr5G9BAIMEQDJAomHcqBMz5+EnEXWHc8drHFVIniHByFv3\n"228+ "HmzDhFEMKCV9PbBXjgKdpMIAJsRXG3t1CBE/pEzILomgg3i4OHSUvEIzTApwTJvg\n"229+ "UqtXi0UJqPohPViCQFeWLMa2N0pOAx1FMfdJIutLAgMBAAGjUzBRMB0GA1UdDgQW\n"230+ "BBQBEi9rWGXrZObncP4StBKXB3baODAfBgNVHSMEGDAWgBQBEi9rWGXrZObncP4S\n"231+ "tBKXB3baODAPBgNVHRMBAf8EBTADAQH/MD4GCSqGSIb3DQEBCjAxoA0wCwYJYIZI\n"232+ "AWUDBAICoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAqIEAgIAzgOCAQEADIQ6\n"233+ "2ktTyS9+POWWe8yGEqW/q9DxL0NAqc0n4rYm5hs/8MKk1NMaqIku2xjE3T/16iFj\n"234+ "3WEtj51yoSIUN0VxXPUoj3Yv5xR03huBk8gAwTpQc9psRQuGpLt9BBq0dyErQ8XR\n"235+ "88SshQRpDEZ2yR4Tb+U5XfbWe70uCGfeG3iDMtZPAx2GnYBD+u3JaN/m7sr0cB8V\n"236+ "Y8GuxWNh40aaIR0iaWbIC4b9N3wYDOa1yd8PqAKnLIs1F5CinJM6i5LmbkQpd+cK\n"237+ "t13iaFYN26HuD3AywDQDvyYTwV7q5jcoEGAd35+pmKCdatEHlo0uLzbTGZw31Gfo\n"238+ "BeSEh3vmXa1Q7SOpTQ==\n"239+ "-----END CERTIFICATE-----";240/*241* Certificate: Data: Version: 3 (0x2)242* Serial Number: 32:f5:cf:23:71:d3:7f:16:10:5d:6e:c7:25:82:ee:7f:a8:ec:27:80243* Signature Algorithm: rsassaPss244* Hash Algorithm: sha512245* Mask Algorithm: mgf1 with sha512246* Salt Length: 0xBE247* Trailer Field: 0xBC (default)248* Issuer: CN = localhost249* Validity Not Before: Apr 8 06:01:37 2020 GMT250* Not After : Apr 3 06:01:37 2040 GMT251* Subject: CN = localhost252* Subject Public Key Info: Public253* Key Algorithm: rsassaPss254* RSA-PSS Public-Key: (2048 bit)255*/256private static final String PUBLIC_512 = "-----BEGIN CERTIFICATE-----\n"257+ "MIIDaTCCAiCgAwIBAgIUMvXPI3HTfxYQXW7HJYLuf6jsJ4AwPgYJKoZIhvcNAQEK\n"258+ "MDGgDTALBglghkgBZQMEAgOhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIDogQC\n"259+ "AgC+MBQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0yMDAzMTcwNzI4MjZaFw00MDAz\n"260+ "MTIwNzI4MjZaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASAwCwYJKoZIhvcNAQEK\n"261+ "A4IBDwAwggEKAoIBAQCzuWpxs8c0JPgSykN9LM+2k0RlexrxCAlkgHRpfLI8XpV4\n"262+ "Ak3hx9a045Ym1yyskNw7FjZVfWNgmx5Z8qQZvBykCL2iwDoMLEfoJTcE3cZEppaz\n"263+ "3PqRoOVhuUGqA4jOW8WGbMi7aq/9UfTQGikxMBD7aS/ExILtAcd0N173ZARWcP0s\n"264+ "68bRDLmTYAclZTWDZee0gAl8MHMnXSFFPotSbZOEWz4RqhpCa49tcx1BHgto3lyc\n"265+ "ofzOerHpilZ/zAqOVRF2qHoZKlYTsTcSK0mE2MAfV7fk40qHYkyKbKLJVj8L8Lmc\n"266+ "AFUNTx07bLYymgtqa07ei+kaVTJdlzDWiREgN8MNAgMBAAGjUzBRMB0GA1UdDgQW\n"267+ "BBRlbX8E0L89iIOjkgLpbL/WSbuxmTAfBgNVHSMEGDAWgBRlbX8E0L89iIOjkgLp\n"268+ "bL/WSbuxmTAPBgNVHRMBAf8EBTADAQH/MD4GCSqGSIb3DQEBCjAxoA0wCwYJYIZI\n"269+ "AWUDBAIDoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCA6IEAgIAvgOCAQEAaRTy\n"270+ "CmQxYkS5qCGQeJun/lFVLVE83Sl2kCBaJCMJdBYw38H+6DknJx/sjZwD1vO+OGj6\n"271+ "1yyzQF1dv2Y5qOUrJIgw1ODkxTLMCrdotVqClazX02VGvyRe7efbjii96/9hqtxt\n"272+ "TZwN7+8wUX6sP91z1vXVYD5sfl/qum/cWAVJEyw32h7RpUeB0rCJcIUrNqnbBziw\n"273+ "SRkZof1Q2b02JRO0Pb3jV3H1MV5Agt3cFCCdsmvVq595rmYRwVMtyzCxXHb8jm+N\n"274+ "8Fzhl9pxCCd4KIOGDAvngFZAloVsCHt+BG8jPhSxOldnFM7xGrGss2lLJnmf3YSe\n"275+ "EPDF7NvA9wKPz4oyRg==\n"276+ "-----END CERTIFICATE-----";277278}279280281