diff options
Diffstat (limited to 'ossl_x509name.c')
-rw-r--r-- | ossl_x509name.c | 93 |
1 files changed, 43 insertions, 50 deletions
diff --git a/ossl_x509name.c b/ossl_x509name.c index 905aa5d..ec6ed01 100644 --- a/ossl_x509name.c +++ b/ossl_x509name.c @@ -9,7 +9,6 @@ * (See the file 'LICENCE'.) */ #include "ossl.h" -#include "st.h" /* For st_foreach -- ST_CONTINUE */ #define WrapX509Name(obj, name) obj = Data_Wrap_Struct(cX509Name, 0, X509_NAME_free, name) #define GetX509Name(obj, name) Data_Get_Struct(obj, X509_NAME, name) @@ -57,88 +56,81 @@ ossl_x509name_get_X509_NAME(VALUE obj) return new; } -/* - * Private - */ -/* - * Iterator for ossl_x509name_new_from_hash - */ -static int -ossl_x509name_hash_i(VALUE key, VALUE value, X509_NAME *name) +static VALUE +ossl_x509name_s_new(int argc, VALUE *argv, VALUE *klass) { - int id, type; - - key = rb_String(key); - value = rb_String(value); - - if (!(id = OBJ_ln2nid(RSTRING(key)->ptr))) - if (!(id = OBJ_sn2nid(RSTRING(key)->ptr))) { - X509_NAME_free(name); - OSSL_Raise(eX509NameError, "OBJ_name2nid:"); - } - - type = ASN1_PRINTABLE_type(RSTRING(value)->ptr, -1); + X509_NAME *name = NULL; + VALUE obj; - if (!X509_NAME_add_entry_by_NID(name, id, type, RSTRING(value)->ptr, RSTRING(value)->len, -1, 0)) { - X509_NAME_free(name); + if(!(name = X509_NAME_new())) OSSL_Raise(eX509NameError, ""); - } - - return ST_CONTINUE; + WrapX509Name(obj, name); + rb_obj_call_init(obj, argc, argv); + + return obj; } static VALUE -ossl_x509name_s_new_from_hash(VALUE klass, VALUE hash) +ossl_x509name_initialize(int argc, VALUE *argv, VALUE self) { - X509_NAME *name = NULL; - VALUE obj; - - Check_Type(hash, T_HASH); - - if (!(name = X509_NAME_new())) - OSSL_Raise(eX509NameError, ""); + X509_NAME *name; + int i, type; + VALUE arg, item, key, value; - st_foreach(RHASH(hash)->tbl, ossl_x509name_hash_i, name); + GetX509Name(self, name); + if(rb_scan_args(argc, argv, "01", &arg) == 0){ + return self; + } - WrapX509Name(obj, name); + Check_Type(arg, T_ARRAY); + for(i = 0; i < RARRAY(arg)->len; i++){ + item = rb_ary_entry(arg, i); Check_Type(item, T_ARRAY); + key = rb_ary_entry(item, 0); Check_Type(key, T_STRING); + value = rb_ary_entry(item, 1); Check_Type(value, T_STRING); - return obj; + type = ASN1_PRINTABLE_type(RSTRING(value)->ptr, -1); + if (!X509_NAME_add_entry_by_txt(name, RSTRING(key)->ptr, type, + RSTRING(value)->ptr, RSTRING(value)->len, -1, 0)) { + OSSL_Raise(eX509NameError, ""); + } + } + + return self; } static VALUE -ossl_x509name_to_h(VALUE self) +ossl_x509name_to_a(VALUE self) { X509_NAME *name = NULL; X509_NAME_ENTRY *entry = NULL; int i,entries = 0; char long_name[512]; const char *short_name = NULL; - VALUE hash; + VALUE ary, tmp; GetX509Name(self, name); entries = X509_NAME_entry_count(name); - - hash = rb_hash_new(); - + ary = rb_ary_new2(entries); if (entries < 0) { rb_warning("name entries < 0!"); - return hash; + return ary; } - for (i=0; i<entries; i++) { if (!(entry = X509_NAME_get_entry(name, i))) { OSSL_Raise(eX509NameError, ""); } - if (!i2t_ASN1_OBJECT(long_name, sizeof(long_name), entry->object)) { + if (!i2t_ASN1_OBJECT(long_name, sizeof(long_name), + entry->object)) { OSSL_Raise(eX509NameError, ""); } short_name = OBJ_nid2sn(OBJ_ln2nid(long_name)); - - rb_hash_aset(hash, rb_str_new2(short_name), rb_str_new(entry->value->data, entry->value->length)); + tmp = rb_ary_new3(2, rb_str_new2(short_name), + rb_str_new(entry->value->data, entry->value->length)); + rb_ary_push(ary, tmp); } - return hash; + return ary; } /* @@ -150,7 +142,8 @@ Init_ossl_x509name(VALUE module) eX509NameError = rb_define_class_under(module, "NameError", rb_eStandardError); cX509Name = rb_define_class_under(module, "Name", rb_cObject); - rb_define_singleton_method(cX509Name, "new_from_hash", ossl_x509name_s_new_from_hash, 1); - rb_define_method(cX509Name, "to_h", ossl_x509name_to_h, 0); + rb_define_singleton_method(cX509Name, "new", ossl_x509name_s_new, -1); + rb_define_method(cX509Name, "initialize", ossl_x509name_initialize, -1); + rb_define_method(cX509Name, "to_a", ossl_x509name_to_a, 0); } |