moonbridge

annotate moonbridge_websocket.c @ 139:f148bd2b3d05

Added moonbridge_io.h to Makefile; Added stub for moonbridge_websocket.c (with base64'd SHA-1)
author jbe
date Sat Apr 18 01:33:38 2015 +0200 (2015-04-18)
parents
children
rev   line source
jbe@139 1
jbe@139 2 #include <lua.h>
jbe@139 3 #include <lauxlib.h>
jbe@139 4 #include <lualib.h>
jbe@139 5
jbe@139 6 #include <sys/types.h>
jbe@139 7 #include <sha.h>
jbe@139 8
jbe@139 9 static int moonbr_ws_hsresp(lua_State *L) {
jbe@139 10 const char *challenge;
jbe@139 11 size_t challenge_len;
jbe@139 12 SHA_CTX context;
jbe@139 13 char digest[20];
jbe@139 14 static const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
jbe@139 15 char digest64[28];
jbe@139 16 int i, j;
jbe@139 17 int s = 0, b = 0;
jbe@139 18 challenge = luaL_checklstring(L, 1, &challenge_len);
jbe@139 19 SHA1_Init(&context);
jbe@139 20 SHA1_Update(&context, challenge, challenge_len);
jbe@139 21 SHA1_Update(&context, "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", 36);
jbe@139 22 SHA1_Final((unsigned char *)digest, &context);
jbe@139 23 for (i=0, j=0; i<20; i++) {
jbe@139 24 b = (b << 8) + (unsigned char)digest[i];
jbe@139 25 s += 8;
jbe@139 26 while (s >= 6) {
jbe@139 27 s -= 6;
jbe@139 28 digest64[j++] = alphabet[b >> s];
jbe@139 29 b &= (1<<s)-1;
jbe@139 30 }
jbe@139 31 }
jbe@139 32 digest64[26] = alphabet[b << 2];
jbe@139 33 digest64[27] = '=';
jbe@139 34 lua_pushlstring(L, digest64, 28);
jbe@139 35 return 1;
jbe@139 36 }
jbe@139 37
jbe@139 38 static const struct luaL_Reg moonbr_ws_module_funcs[] = {
jbe@139 39 {"hsresp", moonbr_ws_hsresp},
jbe@139 40 {NULL, NULL}
jbe@139 41 };
jbe@139 42
jbe@139 43 int luaopen_moonbridge_websocket(lua_State *L) {
jbe@139 44 lua_newtable(L); // module
jbe@139 45 luaL_setfuncs(L, moonbr_ws_module_funcs, 0);
jbe@139 46 return 1;
jbe@139 47
jbe@139 48 }
jbe@139 49

Impressum / About Us