diff options
| -rw-r--r-- | src/openssl.c | 1077 |
1 files changed, 851 insertions, 226 deletions
diff --git a/src/openssl.c b/src/openssl.c index dba7c75..11d02a0 100644 --- a/src/openssl.c +++ b/src/openssl.c | |||
| @@ -148,6 +148,7 @@ | |||
| 148 | 148 | ||
| 149 | #define BIGNUM_CLASS "BIGNUM*" | 149 | #define BIGNUM_CLASS "BIGNUM*" |
| 150 | #define PKEY_CLASS "EVP_PKEY*" | 150 | #define PKEY_CLASS "EVP_PKEY*" |
| 151 | #define EC_GROUP_CLASS "EVP_GROUP*" | ||
| 151 | #define X509_NAME_CLASS "X509_NAME*" | 152 | #define X509_NAME_CLASS "X509_NAME*" |
| 152 | #define X509_GENS_CLASS "GENERAL_NAMES*" | 153 | #define X509_GENS_CLASS "GENERAL_NAMES*" |
| 153 | #define X509_EXT_CLASS "X509_EXTENSION*" | 154 | #define X509_EXT_CLASS "X509_EXTENSION*" |
| @@ -284,65 +285,30 @@ static void *testsimple(lua_State *L, int index, const char *tname) { | |||
| 284 | } /* testsimple() */ | 285 | } /* testsimple() */ |
| 285 | 286 | ||
| 286 | 287 | ||
| 287 | static int interpose(lua_State *L, const char *mt) { | 288 | static int auxL_swapmetatable(lua_State *, const char *); |
| 288 | luaL_getmetatable(L, mt); | 289 | static int auxL_swapmetasubtable(lua_State *, const char *, const char *); |
| 289 | |||
| 290 | if (!strncmp("__", luaL_checkstring(L, 1), 2)) | ||
| 291 | lua_pushvalue(L, -1); | ||
| 292 | else | ||
| 293 | lua_getfield(L, -1, "__index"); | ||
| 294 | |||
| 295 | lua_pushvalue(L, -4); /* push method name */ | ||
| 296 | lua_gettable(L, -2); /* push old method */ | ||
| 297 | |||
| 298 | lua_pushvalue(L, -5); /* push method name */ | ||
| 299 | lua_pushvalue(L, -5); /* push new method */ | ||
| 300 | lua_settable(L, -4); /* replace old method */ | ||
| 301 | 290 | ||
| 302 | return 1; /* return old method */ | 291 | static int interpose(lua_State *L, const char *mt) { |
| 303 | } /* interpose() */ | 292 | if (!strncmp("__", luaL_checkstring(L, lua_absindex(L, -2)), 2)) { |
| 304 | 293 | return auxL_swapmetatable(L, mt); | |
| 305 | 294 | } else { | |
| 306 | static void addclass(lua_State *L, const char *name, const luaL_Reg *methods, const luaL_Reg *metamethods) { | 295 | return auxL_swapmetasubtable(L, mt, "__index"); |
| 307 | if (luaL_newmetatable(L, name)) { | ||
| 308 | luaL_setfuncs(L, metamethods, 0); | ||
| 309 | lua_newtable(L); | ||
| 310 | luaL_setfuncs(L, methods, 0); | ||
| 311 | lua_setfield(L, -2, "__index"); | ||
| 312 | lua_pop(L, 1); | ||
| 313 | } | ||
| 314 | } /* addclass() */ | ||
| 315 | |||
| 316 | |||
| 317 | static int badoption(lua_State *L, int index, const char *opt) { | ||
| 318 | opt = (opt)? opt : luaL_checkstring(L, index); | ||
| 319 | |||
| 320 | return luaL_argerror(L, index, lua_pushfstring(L, "invalid option %s", opt)); | ||
| 321 | } /* badoption() */ | ||
| 322 | |||
| 323 | static int checkoption(lua_State *L, int index, const char *def, const char *const opts[]) { | ||
| 324 | const char *opt = (def)? luaL_optstring(L, index, def) : luaL_checkstring(L, index); | ||
| 325 | int i; | ||
| 326 | |||
| 327 | for (i = 0; opts[i]; i++) { | ||
| 328 | if (strieq(opts[i], opt)) | ||
| 329 | return i; | ||
| 330 | } | 296 | } |
| 297 | } /* interpose() */ | ||
| 331 | 298 | ||
| 332 | return badoption(L, index, opt); | 299 | static int auxL_checkoption(lua_State *, int, const char *, const char *const *, _Bool); |
| 333 | } /* checkoption() */ | ||
| 334 | |||
| 335 | 300 | ||
| 336 | #define X509_ANY 0x01 | 301 | #define X509_ANY 0x01 |
| 337 | #define X509_PEM 0x02 | 302 | #define X509_PEM 0x02 |
| 338 | #define X509_DER 0x04 | 303 | #define X509_DER 0x04 |
| 304 | #define X509_TXT 0x08 /* "pretty" */ | ||
| 339 | #define X509_ALL (X509_PEM|X509_DER) | 305 | #define X509_ALL (X509_PEM|X509_DER) |
| 340 | 306 | ||
| 341 | static int optencoding(lua_State *L, int index, const char *def, int allow) { | 307 | static int optencoding(lua_State *L, int index, const char *def, int allow) { |
| 342 | static const char *const opts[] = { "*", "pem", "der", NULL }; | 308 | static const char *const opts[] = { "*", "pem", "der", "pretty", NULL }; |
| 343 | int type = 0; | 309 | int type = 0; |
| 344 | 310 | ||
| 345 | switch (checkoption(L, index, def, opts)) { | 311 | switch (auxL_checkoption(L, index, def, opts, 1)) { |
| 346 | case 0: | 312 | case 0: |
| 347 | type = X509_ANY; | 313 | type = X509_ANY; |
| 348 | break; | 314 | break; |
| @@ -352,6 +318,9 @@ static int optencoding(lua_State *L, int index, const char *def, int allow) { | |||
| 352 | case 2: | 318 | case 2: |
| 353 | type = X509_DER; | 319 | type = X509_DER; |
| 354 | break; | 320 | break; |
| 321 | case 3: | ||
| 322 | type = X509_TXT; | ||
| 323 | break; | ||
| 355 | } | 324 | } |
| 356 | 325 | ||
| 357 | if (!(type & allow)) | 326 | if (!(type & allow)) |
| @@ -608,6 +577,21 @@ static _Bool auxS_txt2obj(ASN1_OBJECT **obj, const char *txt) { | |||
| 608 | } | 577 | } |
| 609 | } /* auxS_txt2obj() */ | 578 | } /* auxS_txt2obj() */ |
| 610 | 579 | ||
| 580 | static _Bool auxS_txt2nid(int *nid, const char *txt) { | ||
| 581 | /* try builtins first */ | ||
| 582 | if ((*nid = OBJ_sn2nid(txt)) != NID_undef | ||
| 583 | || (*nid = OBJ_ln2nid(txt)) != NID_undef) { | ||
| 584 | return 1; | ||
| 585 | } | ||
| 586 | |||
| 587 | /* OBJ_txt2nid creates a temporary ASN1_OBJECT; call sparingly */ | ||
| 588 | if (auxS_isoid(txt) && (*nid = OBJ_txt2nid(txt)) != NID_undef) { | ||
| 589 | return 1; | ||
| 590 | } | ||
| 591 | |||
| 592 | return 0; | ||
| 593 | } /* auxS_txt2nid() */ | ||
| 594 | |||
| 611 | 595 | ||
| 612 | /* | 596 | /* |
| 613 | * Auxiliary Lua API routines | 597 | * Auxiliary Lua API routines |
| @@ -638,6 +622,27 @@ NOTUSED static auxtype_t auxL_getref(lua_State *L, auxref_t ref) { | |||
| 638 | return lua_type(L, -1); | 622 | return lua_type(L, -1); |
| 639 | } /* auxL_getref() */ | 623 | } /* auxL_getref() */ |
| 640 | 624 | ||
| 625 | static int auxL_testoption(lua_State *L, int index, const char *def, const char *const *optlist, _Bool nocase) { | ||
| 626 | const char *optname = (def)? luaL_optstring(L, index, def) : luaL_checkstring(L, index); | ||
| 627 | int (*optcmp)() = (nocase)? &strcasecmp : &strcmp; | ||
| 628 | |||
| 629 | for (int i = 0; optlist[i]; i++) { | ||
| 630 | if (0 == optcmp(optlist[i], optname)) | ||
| 631 | return i; | ||
| 632 | } | ||
| 633 | |||
| 634 | return -1; | ||
| 635 | } /* auxL_testoption() */ | ||
| 636 | |||
| 637 | static int auxL_checkoption(lua_State *L, int index, const char *def, const char *const *optlist, _Bool nocase) { | ||
| 638 | int i; | ||
| 639 | |||
| 640 | if ((i = auxL_testoption(L, index, def, optlist, nocase)) >= 0) | ||
| 641 | return i; | ||
| 642 | |||
| 643 | return luaL_argerror(L, index, lua_pushfstring(L, "invalid option '%s'", luaL_optstring(L, index, def))); | ||
| 644 | } /* auxL_checkoption() */ | ||
| 645 | |||
| 641 | /* | 646 | /* |
| 642 | * Lua 5.3 distinguishes integers and numbers, and by default uses 64-bit | 647 | * Lua 5.3 distinguishes integers and numbers, and by default uses 64-bit |
| 643 | * integers. The following routines try to preserve this distinction and | 648 | * integers. The following routines try to preserve this distinction and |
| @@ -733,6 +738,13 @@ static auxL_Unsigned (auxL_optunsigned)(lua_State *L, int index, auxL_Unsigned d | |||
| 733 | return (lua_isnoneornil(L, index))? def : auxL_checkunsigned(L, index, min, max); | 738 | return (lua_isnoneornil(L, index))? def : auxL_checkunsigned(L, index, min, max); |
| 734 | } /* auxL_optunsigned() */ | 739 | } /* auxL_optunsigned() */ |
| 735 | 740 | ||
| 741 | static int auxL_size2int(lua_State *L, size_t n) { | ||
| 742 | if (n > INT_MAX) | ||
| 743 | luaL_error(L, "integer value out of range (%zu > INT_MAX)", n); | ||
| 744 | |||
| 745 | return (int)n; | ||
| 746 | } /* auxL_size2int() */ | ||
| 747 | |||
| 736 | typedef struct { | 748 | typedef struct { |
| 737 | const char *name; | 749 | const char *name; |
| 738 | auxL_Integer value; | 750 | auxL_Integer value; |
| @@ -745,6 +757,148 @@ static void auxL_setintegers(lua_State *L, const auxL_IntegerReg *l) { | |||
| 745 | } | 757 | } |
| 746 | } /* auxL_setintegers() */ | 758 | } /* auxL_setintegers() */ |
| 747 | 759 | ||
| 760 | #define AUXL_REG_NULL (&(auxL_Reg[]){ 0 }) | ||
| 761 | |||
| 762 | typedef struct { | ||
| 763 | const char *name; | ||
| 764 | lua_CFunction func; | ||
| 765 | unsigned nups; /* in addition to nups specified to auxL_setfuncs */ | ||
| 766 | } auxL_Reg; | ||
| 767 | |||
| 768 | static inline size_t auxL_liblen(const auxL_Reg *l) { | ||
| 769 | size_t n = 0; | ||
| 770 | |||
| 771 | while ((l++)->name) | ||
| 772 | n++; | ||
| 773 | |||
| 774 | return n; | ||
| 775 | } /* auxL_liblen() */ | ||
| 776 | |||
| 777 | #define auxL_newlibtable(L, l) \ | ||
| 778 | lua_createtable((L), 0, countof((l)) - 1) | ||
| 779 | |||
| 780 | #define auxL_newlib(L, l, nups) \ | ||
| 781 | (auxL_newlibtable((L), (l)), lua_insert((L), -(nups + 1)), auxL_setfuncs((L), (l), (nups))) | ||
| 782 | |||
| 783 | static void auxL_setfuncs(lua_State *L, const auxL_Reg *l, int nups) { | ||
| 784 | for (; l->name; l++) { | ||
| 785 | /* copy shared upvalues */ | ||
| 786 | luaL_checkstack(L, nups, "too many upvalues"); | ||
| 787 | for (int i = 0; i < nups; i++) | ||
| 788 | lua_pushvalue(L, -nups); | ||
| 789 | |||
| 790 | /* nil-fill local upvalues */ | ||
| 791 | luaL_checkstack(L, l->nups, "too many upvalues"); | ||
| 792 | lua_settop(L, lua_gettop(L) + l->nups); | ||
| 793 | |||
| 794 | /* set closure */ | ||
| 795 | luaL_checkstack(L, 1, "too many upvalues"); | ||
| 796 | lua_pushcclosure(L, l->func, nups + l->nups); | ||
| 797 | lua_setfield(L, -(nups + 2), l->name); | ||
| 798 | } | ||
| 799 | |||
| 800 | lua_pop(L, nups); | ||
| 801 | |||
| 802 | return; | ||
| 803 | } /* auxL_setfuncs() */ | ||
| 804 | |||
| 805 | static void auxL_clear(lua_State *L, int tindex) { | ||
| 806 | tindex = lua_absindex(L, tindex); | ||
| 807 | |||
| 808 | lua_pushnil(L); | ||
| 809 | while (lua_next(L, tindex)) { | ||
| 810 | lua_pop(L, 1); | ||
| 811 | lua_pushvalue(L, -1); | ||
| 812 | lua_pushnil(L); | ||
| 813 | lua_rawset(L, tindex); | ||
| 814 | } | ||
| 815 | } /* auxL_clear() */ | ||
| 816 | |||
| 817 | static _Bool auxL_newmetatable(lua_State *L, const char *name, _Bool reset) { | ||
| 818 | if (luaL_newmetatable(L, name)) | ||
| 819 | return 1; | ||
| 820 | if (!reset) | ||
| 821 | return 0; | ||
| 822 | |||
| 823 | /* | ||
| 824 | * NB: Keep existing table as it may be cached--e.g. in | ||
| 825 | * another module that isn't being reloaded. But scrub it | ||
| 826 | * clean so function interposition--which will presumably | ||
| 827 | * run again if the C module is being reloaded--doesn't | ||
| 828 | * result in loops. | ||
| 829 | */ | ||
| 830 | auxL_clear(L, -1); | ||
| 831 | lua_pushnil(L); | ||
| 832 | lua_setmetatable(L, -2); | ||
| 833 | #if LUA_VERSION_NUM >= 502 | ||
| 834 | lua_pushnil(L); | ||
| 835 | lua_setuservalue(L, -2); | ||
| 836 | #endif | ||
| 837 | |||
| 838 | return 0; | ||
| 839 | } /* auxL_newmetatable() */ | ||
| 840 | |||
| 841 | static _Bool auxL_newclass(lua_State *L, const char *name, const auxL_Reg *methods, const auxL_Reg *metamethods, _Bool reset) { | ||
| 842 | _Bool fresh = auxL_newmetatable(L, name, reset); | ||
| 843 | int n; | ||
| 844 | |||
| 845 | auxL_setfuncs(L, metamethods, 0); | ||
| 846 | |||
| 847 | if ((n = auxL_liblen(methods))) { | ||
| 848 | lua_createtable(L, 0, auxL_size2int(L, n)); | ||
| 849 | auxL_setfuncs(L, methods, 0); | ||
| 850 | lua_setfield(L, -2, "__index"); | ||
| 851 | } | ||
| 852 | |||
| 853 | return fresh; | ||
| 854 | } /* auxL_newclass() */ | ||
| 855 | |||
| 856 | #define auxL_addclass(L, ...) \ | ||
| 857 | (auxL_newclass((L), __VA_ARGS__), lua_pop((L), 1)) | ||
| 858 | |||
| 859 | static int auxL_swaptable(lua_State *L, int index) { | ||
| 860 | index = lua_absindex(L, index); | ||
| 861 | |||
| 862 | lua_pushvalue(L, -2); /* push key */ | ||
| 863 | lua_gettable(L, index); /* push old value */ | ||
| 864 | |||
| 865 | lua_pushvalue(L, -3); /* push key */ | ||
| 866 | lua_pushvalue(L, -3); /* push new value */ | ||
| 867 | lua_settable(L, index); /* replace old value */ | ||
| 868 | |||
| 869 | lua_replace(L, -3); | ||
| 870 | lua_pop(L, 1); | ||
| 871 | |||
| 872 | return 1; /* return old value */ | ||
| 873 | } /* auxL_swaptable() */ | ||
| 874 | |||
| 875 | static int auxL_swapmetatable(lua_State *L, const char *name) { | ||
| 876 | luaL_getmetatable(L, name); | ||
| 877 | |||
| 878 | lua_pushvalue(L, -3); | ||
| 879 | lua_pushvalue(L, -3); | ||
| 880 | auxL_swaptable(L, -3); | ||
| 881 | |||
| 882 | lua_replace(L, -4); | ||
| 883 | lua_pop(L, 2); | ||
| 884 | |||
| 885 | return 1; | ||
| 886 | } /* auxL_swapmetatable() */ | ||
| 887 | |||
| 888 | static int auxL_swapmetasubtable(lua_State *L, const char *name, const char *subname) { | ||
| 889 | luaL_getmetatable(L, name); | ||
| 890 | lua_getfield(L, -1, subname); | ||
| 891 | |||
| 892 | lua_pushvalue(L, -4); | ||
| 893 | lua_pushvalue(L, -4); | ||
| 894 | auxL_swaptable(L, -3); | ||
| 895 | |||
| 896 | lua_replace(L, -5); | ||
| 897 | lua_pop(L, 3); | ||
| 898 | |||
| 899 | return 1; | ||
| 900 | } /* auxL_swapmetasubtable() */ | ||
| 901 | |||
| 748 | #define auxL_EDYLD -2 | 902 | #define auxL_EDYLD -2 |
| 749 | #define auxL_EOPENSSL -1 | 903 | #define auxL_EOPENSSL -1 |
| 750 | 904 | ||
| @@ -1348,7 +1502,7 @@ static int ossl_version(lua_State *L) { | |||
| 1348 | return 1; | 1502 | return 1; |
| 1349 | } /* ossl_version() */ | 1503 | } /* ossl_version() */ |
| 1350 | 1504 | ||
| 1351 | static const luaL_Reg ossl_globals[] = { | 1505 | static const auxL_Reg ossl_globals[] = { |
| 1352 | { "version", &ossl_version }, | 1506 | { "version", &ossl_version }, |
| 1353 | { NULL, NULL }, | 1507 | { NULL, NULL }, |
| 1354 | }; | 1508 | }; |
| @@ -1520,7 +1674,7 @@ static const auxL_IntegerReg ssleay_version[] = { | |||
| 1520 | int luaopen__openssl(lua_State *L) { | 1674 | int luaopen__openssl(lua_State *L) { |
| 1521 | size_t i; | 1675 | size_t i; |
| 1522 | 1676 | ||
| 1523 | luaL_newlib(L, ossl_globals); | 1677 | auxL_newlib(L, ossl_globals, 0); |
| 1524 | 1678 | ||
| 1525 | for (i = 0; i < countof(opensslconf_no); i++) { | 1679 | for (i = 0; i < countof(opensslconf_no); i++) { |
| 1526 | if (*opensslconf_no[i]) { | 1680 | if (*opensslconf_no[i]) { |
| @@ -1577,6 +1731,11 @@ static BIGNUM *bn_dup(lua_State *L, const BIGNUM *src) { | |||
| 1577 | } /* bn_dup() */ | 1731 | } /* bn_dup() */ |
| 1578 | 1732 | ||
| 1579 | 1733 | ||
| 1734 | static BIGNUM *bn_dup_nil(lua_State *L, const BIGNUM *src) { | ||
| 1735 | return (src)? bn_dup(L, src) : (lua_pushnil(L), (BIGNUM *)0); | ||
| 1736 | } /* bn_dup_nil() */ | ||
| 1737 | |||
| 1738 | |||
| 1580 | #define checkbig_(a, b, c, ...) checkbig((a), (b), (c)) | 1739 | #define checkbig_(a, b, c, ...) checkbig((a), (b), (c)) |
| 1581 | #define checkbig(...) checkbig_(__VA_ARGS__, &(_Bool){ 0 }, 0) | 1740 | #define checkbig(...) checkbig_(__VA_ARGS__, &(_Bool){ 0 }, 0) |
| 1582 | 1741 | ||
| @@ -2010,7 +2169,7 @@ static int bn__gc(lua_State *L) { | |||
| 2010 | BIGNUM **ud = luaL_checkudata(L, 1, BIGNUM_CLASS); | 2169 | BIGNUM **ud = luaL_checkudata(L, 1, BIGNUM_CLASS); |
| 2011 | 2170 | ||
| 2012 | if (*ud) { | 2171 | if (*ud) { |
| 2013 | BN_free(*ud); | 2172 | BN_clear_free(*ud); |
| 2014 | *ud = NULL; | 2173 | *ud = NULL; |
| 2015 | } | 2174 | } |
| 2016 | 2175 | ||
| @@ -2106,7 +2265,7 @@ sslerr: | |||
| 2106 | } /* bn_tohex() */ | 2265 | } /* bn_tohex() */ |
| 2107 | 2266 | ||
| 2108 | 2267 | ||
| 2109 | static const luaL_Reg bn_methods[] = { | 2268 | static const auxL_Reg bn_methods[] = { |
| 2110 | { "add", &bn__add }, | 2269 | { "add", &bn__add }, |
| 2111 | { "sub", &bn__sub }, | 2270 | { "sub", &bn__sub }, |
| 2112 | { "mul", &bn__mul }, | 2271 | { "mul", &bn__mul }, |
| @@ -2125,7 +2284,7 @@ static const luaL_Reg bn_methods[] = { | |||
| 2125 | { NULL, NULL }, | 2284 | { NULL, NULL }, |
| 2126 | }; | 2285 | }; |
| 2127 | 2286 | ||
| 2128 | static const luaL_Reg bn_metatable[] = { | 2287 | static const auxL_Reg bn_metatable[] = { |
| 2129 | { "__add", &bn__add }, | 2288 | { "__add", &bn__add }, |
| 2130 | { "__sub", &bn__sub }, | 2289 | { "__sub", &bn__sub }, |
| 2131 | { "__mul", &bn__mul }, | 2290 | { "__mul", &bn__mul }, |
| @@ -2145,7 +2304,7 @@ static const luaL_Reg bn_metatable[] = { | |||
| 2145 | }; | 2304 | }; |
| 2146 | 2305 | ||
| 2147 | 2306 | ||
| 2148 | static const luaL_Reg bn_globals[] = { | 2307 | static const auxL_Reg bn_globals[] = { |
| 2149 | { "new", &bn_new }, | 2308 | { "new", &bn_new }, |
| 2150 | { "interpose", &bn_interpose }, | 2309 | { "interpose", &bn_interpose }, |
| 2151 | { "fromBinary", &bn_fromBinary }, | 2310 | { "fromBinary", &bn_fromBinary }, |
| @@ -2156,7 +2315,7 @@ static const luaL_Reg bn_globals[] = { | |||
| 2156 | int luaopen__openssl_bignum(lua_State *L) { | 2315 | int luaopen__openssl_bignum(lua_State *L) { |
| 2157 | initall(L); | 2316 | initall(L); |
| 2158 | 2317 | ||
| 2159 | luaL_newlib(L, bn_globals); | 2318 | auxL_newlib(L, bn_globals, 0); |
| 2160 | 2319 | ||
| 2161 | return 1; | 2320 | return 1; |
| 2162 | } /* luaopen__openssl_bignum() */ | 2321 | } /* luaopen__openssl_bignum() */ |
| @@ -2257,8 +2416,8 @@ static int pk_new(lua_State *L) { | |||
| 2257 | } | 2416 | } |
| 2258 | 2417 | ||
| 2259 | if (loadfield(L, 1, "curve", LUA_TSTRING, &id)) { | 2418 | if (loadfield(L, 1, "curve", LUA_TSTRING, &id)) { |
| 2260 | curve = OBJ_sn2nid(id); | 2419 | if (!auxS_txt2nid(&curve, id)) |
| 2261 | luaL_argcheck(L, curve != NID_undef, 1, lua_pushfstring(L, "%s: invalid curve", id)); | 2420 | luaL_argerror(L, 1, lua_pushfstring(L, "%s: invalid curve", id)); |
| 2262 | } | 2421 | } |
| 2263 | 2422 | ||
| 2264 | creat: | 2423 | creat: |
| @@ -2463,7 +2622,19 @@ done: | |||
| 2463 | 2622 | ||
| 2464 | 2623 | ||
| 2465 | static int pk_interpose(lua_State *L) { | 2624 | static int pk_interpose(lua_State *L) { |
| 2466 | return interpose(L, PKEY_CLASS); | 2625 | lua_settop(L, 2); |
| 2626 | |||
| 2627 | luaL_getmetatable(L, PKEY_CLASS); | ||
| 2628 | if (!strncmp("__", luaL_checkstring(L, 1), 2)) { | ||
| 2629 | lua_insert(L, 1); | ||
| 2630 | } else { | ||
| 2631 | lua_getfield(L, -1, "__index"); | ||
| 2632 | lua_getupvalue(L, -1, 1); | ||
| 2633 | lua_insert(L, 1); | ||
| 2634 | lua_pop(L, 2); | ||
| 2635 | } | ||
| 2636 | |||
| 2637 | return auxL_swaptable(L, 1); | ||
| 2467 | } /* pk_interpose() */ | 2638 | } /* pk_interpose() */ |
| 2468 | 2639 | ||
| 2469 | 2640 | ||
| @@ -2609,7 +2780,7 @@ static int pk_toPEM(lua_State *L) { | |||
| 2609 | NULL, | 2780 | NULL, |
| 2610 | }; | 2781 | }; |
| 2611 | 2782 | ||
| 2612 | switch (checkoption(L, i, NULL, opts)) { | 2783 | switch (auxL_checkoption(L, i, NULL, opts, 1)) { |
| 2613 | case 0: case 1: /* public, PublicKey */ | 2784 | case 0: case 1: /* public, PublicKey */ |
| 2614 | if (!PEM_write_bio_PUBKEY(bio, key)) | 2785 | if (!PEM_write_bio_PUBKEY(bio, key)) |
| 2615 | return auxL_error(L, auxL_EOPENSSL, "pkey:__tostring"); | 2786 | return auxL_error(L, auxL_EOPENSSL, "pkey:__tostring"); |
| @@ -2721,8 +2892,14 @@ enum pk_param { | |||
| 2721 | PK_DH_PUB_KEY, | 2892 | PK_DH_PUB_KEY, |
| 2722 | PK_DH_PRIV_KEY, | 2893 | PK_DH_PRIV_KEY, |
| 2723 | 2894 | ||
| 2724 | #define PK_EC_OPTLIST { "pub_key", "priv_key", NULL } | 2895 | /* |
| 2725 | #define PK_EC_OPTOFFSET PK_EC_PUB_KEY | 2896 | * NB: group MUST come before pub_key as setting pub_key requires the group |
| 2897 | * to be defined. :setParameters will do the requested assignments in the | ||
| 2898 | * order defined by this array. | ||
| 2899 | */ | ||
| 2900 | #define PK_EC_OPTLIST { "group", "pub_key", "priv_key", NULL } | ||
| 2901 | #define PK_EC_OPTOFFSET PK_EC_GROUP | ||
| 2902 | PK_EC_GROUP, | ||
| 2726 | PK_EC_PUB_KEY, | 2903 | PK_EC_PUB_KEY, |
| 2727 | PK_EC_PRIV_KEY, | 2904 | PK_EC_PRIV_KEY, |
| 2728 | }; /* enum pk_param */ | 2905 | }; /* enum pk_param */ |
| @@ -2732,22 +2909,50 @@ static const char *const pk_dsa_optlist[] = PK_DSA_OPTLIST; | |||
| 2732 | static const char *const pk_dh_optlist[] = PK_DH_OPTLIST; | 2909 | static const char *const pk_dh_optlist[] = PK_DH_OPTLIST; |
| 2733 | static const char *const pk_ec_optlist[] = PK_EC_OPTLIST; | 2910 | static const char *const pk_ec_optlist[] = PK_EC_OPTLIST; |
| 2734 | 2911 | ||
| 2735 | static int pk_checkparam(lua_State *L, int type, int index) { | 2912 | const char *const *pk_getoptlist(int type, int *_nopts, int *_optoffset) { |
| 2913 | const char *const *optlist = NULL; | ||
| 2914 | int nopts = 0, optoffset = 0; | ||
| 2915 | |||
| 2736 | switch (type) { | 2916 | switch (type) { |
| 2737 | case EVP_PKEY_RSA: | 2917 | case EVP_PKEY_RSA: |
| 2738 | return luaL_checkoption(L, index, NULL, pk_rsa_optlist) + PK_RSA_OPTOFFSET; | 2918 | optlist = pk_rsa_optlist; |
| 2919 | nopts = countof(pk_rsa_optlist) - 1; | ||
| 2920 | optoffset = PK_RSA_OPTOFFSET; | ||
| 2921 | |||
| 2922 | break; | ||
| 2739 | case EVP_PKEY_DSA: | 2923 | case EVP_PKEY_DSA: |
| 2740 | return luaL_checkoption(L, index, NULL, pk_dsa_optlist) + PK_DSA_OPTOFFSET; | 2924 | optlist = pk_dsa_optlist; |
| 2925 | nopts = countof(pk_dsa_optlist) - 1; | ||
| 2926 | optoffset = PK_DSA_OPTOFFSET; | ||
| 2927 | |||
| 2928 | break; | ||
| 2741 | case EVP_PKEY_DH: | 2929 | case EVP_PKEY_DH: |
| 2742 | return luaL_checkoption(L, index, NULL, pk_dh_optlist) + PK_DH_OPTOFFSET; | 2930 | optlist = pk_dh_optlist; |
| 2931 | nopts = countof(pk_dh_optlist) - 1; | ||
| 2932 | optoffset = PK_DH_OPTOFFSET; | ||
| 2933 | |||
| 2934 | break; | ||
| 2743 | case EVP_PKEY_EC: | 2935 | case EVP_PKEY_EC: |
| 2744 | return luaL_checkoption(L, index, NULL, pk_ec_optlist) + PK_EC_OPTOFFSET; | 2936 | optlist = pk_ec_optlist; |
| 2745 | default: | 2937 | nopts = countof(pk_ec_optlist) - 1; |
| 2746 | return luaL_error(L, "%d: unsupported EVP_PKEY base type", type); | 2938 | optoffset = PK_EC_OPTOFFSET; |
| 2939 | |||
| 2940 | break; | ||
| 2747 | } | 2941 | } |
| 2748 | } /* pk_checkparam() */ | ||
| 2749 | 2942 | ||
| 2750 | static void pk_pushparam(lua_State *L, void *_key, enum pk_param which) { | 2943 | if (_nopts) |
| 2944 | *_nopts = nopts; | ||
| 2945 | if (_optoffset) | ||
| 2946 | *_optoffset = optoffset; | ||
| 2947 | |||
| 2948 | return optlist; | ||
| 2949 | } /* pk_getoptlist() */ | ||
| 2950 | |||
| 2951 | #ifndef OPENSSL_NO_EC | ||
| 2952 | static EC_GROUP *ecg_dup_nil(lua_State *, const EC_GROUP *); | ||
| 2953 | #endif | ||
| 2954 | |||
| 2955 | static void pk_pushparam(lua_State *L, void *base_key, enum pk_param which) { | ||
| 2751 | union { | 2956 | union { |
| 2752 | RSA *rsa; | 2957 | RSA *rsa; |
| 2753 | DH *dh; | 2958 | DH *dh; |
| @@ -2755,98 +2960,104 @@ static void pk_pushparam(lua_State *L, void *_key, enum pk_param which) { | |||
| 2755 | #ifndef OPENSSL_NO_EC | 2960 | #ifndef OPENSSL_NO_EC |
| 2756 | EC_KEY *ec; | 2961 | EC_KEY *ec; |
| 2757 | #endif | 2962 | #endif |
| 2758 | } key = { _key }; | 2963 | } key = { base_key }; |
| 2759 | 2964 | ||
| 2760 | switch (which) { | 2965 | switch (which) { |
| 2761 | case PK_RSA_N: | 2966 | case PK_RSA_N: |
| 2762 | /* RSA public modulus n */ | 2967 | /* RSA public modulus n */ |
| 2763 | bn_dup(L, key.rsa->n); | 2968 | bn_dup_nil(L, key.rsa->n); |
| 2764 | 2969 | ||
| 2765 | break; | 2970 | break; |
| 2766 | case PK_RSA_E: | 2971 | case PK_RSA_E: |
| 2767 | /* RSA public exponent e */ | 2972 | /* RSA public exponent e */ |
| 2768 | bn_dup(L, key.rsa->e); | 2973 | bn_dup_nil(L, key.rsa->e); |
| 2769 | 2974 | ||
| 2770 | break; | 2975 | break; |
| 2771 | case PK_RSA_D: | 2976 | case PK_RSA_D: |
| 2772 | /* RSA secret exponent d */ | 2977 | /* RSA secret exponent d */ |
| 2773 | bn_dup(L, key.rsa->d); | 2978 | bn_dup_nil(L, key.rsa->d); |
| 2774 | 2979 | ||
| 2775 | break; | 2980 | break; |
| 2776 | case PK_RSA_P: | 2981 | case PK_RSA_P: |
| 2777 | /* RSA secret prime p */ | 2982 | /* RSA secret prime p */ |
| 2778 | bn_dup(L, key.rsa->p); | 2983 | bn_dup_nil(L, key.rsa->p); |
| 2779 | 2984 | ||
| 2780 | break; | 2985 | break; |
| 2781 | case PK_RSA_Q: | 2986 | case PK_RSA_Q: |
| 2782 | /* RSA secret prime q with p < q */ | 2987 | /* RSA secret prime q with p < q */ |
| 2783 | bn_dup(L, key.rsa->q); | 2988 | bn_dup_nil(L, key.rsa->q); |
| 2784 | 2989 | ||
| 2785 | break; | 2990 | break; |
| 2786 | case PK_RSA_DMP1: | 2991 | case PK_RSA_DMP1: |
| 2787 | /* exponent1 */ | 2992 | /* exponent1 */ |
| 2788 | bn_dup(L, key.rsa->dmp1); | 2993 | bn_dup_nil(L, key.rsa->dmp1); |
| 2789 | 2994 | ||
| 2790 | break; | 2995 | break; |
| 2791 | case PK_RSA_DMQ1: | 2996 | case PK_RSA_DMQ1: |
| 2792 | /* exponent2 */ | 2997 | /* exponent2 */ |
| 2793 | bn_dup(L, key.rsa->dmq1); | 2998 | bn_dup_nil(L, key.rsa->dmq1); |
| 2794 | 2999 | ||
| 2795 | break; | 3000 | break; |
| 2796 | case PK_RSA_IQMP: | 3001 | case PK_RSA_IQMP: |
| 2797 | /* coefficient */ | 3002 | /* coefficient */ |
| 2798 | bn_dup(L, key.rsa->iqmp); | 3003 | bn_dup_nil(L, key.rsa->iqmp); |
| 2799 | 3004 | ||
| 2800 | break; | 3005 | break; |
| 2801 | case PK_DSA_P: | 3006 | case PK_DSA_P: |
| 2802 | bn_dup(L, key.dsa->p); | 3007 | bn_dup_nil(L, key.dsa->p); |
| 2803 | 3008 | ||
| 2804 | break; | 3009 | break; |
| 2805 | case PK_DSA_Q: | 3010 | case PK_DSA_Q: |
| 2806 | bn_dup(L, key.dsa->q); | 3011 | bn_dup_nil(L, key.dsa->q); |
| 2807 | 3012 | ||
| 2808 | break; | 3013 | break; |
| 2809 | case PK_DSA_G: | 3014 | case PK_DSA_G: |
| 2810 | bn_dup(L, key.dsa->g); | 3015 | bn_dup_nil(L, key.dsa->g); |
| 2811 | 3016 | ||
| 2812 | break; | 3017 | break; |
| 2813 | case PK_DSA_PUB_KEY: | 3018 | case PK_DSA_PUB_KEY: |
| 2814 | bn_dup(L, key.dsa->pub_key); | 3019 | bn_dup_nil(L, key.dsa->pub_key); |
| 2815 | 3020 | ||
| 2816 | break; | 3021 | break; |
| 2817 | case PK_DSA_PRIV_KEY: | 3022 | case PK_DSA_PRIV_KEY: |
| 2818 | bn_dup(L, key.dsa->priv_key); | 3023 | bn_dup_nil(L, key.dsa->priv_key); |
| 2819 | 3024 | ||
| 2820 | break; | 3025 | break; |
| 2821 | case PK_DH_P: | 3026 | case PK_DH_P: |
| 2822 | bn_dup(L, key.dh->p); | 3027 | bn_dup_nil(L, key.dh->p); |
| 2823 | 3028 | ||
| 2824 | break; | 3029 | break; |
| 2825 | case PK_DH_G: | 3030 | case PK_DH_G: |
| 2826 | bn_dup(L, key.dh->g); | 3031 | bn_dup_nil(L, key.dh->g); |
| 2827 | 3032 | ||
| 2828 | break; | 3033 | break; |
| 2829 | case PK_DH_PUB_KEY: | 3034 | case PK_DH_PUB_KEY: |
| 2830 | bn_dup(L, key.dh->pub_key); | 3035 | bn_dup_nil(L, key.dh->pub_key); |
| 2831 | 3036 | ||
| 2832 | break; | 3037 | break; |
| 2833 | case PK_DH_PRIV_KEY: | 3038 | case PK_DH_PRIV_KEY: |
| 2834 | bn_dup(L, key.dh->priv_key); | 3039 | bn_dup_nil(L, key.dh->priv_key); |
| 2835 | 3040 | ||
| 2836 | break; | 3041 | break; |
| 2837 | #ifndef OPENSSL_NO_EC | 3042 | #ifndef OPENSSL_NO_EC |
| 3043 | case PK_EC_GROUP: | ||
| 3044 | ecg_dup_nil(L, EC_KEY_get0_group(key.ec)); | ||
| 3045 | |||
| 3046 | break; | ||
| 2838 | case PK_EC_PUB_KEY: { | 3047 | case PK_EC_PUB_KEY: { |
| 2839 | const EC_GROUP *group; | 3048 | const EC_GROUP *group; |
| 2840 | const EC_POINT *public_key; | 3049 | const EC_POINT *pub_key; |
| 2841 | 3050 | ||
| 2842 | if (!(group = EC_KEY_get0_group(key.ec)) || !(public_key = EC_KEY_get0_public_key(key.ec))) | 3051 | if ((group = EC_KEY_get0_group(key.ec)) && (pub_key = EC_KEY_get0_public_key(key.ec))) { |
| 2843 | goto sslerr; | 3052 | bn_dup_nil(L, EC_POINT_point2bn(group, pub_key, EC_KEY_get_conv_form(key.ec), NULL, getctx(L))); |
| 2844 | bn_dup(L, EC_POINT_point2bn(group, public_key, EC_KEY_get_conv_form(key.ec), NULL, getctx(L))); | 3053 | } else { |
| 3054 | lua_pushnil(L); | ||
| 3055 | } | ||
| 2845 | 3056 | ||
| 2846 | break; | 3057 | break; |
| 2847 | } | 3058 | } |
| 2848 | case PK_EC_PRIV_KEY: | 3059 | case PK_EC_PRIV_KEY: |
| 2849 | bn_dup(L, EC_KEY_get0_private_key(key.ec)); | 3060 | bn_dup_nil(L, EC_KEY_get0_private_key(key.ec)); |
| 2850 | 3061 | ||
| 2851 | break; | 3062 | break; |
| 2852 | #endif | 3063 | #endif |
| @@ -2855,84 +3066,204 @@ static void pk_pushparam(lua_State *L, void *_key, enum pk_param which) { | |||
| 2855 | } | 3066 | } |
| 2856 | 3067 | ||
| 2857 | return; | 3068 | return; |
| 2858 | sslerr: | ||
| 2859 | auxL_error(L, auxL_EOPENSSL, "pkey:getParameters"); | ||
| 2860 | |||
| 2861 | return; | ||
| 2862 | } /* pk_pushparam() */ | 3069 | } /* pk_pushparam() */ |
| 2863 | 3070 | ||
| 2864 | 3071 | ||
| 2865 | static int pk_getParameters(lua_State *L) { | 3072 | static _Bool pk_bn_set_nothrow(BIGNUM **dst, BIGNUM *src) { |
| 2866 | EVP_PKEY *_key = checksimple(L, 1, PKEY_CLASS); | 3073 | BIGNUM *tmp; |
| 2867 | int type = EVP_PKEY_base_id(_key); | ||
| 2868 | void *key; | ||
| 2869 | int otop, index, tindex; | ||
| 2870 | 3074 | ||
| 2871 | if (!(key = EVP_PKEY_get0(_key))) | 3075 | if (!(tmp = BN_dup(src))) |
| 2872 | goto sslerr; | 3076 | return 0; |
| 2873 | 3077 | ||
| 2874 | if (lua_isnoneornil(L, 2)) { | 3078 | if (*dst) |
| 2875 | const char *const *optlist; | 3079 | BN_clear_free(*dst); |
| 2876 | const char *const *opt; | 3080 | *dst = tmp; |
| 2877 | 3081 | ||
| 2878 | switch (type) { | 3082 | return 1; |
| 2879 | case EVP_PKEY_RSA: | 3083 | } /* pk_bn_set_nothrow() */ |
| 2880 | optlist = pk_rsa_optlist; | ||
| 2881 | luaL_checkstack(L, countof(pk_rsa_optlist), ""); | ||
| 2882 | 3084 | ||
| 2883 | break; | 3085 | #define pk_bn_set(L, dst, index) do { \ |
| 2884 | case EVP_PKEY_DSA: | 3086 | BIGNUM *n = checkbig((L), (index)); \ |
| 2885 | optlist = pk_dsa_optlist; | 3087 | if (!pk_bn_set_nothrow((dst), n)) \ |
| 2886 | luaL_checkstack(L, countof(pk_dsa_optlist), ""); | 3088 | goto sslerr; \ |
| 3089 | } while (0) | ||
| 2887 | 3090 | ||
| 2888 | break; | 3091 | static void pk_setparam(lua_State *L, void *base_key, enum pk_param which, int index) { |
| 2889 | case EVP_PKEY_DH: | 3092 | union { |
| 2890 | optlist = pk_dh_optlist; | 3093 | RSA *rsa; |
| 2891 | luaL_checkstack(L, countof(pk_dh_optlist), ""); | 3094 | DH *dh; |
| 3095 | DSA *dsa; | ||
| 3096 | #ifndef OPENSSL_NO_EC | ||
| 3097 | EC_KEY *ec; | ||
| 3098 | #endif | ||
| 3099 | } key = { base_key }; | ||
| 2892 | 3100 | ||
| 2893 | break; | 3101 | switch (which) { |
| 2894 | case EVP_PKEY_EC: | 3102 | case PK_RSA_N: |
| 2895 | optlist = pk_ec_optlist; | 3103 | pk_bn_set(L, &key.rsa->n, index); |
| 2896 | luaL_checkstack(L, countof(pk_ec_optlist), ""); | ||
| 2897 | 3104 | ||
| 2898 | break; | 3105 | break; |
| 2899 | default: | 3106 | case PK_RSA_E: |
| 2900 | return luaL_error(L, "%d: unsupported EVP_PKEY base type", EVP_PKEY_base_id(key)); | 3107 | pk_bn_set(L, &key.rsa->e, index); |
| 2901 | } | 3108 | |
| 3109 | break; | ||
| 3110 | case PK_RSA_D: | ||
| 3111 | pk_bn_set(L, &key.rsa->d, index); | ||
| 3112 | |||
| 3113 | break; | ||
| 3114 | case PK_RSA_P: | ||
| 3115 | pk_bn_set(L, &key.rsa->p, index); | ||
| 3116 | |||
| 3117 | break; | ||
| 3118 | case PK_RSA_Q: | ||
| 3119 | pk_bn_set(L, &key.rsa->q, index); | ||
| 2902 | 3120 | ||
| 3121 | break; | ||
| 3122 | case PK_RSA_DMP1: | ||
| 3123 | pk_bn_set(L, &key.rsa->dmp1, index); | ||
| 3124 | |||
| 3125 | break; | ||
| 3126 | case PK_RSA_DMQ1: | ||
| 3127 | pk_bn_set(L, &key.rsa->dmq1, index); | ||
| 3128 | |||
| 3129 | break; | ||
| 3130 | case PK_RSA_IQMP: | ||
| 3131 | pk_bn_set(L, &key.rsa->iqmp, index); | ||
| 3132 | |||
| 3133 | break; | ||
| 3134 | case PK_DSA_P: | ||
| 3135 | pk_bn_set(L, &key.dsa->p, index); | ||
| 3136 | |||
| 3137 | break; | ||
| 3138 | case PK_DSA_Q: | ||
| 3139 | pk_bn_set(L, &key.dsa->q, index); | ||
| 3140 | |||
| 3141 | break; | ||
| 3142 | case PK_DSA_G: | ||
| 3143 | pk_bn_set(L, &key.dsa->g, index); | ||
| 3144 | |||
| 3145 | break; | ||
| 3146 | case PK_DSA_PUB_KEY: | ||
| 3147 | pk_bn_set(L, &key.dsa->pub_key, index); | ||
| 3148 | |||
| 3149 | break; | ||
| 3150 | case PK_DSA_PRIV_KEY: | ||
| 3151 | pk_bn_set(L, &key.dsa->priv_key, index); | ||
| 3152 | |||
| 3153 | break; | ||
| 3154 | case PK_DH_P: | ||
| 3155 | pk_bn_set(L, &key.dh->p, index); | ||
| 3156 | |||
| 3157 | break; | ||
| 3158 | case PK_DH_G: | ||
| 3159 | pk_bn_set(L, &key.dh->g, index); | ||
| 3160 | |||
| 3161 | break; | ||
| 3162 | case PK_DH_PUB_KEY: | ||
| 3163 | pk_bn_set(L, &key.dh->pub_key, index); | ||
| 3164 | |||
| 3165 | break; | ||
| 3166 | case PK_DH_PRIV_KEY: | ||
| 3167 | pk_bn_set(L, &key.dh->priv_key, index); | ||
| 3168 | |||
| 3169 | break; | ||
| 3170 | #ifndef OPENSSL_NO_EC | ||
| 3171 | case PK_EC_GROUP: { | ||
| 3172 | const EC_GROUP *group = checksimple(L, index, EC_GROUP_CLASS); | ||
| 3173 | |||
| 3174 | if (!EC_KEY_set_group(key.ec, group)) | ||
| 3175 | goto sslerr; | ||
| 3176 | |||
| 3177 | break; | ||
| 3178 | } | ||
| 3179 | case PK_EC_PUB_KEY: { | ||
| 3180 | const BIGNUM *n = checkbig(L, index); | ||
| 3181 | const EC_GROUP *group; | ||
| 3182 | EC_POINT *pub_key; | ||
| 3183 | _Bool okay; | ||
| 3184 | |||
| 3185 | if (!(group = EC_KEY_get0_group(key.ec))) | ||
| 3186 | luaL_error(L, "unable to set EC pub_key (no group defined)"); | ||
| 3187 | |||
| 3188 | if (!(pub_key = EC_POINT_bn2point(group, n, NULL, getctx(L)))) | ||
| 3189 | goto sslerr; | ||
| 3190 | |||
| 3191 | /* NB: copies key, doesn't share or take ownership */ | ||
| 3192 | okay = EC_KEY_set_public_key(key.ec, pub_key); | ||
| 3193 | EC_POINT_free(pub_key); | ||
| 3194 | if (!okay) | ||
| 3195 | goto sslerr; | ||
| 3196 | |||
| 3197 | break; | ||
| 3198 | } | ||
| 3199 | case PK_EC_PRIV_KEY: { | ||
| 3200 | const BIGNUM *n = checkbig(L, index); | ||
| 3201 | |||
| 3202 | /* NB: copies key, doesn't share or take ownership */ | ||
| 3203 | if (!EC_KEY_set_private_key(key.ec, n)) | ||
| 3204 | goto sslerr; | ||
| 3205 | |||
| 3206 | break; | ||
| 3207 | } | ||
| 3208 | #endif | ||
| 3209 | default: | ||
| 3210 | luaL_error(L, "%d: invalid EVP_PKEY parameter", which); | ||
| 3211 | } | ||
| 3212 | |||
| 3213 | return; | ||
| 3214 | sslerr: | ||
| 3215 | auxL_error(L, auxL_EOPENSSL, "pkey:setParameters"); | ||
| 3216 | |||
| 3217 | return; | ||
| 3218 | } /* pk_setparam() */ | ||
| 3219 | |||
| 3220 | |||
| 3221 | static int pk_getParameters(lua_State *L) { | ||
| 3222 | EVP_PKEY *key = checksimple(L, 1, PKEY_CLASS); | ||
| 3223 | int base_type = EVP_PKEY_base_id(key); | ||
| 3224 | void *base_key; | ||
| 3225 | const char *const *optlist; | ||
| 3226 | int nopts, optoffset, otop, index, tindex; | ||
| 3227 | |||
| 3228 | if (!(base_key = EVP_PKEY_get0(key))) | ||
| 3229 | goto sslerr; | ||
| 3230 | |||
| 3231 | if (!(optlist = pk_getoptlist(base_type, &nopts, &optoffset))) | ||
| 3232 | return luaL_error(L, "%d: unsupported EVP_PKEY base type", base_type); | ||
| 3233 | |||
| 3234 | if (lua_isnoneornil(L, 2)) { | ||
| 2903 | /* | 3235 | /* |
| 2904 | * Use special "{" parameter to tell loop to push table. | 3236 | * Use special "{" parameter to tell loop to push table. |
| 2905 | * Subsequent parameters will be assigned as fields. | 3237 | * Subsequent parameters will be assigned as fields. |
| 2906 | * | ||
| 2907 | * NOTE: optlist arrays are NULL-terminated. luaL_checkstack() | ||
| 2908 | * calls above left room for "{". | ||
| 2909 | */ | 3238 | */ |
| 2910 | lua_pushstring(L, "{"); | 3239 | lua_pushstring(L, "{"); |
| 2911 | 3240 | luaL_checkstack(L, nopts, "too many arguments"); | |
| 2912 | for (opt = optlist; *opt; opt++) { | 3241 | for (const char *const *optname = optlist; *optname; optname++) { |
| 2913 | lua_pushstring(L, *opt); | 3242 | lua_pushstring(L, *optname); |
| 2914 | } | 3243 | } |
| 2915 | } | 3244 | } |
| 2916 | 3245 | ||
| 2917 | otop = lua_gettop(L); | 3246 | otop = lua_gettop(L); |
| 2918 | 3247 | ||
| 2919 | /* provide space for results and working area */ | 3248 | /* provide space for results and working area */ |
| 2920 | luaL_checkstack(L, (otop - 1) + LUA_MINSTACK, ""); | 3249 | luaL_checkstack(L, (otop - 1) + LUA_MINSTACK, "too many arguments"); |
| 2921 | 3250 | ||
| 2922 | /* no table index, yet */ | 3251 | /* no table index, yet */ |
| 2923 | tindex = 0; | 3252 | tindex = 0; |
| 2924 | 3253 | ||
| 2925 | for (index = 2; index <= otop; index++) { | 3254 | for (index = 2; index <= otop; index++) { |
| 2926 | const char *opt = luaL_checkstring(L, index); | 3255 | const char *optname = luaL_checkstring(L, index); |
| 3256 | int optid; | ||
| 2927 | 3257 | ||
| 2928 | if (*opt == '{') { | 3258 | if (*optname == '{') { |
| 2929 | lua_newtable(L); | 3259 | lua_newtable(L); |
| 2930 | tindex = lua_gettop(L); | 3260 | tindex = lua_gettop(L); |
| 2931 | } else { | 3261 | } else { |
| 2932 | pk_pushparam(L, key, pk_checkparam(L, type, index)); | 3262 | optid = luaL_checkoption(L, index, NULL, optlist) + optoffset; |
| 3263 | pk_pushparam(L, base_key, optid); | ||
| 2933 | 3264 | ||
| 2934 | if (tindex) { | 3265 | if (tindex) { |
| 2935 | lua_setfield(L, tindex, opt); | 3266 | lua_setfield(L, tindex, optname); |
| 2936 | } | 3267 | } |
| 2937 | } | 3268 | } |
| 2938 | } | 3269 | } |
| @@ -2943,6 +3274,34 @@ sslerr: | |||
| 2943 | } /* pk_getParameters() */ | 3274 | } /* pk_getParameters() */ |
| 2944 | 3275 | ||
| 2945 | 3276 | ||
| 3277 | static int pk_setParameters(lua_State *L) { | ||
| 3278 | EVP_PKEY *key = checksimple(L, 1, PKEY_CLASS); | ||
| 3279 | int base_type = EVP_PKEY_base_id(key); | ||
| 3280 | void *base_key; | ||
| 3281 | const char *const *optlist; | ||
| 3282 | int optindex, optoffset; | ||
| 3283 | |||
| 3284 | luaL_checktype(L, 2, LUA_TTABLE); | ||
| 3285 | |||
| 3286 | if (!(base_key = EVP_PKEY_get0(key))) | ||
| 3287 | goto sslerr; | ||
| 3288 | |||
| 3289 | if (!(optlist = pk_getoptlist(base_type, NULL, &optoffset))) | ||
| 3290 | return luaL_error(L, "%d: unsupported EVP_PKEY base type", base_type); | ||
| 3291 | |||
| 3292 | for (optindex = 0; optlist[optindex]; optindex++) { | ||
| 3293 | if (getfield(L, 2, optlist[optindex])) { | ||
| 3294 | pk_setparam(L, base_key, optindex + optoffset, -1); | ||
| 3295 | lua_pop(L, 1); | ||
| 3296 | } | ||
| 3297 | } | ||
| 3298 | |||
| 3299 | return 0; | ||
| 3300 | sslerr: | ||
| 3301 | return auxL_error(L, auxL_EOPENSSL, "pkey:setParameters"); | ||
| 3302 | } /* pk_setParameters() */ | ||
| 3303 | |||
| 3304 | |||
| 2946 | static int pk__tostring(lua_State *L) { | 3305 | static int pk__tostring(lua_State *L) { |
| 2947 | EVP_PKEY *key = checksimple(L, 1, PKEY_CLASS); | 3306 | EVP_PKEY *key = checksimple(L, 1, PKEY_CLASS); |
| 2948 | int type = optencoding(L, 2, "pem", X509_PEM|X509_DER); | 3307 | int type = optencoding(L, 2, "pem", X509_PEM|X509_DER); |
| @@ -2969,6 +3328,55 @@ static int pk__tostring(lua_State *L) { | |||
| 2969 | } /* pk__tostring() */ | 3328 | } /* pk__tostring() */ |
| 2970 | 3329 | ||
| 2971 | 3330 | ||
| 3331 | static int pk__index(lua_State *L) { | ||
| 3332 | EVP_PKEY *key = checksimple(L, 1, PKEY_CLASS); | ||
| 3333 | void *base_key; | ||
| 3334 | const char *const *optlist; | ||
| 3335 | int optoffset, listoffset; | ||
| 3336 | |||
| 3337 | lua_pushvalue(L, lua_upvalueindex(1)); | ||
| 3338 | lua_pushvalue(L, 2); | ||
| 3339 | lua_gettable(L, -2); | ||
| 3340 | |||
| 3341 | if (!lua_isnil(L, -1)) | ||
| 3342 | return 1; | ||
| 3343 | |||
| 3344 | if (!lua_isstring(L, 2)) | ||
| 3345 | return 0; | ||
| 3346 | if (!(base_key = EVP_PKEY_get0(key))) | ||
| 3347 | return 0; | ||
| 3348 | if (!(optlist = pk_getoptlist(EVP_PKEY_base_id(key), NULL, &optoffset))) | ||
| 3349 | return 0; | ||
| 3350 | if (-1 == (listoffset = auxL_testoption(L, 2, NULL, optlist, 0))) | ||
| 3351 | return 0; | ||
| 3352 | |||
| 3353 | pk_pushparam(L, base_key, listoffset + optoffset); | ||
| 3354 | |||
| 3355 | return 1; | ||
| 3356 | } /* pk__index() */ | ||
| 3357 | |||
| 3358 | |||
| 3359 | static int pk__newindex(lua_State *L) { | ||
| 3360 | EVP_PKEY *key = checksimple(L, 1, PKEY_CLASS); | ||
| 3361 | void *base_key; | ||
| 3362 | const char *const *optlist; | ||
| 3363 | int optoffset, listoffset; | ||
| 3364 | |||
| 3365 | if (!lua_isstring(L, 2)) | ||
| 3366 | return 0; | ||
| 3367 | if (!(base_key = EVP_PKEY_get0(key))) | ||
| 3368 | return 0; | ||
| 3369 | if (!(optlist = pk_getoptlist(EVP_PKEY_base_id(key), NULL, &optoffset))) | ||
| 3370 | return 0; | ||
| 3371 | if (-1 == (listoffset = auxL_testoption(L, 2, NULL, optlist, 0))) | ||
| 3372 | return 0; | ||
| 3373 | |||
| 3374 | pk_setparam(L, base_key, listoffset + optoffset, 3); | ||
| 3375 | |||
| 3376 | return 0; | ||
| 3377 | } /* pk__newindex() */ | ||
| 3378 | |||
| 3379 | |||
| 2972 | static int pk__gc(lua_State *L) { | 3380 | static int pk__gc(lua_State *L) { |
| 2973 | EVP_PKEY **ud = luaL_checkudata(L, 1, PKEY_CLASS); | 3381 | EVP_PKEY **ud = luaL_checkudata(L, 1, PKEY_CLASS); |
| 2974 | 3382 | ||
| @@ -2981,7 +3389,7 @@ static int pk__gc(lua_State *L) { | |||
| 2981 | } /* pk__gc() */ | 3389 | } /* pk__gc() */ |
| 2982 | 3390 | ||
| 2983 | 3391 | ||
| 2984 | static const luaL_Reg pk_methods[] = { | 3392 | static const auxL_Reg pk_methods[] = { |
| 2985 | { "type", &pk_type }, | 3393 | { "type", &pk_type }, |
| 2986 | { "setPublicKey", &pk_setPublicKey }, | 3394 | { "setPublicKey", &pk_setPublicKey }, |
| 2987 | { "setPrivateKey", &pk_setPrivateKey }, | 3395 | { "setPrivateKey", &pk_setPrivateKey }, |
| @@ -2989,26 +3397,42 @@ static const luaL_Reg pk_methods[] = { | |||
| 2989 | { "verify", &pk_verify }, | 3397 | { "verify", &pk_verify }, |
| 2990 | { "toPEM", &pk_toPEM }, | 3398 | { "toPEM", &pk_toPEM }, |
| 2991 | { "getParameters", &pk_getParameters }, | 3399 | { "getParameters", &pk_getParameters }, |
| 3400 | { "setParameters", &pk_setParameters }, | ||
| 2992 | { NULL, NULL }, | 3401 | { NULL, NULL }, |
| 2993 | }; | 3402 | }; |
| 2994 | 3403 | ||
| 2995 | static const luaL_Reg pk_metatable[] = { | 3404 | static const auxL_Reg pk_metatable[] = { |
| 2996 | { "__tostring", &pk__tostring }, | 3405 | { "__tostring", &pk__tostring }, |
| 3406 | { "__index", &pk__index, 1 }, | ||
| 3407 | { "__newindex", &pk__newindex, 1 }, | ||
| 2997 | { "__gc", &pk__gc }, | 3408 | { "__gc", &pk__gc }, |
| 2998 | { NULL, NULL }, | 3409 | { NULL, NULL }, |
| 2999 | }; | 3410 | }; |
| 3000 | 3411 | ||
| 3001 | 3412 | ||
| 3002 | static const luaL_Reg pk_globals[] = { | 3413 | static const auxL_Reg pk_globals[] = { |
| 3003 | { "new", &pk_new }, | 3414 | { "new", &pk_new }, |
| 3004 | { "interpose", &pk_interpose }, | 3415 | { "interpose", &pk_interpose }, |
| 3005 | { NULL, NULL }, | 3416 | { NULL, NULL }, |
| 3006 | }; | 3417 | }; |
| 3007 | 3418 | ||
| 3419 | static void pk_luainit(lua_State *L, _Bool reset) { | ||
| 3420 | if (!auxL_newmetatable(L, PKEY_CLASS, reset)) | ||
| 3421 | return; | ||
| 3422 | auxL_setfuncs(L, pk_metatable, 0); | ||
| 3423 | auxL_newlib(L, pk_methods, 0); | ||
| 3424 | for (char **k = (char *[]){ "__index", "__newindex", 0 }; *k; k++) { | ||
| 3425 | lua_getfield(L, -2, *k); /* closure */ | ||
| 3426 | lua_pushvalue(L, -2); /* method table */ | ||
| 3427 | lua_setupvalue(L, -2, 1); | ||
| 3428 | } | ||
| 3429 | lua_pop(L, 2); | ||
| 3430 | } /* pk_luainit() */ | ||
| 3431 | |||
| 3008 | int luaopen__openssl_pkey(lua_State *L) { | 3432 | int luaopen__openssl_pkey(lua_State *L) { |
| 3009 | initall(L); | 3433 | initall(L); |
| 3010 | 3434 | ||
| 3011 | luaL_newlib(L, pk_globals); | 3435 | auxL_newlib(L, pk_globals, 0); |
| 3012 | 3436 | ||
| 3013 | return 1; | 3437 | return 1; |
| 3014 | } /* luaopen__openssl_pkey() */ | 3438 | } /* luaopen__openssl_pkey() */ |
| @@ -3023,6 +3447,205 @@ int luaopen__openssl_pubkey(lua_State *L) { | |||
| 3023 | 3447 | ||
| 3024 | 3448 | ||
| 3025 | /* | 3449 | /* |
| 3450 | * EC_GROUP - openssl.ec.group | ||
| 3451 | * | ||
| 3452 | * NOTE: Ensure copy-by-value semantics when passing EC_GROUP objects as it | ||
| 3453 | * doesn't support reference counting. The only persistent reference should | ||
| 3454 | * be the Lua userdata value. | ||
| 3455 | * | ||
| 3456 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | ||
| 3457 | |||
| 3458 | #ifndef OPENSSL_NO_EC | ||
| 3459 | |||
| 3460 | static EC_GROUP *ecg_dup(lua_State *L, const EC_GROUP *src) { | ||
| 3461 | EC_GROUP **ud = prepsimple(L, EC_GROUP_CLASS); | ||
| 3462 | |||
| 3463 | if (!(*ud = EC_GROUP_dup(src))) | ||
| 3464 | auxL_error(L, auxL_EOPENSSL, "group"); | ||
| 3465 | |||
| 3466 | return *ud; | ||
| 3467 | } /* ecg_dup() */ | ||
| 3468 | |||
| 3469 | static EC_GROUP *ecg_dup_nil(lua_State *L, const EC_GROUP *src) { | ||
| 3470 | return (src)? ecg_dup(L, src) : (lua_pushnil(L), (EC_GROUP *)0); | ||
| 3471 | } /* ecg_dup_nil() */ | ||
| 3472 | |||
| 3473 | static EC_GROUP *ecg_new_by_nid(int nid) { | ||
| 3474 | EC_GROUP *group; | ||
| 3475 | |||
| 3476 | if (!(group = EC_GROUP_new_by_curve_name(nid))) | ||
| 3477 | return NULL; | ||
| 3478 | |||
| 3479 | /* flag as named for benefit of __tostring */ | ||
| 3480 | EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE); | ||
| 3481 | |||
| 3482 | /* compressed points may be patented */ | ||
| 3483 | EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_UNCOMPRESSED); | ||
| 3484 | |||
| 3485 | return group; | ||
| 3486 | } /* ecg_new_by_nid() */ | ||
| 3487 | |||
| 3488 | static EC_GROUP *ecg_push_by_nid(lua_State *L, int nid) { | ||
| 3489 | EC_GROUP **group = prepsimple(L, EC_GROUP_CLASS); | ||
| 3490 | |||
| 3491 | if (!(*group = EC_GROUP_new_by_curve_name(nid))) | ||
| 3492 | goto oops; | ||
| 3493 | |||
| 3494 | EC_GROUP_set_asn1_flag(*group, OPENSSL_EC_NAMED_CURVE); | ||
| 3495 | |||
| 3496 | /* compressed points may be patented */ | ||
| 3497 | EC_GROUP_set_point_conversion_form(*group, POINT_CONVERSION_UNCOMPRESSED); | ||
| 3498 | |||
| 3499 | return *group; | ||
| 3500 | oops: | ||
| 3501 | lua_pop(L, 1); | ||
| 3502 | |||
| 3503 | return NULL; | ||
| 3504 | } /* ecg_push_by_nid() */ | ||
| 3505 | |||
| 3506 | static int ecg_new(lua_State *L) { | ||
| 3507 | switch (lua_type(L, 1)) { | ||
| 3508 | case LUA_TSTRING: { | ||
| 3509 | const char *data; | ||
| 3510 | size_t datalen; | ||
| 3511 | int nid, type, goterr; | ||
| 3512 | BIO *bio; | ||
| 3513 | EC_GROUP **group; | ||
| 3514 | |||
| 3515 | data = luaL_checklstring(L, 1, &datalen); | ||
| 3516 | |||
| 3517 | if (auxS_txt2nid(&nid, data)) { | ||
| 3518 | if (!ecg_push_by_nid(L, nid)) | ||
| 3519 | goto sslerr; | ||
| 3520 | } else { | ||
| 3521 | type = optencoding(L, 2, "*", X509_ANY|X509_PEM|X509_DER); | ||
| 3522 | group = prepsimple(L, EC_GROUP_CLASS); | ||
| 3523 | |||
| 3524 | luaL_argcheck(L, datalen < INT_MAX, 1, "string too long"); | ||
| 3525 | if (!(bio = BIO_new_mem_buf((void *)data, datalen))) | ||
| 3526 | return auxL_error(L, auxL_EOPENSSL, "group.new"); | ||
| 3527 | |||
| 3528 | goterr = 0; | ||
| 3529 | |||
| 3530 | if (type == X509_PEM || type == X509_ANY) { | ||
| 3531 | goterr |= !(*group = PEM_read_bio_ECPKParameters(bio, NULL, 0, "")); | ||
| 3532 | } | ||
| 3533 | |||
| 3534 | if (!*group && (type == X509_DER || type == X509_ANY)) { | ||
| 3535 | BIO_reset(bio); | ||
| 3536 | goterr |= !(*group = d2i_ECPKParameters_bio(bio, NULL)); | ||
| 3537 | } | ||
| 3538 | |||
| 3539 | BIO_free(bio); | ||
| 3540 | |||
| 3541 | if (!*group) | ||
| 3542 | return auxL_error(L, auxL_EOPENSSL, "group.new"); | ||
| 3543 | if (goterr) | ||
| 3544 | ERR_clear_error(); | ||
| 3545 | } | ||
| 3546 | |||
| 3547 | return 1; | ||
| 3548 | } | ||
| 3549 | case LUA_TNUMBER: { | ||
| 3550 | int nid = luaL_checkint(L, 2); | ||
| 3551 | |||
| 3552 | if (!ecg_push_by_nid(L, nid)) | ||
| 3553 | goto sslerr; | ||
| 3554 | |||
| 3555 | return 1; | ||
| 3556 | } | ||
| 3557 | default: | ||
| 3558 | return luaL_error(L, "%s: unknown group initializer", lua_typename(L, lua_type(L, 1))); | ||
| 3559 | } /* switch() */ | ||
| 3560 | |||
| 3561 | return 0; | ||
| 3562 | sslerr: | ||
| 3563 | return auxL_error(L, auxL_EOPENSSL, "group.new"); | ||
| 3564 | } /* ecg_new() */ | ||
| 3565 | |||
| 3566 | static int ecg_interpose(lua_State *L) { | ||
| 3567 | return interpose(L, EC_GROUP_CLASS); | ||
| 3568 | } /* ecg_interpose() */ | ||
| 3569 | |||
| 3570 | static int ecg_tostring(lua_State *L) { | ||
| 3571 | EC_GROUP *group = checksimple(L, 1, EC_GROUP_CLASS); | ||
| 3572 | int how = optencoding(L, 2, "pem", X509_PEM|X509_DER|X509_TXT); | ||
| 3573 | BIO *bio = getbio(L); | ||
| 3574 | char *bytes; | ||
| 3575 | int len, indent; | ||
| 3576 | |||
| 3577 | switch (how) { | ||
| 3578 | case X509_PEM: | ||
| 3579 | if (!PEM_write_bio_ECPKParameters(bio, group)) | ||
| 3580 | goto sslerr; | ||
| 3581 | break; | ||
| 3582 | case X509_DER: | ||
| 3583 | if (!i2d_ECPKParameters_bio(bio, group)) | ||
| 3584 | goto sslerr; | ||
| 3585 | break; | ||
| 3586 | case X509_TXT: | ||
| 3587 | indent = auxL_optinteger(L, 3, 0, 0, INT_MAX); | ||
| 3588 | if (!ECPKParameters_print(bio, group, indent)) | ||
| 3589 | goto sslerr; | ||
| 3590 | break; | ||
| 3591 | } | ||
| 3592 | |||
| 3593 | len = BIO_get_mem_data(bio, &bytes); | ||
| 3594 | lua_pushlstring(L, bytes, len); | ||
| 3595 | |||
| 3596 | return 1; | ||
| 3597 | sslerr: | ||
| 3598 | return auxL_error(L, auxL_EOPENSSL, "group:__tostring"); | ||
| 3599 | } /* ecg_tostring() */ | ||
| 3600 | |||
| 3601 | static int ecg__tostring(lua_State *L) { | ||
| 3602 | return ecg_tostring(L); | ||
| 3603 | } /* ecg__tostring() */ | ||
| 3604 | |||
| 3605 | static int ecg__gc(lua_State *L) { | ||
| 3606 | EC_GROUP **ud = luaL_checkudata(L, 1, EC_GROUP_CLASS); | ||
| 3607 | |||
| 3608 | if (*ud) { | ||
| 3609 | EC_GROUP_clear_free(*ud); | ||
| 3610 | *ud = NULL; | ||
| 3611 | } | ||
| 3612 | |||
| 3613 | return 0; | ||
| 3614 | } /* ecg__gc() */ | ||
| 3615 | |||
| 3616 | static const auxL_Reg ecg_methods[] = { | ||
| 3617 | { "tostring", &ecg_tostring }, | ||
| 3618 | { NULL, NULL }, | ||
| 3619 | }; | ||
| 3620 | |||
| 3621 | static const auxL_Reg ecg_metatable[] = { | ||
| 3622 | { "__tostring", &ecg__tostring }, | ||
| 3623 | { "__gc", &ecg__gc }, | ||
| 3624 | { NULL, NULL }, | ||
| 3625 | }; | ||
| 3626 | |||
| 3627 | static const auxL_Reg ecg_globals[] = { | ||
| 3628 | { "new", &ecg_new }, | ||
| 3629 | { "interpose", &ecg_interpose }, | ||
| 3630 | { NULL, NULL }, | ||
| 3631 | }; | ||
| 3632 | |||
| 3633 | #endif /* OPENSSL_NO_EC */ | ||
| 3634 | |||
| 3635 | int luaopen__openssl_ec_group(lua_State *L) { | ||
| 3636 | #ifndef OPENSSL_NO_EC | ||
| 3637 | initall(L); | ||
| 3638 | |||
| 3639 | auxL_newlib(L, ecg_globals, 0); | ||
| 3640 | |||
| 3641 | return 1; | ||
| 3642 | #else | ||
| 3643 | return 0; | ||
| 3644 | #endif | ||
| 3645 | } /* luaopen__openssl_ec_group() */ | ||
| 3646 | |||
| 3647 | |||
| 3648 | /* | ||
| 3026 | * X509_NAME - openssl.x509.name | 3649 | * X509_NAME - openssl.x509.name |
| 3027 | * | 3650 | * |
| 3028 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | 3651 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ |
| @@ -3196,13 +3819,13 @@ static int xn__tostring(lua_State *L) { | |||
| 3196 | } /* xn__tostring() */ | 3819 | } /* xn__tostring() */ |
| 3197 | 3820 | ||
| 3198 | 3821 | ||
| 3199 | static const luaL_Reg xn_methods[] = { | 3822 | static const auxL_Reg xn_methods[] = { |
| 3200 | { "add", &xn_add }, | 3823 | { "add", &xn_add }, |
| 3201 | { "all", &xn_all }, | 3824 | { "all", &xn_all }, |
| 3202 | { NULL, NULL }, | 3825 | { NULL, NULL }, |
| 3203 | }; | 3826 | }; |
| 3204 | 3827 | ||
| 3205 | static const luaL_Reg xn_metatable[] = { | 3828 | static const auxL_Reg xn_metatable[] = { |
| 3206 | { "__pairs", &xn__pairs }, | 3829 | { "__pairs", &xn__pairs }, |
| 3207 | { "__gc", &xn__gc }, | 3830 | { "__gc", &xn__gc }, |
| 3208 | { "__tostring", &xn__tostring }, | 3831 | { "__tostring", &xn__tostring }, |
| @@ -3210,7 +3833,7 @@ static const luaL_Reg xn_metatable[] = { | |||
| 3210 | }; | 3833 | }; |
| 3211 | 3834 | ||
| 3212 | 3835 | ||
| 3213 | static const luaL_Reg xn_globals[] = { | 3836 | static const auxL_Reg xn_globals[] = { |
| 3214 | { "new", &xn_new }, | 3837 | { "new", &xn_new }, |
| 3215 | { "interpose", &xn_interpose }, | 3838 | { "interpose", &xn_interpose }, |
| 3216 | { NULL, NULL }, | 3839 | { NULL, NULL }, |
| @@ -3219,7 +3842,7 @@ static const luaL_Reg xn_globals[] = { | |||
| 3219 | int luaopen__openssl_x509_name(lua_State *L) { | 3842 | int luaopen__openssl_x509_name(lua_State *L) { |
| 3220 | initall(L); | 3843 | initall(L); |
| 3221 | 3844 | ||
| 3222 | luaL_newlib(L, xn_globals); | 3845 | auxL_newlib(L, xn_globals, 0); |
| 3223 | 3846 | ||
| 3224 | return 1; | 3847 | return 1; |
| 3225 | } /* luaopen__openssl_x509_name() */ | 3848 | } /* luaopen__openssl_x509_name() */ |
| @@ -3452,19 +4075,19 @@ static int gn__gc(lua_State *L) { | |||
| 3452 | } /* gn__gc() */ | 4075 | } /* gn__gc() */ |
| 3453 | 4076 | ||
| 3454 | 4077 | ||
| 3455 | static const luaL_Reg gn_methods[] = { | 4078 | static const auxL_Reg gn_methods[] = { |
| 3456 | { "add", &gn_add }, | 4079 | { "add", &gn_add }, |
| 3457 | { NULL, NULL }, | 4080 | { NULL, NULL }, |
| 3458 | }; | 4081 | }; |
| 3459 | 4082 | ||
| 3460 | static const luaL_Reg gn_metatable[] = { | 4083 | static const auxL_Reg gn_metatable[] = { |
| 3461 | { "__pairs", &gn__pairs }, | 4084 | { "__pairs", &gn__pairs }, |
| 3462 | { "__gc", &gn__gc }, | 4085 | { "__gc", &gn__gc }, |
| 3463 | { NULL, NULL }, | 4086 | { NULL, NULL }, |
| 3464 | }; | 4087 | }; |
| 3465 | 4088 | ||
| 3466 | 4089 | ||
| 3467 | static const luaL_Reg gn_globals[] = { | 4090 | static const auxL_Reg gn_globals[] = { |
| 3468 | { "new", &gn_new }, | 4091 | { "new", &gn_new }, |
| 3469 | { "interpose", &gn_interpose }, | 4092 | { "interpose", &gn_interpose }, |
| 3470 | { NULL, NULL }, | 4093 | { NULL, NULL }, |
| @@ -3473,7 +4096,7 @@ static const luaL_Reg gn_globals[] = { | |||
| 3473 | int luaopen__openssl_x509_altname(lua_State *L) { | 4096 | int luaopen__openssl_x509_altname(lua_State *L) { |
| 3474 | initall(L); | 4097 | initall(L); |
| 3475 | 4098 | ||
| 3476 | luaL_newlib(L, gn_globals); | 4099 | auxL_newlib(L, gn_globals, 0); |
| 3477 | 4100 | ||
| 3478 | return 1; | 4101 | return 1; |
| 3479 | } /* luaopen__openssl_x509_altname() */ | 4102 | } /* luaopen__openssl_x509_altname() */ |
| @@ -3676,7 +4299,7 @@ static int xe__gc(lua_State *L) { | |||
| 3676 | } /* xe__gc() */ | 4299 | } /* xe__gc() */ |
| 3677 | 4300 | ||
| 3678 | 4301 | ||
| 3679 | static const luaL_Reg xe_methods[] = { | 4302 | static const auxL_Reg xe_methods[] = { |
| 3680 | { "getID", &xe_getID }, | 4303 | { "getID", &xe_getID }, |
| 3681 | { "getName", &xe_getName }, | 4304 | { "getName", &xe_getName }, |
| 3682 | { "getShortName", &xe_getShortName }, | 4305 | { "getShortName", &xe_getShortName }, |
| @@ -3687,13 +4310,13 @@ static const luaL_Reg xe_methods[] = { | |||
| 3687 | { NULL, NULL }, | 4310 | { NULL, NULL }, |
| 3688 | }; | 4311 | }; |
| 3689 | 4312 | ||
| 3690 | static const luaL_Reg xe_metatable[] = { | 4313 | static const auxL_Reg xe_metatable[] = { |
| 3691 | { "__gc", &xe__gc }, | 4314 | { "__gc", &xe__gc }, |
| 3692 | { NULL, NULL }, | 4315 | { NULL, NULL }, |
| 3693 | }; | 4316 | }; |
| 3694 | 4317 | ||
| 3695 | 4318 | ||
| 3696 | static const luaL_Reg xe_globals[] = { | 4319 | static const auxL_Reg xe_globals[] = { |
| 3697 | { "new", &xe_new }, | 4320 | { "new", &xe_new }, |
| 3698 | { "interpose", &xe_interpose }, | 4321 | { "interpose", &xe_interpose }, |
| 3699 | { NULL, NULL }, | 4322 | { NULL, NULL }, |
| @@ -3710,7 +4333,7 @@ static const auxL_IntegerReg xe_textopts[] = { | |||
| 3710 | int luaopen__openssl_x509_extension(lua_State *L) { | 4333 | int luaopen__openssl_x509_extension(lua_State *L) { |
| 3711 | initall(L); | 4334 | initall(L); |
| 3712 | 4335 | ||
| 3713 | luaL_newlib(L, xe_globals); | 4336 | auxL_newlib(L, xe_globals, 0); |
| 3714 | auxL_setintegers(L, xe_textopts); | 4337 | auxL_setintegers(L, xe_textopts); |
| 3715 | 4338 | ||
| 3716 | return 1; | 4339 | return 1; |
| @@ -4282,7 +4905,7 @@ static int xc_getBasicConstraint(lua_State *L) { | |||
| 4282 | int n = 0, i, top; | 4905 | int n = 0, i, top; |
| 4283 | 4906 | ||
| 4284 | for (i = 2, top = lua_gettop(L); i <= top; i++) { | 4907 | for (i = 2, top = lua_gettop(L); i <= top; i++) { |
| 4285 | switch (checkoption(L, i, 0, (const char *[]){ "CA", "pathLen", "pathLenConstraint", NULL })) { | 4908 | switch (auxL_checkoption(L, i, 0, (const char *[]){ "CA", "pathLen", "pathLenConstraint", NULL }, 1)) { |
| 4286 | case 0: | 4909 | case 0: |
| 4287 | lua_pushboolean(L, CA); | 4910 | lua_pushboolean(L, CA); |
| 4288 | n++; | 4911 | n++; |
| @@ -4338,7 +4961,7 @@ static int xc_setBasicConstraint(lua_State *L) { | |||
| 4338 | } else { | 4961 | } else { |
| 4339 | lua_settop(L, 3); | 4962 | lua_settop(L, 3); |
| 4340 | 4963 | ||
| 4341 | switch (checkoption(L, 2, 0, (const char *[]){ "CA", "pathLen", "pathLenConstraint", NULL })) { | 4964 | switch (auxL_checkoption(L, 2, 0, (const char *[]){ "CA", "pathLen", "pathLenConstraint", NULL }, 1)) { |
| 4342 | case 0: | 4965 | case 0: |
| 4343 | luaL_checktype(L, 3, LUA_TBOOLEAN); | 4966 | luaL_checktype(L, 3, LUA_TBOOLEAN); |
| 4344 | CA = lua_toboolean(L, 3); | 4967 | CA = lua_toboolean(L, 3); |
| @@ -4679,7 +5302,7 @@ static int xc__gc(lua_State *L) { | |||
| 4679 | } /* xc__gc() */ | 5302 | } /* xc__gc() */ |
| 4680 | 5303 | ||
| 4681 | 5304 | ||
| 4682 | static const luaL_Reg xc_methods[] = { | 5305 | static const auxL_Reg xc_methods[] = { |
| 4683 | { "getVersion", &xc_getVersion }, | 5306 | { "getVersion", &xc_getVersion }, |
| 4684 | { "setVersion", &xc_setVersion }, | 5307 | { "setVersion", &xc_setVersion }, |
| 4685 | { "getSerial", &xc_getSerial }, | 5308 | { "getSerial", &xc_getSerial }, |
| @@ -4718,14 +5341,14 @@ static const luaL_Reg xc_methods[] = { | |||
| 4718 | { NULL, NULL }, | 5341 | { NULL, NULL }, |
| 4719 | }; | 5342 | }; |
| 4720 | 5343 | ||
| 4721 | static const luaL_Reg xc_metatable[] = { | 5344 | static const auxL_Reg xc_metatable[] = { |
| 4722 | { "__tostring", &xc__tostring }, | 5345 | { "__tostring", &xc__tostring }, |
| 4723 | { "__gc", &xc__gc }, | 5346 | { "__gc", &xc__gc }, |
| 4724 | { NULL, NULL }, | 5347 | { NULL, NULL }, |
| 4725 | }; | 5348 | }; |
| 4726 | 5349 | ||
| 4727 | 5350 | ||
| 4728 | static const luaL_Reg xc_globals[] = { | 5351 | static const auxL_Reg xc_globals[] = { |
| 4729 | { "new", &xc_new }, | 5352 | { "new", &xc_new }, |
| 4730 | { "interpose", &xc_interpose }, | 5353 | { "interpose", &xc_interpose }, |
| 4731 | { NULL, NULL }, | 5354 | { NULL, NULL }, |
| @@ -4734,7 +5357,7 @@ static const luaL_Reg xc_globals[] = { | |||
| 4734 | int luaopen__openssl_x509_cert(lua_State *L) { | 5357 | int luaopen__openssl_x509_cert(lua_State *L) { |
| 4735 | initall(L); | 5358 | initall(L); |
| 4736 | 5359 | ||
| 4737 | luaL_newlib(L, xc_globals); | 5360 | auxL_newlib(L, xc_globals, 0); |
| 4738 | 5361 | ||
| 4739 | return 1; | 5362 | return 1; |
| 4740 | } /* luaopen__openssl_x509_cert() */ | 5363 | } /* luaopen__openssl_x509_cert() */ |
| @@ -4914,7 +5537,7 @@ static int xr__gc(lua_State *L) { | |||
| 4914 | return 0; | 5537 | return 0; |
| 4915 | } /* xr__gc() */ | 5538 | } /* xr__gc() */ |
| 4916 | 5539 | ||
| 4917 | static const luaL_Reg xr_methods[] = { | 5540 | static const auxL_Reg xr_methods[] = { |
| 4918 | { "getVersion", &xr_getVersion }, | 5541 | { "getVersion", &xr_getVersion }, |
| 4919 | { "setVersion", &xr_setVersion }, | 5542 | { "setVersion", &xr_setVersion }, |
| 4920 | { "getSubject", &xr_getSubject }, | 5543 | { "getSubject", &xr_getSubject }, |
| @@ -4926,14 +5549,14 @@ static const luaL_Reg xr_methods[] = { | |||
| 4926 | { NULL, NULL }, | 5549 | { NULL, NULL }, |
| 4927 | }; | 5550 | }; |
| 4928 | 5551 | ||
| 4929 | static const luaL_Reg xr_metatable[] = { | 5552 | static const auxL_Reg xr_metatable[] = { |
| 4930 | { "__tostring", &xr__tostring }, | 5553 | { "__tostring", &xr__tostring }, |
| 4931 | { "__gc", &xr__gc }, | 5554 | { "__gc", &xr__gc }, |
| 4932 | { NULL, NULL }, | 5555 | { NULL, NULL }, |
| 4933 | }; | 5556 | }; |
| 4934 | 5557 | ||
| 4935 | 5558 | ||
| 4936 | static const luaL_Reg xr_globals[] = { | 5559 | static const auxL_Reg xr_globals[] = { |
| 4937 | { "new", &xr_new }, | 5560 | { "new", &xr_new }, |
| 4938 | { "interpose", &xr_interpose }, | 5561 | { "interpose", &xr_interpose }, |
| 4939 | { NULL, NULL }, | 5562 | { NULL, NULL }, |
| @@ -4942,7 +5565,7 @@ static const luaL_Reg xr_globals[] = { | |||
| 4942 | int luaopen__openssl_x509_csr(lua_State *L) { | 5565 | int luaopen__openssl_x509_csr(lua_State *L) { |
| 4943 | initall(L); | 5566 | initall(L); |
| 4944 | 5567 | ||
| 4945 | luaL_newlib(L, xr_globals); | 5568 | auxL_newlib(L, xr_globals, 0); |
| 4946 | 5569 | ||
| 4947 | return 1; | 5570 | return 1; |
| 4948 | } /* luaopen__openssl_x509_csr() */ | 5571 | } /* luaopen__openssl_x509_csr() */ |
| @@ -5305,7 +5928,7 @@ static int xx__gc(lua_State *L) { | |||
| 5305 | return 0; | 5928 | return 0; |
| 5306 | } /* xx__gc() */ | 5929 | } /* xx__gc() */ |
| 5307 | 5930 | ||
| 5308 | static const luaL_Reg xx_methods[] = { | 5931 | static const auxL_Reg xx_methods[] = { |
| 5309 | { "getVersion", &xx_getVersion }, | 5932 | { "getVersion", &xx_getVersion }, |
| 5310 | { "setVersion", &xx_setVersion }, | 5933 | { "setVersion", &xx_setVersion }, |
| 5311 | { "getLastUpdate", &xx_getLastUpdate }, | 5934 | { "getLastUpdate", &xx_getLastUpdate }, |
| @@ -5324,14 +5947,14 @@ static const luaL_Reg xx_methods[] = { | |||
| 5324 | { NULL, NULL }, | 5947 | { NULL, NULL }, |
| 5325 | }; | 5948 | }; |
| 5326 | 5949 | ||
| 5327 | static const luaL_Reg xx_metatable[] = { | 5950 | static const auxL_Reg xx_metatable[] = { |
| 5328 | { "__tostring", &xx__tostring }, | 5951 | { "__tostring", &xx__tostring }, |
| 5329 | { "__gc", &xx__gc }, | 5952 | { "__gc", &xx__gc }, |
| 5330 | { NULL, NULL }, | 5953 | { NULL, NULL }, |
| 5331 | }; | 5954 | }; |
| 5332 | 5955 | ||
| 5333 | 5956 | ||
| 5334 | static const luaL_Reg xx_globals[] = { | 5957 | static const auxL_Reg xx_globals[] = { |
| 5335 | { "new", &xx_new }, | 5958 | { "new", &xx_new }, |
| 5336 | { "interpose", &xx_interpose }, | 5959 | { "interpose", &xx_interpose }, |
| 5337 | { NULL, NULL }, | 5960 | { NULL, NULL }, |
| @@ -5340,7 +5963,7 @@ static const luaL_Reg xx_globals[] = { | |||
| 5340 | int luaopen__openssl_x509_crl(lua_State *L) { | 5963 | int luaopen__openssl_x509_crl(lua_State *L) { |
| 5341 | initall(L); | 5964 | initall(L); |
| 5342 | 5965 | ||
| 5343 | luaL_newlib(L, xx_globals); | 5966 | auxL_newlib(L, xx_globals, 0); |
| 5344 | 5967 | ||
| 5345 | return 1; | 5968 | return 1; |
| 5346 | } /* luaopen__openssl_x509_crl() */ | 5969 | } /* luaopen__openssl_x509_crl() */ |
| @@ -5477,19 +6100,19 @@ static int xl__gc(lua_State *L) { | |||
| 5477 | } /* xl__gc() */ | 6100 | } /* xl__gc() */ |
| 5478 | 6101 | ||
| 5479 | 6102 | ||
| 5480 | static const luaL_Reg xl_methods[] = { | 6103 | static const auxL_Reg xl_methods[] = { |
| 5481 | { "add", &xl_add }, | 6104 | { "add", &xl_add }, |
| 5482 | { NULL, NULL }, | 6105 | { NULL, NULL }, |
| 5483 | }; | 6106 | }; |
| 5484 | 6107 | ||
| 5485 | static const luaL_Reg xl_metatable[] = { | 6108 | static const auxL_Reg xl_metatable[] = { |
| 5486 | { "__pairs", &xl__pairs }, | 6109 | { "__pairs", &xl__pairs }, |
| 5487 | { "__ipairs", &xl__pairs }, | 6110 | { "__ipairs", &xl__pairs }, |
| 5488 | { "__gc", &xl__gc }, | 6111 | { "__gc", &xl__gc }, |
| 5489 | { NULL, NULL }, | 6112 | { NULL, NULL }, |
| 5490 | }; | 6113 | }; |
| 5491 | 6114 | ||
| 5492 | static const luaL_Reg xl_globals[] = { | 6115 | static const auxL_Reg xl_globals[] = { |
| 5493 | { "new", &xl_new }, | 6116 | { "new", &xl_new }, |
| 5494 | { "interpose", &xl_interpose }, | 6117 | { "interpose", &xl_interpose }, |
| 5495 | { NULL, NULL }, | 6118 | { NULL, NULL }, |
| @@ -5498,7 +6121,7 @@ static const luaL_Reg xl_globals[] = { | |||
| 5498 | int luaopen__openssl_x509_chain(lua_State *L) { | 6121 | int luaopen__openssl_x509_chain(lua_State *L) { |
| 5499 | initall(L); | 6122 | initall(L); |
| 5500 | 6123 | ||
| 5501 | luaL_newlib(L, xl_globals); | 6124 | auxL_newlib(L, xl_globals, 0); |
| 5502 | 6125 | ||
| 5503 | return 1; | 6126 | return 1; |
| 5504 | } /* luaopen__openssl_x509_chain() */ | 6127 | } /* luaopen__openssl_x509_chain() */ |
| @@ -5642,18 +6265,18 @@ static int xs__gc(lua_State *L) { | |||
| 5642 | } /* xs__gc() */ | 6265 | } /* xs__gc() */ |
| 5643 | 6266 | ||
| 5644 | 6267 | ||
| 5645 | static const luaL_Reg xs_methods[] = { | 6268 | static const auxL_Reg xs_methods[] = { |
| 5646 | { "add", &xs_add }, | 6269 | { "add", &xs_add }, |
| 5647 | { "verify", &xs_verify }, | 6270 | { "verify", &xs_verify }, |
| 5648 | { NULL, NULL }, | 6271 | { NULL, NULL }, |
| 5649 | }; | 6272 | }; |
| 5650 | 6273 | ||
| 5651 | static const luaL_Reg xs_metatable[] = { | 6274 | static const auxL_Reg xs_metatable[] = { |
| 5652 | { "__gc", &xs__gc }, | 6275 | { "__gc", &xs__gc }, |
| 5653 | { NULL, NULL }, | 6276 | { NULL, NULL }, |
| 5654 | }; | 6277 | }; |
| 5655 | 6278 | ||
| 5656 | static const luaL_Reg xs_globals[] = { | 6279 | static const auxL_Reg xs_globals[] = { |
| 5657 | { "new", &xs_new }, | 6280 | { "new", &xs_new }, |
| 5658 | { "interpose", &xs_interpose }, | 6281 | { "interpose", &xs_interpose }, |
| 5659 | { NULL, NULL }, | 6282 | { NULL, NULL }, |
| @@ -5662,7 +6285,7 @@ static const luaL_Reg xs_globals[] = { | |||
| 5662 | int luaopen__openssl_x509_store(lua_State *L) { | 6285 | int luaopen__openssl_x509_store(lua_State *L) { |
| 5663 | initall(L); | 6286 | initall(L); |
| 5664 | 6287 | ||
| 5665 | luaL_newlib(L, xs_globals); | 6288 | auxL_newlib(L, xs_globals, 0); |
| 5666 | 6289 | ||
| 5667 | return 1; | 6290 | return 1; |
| 5668 | } /* luaopen__openssl_x509_store() */ | 6291 | } /* luaopen__openssl_x509_store() */ |
| @@ -5713,17 +6336,17 @@ static int stx__gc(lua_State *L) { | |||
| 5713 | } /* stx__gc() */ | 6336 | } /* stx__gc() */ |
| 5714 | 6337 | ||
| 5715 | 6338 | ||
| 5716 | static const luaL_Reg stx_methods[] = { | 6339 | static const auxL_Reg stx_methods[] = { |
| 5717 | { "add", &stx_add }, | 6340 | { "add", &stx_add }, |
| 5718 | { NULL, NULL }, | 6341 | { NULL, NULL }, |
| 5719 | }; | 6342 | }; |
| 5720 | 6343 | ||
| 5721 | static const luaL_Reg stx_metatable[] = { | 6344 | static const auxL_Reg stx_metatable[] = { |
| 5722 | { "__gc", &stx__gc }, | 6345 | { "__gc", &stx__gc }, |
| 5723 | { NULL, NULL }, | 6346 | { NULL, NULL }, |
| 5724 | }; | 6347 | }; |
| 5725 | 6348 | ||
| 5726 | static const luaL_Reg stx_globals[] = { | 6349 | static const auxL_Reg stx_globals[] = { |
| 5727 | { "new", &stx_new }, | 6350 | { "new", &stx_new }, |
| 5728 | { "interpose", &stx_interpose }, | 6351 | { "interpose", &stx_interpose }, |
| 5729 | { NULL, NULL }, | 6352 | { NULL, NULL }, |
| @@ -5732,7 +6355,7 @@ static const luaL_Reg stx_globals[] = { | |||
| 5732 | int luaopen__openssl_x509_store_context(lua_State *L) { | 6355 | int luaopen__openssl_x509_store_context(lua_State *L) { |
| 5733 | initall(L); | 6356 | initall(L); |
| 5734 | 6357 | ||
| 5735 | luaL_newlib(L, stx_globals); | 6358 | auxL_newlib(L, stx_globals, 0); |
| 5736 | 6359 | ||
| 5737 | return 1; | 6360 | return 1; |
| 5738 | } /* luaopen__openssl_x509_store_context() */ | 6361 | } /* luaopen__openssl_x509_store_context() */ |
| @@ -5833,18 +6456,18 @@ static int p12__gc(lua_State *L) { | |||
| 5833 | } /* p12__gc() */ | 6456 | } /* p12__gc() */ |
| 5834 | 6457 | ||
| 5835 | 6458 | ||
| 5836 | static const luaL_Reg p12_methods[] = { | 6459 | static const auxL_Reg p12_methods[] = { |
| 5837 | { "tostring", &p12__tostring }, | 6460 | { "tostring", &p12__tostring }, |
| 5838 | { NULL, NULL }, | 6461 | { NULL, NULL }, |
| 5839 | }; | 6462 | }; |
| 5840 | 6463 | ||
| 5841 | static const luaL_Reg p12_metatable[] = { | 6464 | static const auxL_Reg p12_metatable[] = { |
| 5842 | { "__tostring", &p12__tostring }, | 6465 | { "__tostring", &p12__tostring }, |
| 5843 | { "__gc", &p12__gc }, | 6466 | { "__gc", &p12__gc }, |
| 5844 | { NULL, NULL }, | 6467 | { NULL, NULL }, |
| 5845 | }; | 6468 | }; |
| 5846 | 6469 | ||
| 5847 | static const luaL_Reg p12_globals[] = { | 6470 | static const auxL_Reg p12_globals[] = { |
| 5848 | { "new", &p12_new }, | 6471 | { "new", &p12_new }, |
| 5849 | { "interpose", &p12_interpose }, | 6472 | { "interpose", &p12_interpose }, |
| 5850 | { NULL, NULL }, | 6473 | { NULL, NULL }, |
| @@ -5853,7 +6476,7 @@ static const luaL_Reg p12_globals[] = { | |||
| 5853 | int luaopen__openssl_pkcs12(lua_State *L) { | 6476 | int luaopen__openssl_pkcs12(lua_State *L) { |
| 5854 | initall(L); | 6477 | initall(L); |
| 5855 | 6478 | ||
| 5856 | luaL_newlib(L, p12_globals); | 6479 | auxL_newlib(L, p12_globals, 0); |
| 5857 | 6480 | ||
| 5858 | return 1; | 6481 | return 1; |
| 5859 | } /* luaopen__openssl_pkcs12() */ | 6482 | } /* luaopen__openssl_pkcs12() */ |
| @@ -5893,7 +6516,7 @@ static int sx_new(lua_State *L) { | |||
| 5893 | lua_settop(L, 2); | 6516 | lua_settop(L, 2); |
| 5894 | srv = lua_toboolean(L, 2); | 6517 | srv = lua_toboolean(L, 2); |
| 5895 | 6518 | ||
| 5896 | switch (checkoption(L, 1, "TLS", opts)) { | 6519 | switch (auxL_checkoption(L, 1, "TLS", opts, 1)) { |
| 5897 | case 0: /* SSL */ | 6520 | case 0: /* SSL */ |
| 5898 | method = (srv)? &SSLv23_server_method : &SSLv23_client_method; | 6521 | method = (srv)? &SSLv23_server_method : &SSLv23_client_method; |
| 5899 | options = SSL_OP_NO_SSLv2; | 6522 | options = SSL_OP_NO_SSLv2; |
| @@ -5949,7 +6572,7 @@ static int sx_new(lua_State *L) { | |||
| 5949 | break; | 6572 | break; |
| 5950 | #endif | 6573 | #endif |
| 5951 | default: | 6574 | default: |
| 5952 | return badoption(L, 1, NULL); | 6575 | return luaL_argerror(L, 1, "invalid option"); |
| 5953 | } | 6576 | } |
| 5954 | 6577 | ||
| 5955 | ud = prepsimple(L, SSL_CTX_CLASS); | 6578 | ud = prepsimple(L, SSL_CTX_CLASS); |
| @@ -6270,7 +6893,7 @@ static int sx__gc(lua_State *L) { | |||
| 6270 | } /* sx__gc() */ | 6893 | } /* sx__gc() */ |
| 6271 | 6894 | ||
| 6272 | 6895 | ||
| 6273 | static const luaL_Reg sx_methods[] = { | 6896 | static const auxL_Reg sx_methods[] = { |
| 6274 | { "setOptions", &sx_setOptions }, | 6897 | { "setOptions", &sx_setOptions }, |
| 6275 | { "getOptions", &sx_getOptions }, | 6898 | { "getOptions", &sx_getOptions }, |
| 6276 | { "clearOptions", &sx_clearOptions }, | 6899 | { "clearOptions", &sx_clearOptions }, |
| @@ -6290,12 +6913,12 @@ static const luaL_Reg sx_methods[] = { | |||
| 6290 | { NULL, NULL }, | 6913 | { NULL, NULL }, |
| 6291 | }; | 6914 | }; |
| 6292 | 6915 | ||
| 6293 | static const luaL_Reg sx_metatable[] = { | 6916 | static const auxL_Reg sx_metatable[] = { |
| 6294 | { "__gc", &sx__gc }, | 6917 | { "__gc", &sx__gc }, |
| 6295 | { NULL, NULL }, | 6918 | { NULL, NULL }, |
| 6296 | }; | 6919 | }; |
| 6297 | 6920 | ||
| 6298 | static const luaL_Reg sx_globals[] = { | 6921 | static const auxL_Reg sx_globals[] = { |
| 6299 | { "new", &sx_new }, | 6922 | { "new", &sx_new }, |
| 6300 | { "interpose", &sx_interpose }, | 6923 | { "interpose", &sx_interpose }, |
| 6301 | { NULL, NULL }, | 6924 | { NULL, NULL }, |
| @@ -6358,7 +6981,7 @@ static const auxL_IntegerReg sx_option[] = { | |||
| 6358 | int luaopen__openssl_ssl_context(lua_State *L) { | 6981 | int luaopen__openssl_ssl_context(lua_State *L) { |
| 6359 | initall(L); | 6982 | initall(L); |
| 6360 | 6983 | ||
| 6361 | luaL_newlib(L, sx_globals); | 6984 | auxL_newlib(L, sx_globals, 0); |
| 6362 | auxL_setintegers(L, sx_verify); | 6985 | auxL_setintegers(L, sx_verify); |
| 6363 | auxL_setintegers(L, sx_option); | 6986 | auxL_setintegers(L, sx_option); |
| 6364 | 6987 | ||
| @@ -6604,7 +7227,7 @@ static int ssl__gc(lua_State *L) { | |||
| 6604 | } /* ssl__gc() */ | 7227 | } /* ssl__gc() */ |
| 6605 | 7228 | ||
| 6606 | 7229 | ||
| 6607 | static const luaL_Reg ssl_methods[] = { | 7230 | static const auxL_Reg ssl_methods[] = { |
| 6608 | { "setOptions", &ssl_setOptions }, | 7231 | { "setOptions", &ssl_setOptions }, |
| 6609 | { "getOptions", &ssl_getOptions }, | 7232 | { "getOptions", &ssl_getOptions }, |
| 6610 | { "clearOptions", &ssl_clearOptions }, | 7233 | { "clearOptions", &ssl_clearOptions }, |
| @@ -6624,12 +7247,12 @@ static const luaL_Reg ssl_methods[] = { | |||
| 6624 | { NULL, NULL }, | 7247 | { NULL, NULL }, |
| 6625 | }; | 7248 | }; |
| 6626 | 7249 | ||
| 6627 | static const luaL_Reg ssl_metatable[] = { | 7250 | static const auxL_Reg ssl_metatable[] = { |
| 6628 | { "__gc", &ssl__gc }, | 7251 | { "__gc", &ssl__gc }, |
| 6629 | { NULL, NULL }, | 7252 | { NULL, NULL }, |
| 6630 | }; | 7253 | }; |
| 6631 | 7254 | ||
| 6632 | static const luaL_Reg ssl_globals[] = { | 7255 | static const auxL_Reg ssl_globals[] = { |
| 6633 | { "new", &ssl_new }, | 7256 | { "new", &ssl_new }, |
| 6634 | { "interpose", &ssl_interpose }, | 7257 | { "interpose", &ssl_interpose }, |
| 6635 | { NULL, NULL }, | 7258 | { NULL, NULL }, |
| @@ -6652,7 +7275,7 @@ static const auxL_IntegerReg ssl_version[] = { | |||
| 6652 | int luaopen__openssl_ssl(lua_State *L) { | 7275 | int luaopen__openssl_ssl(lua_State *L) { |
| 6653 | initall(L); | 7276 | initall(L); |
| 6654 | 7277 | ||
| 6655 | luaL_newlib(L, ssl_globals); | 7278 | auxL_newlib(L, ssl_globals, 0); |
| 6656 | auxL_setintegers(L, ssl_version); | 7279 | auxL_setintegers(L, ssl_version); |
| 6657 | auxL_setintegers(L, sx_verify); | 7280 | auxL_setintegers(L, sx_verify); |
| 6658 | auxL_setintegers(L, sx_option); | 7281 | auxL_setintegers(L, sx_option); |
| @@ -6748,18 +7371,18 @@ static int md__gc(lua_State *L) { | |||
| 6748 | } /* md__gc() */ | 7371 | } /* md__gc() */ |
| 6749 | 7372 | ||
| 6750 | 7373 | ||
| 6751 | static const luaL_Reg md_methods[] = { | 7374 | static const auxL_Reg md_methods[] = { |
| 6752 | { "update", &md_update }, | 7375 | { "update", &md_update }, |
| 6753 | { "final", &md_final }, | 7376 | { "final", &md_final }, |
| 6754 | { NULL, NULL }, | 7377 | { NULL, NULL }, |
| 6755 | }; | 7378 | }; |
| 6756 | 7379 | ||
| 6757 | static const luaL_Reg md_metatable[] = { | 7380 | static const auxL_Reg md_metatable[] = { |
| 6758 | { "__gc", &md__gc }, | 7381 | { "__gc", &md__gc }, |
| 6759 | { NULL, NULL }, | 7382 | { NULL, NULL }, |
| 6760 | }; | 7383 | }; |
| 6761 | 7384 | ||
| 6762 | static const luaL_Reg md_globals[] = { | 7385 | static const auxL_Reg md_globals[] = { |
| 6763 | { "new", &md_new }, | 7386 | { "new", &md_new }, |
| 6764 | { "interpose", &md_interpose }, | 7387 | { "interpose", &md_interpose }, |
| 6765 | { NULL, NULL }, | 7388 | { NULL, NULL }, |
| @@ -6768,7 +7391,7 @@ static const luaL_Reg md_globals[] = { | |||
| 6768 | int luaopen__openssl_digest(lua_State *L) { | 7391 | int luaopen__openssl_digest(lua_State *L) { |
| 6769 | initall(L); | 7392 | initall(L); |
| 6770 | 7393 | ||
| 6771 | luaL_newlib(L, md_globals); | 7394 | auxL_newlib(L, md_globals, 0); |
| 6772 | 7395 | ||
| 6773 | return 1; | 7396 | return 1; |
| 6774 | } /* luaopen__openssl_digest() */ | 7397 | } /* luaopen__openssl_digest() */ |
| @@ -6850,18 +7473,18 @@ static int hmac__gc(lua_State *L) { | |||
| 6850 | } /* hmac__gc() */ | 7473 | } /* hmac__gc() */ |
| 6851 | 7474 | ||
| 6852 | 7475 | ||
| 6853 | static const luaL_Reg hmac_methods[] = { | 7476 | static const auxL_Reg hmac_methods[] = { |
| 6854 | { "update", &hmac_update }, | 7477 | { "update", &hmac_update }, |
| 6855 | { "final", &hmac_final }, | 7478 | { "final", &hmac_final }, |
| 6856 | { NULL, NULL }, | 7479 | { NULL, NULL }, |
| 6857 | }; | 7480 | }; |
| 6858 | 7481 | ||
| 6859 | static const luaL_Reg hmac_metatable[] = { | 7482 | static const auxL_Reg hmac_metatable[] = { |
| 6860 | { "__gc", &hmac__gc }, | 7483 | { "__gc", &hmac__gc }, |
| 6861 | { NULL, NULL }, | 7484 | { NULL, NULL }, |
| 6862 | }; | 7485 | }; |
| 6863 | 7486 | ||
| 6864 | static const luaL_Reg hmac_globals[] = { | 7487 | static const auxL_Reg hmac_globals[] = { |
| 6865 | { "new", &hmac_new }, | 7488 | { "new", &hmac_new }, |
| 6866 | { "interpose", &hmac_interpose }, | 7489 | { "interpose", &hmac_interpose }, |
| 6867 | { NULL, NULL }, | 7490 | { NULL, NULL }, |
| @@ -6870,7 +7493,7 @@ static const luaL_Reg hmac_globals[] = { | |||
| 6870 | int luaopen__openssl_hmac(lua_State *L) { | 7493 | int luaopen__openssl_hmac(lua_State *L) { |
| 6871 | initall(L); | 7494 | initall(L); |
| 6872 | 7495 | ||
| 6873 | luaL_newlib(L, hmac_globals); | 7496 | auxL_newlib(L, hmac_globals, 0); |
| 6874 | 7497 | ||
| 6875 | return 1; | 7498 | return 1; |
| 6876 | } /* luaopen__openssl_hmac() */ | 7499 | } /* luaopen__openssl_hmac() */ |
| @@ -7051,7 +7674,7 @@ static int cipher__gc(lua_State *L) { | |||
| 7051 | } /* cipher__gc() */ | 7674 | } /* cipher__gc() */ |
| 7052 | 7675 | ||
| 7053 | 7676 | ||
| 7054 | static const luaL_Reg cipher_methods[] = { | 7677 | static const auxL_Reg cipher_methods[] = { |
| 7055 | { "encrypt", &cipher_encrypt }, | 7678 | { "encrypt", &cipher_encrypt }, |
| 7056 | { "decrypt", &cipher_decrypt }, | 7679 | { "decrypt", &cipher_decrypt }, |
| 7057 | { "update", &cipher_update }, | 7680 | { "update", &cipher_update }, |
| @@ -7059,12 +7682,12 @@ static const luaL_Reg cipher_methods[] = { | |||
| 7059 | { NULL, NULL }, | 7682 | { NULL, NULL }, |
| 7060 | }; | 7683 | }; |
| 7061 | 7684 | ||
| 7062 | static const luaL_Reg cipher_metatable[] = { | 7685 | static const auxL_Reg cipher_metatable[] = { |
| 7063 | { "__gc", &cipher__gc }, | 7686 | { "__gc", &cipher__gc }, |
| 7064 | { NULL, NULL }, | 7687 | { NULL, NULL }, |
| 7065 | }; | 7688 | }; |
| 7066 | 7689 | ||
| 7067 | static const luaL_Reg cipher_globals[] = { | 7690 | static const auxL_Reg cipher_globals[] = { |
| 7068 | { "new", &cipher_new }, | 7691 | { "new", &cipher_new }, |
| 7069 | { "interpose", &cipher_interpose }, | 7692 | { "interpose", &cipher_interpose }, |
| 7070 | { NULL, NULL }, | 7693 | { NULL, NULL }, |
| @@ -7073,7 +7696,7 @@ static const luaL_Reg cipher_globals[] = { | |||
| 7073 | int luaopen__openssl_cipher(lua_State *L) { | 7696 | int luaopen__openssl_cipher(lua_State *L) { |
| 7074 | initall(L); | 7697 | initall(L); |
| 7075 | 7698 | ||
| 7076 | luaL_newlib(L, cipher_globals); | 7699 | auxL_newlib(L, cipher_globals, 0); |
| 7077 | 7700 | ||
| 7078 | return 1; | 7701 | return 1; |
| 7079 | } /* luaopen__openssl_cipher() */ | 7702 | } /* luaopen__openssl_cipher() */ |
| @@ -7402,7 +8025,7 @@ static int rand_uniform(lua_State *L) { | |||
| 7402 | } /* rand_uniform() */ | 8025 | } /* rand_uniform() */ |
| 7403 | 8026 | ||
| 7404 | 8027 | ||
| 7405 | static const luaL_Reg rand_globals[] = { | 8028 | static const auxL_Reg rand_globals[] = { |
| 7406 | { "stir", &rand_stir }, | 8029 | { "stir", &rand_stir }, |
| 7407 | { "add", &rand_add }, | 8030 | { "add", &rand_add }, |
| 7408 | { "bytes", &rand_bytes }, | 8031 | { "bytes", &rand_bytes }, |
| @@ -7416,10 +8039,9 @@ int luaopen__openssl_rand(lua_State *L) { | |||
| 7416 | 8039 | ||
| 7417 | initall(L); | 8040 | initall(L); |
| 7418 | 8041 | ||
| 7419 | luaL_newlibtable(L, rand_globals); | ||
| 7420 | st = lua_newuserdata(L, sizeof *st); | 8042 | st = lua_newuserdata(L, sizeof *st); |
| 7421 | memset(st, 0, sizeof *st); | 8043 | memset(st, 0, sizeof *st); |
| 7422 | luaL_setfuncs(L, rand_globals, 1); | 8044 | auxL_newlib(L, rand_globals, 1); |
| 7423 | 8045 | ||
| 7424 | return 1; | 8046 | return 1; |
| 7425 | } /* luaopen__openssl_rand() */ | 8047 | } /* luaopen__openssl_rand() */ |
| @@ -7454,7 +8076,7 @@ static int de5_set_odd_parity(lua_State *L) { | |||
| 7454 | return 1; | 8076 | return 1; |
| 7455 | } /* de5_set_odd_parity() */ | 8077 | } /* de5_set_odd_parity() */ |
| 7456 | 8078 | ||
| 7457 | static const luaL_Reg des_globals[] = { | 8079 | static const auxL_Reg des_globals[] = { |
| 7458 | { "string_to_key", &de5_string_to_key }, | 8080 | { "string_to_key", &de5_string_to_key }, |
| 7459 | { "set_odd_parity", &de5_set_odd_parity }, | 8081 | { "set_odd_parity", &de5_set_odd_parity }, |
| 7460 | { NULL, NULL }, | 8082 | { NULL, NULL }, |
| @@ -7463,7 +8085,7 @@ static const luaL_Reg des_globals[] = { | |||
| 7463 | int luaopen__openssl_des(lua_State *L) { | 8085 | int luaopen__openssl_des(lua_State *L) { |
| 7464 | initall(L); | 8086 | initall(L); |
| 7465 | 8087 | ||
| 7466 | luaL_newlib(L, des_globals); | 8088 | auxL_newlib(L, des_globals, 0); |
| 7467 | 8089 | ||
| 7468 | return 1; | 8090 | return 1; |
| 7469 | } /* luaopen__openssl_des() */ | 8091 | } /* luaopen__openssl_des() */ |
| @@ -7608,21 +8230,24 @@ static void initall(lua_State *L) { | |||
| 7608 | 8230 | ||
| 7609 | ex_newstate(L); | 8231 | ex_newstate(L); |
| 7610 | 8232 | ||
| 7611 | addclass(L, BIGNUM_CLASS, bn_methods, bn_metatable); | 8233 | auxL_addclass(L, BIGNUM_CLASS, bn_methods, bn_metatable, 0); |
| 7612 | addclass(L, PKEY_CLASS, pk_methods, pk_metatable); | 8234 | pk_luainit(L, 0); |
| 7613 | addclass(L, X509_NAME_CLASS, xn_methods, xn_metatable); | 8235 | #ifndef OPENSSL_NO_EC |
| 7614 | addclass(L, X509_GENS_CLASS, gn_methods, gn_metatable); | 8236 | auxL_addclass(L, EC_GROUP_CLASS, ecg_methods, ecg_metatable, 0); |
| 7615 | addclass(L, X509_EXT_CLASS, xe_methods, xe_metatable); | 8237 | #endif |
| 7616 | addclass(L, X509_CERT_CLASS, xc_methods, xc_metatable); | 8238 | auxL_addclass(L, X509_NAME_CLASS, xn_methods, xn_metatable, 0); |
| 7617 | addclass(L, X509_CSR_CLASS, xr_methods, xr_metatable); | 8239 | auxL_addclass(L, X509_GENS_CLASS, gn_methods, gn_metatable, 0); |
| 7618 | addclass(L, X509_CRL_CLASS, xx_methods, xx_metatable); | 8240 | auxL_addclass(L, X509_EXT_CLASS, xe_methods, xe_metatable, 0); |
| 7619 | addclass(L, X509_CHAIN_CLASS, xl_methods, xl_metatable); | 8241 | auxL_addclass(L, X509_CERT_CLASS, xc_methods, xc_metatable, 0); |
| 7620 | addclass(L, X509_STORE_CLASS, xs_methods, xs_metatable); | 8242 | auxL_addclass(L, X509_CSR_CLASS, xr_methods, xr_metatable, 0); |
| 7621 | addclass(L, PKCS12_CLASS, p12_methods, p12_metatable); | 8243 | auxL_addclass(L, X509_CRL_CLASS, xx_methods, xx_metatable, 0); |
| 7622 | addclass(L, SSL_CTX_CLASS, sx_methods, sx_metatable); | 8244 | auxL_addclass(L, X509_CHAIN_CLASS, xl_methods, xl_metatable, 0); |
| 7623 | addclass(L, SSL_CLASS, ssl_methods, ssl_metatable); | 8245 | auxL_addclass(L, X509_STORE_CLASS, xs_methods, xs_metatable, 0); |
| 7624 | addclass(L, DIGEST_CLASS, md_methods, md_metatable); | 8246 | auxL_addclass(L, PKCS12_CLASS, p12_methods, p12_metatable, 0); |
| 7625 | addclass(L, HMAC_CLASS, hmac_methods, hmac_metatable); | 8247 | auxL_addclass(L, SSL_CTX_CLASS, sx_methods, sx_metatable, 0); |
| 7626 | addclass(L, CIPHER_CLASS, cipher_methods, cipher_metatable); | 8248 | auxL_addclass(L, SSL_CLASS, ssl_methods, ssl_metatable, 0); |
| 8249 | auxL_addclass(L, DIGEST_CLASS, md_methods, md_metatable, 0); | ||
| 8250 | auxL_addclass(L, HMAC_CLASS, hmac_methods, hmac_metatable, 0); | ||
| 8251 | auxL_addclass(L, CIPHER_CLASS, cipher_methods, cipher_metatable, 0); | ||
| 7627 | } /* initall() */ | 8252 | } /* initall() */ |
| 7628 | 8253 | ||
