mirror of
https://github.com/brunoos/luasec.git
synced 2024-09-06 21:04:43 +02:00
111 lines
2.2 KiB
C
111 lines
2.2 KiB
C
#include <openssl/objects.h>
|
|
|
|
#include "ec.h"
|
|
|
|
#ifndef OPENSSL_NO_ECDH
|
|
|
|
EC_KEY *lsec_find_ec_key(lua_State *L, const char *str)
|
|
{
|
|
int nid;
|
|
lua_pushstring(L, "SSL:EC:CURVES");
|
|
lua_rawget(L, LUA_REGISTRYINDEX);
|
|
lua_pushstring(L, str);
|
|
lua_rawget(L, -2);
|
|
|
|
if (!lua_isnumber(L, -1))
|
|
return NULL;
|
|
|
|
nid = (int)lua_tonumber(L, -1);
|
|
return EC_KEY_new_by_curve_name(nid);
|
|
}
|
|
|
|
void lsec_load_curves(lua_State *L)
|
|
{
|
|
size_t i;
|
|
size_t size;
|
|
const char *name;
|
|
EC_builtin_curve *curves = NULL;
|
|
|
|
lua_pushstring(L, "SSL:EC:CURVES");
|
|
lua_newtable(L);
|
|
|
|
size = EC_get_builtin_curves(NULL, 0);
|
|
if (size > 0) {
|
|
curves = (EC_builtin_curve*)malloc(sizeof(EC_builtin_curve) * size);
|
|
EC_get_builtin_curves(curves, size);
|
|
for (i = 0; i < size; i++) {
|
|
name = OBJ_nid2sn(curves[i].nid);
|
|
if (name != NULL) {
|
|
lua_pushstring(L, name);
|
|
lua_pushnumber(L, curves[i].nid);
|
|
lua_rawset(L, -3);
|
|
}
|
|
switch (curves[i].nid) {
|
|
case NID_X9_62_prime256v1:
|
|
lua_pushstring(L, "P-256");
|
|
lua_pushnumber(L, curves[i].nid);
|
|
lua_rawset(L, -3);
|
|
break;
|
|
case NID_secp384r1:
|
|
lua_pushstring(L, "P-384");
|
|
lua_pushnumber(L, curves[i].nid);
|
|
lua_rawset(L, -3);
|
|
break;
|
|
case NID_secp521r1:
|
|
lua_pushstring(L, "P-521");
|
|
lua_pushnumber(L, curves[i].nid);
|
|
lua_rawset(L, -3);
|
|
break;
|
|
#ifdef NID_X25519
|
|
case NID_X25519:
|
|
lua_pushstring(L, "X25519");
|
|
lua_pushnumber(L, curves[i].nid);
|
|
lua_rawset(L, -3);
|
|
break;
|
|
#endif
|
|
#ifdef NID_X448
|
|
case NID_X448:
|
|
lua_pushstring(L, "X448");
|
|
lua_pushnumber(L, curves[i].nid);
|
|
lua_rawset(L, -3);
|
|
break;
|
|
#endif
|
|
}
|
|
}
|
|
free(curves);
|
|
}
|
|
|
|
lua_rawset(L, LUA_REGISTRYINDEX);
|
|
}
|
|
|
|
void lsec_get_curves(lua_State *L)
|
|
{
|
|
lua_newtable(L);
|
|
|
|
lua_pushstring(L, "SSL:EC:CURVES");
|
|
lua_rawget(L, LUA_REGISTRYINDEX);
|
|
|
|
lua_pushnil(L);
|
|
while (lua_next(L, -2) != 0) {
|
|
lua_pop(L, 1);
|
|
lua_pushvalue(L, -1);
|
|
lua_pushboolean(L, 1);
|
|
lua_rawset(L, -5);
|
|
}
|
|
lua_pop(L, 1);
|
|
}
|
|
|
|
#else
|
|
|
|
void lsec_load_curves(lua_State *L)
|
|
{
|
|
// do nothing
|
|
}
|
|
|
|
void lsec_get_curves(lua_State *L)
|
|
{
|
|
lua_newtable(L);
|
|
}
|
|
|
|
#endif
|