Skip to content

Commit 668fcde

Browse files
committed
dependency updates and bug fix tls implementation
- example `tcp-echo-server.c` now works in tls mode - remove most ssl/tls api out of main header file
1 parent 7b170e7 commit 668fcde

9 files changed

Lines changed: 4385 additions & 3894 deletions

File tree

CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
3030
find_package(raii QUIET)
3131
if(NOT raii_FOUND)
3232
FetchContent_Declare(raii
33-
URL https://github.com/zelang-dev/c-raii/archive/refs/tags/2.1.0.zip
34-
URL_MD5 e97338afb9360b320aecf74716be5fdc
33+
URL https://github.com/zelang-dev/c-raii/archive/refs/tags/2.1.1.zip
34+
URL_MD5 15c0497b21eb12960fbec91523df8b30
3535
)
3636
FetchContent_MakeAvailable(raii)
3737
endif()
@@ -48,8 +48,8 @@ endif()
4848
find_package(opentls QUIET)
4949
if(NOT opentls_FOUND)
5050
FetchContent_Declare(opentls
51-
URL https://github.com/zelang-dev/openTLS/archive/refs/tags/4.1.6.zip
52-
URL_MD5 25e2c2d820724473ff3ac053cb2ebb68
51+
URL https://github.com/zelang-dev/openTLS/archive/refs/tags/4.1.8.zip
52+
URL_MD5 e5f9f4b7ae0a2ed0939d954c9a698acd
5353
)
5454
if(WIN32)
5555
add_definitions(-DOPENSSL_MSVC_STATIC_RT=TRUE)

cert.pem

Lines changed: 4228 additions & 3731 deletions
Large diffs are not rendered by default.

examples/create-x509.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,19 @@ int uv_main(int argc, char **argv) {
1111
return 1;
1212
}
1313

14+
defer((func_t)EVP_PKEY_free, pkey);
1415
/* Generate the certificate. */
1516
puts("Generating x509 certificate..."CLR_LN);
1617
X509 *x509 = x509_self(pkey, NULL, NULL, name);
1718
if (!x509) {
1819
return 1;
1920
}
2021

22+
defer((func_t)X509_free, x509);
2123
/* Write the private key and certificate out to disk. */
2224
puts("Writing key and certificate to disk..."CLR_LN);
23-
if (x509_self_export(pkey, x509, name)) {
24-
puts("Success!");
25+
if (x509_pkey_write(pkey, x509)) {
26+
puts("Success!"CLR_LN);
2527
return 0;
2628
}
2729

examples/tcp-echo-server.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55

66
void new_connection(uv_stream_t *socket) {
77
string data = stream_read(socket);
8-
printf(CLR_LN"%s\n", data);
9-
if (data)
8+
if (data) {
109
stream_write(socket, data);
10+
stream_flush(socket);
11+
}
1112
}
1213

1314
int uv_main(int argc, char **argv) {

include/asio.h

Lines changed: 4 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ C_API tty_err_t *tty_err(void);
434434
C_API string stream_read(uv_stream_t *);
435435
C_API string stream_read_once(uv_stream_t *);
436436
C_API string stream_read_wait(uv_stream_t *);
437-
C_API int stream_write(uv_stream_t *, string_t text);
437+
C_API int stream_write(uv_stream_t *, string_t data);
438438
C_API int stream_shutdown(uv_stream_t *);
439439

440440
/*
@@ -456,6 +456,7 @@ C_API uv_stream_t *stream_connect_ex(uv_handle_type scheme, string_t address, in
456456
*
457457
* NOTE: Combines `uv_listen` and `uv_accept`. */
458458
C_API uv_stream_t *stream_listen(uv_stream_t *, int backlog);
459+
C_API int stream_flush(uv_stream_t *);
459460

460461
/*
461462
* Parse `address` separating `scheme`, `host`, and `port`.
@@ -539,6 +540,7 @@ C_API void queue_delete(future);
539540

540541
C_API uv_loop_t *asio_loop(void);
541542
C_API void_t asio_abort(void_t, int, routine_t *);
543+
C_API void asio_switch(routine_t *);
542544

543545
/* For displaying Cpu core count, library version, and OS system info from `uv_os_uname()`. */
544546
C_API string_t asio_uname(void);
@@ -564,18 +566,14 @@ C_API bool is_tty_err(void_t);
564566
C_API bool is_addrinfo(void_t);
565567
C_API bool is_nameinfo(void_t);
566568

567-
C_API bool is_promise(void_t);
568-
C_API bool is_future(void_t);
569-
570569
/* This library provides its own ~main~,
571570
which call this function as an coroutine! */
572571
C_API int uv_main(int, char **);
573572
C_API u32 delay(u32 ms);
574573

575574
typedef struct {
576-
volatile bool ready;
577-
size_t max;
578575
ssize_t status;
576+
size_t max;
579577
unsigned char *buf;
580578
routine_t *thread;
581579
} async_state;
@@ -585,57 +583,6 @@ C_API async_state *req_getasync_state(void_t);
585583

586584
C_API sockaddr_t *sockaddr(string_t host, int port);
587585

588-
#ifdef _WIN32
589-
#define _BIO_MODE_R(flags) (((flags) & PKCS7_BINARY) ? "rb" : "r")
590-
#define _BIO_MODE_W(flags) (((flags) & PKCS7_BINARY) ? "wb" : "w")
591-
#else
592-
#define _BIO_MODE_R(flags) "r"
593-
#define _BIO_MODE_W(flags) "w"
594-
#endif
595-
/* OpenSSL Certificate */
596-
typedef struct certificate_object ASIO_cert_t;
597-
598-
/* OpenSSL AsymmetricKey */
599-
typedef struct pkey_object ASIO_pkey_t;
600-
601-
/* OpenSSL Certificate Signing Request */
602-
typedef struct x509_request_object ASIO_req_t;
603-
604-
C_API bool is_pkey(void_t);
605-
C_API bool is_cert_req(void_t);
606-
C_API bool is_cert(void_t);
607-
608-
C_API string_t cert_file(void);
609-
C_API string_t pkey_file(void);
610-
C_API string_t csr_file(void);
611-
612-
C_API void ASIO_ssl_error(void);
613-
C_API void ASIO_ssl_init(void);
614-
615-
C_API ASIO_pkey_t *pkey_create(u32 num_pairs, ...);
616-
C_API ASIO_req_t *csr_create(EVP_PKEY *pkey, u32 num_pairs, ...);
617-
C_API ASIO_cert_t *x509_create(EVP_PKEY *pkey, u32 num_pairs, ...);
618-
619-
C_API X509* csr_sign(ASIO_req_t *,
620-
ASIO_cert_t *,
621-
ASIO_pkey_t *,
622-
int days,
623-
int serial,
624-
arrays_t options);
625-
626-
C_API X509 *x509_get(string_t file_path);
627-
C_API EVP_PKEY *pkey_get(string_t file_path);
628-
C_API string x509_str(X509 *cert, bool show_details);
629-
630-
C_API bool pkey_x509_export(EVP_PKEY *pkey, string_t path_noext);
631-
C_API bool csr_x509_export(X509_REQ *req, string_t path_noext);
632-
C_API bool cert_x509_export(X509 *cert, string_t path_noext);
633-
634-
C_API EVP_PKEY *rsa_pkey(int keylength);
635-
C_API X509 *x509_self(EVP_PKEY *pkey, string_t country, string_t org, string_t domain);
636-
C_API bool x509_self_export(EVP_PKEY *pkey, X509 *x509, string_t path_noext);
637-
638-
C_API void use_certificate(string path, u32 ctx_pairs, ...);
639586
#ifdef __cplusplus
640587
}
641588
#endif

include/async_tls.h

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,9 @@
88
#include <openssl/ossl_typ.h>
99
#include <stdbool.h>
1010
#include <tls.h>
11+
#include <rtypes.h>
1112
#include <uv.h>
1213

13-
// https://wiki.mozilla.org/Security/Server_Side_TLS
14-
// https://wiki.mozilla.org/index.php?title=Security/Server_Side_TLS&oldid=1080944
15-
// "Modern" compatibility ciphersuite
16-
#define ASYNC_TLS_CIPHERS "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK"
17-
18-
// According to SSL Labs, enabling TLS1.1 doesn't do any good...
19-
// Not 100% sure about its status in IE11 though.
20-
#define ASYNC_TLS_PROTOCOLS (TLS_PROTOCOLS_DEFAULT)
21-
2214
#ifdef __cplusplus
2315
extern "C" {
2416
#endif
@@ -28,6 +20,8 @@ typedef struct tls tls_s;
2820
typedef struct {
2921
uv_tcp_t *stream;
3022
tls_s *secure;
23+
unsigned flags;
24+
int err;
3125
void *data;
3226
char *buf;
3327
} async_tls_t;
@@ -40,9 +34,63 @@ char const *async_tls_error(async_tls_t *const socket);
4034

4135
char *async_tls_read(async_tls_t *const socket);
4236
ssize_t async_tls_write(async_tls_t *const socket, unsigned char const *const buf, size_t const len);
37+
int async_tls_flush(async_tls_t *const socket);
4338

4439
ssize_t async_read(uv_stream_t *const stream, unsigned char *const buf, size_t const max);
4540

41+
#ifdef _WIN32
42+
#define _BIO_MODE_R(flags) (((flags) & PKCS7_BINARY) ? "rb" : "r")
43+
#define _BIO_MODE_W(flags) (((flags) & PKCS7_BINARY) ? "wb" : "w")
44+
#else
45+
#define _BIO_MODE_R(flags) "r"
46+
#define _BIO_MODE_W(flags) "w"
47+
#endif
48+
/* OpenSSL Certificate */
49+
typedef struct certificate_object ASIO_cert_t;
50+
51+
/* OpenSSL AsymmetricKey */
52+
typedef struct pkey_object ASIO_pkey_t;
53+
54+
/* OpenSSL Certificate Signing Request */
55+
typedef struct x509_request_object ASIO_req_t;
56+
57+
C_API bool is_pkey(void_t);
58+
C_API bool is_cert_req(void_t);
59+
C_API bool is_cert(void_t);
60+
61+
C_API string_t cert_file(void);
62+
C_API string_t pkey_file(void);
63+
C_API string_t csr_file(void);
64+
65+
C_API void ASIO_ssl_error(void);
66+
C_API void ASIO_ssl_init(void);
67+
68+
C_API ASIO_pkey_t *pkey_create(u32 num_pairs, ...);
69+
C_API ASIO_req_t *csr_create(EVP_PKEY *pkey, u32 num_pairs, ...);
70+
C_API ASIO_cert_t *x509_create(EVP_PKEY *pkey, u32 num_pairs, ...);
71+
72+
C_API X509 *csr_sign(ASIO_req_t *,
73+
ASIO_cert_t *,
74+
ASIO_pkey_t *,
75+
int days,
76+
int serial,
77+
arrays_t options);
78+
79+
C_API X509 *x509_get(string_t file_path);
80+
C_API EVP_PKEY *pkey_get(string_t file_path);
81+
C_API string x509_str(X509 *cert, bool show_details);
82+
83+
C_API bool pkey_x509_export(EVP_PKEY *pkey, string_t path_noext);
84+
C_API bool csr_x509_export(X509_REQ *req, string_t path_noext);
85+
C_API bool cert_x509_export(X509 *cert, string_t path_noext);
86+
C_API bool x509_pkey_write(EVP_PKEY *pkey, X509 *x509);
87+
88+
C_API EVP_PKEY *rsa_pkey(int keylength);
89+
C_API X509 *x509_self(EVP_PKEY *pkey, string_t country, string_t org, string_t domain);
90+
C_API bool x509_self_export(EVP_PKEY *pkey, X509 *x509, string_t path_noext);
91+
92+
C_API void use_certificate(string path, u32 ctx_pairs, ...);
93+
4694
#ifdef __cplusplus
4795
}
4896
#endif

0 commit comments

Comments
 (0)