#endif
#define SHA1_HASH_SIZE 20
-struct globals_s globals;
+struct ws_globals_s ws_globals;
#ifndef WSS_STANDALONE
OpenSSL_add_all_algorithms(); /* load & register cryptos */
SSL_load_error_strings(); /* load all error messages */
- globals.ssl_method = TLSv1_server_method(); /* create server instance */
- globals.ssl_ctx = SSL_CTX_new(globals.ssl_method); /* create context */
- assert(globals.ssl_ctx);
+ ws_globals.ssl_method = TLSv1_server_method(); /* create server instance */
+ ws_globals.ssl_ctx = SSL_CTX_new(ws_globals.ssl_method); /* create context */
+ assert(ws_globals.ssl_ctx);
/* set the local certificate from CertFile */
- SSL_CTX_use_certificate_file(globals.ssl_ctx, globals.cert, SSL_FILETYPE_PEM);
+ SSL_CTX_use_certificate_file(ws_globals.ssl_ctx, ws_globals.cert, SSL_FILETYPE_PEM);
/* set the private key from KeyFile */
- SSL_CTX_use_PrivateKey_file(globals.ssl_ctx, globals.key, SSL_FILETYPE_PEM);
+ SSL_CTX_use_PrivateKey_file(ws_globals.ssl_ctx, ws_globals.key, SSL_FILETYPE_PEM);
/* verify private key */
- if ( !SSL_CTX_check_private_key(globals.ssl_ctx) ) {
+ if ( !SSL_CTX_check_private_key(ws_globals.ssl_ctx) ) {
abort();
}
- SSL_CTX_set_cipher_list(globals.ssl_ctx, "HIGH:!DSS:!aNULL@STRENGTH");
+ SSL_CTX_set_cipher_list(ws_globals.ssl_ctx, "HIGH:!DSS:!aNULL@STRENGTH");
thread_setup();
}
unsigned char output[SHA1_HASH_SIZE] = "";
char b64[256] = "";
char respond[512] = "";
- issize_t bytes;
+ ssize_t bytes;
char *p, *e = 0;
if (wsh->sock == ws_sock_invalid) {
}
-issize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes)
+ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes)
{
- issize_t r;
+ ssize_t r;
int x = 0;
if (wsh->ssl) {
if (x >= 100) {
r = -1;
}
-
+
return r;
}
-issize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
+ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
{
size_t r;
wsh->sock = sock;
if (!ssl_ctx) {
- ssl_ctx = globals.ssl_ctx;
+ ssl_ctx = ws_globals.ssl_ctx;
}
if (close_sock) {
}
}
-issize_t ws_close(wsh_t *wsh, int16_t reason)
+ssize_t ws_close(wsh_t *wsh, int16_t reason)
{
if (wsh->down) {
}
-issize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data)
+ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data)
{
- issize_t need = 2;
+ ssize_t need = 2;
char *maskp;
again:
return ws_close(wsh, WS_PROTO_ERR);
}
- if ((wsh->datalen = ws_raw_read(wsh, wsh->buffer, 14)) < need) {
- if ((wsh->datalen += ws_raw_read(wsh, wsh->buffer + wsh->datalen, 14 - wsh->datalen)) < need) {
+ if ((wsh->datalen = ws_raw_read(wsh, wsh->buffer, 9)) < need) {
+ if ((wsh->datalen += ws_raw_read(wsh, wsh->buffer + wsh->datalen, 9 - wsh->datalen)) < need) {
/* too small - protocol err */
return ws_close(wsh, WS_PROTO_ERR);
}
wsh->plen = wsh->buffer[1] & 0x7f;
wsh->payload = &wsh->buffer[2];
-
+
if (wsh->plen == 127) {
uint64_t *u64;
need = (wsh->plen - (wsh->datalen - need));
- if ((need + wsh->datalen) > (issize_t)wsh->buflen) {
+ if (need < 0) {
+ /* invalid read - protocol err .. */
+ *oc = WSOC_CLOSE;
+ return ws_close(wsh, WS_PROTO_ERR);
+ }
+
+ if ((need + wsh->datalen) > (ssize_t)wsh->buflen) {
/* too big - Ain't nobody got time fo' dat */
*oc = WSOC_CLOSE;
return ws_close(wsh, WS_DATA_TOO_BIG);
wsh->rplen = wsh->plen - need;
while(need) {
- issize_t r = ws_raw_read(wsh, wsh->payload + wsh->rplen, need);
+ ssize_t r = ws_raw_read(wsh, wsh->payload + wsh->rplen, need);
if (r < 1) {
/* invalid read - protocol err .. */
}
if (mask && maskp) {
- issize_t i;
+ ssize_t i;
for (i = 0; i < wsh->datalen; i++) {
wsh->payload[i] ^= maskp[i % 4];
}
}
-issize_t ws_feed_buf(wsh_t *wsh, void *data, size_t bytes)
+ssize_t ws_feed_buf(wsh_t *wsh, void *data, size_t bytes)
{
if (bytes + wsh->wdatalen > wsh->buflen) {
return bytes;
}
-issize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc)
+ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc)
{
- issize_t r = 0;
+ ssize_t r = 0;
if (!wsh->wdatalen) {
return -1;
}
-issize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes)
+ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes)
{
uint8_t hdr[14] = { 0 };
size_t hlen = 2;
*u64 = htonl(bytes);
}
- if (ws_raw_write(wsh, (void *) &hdr[0], hlen) != (issize_t)hlen) {
+ if (ws_raw_write(wsh, (void *) &hdr[0], hlen) != (ssize_t)hlen) {
return -1;
}
- if (ws_raw_write(wsh, data, bytes) != (issize_t)bytes) {
+ if (ws_raw_write(wsh, data, bytes) != (ssize_t)bytes) {
return -2;
}
#include <errno.h>
//#include "sha1.h"
#include <openssl/ssl.h>
-#include <sofia-sip/su_types.h>
+
+#ifdef _MSC_VER
+#ifdef _WIN64
+#define WS_SSIZE_T __int64
+#elif _MSC_VER >= 1400
+#define WS_SSIZE_T __int32 __w64
+#else
+#define WS_SSIZE_T __int32
+#endif
+typedef WS_SSIZE_T ssize_t
+#endif
-struct globals_s {
+struct ws_globals_s {
const SSL_METHOD *ssl_method;
SSL_CTX *ssl_ctx;
char cert[512];
char key[512];
};
-extern struct globals_s globals;
+extern struct ws_globals_s ws_globals;
typedef int ws_socket_t;
#define ws_sock_invalid -1
char buffer[65536];
char wbuffer[65536];
size_t buflen;
- issize_t datalen;
- issize_t wdatalen;
+ ssize_t datalen;
+ ssize_t wdatalen;
char *payload;
- issize_t plen;
- issize_t rplen;
+ ssize_t plen;
+ ssize_t rplen;
SSL *ssl;
int handshake;
uint8_t down;
uint8_t close_sock;
} wsh_t;
-issize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);
-issize_t ws_feed_buf(wsh_t *wsh, void *data, size_t bytes);
+ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);
+ssize_t ws_feed_buf(wsh_t *wsh, void *data, size_t bytes);
-issize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes);
-issize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes);
-issize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data);
-issize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes);
+ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes);
+ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes);
+ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data);
+ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes);
int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock);
-issize_t ws_close(wsh_t *wsh, int16_t reason);
+ssize_t ws_close(wsh_t *wsh, int16_t reason);
void ws_destroy(wsh_t *wsh);
void init_ssl(void);
void deinit_ssl(void);