]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Feature] Now cryptobox lua API accepts rspamd text as input
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 3 May 2016 08:23:26 +0000 (09:23 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 3 May 2016 08:23:26 +0000 (09:23 +0100)
src/lua/lua_cryptobox.c

index 0c3fb303d0428936f057380bde4a78c8cca5f5cd..b95b1f2f6224d2ea06c0c4062e1b3a7276babcf1 100644 (file)
@@ -217,7 +217,7 @@ lua_cryptobox_pubkey_load (lua_State *L)
                }
        }
        else {
-               luaL_error (L, "bad input arguments");
+               return luaL_error (L, "bad input arguments");
        }
 
        return 1;
@@ -280,7 +280,7 @@ lua_cryptobox_pubkey_create (lua_State *L)
 
        }
        else {
-               luaL_error (L, "bad input arguments");
+               return luaL_error (L, "bad input arguments");
        }
 
        return 1;
@@ -343,7 +343,7 @@ lua_cryptobox_keypair_load (lua_State *L)
                }
        }
        else {
-               luaL_error (L, "bad input arguments");
+               return luaL_error (L, "bad input arguments");
        }
 
        return 1;
@@ -527,7 +527,7 @@ lua_cryptobox_signature_save (lua_State *L)
                }
        }
        else {
-               lua_pushboolean (L, FALSE);
+               return luaL_error (L, "invalid arguments");
        }
 
        return 1;
@@ -543,10 +543,23 @@ static gint
 lua_cryptobox_signature_create (lua_State *L)
 {
        rspamd_fstring_t *sig, **psig;
+       struct rspamd_lua_text *t;
        const gchar *data;
        gsize dlen;
 
-       data = luaL_checklstring (L, 1, &dlen);
+       if (lua_isuserdata (L, 1)) {
+               t = lua_check_text (L, 1);
+
+               if (!t) {
+                       return luaL_error (L, "invalid arguments");
+               }
+
+               data = t->start;
+               dlen = t->len;
+       }
+       else {
+               data = luaL_checklstring (L, 1, &dlen);
+       }
 
        if (data != NULL) {
                if (dlen == rspamd_cryptobox_signature_bytes (RSPAMD_CRYPTOBOX_MODE_25519)) {
@@ -557,7 +570,7 @@ lua_cryptobox_signature_create (lua_State *L)
                }
        }
        else {
-               luaL_error (L, "bad input arguments");
+               return luaL_error (L, "bad input arguments");
        }
 
        return 1;
@@ -616,7 +629,7 @@ lua_cryptobox_hash_create_keyed (lua_State *L)
                rspamd_lua_setclass (L, "rspamd{cryptobox_hash}", -1);
        }
        else {
-               luaL_error (L, "invalid arguments");
+               return luaL_error (L, "invalid arguments");
        }
 
        return 1;
@@ -632,15 +645,28 @@ lua_cryptobox_hash_update (lua_State *L)
 {
        rspamd_cryptobox_hash_state_t *h = lua_check_cryptobox_hash (L, 1);
        const gchar *data;
+       struct rspamd_lua_text *t;
        gsize len;
 
-       data = luaL_checklstring (L, 2, &len);
+       if (lua_isuserdata (L, 2)) {
+               t = lua_check_text (L, 2);
+
+               if (!t) {
+                       return luaL_error (L, "invalid arguments");
+               }
+
+               data = t->start;
+               len = t->len;
+       }
+       else {
+               data = luaL_checklstring (L, 2, &len);
+       }
 
        if (h && data) {
                rspamd_cryptobox_hash_update (h, data, len);
        }
        else {
-               luaL_error (L, "invalid arguments");
+               return luaL_error (L, "invalid arguments");
        }
 
        return 0;
@@ -666,7 +692,7 @@ lua_cryptobox_hash_hex (lua_State *L)
                lua_pushstring (L, out_hex);
        }
        else {
-               luaL_error (L, "invalid arguments");
+               return luaL_error (L, "invalid arguments");
        }
 
        return 1;
@@ -688,7 +714,7 @@ lua_cryptobox_hash_bin (lua_State *L)
                lua_pushlstring (L, out, sizeof (out));
        }
        else {
-               luaL_error (L, "invalid arguments");
+               return luaL_error (L, "invalid arguments");
        }
 
        return 1;
@@ -718,13 +744,27 @@ lua_cryptobox_verify_memory (lua_State *L)
 {
        struct rspamd_cryptobox_pubkey *pk;
        rspamd_fstring_t *signature;
+       struct rspamd_lua_text *t;
        const gchar *data;
        gsize len;
        gint ret;
 
        pk = lua_check_cryptobox_pubkey (L, 1);
        signature = lua_check_cryptobox_sign (L, 2);
-       data = luaL_checklstring (L, 3, &len);
+
+       if (lua_isuserdata (L, 3)) {
+               t = lua_check_text (L, 3);
+
+               if (!t) {
+                       return luaL_error (L, "invalid arguments");
+               }
+
+               data = t->start;
+               len = t->len;
+       }
+       else {
+               data = luaL_checklstring (L, 3, &len);
+       }
 
        if (pk != NULL && signature != NULL && data != NULL) {
                ret = rspamd_cryptobox_verify (signature->str, data, len,
@@ -738,7 +778,7 @@ lua_cryptobox_verify_memory (lua_State *L)
                }
        }
        else {
-               luaL_error (L, "invalid arguments");
+               return luaL_error (L, "invalid arguments");
        }
 
        return 1;
@@ -780,7 +820,7 @@ lua_cryptobox_verify_file (lua_State *L)
                }
        }
        else {
-               luaL_error (L, "invalid arguments");
+               return luaL_error (L, "invalid arguments");
        }
 
        if (map != NULL) {
@@ -802,16 +842,29 @@ lua_cryptobox_sign_memory (lua_State *L)
 {
        struct rspamd_cryptobox_keypair *kp;
        const gchar *data;
+       struct rspamd_lua_text *t;
        gsize len = 0;
        rspamd_fstring_t *sig, **psig;
 
        kp = lua_check_cryptobox_keypair (L, 1);
-       data = luaL_checklstring (L, 2, &len);
 
-       if (!kp || !data) {
-               luaL_error (L, "invalid arguments");
+       if (lua_isuserdata (L, 2)) {
+               t = lua_check_text (L, 2);
 
-               return 1;
+               if (!t) {
+                       return luaL_error (L, "invalid arguments");
+               }
+
+               data = t->start;
+               len = t->len;
+       }
+       else {
+               data = luaL_checklstring (L, 2, &len);
+       }
+
+
+       if (!kp || !data) {
+               return luaL_error (L, "invalid arguments");
        }
 
        sig = rspamd_fstring_sized_new (rspamd_cryptobox_signature_bytes (
@@ -847,9 +900,7 @@ lua_cryptobox_sign_file (lua_State *L)
        filename = luaL_checkstring (L, 2);
 
        if (!kp || !filename) {
-               luaL_error (L, "invalid arguments");
-
-               return 1;
+               return luaL_error (L, "invalid arguments");
        }
 
        data = rspamd_file_xmap (filename, PROT_READ, &len);