Project

General

Profile

Feature #4423 » ec_pem_pwd.diff

MartinBosslet (Martin Bosslet), 02/22/2011 08:36 AM

View differences:

ruby/ext/openssl/ossl_pkey_ec.c (working copy)
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);
(1-1/2)