You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
1.9 KiB
C

#include <stdint.h>
#include <stdlib.h>
#include "lua.h"
#include "lauxlib.h"
#include "rc4.h"
#include <stdlib.h>
#define RC4_METATABLE "rc4_metatable"
#define RC4_BUFSIZE (4096) /* after wrap in lua string, is 4096 */
static int
lrc4(lua_State * L) {
size_t len;
const char * key = luaL_checklstring(L, 1, &len);
#if LUA_VERSION_NUM == 504
struct rc4_state * rc4 = (struct rc4_state *)lua_newuserdatauv(L, sizeof(*rc4), 0);
#else
struct rc4_state * rc4 = (struct rc4_state *)lua_newuserdata(L, sizeof(*rc4));
#endif
lua_pushvalue(L, 1);
lua_setuservalue(L, -2);
luaL_getmetatable(L, RC4_METATABLE);
lua_setmetatable(L, -2);
librc4_init(rc4, (uint8_t*)key, (int)len);
return 1;
}
static int
lreset(lua_State* L) {
size_t len;
struct rc4_state * rc4 = (struct rc4_state *)luaL_checkudata(L, 1, RC4_METATABLE);
lua_getuservalue(L, 1);
const char* key = luaL_checklstring(L, -1, &len);
librc4_init(rc4, (uint8_t*)key, (int)len);
return 0;
}
static int
lcrypt(lua_State * L) {
struct rc4_state * rc4 = (struct rc4_state *)luaL_checkudata(L, 1, RC4_METATABLE);
size_t len;
const char * data = luaL_checklstring(L, 2, &len);
uint8_t *buffer = (uint8_t *)malloc(len);
if(buffer) {
librc4_crypt(rc4, (const uint8_t*)data, buffer, (int)len);
lua_pushlstring(L, (const char*)buffer, len);
free(buffer);
return 1;
}
return 0;
}
int
luaopen_rc4_c(lua_State *L) {
luaL_checkversion(L);
if (luaL_newmetatable(L, RC4_METATABLE)) {
luaL_Reg rc4_mt[] = {
{ "crypt", lcrypt },
{ "reset", lreset },
{ NULL, NULL },
};
luaL_newlib(L, rc4_mt);
lua_setfield(L, -2, "__index");
}
lua_pop(L, 1);
luaL_Reg l[] = {
{ "rc4", lrc4 },
{ NULL, NULL },
};
luaL_newlib(L, l);
lua_pushinteger(L, 2);
lua_setfield(L, -2, "VERSION");
return 1;
}