summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Ahern <william@25thandclement.com>2016-06-24 19:14:05 -0700
committerWilliam Ahern <william@25thandclement.com>2016-06-24 19:14:05 -0700
commitc429c7d4945d2cddf43d31bd59b45cadea617f82 (patch)
tree5458f64fbd3a52e7128f8977715b3ee1cac3098a
parentdac0e48996b48537fa6d1f6b75b39731b9a58cb2 (diff)
parentbddd9f5a79ae4aea43d7dca09157c53e40503bfb (diff)
downloadluaossl-c429c7d4945d2cddf43d31bd59b45cadea617f82.tar.gz
luaossl-c429c7d4945d2cddf43d31bd59b45cadea617f82.tar.bz2
luaossl-c429c7d4945d2cddf43d31bd59b45cadea617f82.zip
Merge branch 'ashb-csr_san'
-rw-r--r--doc/luaossl.tex8
-rw-r--r--src/GNUmakefile1
-rw-r--r--src/openssl.auxlib.lua21
-rw-r--r--src/openssl.c96
-rw-r--r--src/openssl.x509.altname.lua3
-rw-r--r--src/openssl.x509.name.lua3
6 files changed, 130 insertions, 2 deletions
diff --git a/doc/luaossl.tex b/doc/luaossl.tex
index 433dd03..7db7463 100644
--- a/doc/luaossl.tex
+++ b/doc/luaossl.tex
@@ -597,6 +597,14 @@ Returns the subject distinguished name as an \module{x509.name} object.
597 597
598Sets the subject distinguished name. $name$ should be an \module{x509.name} object. 598Sets the subject distinguished name. $name$ should be an \module{x509.name} object.
599 599
600\subsubsection[\fn{csr:getSubjectAlt}]{\fn{csr:getSubjectAlt()}}
601
602Returns the subject alternative name as an \module{x509.altname} object.
603
604\subsubsection[\fn{csr:setSubjectAlt}]{\fn{csr:setSubjectAlt($name$)}}
605
606Sets the subject alternative names. $name$ should be an \module{x509.altname} object.
607
600\subsubsection[\fn{csr:getPublicKey}]{\fn{csr:getPublicKey()}} 608\subsubsection[\fn{csr:getPublicKey}]{\fn{csr:getPublicKey()}}
601 609
602Returns the public key component as an \module{openssl.pkey} object. 610Returns the public key component as an \module{openssl.pkey} object.
diff --git a/src/GNUmakefile b/src/GNUmakefile
index 3aff30a..f0eefde 100644
--- a/src/GNUmakefile
+++ b/src/GNUmakefile
@@ -88,6 +88,7 @@ LUAC$(1)_$(d) = $$(or $$(call LUAPATH_$(d), $(1), luac), true)
88MODS$(1)_$(d) = \ 88MODS$(1)_$(d) = \
89 $$(DESTDIR)$(2)/_openssl.so \ 89 $$(DESTDIR)$(2)/_openssl.so \
90 $$(DESTDIR)$(3)/openssl.lua \ 90 $$(DESTDIR)$(3)/openssl.lua \
91 $$(DESTDIR)$(3)/openssl/auxlib.lua \
91 $$(DESTDIR)$(3)/openssl/bignum.lua \ 92 $$(DESTDIR)$(3)/openssl/bignum.lua \
92 $$(DESTDIR)$(3)/openssl/pkey.lua \ 93 $$(DESTDIR)$(3)/openssl/pkey.lua \
93 $$(DESTDIR)$(3)/openssl/pubkey.lua \ 94 $$(DESTDIR)$(3)/openssl/pubkey.lua \
diff --git a/src/openssl.auxlib.lua b/src/openssl.auxlib.lua
new file mode 100644
index 0000000..4f00c25
--- /dev/null
+++ b/src/openssl.auxlib.lua
@@ -0,0 +1,21 @@
1local auxlib = {}
2
3if _VERSION == "Lua 5.1" then
4 local _pairs = pairs
5
6 function auxlib.pairs(t)
7 if type(t) == "userdata" then
8 local mt = getmetatable(t)
9
10 if mt and mt.__pairs then
11 return mt.__pairs(t)
12 else
13 return _pairs(t)
14 end
15 end
16 end
17else
18 auxlib.pairs = pairs
19end
20
21return auxlib
diff --git a/src/openssl.c b/src/openssl.c
index 11d02a0..9c40e57 100644
--- a/src/openssl.c
+++ b/src/openssl.c
@@ -4328,6 +4328,7 @@ static const auxL_IntegerReg xe_textopts[] = {
4328 { "ERROR_UNKNOWN", X509V3_EXT_ERROR_UNKNOWN }, 4328 { "ERROR_UNKNOWN", X509V3_EXT_ERROR_UNKNOWN },
4329 { "PARSE_UNKNOWN", X509V3_EXT_PARSE_UNKNOWN }, 4329 { "PARSE_UNKNOWN", X509V3_EXT_PARSE_UNKNOWN },
4330 { "DUMP_UNKNOWN", X509V3_EXT_DUMP_UNKNOWN }, 4330 { "DUMP_UNKNOWN", X509V3_EXT_DUMP_UNKNOWN },
4331 { NULL, 0 },
4331}; 4332};
4332 4333
4333int luaopen__openssl_x509_extension(lua_State *L) { 4334int luaopen__openssl_x509_extension(lua_State *L) {
@@ -5487,6 +5488,99 @@ static int xr_setPublicKey(lua_State *L) {
5487} /* xr_setPublicKey() */ 5488} /* xr_setPublicKey() */
5488 5489
5489 5490
5491static int xr_setExtensionByNid(lua_State *L, X509_REQ *csr, int target_nid, void* value) {
5492 STACK_OF(X509_EXTENSION) *sk = NULL;
5493 int has_attrs=0;
5494
5495 /*
5496 * Replace existing if it's there. Extensions are stored in a CSR in
5497 * an interesting way:
5498 *
5499 * They are stored as a list under either (most likely) the
5500 * "official" NID_ext_req or under NID_ms_ext_req which means
5501 * everything is stored under a list in a single "attribute" so we
5502 * can't use X509_REQ_add1_attr or similar.
5503 *
5504 * Instead we have to get the extensions, find and replace the SAN
5505 * if it's in there, then *replace* the extensions in the list of
5506 * attributes. (If we just try to add it the old ones are found
5507 * first and don't take priority.)
5508 */
5509 has_attrs = X509_REQ_get_attr_count(csr);
5510
5511 sk = X509_REQ_get_extensions(csr);
5512 if (!X509V3_add1_i2d(&sk, target_nid, value, 0, X509V3_ADD_REPLACE))
5513 goto error;
5514 if (X509_REQ_add_extensions(csr, sk) == 0)
5515 goto error;
5516 sk_X509_EXTENSION_pop_free(sk, X509_EXTENSION_free);
5517 sk = NULL;
5518
5519 /*
5520 * Delete the old extensions attribute, so that the one we just
5521 * added takes priority.
5522 */
5523 if (has_attrs) {
5524 X509_ATTRIBUTE *attr = NULL;
5525 int idx, *pnid;
5526
5527 for (pnid = X509_REQ_get_extension_nids(); *pnid != NID_undef; pnid++) {
5528 idx = X509_REQ_get_attr_by_NID(csr, *pnid, -1);
5529 if (idx == -1)
5530 continue;
5531 if (!(attr = X509_REQ_delete_attr(csr, idx)))
5532 goto error;
5533 X509_ATTRIBUTE_free(attr);
5534 break;
5535 }
5536 if (!attr)
5537 goto error;
5538 }
5539
5540 /*
5541 * We have to mark the encoded form as invalid, otherwise when we
5542 * write it out again it will use the loaded version.
5543 */
5544 csr->req_info->enc.modified = 1;
5545
5546 lua_pushboolean(L, 1);
5547
5548 return 1;
5549error:
5550 if (sk)
5551 sk_X509_EXTENSION_pop_free(sk, X509_EXTENSION_free);
5552
5553 return auxL_error(L, auxL_EOPENSSL, "x509.csr.setExtensionByNid");
5554} /* xr_setExtensionByNid() */
5555
5556
5557static int xr_setSubjectAlt(lua_State *L) {
5558 X509_REQ *csr = checksimple(L, 1, X509_CSR_CLASS);
5559 GENERAL_NAMES *gens = checksimple(L, 2, X509_GENS_CLASS);
5560
5561 return xr_setExtensionByNid(L, csr, NID_subject_alt_name, gens);
5562} /* xr_setSubjectAlt */
5563
5564
5565static int xr_getSubjectAlt(lua_State *L) {
5566 X509_REQ *csr = checksimple(L, 1, X509_CSR_CLASS);
5567 STACK_OF(X509_EXTENSION) *exts;
5568 GENERAL_NAMES *gens;
5569
5570 exts = X509_REQ_get_extensions(csr);
5571 gens = X509V3_get_d2i(exts, NID_subject_alt_name, NULL, NULL);
5572 sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
5573 if (!gens) goto error;
5574
5575 gn_dup(L, gens);
5576
5577 return 1;
5578error:
5579 return 0;
5580} /* xr_getSubjectAlt() */
5581
5582
5583
5490static int xr_sign(lua_State *L) { 5584static int xr_sign(lua_State *L) {
5491 X509_REQ *csr = checksimple(L, 1, X509_CSR_CLASS); 5585 X509_REQ *csr = checksimple(L, 1, X509_CSR_CLASS);
5492 EVP_PKEY *key = checksimple(L, 2, PKEY_CLASS); 5586 EVP_PKEY *key = checksimple(L, 2, PKEY_CLASS);
@@ -5544,6 +5638,8 @@ static const auxL_Reg xr_methods[] = {
5544 { "setSubject", &xr_setSubject }, 5638 { "setSubject", &xr_setSubject },
5545 { "getPublicKey", &xr_getPublicKey }, 5639 { "getPublicKey", &xr_getPublicKey },
5546 { "setPublicKey", &xr_setPublicKey }, 5640 { "setPublicKey", &xr_setPublicKey },
5641 { "getSubjectAlt", &xr_getSubjectAlt },
5642 { "setSubjectAlt", &xr_setSubjectAlt },
5547 { "sign", &xr_sign }, 5643 { "sign", &xr_sign },
5548 { "tostring", &xr__tostring }, 5644 { "tostring", &xr__tostring },
5549 { NULL, NULL }, 5645 { NULL, NULL },
diff --git a/src/openssl.x509.altname.lua b/src/openssl.x509.altname.lua
index 66f16e7..e8222a0 100644
--- a/src/openssl.x509.altname.lua
+++ b/src/openssl.x509.altname.lua
@@ -1,9 +1,10 @@
1local altname = require"_openssl.x509.altname" 1local altname = require"_openssl.x509.altname"
2local auxlib = require"openssl.auxlib"
2 3
3altname.interpose("__tostring", function (self) 4altname.interpose("__tostring", function (self)
4 local t = { } 5 local t = { }
5 6
6 for k, v in pairs(self) do 7 for k, v in auxlib.pairs(self) do
7 t[#t + 1] = k .. ":" .. v 8 t[#t + 1] = k .. ":" .. v
8 end 9 end
9 10
diff --git a/src/openssl.x509.name.lua b/src/openssl.x509.name.lua
index a531502..f33339a 100644
--- a/src/openssl.x509.name.lua
+++ b/src/openssl.x509.name.lua
@@ -1,9 +1,10 @@
1local name = require"_openssl.x509.name" 1local name = require"_openssl.x509.name"
2local auxlib = require"openssl.auxlib"
2 3
3name.interpose("__tostring", function (self) 4name.interpose("__tostring", function (self)
4 local t = { } 5 local t = { }
5 6
6 for k, v in pairs(self) do 7 for k, v in auxlib.pairs(self) do
7 t[#t + 1] = k .. "=" .. v 8 t[#t + 1] = k .. "=" .. v
8 end 9 end
9 10