2727import org .bouncycastle .openssl .PEMKeyPair ;
2828import org .bouncycastle .openssl .PEMParser ;
2929import org .bouncycastle .openssl .jcajce .JcaPEMKeyConverter ;
30+ import org .bouncycastle .openssl .jcajce .JceOpenSSLPKCS8DecryptorProviderBuilder ;
3031import org .bouncycastle .openssl .jcajce .JcePEMDecryptorProviderBuilder ;
32+ import org .bouncycastle .operator .InputDecryptorProvider ;
33+ import org .bouncycastle .operator .OperatorCreationException ;
34+ import org .bouncycastle .pkcs .PKCS8EncryptedPrivateKeyInfo ;
35+ import org .bouncycastle .pkcs .PKCSException ;
3136import org .slf4j .Logger ;
3237import org .slf4j .LoggerFactory ;
3338
@@ -53,8 +58,6 @@ public String getName() {
5358
5459 protected final Logger log = LoggerFactory .getLogger (getClass ());
5560
56- protected char [] passphrase ; // for blanking out
57-
5861 protected KeyPairConverter <PrivateKeyInfo > privateKeyInfoKeyPairConverter = new PrivateKeyInfoKeyPairConverter ();
5962
6063 protected KeyPair readKeyPair ()
@@ -74,22 +77,19 @@ protected KeyPair readKeyPair()
7477
7578 if (o instanceof PEMEncryptedKeyPair ) {
7679 final PEMEncryptedKeyPair encryptedKeyPair = (PEMEncryptedKeyPair ) o ;
77- JcePEMDecryptorProviderBuilder decryptorBuilder = new JcePEMDecryptorProviderBuilder ();
78- if (SecurityUtils .getSecurityProvider () != null ) {
79- decryptorBuilder .setProvider (SecurityUtils .getSecurityProvider ());
80- }
81- try {
82- passphrase = pwdf == null ? null : pwdf .reqPassword (resource );
83- kp = pemConverter .getKeyPair (encryptedKeyPair .decryptKeyPair (decryptorBuilder .build (passphrase )));
84- } finally {
85- PasswordUtils .blankOut (passphrase );
86- }
80+ final PEMKeyPair pemKeyPair = readEncryptedKeyPair (encryptedKeyPair );
81+ kp = pemConverter .getKeyPair (pemKeyPair );
8782 } else if (o instanceof PEMKeyPair ) {
8883 kp = pemConverter .getKeyPair ((PEMKeyPair ) o );
8984 } else if (o instanceof PrivateKeyInfo ) {
9085 final PrivateKeyInfo privateKeyInfo = (PrivateKeyInfo ) o ;
9186 final PEMKeyPair pemKeyPair = privateKeyInfoKeyPairConverter .getKeyPair (privateKeyInfo );
9287 kp = pemConverter .getKeyPair (pemKeyPair );
88+ } else if (o instanceof PKCS8EncryptedPrivateKeyInfo ) {
89+ final PKCS8EncryptedPrivateKeyInfo encryptedPrivateKeyInfo = (PKCS8EncryptedPrivateKeyInfo ) o ;
90+ final PrivateKeyInfo privateKeyInfo = readEncryptedPrivateKeyInfo (encryptedPrivateKeyInfo );
91+ final PEMKeyPair pemKeyPair = privateKeyInfoKeyPairConverter .getKeyPair (privateKeyInfo );
92+ kp = pemConverter .getKeyPair (pemKeyPair );
9393 } else {
9494 log .warn ("Unexpected PKCS8 PEM Object [{}]" , o );
9595 }
@@ -114,4 +114,37 @@ protected KeyPair readKeyPair()
114114 public String toString () {
115115 return "PKCS8KeyFile{resource=" + resource + "}" ;
116116 }
117+
118+ private PEMKeyPair readEncryptedKeyPair (final PEMEncryptedKeyPair encryptedKeyPair ) throws IOException {
119+ final JcePEMDecryptorProviderBuilder builder = new JcePEMDecryptorProviderBuilder ();
120+ if (SecurityUtils .getSecurityProvider () != null ) {
121+ builder .setProvider (SecurityUtils .getSecurityProvider ());
122+ }
123+ char [] passphrase = null ;
124+ try {
125+ passphrase = pwdf == null ? null : pwdf .reqPassword (resource );
126+ return encryptedKeyPair .decryptKeyPair (builder .build (passphrase ));
127+ } finally {
128+ PasswordUtils .blankOut (passphrase );
129+ }
130+ }
131+
132+ private PrivateKeyInfo readEncryptedPrivateKeyInfo (final PKCS8EncryptedPrivateKeyInfo encryptedPrivateKeyInfo ) throws EncryptionException {
133+ final JceOpenSSLPKCS8DecryptorProviderBuilder builder = new JceOpenSSLPKCS8DecryptorProviderBuilder ();
134+ if (SecurityUtils .getSecurityProvider () != null ) {
135+ builder .setProvider (SecurityUtils .getSecurityProvider ());
136+ }
137+ char [] passphrase = null ;
138+ try {
139+ passphrase = pwdf == null ? null : pwdf .reqPassword (resource );
140+ final InputDecryptorProvider inputDecryptorProvider = builder .build (passphrase );
141+ return encryptedPrivateKeyInfo .decryptPrivateKeyInfo (inputDecryptorProvider );
142+ } catch (final OperatorCreationException e ) {
143+ throw new EncryptionException ("Loading Password for Encrypted Private Key Failed" , e );
144+ } catch (final PKCSException e ) {
145+ throw new EncryptionException ("Reading Encrypted Private Key Failed" , e );
146+ } finally {
147+ PasswordUtils .blankOut (passphrase );
148+ }
149+ }
117150}
0 commit comments