diff options
Diffstat (limited to 'ws/libs/wsServer/include')
| -rw-r--r-- | ws/libs/wsServer/include/base64.h | 19 | ||||
| -rw-r--r-- | ws/libs/wsServer/include/sha1.h | 73 | ||||
| -rw-r--r-- | ws/libs/wsServer/include/utf8.h | 37 | ||||
| -rw-r--r-- | ws/libs/wsServer/include/ws.h | 337 |
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 */ |
