Feature #4423 » ec_pem_pwd2.diff
| ruby/ext/openssl/ossl_pkey_ec.c (working copy) | ||
|---|---|---|
|  *     OpenSSL::PKey::EC.new(ec_group) | ||
|  *     OpenSSL::PKey::EC.new("secp112r1") | ||
|  *     OpenSSL::PKey::EC.new(pem_string) | ||
|  *     OpenSSL::PKey::EC.new(pem_string [, pwd]) | ||
|  *     OpenSSL::PKey::EC.new(der_string) | ||
|  * | ||
|  *  See the OpenSSL documentation for: | ||
| ... | ... | |
|     EC_KEY *ec = NULL; | ||
|     VALUE arg, pass; | ||
|     VALUE group = Qnil; | ||
|     char *passwd = NULL; | ||
|     GetPKey(self, pkey); | ||
|     if (pkey->pkey.ec) | ||
| ... | ... | |
|         	group = arg; | ||
|         } else { | ||
|             BIO *in = ossl_obj2bio(arg); | ||
|             ec = PEM_read_bio_ECPrivateKey(in, NULL, NULL, NULL); | ||
|             if (!NIL_P(pass)) { | ||
|                 passwd = StringValuePtr(pass); | ||
|             } | ||
|             ec = PEM_read_bio_ECPrivateKey(in, NULL, ossl_pem_passwd_cb, passwd); | ||
|             if (!ec) { | ||
|                 (void)BIO_reset(in); | ||
|                 ec = PEM_read_bio_EC_PUBKEY(in, NULL, NULL, NULL); | ||
|                 ec = PEM_read_bio_EC_PUBKEY(in, NULL, ossl_pem_passwd_cb, passwd); | ||
|             } | ||
|             if (!ec) { | ||
|                 (void)BIO_reset(in); | ||
| ... | ... | |
|     return (EC_KEY_get0_private_key(ec) ? Qtrue : Qfalse); | ||
| } | ||
| static VALUE ossl_ec_key_to_string(VALUE self, int format) | ||
| static VALUE ossl_ec_key_to_string(VALUE self, VALUE ciph, VALUE pass, int format) | ||
| { | ||
|     EC_KEY *ec; | ||
|     BIO *out; | ||
|     int i = -1; | ||
|     int private = 0; | ||
| #if 0  /* unused now */ | ||
|     EVP_CIPHER *cipher = NULL; | ||
|     char *password = NULL; | ||
| #endif | ||
|     VALUE str; | ||
|     Require_EC_KEY(self, ec); | ||
| ... | ... | |
|     switch(format) { | ||
|     case EXPORT_PEM: | ||
|     	if (private) { | ||
| #if 0  /* unused now */ | ||
|     	    if (cipher || password) | ||
| /* BUG: finish cipher/password key export */ | ||
|     	        rb_notimplement(); | ||
| 	    const EVP_CIPHER *cipher; | ||
| 	    if (!NIL_P(ciph)) { | ||
| 		cipher = GetCipherPtr(ciph); | ||
| 		if (!NIL_P(pass)) { | ||
| 		    password = StringValuePtr(pass); | ||
| 		} | ||
| 	    } | ||
| 	    else { | ||
| 		cipher = NULL; | ||
| 	    } | ||
|             i = PEM_write_bio_ECPrivateKey(out, ec, cipher, NULL, 0, NULL, password); | ||
| #endif | ||
|             i = PEM_write_bio_ECPrivateKey(out, ec, NULL, NULL, 0, NULL, NULL); | ||
|     	} else { | ||
| #if 0  /* unused now */ | ||
|     	    if (cipher || password) | ||
|                 rb_raise(rb_eArgError, "encryption is not supported when exporting this key type"); | ||
| #endif | ||
|             i = PEM_write_bio_EC_PUBKEY(out, ec); | ||
|         } | ||
|     	break; | ||
|     case EXPORT_DER: | ||
|         if (private) { | ||
| #if 0  /* unused now */ | ||
|     	    if (cipher || password) | ||
|                 rb_raise(rb_eArgError, "encryption is not supported when exporting this key type"); | ||
| #endif | ||
|             i = i2d_ECPrivateKey_bio(out, ec); | ||
|         } else { | ||
| #if 0  /* unused now */ | ||
|     	    if (cipher || password) | ||
|                 rb_raise(rb_eArgError, "encryption is not supported when exporting this key type"); | ||
| #endif | ||
|             i = i2d_EC_PUBKEY_bio(out, ec); | ||
|         } | ||
| ... | ... | |
| /* | ||
|  *  call-seq: | ||
|  *     key.to_pem   => String | ||
|  *     key.to_pem(cipher, pass_phrase) => String | ||
|  * | ||
|  *  See the OpenSSL documentation for PEM_write_bio_ECPrivateKey() | ||
|  * Outputs the EC key in PEM encoding.  If +cipher+ and +pass_phrase+ are | ||
|  * given they will be used to encrypt the key.  +cipher+ must be an | ||
|  * OpenSSL::Cipher::Cipher instance. Note that encryption will only be | ||
|  * effective for a private key, public keys will always be encoded in plain | ||
|  * text. | ||
|  * | ||
|  */ | ||
| static VALUE ossl_ec_key_to_pem(VALUE self) | ||
| static VALUE ossl_ec_key_to_pem(int argc, VALUE *argv, VALUE self) | ||
| { | ||
|     return ossl_ec_key_to_string(self, EXPORT_PEM); | ||
|     VALUE cipher, passwd; | ||
|     rb_scan_args(argc, argv, "02", &cipher, &passwd); | ||
|     return ossl_ec_key_to_string(self, cipher, passwd, EXPORT_PEM); | ||
| } | ||
| /* | ||
| ... | ... | |
|  */ | ||
| static VALUE ossl_ec_key_to_der(VALUE self) | ||
| { | ||
|     return ossl_ec_key_to_string(self, EXPORT_DER); | ||
|     return ossl_ec_key_to_string(self, Qnil, Qnil, EXPORT_DER); | ||
| } | ||
| /* | ||
| ... | ... | |
|     rb_define_method(cEC, "dsa_verify_asn1", ossl_ec_key_dsa_verify_asn1, 2); | ||
| /* do_sign/do_verify */ | ||
|     rb_define_method(cEC, "to_pem", ossl_ec_key_to_pem, 0); | ||
|     rb_define_method(cEC, "to_pem", ossl_ec_key_to_pem, -1); | ||
|     rb_define_method(cEC, "to_der", ossl_ec_key_to_der, 0); | ||
|     rb_define_method(cEC, "to_text", ossl_ec_key_to_text, 0); | ||
- « Previous
- 1
- 2
- Next »