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 |