diff --git a/src/util-lua-ja3.c b/src/util-lua-ja3.c index c538be5271..3143f30816 100644 --- a/src/util-lua-ja3.c +++ b/src/util-lua-ja3.c @@ -128,6 +128,30 @@ static int Ja3SGetHash(lua_State *luastate) strlen(ssl_state->server_connp.ja3_hash)); } +static int Ja3SGetString(lua_State *luastate) +{ + if (!(LuaStateNeedProto(luastate, ALPROTO_TLS))) + return LuaCallbackError(luastate, "error: protocol is not tls"); + + Flow *f = LuaStateGetFlow(luastate); + if (f == NULL) + return LuaCallbackError(luastate, "internal error: no flow"); + + void *state = FlowGetAppState(f); + if (state == NULL) + return LuaCallbackError(luastate, "error: no app layer state"); + + SSLState *ssl_state = (SSLState *)state; + + if (ssl_state->server_connp.ja3_str == NULL || + ssl_state->server_connp.ja3_str->data == NULL) + return LuaCallbackError(luastate, "error: no JA3S str"); + + return LuaPushStringBuffer(luastate, + (uint8_t *)ssl_state->server_connp.ja3_str->data, + ssl_state->server_connp.ja3_str->used); +} + /** *\brief Register JA3 Lua extensions */ int LuaRegisterJa3Functions(lua_State *luastate) { @@ -140,6 +164,9 @@ int LuaRegisterJa3Functions(lua_State *luastate) lua_pushcfunction(luastate, Ja3SGetHash); lua_setglobal(luastate, "Ja3SGetHash"); + lua_pushcfunction(luastate, Ja3SGetString); + lua_setglobal(luastate, "Ja3SGetString"); + return 0; }