33import com .snowflake .kafka .connector .Utils ;
44import net .snowflake .client .jdbc .internal .apache .commons .codec .binary .Base64 ;
55import net .snowflake .ingest .connection .IngestStatus ;
6+ import org .bouncycastle .asn1 .pkcs .PrivateKeyInfo ;
7+ import org .bouncycastle .jce .provider .BouncyCastleProvider ;
8+ import org .bouncycastle .openssl .PEMParser ;
9+ import org .bouncycastle .openssl .jcajce .JcaPEMKeyConverter ;
10+ import org .bouncycastle .openssl .jcajce .JceOpenSSLPKCS8DecryptorProviderBuilder ;
11+ import org .bouncycastle .operator .InputDecryptorProvider ;
12+ import org .bouncycastle .pkcs .PKCS8EncryptedPrivateKeyInfo ;
613import org .slf4j .Logger ;
714import org .slf4j .LoggerFactory ;
815
9- import javax .crypto .Cipher ;
10- import javax .crypto .EncryptedPrivateKeyInfo ;
11- import javax .crypto .SecretKeyFactory ;
12- import javax .crypto .spec .PBEKeySpec ;
13- import java .security .AlgorithmParameters ;
14- import java .security .Key ;
16+ import java .io .StringReader ;
1517import java .security .KeyFactory ;
1618import java .security .PrivateKey ;
17- import java .security .spec . KeySpec ;
19+ import java .security .Security ;
1820import java .security .spec .PKCS8EncodedKeySpec ;
1921import java .sql .ResultSet ;
2022import java .sql .SQLException ;
@@ -86,22 +88,28 @@ static PrivateKey parseEncryptedPrivateKey(String key, String passphrase)
8688 key = key .replaceAll ("-+[A-Za-z ]+-+" , "" );
8789 key = key .replaceAll ("\\ s" , "" );
8890
91+ StringBuilder builder = new StringBuilder ();
92+ builder .append ("-----BEGIN ENCRYPTED PRIVATE KEY-----" );
93+ for (int i = 0 ; i < key .length (); i ++)
94+ {
95+ if (i %64 ==0 )
96+ {
97+ builder .append ("\n " );
98+ }
99+ builder .append (key .charAt (i ));
100+ }
101+ builder .append ("\n -----END ENCRYPTED PRIVATE KEY-----" );
102+ key = builder .toString ();
103+ Security .addProvider (new BouncyCastleProvider ());
89104 try
90105 {
91- byte [] code = Base64 .decodeBase64 (key );
92- EncryptedPrivateKeyInfo encryptPKInfo =
93- new EncryptedPrivateKeyInfo (code );
94-
95- Cipher cipher = Cipher .getInstance (encryptPKInfo .getAlgName ());
96- PBEKeySpec pbeKeySpec = new PBEKeySpec (passphrase .toCharArray ());
97- SecretKeyFactory secretKeyFactory =
98- SecretKeyFactory .getInstance (encryptPKInfo .getAlgName ());
99- Key pbeKey = secretKeyFactory .generateSecret (pbeKeySpec );
100- AlgorithmParameters algorithmParameters = encryptPKInfo .getAlgParameters ();
101- cipher .init (Cipher .DECRYPT_MODE , pbeKey , algorithmParameters );
102- KeySpec keySpec = encryptPKInfo .getKeySpec (cipher );
103- KeyFactory kf = KeyFactory .getInstance ("RSA" );
104- return kf .generatePrivate (keySpec );
106+ PEMParser pemParser = new PEMParser (new StringReader (key ));
107+ PKCS8EncryptedPrivateKeyInfo encryptedPrivateKeyInfo = (PKCS8EncryptedPrivateKeyInfo ) pemParser .readObject ();
108+ pemParser .close ();
109+ InputDecryptorProvider pkcs8Prov = new JceOpenSSLPKCS8DecryptorProviderBuilder ().build (passphrase .toCharArray ());
110+ JcaPEMKeyConverter converter = new JcaPEMKeyConverter ().setProvider (BouncyCastleProvider .PROVIDER_NAME );
111+ PrivateKeyInfo decryptedPrivateKeyInfo = encryptedPrivateKeyInfo .decryptPrivateKeyInfo (pkcs8Prov );
112+ return converter .getPrivateKey (decryptedPrivateKeyInfo );
105113 }
106114 catch (Exception e )
107115 {
@@ -115,7 +123,7 @@ static PrivateKey parsePrivateKey(String key)
115123 key = key .replaceAll ("-+[A-Za-z ]+-+" , "" );
116124 key = key .replaceAll ("\\ s" , "" );
117125
118- java .security .Security .addProvider (new net . snowflake . client . jdbc . internal . org . bouncycastle . jce . provider . BouncyCastleProvider ());
126+ java .security .Security .addProvider (new BouncyCastleProvider ());
119127 byte [] encoded = Base64 .decodeBase64 (key );
120128 try
121129 {
0 commit comments