Unified · Split
| @@ -485,7 +485,6 @@ typedef struct TLSContext { · 484 unmodified lines | ||
| 485 | 485 | TLSShared tls_shared; |
| 486 | 486 | SSL_CTX *ctx; |
| 487 | 487 | SSL *ssl; |
| 488 | − EVP_PKEY *pkey; | |
| 489 | 488 | BIO_METHOD* url_bio_method; |
| 490 | 489 | int io_err; |
| 491 | 490 | char error_message[256]; |
| @@ -756,7 +755,7 @@ static av_cold int openssl_init_ca_key_cert(URLContext *h) · 264 unmodified lines | ||
| 756 | 755 | if (SSL_CTX_use_certificate(p->ctx, cert) != 1) { |
| 757 | 756 | av_log(p, AV_LOG_ERROR, "SSL: Init SSL_CTX_use_certificate failed, %s\n", openssl_get_error(p)); |
| 758 | 757 | ret = AVERROR(EINVAL); |
| 759 | − return ret; | |
| 758 | + goto fail; | |
| 760 | 759 | } |
| 761 | 760 | } |
| 762 | 761 | |
| @@ -769,15 +768,42 @@ static av_cold int openssl_init_ca_key_cert(URLContext *h) · 6 unmodified lines | ||
| 769 | 768 | goto fail; |
| 770 | 769 | } |
| 771 | 770 | } else if (c->key_buf) { |
| 772 | − p->pkey = pkey = pkey_from_pem_string(c->key_buf, 1); | |
| 771 | + pkey = pkey_from_pem_string(c->key_buf, 1); | |
| 773 | 772 | if (SSL_CTX_use_PrivateKey(p->ctx, pkey) != 1) { |
| 774 | 773 | av_log(p, AV_LOG_ERROR, "TLS: Init SSL_CTX_use_PrivateKey failed, %s\n", openssl_get_error(p)); |
| 775 | 774 | ret = AVERROR(EINVAL); |
| 776 | − return ret; | |
| 775 | + goto fail; | |
| 777 | 776 | } |
| 778 | 777 | } |
| 778 | + | |
| 779 | + if (c->listen && !c->cert_file && !c->cert_buf && !c->key_file && !c->key_buf) { | |
| 780 | + av_log(h, AV_LOG_VERBOSE, "No server certificate provided, using self-signed\n"); | |
| 781 | + | |
| 782 | + ret = openssl_gen_private_key(&pkey); | |
| 783 | + if (ret < 0) | |
| 784 | + goto fail; | |
| 785 | + | |
| 786 | + ret = openssl_gen_certificate(pkey, &cert, NULL); | |
| 787 | + if (ret < 0) | |
| 788 | + goto fail; | |
| 789 | + | |
| 790 | + if (SSL_CTX_use_certificate(p->ctx, cert) != 1) { | |
| 791 | + av_log(p, AV_LOG_ERROR, "SSL_CTX_use_certificate failed for self-signed cert, %s\n", openssl_get_error(p)); | |
| 792 | + ret = AVERROR(EINVAL); | |
| 793 | + goto fail; | |
| 794 | + } | |
| 795 | + | |
| 796 | + if (SSL_CTX_use_PrivateKey(p->ctx, pkey) != 1) { | |
| 797 | + av_log(p, AV_LOG_ERROR, "SSL_CTX_use_PrivateKey failed for self-signed cert, %s\n", openssl_get_error(p)); | |
| 798 | + ret = AVERROR(EINVAL); | |
| 799 | + goto fail; | |
| 800 | + } | |
| 801 | + } | |
| 802 | + | |
| 779 | 803 | ret = 0; |
| 780 | 804 | fail: |
| 805 | + X509_free(cert); | |
| 806 | + EVP_PKEY_free(pkey); | |
| 781 | 807 | return ret; |
| 782 | 808 | } |
| 783 | 809 | |
| @@ -894,7 +920,6 @@ static av_cold int dtls_close(URLContext *h) · 110 unmodified lines | ||
| 894 | 920 | SSL_CTX_free(ctx->ctx); |
| 895 | 921 | av_freep(&ctx->tls_shared.cert_buf); |
| 896 | 922 | av_freep(&ctx->tls_shared.key_buf); |
| 897 | − EVP_PKEY_free(ctx->pkey); | |
| 898 | 923 | return 0; |
| 899 | 924 | } |
| 900 | 925 | |