diff options
Diffstat (limited to 'ext/openssl/ossl_pkey_rsa.c')
-rw-r--r-- | ext/openssl/ossl_pkey_rsa.c | 104 |
1 files changed, 56 insertions, 48 deletions
diff --git a/ext/openssl/ossl_pkey_rsa.c b/ext/openssl/ossl_pkey_rsa.c index 3686d34361..b5c03f4e25 100644 --- a/ext/openssl/ossl_pkey_rsa.c +++ b/ext/openssl/ossl_pkey_rsa.c @@ -7,20 +7,17 @@ * This program is licensed under the same licence as Ruby. * (See the file 'LICENCE'.) */ -#if !defined(OPENSSL_NO_RSA) - #include "ossl.h" +#if !defined(OPENSSL_NO_RSA) + #define GetPKeyRSA(obj, pkey) do { \ GetPKey((obj), (pkey)); \ - if (EVP_PKEY_type((pkey)->type) != EVP_PKEY_RSA) { /* PARANOIA? */ \ + if (EVP_PKEY_base_id(pkey) != EVP_PKEY_RSA) { /* PARANOIA? */ \ ossl_raise(rb_eRuntimeError, "THIS IS NOT A RSA!") ; \ } \ } while (0) -#define RSA_HAS_PRIVATE(rsa) ((rsa)->p && (rsa)->q) -#define RSA_PRIVATE(obj,rsa) (RSA_HAS_PRIVATE(rsa)||OSSL_PKEY_IS_PRIVATE(obj)) - /* * Classes */ @@ -62,7 +59,7 @@ ossl_rsa_new(EVP_PKEY *pkey) } else { obj = NewPKey(cRSA); - if (EVP_PKEY_type(pkey->type) != EVP_PKEY_RSA) { + if (EVP_PKEY_base_id(pkey) != EVP_PKEY_RSA) { ossl_raise(rb_eTypeError, "Not a RSA key!"); } SetPKey(obj, pkey); @@ -77,6 +74,26 @@ ossl_rsa_new(EVP_PKEY *pkey) /* * Private */ + +OSSL_PKEY_BN_DEF3(rsa, RSA, key, n, e, d); +OSSL_PKEY_BN_DEF2(rsa, RSA, factors, p, q); +OSSL_PKEY_BN_DEF3(rsa, RSA, crt_params, dmp1, dmq1, iqmp); + +static inline int +rsa_has_private(RSA *rsa) +{ + BIGNUM *bnp, *bnq; + RSA_get0_factors(rsa, &bnp, &bnq); + return bnp && bnq; +} + +static inline int +rsa_is_private(VALUE obj, RSA *rsa) +{ + return rsa_has_private(rsa) || OSSL_PKEY_IS_PRIVATE(obj); +} + + struct rsa_blocking_gen_arg { RSA *rsa; BIGNUM *e; @@ -281,10 +298,12 @@ static VALUE ossl_rsa_is_private(VALUE self) { EVP_PKEY *pkey; + RSA *rsa; GetPKeyRSA(self, pkey); + rsa = EVP_PKEY_get0_RSA(pkey); - return (RSA_PRIVATE(self, pkey->pkey.rsa)) ? Qtrue : Qfalse; + return rsa_is_private(self, rsa) ? Qtrue : Qfalse; } /* @@ -322,14 +341,14 @@ ossl_rsa_export(int argc, VALUE *argv, VALUE self) if (!(out = BIO_new(BIO_s_mem()))) { ossl_raise(eRSAError, NULL); } - if (RSA_HAS_PRIVATE(pkey->pkey.rsa)) { - if (!PEM_write_bio_RSAPrivateKey(out, pkey->pkey.rsa, ciph, + if (rsa_has_private(EVP_PKEY_get0_RSA(pkey))) { + if (!PEM_write_bio_RSAPrivateKey(out, EVP_PKEY_get0_RSA(pkey), ciph, NULL, 0, ossl_pem_passwd_cb, passwd)) { BIO_free(out); ossl_raise(eRSAError, NULL); } } else { - if (!PEM_write_bio_RSA_PUBKEY(out, pkey->pkey.rsa)) { + if (!PEM_write_bio_RSA_PUBKEY(out, EVP_PKEY_get0_RSA(pkey))) { BIO_free(out); ossl_raise(eRSAError, NULL); } @@ -355,22 +374,22 @@ ossl_rsa_to_der(VALUE self) VALUE str; GetPKeyRSA(self, pkey); - if(RSA_HAS_PRIVATE(pkey->pkey.rsa)) + if(rsa_has_private(EVP_PKEY_get0_RSA(pkey))) i2d_func = i2d_RSAPrivateKey; else i2d_func = (int (*)(const RSA*, unsigned char**))i2d_RSA_PUBKEY; - if((len = i2d_func(pkey->pkey.rsa, NULL)) <= 0) + if((len = i2d_func(EVP_PKEY_get0_RSA(pkey), NULL)) <= 0) ossl_raise(eRSAError, NULL); str = rb_str_new(0, len); p = (unsigned char *)RSTRING_PTR(str); - if(i2d_func(pkey->pkey.rsa, &p) < 0) + if(i2d_func(EVP_PKEY_get0_RSA(pkey), &p) < 0) ossl_raise(eRSAError, NULL); ossl_str_adjust(str, p); return str; } -#define ossl_rsa_buf_size(pkey) (RSA_size((pkey)->pkey.rsa)+16) +#define ossl_rsa_buf_size(pkey) (RSA_size(EVP_PKEY_get0_RSA(pkey))+16) /* * call-seq: @@ -393,7 +412,7 @@ ossl_rsa_public_encrypt(int argc, VALUE *argv, VALUE self) StringValue(buffer); str = rb_str_new(0, ossl_rsa_buf_size(pkey)); buf_len = RSA_public_encrypt(RSTRING_LENINT(buffer), (unsigned char *)RSTRING_PTR(buffer), - (unsigned char *)RSTRING_PTR(str), pkey->pkey.rsa, + (unsigned char *)RSTRING_PTR(str), EVP_PKEY_get0_RSA(pkey), pad); if (buf_len < 0) ossl_raise(eRSAError, NULL); rb_str_set_len(str, buf_len); @@ -422,7 +441,7 @@ ossl_rsa_public_decrypt(int argc, VALUE *argv, VALUE self) StringValue(buffer); str = rb_str_new(0, ossl_rsa_buf_size(pkey)); buf_len = RSA_public_decrypt(RSTRING_LENINT(buffer), (unsigned char *)RSTRING_PTR(buffer), - (unsigned char *)RSTRING_PTR(str), pkey->pkey.rsa, + (unsigned char *)RSTRING_PTR(str), EVP_PKEY_get0_RSA(pkey), pad); if (buf_len < 0) ossl_raise(eRSAError, NULL); rb_str_set_len(str, buf_len); @@ -446,7 +465,7 @@ ossl_rsa_private_encrypt(int argc, VALUE *argv, VALUE self) VALUE str, buffer, padding; GetPKeyRSA(self, pkey); - if (!RSA_PRIVATE(self, pkey->pkey.rsa)) { + if (!rsa_is_private(self, EVP_PKEY_get0_RSA(pkey))) { ossl_raise(eRSAError, "private key needed."); } rb_scan_args(argc, argv, "11", &buffer, &padding); @@ -454,7 +473,7 @@ ossl_rsa_private_encrypt(int argc, VALUE *argv, VALUE self) StringValue(buffer); str = rb_str_new(0, ossl_rsa_buf_size(pkey)); buf_len = RSA_private_encrypt(RSTRING_LENINT(buffer), (unsigned char *)RSTRING_PTR(buffer), - (unsigned char *)RSTRING_PTR(str), pkey->pkey.rsa, + (unsigned char *)RSTRING_PTR(str), EVP_PKEY_get0_RSA(pkey), pad); if (buf_len < 0) ossl_raise(eRSAError, NULL); rb_str_set_len(str, buf_len); @@ -478,7 +497,7 @@ ossl_rsa_private_decrypt(int argc, VALUE *argv, VALUE self) VALUE str, buffer, padding; GetPKeyRSA(self, pkey); - if (!RSA_PRIVATE(self, pkey->pkey.rsa)) { + if (!rsa_is_private(self, EVP_PKEY_get0_RSA(pkey))) { ossl_raise(eRSAError, "private key needed."); } rb_scan_args(argc, argv, "11", &buffer, &padding); @@ -486,7 +505,7 @@ ossl_rsa_private_decrypt(int argc, VALUE *argv, VALUE self) StringValue(buffer); str = rb_str_new(0, ossl_rsa_buf_size(pkey)); buf_len = RSA_private_decrypt(RSTRING_LENINT(buffer), (unsigned char *)RSTRING_PTR(buffer), - (unsigned char *)RSTRING_PTR(str), pkey->pkey.rsa, + (unsigned char *)RSTRING_PTR(str), EVP_PKEY_get0_RSA(pkey), pad); if (buf_len < 0) ossl_raise(eRSAError, NULL); rb_str_set_len(str, buf_len); @@ -508,21 +527,16 @@ ossl_rsa_private_decrypt(int argc, VALUE *argv, VALUE self) static VALUE ossl_rsa_get_params(VALUE self) { - EVP_PKEY *pkey; - VALUE hash; - - GetPKeyRSA(self, pkey); + VALUE hash = rb_hash_new(); - hash = rb_hash_new(); - - rb_hash_aset(hash, rb_str_new2("n"), ossl_bn_new(pkey->pkey.rsa->n)); - rb_hash_aset(hash, rb_str_new2("e"), ossl_bn_new(pkey->pkey.rsa->e)); - rb_hash_aset(hash, rb_str_new2("d"), ossl_bn_new(pkey->pkey.rsa->d)); - rb_hash_aset(hash, rb_str_new2("p"), ossl_bn_new(pkey->pkey.rsa->p)); - rb_hash_aset(hash, rb_str_new2("q"), ossl_bn_new(pkey->pkey.rsa->q)); - rb_hash_aset(hash, rb_str_new2("dmp1"), ossl_bn_new(pkey->pkey.rsa->dmp1)); - rb_hash_aset(hash, rb_str_new2("dmq1"), ossl_bn_new(pkey->pkey.rsa->dmq1)); - rb_hash_aset(hash, rb_str_new2("iqmp"), ossl_bn_new(pkey->pkey.rsa->iqmp)); + rb_hash_aset(hash, rb_str_new2("n"), ossl_rsa_get_n(self)); + rb_hash_aset(hash, rb_str_new2("e"), ossl_rsa_get_e(self)); + rb_hash_aset(hash, rb_str_new2("d"), ossl_rsa_get_d(self)); + rb_hash_aset(hash, rb_str_new2("p"), ossl_rsa_get_p(self)); + rb_hash_aset(hash, rb_str_new2("q"), ossl_rsa_get_q(self)); + rb_hash_aset(hash, rb_str_new2("dmp1"), ossl_rsa_get_dmp1(self)); + rb_hash_aset(hash, rb_str_new2("dmq1"), ossl_rsa_get_dmq1(self)); + rb_hash_aset(hash, rb_str_new2("iqmp"), ossl_rsa_get_iqmp(self)); return hash; } @@ -548,7 +562,7 @@ ossl_rsa_to_text(VALUE self) if (!(out = BIO_new(BIO_s_mem()))) { ossl_raise(eRSAError, NULL); } - if (!RSA_print(out, pkey->pkey.rsa, 0)) { /* offset = 0 */ + if (!RSA_print(out, EVP_PKEY_get0_RSA(pkey), 0)) { /* offset = 0 */ BIO_free(out); ossl_raise(eRSAError, NULL); } @@ -572,7 +586,7 @@ ossl_rsa_to_public_key(VALUE self) GetPKeyRSA(self, pkey); /* err check performed by rsa_instance */ - rsa = RSAPublicKey_dup(pkey->pkey.rsa); + rsa = RSAPublicKey_dup(EVP_PKEY_get0_RSA(pkey)); obj = rsa_instance(CLASS_OF(self), rsa); if (obj == Qfalse) { RSA_free(rsa); @@ -591,7 +605,7 @@ ossl_rsa_blinding_on(VALUE self) GetPKeyRSA(self, pkey); - if (RSA_blinding_on(pkey->pkey.rsa, ossl_bn_ctx) != 1) { + if (RSA_blinding_on(EVP_PKEY_get0_RSA(pkey), ossl_bn_ctx) != 1) { ossl_raise(eRSAError, NULL); } return self; @@ -603,21 +617,12 @@ ossl_rsa_blinding_off(VALUE self) EVP_PKEY *pkey; GetPKeyRSA(self, pkey); - RSA_blinding_off(pkey->pkey.rsa); + RSA_blinding_off(EVP_PKEY_get0_RSA(pkey)); return self; } */ -OSSL_PKEY_BN(rsa, n) -OSSL_PKEY_BN(rsa, e) -OSSL_PKEY_BN(rsa, d) -OSSL_PKEY_BN(rsa, p) -OSSL_PKEY_BN(rsa, q) -OSSL_PKEY_BN(rsa, dmp1) -OSSL_PKEY_BN(rsa, dmq1) -OSSL_PKEY_BN(rsa, iqmp) - /* * INIT */ @@ -675,6 +680,9 @@ Init_ossl_rsa(void) DEF_OSSL_PKEY_BN(cRSA, rsa, dmp1); DEF_OSSL_PKEY_BN(cRSA, rsa, dmq1); DEF_OSSL_PKEY_BN(cRSA, rsa, iqmp); + rb_define_method(cRSA, "set_key", ossl_rsa_set_key, 3); + rb_define_method(cRSA, "set_factors", ossl_rsa_set_factors, 2); + rb_define_method(cRSA, "set_crt_params", ossl_rsa_set_crt_params, 3); rb_define_method(cRSA, "params", ossl_rsa_get_params, 0); |