diff --git a/app/modules/crypto.c b/app/modules/crypto.c index f8c89697..fc203d12 100644 --- a/app/modules/crypto.c +++ b/app/modules/crypto.c @@ -39,12 +39,13 @@ static int crypto_sha1( lua_State* L ) static const char* bytes64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** - * encoded = crypto.base64_encode(raw) + * encoded = crypto.base64Encode(raw) * * Encodes raw binary string as base64 string. */ static int crypto_base64_encode( lua_State* L ) { + // TODO: figure out signature of base64_encode in rom and use that instead. int len; const char* msg = luaL_checklstring(L, 1, &len); int blen = (len + 2) / 3 * 4; @@ -64,6 +65,47 @@ static int crypto_base64_encode( lua_State* L ) return 1; } +static const char* byteshex = "0123456789abcdef"; +/** + * encoded = crypto.hexEncode(raw) + * + * Encodes raw binary string as hex string. + */ +static int crypto_hex_encode( lua_State* L) +{ + int len; + const char* msg = luaL_checklstring(L, 1, &len); + char* out = (char*)c_malloc(len * 2); + int i, j = 0; + for (i = 0; i < len; i++) { + out[j++] = byteshex[msg[i] >> 4]; + out[j++] = byteshex[msg[i] & 0xf]; + } + lua_pushlstring(L, out, len*2); + c_free(out); + return 1; +} + +/** + * masked = crypto.mask(message, mask) + * + * Apply a mask (repeated if shorter than message) as XOR to each byte. + */ +static int crypto_mask( lua_State* L ) +{ + int len, mask_len; + const char* msg = luaL_checklstring(L, 1, &len); + const char* mask = luaL_checklstring(L, 2, &mask_len); + int i; + char* copy = (char*)c_malloc(len); + for (i = 0; i < len; i++) { + copy[i] = msg[i] ^ mask[i % 4]; + } + lua_pushlstring(L, copy, len); + c_free(copy); + return 1; +} + // Module function map #define MIN_OPT_LEVEL 2 #include "lrodefs.h" @@ -71,6 +113,9 @@ const LUA_REG_TYPE crypto_map[] = { { LSTRKEY( "sha1" ), LFUNCVAL( crypto_sha1 ) }, { LSTRKEY( "base64Encode" ), LFUNCVAL( crypto_base64_encode ) }, + { LSTRKEY( "hexEncode" ), LFUNCVAL( crypto_hex_encode ) }, + { LSTRKEY( "mask" ), LFUNCVAL( crypto_mask ) }, + #if LUA_OPTIMIZE_MEMORY > 0 #endif