11 #if !defined(OPENSSL_NO_RSA)
15 #define GetPKeyRSA(obj, pkey) do { \
16 GetPKey((obj), (pkey)); \
17 if (EVP_PKEY_type((pkey)->type) != EVP_PKEY_RSA) { \
18 ossl_raise(rb_eRuntimeError, "THIS IS NOT A RSA!") ; \
22 #define RSA_HAS_PRIVATE(rsa) ((rsa)->p && (rsa)->q)
23 #define RSA_PRIVATE(obj,rsa) (RSA_HAS_PRIVATE(rsa)||OSSL_PKEY_IS_PRIVATE(obj))
43 if (!(pkey = EVP_PKEY_new())) {
46 if (!EVP_PKEY_assign_RSA(pkey, rsa)) {
64 if (EVP_PKEY_type(pkey->type) != EVP_PKEY_RSA) {
79 #if defined(HAVE_RSA_GENERATE_KEY_EX) && HAVE_BN_GENCB
80 struct rsa_blocking_gen_arg {
89 rsa_blocking_gen(
void *
arg)
91 struct rsa_blocking_gen_arg *gen = (
struct rsa_blocking_gen_arg *)arg;
92 gen->result = RSA_generate_key_ex(gen->rsa, gen->size, gen->e, gen->cb);
100 #if defined(HAVE_RSA_GENERATE_KEY_EX) && HAVE_BN_GENCB
103 struct ossl_generate_cb_arg cb_arg;
104 struct rsa_blocking_gen_arg gen_arg;
105 RSA *rsa = RSA_new();
106 BIGNUM *
e = BN_new();
110 if (rsa) RSA_free(rsa);
113 for (i = 0; i < (
int)
sizeof(exp) * 8; ++
i) {
114 if (exp & (1UL << i)) {
115 if (BN_set_bit(e, i) == 0) {
123 memset(&cb_arg, 0,
sizeof(
struct ossl_generate_cb_arg));
126 BN_GENCB_set(&cb, ossl_generate_cb_2, &cb_arg);
131 if (cb_arg.yield == 1) {
133 rsa_blocking_gen(&gen_arg);
138 if (!gen_arg.result) {
230 rsa = d2i_RSAPrivateKey_bio(in,
NULL);
234 rsa = d2i_RSA_PUBKEY_bio(in,
NULL);
242 rsa = d2i_RSAPublicKey_bio(in,
NULL);
249 if (!EVP_PKEY_assign_RSA(pkey, rsa)) {
307 const EVP_CIPHER *ciph =
NULL;
315 if (!
NIL_P(cipher)) {
324 if (!(out = BIO_new(BIO_s_mem()))) {
328 if (!PEM_write_bio_RSAPrivateKey(out, pkey->pkey.rsa, ciph,
334 if (!PEM_write_bio_RSA_PUBKEY(out, pkey->pkey.rsa)) {
354 int (*i2d_func)
_((
const RSA*,
unsigned char**));
361 i2d_func = i2d_RSAPrivateKey;
363 i2d_func = (
int (*)(
const RSA*,
unsigned char**))i2d_RSA_PUBKEY;
364 if((len = i2d_func(pkey->pkey.rsa,
NULL)) <= 0)
368 if(i2d_func(pkey->pkey.rsa, &p) < 0)
375 #define ossl_rsa_buf_size(pkey) (RSA_size((pkey)->pkey.rsa)+16)
394 pad = (argc == 1) ? RSA_PKCS1_PADDING :
NUM2INT(padding);
423 pad = (argc == 1) ? RSA_PKCS1_PADDING :
NUM2INT(padding);
455 pad = (argc == 1) ? RSA_PKCS1_PADDING :
NUM2INT(padding);
487 pad = (argc == 1) ? RSA_PKCS1_PADDING :
NUM2INT(padding);
550 if (!(out = BIO_new(BIO_s_mem()))) {
553 if (!RSA_print(out, pkey->pkey.rsa, 0)) {
577 rsa = RSAPublicKey_dup(pkey->pkey.rsa);
626 #define DefRSAConst(x) rb_define_const(cRSA, #x,INT2FIX(RSA_##x))
static VALUE ossl_rsa_private_decrypt(int argc, VALUE *argv, VALUE self)
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
#define OSSL_PKEY_BN(keytype, name)
#define ossl_str_adjust(str, p)
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
#define GetPKey(obj, pkey)
VALUE ossl_rsa_new(EVP_PKEY *)
VALUE ossl_membio2str(BIO *bio)
static VALUE ossl_rsa_to_public_key(VALUE self)
void ossl_generate_cb(int p, int n, void *arg)
#define RSA_HAS_PRIVATE(rsa)
memset(y->frac+ix+1, 0,(y->Prec-(ix+1))*sizeof(BDIGIT))
VALUE ossl_to_der_if_possible(VALUE obj)
int rb_block_given_p(void)
#define ossl_rsa_buf_size(pkey)
#define StringValuePtr(v)
static VALUE ossl_rsa_initialize(int argc, VALUE *argv, VALUE self)
#define OSSL_BIO_reset(bio)
#define DEF_OSSL_PKEY_BN(class, keytype, name)
static VALUE ossl_rsa_private_encrypt(int argc, VALUE *argv, VALUE self)
const EVP_CIPHER * GetCipherPtr(VALUE obj)
void * rb_thread_call_without_gvl(void *(*func)(void *), void *data1, rb_unblock_function_t *ubf, void *data2)
static VALUE ossl_rsa_is_private(VALUE self)
static VALUE ossl_rsa_public_encrypt(int argc, VALUE *argv, VALUE self)
static VALUE ossl_rsa_is_public(VALUE self)
void rb_define_alias(VALUE klass, const char *name1, const char *name2)
Defines an alias of a method.
#define WrapPKey(klass, obj, pkey)
static VALUE ossl_rsa_to_text(VALUE self)
BIO * ossl_obj2bio(VALUE obj)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
#define GetPKeyRSA(obj, pkey)
rb_hash_aset(hash, RARRAY_AREF(key_value_pair, 0), RARRAY_AREF(key_value_pair, 1))
static VALUE rsa_instance(VALUE klass, RSA *rsa)
void rb_jump_tag(int tag)
static RSA * rsa_generate(int size, unsigned long exp)
VALUE rb_define_module_under(VALUE outer, const char *name)
static VALUE ossl_rsa_s_generate(int argc, VALUE *argv, VALUE klass)
static VALUE ossl_rsa_to_der(VALUE self)
#define RSA_PRIVATE(obj, rsa)
static VALUE ossl_rsa_public_decrypt(int argc, VALUE *argv, VALUE self)
void ossl_raise(VALUE exc, const char *fmt,...)
static VALUE ossl_rsa_export(int argc, VALUE *argv, VALUE self)
#define RSTRING_LENINT(str)
VALUE rb_str_new(const char *, long)
VALUE ossl_bn_new(const BIGNUM *bn)
int ossl_pem_passwd_cb(char *buf, int max_len, int flag, void *pwd)
VALUE rb_define_module(const char *name)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
static VALUE ossl_rsa_get_params(VALUE self)
void rb_str_set_len(VALUE, long)