summaryrefslogtreecommitdiff
path: root/ws/libs/wsServer/include
diff options
context:
space:
mode:
Diffstat (limited to 'ws/libs/wsServer/include')
-rw-r--r--ws/libs/wsServer/include/base64.h19
-rw-r--r--ws/libs/wsServer/include/sha1.h73
-rw-r--r--ws/libs/wsServer/include/utf8.h37
-rw-r--r--ws/libs/wsServer/include/ws.h337
4 files changed, 466 insertions, 0 deletions
diff --git a/ws/libs/wsServer/include/base64.h b/ws/libs/wsServer/include/base64.h
new file mode 100644
index 0000000..5ea7f13
--- /dev/null
+++ b/ws/libs/wsServer/include/base64.h
@@ -0,0 +1,19 @@
+/*
+ * Base64 encoding/decoding (RFC1341)
+ * Copyright (c) 2005, Jouni Malinen <j@w1.fi>
+ *
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
+ */
+
+#ifndef BASE64_H
+#define BASE64_H
+
+#include <sys/types.h>
+
+unsigned char * base64_encode(const unsigned char *src, size_t len,
+ size_t *out_len);
+unsigned char * base64_decode(const unsigned char *src, size_t len,
+ size_t *out_len);
+
+#endif /* BASE64_H */
diff --git a/ws/libs/wsServer/include/sha1.h b/ws/libs/wsServer/include/sha1.h
new file mode 100644
index 0000000..eb51ed5
--- /dev/null
+++ b/ws/libs/wsServer/include/sha1.h
@@ -0,0 +1,73 @@
+/*
+ * sha1.h
+ *
+ * Description:
+ * This is the header file for code which implements the Secure
+ * Hashing Algorithm 1 as defined in FIPS PUB 180-1 published
+ * April 17, 1995.
+ *
+ * Many of the variable names in this code, especially the
+ * single character names, were used because those were the names
+ * used in the publication.
+ *
+ * Please read the file sha1.c for more information.
+ *
+ */
+
+#ifndef _SHA1_H_
+#define _SHA1_H_
+
+#include <stdint.h>
+/*
+ * If you do not have the ISO standard stdint.h header file, then you
+ * must typdef the following:
+ * name meaning
+ * uint32_t unsigned 32 bit integer
+ * uint8_t unsigned 8 bit integer (i.e., unsigned char)
+ * int_least16_t integer of >= 16 bits
+ *
+ */
+
+#ifndef _SHA_enum_
+#define _SHA_enum_
+enum
+{
+ shaSuccess = 0,
+ shaNull, /* Null pointer parameter */
+ shaInputTooLong, /* input data too long */
+ shaStateError /* called Input after Result */
+};
+#endif
+#define SHA1HashSize 20
+
+/*
+ * This structure will hold context information for the SHA-1
+ * hashing operation
+ */
+typedef struct SHA1Context
+{
+ uint32_t Intermediate_Hash[SHA1HashSize/4]; /* Message Digest */
+
+ uint32_t Length_Low; /* Message length in bits */
+ uint32_t Length_High; /* Message length in bits */
+
+ /* Index into message block array */
+ int_least16_t Message_Block_Index;
+ uint8_t Message_Block[64]; /* 512-bit message blocks */
+
+ int Computed; /* Is the digest computed? */
+ int Corrupted; /* Is the message digest corrupted? */
+} SHA1Context;
+
+/*
+ * Function Prototypes
+ */
+
+int SHA1Reset( SHA1Context *);
+int SHA1Input( SHA1Context *,
+ const uint8_t *,
+ unsigned int);
+int SHA1Result( SHA1Context *,
+ uint8_t Message_Digest[SHA1HashSize]);
+
+#endif
diff --git a/ws/libs/wsServer/include/utf8.h b/ws/libs/wsServer/include/utf8.h
new file mode 100644
index 0000000..b30a62b
--- /dev/null
+++ b/ws/libs/wsServer/include/utf8.h
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef UTF8_DECODE_H
+#define UTF8_DECODE_H
+
+ #include <inttypes.h>
+ #include <stddef.h>
+
+ /* UTF8 return state. */
+ #define UTF8_ACCEPT 0
+ #define UTF8_REJECT 1
+
+ extern int is_utf8(uint8_t* s);
+ extern int is_utf8_len(uint8_t *s, size_t len);
+ extern uint32_t is_utf8_len_state(uint8_t *s, size_t len, uint32_t state);
+
+#endif
diff --git a/ws/libs/wsServer/include/ws.h b/ws/libs/wsServer/include/ws.h
new file mode 100644
index 0000000..900d03b
--- /dev/null
+++ b/ws/libs/wsServer/include/ws.h
@@ -0,0 +1,337 @@
+/*
+ * Copyright (C) 2016-2022 Davidson Francis <davidsondfgl@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+ * @dir include/
+ * @brief wsServer include directory
+ *
+ * @file ws.h
+ * @brief wsServer constants and functions.
+ */
+#ifndef WS_H
+#define WS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ #include <stdbool.h>
+ #include <stdint.h>
+ #include <inttypes.h>
+
+ /**
+ * @name Global configurations
+ */
+ /**@{*/
+ /**
+ * @brief Max clients connected simultaneously.
+ */
+#ifndef MAX_CLIENTS
+ #define MAX_CLIENTS 8
+#endif
+
+ /**
+ * @name Key and message configurations.
+ */
+ /**@{*/
+ /**
+ * @brief Message buffer length.
+ */
+ #define MESSAGE_LENGTH 2048
+ /**
+ * @brief Maximum frame/message length.
+ */
+ #define MAX_FRAME_LENGTH (16*1024*1024)
+ /**
+ * @brief WebSocket key length.
+ */
+ #define WS_KEY_LEN 24
+ /**
+ * @brief Magic string length.
+ */
+ #define WS_MS_LEN 36
+ /**
+ * @brief Accept message response length.
+ */
+ #define WS_KEYMS_LEN (WS_KEY_LEN + WS_MS_LEN)
+ /**
+ * @brief Magic string.
+ */
+ #define MAGIC_STRING "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
+ /**@}*/
+
+ /**
+ * @name Handshake constants.
+ */
+ /**@{*/
+ /**
+ * @brief Alias for 'Sec-WebSocket-Key'.
+ */
+ #define WS_HS_REQ "Sec-WebSocket-Key"
+
+ /**
+ * @brief Handshake accept message length.
+ */
+ #define WS_HS_ACCLEN 130
+
+ /**
+ * @brief Handshake accept message.
+ */
+ #define WS_HS_ACCEPT \
+ "HTTP/1.1 101 Switching Protocols\r\n" \
+ "Upgrade: websocket\r\n" \
+ "Connection: Upgrade\r\n" \
+ "Sec-WebSocket-Accept: "
+ /**@}*/
+
+ /**
+ * @name Frame types.
+ */
+ /**@{*/
+ /**
+ * @brief Frame FIN.
+ */
+ #define WS_FIN 128
+
+ /**
+ * @brief Frame FIN shift
+ */
+ #define WS_FIN_SHIFT 7
+
+ /**
+ * @brief Continuation frame.
+ */
+ #define WS_FR_OP_CONT 0
+
+ /**
+ * @brief Text frame.
+ */
+ #define WS_FR_OP_TXT 1
+
+ /**
+ * @brief Binary frame.
+ */
+ #define WS_FR_OP_BIN 2
+
+ /**
+ * @brief Close frame.
+ */
+ #define WS_FR_OP_CLSE 8
+
+ /**
+ * @brief Ping frame.
+ */
+ #define WS_FR_OP_PING 0x9
+
+ /**
+ * @brief Pong frame.
+ */
+ #define WS_FR_OP_PONG 0xA
+
+ /**
+ * @brief Unsupported frame.
+ */
+ #define WS_FR_OP_UNSUPPORTED 0xF
+ /**@}*/
+
+ /**
+ * @name Close codes
+ */
+ /**@{*/
+ /**
+ * @brief Normal close
+ */
+ #define WS_CLSE_NORMAL 1000
+ /**
+ * @brief Protocol error
+ */
+ #define WS_CLSE_PROTERR 1002
+ /**@}*/
+ /**
+ * @brief Inconsistent message (invalid utf-8)
+ */
+ #define WS_CLSE_INVUTF8 1007
+
+ /**
+ * @name Connection states
+ */
+ /**@{*/
+ /**
+ * @brief Connection not established yet.
+ */
+ #define WS_STATE_CONNECTING 0
+ /**
+ * @brief Communicating.
+ */
+ #define WS_STATE_OPEN 1
+ /**
+ * @brief Closing state.
+ */
+ #define WS_STATE_CLOSING 2
+ /**
+ * @brief Closed.
+ */
+ #define WS_STATE_CLOSED 3
+ /**@}*/
+
+ /**
+ * @name Timeout util
+ */
+ /**@{*/
+ /**
+ * @brief Nanoseconds macro converter
+ */
+ #define MS_TO_NS(x) ((x)*1000000)
+ /**
+ * @brief Timeout in milliseconds.
+ */
+ #define TIMEOUT_MS (500)
+ /**@}*/
+
+ /**
+ * @name Handshake constants.
+ */
+ /**@{*/
+ /**
+ * @brief Debug
+ */
+ #ifdef VERBOSE_MODE
+ #define DEBUG(...) fprintf(stderr, __VA_ARGS__)
+ #else
+ #define DEBUG(...)
+ #endif
+ /**@}*/
+
+ #ifndef AFL_FUZZ
+ #define SEND(client,buf,len) send_all((client), (buf), (len), MSG_NOSIGNAL)
+ #define RECV(fd,buf,len) recv((fd)->client_sock, (buf), (len), 0)
+ #else
+ #define SEND(client,buf,len) write(fileno(stdout), (buf), (len))
+ #define RECV(fd,buf,len) read((fd)->client_sock, (buf), (len))
+ #endif
+
+ /* Opaque client connection type. */
+ typedef uint64_t ws_cli_conn_t;
+
+ /* Opaque server instance type. */
+ typedef struct ws_server ws_server_t;
+
+ /**
+ * @brief Get server context.
+ * Set when initializing `.context` in `struct ws_server`.
+ */
+ void *ws_get_server_context(ws_cli_conn_t client);
+
+ /**
+ * @brief Set connection context.
+ */
+ void ws_set_connection_context(ws_cli_conn_t client, void *ptr);
+
+ /**
+ * @brief Get connection context.
+ */
+ void *ws_get_connection_context(ws_cli_conn_t client);
+
+ /**
+ * @brief events Web Socket events types.
+ */
+ struct ws_events
+ {
+ /**
+ * @brief On open event, called when a new client connects.
+ */
+ void (*onopen)(ws_cli_conn_t client);
+ /**
+ * @brief On close event, called when a client disconnects.
+ */
+ void (*onclose)(ws_cli_conn_t client);
+ /**
+ * @brief On message event, called when a client sends a text
+ * or binary message.
+ */
+ void (*onmessage)(ws_cli_conn_t client,
+ const unsigned char *msg, uint64_t msg_size, int type);
+ };
+
+ /**
+ * @brief server Web Socket server parameters
+ */
+ struct ws_server
+ {
+ /**
+ * @brief Required hostname that the wsServer will bind to
+ */
+ const char *host;
+ /**
+ * @brief Listening port
+ */
+ uint16_t port;
+ /**
+ * @brief Whether if the ws_socket() should create a new thread
+ * and be non-blocking (1) or not (0).
+ */
+ int thread_loop;
+ /**
+ * @brief Ping timeout in milliseconds
+ */
+ uint32_t timeout_ms;
+ /**
+ * @brief Server events.
+ */
+ struct ws_events evs;
+ /**
+ * @brief Server context.
+ * Provided by the user, can be accessed via `ws_get_server_context` from `onopen`.
+ */
+ void* context;
+ };
+
+ /* Forward declarations. */
+
+ /* Internal usage. */
+ extern int get_handshake_accept(char *wsKey, unsigned char **dest);
+ extern int get_handshake_response(char *hsrequest, char **hsresponse);
+
+ /* External usage. */
+ extern char *ws_getaddress(ws_cli_conn_t client);
+ extern char *ws_getport(ws_cli_conn_t client);
+ extern int ws_sendframe(
+ ws_cli_conn_t client, const char *msg, uint64_t size, int type);
+ extern int ws_sendframe_bcast(
+ uint16_t port, const char *msg, uint64_t size, int type);
+ extern int ws_sendframe_txt(ws_cli_conn_t client, const char *msg);
+ extern int ws_sendframe_txt_bcast(uint16_t port, const char *msg);
+ extern int ws_sendframe_bin(ws_cli_conn_t client, const char *msg,
+ uint64_t size);
+ extern int ws_sendframe_bin_bcast(uint16_t port, const char *msg,
+ uint64_t size);
+ extern int ws_get_state(ws_cli_conn_t client);
+ extern int ws_close_client(ws_cli_conn_t client);
+ extern int ws_socket(struct ws_server *ws_srv);
+
+ /* Ping routines. */
+ extern void ws_ping(ws_cli_conn_t cid, int threshold);
+
+#ifdef AFL_FUZZ
+ extern int ws_file(struct ws_events *evs, const char *file);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* WS_H */