From 07e298a09b20f24d7a1efede41c04f398bb1022a Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Sun, 2 Sep 2018 14:44:46 +0300 Subject: [PATCH 07/10] pkey.new: accept option table --- src/openssl.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/openssl.c b/src/openssl.c index cb38f2f..2aaa5d8 100644 --- a/src/openssl.c +++ b/src/openssl.c @@ -4073,7 +4073,7 @@ static BIO *getbio(lua_State *L) { static int pk_new(lua_State *L) { EVP_PKEY **ud; - /* #1 table or key; if key, #2 format and #3 type */ + /* #1 table or key; if key, #2 option table or format; if format, #3 type */ lua_settop(L, 3); if (lua_istable(L, 1) || lua_isnil(L, 1)) { @@ -4307,7 +4307,7 @@ static int pk_new(lua_State *L) { #endif } /* switch() */ } else if (lua_isstring(L, 1)) { - int format = optencoding(L, 2, "*", X509_ANY|X509_PEM|X509_DER); + int format; int pubonly = 0, prvtonly = 0; const char *type, *data; size_t len; @@ -4315,14 +4315,21 @@ static int pk_new(lua_State *L) { EVP_PKEY *pub = NULL, *prvt = NULL; int goterr = 0; + if (lua_istable(L, 2)) { + lua_getfield(L, 2, "format"); + lua_getfield(L, 2, "type"); + } + + format = optencoding(L, -2, "*", X509_ANY|X509_PEM|X509_DER); + /* check if specified publickey or privatekey */ - if ((type = luaL_optstring(L, 3, NULL))) { + if ((type = luaL_optstring(L, -1, NULL))) { if (xtolower(type[0]) == 'p' && xtolower(type[1]) == 'u') { pubonly = 1; } else if (xtolower(type[0]) == 'p' && xtolower(type[1]) == 'r') { prvtonly = 1; } else { - return luaL_argerror(L, 3, lua_pushfstring(L, "invalid type: %s", type)); + return luaL_error(L, "invalid key type: %s", type); } } -- 2.24.1