mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/openssl/ossl.h: include openssl/conf.h and openssl/conf_api.h.
* ext/openssl/ossl_config.c: refine all with backward compatibility. * ext/openssl/ossl_config.h: export GetConfigPtr() and DupConfigPtr(). * ext/openssl/ossl_x509.c: added new constants under X509 module. DEFAULT_CERT_AREA, DEFAULT_CERT_DIR, DEFAULT_CERT_FILE, DEFAULT_CERT_DIR_ENV, DEFAULT_CERT_FILE_ENV and DEFAULT_PRIVATE_DIR. * ext/openssl/ossl_x509ext.c (ossl_x509extfactory_free): don't free the members of the struct. it's left to GC. * ext/openssl/ossl_x509ext.c (ossl_x509_set_config): add for config=. * ext/openssl/ossl_x509ext.c (Xossl_x509extfactory_initialize): add attr readers: issuer_certificate, subject_certificate, subject_request, crl and config. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4531 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7fb00c94e8
commit
78ff3833fb
6 changed files with 320 additions and 65 deletions
|
@ -6,9 +6,9 @@ Mon Sep 8 19:26:33 2003 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
|||
|
||||
* ext/openssl/ossl_config.h: export GetConfigPtr() and DupConfigPtr().
|
||||
|
||||
* ext/openssl/ossl_x509.c: new constants DEFAULT_CERT_AREA,
|
||||
DEFAULT_CERT_DIR, DEFAULT_CERT_FILE, DEFAULT_CERT_DIR_ENV,
|
||||
DEFAULT_CERT_FILE_ENV and DEFAULT_PRIVATE_DIR in X509 module.
|
||||
* ext/openssl/ossl_x509.c: added new constants under X509 module.
|
||||
DEFAULT_CERT_AREA, DEFAULT_CERT_DIR, DEFAULT_CERT_FILE,
|
||||
DEFAULT_CERT_DIR_ENV, DEFAULT_CERT_FILE_ENV and DEFAULT_PRIVATE_DIR.
|
||||
|
||||
* ext/openssl/ossl_x509ext.c (ossl_x509extfactory_free): don't free
|
||||
the members of the struct. it's left to GC.
|
||||
|
|
|
@ -32,6 +32,8 @@ extern "C" {
|
|||
#include <openssl/ssl.h>
|
||||
#include <openssl/hmac.h>
|
||||
#include <openssl/rand.h>
|
||||
#include <openssl/conf.h>
|
||||
#include <openssl/conf_api.h>
|
||||
#undef X509_NAME
|
||||
#undef PKCS7_SIGNER_INFO
|
||||
#if defined(HAVE_OPENSSL_OCSP_H)
|
||||
|
|
|
@ -16,13 +16,16 @@
|
|||
} \
|
||||
obj = Data_Wrap_Struct(klass, 0, NCONF_free, conf); \
|
||||
} while (0)
|
||||
|
||||
#define GetConfig(obj, conf) do { \
|
||||
Data_Get_Struct(obj, CONF, conf); \
|
||||
if (!conf) { \
|
||||
ossl_raise(rb_eRuntimeError, "Config wasn't intitialized!"); \
|
||||
} \
|
||||
} while (0)
|
||||
#define SafeGetConfig(obj, conf) do { \
|
||||
OSSL_Check_Kind(obj, cConfig); \
|
||||
GetConfig(obj, conf); \
|
||||
} while(0);
|
||||
|
||||
/*
|
||||
* Classes
|
||||
|
@ -34,77 +37,200 @@ VALUE eConfigError;
|
|||
* Public
|
||||
*/
|
||||
|
||||
static CONF *parse_config(VALUE, CONF*);
|
||||
|
||||
CONF *
|
||||
GetConfigPtr(VALUE obj)
|
||||
{
|
||||
CONF *conf;
|
||||
|
||||
SafeGetConfig(obj, conf);
|
||||
|
||||
return conf;
|
||||
}
|
||||
|
||||
CONF *
|
||||
DupConfigPtr(VALUE obj)
|
||||
{
|
||||
CONF *conf;
|
||||
VALUE str;
|
||||
|
||||
OSSL_Check_Kind(obj, cConfig);
|
||||
str = rb_funcall(obj, rb_intern("to_s"), 0);
|
||||
|
||||
return parse_config(str, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Private
|
||||
*/
|
||||
static VALUE
|
||||
ossl_config_s_load(int argc, VALUE *argv, VALUE klass)
|
||||
static CONF *
|
||||
parse_config(VALUE str, CONF *dst)
|
||||
{
|
||||
CONF *conf;
|
||||
long err_line = -1;
|
||||
char *filename;
|
||||
VALUE path, obj;
|
||||
BIO *bio;
|
||||
long eline = -1;
|
||||
VALUE obj;
|
||||
|
||||
if (rb_scan_args(argc, argv, "01", &path) == 1) {
|
||||
SafeStringValue(path);
|
||||
filename = BUF_strdup(RSTRING(path)->ptr);
|
||||
}
|
||||
else {
|
||||
if (!(filename = CONF_get1_default_config_file())) {
|
||||
ossl_raise(eConfigError, NULL);
|
||||
}
|
||||
}
|
||||
if (!(conf = NCONF_new(NULL))) {
|
||||
OPENSSL_free(filename);
|
||||
bio = ossl_obj2bio(str);
|
||||
conf = dst ? dst : NCONF_new(NULL);
|
||||
if(!conf){
|
||||
BIO_free(bio);
|
||||
ossl_raise(eConfigError, NULL);
|
||||
}
|
||||
OSSL_Debug("Loading file: %s", filename);
|
||||
|
||||
if (!NCONF_load(conf, filename, &err_line)) {
|
||||
char tmp[255];
|
||||
|
||||
memcpy(tmp, filename, strlen(filename)>=sizeof(tmp)?sizeof(tmp):strlen(filename));
|
||||
tmp[sizeof(tmp)-1] = '\0';
|
||||
OPENSSL_free(filename);
|
||||
|
||||
if (err_line <= 0) {
|
||||
ossl_raise(eConfigError, "wrong config file (%s)", tmp);
|
||||
} else {
|
||||
ossl_raise(eConfigError, "error on line %ld in config file \"%s\"",
|
||||
err_line, tmp);
|
||||
}
|
||||
if(!NCONF_load_bio(conf, bio, &eline)){
|
||||
BIO_free(bio);
|
||||
if(!dst) NCONF_free(conf);
|
||||
if (eline <= 0) ossl_raise(eConfigError, "wrong config format");
|
||||
else ossl_raise(eConfigError, "error in line %d", eline);
|
||||
ossl_raise(eConfigError, NULL);
|
||||
}
|
||||
OPENSSL_free(filename);
|
||||
BIO_free(bio);
|
||||
|
||||
return conf;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_config_s_parse(VALUE klass, VALUE str)
|
||||
{
|
||||
CONF *conf;
|
||||
VALUE obj;
|
||||
|
||||
conf = parse_config(str, NULL);
|
||||
WrapConfig(klass, obj, conf);
|
||||
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_config_get_value(int argc, VALUE *argv, VALUE self)
|
||||
ossl_config_s_alloc(VALUE klass)
|
||||
{
|
||||
CONF *conf;
|
||||
VALUE section, item;
|
||||
char *sect = NULL, *str;
|
||||
|
||||
GetConfig(self, conf);
|
||||
VALUE obj;
|
||||
|
||||
if (rb_scan_args(argc, argv, "11", §ion, &item) == 1) {
|
||||
item = section;
|
||||
} else if (!NIL_P(section)) {
|
||||
sect = StringValuePtr(section);
|
||||
if(!(conf = NCONF_new(NULL)))
|
||||
ossl_rasie(eConfigError, NULL);
|
||||
WrapConfig(klass, obj, conf);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_config_copy(VALUE self, VALUE other)
|
||||
{
|
||||
VALUE str;
|
||||
CONF *conf;
|
||||
|
||||
GetConfig(other, conf);
|
||||
str = rb_funcall(self, rb_intern("to_s"), 0);
|
||||
parse_config(str, conf);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_config_initialize(int argc, VALUE *argv, VALUE self)
|
||||
{
|
||||
CONF *conf;
|
||||
long eline = -1;
|
||||
char *filename;
|
||||
VALUE path;
|
||||
|
||||
GetConfig(self, conf);
|
||||
rb_scan_args(argc, argv, "01", &path);
|
||||
if(!NIL_P(path)){
|
||||
SafeStringValue(path);
|
||||
filename = StringValuePtr(path);
|
||||
if (!NCONF_load(conf, filename, &eline)){
|
||||
if (eline <= 0)
|
||||
ossl_raise(eConfigError, "wrong config file %s", filename);
|
||||
else
|
||||
ossl_raise(eConfigError, "error in %s:%d", filename, eline);
|
||||
}
|
||||
}
|
||||
if (!(str = NCONF_get_string(conf, sect, StringValuePtr(item)))) {
|
||||
else _CONF_new_data(conf);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_config_add_value(VALUE self, VALUE section, VALUE name, VALUE value)
|
||||
{
|
||||
CONF *conf;
|
||||
CONF_VALUE *sv, *cv;
|
||||
|
||||
GetConfig(self, conf);
|
||||
StringValue(section);
|
||||
StringValue(name);
|
||||
StringValue(value);
|
||||
if(!(sv = _CONF_get_section(conf, RSTRING(section)->ptr))){
|
||||
if(!(sv = _CONF_new_section(conf, RSTRING(section)->ptr))){
|
||||
ossl_raise(eConfigError, NULL);
|
||||
}
|
||||
}
|
||||
if(!(cv = OPENSSL_malloc(sizeof(CONF_VALUE)))){
|
||||
ossl_raise(eConfigError, NULL);
|
||||
}
|
||||
cv->name = BUF_strdup(RSTRING(name)->ptr);
|
||||
cv->value = BUF_strdup(RSTRING(value)->ptr);
|
||||
if(!cv->name || !cv->value || !_CONF_add_string(conf, sv, cv)){
|
||||
OPENSSL_free(cv->name);
|
||||
OPENSSL_free(cv->value);
|
||||
OPENSSL_free(cv);
|
||||
ossl_raise(eConfigError, "_CONF_add_string failure");
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_config_get_value(VALUE self, VALUE section, VALUE name)
|
||||
{
|
||||
CONF *conf;
|
||||
char *str;
|
||||
|
||||
GetConfig(self, conf);
|
||||
StringValue(section);
|
||||
StringValue(name);
|
||||
str = NCONF_get_string(conf, RSTRING(section)->ptr, RSTRING(name)->ptr);
|
||||
if(!str) ossl_raise(eConfigError, NULL);
|
||||
|
||||
return rb_str_new2(str);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_config_get_value_old(int argc, VALUE *argv, VALUE self)
|
||||
{
|
||||
VALUE section, name;
|
||||
rb_scan_args(argc, argv, "11", §ion, &name);
|
||||
rb_warn("Config#value is deprecated; use Config#get_value");
|
||||
return ossl_config_get_value(self, section, name);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
set_conf_section_i(VALUE i, VALUE *arg)
|
||||
{
|
||||
VALUE name, value;
|
||||
|
||||
name = rb_ary_entry(i, 0);
|
||||
value = rb_ary_entry(i, 1);
|
||||
ossl_config_add_value(arg[0], arg[1], name, value);
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_config_set_section(VALUE self, VALUE section, VALUE hash)
|
||||
{
|
||||
VALUE arg[2] = { self, section };
|
||||
rb_iterate(rb_each, hash, set_conf_section_i, (VALUE)arg);
|
||||
return hash;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get all numbers as strings - use str.to_i to convert
|
||||
* long number = CONF_get_number(confp->config, sect, StringValuePtr(item));
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
ossl_config_get_section(VALUE self, VALUE section)
|
||||
{
|
||||
|
@ -115,12 +241,10 @@ ossl_config_get_section(VALUE self, VALUE section)
|
|||
VALUE hash;
|
||||
|
||||
GetConfig(self, conf);
|
||||
|
||||
if (!(sk = NCONF_get_section(conf, StringValuePtr(section)))) {
|
||||
ossl_raise(eConfigError, NULL);
|
||||
}
|
||||
hash = rb_hash_new();
|
||||
|
||||
if ((entries = sk_CONF_VALUE_num(sk)) < 0) {
|
||||
OSSL_Debug("# of items in section is < 0?!?");
|
||||
return hash;
|
||||
|
@ -129,9 +253,100 @@ ossl_config_get_section(VALUE self, VALUE section)
|
|||
entry = sk_CONF_VALUE_value(sk, i);
|
||||
rb_hash_aset(hash, rb_str_new2(entry->name), rb_str_new2(entry->value));
|
||||
}
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_config_get_section_old(VALUE self, VALUE section)
|
||||
{
|
||||
rb_warn("Config#section is deprecated; use Config#[]");
|
||||
return ossl_config_get_section(self, section);
|
||||
}
|
||||
|
||||
static void
|
||||
get_conf_section(CONF_VALUE *cv, VALUE ary)
|
||||
{
|
||||
if(cv->name) return;
|
||||
rb_ary_push(ary, rb_str_new2(cv->section));
|
||||
}
|
||||
|
||||
static IMPLEMENT_LHASH_DOALL_ARG_FN(get_conf_section, CONF_VALUE*, VALUE);
|
||||
|
||||
static VALUE
|
||||
ossl_config_get_sections(VALUE self)
|
||||
{
|
||||
CONF *conf;
|
||||
VALUE ary;
|
||||
|
||||
GetConfig(self, conf);
|
||||
ary = rb_ary_new();
|
||||
lh_doall_arg(conf->data, LHASH_DOALL_ARG_FN(get_conf_section), (void*)ary);
|
||||
|
||||
return ary;
|
||||
}
|
||||
|
||||
static void
|
||||
dump_conf_value(CONF_VALUE *cv, VALUE str)
|
||||
{
|
||||
STACK_OF(CONF_VALUE) *sk;
|
||||
CONF_VALUE *v;
|
||||
int i, num;
|
||||
|
||||
if (cv->name) return;
|
||||
sk = (STACK_OF(CONF_VALUE)*)cv->value;
|
||||
num = sk_CONF_VALUE_num(sk);
|
||||
rb_str_cat2(str, "[ ");
|
||||
rb_str_cat2(str, cv->section);
|
||||
rb_str_cat2(str, " ]\n");
|
||||
for(i = 0; i < num; i++){
|
||||
v = sk_CONF_VALUE_value(sk, i);
|
||||
rb_str_cat2(str, v->name ? v->name : "None");
|
||||
rb_str_cat2(str, "=");
|
||||
rb_str_cat2(str, v->value ? v->value : "None");
|
||||
rb_str_cat2(str, "\n");
|
||||
}
|
||||
rb_str_cat2(str, "\n");
|
||||
}
|
||||
|
||||
static IMPLEMENT_LHASH_DOALL_ARG_FN(dump_conf_value, CONF_VALUE*, VALUE);
|
||||
|
||||
static VALUE
|
||||
dump_conf(CONF *conf)
|
||||
{
|
||||
VALUE str;
|
||||
|
||||
str = rb_str_new(0, 0);
|
||||
lh_doall_arg(conf->data, LHASH_DOALL_ARG_FN(dump_conf_value), (void*)str);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_config_to_s(VALUE self)
|
||||
{
|
||||
CONF *conf;
|
||||
|
||||
GetConfig(self, conf);
|
||||
|
||||
return dump_conf(conf);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_config_inspect(VALUE self)
|
||||
{
|
||||
VALUE str, ary = ossl_config_get_sections(self);
|
||||
char *cname = rb_class2name(rb_obj_class(self));
|
||||
|
||||
str = rb_str_new2("#<");
|
||||
rb_str_cat2(str, cname);
|
||||
rb_str_cat2(str, " sections=");
|
||||
rb_str_append(str, rb_inspect(ary));
|
||||
rb_str_cat2(str, ">");
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
* INIT
|
||||
*/
|
||||
|
@ -139,14 +354,22 @@ void
|
|||
Init_ossl_config()
|
||||
{
|
||||
eConfigError = rb_define_class_under(mOSSL, "ConfigError", eOSSLError);
|
||||
|
||||
cConfig = rb_define_class_under(mOSSL, "Config", rb_cObject);
|
||||
|
||||
rb_define_singleton_method(cConfig, "load", ossl_config_s_load, -1);
|
||||
rb_define_alias(CLASS_OF(cConfig), "new", "load");
|
||||
|
||||
rb_define_method(cConfig, "value", ossl_config_get_value, -1);
|
||||
rb_define_method(cConfig, "section", ossl_config_get_section, 1);
|
||||
rb_define_alias(cConfig, "[]", "section");
|
||||
rb_define_const(cConfig, "DEFAULT_CONFIG_FILE",
|
||||
rb_str_new2(CONF_get1_default_config_file()));
|
||||
rb_define_singleton_method(cConfig, "parse", ossl_config_s_parse, 1);
|
||||
rb_define_alias(CLASS_OF(cConfig), "load", "new");
|
||||
rb_define_alloc_func(cConfig, ossl_config_s_alloc);
|
||||
rb_define_copy_func(cConfig, ossl_config_copy);
|
||||
rb_define_method(cConfig, "initialize", ossl_config_initialize, -1);
|
||||
rb_define_method(cConfig, "get_value", ossl_config_get_value, 2);
|
||||
rb_define_method(cConfig, "value", ossl_config_get_value_old, -1);
|
||||
rb_define_method(cConfig, "add_value", ossl_config_add_value, 3);
|
||||
rb_define_method(cConfig, "[]", ossl_config_get_section, 1);
|
||||
rb_define_method(cConfig, "section", ossl_config_get_section_old, 1);
|
||||
rb_define_method(cConfig, "[]=", ossl_config_set_section, 2);
|
||||
rb_define_method(cConfig, "sections", ossl_config_get_sections, 0);
|
||||
rb_define_method(cConfig, "to_s", ossl_config_to_s, 0);
|
||||
rb_define_method(cConfig, "inspect", ossl_config_inspect, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
extern VALUE cConfig;
|
||||
extern VALUE eConfigError;
|
||||
|
||||
CONF* GetConfigPtr(VALUE obj);
|
||||
CONF* DupConfigPtr(VALUE obj);
|
||||
void Init_ossl_config(void);
|
||||
|
||||
#endif /* _OSSL_CONFIG_H_ */
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
VALUE mX509;
|
||||
|
||||
#define DefX509Const(x) rb_define_const(mX509, #x,INT2FIX(X509_##x))
|
||||
#define DefX509Default(x,i) \
|
||||
rb_define_const(mX509, "DEFAULT_" #x, rb_str_new2(X509_get_default_##i()))
|
||||
|
||||
void
|
||||
Init_ossl_x509()
|
||||
|
@ -91,5 +93,12 @@ Init_ossl_x509()
|
|||
#if defined(X509_TRUST_OCSP_REQUEST)
|
||||
DefX509Const(TRUST_OCSP_REQUEST);
|
||||
#endif
|
||||
|
||||
DefX509Default(CERT_AREA, cert_area);
|
||||
DefX509Default(CERT_DIR, cert_dir);
|
||||
DefX509Default(CERT_FILE, cert_file);
|
||||
DefX509Default(CERT_DIR_ENV, cert_dir_env);
|
||||
DefX509Default(CERT_FILE_ENV, cert_file_env);
|
||||
DefX509Default(PRIVATE_DIR, private_dir);
|
||||
}
|
||||
|
||||
|
|
|
@ -97,13 +97,7 @@ DupX509ExtPtr(VALUE obj)
|
|||
static void
|
||||
ossl_x509extfactory_free(X509V3_CTX *ctx)
|
||||
{
|
||||
if (ctx) {
|
||||
if (ctx->issuer_cert) X509_free(ctx->issuer_cert);
|
||||
if (ctx->subject_cert) X509_free(ctx->subject_cert);
|
||||
if (ctx->crl) X509_CRL_free(ctx->crl);
|
||||
if (ctx->subject_req) X509_REQ_free(ctx->subject_req);
|
||||
OPENSSL_free(ctx);
|
||||
}
|
||||
OPENSSL_free(ctx);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
@ -123,6 +117,7 @@ ossl_x509extfactory_set_issuer_cert(VALUE self, VALUE cert)
|
|||
X509V3_CTX *ctx;
|
||||
|
||||
GetX509ExtFactory(self, ctx);
|
||||
rb_iv_set(self, "@issuer_certificate", cert);
|
||||
ctx->issuer_cert = DupX509CertPtr(cert); /* DUP NEEDED */
|
||||
|
||||
return cert;
|
||||
|
@ -134,6 +129,7 @@ ossl_x509extfactory_set_subject_cert(VALUE self, VALUE cert)
|
|||
X509V3_CTX *ctx;
|
||||
|
||||
GetX509ExtFactory(self, ctx);
|
||||
rb_iv_set(self, "@subject_certificate", cert);
|
||||
ctx->subject_cert = DupX509CertPtr(cert); /* DUP NEEDED */
|
||||
|
||||
return cert;
|
||||
|
@ -145,6 +141,7 @@ ossl_x509extfactory_set_subject_req(VALUE self, VALUE req)
|
|||
X509V3_CTX *ctx;
|
||||
|
||||
GetX509ExtFactory(self, ctx);
|
||||
rb_iv_set(self, "@subject_request", req);
|
||||
ctx->subject_req = DupX509ReqPtr(req);
|
||||
|
||||
return req;
|
||||
|
@ -156,11 +153,26 @@ ossl_x509extfactory_set_crl(VALUE self, VALUE crl)
|
|||
X509V3_CTX *ctx;
|
||||
|
||||
GetX509ExtFactory(self, ctx);
|
||||
rb_iv_set(self, "@crl", crl);
|
||||
ctx->crl = DupX509CRLPtr(crl);
|
||||
|
||||
return crl;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_x509extfactory_set_config(VALUE self, VALUE config)
|
||||
{
|
||||
X509V3_CTX *ctx;
|
||||
CONF *conf;
|
||||
|
||||
GetX509ExtFactory(self, ctx);
|
||||
rb_iv_set(self, "@config", config);
|
||||
conf = GetConfigPtr(config);
|
||||
X509V3_set_nconf(ctx, conf);
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ossl_x509extfactory_initialize(int argc, VALUE *argv, VALUE self)
|
||||
{
|
||||
|
@ -408,10 +420,17 @@ Init_ossl_x509ext()
|
|||
rb_define_alloc_func(cX509ExtFactory, ossl_x509extfactory_alloc);
|
||||
rb_define_method(cX509ExtFactory, "initialize", ossl_x509extfactory_initialize, -1);
|
||||
|
||||
rb_attr(cX509ExtFactory, rb_intern("issuer_certificate"), 1, 0, Qfalse);
|
||||
rb_attr(cX509ExtFactory, rb_intern("subject_certificate"), 1, 0, Qfalse);
|
||||
rb_attr(cX509ExtFactory, rb_intern("subject_request"), 1, 0, Qfalse);
|
||||
rb_attr(cX509ExtFactory, rb_intern("crl"), 1, 0, Qfalse);
|
||||
rb_attr(cX509ExtFactory, rb_intern("config"), 1, 0, Qfalse);
|
||||
|
||||
rb_define_method(cX509ExtFactory, "issuer_certificate=", ossl_x509extfactory_set_issuer_cert, 1);
|
||||
rb_define_method(cX509ExtFactory, "subject_certificate=", ossl_x509extfactory_set_subject_cert, 1);
|
||||
rb_define_method(cX509ExtFactory, "subject_request=", ossl_x509extfactory_set_subject_req, 1);
|
||||
rb_define_method(cX509ExtFactory, "crl=", ossl_x509extfactory_set_crl, 1);
|
||||
rb_define_method(cX509ExtFactory, "config=", ossl_x509extfactory_set_config, 1);
|
||||
rb_define_method(cX509ExtFactory, "create_ext_from_array", ossl_x509extfactory_create_ext_from_array, 1);
|
||||
|
||||
cX509Ext = rb_define_class_under(mX509, "Extension", rb_cObject);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue