Browse Source

Add a simple test of rsa utils in lua.

Support RSA signing in lua_rsa module.
Add save function for rsa_signature.
Fix test logic for lua modules.
tags/0.6.0
Vsevolod Stakhov 11 years ago
parent
commit
b346120d24
6 changed files with 436 additions and 43 deletions
  1. 325
    35
      src/lua/lua_rsa.c
  2. 17
    8
      src/main.c
  3. 19
    0
      test/lua/test.data
  4. 39
    0
      test/lua/test_rsa.lua
  5. 27
    0
      test/lua/testkey
  6. 9
    0
      test/lua/testkey.pub

+ 325
- 35
src/lua/lua_rsa.c View File

@@ -36,30 +36,50 @@
#include <openssl/rsa.h>
#include <openssl/pem.h>

LUA_FUNCTION_DEF (rsa_key, load);
LUA_FUNCTION_DEF (rsa_key, create);
LUA_FUNCTION_DEF (rsa_key, gc);
LUA_FUNCTION_DEF (rsa_pubkey, load);
LUA_FUNCTION_DEF (rsa_pubkey, create);
LUA_FUNCTION_DEF (rsa_pubkey, gc);
LUA_FUNCTION_DEF (rsa_privkey, load);
LUA_FUNCTION_DEF (rsa_privkey, create);
LUA_FUNCTION_DEF (rsa_privkey, gc);
LUA_FUNCTION_DEF (rsa_signature, create);
LUA_FUNCTION_DEF (rsa_signature, load);
LUA_FUNCTION_DEF (rsa_signature, save);
LUA_FUNCTION_DEF (rsa_signature, gc);
LUA_FUNCTION_DEF (rsa, check_memory);
LUA_FUNCTION_DEF (rsa, check_file);
LUA_FUNCTION_DEF (rsa, verify_memory);
LUA_FUNCTION_DEF (rsa, verify_file);
LUA_FUNCTION_DEF (rsa, sign_file);
LUA_FUNCTION_DEF (rsa, sign_memory);

static const struct luaL_reg rsalib_f[] = {
LUA_INTERFACE_DEF (rsa, check_memory),
LUA_INTERFACE_DEF (rsa, check_file),
LUA_INTERFACE_DEF (rsa, verify_memory),
LUA_INTERFACE_DEF (rsa, verify_file),
LUA_INTERFACE_DEF (rsa, sign_memory),
LUA_INTERFACE_DEF (rsa, sign_file),
{NULL, NULL}
};

static const struct luaL_reg rsakeylib_f[] = {
LUA_INTERFACE_DEF (rsa_key, load),
LUA_INTERFACE_DEF (rsa_key, create),
static const struct luaL_reg rsapubkeylib_f[] = {
LUA_INTERFACE_DEF (rsa_pubkey, load),
LUA_INTERFACE_DEF (rsa_pubkey, create),
{NULL, NULL}
};

static const struct luaL_reg rsakeylib_m[] = {
static const struct luaL_reg rsapubkeylib_m[] = {
{"__tostring", lua_class_tostring},
{"__gc", lua_rsa_key_gc},
{"__gc", lua_rsa_pubkey_gc},
{NULL, NULL}
};

static const struct luaL_reg rsaprivkeylib_f[] = {
LUA_INTERFACE_DEF (rsa_privkey, load),
LUA_INTERFACE_DEF (rsa_privkey, create),
{NULL, NULL}
};

static const struct luaL_reg rsaprivkeylib_m[] = {
{"__tostring", lua_class_tostring},
{"__gc", lua_rsa_privkey_gc},
{NULL, NULL}
};

@@ -70,17 +90,27 @@ static const struct luaL_reg rsasignlib_f[] = {
};

static const struct luaL_reg rsasignlib_m[] = {
LUA_INTERFACE_DEF (rsa_signature, save),
{"__tostring", lua_class_tostring},
{"__gc", lua_rsa_signature_gc},
{NULL, NULL}
};

static RSA *
lua_check_rsa_key (lua_State * L, int pos)
lua_check_rsa_pubkey (lua_State * L, int pos)
{
void *ud = luaL_checkudata (L, pos, "rspamd{rsa_pubkey}");

luaL_argcheck (L, ud != NULL, 1, "'rsa_pubkey' expected");
return ud ? *((RSA **)ud) : NULL;
}

static RSA *
lua_check_rsa_privkey (lua_State * L, int pos)
{
void *ud = luaL_checkudata (L, pos, "rspamd{rsa_key}");
void *ud = luaL_checkudata (L, pos, "rspamd{rsa_privkey}");

luaL_argcheck (L, ud != NULL, 1, "'rsa_key' expected");
luaL_argcheck (L, ud != NULL, 1, "'rsa_privkey' expected");
return ud ? *((RSA **)ud) : NULL;
}

@@ -94,7 +124,7 @@ lua_check_rsa_sign (lua_State * L, int pos)
}

static gint
lua_rsa_key_load (lua_State *L)
lua_rsa_pubkey_load (lua_State *L)
{
RSA *rsa = NULL, **prsa;
const gchar *filename;
@@ -115,7 +145,7 @@ lua_rsa_key_load (lua_State *L)
}
else {
prsa = lua_newuserdata (L, sizeof (RSA *));
lua_setclass (L, "rspamd{rsa_key}", -1);
lua_setclass (L, "rspamd{rsa_pubkey}", -1);
*prsa = rsa;
}
fclose (f);
@@ -128,7 +158,7 @@ lua_rsa_key_load (lua_State *L)
}

