X-Git-Url: https://git.librecmc.org/?p=oweals%2Fustream-ssl.git;a=blobdiff_plain;f=ustream-mbedtls.c;h=9f73c58360348fc62534ad69d696a71ed7c636dd;hp=9b22ad281174666f498045c187aa57f07e2dd3a7;hb=HEAD;hpb=5322f9db23b69fdc2b4760a6cfd67848a11818a4 diff --git a/ustream-mbedtls.c b/ustream-mbedtls.c index 9b22ad2..9f73c58 100644 --- a/ustream-mbedtls.c +++ b/ustream-mbedtls.c @@ -86,33 +86,43 @@ static int _urandom(void *ctx, unsigned char *out, size_t len) return 0; } -#define TLS_DEFAULT_CIPHERS \ - TLS_CIPHER(AES_128_GCM_SHA256) \ - TLS_CIPHER(AES_256_GCM_SHA384) \ - TLS_CIPHER(AES_128_CBC_SHA) \ - TLS_CIPHER(AES_256_CBC_SHA) \ - TLS_CIPHER(3DES_EDE_CBC_SHA) - -static const int default_ciphersuites_nodhe[] = +#define AES_GCM_CIPHERS(v) \ + MBEDTLS_TLS_##v##_WITH_AES_128_GCM_SHA256, \ + MBEDTLS_TLS_##v##_WITH_AES_256_GCM_SHA384 + +#define AES_CBC_CIPHERS(v) \ + MBEDTLS_TLS_##v##_WITH_AES_128_CBC_SHA, \ + MBEDTLS_TLS_##v##_WITH_AES_256_CBC_SHA + +#define AES_CIPHERS(v) \ + AES_GCM_CIPHERS(v), \ + AES_CBC_CIPHERS(v) + +static const int default_ciphersuites_server[] = { -#define TLS_CIPHER(v) \ - MBEDTLS_TLS_ECDHE_ECDSA_WITH_##v, \ - MBEDTLS_TLS_ECDHE_RSA_WITH_##v, \ - MBEDTLS_TLS_RSA_WITH_##v, - TLS_DEFAULT_CIPHERS -#undef TLS_CIPHER + MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, + AES_GCM_CIPHERS(ECDHE_ECDSA), + MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + AES_GCM_CIPHERS(ECDHE_RSA), + AES_CBC_CIPHERS(ECDHE_RSA), + AES_CIPHERS(RSA), 0 }; -static const int default_ciphersuites[] = +static const int default_ciphersuites_client[] = { -#define TLS_CIPHER(v) \ - MBEDTLS_TLS_ECDHE_ECDSA_WITH_##v, \ - MBEDTLS_TLS_ECDHE_RSA_WITH_##v, \ - MBEDTLS_TLS_DHE_RSA_WITH_##v, \ - MBEDTLS_TLS_RSA_WITH_##v, - TLS_DEFAULT_CIPHERS -#undef TLS_CIPHER + MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, + AES_GCM_CIPHERS(ECDHE_ECDSA), + MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + AES_GCM_CIPHERS(ECDHE_RSA), + MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + AES_GCM_CIPHERS(DHE_RSA), + AES_CBC_CIPHERS(ECDHE_ECDSA), + AES_CBC_CIPHERS(ECDHE_RSA), + AES_CBC_CIPHERS(DHE_RSA), + MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, + AES_CIPHERS(RSA), + MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA, 0 }; @@ -152,10 +162,12 @@ __ustream_ssl_context_new(bool server) mbedtls_ssl_conf_authmode(conf, MBEDTLS_SSL_VERIFY_NONE); mbedtls_ssl_conf_rng(conf, _urandom, NULL); - if (server) - mbedtls_ssl_conf_ciphersuites(conf, default_ciphersuites_nodhe); - else - mbedtls_ssl_conf_ciphersuites(conf, default_ciphersuites); + if (server) { + mbedtls_ssl_conf_ciphersuites(conf, default_ciphersuites_server); + mbedtls_ssl_conf_min_version(conf, MBEDTLS_SSL_MAJOR_VERSION_3, + MBEDTLS_SSL_MINOR_VERSION_3); + } else + mbedtls_ssl_conf_ciphersuites(conf, default_ciphersuites_client); #if defined(MBEDTLS_SSL_CACHE_C) mbedtls_ssl_conf_session_cache(conf, &ctx->cache, @@ -170,16 +182,9 @@ static void ustream_ssl_update_own_cert(struct ustream_ssl_ctx *ctx) if (!ctx->cert.version) return; - if (!ctx->server) { - mbedtls_ssl_conf_ca_chain(&ctx->conf, &ctx->cert, NULL); - return; - } - if (!ctx->key.pk_info) return; - if (ctx->cert.next) - mbedtls_ssl_conf_ca_chain(&ctx->conf, ctx->cert.next, NULL); mbedtls_ssl_conf_own_cert(&ctx->conf, &ctx->cert, &ctx->key); } @@ -220,6 +225,71 @@ __hidden int __ustream_ssl_set_key_file(struct ustream_ssl_ctx *ctx, const char return 0; } +__hidden int __ustream_ssl_set_ciphers(struct ustream_ssl_ctx *ctx, const char *ciphers) +{ + int *ciphersuites = NULL, *tmp, id; + char *cipherstr, *p, *last, c; + size_t len = 0; + + if (ciphers == NULL) + return -1; + + cipherstr = strdup(ciphers); + + if (cipherstr == NULL) + return -1; + + for (p = cipherstr, last = p;; p++) { + if (*p == ':' || *p == 0) { + c = *p; + *p = 0; + + id = mbedtls_ssl_get_ciphersuite_id(last); + + if (id != 0) { + tmp = realloc(ciphersuites, (len + 2) * sizeof(int)); + + if (tmp == NULL) { + free(ciphersuites); + free(cipherstr); + + return -1; + } + + ciphersuites = tmp; + ciphersuites[len++] = id; + ciphersuites[len] = 0; + } + + if (c == 0) + break; + + last = p + 1; + } + + /* + * mbedTLS expects cipher names with dashes while many sources elsewhere + * like the Firefox wiki or Wireshark specify ciphers with underscores, + * so simply convert all underscores to dashes to accept both notations. + */ + else if (*p == '_') { + *p = '-'; + } + } + + free(cipherstr); + + if (len == 0) + return -1; + + mbedtls_ssl_conf_ciphersuites(&ctx->conf, ciphersuites); + free(ctx->ciphersuites); + + ctx->ciphersuites = ciphersuites; + + return 0; +} + __hidden void __ustream_ssl_context_free(struct ustream_ssl_ctx *ctx) { #if defined(MBEDTLS_SSL_CACHE_C) @@ -229,6 +299,7 @@ __hidden void __ustream_ssl_context_free(struct ustream_ssl_ctx *ctx) mbedtls_x509_crt_free(&ctx->ca_cert); mbedtls_x509_crt_free(&ctx->cert); mbedtls_ssl_config_free(&ctx->conf); + free(ctx->ciphersuites); free(ctx); }