3232import java .security .KeyStore .PasswordProtection ;
3333import java .security .KeyStoreException ;
3434import java .security .SecureRandom ;
35+ import java .security .Security ;
3536import java .security .cert .Certificate ;
3637import java .security .cert .X509Certificate ;
3738import java .time .Instant ;
3839import java .time .temporal .ChronoUnit ;
3940import java .util .Date ;
4041import javax .crypto .spec .SecretKeySpec ;
42+ import javax .security .auth .x500 .X500Principal ;
43+ import org .bouncycastle .jce .provider .BouncyCastleProvider ;
44+ import org .bouncycastle .x509 .X509V3CertificateGenerator ;
4145import org .junit .Before ;
4246import org .junit .Test ;
43- import sun .security .x509 .AlgorithmId ;
44- import sun .security .x509 .CertificateAlgorithmId ;
45- import sun .security .x509 .CertificateSerialNumber ;
46- import sun .security .x509 .CertificateValidity ;
47- import sun .security .x509 .CertificateX509Key ;
48- import sun .security .x509 .X500Name ;
49- import sun .security .x509 .X509CertImpl ;
50- import sun .security .x509 .X509CertInfo ;
51-
52- /* These internal sun classes are included solely for test purposes as
53- this test cannot use BouncyCastle cert generation, as there are incompatibilities
54- between how standard BC and FIPS BC perform cert generation. */
5547
5648public class KeyStoreProviderTest {
5749 private static final SecureRandom RND = new SecureRandom ();
@@ -72,6 +64,7 @@ public class KeyStoreProviderTest {
7264
7365 @ Before
7466 public void setup () throws Exception {
67+ Security .addProvider (new BouncyCastleProvider ());
7568 ks = KeyStore .getInstance (KeyStore .getDefaultType ());
7669 ks .load (null , PASSWORD );
7770 }
@@ -286,26 +279,24 @@ private void addPublicEntry(final String alias) throws GeneralSecurityException,
286279 }
287280
288281 private X509Certificate generateCertificate (final KeyPair pair , final String alias )
289- throws GeneralSecurityException , IOException {
290- final X509CertInfo info = new X509CertInfo ();
291- final X500Name name = new X500Name ("dc=" + alias );
292- info .set (X509CertInfo .SERIAL_NUMBER , new CertificateSerialNumber (new BigInteger (256 , RND )));
293- info .set (X509CertInfo .SUBJECT , name );
294- info .set (X509CertInfo .ISSUER , name );
295- info .set (
296- X509CertInfo .VALIDITY ,
297- new CertificateValidity (
298- Date .from (Instant .now ().minus (1 , ChronoUnit .DAYS )),
299- Date .from (Instant .now ().plus (730 , ChronoUnit .DAYS ))));
300- info .set (X509CertInfo .KEY , new CertificateX509Key (pair .getPublic ()));
301- info .set (
302- X509CertInfo .ALGORITHM_ID ,
303- new CertificateAlgorithmId (new AlgorithmId (AlgorithmId .sha256WithRSAEncryption_oid )));
304-
305- final X509CertImpl cert = new X509CertImpl (info );
306- cert .sign (pair .getPrivate (), AlgorithmId .sha256WithRSAEncryption_oid .toString ());
307-
308- return cert ;
282+ throws GeneralSecurityException {
283+ final X509Certificate certificate ;
284+
285+ // Generate self-signed certificate
286+ final X509V3CertificateGenerator certGen = new X509V3CertificateGenerator ();
287+ final X500Principal dnName = new X500Principal ("dc=" + alias );
288+
289+ certGen .setSerialNumber (new BigInteger (256 , new SecureRandom ()));
290+ certGen .setIssuerDN (dnName );
291+ certGen .setNotBefore (Date .from (Instant .now ().minus (1 , ChronoUnit .DAYS )));
292+ certGen .setNotAfter (Date .from (Instant .now ().plus (730 , ChronoUnit .DAYS )));
293+ certGen .setSubjectDN (dnName );
294+ certGen .setPublicKey (pair .getPublic ());
295+ certGen .setSignatureAlgorithm ("SHA256WithRSA" );
296+
297+ certificate = certGen .generate (pair .getPrivate ());
298+
299+ return certificate ;
309300 }
310301
311302 private void copyPublicPart (final KeyStore src , final KeyStore dst , final String alias )
0 commit comments