From nobody Fri Oct 18 14:24:06 2024 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4XVRlq0XBRz5ZHZZ; Fri, 18 Oct 2024 14:24:07 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4XVRlp6Z0Rz4WrF; Fri, 18 Oct 2024 14:24:06 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1729261446; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Rfs1SiYB5Gpt+7DKNsv2pcbW2cGAIT5F0KTIQP5A8Ms=; b=tEEcJh090b1808zIHLB2dInJVCAW94KaQbLJORv+dR/TXVXfOibFk8pRtptZWTU3lvwh+i IWAts95wbIN6Aqxth4rVtouD2obaIlgc65S5vN/96YZSEteMtyFqiSKQEppchGmJSKhBZh Flau7Srz/y7vtSpx2Pol4EwPweeoc1nUONtzrXPKz8zftXEUOattmbKRxp+KHLGhG6whDh NRw/+sMzfX4rWqal5GgM0kpSkJco+GL3n9cVWwXhrYzs+XDmlCE2G0yHiBFvX2RWRUK9m/ /opbwGBb/NbPRjQqh2kvsA6QLaYqwOmW9gWyPuxFIuxEg/cyVHeWDvAHgbJqNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1729261446; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Rfs1SiYB5Gpt+7DKNsv2pcbW2cGAIT5F0KTIQP5A8Ms=; b=NNdVG68aBjSaxKJ83FYCqsTl3Nh0o1qtGhc0WkDjGS01NEFBC7ZNc0wIke5YuUFo/ChL3J dklVLRoODxTsrXKgJUUADYIaccasmbJJSMwIphEtRtHsXXlBjbuRJqmb4n5TfBJGJcZBvx 0jgNfyXiWfZIvCUiILjv8V9QWJ+mCDb5YZTXe0K9NWv4ZvykCoT1gbRKj5hf+RGXEAjpmD 1nS5hWsfQTluCGIJtmc2yIhed6xXTAZj9truDaS6LuHRx6AJXKkOVIUEBvs+8SF8n9+ngG TqUg1Q2E/qI3hEnSvNDwuArFloH1ELj9DnB647QtgcyKQWXlkrGyfgm1BBSgjA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1729261446; a=rsa-sha256; cv=none; b=JBCmwcWPphkpd7dtgQUzCr8Mc9bFiMuV+rNiaYpMkaPxTeBSSk9vypKfKDrjU3LqdpbSZj 0cHaKAsePjozt5PEbridnoJZjvvvH416aSxf7b2lsBEG5gU57jnKXf2yUBa40x/eK20eld E838M6eN0TOb9F0lSpSeFYMFD0MCNwjQb8FtWK4NT9g1EBk8rxi9yzRVx01+W3ZTacLKiU khH1RbNfe4KMKdhMNYksKxTMLa5VVLuXYoS62uZlmr/9c43/c83mwEpuzc5dmGXIV5Wux3 aWxXXtHdPKUY84IR5WJFuxY9RBDV+q3lgeLE5a3mSFQ5znODH589tiI3MMvvHA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4XVRlp695Dzd7K; Fri, 18 Oct 2024 14:24:06 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 49IEO6fX066388; Fri, 18 Oct 2024 14:24:06 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 49IEO6NK066385; Fri, 18 Oct 2024 14:24:06 GMT (envelope-from git) Date: Fri, 18 Oct 2024 14:24:06 GMT Message-Id: <202410181424.49IEO6NK066385@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Cy Schubert Subject: git: 0c2af19e78a0 - main - unbound: Remove testcode and testdata List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: cy X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 0c2af19e78a0a8dbbf305b74c944b5758578ea30 Auto-Submitted: auto-generated The branch main has been updated by cy: URL: https://cgit.FreeBSD.org/src/commit/?id=0c2af19e78a0a8dbbf305b74c944b5758578ea30 commit 0c2af19e78a0a8dbbf305b74c944b5758578ea30 Author: Cy Schubert AuthorDate: 2024-10-18 14:14:41 +0000 Commit: Cy Schubert CommitDate: 2024-10-18 14:14:41 +0000 unbound: Remove testcode and testdata The testcode and testdata directories are not used by FreeBSD. Remove them. MFC after: 1 week --- contrib/unbound/testcode/doqclient.c | 2701 -------------------- contrib/unbound/testcode/unitdoq.c | 84 - contrib/unbound/testdata/00-lint.tdir/00-lint.pre | 14 - .../09-unbound-control.tdir/conf.bad_credentials | 5 - .../conf.spoofed_credentials | 5 - .../09-unbound-control.tdir/view_local_data | 4 - .../09-unbound-control.tdir/view_local_data_remove | 4 - .../testdata/acl_interface.tdir/rpz-nx.zone | 3 - .../testdata/acl_interface.tdir/rpz-one.zone | 3 - .../testdata/acl_interface.tdir/rpz-two.zone | 3 - .../unbound/testdata/auth_tls.tdir/auth_tls.dsc | 16 - .../testdata/auth_tls.tdir/auth_tls.nsd.conf | 21 - .../unbound/testdata/auth_tls.tdir/auth_tls.post | 14 - .../unbound/testdata/auth_tls.tdir/auth_tls.pre | 47 - .../unbound/testdata/auth_tls.tdir/auth_tls.test | 48 - .../testdata/auth_tls.tdir/auth_tls.ub.conf | 22 - .../testdata/auth_tls.tdir/example.com.zone | 4 - .../unbound/testdata/auth_tls.tdir/nsd_server.key | 39 - .../unbound/testdata/auth_tls.tdir/nsd_server.pem | 22 - .../testdata/auth_tls.tdir/unbound_server.key | 39 - .../testdata/auth_tls.tdir/unbound_server.pem | 22 - .../auth_tls_failcert.tdir/auth_tls_failcert.dsc | 16 - .../auth_tls_failcert.nsd.conf | 21 - .../auth_tls_failcert.tdir/auth_tls_failcert.post | 14 - .../auth_tls_failcert.tdir/auth_tls_failcert.pre | 47 - .../auth_tls_failcert.tdir/auth_tls_failcert.test | 56 - .../auth_tls_failcert.ub.conf | 23 - .../auth_tls_failcert.tdir/example.com.zone | 4 - .../testdata/auth_tls_failcert.tdir/nsd_server.key | 39 - .../testdata/auth_tls_failcert.tdir/nsd_server.pem | 22 - .../auth_tls_failcert.tdir/unbound_server.key | 39 - .../auth_tls_failcert.tdir/unbound_server.pem | 22 - contrib/unbound/testdata/cachedb_cached_ede.crpl | 91 - contrib/unbound/testdata/cachedb_expired.crpl | 324 --- .../testdata/cachedb_expired_client_timeout.crpl | 343 --- .../testdata/cachedb_expired_reply_ttl.crpl | 259 -- .../cachedb_no_store.tdir/cachedb_no_store.conf | 29 - .../cachedb_no_store.tdir/cachedb_no_store.dsc | 16 - .../cachedb_no_store.tdir/cachedb_no_store.post | 20 - .../cachedb_no_store.tdir/cachedb_no_store.pre | 36 - .../cachedb_no_store.servfail.testns | 8 - .../cachedb_no_store.tdir/cachedb_no_store.test | 132 - .../cachedb_no_store.tdir/cachedb_no_store.testns | 9 - .../unbound/testdata/cachedb_servfail_cname.crpl | 181 -- .../unbound/testdata/cachedb_subnet_change.crpl | 304 --- .../unbound/testdata/cachedb_subnet_expired.crpl | 322 --- .../testdata/cachedb_subnet_toecs_timeout.crpl | 229 -- contrib/unbound/testdata/cachedb_val_expired.crpl | 327 --- .../testdata/cookie_file.tdir/cookie_file.conf | 19 - .../testdata/cookie_file.tdir/cookie_file.dsc | 16 - .../testdata/cookie_file.tdir/cookie_file.pre | 24 - .../testdata/cookie_file.tdir/cookie_file.test | 250 -- contrib/unbound/testdata/disable_edns_do.rpl | 164 -- contrib/unbound/testdata/dns64_prefetch_cache.rpl | 195 -- .../doq_downstream.tdir/doq_downstream.conf | 21 - .../doq_downstream.tdir/doq_downstream.dsc | 16 - .../doq_downstream.tdir/doq_downstream.post | 13 - .../doq_downstream.tdir/doq_downstream.pre | 44 - .../doq_downstream.tdir/doq_downstream.test | 109 - .../doq_downstream.tdir/doq_downstream.testns | 13 - .../doq_downstream.tdir/unbound_server.key | 15 - .../doq_downstream.tdir/unbound_server.pem | 11 - .../unbound/testdata/edns_downstream_cookies.rpl | 235 -- contrib/unbound/testdata/fwd_name_lookup.rpl | 152 -- .../testdata/ip_ratelimit.tdir/ip_ratelimit.conf | 28 - .../testdata/ip_ratelimit.tdir/ip_ratelimit.dsc | 16 - .../testdata/ip_ratelimit.tdir/ip_ratelimit.post | 13 - .../testdata/ip_ratelimit.tdir/ip_ratelimit.pre | 24 - .../testdata/ip_ratelimit.tdir/ip_ratelimit.test | 165 -- .../testdata/ip_ratelimit.tdir/unbound_control.key | 39 - .../testdata/ip_ratelimit.tdir/unbound_control.pem | 22 - .../testdata/ip_ratelimit.tdir/unbound_server.key | 39 - .../testdata/ip_ratelimit.tdir/unbound_server.pem | 22 - .../unbound/testdata/iter_cname_minimise_nx.rpl | 245 -- contrib/unbound/testdata/iter_dname_ttl.rpl | 271 -- contrib/unbound/testdata/iter_failreply.rpl | 132 - .../testdata/iter_ghost_grandchild_delegation.rpl | 256 -- contrib/unbound/testdata/iter_ignore_empty.rpl | 248 -- contrib/unbound/testdata/iter_max_global_quota.rpl | 2236 ---------------- contrib/unbound/testdata/iter_nat64.rpl | 117 - contrib/unbound/testdata/iter_nat64_prefix.rpl | 119 - contrib/unbound/testdata/iter_nat64_prefix48.rpl | 118 - contrib/unbound/testdata/iter_scrub_rr_length.rpl | 298 --- contrib/unbound/testdata/iter_unverified_glue.rpl | 188 -- .../testdata/iter_unverified_glue_fallback.rpl | 138 - contrib/unbound/testdata/local_cnameother.rpl | 67 - .../testdata/root_zonemd.tdir/root_zonemd.conf | 34 - .../testdata/root_zonemd.tdir/root_zonemd.dsc | 16 - .../testdata/root_zonemd.tdir/root_zonemd.post | 14 - .../testdata/root_zonemd.tdir/root_zonemd.pre | 50 - .../testdata/root_zonemd.tdir/root_zonemd.test | 63 - .../testdata/root_zonemd.tdir/root_zonemd.testns | 9 - contrib/unbound/testdata/rpz_cached_cname.rpl | 122 - contrib/unbound/testdata/rpz_clientip_override.rpl | 269 -- contrib/unbound/testdata/rpz_cname_handle.rpl | 779 ------ contrib/unbound/testdata/rpz_cname_tag.rpl | 281 -- contrib/unbound/testdata/rpz_nsdname_override.rpl | 325 --- contrib/unbound/testdata/rpz_nsip_override.rpl | 332 --- contrib/unbound/testdata/rpz_passthru_clientip.rpl | 90 - contrib/unbound/testdata/rpz_qtype_cname.rpl | 120 - .../testdata/rpz_reload.tdir/example.org.zone | 2 - .../testdata/rpz_reload.tdir/rpz.example.com.zone | 6 - .../testdata/rpz_reload.tdir/rpz_reload.conf | 30 - .../testdata/rpz_reload.tdir/rpz_reload.dsc | 16 - .../testdata/rpz_reload.tdir/rpz_reload.post | 12 - .../testdata/rpz_reload.tdir/rpz_reload.pre | 26 - .../testdata/rpz_reload.tdir/rpz_reload.test | 109 - contrib/unbound/testdata/rpz_val_block.rpl | 643 ----- contrib/unbound/testdata/rrset_use_cached.rpl | 151 -- .../unbound/testdata/serve_expired_0ttl_nodata.rpl | 154 -- .../testdata/serve_expired_0ttl_nxdomain.rpl | 154 -- .../testdata/serve_expired_0ttl_servfail.rpl | 129 - .../testdata/serve_expired_cached_servfail.rpl | 130 - .../serve_expired_cached_servfail_refresh.rpl | 145 -- .../serve_expired_client_timeout_val_bogus.rpl | 317 --- ...ired_client_timeout_val_insecure_delegation.rpl | 247 -- .../unbound/testdata/serve_expired_ttl_reset.rpl | 102 - .../unbound/testdata/serve_expired_val_bogus.rpl | 316 --- .../stat_values.tdir/stat_values_cachedb.conf | 36 - .../stat_values_downstream_cookies.conf | 32 - contrib/unbound/testdata/subnet_cached_ede.crpl | 114 - .../unbound/testdata/subnet_cached_servfail.crpl | 167 -- contrib/unbound/testdata/subnet_cached_size.crpl | 308 --- .../unbound/testdata/subnet_global_prefetch.crpl | 236 -- .../subnet_global_prefetch_always_forward.crpl | 167 -- .../testdata/subnet_global_prefetch_expired.crpl | 241 -- contrib/unbound/testdata/subnet_prezero.crpl | 155 -- .../unbound/testdata/subnet_scopezero_noedns.crpl | 441 ---- contrib/unbound/testdata/ttl_max_negative.rpl | 206 -- contrib/unbound/testdata/ttl_min_negative.rpl | 204 -- contrib/unbound/testdata/val_any_negcache.rpl | 243 -- contrib/unbound/testdata/val_cnameqtype_qmin.rpl | 784 ------ contrib/unbound/testdata/val_dname_twice.rpl | 226 -- contrib/unbound/testdata/val_dnameqtype.rpl | 689 ----- contrib/unbound/testdata/val_dnameqtype_qmin.rpl | 859 ------- contrib/unbound/testdata/val_failure_dnskey.rpl | 348 --- contrib/unbound/testdata/val_negcache_ttl.rpl | 188 -- .../unbound/testdata/val_negcache_ttl_prefetch.rpl | 316 --- contrib/unbound/testdata/val_scrub_rr_length.rpl | 164 -- 139 files changed, 23468 deletions(-) diff --git a/contrib/unbound/testcode/doqclient.c b/contrib/unbound/testcode/doqclient.c deleted file mode 100644 index 1a2fd418359b..000000000000 --- a/contrib/unbound/testcode/doqclient.c +++ /dev/null @@ -1,2701 +0,0 @@ -/* - * testcode/doqclient.c - debug program. Perform multiple DNS queries using DoQ. - * - * Copyright (c) 2022, NLnet Labs. All rights reserved. - * - * This software is open source. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * Neither the name of the NLNET LABS nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * \file - * - * Simple DNS-over-QUIC client. For testing and debugging purposes. - * No authentication of TLS cert. - */ - -#include "config.h" -#ifdef HAVE_GETOPT_H -#include -#endif - -#ifdef HAVE_NGTCP2 -#include -#include -#ifdef HAVE_NGTCP2_NGTCP2_CRYPTO_QUICTLS_H -#include -#else -#include -#endif -#include -#include -#ifdef HAVE_TIME_H -#include -#endif -#include -#include "util/locks.h" -#include "util/net_help.h" -#include "sldns/sbuffer.h" -#include "sldns/str2wire.h" -#include "sldns/wire2str.h" -#include "util/data/msgreply.h" -#include "util/data/msgencode.h" -#include "util/data/msgparse.h" -#include "util/data/dname.h" -#include "util/random.h" -#include "util/ub_event.h" -struct doq_client_stream_list; -struct doq_client_stream; - -/** the local client data for the DoQ connection */ -struct doq_client_data { - /** file descriptor */ - int fd; - /** the event base for the events */ - struct ub_event_base* base; - /** the ub event */ - struct ub_event* ev; - /** the expiry timer */ - struct ub_event* expire_timer; - /** is the expire_timer added */ - int expire_timer_added; - /** the ngtcp2 connection information */ - struct ngtcp2_conn* conn; - /** random state */ - struct ub_randstate* rnd; - /** server connected to as a string */ - const char* svr; - /** the static secret */ - uint8_t* static_secret_data; - /** the static secret size */ - size_t static_secret_size; - /** destination address sockaddr */ - struct sockaddr_storage dest_addr; - /** length of dest addr */ - socklen_t dest_addr_len; - /** local address sockaddr */ - struct sockaddr_storage local_addr; - /** length of local addr */ - socklen_t local_addr_len; - /** SSL context */ - SSL_CTX* ctx; - /** SSL object */ - SSL* ssl; -#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT - /** the connection reference for ngtcp2_conn and userdata in ssl */ - struct ngtcp2_crypto_conn_ref conn_ref; -#endif - /** the quic version to use */ - uint32_t quic_version; - /** the last error */ -#ifdef HAVE_NGTCP2_CCERR_DEFAULT - struct ngtcp2_ccerr ccerr; -#else - struct ngtcp2_connection_close_error last_error; -#endif - /** the recent tls alert error code */ - uint8_t tls_alert; - /** the buffer for packet operations */ - struct sldns_buffer* pkt_buf; - /** The list of queries to start. They have no stream associated. - * Once they do, they move to the send list. */ - struct doq_client_stream_list* query_list_start; - /** The list of queries to send. They have a stream, and they are - * sending data. Data could also be received, like errors. */ - struct doq_client_stream_list* query_list_send; - /** The list of queries to receive. They have a stream, and the - * send is done, it is possible to read data. */ - struct doq_client_stream_list* query_list_receive; - /** The list of queries that are stopped. They have no stream - * active any more. Write and read are done. The query is done, - * and it may be in error and then have no answer or partial answer. */ - struct doq_client_stream_list* query_list_stop; - /** is there a blocked packet in the blocked_pkt buffer */ - int have_blocked_pkt; - /** store blocked packet, a packet that could not be sent on the - * nonblocking socket. */ - struct sldns_buffer* blocked_pkt; - /** ecn info for the blocked packet */ - struct ngtcp2_pkt_info blocked_pkt_pi; - /** the congestion control algorithm */ - ngtcp2_cc_algo cc_algo; - /** the transport parameters file, for early data transmission */ - const char* transport_file; - /** the tls session file, for session resumption */ - const char* session_file; - /** if early data is enabled for the connection */ - int early_data_enabled; - /** how quiet is the output */ - int quiet; - /** the configured port for the destination */ - int port; -}; - -/** the local client stream list, for appending streams to */ -struct doq_client_stream_list { - /** first and last members of the list */ - struct doq_client_stream* first, *last; -}; - -/** the local client data for a DoQ stream */ -struct doq_client_stream { - /** next stream in list, and prev in list */ - struct doq_client_stream* next, *prev; - /** the data buffer */ - uint8_t* data; - /** length of the data buffer */ - size_t data_len; - /** if the client query has a stream, that is active, associated with - * it. The stream_id is in stream_id. */ - int has_stream; - /** the stream id */ - int64_t stream_id; - /** data written position */ - size_t nwrite; - /** the data length for write, in network format */ - uint16_t data_tcplen; - /** if the write of the query data is done. That means the - * write channel has FIN, is closed for writing. */ - int write_is_done; - /** data read position */ - size_t nread; - /** the answer length, in network byte order */ - uint16_t answer_len; - /** the answer buffer */ - struct sldns_buffer* answer; - /** the answer is complete */ - int answer_is_complete; - /** the query has an error, it has no answer, or no complete answer */ - int query_has_error; - /** if the query is done */ - int query_is_done; -}; - -#ifndef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT -/** the quic method struct, must remain valid during the QUIC connection. */ -static SSL_QUIC_METHOD quic_method; -#endif - -/** Get the connection ngtcp2_conn from the ssl app data - * ngtcp2_crypto_conn_ref */ -static ngtcp2_conn* conn_ref_get_conn(ngtcp2_crypto_conn_ref* conn_ref) -{ - struct doq_client_data* data = (struct doq_client_data*) - conn_ref->user_data; - return data->conn; -} - -static void -set_app_data(SSL* ssl, struct doq_client_data* data) -{ -#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT - data->conn_ref.get_conn = &conn_ref_get_conn; - data->conn_ref.user_data = data; - SSL_set_app_data(ssl, &data->conn_ref); -#else - SSL_set_app_data(ssl, data); -#endif -} - -static struct doq_client_data* -get_app_data(SSL* ssl) -{ - struct doq_client_data* data; -#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT - data = (struct doq_client_data*)((struct ngtcp2_crypto_conn_ref*) - SSL_get_app_data(ssl))->user_data; -#else - data = (struct doq_client_data*) SSL_get_app_data(ssl); -#endif - return data; -} - - - -/** write handle routine */ -static void on_write(struct doq_client_data* data); -/** update the timer */ -static void update_timer(struct doq_client_data* data); -/** disconnect we are done */ -static void disconnect(struct doq_client_data* data); -/** fetch and write the transport file */ -static void early_data_write_transport(struct doq_client_data* data); - -/** usage of doqclient */ -static void usage(char* argv[]) -{ - printf("usage: %s [options] name type class ...\n", argv[0]); - printf(" sends the name-type-class queries over " - "DNS-over-QUIC.\n"); - printf("-s server IP address to send the queries to, " - "default: 127.0.0.1\n"); - printf("-p Port to connect to, default: %d\n", - UNBOUND_DNS_OVER_QUIC_PORT); - printf("-v verbose output\n"); - printf("-q quiet, short output of answer\n"); - printf("-x file transport file, for read/write of transport parameters.\n\t\tIf it exists, it is used to send early data. It is then\n\t\twritten to contain the last used transport parameters.\n\t\tAlso -y must be enabled for early data to succeed.\n"); - printf("-y file session file, for read/write of TLS session. If it exists,\n\t\tit is used for TLS session resumption. It is then written\n\t\tto contain the last session used.\n\t\tOn its own, without also -x, resumes TLS session.\n"); - printf("-h This help text\n"); - exit(1); -} - -/** get the dest address */ -static void -get_dest_addr(struct doq_client_data* data, const char* svr, int port) -{ - if(!ipstrtoaddr(svr, port, &data->dest_addr, &data->dest_addr_len)) { - printf("fatal: bad server specs '%s'\n", svr); - exit(1); - } -} - -/** open UDP socket to svr */ -static int -open_svr_udp(struct doq_client_data* data) -{ - int fd = -1; - int r; - fd = socket(addr_is_ip6(&data->dest_addr, data->dest_addr_len)? - PF_INET6:PF_INET, SOCK_DGRAM, 0); - if(fd == -1) { - perror("socket() error"); - exit(1); - } - r = connect(fd, (struct sockaddr*)&data->dest_addr, - data->dest_addr_len); - if(r < 0 && r != EINPROGRESS) { - perror("connect() error"); - exit(1); - } - fd_set_nonblock(fd); - return fd; -} - -/** get the local address of the connection */ -static void -get_local_addr(struct doq_client_data* data) -{ - memset(&data->local_addr, 0, sizeof(data->local_addr)); - data->local_addr_len = (socklen_t)sizeof(data->local_addr); - if(getsockname(data->fd, (struct sockaddr*)&data->local_addr, - &data->local_addr_len) == -1) { - perror("getsockname() error"); - exit(1); - } - log_addr(1, "local_addr", &data->local_addr, data->local_addr_len); - log_addr(1, "dest_addr", &data->dest_addr, data->dest_addr_len); -} - -static sldns_buffer* -make_query(char* qname, char* qtype, char* qclass) -{ - struct query_info qinfo; - struct edns_data edns; - sldns_buffer* buf = sldns_buffer_new(65553); - if(!buf) fatal_exit("out of memory"); - qinfo.qname = sldns_str2wire_dname(qname, &qinfo.qname_len); - if(!qinfo.qname) { - printf("cannot parse query name: '%s'\n", qname); - exit(1); - } - - qinfo.qtype = sldns_get_rr_type_by_name(qtype); - qinfo.qclass = sldns_get_rr_class_by_name(qclass); - qinfo.local_alias = NULL; - - qinfo_query_encode(buf, &qinfo); /* flips buffer */ - free(qinfo.qname); - sldns_buffer_write_u16_at(buf, 0, 0x0000); - sldns_buffer_write_u16_at(buf, 2, BIT_RD); - memset(&edns, 0, sizeof(edns)); - edns.edns_present = 1; - edns.bits = EDNS_DO; - edns.udp_size = 4096; - if(sldns_buffer_capacity(buf) >= - sldns_buffer_limit(buf)+calc_edns_field_size(&edns)) - attach_edns_record(buf, &edns); - return buf; -} - -/** create client stream structure */ -static struct doq_client_stream* -client_stream_create(struct sldns_buffer* query_data) -{ - struct doq_client_stream* str = calloc(1, sizeof(*str)); - if(!str) - fatal_exit("calloc failed: out of memory"); - str->data = memdup(sldns_buffer_begin(query_data), - sldns_buffer_limit(query_data)); - if(!str->data) - fatal_exit("alloc data failed: out of memory"); - str->data_len = sldns_buffer_limit(query_data); - str->stream_id = -1; - return str; -} - -/** free client stream structure */ -static void -client_stream_free(struct doq_client_stream* str) -{ - if(!str) - return; - free(str->data); - sldns_buffer_free(str->answer); - free(str); -} - -/** setup the stream to start the write process */ -static void -client_stream_start_setup(struct doq_client_stream* str, int64_t stream_id) -{ - str->has_stream = 1; - str->stream_id = stream_id; - str->nwrite = 0; - str->nread = 0; - str->answer_len = 0; - str->query_is_done = 0; - str->answer_is_complete = 0; - str->query_has_error = 0; - if(str->answer) { - sldns_buffer_free(str->answer); - str->answer = NULL; - } -} - -/** Return string for log purposes with query name. */ -static char* -client_stream_string(struct doq_client_stream* str) -{ - char* s; - size_t dname_len; - char dname[256], tpstr[32], result[256+32+16]; - uint16_t tp; - if(str->data_len <= LDNS_HEADER_SIZE) { - s = strdup("query_with_no_question"); - if(!s) - fatal_exit("strdup failed: out of memory"); - return s; - } - dname_len = dname_valid(str->data+LDNS_HEADER_SIZE, - str->data_len-LDNS_HEADER_SIZE); - if(!dname_len) { - s = strdup("query_dname_not_valid"); - if(!s) - fatal_exit("strdup failed: out of memory"); - return s; - } - (void)sldns_wire2str_dname_buf(str->data+LDNS_HEADER_SIZE, dname_len, - dname, sizeof(dname)); - tp = sldns_wirerr_get_type(str->data+LDNS_HEADER_SIZE, - str->data_len-LDNS_HEADER_SIZE, dname_len); - (void)sldns_wire2str_type_buf(tp, tpstr, sizeof(tpstr)); - snprintf(result, sizeof(result), "%s %s", dname, tpstr); - s = strdup(result); - if(!s) - fatal_exit("strdup failed: out of memory"); - return s; -} - -/** create query stream list */ -static struct doq_client_stream_list* -stream_list_create(void) -{ - struct doq_client_stream_list* list = calloc(1, sizeof(*list)); - if(!list) - fatal_exit("calloc failed: out of memory"); - return list; -} - -/** free the query stream list */ -static void -stream_list_free(struct doq_client_stream_list* list) -{ - struct doq_client_stream* str; - if(!list) - return; - str = list->first; - while(str) { - struct doq_client_stream* next = str->next; - client_stream_free(str); - str = next; - } - free(list); -} - -/** append item to list */ -static void -stream_list_append(struct doq_client_stream_list* list, - struct doq_client_stream* str) -{ - if(list->last) { - str->prev = list->last; - list->last->next = str; - } else { - str->prev = NULL; - list->first = str; - } - str->next = NULL; - list->last = str; -} - -/** delete the item from the list */ -static void -stream_list_delete(struct doq_client_stream_list* list, - struct doq_client_stream* str) -{ - if(str->next) { - str->next->prev = str->prev; - } else { - list->last = str->prev; - } - if(str->prev) { - str->prev->next = str->next; - } else { - list->first = str->next; - } - str->prev = NULL; - str->next = NULL; -} - -/** move the item from list1 to list2 */ -static void -stream_list_move(struct doq_client_stream* str, - struct doq_client_stream_list* list1, - struct doq_client_stream_list* list2) -{ - stream_list_delete(list1, str); - stream_list_append(list2, str); -} - -/** allocate stream data buffer, then answer length is complete */ -static void -client_stream_datalen_complete(struct doq_client_stream* str) -{ - verbose(1, "answer length %d", (int)ntohs(str->answer_len)); - str->answer = sldns_buffer_new(ntohs(str->answer_len)); - if(!str->answer) - fatal_exit("sldns_buffer_new failed: out of memory"); - sldns_buffer_set_limit(str->answer, ntohs(str->answer_len)); -} - -/** print the answer rrs */ -static void -print_answer_rrs(uint8_t* pkt, size_t pktlen) -{ - char buf[65535]; - char* str; - size_t str_len; - int i, qdcount, ancount; - uint8_t* data = pkt; - size_t data_len = pktlen; - int comprloop = 0; - if(data_len < LDNS_HEADER_SIZE) - return; - qdcount = LDNS_QDCOUNT(data); - ancount = LDNS_ANCOUNT(data); - data += LDNS_HEADER_SIZE; - data_len -= LDNS_HEADER_SIZE; - - for(i=0; iquery_has_error) { - char* logs = client_stream_string(str); - printf("%s has error, there is no answer\n", logs); - free(logs); - return; - } - if(sldns_buffer_limit(str->answer) < LDNS_HEADER_SIZE) { - char* logs = client_stream_string(str); - printf("%s received short packet, smaller than header\n", - logs); - free(logs); - return; - } - rcode = LDNS_RCODE_WIRE(sldns_buffer_begin(str->answer)); - if(rcode != 0) { - char* logs = client_stream_string(str); - char rc[16]; - (void)sldns_wire2str_rcode_buf(rcode, rc, sizeof(rc)); - printf("%s rcode %s\n", logs, rc); - free(logs); - return; - } - ancount = LDNS_ANCOUNT(sldns_buffer_begin(str->answer)); - if(ancount == 0) { - char* logs = client_stream_string(str); - printf("%s nodata answer\n", logs); - free(logs); - return; - } - print_answer_rrs(sldns_buffer_begin(str->answer), - sldns_buffer_limit(str->answer)); -} - -/** print the stream output answer */ -static void -client_stream_print_long(struct doq_client_data* data, - struct doq_client_stream* str) -{ - char* s; - if(str->query_has_error) { - char* logs = client_stream_string(str); - printf("%s has error, there is no answer\n", logs); - free(logs); - return; - } - s = sldns_wire2str_pkt(sldns_buffer_begin(str->answer), - sldns_buffer_limit(str->answer)); - printf("%s", (s?s:";sldns_wire2str_pkt failed\n")); - printf(";; SERVER: %s %d\n", data->svr, data->port); - free(s); -} - -/** the stream has completed the data */ -static void -client_stream_data_complete(struct doq_client_stream* str) -{ - verbose(1, "received all answer content"); - if(verbosity > 0) { - char* logs = client_stream_string(str); - char* s; - log_buf(1, "received answer", str->answer); - s = sldns_wire2str_pkt(sldns_buffer_begin(str->answer), - sldns_buffer_limit(str->answer)); - if(!s) verbose(1, "could not sldns_wire2str_pkt"); - else verbose(1, "query %s received:\n%s", logs, s); - free(s); - free(logs); - } - str->answer_is_complete = 1; -} - -/** the stream has completed but with an error */ -static void -client_stream_answer_error(struct doq_client_stream* str) -{ - if(verbosity > 0) { - char* logs = client_stream_string(str); - if(str->answer) - verbose(1, "query %s has an error. received %d/%d bytes.", - logs, (int)sldns_buffer_position(str->answer), - (int)sldns_buffer_limit(str->answer)); - else - verbose(1, "query %s has an error. received no data.", - logs); - free(logs); - } - str->query_has_error = 1; -} - -/** receive data for a stream */ -static void -client_stream_recv_data(struct doq_client_stream* str, const uint8_t* data, - size_t datalen) -{ - int got_data = 0; - /* read the tcplength uint16_t at the start of the DNS message */ - if(str->nread < 2) { - size_t to_move = datalen; - if(datalen > 2-str->nread) - to_move = 2-str->nread; - memmove(((uint8_t*)&str->answer_len)+str->nread, data, - to_move); - str->nread += to_move; - data += to_move; - datalen -= to_move; - if(str->nread == 2) { - /* we can allocate the data buffer */ - client_stream_datalen_complete(str); - } - } - /* if we have data bytes */ - if(datalen > 0) { - size_t to_write = datalen; - if(datalen > sldns_buffer_remaining(str->answer)) - to_write = sldns_buffer_remaining(str->answer); - if(to_write > 0) { - sldns_buffer_write(str->answer, data, to_write); - str->nread += to_write; - data += to_write; - datalen -= to_write; - got_data = 1; - } - } - /* extra received bytes after end? */ - if(datalen > 0) { - verbose(1, "extra bytes after end of DNS length"); - if(verbosity > 0) - log_hex("extradata", (void*)data, datalen); - } - /* are we done with it? */ - if(got_data && str->nread >= (size_t)(ntohs(str->answer_len))+2) { - client_stream_data_complete(str); - } -} - -/** receive FIN from remote end on client stream, no more data to be - * received on the stream. */ -static void -client_stream_recv_fin(struct doq_client_data* data, - struct doq_client_stream* str, int is_fin) -{ - if(verbosity > 0) { - char* logs = client_stream_string(str); - if(is_fin) - verbose(1, "query %s: received FIN from remote", logs); - else - verbose(1, "query %s: stream reset from remote", logs); - free(logs); - } - if(str->write_is_done) - stream_list_move(str, data->query_list_receive, - data->query_list_stop); - else - stream_list_move(str, data->query_list_send, - data->query_list_stop); - if(!str->answer_is_complete) { - client_stream_answer_error(str); - } - str->query_is_done = 1; - if(data->quiet) - client_stream_print_short(str); - else client_stream_print_long(data, str); - if(data->query_list_send->first==NULL && - data->query_list_receive->first==NULL) - disconnect(data); -} - -/** fill a buffer with random data */ -static void fill_rand(struct ub_randstate* rnd, uint8_t* buf, size_t len) -{ - if(RAND_bytes(buf, len) != 1) { - size_t i; - for(i=0; istatic_secret_data = malloc(len); - if(!data->static_secret_data) - fatal_exit("malloc failed: out of memory"); - data->static_secret_size = len; - fill_rand(data->rnd, data->static_secret_data, len); -} - -/** fill cid structure with random data */ -static void cid_randfill(struct ngtcp2_cid* cid, size_t datalen, - struct ub_randstate* rnd) -{ - uint8_t buf[32]; - if(datalen > sizeof(buf)) - datalen = sizeof(buf); - fill_rand(rnd, buf, datalen); - ngtcp2_cid_init(cid, buf, datalen); -} - -/** send buf on the client stream */ -static int -client_bidi_stream(struct doq_client_data* data, int64_t* ret_stream_id, - void* stream_user_data) -{ - int64_t stream_id; - int rv; - - /* open new bidirectional stream */ - rv = ngtcp2_conn_open_bidi_stream(data->conn, &stream_id, - stream_user_data); - if(rv != 0) { - if(rv == NGTCP2_ERR_STREAM_ID_BLOCKED) { - /* no bidi stream count for this new stream */ - return 0; - } - fatal_exit("could not ngtcp2_conn_open_bidi_stream: %s", - ngtcp2_strerror(rv)); - } - *ret_stream_id = stream_id; - return 1; -} - -/** See if we can start query streams, by creating bidirectional streams - * on the QUIC transport for them. */ -static void -query_streams_start(struct doq_client_data* data) -{ - while(data->query_list_start->first) { - struct doq_client_stream* str = data->query_list_start->first; - int64_t stream_id = 0; - if(!client_bidi_stream(data, &stream_id, str)) { - /* no more bidi streams allowed */ - break; - } - if(verbosity > 0) { - char* logs = client_stream_string(str); - verbose(1, "query %s start on bidi stream id %lld", - logs, (long long int)stream_id); - free(logs); - } - /* setup the stream to start */ - client_stream_start_setup(str, stream_id); - /* move the query entry to the send list to write it */ - stream_list_move(str, data->query_list_start, - data->query_list_send); - } -} - -/** the rand callback routine from ngtcp2 */ -static void rand_cb(uint8_t* dest, size_t destlen, - const ngtcp2_rand_ctx* rand_ctx) -{ - struct ub_randstate* rnd = (struct ub_randstate*) - rand_ctx->native_handle; - fill_rand(rnd, dest, destlen); -} - -/** the get_new_connection_id callback routine from ngtcp2 */ -static int get_new_connection_id_cb(struct ngtcp2_conn* ATTR_UNUSED(conn), - struct ngtcp2_cid* cid, uint8_t* token, size_t cidlen, void* user_data) -{ - struct doq_client_data* data = (struct doq_client_data*)user_data; - cid_randfill(cid, cidlen, data->rnd); - if(ngtcp2_crypto_generate_stateless_reset_token(token, - data->static_secret_data, data->static_secret_size, cid) != 0) - return NGTCP2_ERR_CALLBACK_FAILURE; - return 0; -} - -/** handle that early data is rejected */ -static void -early_data_is_rejected(struct doq_client_data* data) -{ - int rv; - verbose(1, "early data was rejected by the server"); *** 23474 LINES SKIPPED ***