2 changed files with 675 additions and 1 deletions
@ -0,0 +1,673 @@ |
|||||
|
/*- |
||||
|
* Copyright 2016 Vsevolod Stakhov |
||||
|
* |
||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
* you may not use this file except in compliance with the License. |
||||
|
* You may obtain a copy of the License at |
||||
|
* |
||||
|
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
|
* |
||||
|
* Unless required by applicable law or agreed to in writing, software |
||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
* See the License for the specific language governing permissions and |
||||
|
* limitations under the License. |
||||
|
*/ |
||||
|
|
||||
|
/*- |
||||
|
* Copyright 2016 Vsevolod Stakhov |
||||
|
* |
||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
* you may not use this file except in compliance with the License. |
||||
|
* You may obtain a copy of the License at |
||||
|
* |
||||
|
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
|
* |
||||
|
* Unless required by applicable law or agreed to in writing, software |
||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
* See the License for the specific language governing permissions and |
||||
|
* limitations under the License. |
||||
|
*/ |
||||
|
/** |
||||
|
* @file lua_cryptobox.c |
||||
|
* This module exports routines to load cryptobox keys, check inline or external |
||||
|
* crypto signatures or encrypting/decrypting data. |
||||
|
*/ |
||||
|
|
||||
|
#include "lua_common.h" |
||||
|
#include "cryptobox.h" |
||||
|
#include "keypair.h" |
||||
|
#include "unix-std.h" |
||||
|
|
||||
|
LUA_FUNCTION_DEF (cryptobox_pubkey, load); |
||||
|
LUA_FUNCTION_DEF (cryptobox_pubkey, create); |
||||
|
LUA_FUNCTION_DEF (cryptobox_pubkey, gc); |
||||
|
LUA_FUNCTION_DEF (cryptobox_keypair, load); |
||||
|
LUA_FUNCTION_DEF (cryptobox_keypair, create); |
||||
|
LUA_FUNCTION_DEF (cryptobox_keypair, gc); |
||||
|
LUA_FUNCTION_DEF (cryptobox_signature, create); |
||||
|
LUA_FUNCTION_DEF (cryptobox_signature, load); |
||||
|
LUA_FUNCTION_DEF (cryptobox_signature, save); |
||||
|
LUA_FUNCTION_DEF (cryptobox_signature, gc); |
||||
|
LUA_FUNCTION_DEF (cryptobox, verify_memory); |
||||
|
LUA_FUNCTION_DEF (cryptobox, verify_file); |
||||
|
LUA_FUNCTION_DEF (cryptobox, sign_file); |
||||
|
LUA_FUNCTION_DEF (cryptobox, sign_memory); |
||||
|
|
||||
|
static const struct luaL_reg cryptoboxlib_f[] = { |
||||
|
LUA_INTERFACE_DEF (cryptobox, verify_memory), |
||||
|
LUA_INTERFACE_DEF (cryptobox, verify_file), |
||||
|
LUA_INTERFACE_DEF (cryptobox, sign_memory), |
||||
|
LUA_INTERFACE_DEF (cryptobox, sign_file), |
||||
|
{NULL, NULL} |
||||
|
}; |
||||
|
|
||||
|
static const struct luaL_reg cryptoboxpubkeylib_f[] = { |
||||
|
LUA_INTERFACE_DEF (cryptobox_pubkey, load), |
||||
|
LUA_INTERFACE_DEF (cryptobox_pubkey, create), |
||||
|
{NULL, NULL} |
||||
|
}; |
||||
|
|
||||
|
static const struct luaL_reg cryptoboxpubkeylib_m[] = { |
||||
|
{"__tostring", rspamd_lua_class_tostring}, |
||||
|
{"__gc", lua_cryptobox_pubkey_gc}, |
||||
|
{NULL, NULL} |
||||
|
}; |
||||
|
|
||||
|
static const struct luaL_reg cryptoboxkeypairlib_f[] = { |
||||
|
LUA_INTERFACE_DEF (cryptobox_keypair, load), |
||||
|
LUA_INTERFACE_DEF (cryptobox_keypair, create), |
||||
|
{NULL, NULL} |
||||
|
}; |
||||
|
|
||||
|
static const struct luaL_reg cryptoboxkeypairlib_m[] = { |
||||
|
{"__tostring", rspamd_lua_class_tostring}, |
||||
|
{"__gc", lua_cryptobox_keypair_gc}, |
||||
|
{NULL, NULL} |
||||
|
}; |
||||
|
|
||||
|
static const struct luaL_reg cryptoboxsignlib_f[] = { |
||||
|
LUA_INTERFACE_DEF (cryptobox_signature, load), |
||||
|
LUA_INTERFACE_DEF (cryptobox_signature, create), |
||||
|
{NULL, NULL} |
||||
|
}; |
||||
|
|
||||
|
static const struct luaL_reg cryptoboxsignlib_m[] = { |
||||
|
LUA_INTERFACE_DEF (cryptobox_signature, save), |
||||
|
{"__tostring", rspamd_lua_class_tostring}, |
||||
|
{"__gc", lua_cryptobox_signature_gc}, |
||||
|
{NULL, NULL} |
||||
|
}; |
||||
|
|
||||
|
static struct rspamd_cryptobox_pubkey * |
||||
|
lua_check_cryptobox_pubkey (lua_State * L, int pos) |
||||
|
{ |
||||
|
void *ud = luaL_checkudata (L, pos, "rspamd{cryptobox_pubkey}"); |
||||
|
|
||||
|
luaL_argcheck (L, ud != NULL, 1, "'cryptobox_pubkey' expected"); |
||||
|
return ud ? *((struct rspamd_cryptobox_pubkey **)ud) : NULL; |
||||
|
} |
||||
|
|
||||
|
static struct rspamd_cryptobox_keypair * |
||||
|
lua_check_cryptobox_keypair (lua_State * L, int pos) |
||||
|
{ |
||||
|
void *ud = luaL_checkudata (L, pos, "rspamd{cryptobox_keypair}"); |
||||
|
|
||||
|
luaL_argcheck (L, ud != NULL, 1, "'cryptobox_keypair' expected"); |
||||
|
return ud ? *((struct rspamd_cryptobox_keypair **)ud) : NULL; |
||||
|
} |
||||
|
|
||||
|
static rspamd_fstring_t * |
||||
|
lua_check_cryptobox_sign (lua_State * L, int pos) |
||||
|
{ |
||||
|
void *ud = luaL_checkudata (L, pos, "rspamd{cryptobox_signature}"); |
||||
|
|
||||
|
luaL_argcheck (L, ud != NULL, 1, "'cryptobox_signature' expected"); |
||||
|
return ud ? *((rspamd_fstring_t **)ud) : NULL; |
||||
|
} |
||||
|
|
||||
|
/*** |
||||
|
* function pubkey.load(file[, type[, alg]]) |
||||
|
* Loads public key from base32 encoded file |
||||
|
* @param {string} file filename to load |
||||
|
* @param {string} type optional 'sign' or 'kex' for signing and encryption |
||||
|
* @param {string} alg optional 'default' or 'nist' for curve25519/nistp256 keys |
||||
|
* @return {cryptobox_pubkey} new public key |
||||
|
*/ |
||||
|
static gint |
||||
|
lua_cryptobox_pubkey_load (lua_State *L) |
||||
|
{ |
||||
|
struct rspamd_cryptobox_pubkey *pkey = NULL, **ppkey; |
||||
|
const gchar *filename, *arg; |
||||
|
gint type = RSPAMD_KEYPAIR_SIGN; |
||||
|
gint alg = RSPAMD_CRYPTOBOX_MODE_25519; |
||||
|
guchar *map; |
||||
|
gsize len; |
||||
|
|
||||
|
filename = luaL_checkstring (L, 1); |
||||
|
if (filename != NULL) { |
||||
|
map = rspamd_file_xmap (filename, PROT_READ, &len); |
||||
|
|
||||
|
if (map == NULL) { |
||||
|
msg_err ("cannot open pubkey from file: %s, %s", |
||||
|
filename, |
||||
|
strerror (errno)); |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
else { |
||||
|
if (lua_type (L, 2) == LUA_TSTRING) { |
||||
|
/* keypair type */ |
||||
|
arg = lua_tostring (L, 2); |
||||
|
|
||||
|
if (strcmp (arg, "sign") == 0) { |
||||
|
type = RSPAMD_KEYPAIR_SIGN; |
||||
|
} |
||||
|
else if (strcmp (arg, "kex") == 0) { |
||||
|
type = RSPAMD_KEYPAIR_KEX; |
||||
|
} |
||||
|
} |
||||
|
if (lua_type (L, 3) == LUA_TSTRING) { |
||||
|
/* algorithm */ |
||||
|
arg = lua_tostring (L, 3); |
||||
|
|
||||
|
if (strcmp (arg, "default") == 0 || strcmp (arg, "curve25519") == 0) { |
||||
|
type = RSPAMD_CRYPTOBOX_MODE_25519; |
||||
|
} |
||||
|
else if (strcmp (arg, "nist") == 0) { |
||||
|
type = RSPAMD_CRYPTOBOX_MODE_NIST; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
pkey = rspamd_pubkey_from_base32 (map, len, type, alg); |
||||
|
|
||||
|
if (pkey == NULL) { |
||||
|
msg_err ("cannot open pubkey from file: %s", filename); |
||||
|
munmap (map, len); |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
else { |
||||
|
munmap (map, len); |
||||
|
ppkey = lua_newuserdata (L, sizeof (void *)); |
||||
|
rspamd_lua_setclass (L, "rspamd{cryptobox_pubkey}", -1); |
||||
|
*ppkey = pkey; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
lua_error (L); |
||||
|
} |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*** |
||||
|
* function pubkey.create(data[, type[, alg]]) |
||||
|
* Loads public key from base32 encoded file |
||||
|
* @param {base32 string} base32 string with the key |
||||
|
* @param {string} type optional 'sign' or 'kex' for signing and encryption |
||||
|
* @param {string} alg optional 'default' or 'nist' for curve25519/nistp256 keys |
||||
|
* @return {cryptobox_pubkey} new public key |
||||
|
*/ |
||||
|
static gint |
||||
|
lua_cryptobox_pubkey_create (lua_State *L) |
||||
|
{ |
||||
|
struct rspamd_cryptobox_pubkey *pkey = NULL, **ppkey; |
||||
|
const gchar *buf, *arg; |
||||
|
gsize len; |
||||
|
gint type = RSPAMD_KEYPAIR_SIGN; |
||||
|
gint alg = RSPAMD_CRYPTOBOX_MODE_25519; |
||||
|
|
||||
|
buf = luaL_checklstring (L, 1, &len); |
||||
|
if (buf != NULL) { |
||||
|
if (lua_type (L, 2) == LUA_TSTRING) { |
||||
|
/* keypair type */ |
||||
|
arg = lua_tostring (L, 2); |
||||
|
|
||||
|
if (strcmp (arg, "sign") == 0) { |
||||
|
type = RSPAMD_KEYPAIR_SIGN; |
||||
|
} |
||||
|
else if (strcmp (arg, "kex") == 0) { |
||||
|
type = RSPAMD_KEYPAIR_KEX; |
||||
|
} |
||||
|
} |
||||
|
if (lua_type (L, 3) == LUA_TSTRING) { |
||||
|
/* algorithm */ |
||||
|
arg = lua_tostring (L, 3); |
||||
|
|
||||
|
if (strcmp (arg, "default") == 0 || strcmp (arg, "curve25519") == 0) { |
||||
|
type = RSPAMD_CRYPTOBOX_MODE_25519; |
||||
|
} |
||||
|
else if (strcmp (arg, "nist") == 0) { |
||||
|
type = RSPAMD_CRYPTOBOX_MODE_NIST; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
pkey = rspamd_pubkey_from_base32 (buf, len, type, alg); |
||||
|
|
||||
|
if (pkey == NULL) { |
||||
|
msg_err ("cannot load pubkey from string"); |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
else { |
||||
|
ppkey = lua_newuserdata (L, sizeof (void *)); |
||||
|
rspamd_lua_setclass (L, "rspamd{cryptobox_pubkey}", -1); |
||||
|
*ppkey = pkey; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
else { |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
static gint |
||||
|
lua_cryptobox_pubkey_gc (lua_State *L) |
||||
|
{ |
||||
|
struct rspamd_cryptobox_pubkey *pkey = lua_check_cryptobox_pubkey (L, 1); |
||||
|
|
||||
|
if (pkey != NULL) { |
||||
|
rspamd_pubkey_unref (pkey); |
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
/*** |
||||
|
* function keypair.load(file) |
||||
|
* Loads public key from UCL file |
||||
|
* @param {string} file filename to load |
||||
|
* @return {cryptobox_keypair} new keypair |
||||
|
*/ |
||||
|
static gint |
||||
|
lua_cryptobox_keypair_load (lua_State *L) |
||||
|
{ |
||||
|
struct rspamd_cryptobox_keypair *kp, **pkp; |
||||
|
const gchar *filename; |
||||
|
struct ucl_parser *parser; |
||||
|
ucl_object_t *obj; |
||||
|
|
||||
|
filename = luaL_checkstring (L, 1); |
||||
|
if (filename != NULL) { |
||||
|
parser = ucl_parser_new (0); |
||||
|
|
||||
|
if (!ucl_parser_add_file (parser, filename)) { |
||||
|
msg_err ("cannot open keypair from file: %s, %s", |
||||
|
filename, |
||||
|
ucl_parser_get_error (parser)); |
||||
|
ucl_parser_free (parser); |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
else { |
||||
|
obj = ucl_parser_get_object (parser); |
||||
|
kp = rspamd_keypair_from_ucl (obj); |
||||
|
ucl_parser_free (parser); |
||||
|
|
||||
|
if (kp == NULL) { |
||||
|
msg_err ("cannot open keypair from file: %s", |
||||
|
filename); |
||||
|
ucl_object_unref (obj); |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
else { |
||||
|
pkp = lua_newuserdata (L, sizeof (gpointer)); |
||||
|
*pkp = kp; |
||||
|
rspamd_lua_setclass (L, "rspamd{cryptobox_keypair}", -1); |
||||
|
ucl_object_unref (obj); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
lua_error (L); |
||||
|
} |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
static gint |
||||
|
lua_cryptobox_keypair_create (lua_State *L) |
||||
|
{ |
||||
|
struct rspamd_cryptobox_keypair *kp, **pkp; |
||||
|
const gchar *buf; |
||||
|
gsize len; |
||||
|
struct ucl_parser *parser; |
||||
|
ucl_object_t *obj; |
||||
|
|
||||
|
buf = luaL_checklstring (L, 1, &len); |
||||
|
if (buf != NULL) { |
||||
|
parser = ucl_parser_new (0); |
||||
|
|
||||
|
if (!ucl_parser_add_chunk (parser, buf, len)) { |
||||
|
msg_err ("cannot open keypair from data: %s", |
||||
|
ucl_parser_get_error (parser)); |
||||
|
ucl_parser_free (parser); |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
else { |
||||
|
obj = ucl_parser_get_object (parser); |
||||
|
kp = rspamd_keypair_from_ucl (obj); |
||||
|
ucl_parser_free (parser); |
||||
|
|
||||
|
if (kp == NULL) { |
||||
|
msg_err ("cannot load keypair from data"); |
||||
|
ucl_object_unref (obj); |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
else { |
||||
|
pkp = lua_newuserdata (L, sizeof (gpointer)); |
||||
|
*pkp = kp; |
||||
|
rspamd_lua_setclass (L, "rspamd{cryptobox_keypair}", -1); |
||||
|
ucl_object_unref (obj); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
lua_error (L); |
||||
|
} |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
static gint |
||||
|
lua_cryptobox_keypair_gc (lua_State *L) |
||||
|
{ |
||||
|
struct rspamd_cryptobox_keypair *kp = lua_check_cryptobox_keypair (L, 1); |
||||
|
|
||||
|
if (kp != NULL) { |
||||
|
rspamd_keypair_unref (kp); |
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
static gint |
||||
|
lua_cryptobox_signature_load (lua_State *L) |
||||
|
{ |
||||
|
rspamd_fstring_t *sig, **psig; |
||||
|
const gchar *filename; |
||||
|
gpointer data; |
||||
|
int fd; |
||||
|
struct stat st; |
||||
|
|
||||
|
filename = luaL_checkstring (L, 1); |
||||
|
if (filename != NULL) { |
||||
|
fd = open (filename, O_RDONLY); |
||||
|
if (fd == -1) { |
||||
|
msg_err ("cannot open signature file: %s, %s", filename, |
||||
|
strerror (errno)); |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
else { |
||||
|
sig = g_malloc (sizeof (rspamd_fstring_t)); |
||||
|
if (fstat (fd, &st) == -1 || |
||||
|
(data = |
||||
|
mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0)) |
||||
|
== MAP_FAILED) { |
||||
|
msg_err ("cannot mmap file %s: %s", filename, strerror (errno)); |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
else { |
||||
|
sig = rspamd_fstring_new_init (data, st.st_size); |
||||
|
psig = lua_newuserdata (L, sizeof (rspamd_fstring_t *)); |
||||
|
rspamd_lua_setclass (L, "rspamd{cryptobox_signature}", -1); |
||||
|
*psig = sig; |
||||
|
munmap (data, st.st_size); |
||||
|
} |
||||
|
close (fd); |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
static gint |
||||
|
lua_cryptobox_signature_save (lua_State *L) |
||||
|
{ |
||||
|
rspamd_fstring_t *sig; |
||||
|
gint fd, flags; |
||||
|
const gchar *filename; |
||||
|
gboolean forced = FALSE, res = TRUE; |
||||
|
|
||||
|
sig = lua_check_cryptobox_sign (L, 1); |
||||
|
filename = luaL_checkstring (L, 2); |
||||
|
if (lua_gettop (L) > 2) { |
||||
|
forced = lua_toboolean (L, 3); |
||||
|
} |
||||
|
|
||||
|
if (sig != NULL && filename != NULL) { |
||||
|
flags = O_WRONLY | O_CREAT; |
||||
|
if (forced) { |
||||
|
flags |= O_TRUNC; |
||||
|
} |
||||
|
else { |
||||
|
flags |= O_EXCL; |
||||
|
} |
||||
|
fd = open (filename, flags, 00644); |
||||
|
if (fd == -1) { |
||||
|
msg_err ("cannot create a signature file: %s, %s", |
||||
|
filename, |
||||
|
strerror (errno)); |
||||
|
lua_pushboolean (L, FALSE); |
||||
|
} |
||||
|
else { |
||||
|
while (write (fd, sig->str, sig->len) == -1) { |
||||
|
if (errno == EINTR) { |
||||
|
continue; |
||||
|
} |
||||
|
msg_err ("cannot write to a signature file: %s, %s", |
||||
|
filename, |
||||
|
strerror (errno)); |
||||
|
res = FALSE; |
||||
|
break; |
||||
|
} |
||||
|
lua_pushboolean (L, res); |
||||
|
close (fd); |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
lua_pushboolean (L, FALSE); |
||||
|
} |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
static gint |
||||
|
lua_cryptobox_signature_create (lua_State *L) |
||||
|
{ |
||||
|
rspamd_fstring_t *sig, **psig; |
||||
|
const gchar *data; |
||||
|
gsize dlen; |
||||
|
|
||||
|
data = luaL_checklstring (L, 1, &dlen); |
||||
|
if (data != NULL) { |
||||
|
sig = rspamd_fstring_new_init (data, dlen); |
||||
|
psig = lua_newuserdata (L, sizeof (rspamd_fstring_t *)); |
||||
|
rspamd_lua_setclass (L, "rspamd{cryptobox_signature}", -1); |
||||
|
*psig = sig; |
||||
|
} |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
static gint |
||||
|
lua_cryptobox_signature_gc (lua_State *L) |
||||
|
{ |
||||
|
rspamd_fstring_t *sig = lua_check_cryptobox_sign (L, 1); |
||||
|
|
||||
|
rspamd_fstring_free (sig); |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Check memory using specified cryptobox key and signature |
||||
|
* |
||||
|
* arguments: |
||||
|
* (cryptobox_pubkey, cryptobox_signature, string) |
||||
|
* |
||||
|
* returns: |
||||
|
* true - if string match cryptobox signature |
||||
|
* false - otherwise |
||||
|
*/ |
||||
|
static gint |
||||
|
lua_cryptobox_verify_memory (lua_State *L) |
||||
|
{ |
||||
|
struct rspamd_cryptobox_pubkey *pk; |
||||
|
rspamd_fstring_t *signature; |
||||
|
const gchar *data; |
||||
|
gsize len; |
||||
|
gint ret; |
||||
|
|
||||
|
pk = lua_check_cryptobox_pubkey (L, 1); |
||||
|
signature = lua_check_cryptobox_sign (L, 2); |
||||
|
/* XXX: check signature length */ |
||||
|
data = luaL_checklstring (L, 3, &len); |
||||
|
|
||||
|
if (pk != NULL && signature != NULL && data != NULL) { |
||||
|
ret = rspamd_cryptobox_verify (signature->str, data, len, |
||||
|
rspamd_pubkey_get_pk (pk, NULL), RSPAMD_CRYPTOBOX_MODE_25519); |
||||
|
|
||||
|
if (ret) { |
||||
|
lua_pushboolean (L, 1); |
||||
|
} |
||||
|
else { |
||||
|
lua_pushboolean (L, 0); |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
lua_pushnil (L); |
||||
|
} |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Check memory using specified cryptobox key and signature |
||||
|
* |
||||
|
* arguments: |
||||
|
* (cryptobox_pubkey, cryptobox_signature, string) |
||||
|
* |
||||
|
* returns: |
||||
|
* true - if string match cryptobox signature |
||||
|
* false - otherwise |
||||
|
*/ |
||||
|
static gint |
||||
|
lua_cryptobox_verify_file (lua_State *L) |
||||
|
{ |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Sign memory using specified cryptobox key and signature |
||||
|
* |
||||
|
* arguments: |
||||
|
* (cryptobox_keypair, string) |
||||
|
* |
||||
|
* returns: |
||||
|
* rspamd_signature object |
||||
|
* nil - otherwise |
||||
|
*/ |
||||
|
static gint |
||||
|
lua_cryptobox_sign_memory (lua_State *L) |
||||
|
{ |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Sign file using specified cryptobox key and signature |
||||
|
* |
||||
|
* arguments: |
||||
|
* (cryptobox_keypair, cryptobox_signature, string) |
||||
|
* |
||||
|
* returns: |
||||
|
* true - if string match cryptobox signature |
||||
|
* false - otherwise |
||||
|
*/ |
||||
|
static gint |
||||
|
lua_cryptobox_sign_file (lua_State *L) |
||||
|
{ |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
static gint |
||||
|
lua_load_pubkey (lua_State * L) |
||||
|
{ |
||||
|
lua_newtable (L); |
||||
|
luaL_register (L, NULL, cryptoboxpubkeylib_f); |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
static gint |
||||
|
lua_load_keypair (lua_State * L) |
||||
|
{ |
||||
|
lua_newtable (L); |
||||
|
luaL_register (L, NULL, cryptoboxkeypairlib_f); |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
static gint |
||||
|
lua_load_signature (lua_State * L) |
||||
|
{ |
||||
|
lua_newtable (L); |
||||
|
luaL_register (L, NULL, cryptoboxsignlib_f); |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
static gint |
||||
|
lua_load_cryptobox (lua_State * L) |
||||
|
{ |
||||
|
lua_newtable (L); |
||||
|
luaL_register (L, NULL, cryptoboxlib_f); |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
luaopen_cryptobox (lua_State * L) |
||||
|
{ |
||||
|
luaL_newmetatable (L, "rspamd{cryptobox_pubkey}"); |
||||
|
lua_pushstring (L, "__index"); |
||||
|
lua_pushvalue (L, -2); |
||||
|
lua_settable (L, -3); |
||||
|
|
||||
|
lua_pushstring (L, "class"); |
||||
|
lua_pushstring (L, "rspamd{cryptobox_pubkey}"); |
||||
|
lua_rawset (L, -3); |
||||
|
|
||||
|
luaL_register (L, NULL, cryptoboxpubkeylib_m); |
||||
|
rspamd_lua_add_preload (L, "rspamd_cryptobox_pubkey", lua_load_pubkey); |
||||
|
|
||||
|
luaL_newmetatable (L, "rspamd{cryptobox_keypair}"); |
||||
|
lua_pushstring (L, "__index"); |
||||
|
lua_pushvalue (L, -2); |
||||
|
lua_settable (L, -3); |
||||
|
|
||||
|
lua_pushstring (L, "class"); |
||||
|
lua_pushstring (L, "rspamd{cryptobox_keypair}"); |
||||
|
lua_rawset (L, -3); |
||||
|
|
||||
|
luaL_register (L, NULL, cryptoboxkeypairlib_m); |
||||
|
rspamd_lua_add_preload (L, "rspamd_cryptobox_keypair", lua_load_keypair); |
||||
|
|
||||
|
luaL_newmetatable (L, "rspamd{cryptobox_signature}"); |
||||
|
lua_pushstring (L, "__index"); |
||||
|
lua_pushvalue (L, -2); |
||||
|
lua_settable (L, -3); |
||||
|
|
||||
|
lua_pushstring (L, "class"); |
||||
|
lua_pushstring (L, "rspamd{cryptobox_signature}"); |
||||
|
lua_rawset (L, -3); |
||||
|
|
||||
|
luaL_register (L, NULL, cryptoboxsignlib_m); |
||||
|
rspamd_lua_add_preload (L, "rspamd_cryptobox_signature", lua_load_signature); |
||||
|
|
||||
|
rspamd_lua_add_preload (L, "rspamd_cryptobox", lua_load_cryptobox); |
||||
|
|
||||
|
lua_settop (L, 0); |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue