mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-27 12:26:24 +00:00
TLS API refactor
This commit is contained in:
1 parent
d9cbcb5fa8
commit
0613cc62f4
26 files changed
+1180
-1088
No files matched your search
+60
-27
@@ -16,6 +16,41 @@ static int s_num_tests = 0;
|
||||
|
||||
#define FETCH_BUF_SIZE (256 * 1024)
|
||||
|
||||
// Self-signed CA, CERT, KEY
|
||||
static const char *s_tls_ca =
|
||||
"-----BEGIN CERTIFICATE-----\n"
|
||||
"MIIBqjCCAU+gAwIBAgIUESoOPGqMhf9uarzblVFwzrQweMcwCgYIKoZIzj0EAwIw\n"
|
||||
"RDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50\n"
|
||||
"YTESMBAGA1UEAwwJVGVzdCBSb290MCAXDTIwMDUwOTIxNTE0NFoYDzIwNTAwNTA5\n"
|
||||
"MjE1MTQ0WjBEMQswCQYDVQQGEwJJRTEPMA0GA1UEBwwGRHVibGluMRAwDgYDVQQK\n"
|
||||
"DAdDZXNhbnRhMRIwEAYDVQQDDAlUZXN0IFJvb3QwWTATBgcqhkjOPQIBBggqhkjO\n"
|
||||
"PQMBBwNCAAQsq9ECZiSW1xI+CVBP8VDuUehVA166sR2YsnJ5J6gbMQ1dUCH/QvLa\n"
|
||||
"dBdeU7JlQcH8hN5KEbmM9BnZxMor6ussox0wGzAMBgNVHRMEBTADAQH/MAsGA1Ud\n"
|
||||
"DwQEAwIBrjAKBggqhkjOPQQDAgNJADBGAiEAnHFsAIwGQQyRL81B04dH6d86Iq0l\n"
|
||||
"fL8OKzndegxOaB0CIQCPwSIwEGFdURDqCC0CY2dnMrUGY5ZXu3hHCojZGS7zvg==\n"
|
||||
"-----END CERTIFICATE-----\n";
|
||||
|
||||
static const char *s_tls_cert =
|
||||
"-----BEGIN CERTIFICATE-----\n"
|
||||
"MIIBhzCCASygAwIBAgIUbnMoVd8TtWH1T09dANkK2LU6IUswCgYIKoZIzj0EAwIw\n"
|
||||
"RDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50\n"
|
||||
"YTESMBAGA1UEAwwJVGVzdCBSb290MB4XDTIwMDUwOTIxNTE0OVoXDTMwMDUwOTIx\n"
|
||||
"NTE0OVowETEPMA0GA1UEAwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD\n"
|
||||
"QgAEkuBGnInDN6l06zVVQ1VcrOvH5FDu9MC6FwJc2e201P8hEpq0Q/SJS2nkbSuW\n"
|
||||
"H/wBTTBaeXN2uhlBzMUWK790KKMvMC0wCQYDVR0TBAIwADALBgNVHQ8EBAMCA6gw\n"
|
||||
"EwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSQAwRgIhAPo6xx7LjCdZ\n"
|
||||
"QY133XvLjAgVFrlucOZHONFVQuDXZsjwAiEAzHBNligA08c5U3SySYcnkhurGg50\n"
|
||||
"BllCI0eYQ9ggp/o=\n"
|
||||
"-----END CERTIFICATE-----\n";
|
||||
|
||||
static const char *s_tls_key =
|
||||
"-----BEGIN PRIVATE KEY-----\n"
|
||||
"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQglNni0t9Dg9icgG8w\n"
|
||||
"kbfxWSS+TuNgbtNybIQXcm3NHpmhRANCAASS4EacicM3qXTrNVVDVVys68fkUO70\n"
|
||||
"wLoXAlzZ7bTU/yESmrRD9IlLaeRtK5Yf/AFNMFp5c3a6GUHMxRYrv3Qo\n"
|
||||
"-----END PRIVATE KEY-----\n";
|
||||
|
||||
|
||||
// Important: we use different port numbers for the Windows bug workaround. See
|
||||
// https://support.microsoft.com/en-ae/help/3039044/error-10013-wsaeacces-is-returned-when-a-second-bind-to-a-excluded-por
|
||||
|
||||
@@ -615,8 +650,6 @@ static void test_mqtt(void) {
|
||||
}
|
||||
|
||||
static void eh1(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
|
||||
struct mg_tls_opts *topts = (struct mg_tls_opts *) fn_data;
|
||||
if (ev == MG_EV_ACCEPT && topts != NULL) mg_tls_init(c, topts);
|
||||
if (ev == MG_EV_HTTP_MSG) {
|
||||
struct mg_http_message *hm = (struct mg_http_message *) ev_data;
|
||||
MG_INFO(("[%.*s %.*s] message len %d", (int) hm->method.len, hm->method.ptr,
|
||||
@@ -679,6 +712,7 @@ static void eh1(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
|
||||
struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;
|
||||
mg_ws_send(c, wm->data.ptr, wm->data.len, WEBSOCKET_OP_BINARY);
|
||||
}
|
||||
(void) fn_data;
|
||||
}
|
||||
|
||||
struct fetch_data {
|
||||
@@ -705,24 +739,23 @@ static int fetch(struct mg_mgr *mgr, char *buf, const char *url,
|
||||
const char *fmt, ...) {
|
||||
struct fetch_data fd = {buf, 0, 0};
|
||||
int i;
|
||||
struct mg_connection *c = mg_http_connect(mgr, url, fcb, &fd);
|
||||
struct mg_connection *c = NULL;
|
||||
va_list ap;
|
||||
ASSERT(c != NULL);
|
||||
if (mg_url_is_ssl(url)) {
|
||||
if (mgr->tls_ctx == NULL) {
|
||||
struct mg_tls_opts opts;
|
||||
struct mg_str host = mg_url_host(url);
|
||||
memset(&opts, 0, sizeof(opts));
|
||||
opts.ca = "./test/data/ca.pem";
|
||||
opts.client_ca = mg_str(CA_ISRG_ROOT_X1);
|
||||
if (strstr(url, "127.0.0.1") != NULL) {
|
||||
// Local connection, use self-signed certificates
|
||||
opts.ca = "./test/data/ss_ca.pem";
|
||||
opts.cert = "./test/data/ss_client.pem";
|
||||
} else {
|
||||
opts.srvname = host;
|
||||
opts.client_ca = mg_str(s_tls_ca);
|
||||
opts.server_cert = mg_str(s_tls_cert);
|
||||
opts.server_key = mg_str(s_tls_key);
|
||||
}
|
||||
mg_tls_init(c, &opts);
|
||||
if (c->tls == NULL) fd.closed = 1;
|
||||
mg_tls_ctx_init(mgr, &opts);
|
||||
if (mgr->tls_ctx == NULL) fd.closed = 1;
|
||||
}
|
||||
c = mg_http_connect(mgr, url, fcb, &fd);
|
||||
ASSERT(c != NULL);
|
||||
// c->is_hexdumping = 1;
|
||||
va_start(ap, fmt);
|
||||
mg_vprintf(c, fmt, &ap);
|
||||
@@ -1149,20 +1182,18 @@ static void test_http_404(void) {
|
||||
}
|
||||
|
||||
static void test_tls(void) {
|
||||
#if MG_ENABLE_MBEDTLS || MG_ENABLE_OPENSSL
|
||||
struct mg_tls_opts opts = {"./test/data/ss_ca.pem",
|
||||
NULL,
|
||||
"./test/data/ss_server.pem",
|
||||
"./test/data/ss_server.pem",
|
||||
NULL,
|
||||
{0, 0},
|
||||
NULL};
|
||||
#if MG_TLS
|
||||
struct mg_tls_opts opts = {};
|
||||
opts.client_ca = s_tls_ca;
|
||||
opts.server_cert = s_tls_cert;
|
||||
opts.server_key = s_tls_key;
|
||||
struct mg_mgr mgr;
|
||||
struct mg_connection *c;
|
||||
const char *url = "https://127.0.0.1:12347";
|
||||
char buf[FETCH_BUF_SIZE];
|
||||
mg_mgr_init(&mgr);
|
||||
c = mg_http_listen(&mgr, url, eh1, (void *) &opts);
|
||||
mg_tls_ctx_init(&mgr, &opts);
|
||||
c = mg_http_listen(&mgr, url, eh1, NULL);
|
||||
ASSERT(c != NULL);
|
||||
ASSERT(fetch(&mgr, buf, url, "GET /a.txt HTTP/1.0\n\n") == 200);
|
||||
// MG_INFO(("%s", buf));
|
||||
@@ -1194,10 +1225,13 @@ static void f3(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
|
||||
}
|
||||
|
||||
static void test_http_client(void) {
|
||||
struct mg_tls_opts opts = {0};
|
||||
struct mg_mgr mgr;
|
||||
struct mg_connection *c;
|
||||
struct mg_connection *c = NULL;
|
||||
int i, ok = 0;
|
||||
mg_mgr_init(&mgr);
|
||||
opts.client_ca = mg_str(CA_ISRG_ROOT_X2 CA_ISRG_ROOT_X1);
|
||||
mg_tls_ctx_init(&mgr, &opts);
|
||||
c = mg_http_connect(&mgr, "http://cesanta.com", f3, &ok);
|
||||
ASSERT(c != NULL);
|
||||
for (i = 0; i < 500 && ok <= 0; i++) mg_mgr_poll(&mgr, 10);
|
||||
@@ -1205,20 +1239,18 @@ static void test_http_client(void) {
|
||||
c->is_closing = 1;
|
||||
mg_mgr_poll(&mgr, 0);
|
||||
ok = 0;
|
||||
#if MG_ENABLE_MBEDTLS || MG_ENABLE_OPENSSL
|
||||
#if MG_TLS
|
||||
{
|
||||
const char *url = "https://cesanta.com";
|
||||
struct mg_str host = mg_url_host(url);
|
||||
struct mg_tls_opts opts = {
|
||||
"./test/data/ca.pem", NULL, NULL, NULL, NULL, host, NULL};
|
||||
c = mg_http_connect(&mgr, url, f3, &ok);
|
||||
ASSERT(c != NULL);
|
||||
mg_tls_init(c, &opts);
|
||||
for (i = 0; i < 1500 && ok <= 0; i++) mg_mgr_poll(&mgr, 1000);
|
||||
ASSERT(ok == 200);
|
||||
c->is_closing = 1;
|
||||
mg_mgr_poll(&mgr, 1);
|
||||
|
||||
#if 0
|
||||
// Test failed host validation
|
||||
ok = 0;
|
||||
opts.srvname = mg_str("dummy");
|
||||
@@ -1240,6 +1272,7 @@ static void test_http_client(void) {
|
||||
ASSERT(ok == 200);
|
||||
c->is_closing = 1;
|
||||
mg_mgr_poll(&mgr, 1);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in new issue
Block a user