void init(byte[] e, byte[] p, byte[] q, HashType oaepHashType, HashType mgf1HashType, SecureRandom rng) {
final RSAKeyPair keyPair = RSAKeyPair.fromExponents(e, p, q);
final RSAPrivateCrtKeyParameters privParameters = new RSAPrivateCrtKeyParameters(
BigIntegers.fromUnsignedByteArray(keyPair.n),
BigIntegers.fromUnsignedByteArray(keyPair.e), BigIntegers.fromUnsignedByteArray(keyPair.d),
BigIntegers.fromUnsignedByteArray(keyPair.p), BigIntegers.fromUnsignedByteArray(keyPair.q),
BigIntegers.fromUnsignedByteArray(keyPair.dP), BigIntegers.fromUnsignedByteArray(keyPair.dQ),
BigIntegers.fromUnsignedByteArray(keyPair.qInv));
final AsymmetricBlockCipher decryptor = makeDecryptor(mgf1HashType);
final RSAOAEPPublicKey publicKey = new RSAOAEPPublicKey();
publicKey.init(keyPair.n, keyPair.e, oaepHashType, mgf1HashType, rng);
state = new RSAOAEPPrivateKey.State(decryptor, privParameters, publicKey, oaepHashType, mgf1HashType, rng);
resetDecryptor();
}