static gint
lua_rsa_key_create (lua_State *L)
lua_rsa_pubkey_create (lua_State *L)
{
RSA *rsa = NULL, **prsa;
const gchar *buf;
@@ -145,7 +175,7 @@ lua_rsa_key_create (lua_State *L)
}
else {
prsa = lua_newuserdata (L, sizeof (RSA *));
lua_setclass (L, "rspamd{rsa_key}", -1);
lua_setclass (L, "rspamd{rsa_pubkey}", -1);
*prsa = rsa;
}
BIO_free (bp);
@@ -157,9 +187,84 @@ lua_rsa_key_create (lua_State *L)
}

static gint
lua_rsa_key_gc (lua_State *L)
lua_rsa_pubkey_gc (lua_State *L)
{
RSA *rsa = lua_check_rsa_key (L, 1);
RSA *rsa = lua_check_rsa_pubkey (L, 1);

if (rsa != NULL) {
RSA_free (rsa);
}

return 0;
}

static gint
lua_rsa_privkey_load (lua_State *L)
{
RSA *rsa = NULL, **prsa;
const gchar *filename;
FILE *f;

filename = luaL_checkstring (L, 1);
if (filename != NULL) {
f = fopen (filename, "r");
if (f == NULL) {
msg_err ("cannot open private key from file: %s, %s", filename, strerror (errno));
lua_pushnil (L);
}
else {
if (! PEM_read_RSAPrivateKey (f, &rsa, NULL, NULL)) {
msg_err ("cannot open private key from file: %s, %s", filename,
ERR_error_string (ERR_get_error (), NULL));
lua_pushnil (L);
}
else {
prsa = lua_newuserdata (L, sizeof (RSA *));
lua_setclass (L, "rspamd{rsa_privkey}", -1);
*prsa = rsa;
}
fclose (f);
}
}
else {
lua_pushnil (L);
}
return 1;
}

static gint
lua_rsa_privkey_create (lua_State *L)
{
RSA *rsa = NULL, **prsa;
const gchar *buf;
BIO *bp;

buf = luaL_checkstring (L, 1);
if (buf != NULL) {
bp = BIO_new_mem_buf ((void *)buf, -1);

if (! PEM_read_bio_RSAPrivateKey (bp, &rsa, NULL, NULL)) {
msg_err ("cannot parse private key: %s",
ERR_error_string (ERR_get_error (), NULL));
lua_pushnil (L);
}
else {
prsa = lua_newuserdata (L, sizeof (RSA *));
lua_setclass (L, "rspamd{rsa_privkey}", -1);
*prsa = rsa;
}
BIO_free (bp);
}
else {
lua_pushnil (L);
}
return 1;
}

