Support passing DANE flags

The only flag at the moment is one that disables name checks, which is
needed for certain protocols such as XMPP.
This commit is contained in:
Kim Alvefur 2021-09-16 00:53:32 +02:00
parent ef14b27a2c
commit 65ee83275b
3 changed files with 34 additions and 2 deletions

View File

@ -77,8 +77,15 @@ LSEC_API int luaopen_ssl_config(lua_State *L)
#ifdef LSEC_ENABLE_DANE #ifdef LSEC_ENABLE_DANE
// DANE // DANE
lua_pushstring(L, "dane"); lua_pushstring(L, "dane");
#ifdef DANE_FLAG_NO_DANE_EE_NAMECHECKS
lua_createtable(L, 0, 1);
lua_pushstring(L, "no_ee_namechecks");
lua_pushboolean(L, 1); lua_pushboolean(L, 1);
lua_rawset(L, -3); lua_rawset(L, -3);
#else
lua_pushboolean(L, 1);
#endif
lua_rawset(L, -3);
#endif #endif
#ifndef OPENSSL_NO_EC #ifndef OPENSSL_NO_EC

View File

@ -17,6 +17,7 @@
#include <openssl/err.h> #include <openssl/err.h>
#include <openssl/x509.h> #include <openssl/x509.h>
#include <openssl/x509v3.h> #include <openssl/x509v3.h>
#include <openssl/x509_vfy.h>
#include <openssl/dh.h> #include <openssl/dh.h>
#include <lua.h> #include <lua.h>
@ -711,11 +712,31 @@ static int set_alpn_cb(lua_State *L)
/* /*
* DANE * DANE
*/ */
static int dane_options[] = {
/* TODO move into options.c
* however this symbol is not from openssl/ssl.h but rather from
* openssl/x509_vfy.h
* */
#ifdef DANE_FLAG_NO_DANE_EE_NAMECHECKS
DANE_FLAG_NO_DANE_EE_NAMECHECKS,
#endif
0
};
static const char *dane_option_names[] = {
#ifdef DANE_FLAG_NO_DANE_EE_NAMECHECKS
"no_ee_namechecks",
#endif
NULL
};
static int set_dane(lua_State *L) static int set_dane(lua_State *L)
{ {
int ret; int ret, i;
SSL_CTX *ctx = lsec_checkcontext(L, 1); SSL_CTX *ctx = lsec_checkcontext(L, 1);
ret = SSL_CTX_dane_enable(ctx); ret = SSL_CTX_dane_enable(ctx);
for (i = 2; ret > 0 && i <= lua_gettop(L); i++) {
ret = SSL_CTX_dane_set_flags(ctx, dane_options[luaL_checkoption(L, i, NULL, dane_option_names)]);
}
lua_pushboolean(L, (ret > 0)); lua_pushboolean(L, (ret > 0));
return 1; return 1;
} }

View File

@ -202,8 +202,12 @@ local function newcontext(cfg)
end end
if config.capabilities.dane and cfg.dane then if config.capabilities.dane and cfg.dane then
if type(cfg.dane) == "table" then
context.setdane(ctx, unpack(cfg.dane))
else
context.setdane(ctx) context.setdane(ctx)
end end
end
return ctx return ctx
end end