summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwilliam <william+macosx@25thandclement.com>2015-06-04 18:27:35 -0700
committerwilliam <william+macosx@25thandclement.com>2015-06-04 18:27:35 -0700
commit5fa11721a7b3dddf5a7e41a164428749a60b7c44 (patch)
tree57b0cd472c68900fb9f299cbcbb94ec44d22af5b
parent53bcdd14c76157bac713414ca3df745c08b87916 (diff)
downloadluaossl-5fa11721a7b3dddf5a7e41a164428749a60b7c44.tar.gz
luaossl-5fa11721a7b3dddf5a7e41a164428749a60b7c44.tar.bz2
luaossl-5fa11721a7b3dddf5a7e41a164428749a60b7c44.zip
permit getting extension by index (1-based indexing), and add x509:getExtensionCount and crl:getExtensionCount methods
-rw-r--r--src/openssl.c120
1 files changed, 86 insertions, 34 deletions
diff --git a/src/openssl.c b/src/openssl.c
index a4efcdc..108ae3d 100644
--- a/src/openssl.c
+++ b/src/openssl.c
@@ -585,6 +585,24 @@ static size_t auxS_obj2txt(void *dst, size_t lim, const ASN1_OBJECT *obj) {
585 return auxS_obj2id(dst, lim, obj); 585 return auxS_obj2id(dst, lim, obj);
586} /* auxS_obj2txt() */ 586} /* auxS_obj2txt() */
587 587
588static _Bool auxS_isoid(const char *txt) {
589 return (*txt >= '0' && *txt <= '9');
590} /* auxS_isoid() */
591
592static _Bool auxS_txt2obj(ASN1_OBJECT **obj, const char *txt) {
593 int nid;
594
595 if ((nid = OBJ_sn2nid(txt)) != NID_undef
596 || (nid = OBJ_ln2nid(txt)) != NID_undef) {
597 return NULL != (*obj = OBJ_nid2obj(nid));
598 } else if (auxS_isoid(txt)) {
599 return NULL != (*obj = OBJ_txt2obj(txt, 1));
600 } else {
601 *obj = NULL;
602 return 1;
603 }
604} /* auxS_txt2obj() */
605
588 606
589/* 607/*
590 * Auxiliary Lua API routines 608 * Auxiliary Lua API routines
@@ -3867,35 +3885,51 @@ static int xc_addExtension(lua_State *L) {
3867 3885
3868static int xc_getExtension(lua_State *L) { 3886static int xc_getExtension(lua_State *L) {
3869 X509 *crt = checksimple(L, 1, X509_CERT_CLASS); 3887 X509 *crt = checksimple(L, 1, X509_CERT_CLASS);
3870 const char *name = luaL_checkstring(L, 2); 3888 X509_EXTENSION *ext = NULL, **ud;
3871 X509_EXTENSION *ext, **ud; 3889 int i;
3872 ASN1_OBJECT *obj = NULL;
3873 3890
3874 if (!(obj = OBJ_txt2obj(name, 0))) 3891 luaL_checkany(L, 2);
3875 goto error;
3876 3892
3877 int i = X509_get_ext_by_OBJ(crt, obj, -1); 3893 if (lua_type(L, 2) == LUA_TNUMBER) {
3878 if (i > -1) { 3894 /* NB: Lua 1-based indexing */
3879 ud = prepsimple(L, X509_EXT_CLASS); 3895 i = auxL_checkinteger(L, 2, 1, INT_MAX) - 1;
3880 if (!(ext = X509_get0_ext(crt, i)))
3881 goto error;
3882 if (!(*ud = X509_EXTENSION_dup(ext)))
3883 goto error;
3884 } else { 3896 } else {
3885 lua_pushnil(L); 3897 ASN1_OBJECT *obj;
3898
3899 if (!auxS_txt2obj(&obj, luaL_checkstring(L, 2))) {
3900 goto error;
3901 } else if (!obj) {
3902 goto undef;
3903 }
3904
3905 i = X509_get_ext_by_OBJ(crt, obj, -1);
3906
3907 ASN1_OBJECT_free(obj);
3886 } 3908 }
3887 3909
3888 ASN1_OBJECT_free(obj); 3910 ud = prepsimple(L, X509_EXT_CLASS);
3911
3912 if (i < 0 || !(ext = X509_get0_ext(crt, i)))
3913 goto undef;
3914
3915 if (!(*ud = X509_EXTENSION_dup(ext)))
3916 goto error;
3889 3917
3890 return 1; 3918 return 1;
3919undef:
3920 return 0;
3891error: 3921error:
3892 if (obj)
3893 ASN1_OBJECT_free(obj);
3894
3895 return auxL_error(L, auxL_EOPENSSL, "x509.cert:getExtension"); 3922 return auxL_error(L, auxL_EOPENSSL, "x509.cert:getExtension");
3896} /* xc_getExtension() */ 3923} /* xc_getExtension() */
3897 3924
3898 3925
3926static int xc_getExtensionCount(lua_State *L) {
3927 auxL_pushinteger(L, X509_get_ext_count(checksimple(L, 1, X509_CERT_CLASS)));
3928
3929 return 1;
3930} /* xc_getExtensionCount() */
3931
3932
3899static int xc_isIssuedBy(lua_State *L) { 3933static int xc_isIssuedBy(lua_State *L) {
3900 X509 *crt = checksimple(L, 1, X509_CERT_CLASS); 3934 X509 *crt = checksimple(L, 1, X509_CERT_CLASS);
3901 X509 *issuer = checksimple(L, 2, X509_CERT_CLASS); 3935 X509 *issuer = checksimple(L, 2, X509_CERT_CLASS);
@@ -4134,6 +4168,7 @@ static const luaL_Reg xc_methods[] = {
4134 { "setBasicConstraintsCritical", &xc_setBasicConstraintsCritical }, 4168 { "setBasicConstraintsCritical", &xc_setBasicConstraintsCritical },
4135 { "addExtension", &xc_addExtension }, 4169 { "addExtension", &xc_addExtension },
4136 { "getExtension", &xc_getExtension }, 4170 { "getExtension", &xc_getExtension },
4171 { "getExtensionCount", &xc_getExtensionCount },
4137 { "isIssuedBy", &xc_isIssuedBy }, 4172 { "isIssuedBy", &xc_isIssuedBy },
4138 { "getPublicKey", &xc_getPublicKey }, 4173 { "getPublicKey", &xc_getPublicKey },
4139 { "setPublicKey", &xc_setPublicKey }, 4174 { "setPublicKey", &xc_setPublicKey },
@@ -4618,35 +4653,51 @@ static int xx_addExtension(lua_State *L) {
4618 4653
4619static int xx_getExtension(lua_State *L) { 4654static int xx_getExtension(lua_State *L) {
4620 X509_CRL *crl = checksimple(L, 1, X509_CRL_CLASS); 4655 X509_CRL *crl = checksimple(L, 1, X509_CRL_CLASS);
4621 const char *name = luaL_checkstring(L, 2); 4656 X509_EXTENSION *ext = NULL, **ud;
4622 X509_EXTENSION *ext, **ud; 4657 int i;
4623 ASN1_OBJECT *obj = NULL;
4624 4658
4625 if (!(obj = OBJ_txt2obj(name, 0))) 4659 luaL_checkany(L, 2);
4626 goto error;
4627 4660
4628 int i = X509_CRL_get_ext_by_OBJ(crl, obj, -1); 4661 if (lua_type(L, 2) == LUA_TNUMBER) {
4629 if (i > -1) { 4662 /* NB: Lua 1-based indexing */
4630 ud = prepsimple(L, X509_CRL_CLASS); 4663 i = auxL_checkinteger(L, 2, 1, INT_MAX) - 1;
4631 if (!(ext = X509_CRL_get0_ext(crl, i)))
4632 goto error;
4633 if (!(*ud = X509_EXTENSION_dup(ext)))
4634 goto error;
4635 } else { 4664 } else {
4636 lua_pushnil(L); 4665 ASN1_OBJECT *obj;
4666
4667 if (!auxS_txt2obj(&obj, luaL_checkstring(L, 2))) {
4668 goto error;
4669 } else if (!obj) {
4670 goto undef;
4671 }
4672
4673 i = X509_CRL_get_ext_by_OBJ(crl, obj, -1);
4674
4675 ASN1_OBJECT_free(obj);
4637 } 4676 }
4638 4677
4639 ASN1_OBJECT_free(obj); 4678 ud = prepsimple(L, X509_EXT_CLASS);
4679
4680 if (i < 0 || !(ext = X509_CRL_get0_ext(crl, i)))
4681 goto undef;
4682
4683 if (!(*ud = X509_EXTENSION_dup(ext)))
4684 goto error;
4640 4685
4641 return 1; 4686 return 1;
4687undef:
4688 return 0;
4642error: 4689error:
4643 if (obj)
4644 ASN1_OBJECT_free(obj);
4645
4646 return auxL_error(L, auxL_EOPENSSL, "x509.crl:getExtension"); 4690 return auxL_error(L, auxL_EOPENSSL, "x509.crl:getExtension");
4647} /* xx_getExtension() */ 4691} /* xx_getExtension() */
4648 4692
4649 4693
4694static int xx_getExtensionCount(lua_State *L) {
4695 auxL_pushinteger(L, X509_CRL_get_ext_count(checksimple(L, 1, X509_CRL_CLASS)));
4696
4697 return 1;
4698} /* xx_getExtensionCount() */
4699
4700
4650static int xx_sign(lua_State *L) { 4701static int xx_sign(lua_State *L) {
4651 X509_CRL *crl = checksimple(L, 1, X509_CRL_CLASS); 4702 X509_CRL *crl = checksimple(L, 1, X509_CRL_CLASS);
4652 EVP_PKEY *key = checksimple(L, 2, PKEY_CLASS); 4703 EVP_PKEY *key = checksimple(L, 2, PKEY_CLASS);
@@ -4727,6 +4778,7 @@ static const luaL_Reg xx_methods[] = {
4727 { "add", &xx_add }, 4778 { "add", &xx_add },
4728 { "addExtension", &xx_addExtension }, 4779 { "addExtension", &xx_addExtension },
4729 { "getExtension", &xx_getExtension }, 4780 { "getExtension", &xx_getExtension },
4781 { "getExtensionCount", &xx_getExtensionCount },
4730 { "sign", &xx_sign }, 4782 { "sign", &xx_sign },
4731 { "text", &xx_text }, 4783 { "text", &xx_text },
4732 { "tostring", &xx__tostring }, 4784 { "tostring", &xx__tostring },