aboutsummaryrefslogtreecommitdiffstats
path: root/ossl_x509name.c
diff options
context:
space:
mode:
Diffstat (limited to 'ossl_x509name.c')
-rw-r--r--ossl_x509name.c93
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);
}