jbe@139: jbe@139: #include jbe@139: #include jbe@139: #include jbe@139: jbe@139: #include jbe@139: #include jbe@139: jbe@139: static int moonbr_ws_hsresp(lua_State *L) { jbe@139: const char *challenge; jbe@139: size_t challenge_len; jbe@139: SHA_CTX context; jbe@139: char digest[20]; jbe@139: static const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; jbe@139: char digest64[28]; jbe@139: int i, j; jbe@139: int s = 0, b = 0; jbe@139: challenge = luaL_checklstring(L, 1, &challenge_len); jbe@139: SHA1_Init(&context); jbe@139: SHA1_Update(&context, challenge, challenge_len); jbe@139: SHA1_Update(&context, "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", 36); jbe@139: SHA1_Final((unsigned char *)digest, &context); jbe@139: for (i=0, j=0; i<20; i++) { jbe@139: b = (b << 8) + (unsigned char)digest[i]; jbe@139: s += 8; jbe@139: while (s >= 6) { jbe@139: s -= 6; jbe@139: digest64[j++] = alphabet[b >> s]; jbe@139: b &= (1<