From e16d6108c0420ebe4907b97f0419c9ed1eb4a579 Mon Sep 17 00:00:00 2001 From: emboss Date: Fri, 13 May 2011 20:10:27 +0000 Subject: Sat May 14 05:08:32 2011 Martin Bosslet * ext/openssl/ossl_digest.c * ext/openssl/ossl_pkey.c * ext/openssl/ossl_pkey.h * test/openssl/pkey/test_pkey_rsa.rb Reverted premature commit. Sorry for the noise! Previous revision: 31555 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31556 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/openssl/ossl_pkey.c | 60 ++++++++++++------------------------------------- 1 file changed, 14 insertions(+), 46 deletions(-) (limited to 'ext/openssl/ossl_pkey.c') diff --git a/ext/openssl/ossl_pkey.c b/ext/openssl/ossl_pkey.c index d6940acda4..b5047bec26 100644 --- a/ext/openssl/ossl_pkey.c +++ b/ext/openssl/ossl_pkey.c @@ -18,9 +18,6 @@ VALUE cPKey; VALUE ePKeyError; ID id_private_q; -#define reset_bio(b) (void)BIO_reset((b)); \ - (void)ERR_get_error(); - /* * callback for generating keys */ @@ -68,50 +65,23 @@ ossl_pkey_new(EVP_PKEY *pkey) return Qnil; /* not reached */ } -/* - * call-seq: - * OpenSSL::PKey.read(string [, pwd ] ) -> PKey - * OpenSSL::PKey.read(file [, pwd ]) -> PKey - * - * === Parameters - * * +string+ is a DER- or PEM-encoded string containing an arbitrary private - * or public key. - * * +file+ is an instance of +File+ containing a DER- or PEM-encoded - * arbitrary private or public key. - * * +pwd+ is an optional password in case +string+ or +file+ is an encrypted - * PEM resource. - */ -VALUE -ossl_pkey_new_from_data(int argc, VALUE *argv, VALUE self) +VALUE +ossl_pkey_new_from_file(VALUE filename) { + FILE *fp; EVP_PKEY *pkey; - BIO *bio; - VALUE data, pass; - char *passwd = NULL; - - rb_scan_args(argc, argv, "11", &data, &pass); - - bio = ossl_obj2bio(data); - if (!(pkey = d2i_PrivateKey_bio(bio, NULL))) { - reset_bio(bio); - if (!NIL_P(pass)) { - passwd = StringValuePtr(pass); - } - if (!(pkey = PEM_read_bio_PrivateKey(bio, NULL, ossl_pem_passwd_cb, passwd))) { - reset_bio(bio); - if (!(pkey = d2i_PUBKEY_bio(bio, NULL))) { - reset_bio(bio); - if (!NIL_P(pass)) { - passwd = StringValuePtr(pass); - } - pkey = PEM_read_bio_PUBKEY(bio, NULL, ossl_pem_passwd_cb, passwd); - } - } + + SafeStringValue(filename); + if (!(fp = fopen(RSTRING_PTR(filename), "r"))) { + ossl_raise(ePKeyError, "%s", strerror(errno)); } - - BIO_free(bio); - if (!pkey) - ossl_raise(rb_eArgError, "Could not parse PKey"); + + pkey = PEM_read_PrivateKey(fp, NULL, ossl_pem_passwd_cb, NULL); + fclose(fp); + if (!pkey) { + ossl_raise(ePKeyError, NULL); + } + return ossl_pkey_new(pkey); } @@ -251,8 +221,6 @@ Init_ossl_pkey() cPKey = rb_define_class_under(mPKey, "PKey", rb_cObject); - rb_define_module_function(mPKey, "read", ossl_pkey_new_from_data, -1); - rb_define_alloc_func(cPKey, ossl_pkey_alloc); rb_define_method(cPKey, "initialize", ossl_pkey_initialize, 0); -- cgit v1.2.3