/* * Private */ static VALUE ossl_pkey_alloc(VALUE klass) { EVP_PKEY *pkey; VALUE obj; obj = NewPKey(klass); if (!(pkey = EVP_PKEY_new())) { ossl_raise(ePKeyError, NULL); } SetPKey(obj, pkey); return obj; }
VALUE ossl_ec_new(EVP_PKEY *pkey) { VALUE obj; if (!pkey) { obj = ec_instance(cEC, EC_KEY_new()); } else { obj = NewPKey(cEC); if (EVP_PKEY_base_id(pkey) != EVP_PKEY_EC) { ossl_raise(rb_eTypeError, "Not a EC key!"); } SetPKey(obj, pkey); } if (obj == Qfalse) { ossl_raise(eECError, NULL); } return obj; }
VALUE ossl_dh_new(EVP_PKEY *pkey) { VALUE obj; if (!pkey) { obj = dh_instance(cDH, DH_new()); } else { obj = NewPKey(cDH); if (EVP_PKEY_type(pkey->type) != EVP_PKEY_DH) { ossl_raise(rb_eTypeError, "Not a DH key!"); } SetPKey(obj, pkey); } if (obj == Qfalse) { ossl_raise(eDHError, NULL); } return obj; }
static VALUE ec_instance(VALUE klass, EC_KEY *ec) { EVP_PKEY *pkey; VALUE obj; if (!ec) { return Qfalse; } obj = NewPKey(klass); if (!(pkey = EVP_PKEY_new())) { return Qfalse; } if (!EVP_PKEY_assign_EC_KEY(pkey, ec)) { EVP_PKEY_free(pkey); return Qfalse; } SetPKey(obj, pkey); return obj; }
/* * Public */ static VALUE dh_instance(VALUE klass, DH *dh) { EVP_PKEY *pkey; VALUE obj; if (!dh) { return Qfalse; } obj = NewPKey(klass); if (!(pkey = EVP_PKEY_new())) { return Qfalse; } if (!EVP_PKEY_assign_DH(pkey, dh)) { EVP_PKEY_free(pkey); return Qfalse; } SetPKey(obj, pkey); return obj; }