# HG changeset patch # User Matthew Wild # Date 1289001574 0 # Node ID c4452dfd6ade2a3c29b4556969451479734f4712 # Parent c3755cb3d24653aed6c5dddf082f6b9a4fa41f27 x509: Split :decode() method into two methods, :subject() and :extensions() diff -r c3755cb3d246 -r c4452dfd6ade src/x509.c --- a/src/x509.c Fri Nov 05 23:14:54 2010 +0000 +++ b/src/x509.c Fri Nov 05 23:59:34 2010 +0000 @@ -71,23 +71,19 @@ return 0; } -int meth_decode(lua_State* L) +int meth_subject(lua_State* L) { X509 *peer; X509_NAME *subject; - int i, j, n_entries; + int i, n_entries; peer = luasec_to_x509(L, 1); lua_newtable(L); /* ret */ subject = X509_get_subject_name(peer); - n_entries = X509_NAME_entry_count(subject); - lua_newtable(L); /* {} */ - lua_pushvalue(L, -1); - lua_setfield(L, -3, "subject"); /* ret.subject = {} */ for(i = 0; i <= n_entries; i++) { X509_NAME_ENTRY *entry; @@ -96,26 +92,31 @@ entry = X509_NAME_get_entry(subject, i); object = X509_NAME_ENTRY_get_object(entry); - luasec_push_asn1_objname(L, object, 1); + lua_newtable(L); - if(luasec_push_subtable(L, -2)) - { - /* Get short/long name of the entry */ - luasec_push_asn1_objname(L, object, 0); - lua_setfield(L, -2, "name"); - } + luasec_push_asn1_objname(L, object, 1); + lua_setfield(L, -2, "oid"); + + luasec_push_asn1_objname(L, object, 0); + lua_setfield(L, -2, "name"); luasec_push_asn1_string(L, X509_NAME_ENTRY_get_data(entry)); + lua_setfield(L, -2, "value"); + lua_rawseti(L, -2, lua_objlen(L, -2)+1); - lua_pop(L, 1); } + return 1; +} - lua_pop(L, 1); /* ret.subject */ +int meth_extensions(lua_State* L) +{ + X509 *peer; + int i, j; - lua_newtable(L); /* {} */ - lua_pushvalue(L, -1); - lua_setfield(L, -3, "extensions"); /* ret.extensions = {} */ + peer = luasec_to_x509(L, 1); + + lua_newtable(L); /* ret */ i = -1; while((i = X509_get_ext_by_NID(peer, NID_subject_alt_name, i)) != -1) @@ -132,10 +133,10 @@ if(values == NULL) break; - /* Push ret.extensions[oid] */ + /* Push ret[oid] */ luasec_push_asn1_objname(L, extension->object, 1); luasec_push_subtable(L, -2); - /* Set ret.extensions[oid].name = name */ + /* Set ret[oid].name = name */ luasec_push_asn1_objname(L, extension->object, 0); lua_setfield(L, -2, "name"); @@ -180,10 +181,9 @@ } } - lua_pop(L, 1); /* array */ + lua_pop(L, 1); /* ret[oid] */ i++; /* Next extension */ } - lua_pop(L, 1); /* ret.extensions */ return 1; } @@ -248,7 +248,8 @@ * Certificate metamethods */ static luaL_Reg meta[] = { - {"decode", meth_decode}, + {"subject", meth_subject}, + {"extensions", meth_extensions}, {"pem", meth_pem}, {"digest", meth_digest}, {NULL, NULL}