32 #include <openssl/bio.h>
33 #include <openssl/ssl.h>
34 #include <openssl/err.h>
35 #include <openssl/x509v3.h>
40 #define DTLS_HANDSHAKE_TIMEOUT_US 30000000
49 if (!pkey || !
out || !out_sz)
52 if (!(mem = BIO_new(BIO_s_mem())))
76 if (!cert || !
out || !out_sz)
79 if (!(mem = BIO_new(BIO_s_mem())))
82 if (!PEM_write_bio_X509(mem, cert))
101 unsigned char md[EVP_MAX_MD_SIZE];
105 if (X509_digest(cert, EVP_sha256(),
md, &n) != 1) {
107 ERR_error_string(ERR_get_error(),
NULL));
113 for (
int i = 0;
i < n - 1;
i++)
120 int ff_ssl_read_key_cert(
char *key_url,
char *cert_url,
char *key_buf,
size_t key_sz,
char *cert_buf,
size_t cert_sz,
char **fingerprint)
124 AVBPrint key_bp, cert_bp;
125 EVP_PKEY *pkey =
NULL;
139 if (!(key_b = BIO_new(BIO_s_mem()))) {
144 BIO_write(key_b, key_bp.str, key_bp.len);
145 pkey = PEM_read_bio_PrivateKey(key_b,
NULL,
NULL,
NULL);
159 if (!(cert_b = BIO_new(BIO_s_mem()))) {
164 BIO_write(cert_b, cert_bp.str, cert_bp.len);
202 #if OPENSSL_VERSION_NUMBER < 0x30000000L
203 EC_GROUP *ecgroup =
NULL;
204 EC_KEY *eckey =
NULL;
205 int curve = NID_X9_62_prime256v1;
207 const char *curve = SN_X9_62_prime256v1;
210 #if OPENSSL_VERSION_NUMBER < 0x30000000L
211 *pkey = EVP_PKEY_new();
215 eckey = EC_KEY_new();
217 EVP_PKEY_free(*pkey);
222 ecgroup = EC_GROUP_new_by_curve_name(curve);
228 if (EC_KEY_set_group(eckey, ecgroup) != 1) {
229 av_log(
NULL,
AV_LOG_ERROR,
"TLS: Generate private key, EC_KEY_set_group failed, %s\n", ERR_error_string(ERR_get_error(),
NULL));
233 if (EC_KEY_generate_key(eckey) != 1) {
234 av_log(
NULL,
AV_LOG_ERROR,
"TLS: Generate private key, EC_KEY_generate_key failed, %s\n", ERR_error_string(ERR_get_error(),
NULL));
238 if (EVP_PKEY_set1_EC_KEY(*pkey, eckey) != 1) {
239 av_log(
NULL,
AV_LOG_ERROR,
"TLS: Generate private key, EVP_PKEY_set1_EC_KEY failed, %s\n", ERR_error_string(ERR_get_error(),
NULL));
243 *pkey = EVP_EC_gen(curve);
245 av_log(
NULL,
AV_LOG_ERROR,
"TLS: Generate private key, EVP_EC_gen curve=%s failed, %s\n", curve, ERR_error_string(ERR_get_error(),
NULL));
253 EVP_PKEY_free(*pkey);
256 #if OPENSSL_VERSION_NUMBER < 0x30000000L
257 EC_GROUP_free(ecgroup);
265 int ret = 0, expire_day;
267 const char *aor =
"lavf";
268 X509_NAME* subject =
NULL;
275 subject = X509_NAME_new();
281 if (ASN1_INTEGER_set_uint64(X509_get_serialNumber(*cert), serial) != 1) {
286 if (X509_NAME_add_entry_by_txt(subject,
"CN", MBSTRING_ASC, aor, strlen(aor), -1, 0) != 1) {
291 if (X509_set_issuer_name(*cert, subject) != 1) {
295 if (X509_set_subject_name(*cert, subject) != 1) {
301 if (!X509_gmtime_adj(X509_get_notBefore(*cert), 0)) {
305 if (!X509_gmtime_adj(X509_get_notAfter(*cert), 60*60*24*expire_day)) {
310 if (X509_set_version(*cert, 2) != 1) {
315 if (X509_set_pubkey(*cert, pkey) != 1) {
320 if (!X509_sign(*cert, pkey, EVP_sha256())) {
340 X509_NAME_free(subject);
347 EVP_PKEY *pkey =
NULL;
376 BIO *mem = BIO_new_mem_buf(pem_str, -1);
382 EVP_PKEY *pkey =
NULL;
391 is_priv ?
"private" :
"public");
407 BIO *mem = BIO_new_mem_buf(pem_str, -1);
442 int r2 = ERR_get_error();
444 ERR_error_string_n(r2,
c->error_message,
sizeof(
c->error_message));
446 c->error_message[0] =
'\0';
449 return c->error_message;
458 c->tls_shared.udp = sock;
460 c->tls_shared.tcp = sock;
468 const char*
dst =
"EXTRACTOR-dtls_srtp";
471 ret = SSL_export_keying_material(
c->ssl, dtls_srtp_materials, materials_sz,
485 int err = SSL_get_error(
c->ssl,
ret);
486 if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
489 while ((e = ERR_get_error()) != 0) {
508 SSL_shutdown(
c->ssl);
512 SSL_CTX_free(
c->ctx);
513 if (!
c->tls_shared.external_sock)
514 ffurl_closep(
c->tls_shared.is_dtls ? &
c->tls_shared.udp : &
c->tls_shared.tcp);
515 if (
c->url_bio_method)
516 BIO_meth_free(
c->url_bio_method);
523 BIO_set_data(
b,
NULL);
537 int ret =
ffurl_read(
c->tls_shared.is_dtls ?
c->tls_shared.udp :
c->tls_shared.tcp, buf,
len);
539 if (
s->is_dtls &&
s->listen && !
c->dest_addr_len) {
553 BIO_clear_retry_flags(
b);
557 BIO_set_retry_read(
b);
569 BIO_clear_retry_flags(
b);
573 BIO_set_retry_write(
b);
581 if (cmd == BIO_CTRL_FLUSH) {
582 BIO_clear_retry_flags(
b);
597 c->url_bio_method = BIO_meth_new(BIO_TYPE_SOURCE_SINK,
"urlprotocol bio");
604 bio = BIO_new(
c->url_bio_method);
605 BIO_set_data(bio,
c);
607 SSL_set_bio(
c->ssl, bio, bio);
611 const char *method =
"undefined";
614 if (where & SSL_ST_CONNECT) {
615 method =
"SSL_connect";
616 }
else if (where & SSL_ST_ACCEPT)
617 method =
"SSL_accept";
619 if (where & SSL_CB_LOOP) {
621 method, SSL_state_string(ssl), SSL_state_string_long(ssl), where,
ret);
622 }
else if (where & SSL_CB_ALERT) {
623 method = (where & SSL_CB_READ) ?
"read":
"write";
625 method, SSL_state_string(ssl), SSL_state_string_long(ssl), where,
ret);
634 struct timeval timeout;
637 struct pollfd pfd = { .fd = sockfd, .events = POLLIN, .revents = 0 };
648 ret = SSL_do_handshake(
c->ssl);
653 err = SSL_get_error(
c->ssl,
ret);
654 if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE && err != SSL_ERROR_ZERO_RETURN) {
661 if (DTLSv1_get_timeout(
c->ssl, &timeout))
662 timeout_ms = timeout.tv_sec * 1000 + timeout.tv_usec / 1000;
664 ret = poll(&pfd, 1, timeout_ms);
665 if (
ret > 0 && (pfd.revents & POLLIN))
668 if (DTLSv1_handle_timeout(
c->ssl) < 0) {
680 if (SSL_is_init_finished(
c->ssl) != TLS_ST_OK)
695 EVP_PKEY *pkey =
NULL;
699 if (!SSL_CTX_load_verify_locations(
c->ctx,
s->ca_file,
NULL))
702 if (!SSL_CTX_set_default_verify_paths(
c->ctx)) {
710 ret = SSL_CTX_use_certificate_chain_file(
c->ctx,
s->cert_file);
717 }
else if (
s->cert_buf) {
719 if (SSL_CTX_use_certificate(
c->ctx, cert) != 1) {
727 ret = SSL_CTX_use_PrivateKey_file(
c->ctx,
s->key_file, SSL_FILETYPE_PEM);
734 }
else if (
s->key_buf) {
736 if (SSL_CTX_use_PrivateKey(
c->ctx, pkey) != 1) {
743 if (
s->listen && !
s->cert_file && !
s->cert_buf && !
s->key_file && !
s->key_buf) {
754 if (SSL_CTX_use_certificate(
c->ctx, cert) != 1) {
760 if (SSL_CTX_use_PrivateKey(
c->ctx, pkey) != 1) {
785 if (!
c->tls_shared.external_sock) {
792 c->ctx = SSL_CTX_new(
s->listen ? DTLS_server_method() : DTLS_client_method());
803 SSL_CTX_set_verify(
c->ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
NULL);
810 const char*
profiles =
"SRTP_AES128_CM_SHA1_80";
811 if (SSL_CTX_set_tlsext_use_srtp(
c->ctx,
profiles)) {
820 c->ssl = SSL_new(
c->ctx);
826 if (!
s->listen && !
s->numerichost)
827 SSL_set_tlsext_host_name(
c->ssl,
s->host);
830 SSL_set_ex_data(
c->ssl, 0,
c);
839 SSL_set_options(
c->ssl, SSL_OP_NO_QUERY_MTU);
840 SSL_set_mtu(
c->ssl,
s->mtu);
841 DTLS_set_link_mtu(
c->ssl,
s->mtu);
846 SSL_set_accept_state(
c->ssl);
848 SSL_set_connect_state(
c->ssl);
851 if (!
c->tls_shared.external_sock) {
881 c->ctx = SSL_CTX_new(
s->listen ? TLS_server_method() : TLS_client_method());
887 if (!SSL_CTX_set_min_proto_version(
c->ctx, TLS1_VERSION)) {
896 SSL_CTX_set_verify(
c->ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
NULL);
897 c->ssl = SSL_new(
c->ctx);
903 SSL_set_ex_data(
c->ssl, 0,
c);
906 if (!
s->listen && !
s->numerichost) {
908 SSL_set_hostflags(
c->ssl, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
909 if (!SSL_set1_host(
c->ssl,
s->host)) {
915 if (!SSL_set_tlsext_host_name(
c->ssl,
s->host)) {
921 ret =
s->listen ? SSL_accept(
c->ssl) : SSL_connect(
c->ssl);
926 }
else if (
ret < 0) {
966 const size_t mtu_size = DTLS_get_data_mtu(
c->ssl);