示例#1
0
    @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");
    }