001package com.box.sdkgen.internal.utils; 002 003import com.box.sdkgen.box.errors.BoxSDKError; 004import java.io.IOException; 005import java.io.StringReader; 006import java.security.PrivateKey; 007import java.security.Security; 008import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; 009import org.bouncycastle.jce.provider.BouncyCastleProvider; 010import org.bouncycastle.openssl.PEMDecryptorProvider; 011import org.bouncycastle.openssl.PEMEncryptedKeyPair; 012import org.bouncycastle.openssl.PEMKeyPair; 013import org.bouncycastle.openssl.PEMParser; 014import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; 015import org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8DecryptorProviderBuilder; 016import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder; 017import org.bouncycastle.operator.InputDecryptorProvider; 018import org.bouncycastle.operator.OperatorCreationException; 019import org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo; 020import org.bouncycastle.pkcs.PKCSException; 021 022public class DefaultPrivateKeyDecryptor implements PrivateKeyDecryptor { 023 public PrivateKey decryptPrivateKey(String encryptedPrivateKey, String passphrase) { 024 Security.addProvider(new BouncyCastleProvider()); 025 PrivateKey decryptedPrivateKey; 026 try { 027 PEMParser keyReader = new PEMParser(new StringReader(encryptedPrivateKey)); 028 Object keyPair = keyReader.readObject(); 029 keyReader.close(); 030 031 if (keyPair instanceof PrivateKeyInfo) { 032 PrivateKeyInfo keyInfo = (PrivateKeyInfo) keyPair; 033 decryptedPrivateKey = (new JcaPEMKeyConverter()).getPrivateKey(keyInfo); 034 } else if (keyPair instanceof PEMEncryptedKeyPair) { 035 JcePEMDecryptorProviderBuilder builder = new JcePEMDecryptorProviderBuilder(); 036 PEMDecryptorProvider decryptionProvider = builder.build(passphrase.toCharArray()); 037 keyPair = ((PEMEncryptedKeyPair) keyPair).decryptKeyPair(decryptionProvider); 038 PrivateKeyInfo keyInfo = ((PEMKeyPair) keyPair).getPrivateKeyInfo(); 039 decryptedPrivateKey = (new JcaPEMKeyConverter()).getPrivateKey(keyInfo); 040 } else if (keyPair instanceof PKCS8EncryptedPrivateKeyInfo) { 041 InputDecryptorProvider pkcs8Prov = 042 new JceOpenSSLPKCS8DecryptorProviderBuilder() 043 .setProvider("BC") 044 .build(passphrase.toCharArray()); 045 PrivateKeyInfo keyInfo = 046 ((PKCS8EncryptedPrivateKeyInfo) keyPair).decryptPrivateKeyInfo(pkcs8Prov); 047 decryptedPrivateKey = (new JcaPEMKeyConverter()).getPrivateKey(keyInfo); 048 } else { 049 PrivateKeyInfo keyInfo = ((PEMKeyPair) keyPair).getPrivateKeyInfo(); 050 decryptedPrivateKey = (new JcaPEMKeyConverter()).getPrivateKey(keyInfo); 051 } 052 } catch (IOException e) { 053 throw new BoxSDKError("Error parsing private key for Box Developer Edition.", e); 054 } catch (OperatorCreationException e) { 055 throw new BoxSDKError("Error parsing PKCS#8 private key for Box Developer Edition.", e); 056 } catch (PKCSException e) { 057 throw new BoxSDKError("Error parsing PKCS private key for Box Developer Edition.", e); 058 } 059 return decryptedPrivateKey; 060 } 061}