static gint
lua_rsa_privkey_gc (lua_State *L)
{
RSA *rsa = lua_check_rsa_privkey (L, 1);

if (rsa != NULL) {
RSA_free (rsa);
@@ -210,6 +315,53 @@ lua_rsa_signature_load (lua_State *L)
return 1;
}

static gint
lua_rsa_signature_save (lua_State *L)
{
f_str_t *sig;
gint fd, flags;
const gchar *filename;
gboolean forced = FALSE, res = TRUE;

sig = lua_check_rsa_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->begin, 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_rsa_signature_create (lua_State *L)
{
@@ -250,14 +402,14 @@ lua_rsa_signature_gc (lua_State *L)
* Check memory using specified rsa key and signature
*
* arguments:
* (rsa_key, rsa_signature, string)
* (rsa_pubkey, rsa_signature, string)
*
* returns:
* true - if string match rsa signature
* false - otherwise
*/
static gint
lua_rsa_check_memory (lua_State *L)
lua_rsa_verify_memory (lua_State *L)
{
RSA *rsa;
f_str_t *signature;
@@ -265,19 +417,23 @@ lua_rsa_check_memory (lua_State *L)
gchar *data_sig;
gint ret;

rsa = lua_check_rsa_key (L, 1);
rsa = lua_check_rsa_pubkey (L, 1);
signature = lua_check_rsa_sign (L, 2);
data = luaL_checkstring (L, 3);

if (rsa != NULL && signature != NULL && data != NULL) {
data_sig = g_compute_checksum_for_string (G_CHECKSUM_SHA256, data, -1);
ret = RSA_verify (NID_sha1, signature->begin, signature->len, data_sig, strlen (data_sig), rsa);
ret = RSA_verify (NID_sha1, data_sig, strlen (data_sig),
signature->begin, signature->len, rsa);
if (ret == 0) {
msg_info ("cannot check rsa signature for data: %s",
ERR_error_string (ERR_get_error (), NULL));
lua_pushboolean (L, FALSE);
}
else {
lua_pushboolean (L, TRUE);
}
g_free (data_sig);
}
else {
lua_pushnil (L);
@@ -290,14 +446,14 @@ lua_rsa_check_memory (lua_State *L)
* Check memory using specified rsa key and signature
*
* arguments:
* (rsa_key, rsa_signature, string)
* (rsa_pubkey, rsa_signature, string)
*
* returns:
* true - if string match rsa signature
* false - otherwise
*/
static gint
lua_rsa_check_file (lua_State *L)
lua_rsa_verify_file (lua_State *L)
{
RSA *rsa;
f_str_t *signature;
@@ -306,11 +462,11 @@ lua_rsa_check_file (lua_State *L)
gint ret, fd;
struct stat st;

rsa = lua_check_rsa_key (L, 1);
rsa = lua_check_rsa_pubkey (L, 1);
signature = lua_check_rsa_sign (L, 2);
filename = luaL_checkstring (L, 3);

if (rsa != NULL && signature != NULL && data != NULL) {
if (rsa != NULL && signature != NULL && filename != NULL) {
fd = open (filename, O_RDONLY);
if (fd == -1) {
msg_err ("cannot open file %s: %s", filename, strerror (errno));
@@ -324,14 +480,136 @@ lua_rsa_check_file (lua_State *L)
}
else {
data_sig = g_compute_checksum_for_data (G_CHECKSUM_SHA256, data, st.st_size);
ret = RSA_verify (NID_sha1, signature->begin, signature->len,
data_sig, strlen (data_sig), rsa);
ret = RSA_verify (NID_sha1, data_sig, strlen (data_sig),
signature->begin, signature->len, rsa);
if (ret == 0) {
msg_info ("cannot check rsa signature for file: %s, %s",
filename, ERR_error_string (ERR_get_error (), NULL));
lua_pushboolean (L, FALSE);
}
else {
lua_pushboolean (L, TRUE);
}
g_free (data_sig);
munmap (data, st.st_size);
}
close (fd);
}
}
else {
lua_pushnil (L);
}

return 1;
}

/**
* Sign memory using specified rsa key and signature
*
* arguments:
* (rsa_privkey, string)
*
* returns:
* rspamd_signature object
* nil - otherwise
*/
static gint
lua_rsa_sign_memory (lua_State *L)
{
RSA *rsa;
f_str_t *signature, **psig;
const gchar *data;
gchar *data_sig;
gint ret;

rsa = lua_check_rsa_privkey (L, 1);
data = luaL_checkstring (L, 2);

if (rsa != NULL && data != NULL) {
signature = g_malloc (sizeof (f_str_t));
signature->len = RSA_size (rsa);
signature->size = signature->len;
signature->begin = g_malloc (signature->len);
data_sig = g_compute_checksum_for_string (G_CHECKSUM_SHA256, data, -1);
ret = RSA_sign (NID_sha1, data_sig, strlen (data_sig),
signature->begin, (guint *)&signature->len, rsa);
if (ret == 0) {
msg_info ("cannot make a signature for data: %s",
ERR_error_string (ERR_get_error (), NULL));
lua_pushnil (L);
g_free (signature->begin);
g_free (signature);
}
else {
psig = lua_newuserdata (L, sizeof (f_str_t *));
lua_setclass (L, "rspamd{rsa_signature}", -1);
*psig = signature;
}
g_free (data_sig);
}
else {
lua_pushnil (L);
}

return 1;
}

/**
* Sign file using specified rsa key and signature
*
* arguments:
* (rsa_privkey, rsa_signature, string)
*
* returns:
* true - if string match rsa signature
* false - otherwise
*/
static gint
lua_rsa_sign_file (lua_State *L)
{
RSA *rsa;
f_str_t *signature, **psig;
const gchar *filename;
gchar *data = NULL, *data_sig;
gint ret, fd;
struct stat st;

rsa = lua_check_rsa_privkey (L, 1);
filename = luaL_checkstring (L, 2);

if (rsa != NULL && filename != NULL) {
fd = open (filename, O_RDONLY);
if (fd == -1) {
msg_err ("cannot open file %s: %s", filename, strerror (errno));
lua_pushnil (L);
}
else {
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 {
signature = g_malloc (sizeof (f_str_t));
signature->len = RSA_size (rsa);
signature->size = signature->len;
signature->begin = g_malloc (signature->len);
data_sig = g_compute_checksum_for_string (G_CHECKSUM_SHA256, data, st.st_size);
ret = RSA_sign (NID_sha1, data_sig, strlen (data_sig),
signature->begin, (guint *)&signature->len, rsa);
if (ret == 0) {
msg_info ("cannot make a signature for data: %s",
ERR_error_string (ERR_get_error (), NULL));
lua_pushnil (L);
g_free (signature->begin);
g_free (signature);
}
else {
psig = lua_newuserdata (L, sizeof (f_str_t *));
lua_setclass (L, "rspamd{rsa_signature}", -1);
*psig = signature;
}
g_free (data_sig);
munmap (data, st.st_size);
}
close (fd);
@@ -347,17 +625,29 @@ lua_rsa_check_file (lua_State *L)
gint
luaopen_rsa (lua_State * L)
{
luaL_newmetatable (L, "rspamd{rsa_key}");
luaL_newmetatable (L, "rspamd{rsa_pubkey}");
lua_pushstring (L, "__index");
lua_pushvalue (L, -2);
lua_settable (L, -3);

lua_pushstring (L, "class");
lua_pushstring (L, "rspamd{rsa_pubkey}");
lua_rawset (L, -3);

luaL_register (L, NULL, rsapubkeylib_m);
luaL_register (L, "rsa_pubkey", rsapubkeylib_f);

luaL_newmetatable (L, "rspamd{rsa_privkey}");
lua_pushstring (L, "__index");
lua_pushvalue (L, -2);
lua_settable (L, -3);

lua_pushstring (L, "class");
lua_pushstring (L, "rspamd{rsa_key}");
lua_pushstring (L, "rspamd{rsa_privkey}");
lua_rawset (L, -3);

luaL_register (L, NULL, rsakeylib_m);
luaL_register (L, "rsa_key", rsakeylib_f);
luaL_register (L, NULL, rsaprivkeylib_m);
luaL_register (L, "rsa_privkey", rsaprivkeylib_f);

luaL_newmetatable (L, "rspamd{rsa_signature}");
lua_pushstring (L, "__index");

+ 17
- 8
src/main.c View File

@@ -96,7 +96,7 @@ static GOptionEntry entries[] =
{ "dump-cache", 'C', 0, G_OPTION_ARG_NONE, &dump_cache, "Dump symbols cache stats and exit", NULL },
{ "debug", 'd', 0, G_OPTION_ARG_NONE, &is_debug, "Force debug output", NULL },
{ "insecure", 'i', 0, G_OPTION_ARG_NONE, &is_insecure, "Ignore running workers as privileged users (insecure)", NULL },
{ "test-lua", 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &cfg_names, "Specify lua file(s) to test", NULL },
{ "test-lua", 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &lua_tests, "Specify lua file(s) to test", NULL },
{ NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL }
};

@@ -832,16 +832,26 @@ static gint
perform_lua_tests (struct config_file *cfg)
{
gint i, tests_num, res = EXIT_SUCCESS;
gchar *cur_script;
lua_State *L = cfg->lua_state;

tests_num = g_strv_length (lua_tests);

for (i = 0; i < tests_num; i ++) {

if (luaL_loadfile (L, lua_tests[i]) != 0) {
msg_err ("load of %s failed: %s", lua_tests[i], lua_tostring (L, -1));
res = EXIT_FAILURE;
continue;
}

cur_script = g_strdup (lua_tests[i]);
lua_pushstring (L, cur_script);
lua_setglobal (L, "test_script");
lua_pushstring (L, dirname (cur_script));
lua_setglobal (L, "test_dir");
g_free (cur_script);

/* do the call (0 arguments, N result) */
if (lua_pcall (L, 0, LUA_MULTRET, 0) != 0) {
msg_info ("init of %s failed: %s", lua_tests[i], lua_tostring (L, -1));
@@ -873,7 +883,6 @@ main (gint argc, gchar **argv, gchar **env)
GList *l;
worker_t **pworker;
GQuark type;
gboolean lua_test;
#ifdef HAVE_OPENSSL
gchar rand_bytes[sizeof (guint32)];
guint32 rand_seed;
@@ -980,6 +989,11 @@ main (gint argc, gchar **argv, gchar **env)
rspamd_main->cfg->cache->cfg = rspamd_main->cfg;
rspamd_main->cfg->cache->items_by_symbol = g_hash_table_new (rspamd_str_hash, rspamd_str_equal);

/* If we want to test lua skip everything except it */
if (lua_tests != NULL && lua_tests[0] != NULL) {
exit (perform_lua_tests (rspamd_main->cfg));
}

/* Load config */
if (! load_rspamd_config (rspamd_main->cfg, TRUE)) {
exit (EXIT_FAILURE);
@@ -990,9 +1004,7 @@ main (gint argc, gchar **argv, gchar **env)
rspamd_main->cfg->log_level = G_LOG_LEVEL_DEBUG;
}

lua_test = (lua_tests != NULL && lua_tests[0] != NULL);

if (rspamd_main->cfg->config_test || dump_vars || dump_cache || lua_test) {
if (rspamd_main->cfg->config_test || dump_vars || dump_cache) {
/* Init events to test modules */
event_init ();
res = TRUE;
@@ -1027,9 +1039,6 @@ main (gint argc, gchar **argv, gchar **env)
print_symbols_cache (rspamd_main->cfg);
exit (EXIT_SUCCESS);
}
if (lua_test) {
exit (perform_lua_tests (rspamd_main->cfg));
}
fprintf (stderr, "syntax %s\n", res ? "OK" : "BAD");
return res ? EXIT_SUCCESS : EXIT_FAILURE;
}

+ 19
- 0
test/lua/test.data View File

@@ -0,0 +1,19 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas et adipiscing nunc, non auctor justo. Nunc consectetur nunc eget nibh pulvinar, quis consequat tortor mollis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In eu lectus in mi sodales fermentum. Pellentesque id sapien in augue sodales porta laoreet vel odio. Nam semper massa turpis, sit amet tempus nulla scelerisque non. Sed porttitor sapien est, vitae imperdiet nulla blandit vel.

Proin venenatis neque urna, sit amet elementum risus accumsan in. Nam lectus augue, porttitor a accumsan porta, dignissim ut magna. Cras eleifend orci at eros porttitor posuere. Vestibulum semper accumsan purus, vel varius nisl porta sed. Duis id consectetur ligula, id vestibulum erat. Ut ultricies viverra ipsum sagittis semper. Proin cursus ante at justo pharetra placerat. Donec ultrices eros orci, sed congue libero mattis nec. Ut fringilla quis mauris non condimentum. Proin ante risus, imperdiet et elit vitae, aliquet egestas tortor.

Curabitur tempus, lacus in vehicula pulvinar, odio nisl porta sem, sit amet aliquet metus tellus rhoncus nulla. Morbi condimentum enim vitae lorem imperdiet, ac feugiat nisl suscipit. Proin eleifend laoreet tortor. Sed id risus elementum, sollicitudin nibh et, luctus augue. Cras consequat nec diam in volutpat. Nam tempor nisi nec risus tempus varius quis eget mi. Nunc mauris dolor, imperdiet eget nisi ut, aliquet vulputate massa. Sed consequat diam vitae malesuada vulputate.

Duis ac mollis ante, et suscipit eros. Aenean vel risus nec nisi lacinia aliquam. Phasellus auctor hendrerit facilisis. Etiam at dolor vestibulum, varius quam tempus, adipiscing dolor. Vestibulum erat dui, semper eget orci eget, iaculis laoreet ipsum. Nullam id quam at odio pharetra vestibulum. Morbi porttitor sagittis nunc sed pellentesque. Quisque semper orci ac metus molestie egestas.

Donec mattis commodo magna sit amet pellentesque. In et varius urna. Suspendisse eget tellus nulla. Suspendisse potenti. Praesent a ante sit amet tellus pellentesque ornare id sit amet eros. Donec sed dignissim ligula, nec condimentum nulla. Etiam fermentum leo sit amet tincidunt fringilla. In semper lacus sit amet laoreet volutpat. Curabitur ultricies sem in dui eleifend, at aliquam sapien adipiscing. Aliquam erat volutpat. Maecenas felis eros, posuere quis placerat a, imperdiet ac lectus. Phasellus volutpat lorem sed nulla vehicula pulvinar. Pellentesque ipsum ante, posuere id eros non, vehicula commodo augue. Proin vitae tempor lectus, at commodo elit. Donec luctus commodo erat. Curabitur faucibus, arcu tincidunt vehicula rutrum, quam turpis hendrerit sapien, nec vehicula est est ut turpis.

Suspendisse elementum ligula nibh. Nullam interdum tempor metus sed ultrices. Proin nec venenatis tellus. Donec non tortor at ipsum ultrices sagittis. Integer lectus augue, lacinia quis ante iaculis, iaculis volutpat odio. Fusce porttitor quis nisi vitae condimentum. Nam luctus placerat fringilla. Praesent vulputate aliquet convallis. Nunc vel sagittis sem. Vestibulum vitae ante a ipsum pulvinar faucibus pulvinar ac nulla. Morbi mattis nulla et dui egestas, vitae volutpat nisi pretium. Ut ullamcorper ac orci nec lacinia. Proin ac condimentum diam. Nulla blandit, tellus sit amet volutpat suscipit, purus eros iaculis odio, in euismod nulla nisl at urna. Aliquam erat volutpat. Pellentesque hendrerit dui eget lobortis congue.

Etiam condimentum adipiscing sollicitudin. Curabitur at rhoncus sem. Donec dignissim, erat sodales malesuada fringilla, metus est vehicula nulla, nec volutpat lacus neque ut libero. Suspendisse potenti. Nam vel facilisis massa. Morbi eget quam urna. Suspendisse quis lacus eget justo placerat pulvinar sit amet a nunc. Cras porta magna nec risus feugiat, pharetra rhoncus mauris convallis. Integer pretium dolor massa, a consectetur velit laoreet sed. Nunc rutrum convallis orci, sit amet congue sapien iaculis at.

Etiam leo nibh, ultricies eget dictum non, euismod nec quam. Cras luctus mauris odio, in dapibus risus rhoncus et. Integer ullamcorper elit neque. Nam vel nisl sit amet nunc gravida laoreet. Suspendisse sed neque id nulla tempus laoreet. Aliquam interdum lorem quis erat lacinia, in congue velit euismod. Morbi sit amet viverra dolor, lacinia pretium massa. Proin eu rutrum augue, sit amet condimentum enim. Pellentesque sodales, justo quis gravida lacinia, nulla dolor accumsan sapien, non hendrerit urna dui quis nibh. In posuere non elit eu hendrerit.

Nulla eget justo ultrices tellus tristique cursus. Maecenas in sem et tellus pulvinar rhoncus quis ac urna. Vestibulum imperdiet nisl nibh, at suscipit mi varius eu. Vestibulum adipiscing tellus sed ipsum vehicula, vitae convallis felis ornare. Sed commodo varius adipiscing. Pellentesque eget magna diam. Etiam ac ante ligula. Proin mattis quis odio id placerat. Nam luctus, sapien rhoncus iaculis elementum, diam magna condimentum velit, eu pellentesque orci tortor eget dui. Fusce adipiscing feugiat nunc, ac iaculis lorem ultrices sit amet. Proin vel felis eget nulla consectetur congue vel sed sapien. Morbi sed aliquam neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. In volutpat velit ut est sodales, eget porttitor massa faucibus.

Nunc vel fermentum augue, vitae convallis metus. Pellentesque accumsan ipsum nec condimentum pharetra. Quisque id nisi egestas, ultrices mi nec, faucibus orci. Aenean aliquam, ipsum lobortis tristique facilisis, neque purus commodo est, semper semper nunc metus quis ligula. Praesent faucibus est vel quam eleifend, a accumsan diam tempus. Integer pellentesque rhoncus vehicula. Donec sit amet mollis sem. Vivamus et ipsum at justo iaculis imperdiet a vel felis. Morbi felis augue, condimentum sit amet ligula et, mollis adipiscing purus. In vulputate nibh nec mattis fermentum. In ornare felis in aliquam cursus. Suspendisse magna mi, vehicula ut egestas eu, egestas non eros. Nunc non sem massa. Pellentesque mattis, lacus sit amet luctus scelerisque, lacus est ultricies erat, ut tincidunt nisl orci id leo. Maecenas ut massa volutpat, aliquet odio placerat, luctus massa. Ut sed odio tincidunt, luctus arcu in, dictum leo.

+ 39
- 0
test/lua/test_rsa.lua View File

@@ -0,0 +1,39 @@
-- Test rsa signing

local pubkey = 'testkey.pub'
local privkey = 'testkey'
local data = 'test.data'
local signature = 'test.sig'

-- Signing test
local rsa_key = rsa_privkey.load(string.format('%s/%s', test_dir, privkey))

if not rsa_key then
return -1
end

local rsa_sig = rsa.sign_file(rsa_key, string.format('%s/%s', test_dir, data))

if not rsa_sig then
return -1
end

rsa_sig:save(string.format('%s/%s', test_dir, signature), true)

-- Verifying test
rsa_key = rsa_pubkey.load(string.format('%s/%s', test_dir, pubkey))

if not rsa_key then
return -1
end

rsa_sig = rsa_signature.load(string.format('%s/%s', test_dir, signature))

if not rsa_sig then
return -1
end

if not rsa.verify_file(rsa_key, rsa_sig, string.format('%s/%s', test_dir, data)) then
return -1
end


+ 27
- 0
test/lua/testkey View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAxUYMGsqMbNZl4vw65AfivuC5rXDzbvP8zqj96L8t9M/2bV7D
f1k4Pit+TKBczhs3HolQStq46AmrhoyNbLJxyaA8g+8ETXOhHzQUR74ud/xQaPqx
02E02kbR3LnQTp/wdrJARMAB8CsPm8X2wrpFCRus+DMdDGWQXV3RFc0FbeYFMehn
46k3+5dB96Y3Wh4cK3/aS2zpR2ddynN6vBaWsSTNfadGbUtIodZgl50ecdyVeExm
L/H9HWhcafcNJVUeI0jd79Px90puB1auK6fuMVinDv2zJL3HIbz3qUTRAlVHdmph
f/UoRq0hkZmnbTR0v9eC0FDwJV/XKspicJbv1QIDAQABAoIBAEmUQteLTK0bmoz6
/wwmVNBVCWxDgMiVgGmkZm/1PrLdDlDk044gPPYTStxRw8usIvbkyGnjAqypTqy0
p9svA3nspiWfdL9erW3yAs5vhO2D0ooVV1Y8H3Z6i7QEKknpJctf2NDLvO1TYlL7
l3ox96XaCL3acq85AouQfnffLHM8e0sCj5zc2gDIAz2Vjh5eTR0qIPHNxVL1xeD0
KGnhTz4WveHraoa3ARzB+fDskilLSdCHrvn8SjaotlFwcSIHVc6ymutBxC/wFIu9
0O6YamR6b8J1smkVyi+UcIGrXfeLndm3t5jLhmhMJC9D350XhFRLKfoGSTweD1r7
yGFgDtECgYEA/PRzBeZIcydKQDuFsrItMwrtno0xA9WOJMbKx1QXggX907lJqyZI
CjeP8GLO7YgXxibHuH8HUC9dy8K33GyZ9YjLkg3f3DZwSUIHwJhKvTbYHDs53oeZ
4Py5HrDRXYuIZJMpWUCJYEmRsiG1aNL1rTI1V6BrqjUuvu6BXAjKunMCgYEAx6YA
Ly5i6s7Vcp2/Sm1p+6YhOr0IVjWeJYxJzUYhQKk/EEw/pjsOuVPqH2ikGXnnIOIn
jveNwfhxEFEL+MU1vEAVOHegDlzP4AdDUSXYV61UN+oJPGRqtByROyR6/s6hbhRr
HpzOhzndg61N3XzN80pG56UwhLVs1nRjIVRlspcCgYAIkY9D5+UUYYRWYK3Ku9Zk
ID6kXEwIwTcrb8B2uBaDxQgwH9qq/YT7M56gmfhAe5eykqW5TjRFNxWKTXJE+TjN
5HBg5i9rGjz7fk0c7Qu7FRyE+EyhiR5hTK5Ip9yvuoZIQePorhL5PAS/b/zhLCQ+
VbEQ4tJC1cJbnWCsaW/UmQKBgQCH8Xe0qMBAJKBg0BseAcylxuRfi7HuicnqxVDH
jtY7okLHxTOd7B7FgOctheIfWstPr87B4bzL9HCAbL9bIGXLjlMkxQfeX8JISInE
6qEaanKrNBgf4Dxr8fvOKrP5ZxeyzgJ2sM1MdNFpxQr9IutVmyEWwHt+Ec9PY6bQ
Xhh1dwKBgBAGqEz10PnWmJWYylP1wgxNSltS3kGQWP/vqsL7xo4NV0TOYbsu8Iun
MvLD3C5sSqTD7ycOiweglIFLaZCWtKEp+01WiEsceQ6G9mZ131Zb1uzdp+fmykyi
IL7R1kM99vpYh0JMj9l8AyNeHG2MKxriOdcDiAOolVxCjYBlnsD0
-----END RSA PRIVATE KEY-----

+ 9
- 0
test/lua/testkey.pub View File

@@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxUYMGsqMbNZl4vw65Afi
vuC5rXDzbvP8zqj96L8t9M/2bV7Df1k4Pit+TKBczhs3HolQStq46AmrhoyNbLJx
yaA8g+8ETXOhHzQUR74ud/xQaPqx02E02kbR3LnQTp/wdrJARMAB8CsPm8X2wrpF
CRus+DMdDGWQXV3RFc0FbeYFMehn46k3+5dB96Y3Wh4cK3/aS2zpR2ddynN6vBaW
sSTNfadGbUtIodZgl50ecdyVeExmL/H9HWhcafcNJVUeI0jd79Px90puB1auK6fu
MVinDv2zJL3HIbz3qUTRAlVHdmphf/UoRq0hkZmnbTR0v9eC0FDwJV/XKspicJbv
1QIDAQAB
-----END PUBLIC KEY-----

Loading…
Cancel
Save