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}