@JRubyMethod(name = "read", meta = true, required = 1, optional = 1) public static IRubyObject read( final ThreadContext context, IRubyObject recv, IRubyObject[] args) { final Ruby runtime = context.runtime; final IRubyObject data; final char[] pass; switch (args.length) { case 1: data = args[0]; pass = null; break; default: data = args[0]; pass = args[1].isNil() ? null : args[1].toString().toCharArray(); } final byte[] input = OpenSSLImpl.readX509PEM(context, data); KeyPair key = null; // d2i_PrivateKey_bio try { key = readPrivateKey(input); } catch (IOException ioe) { // ignore } catch (GeneralSecurityException gse) { // ignore } // PEM_read_bio_PrivateKey if (key == null) { try { key = PEMInputOutput.readPrivateKey( new InputStreamReader(new ByteArrayInputStream(input)), pass); } catch (IOException ioe) { // ignore } } if (key != null) { if (key.getPublic().getAlgorithm().equals("RSA")) { return new PKeyRSA( runtime, _PKey(runtime).getClass("RSA"), (RSAPrivateCrtKey) key.getPrivate(), (RSAPublicKey) key.getPublic()); } else if (key.getPublic().getAlgorithm().equals("DSA")) { return new PKeyDSA( runtime, _PKey(runtime).getClass("DSA"), (DSAPrivateKey) key.getPrivate(), (DSAPublicKey) key.getPublic()); } } PublicKey pubKey = null; // d2i_PUBKEY_bio try { pubKey = readPublicKey(input); } catch (IOException ioe) { // ignore } catch (GeneralSecurityException gse) { // ignore } // PEM_read_bio_PUBKEY if (pubKey == null) { try { pubKey = PEMInputOutput.readPubKey(new InputStreamReader(new ByteArrayInputStream(input))); } catch (IOException ioe) { // ignore } } if (pubKey != null) { if (pubKey.getAlgorithm().equals("RSA")) { return new PKeyRSA(runtime, _PKey(runtime).getClass("RSA"), (RSAPublicKey) pubKey); } else if (key.getPublic().getAlgorithm().equals("DSA")) { return new PKeyDSA(runtime, _PKey(runtime).getClass("DSA"), (DSAPublicKey) pubKey); } } throw runtime.newArgumentError("Could not parse PKey"); }