1ed8ee42cSDaniel P. Berrange /* 2ed8ee42cSDaniel P. Berrange * QEMU I/O channel TLS test 3ed8ee42cSDaniel P. Berrange * 4ed8ee42cSDaniel P. Berrange * Copyright (C) 2015 Red Hat, Inc. 5ed8ee42cSDaniel P. Berrange * 6ed8ee42cSDaniel P. Berrange * This library is free software; you can redistribute it and/or 7ed8ee42cSDaniel P. Berrange * modify it under the terms of the GNU Lesser General Public 8ed8ee42cSDaniel P. Berrange * License as published by the Free Software Foundation; either 9ed8ee42cSDaniel P. Berrange * version 2.1 of the License, or (at your option) any later version. 10ed8ee42cSDaniel P. Berrange * 11ed8ee42cSDaniel P. Berrange * This library is distributed in the hope that it will be useful, 12ed8ee42cSDaniel P. Berrange * but WITHOUT ANY WARRANTY; without even the implied warranty of 13ed8ee42cSDaniel P. Berrange * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14ed8ee42cSDaniel P. Berrange * Lesser General Public License for more details. 15ed8ee42cSDaniel P. Berrange * 16ed8ee42cSDaniel P. Berrange * You should have received a copy of the GNU Lesser General Public 17ed8ee42cSDaniel P. Berrange * License along with this library. If not, see 18ed8ee42cSDaniel P. Berrange * <http://www.gnu.org/licenses/>. 19ed8ee42cSDaniel P. Berrange * 20ed8ee42cSDaniel P. Berrange * Author: Daniel P. Berrange <berrange@redhat.com> 21ed8ee42cSDaniel P. Berrange */ 22ed8ee42cSDaniel P. Berrange 23ed8ee42cSDaniel P. Berrange 24681c28a3SPeter Maydell #include "qemu/osdep.h" 25ed8ee42cSDaniel P. Berrange 26ed8ee42cSDaniel P. Berrange #include "crypto-tls-x509-helpers.h" 27ed8ee42cSDaniel P. Berrange #include "io/channel-tls.h" 28ed8ee42cSDaniel P. Berrange #include "io/channel-socket.h" 29ed8ee42cSDaniel P. Berrange #include "io-channel-helpers.h" 30d26d6b5dSDaniel P. Berrange #include "crypto/init.h" 31ed8ee42cSDaniel P. Berrange #include "crypto/tlscredsx509.h" 32ed8ee42cSDaniel P. Berrange #include "qemu/acl.h" 33ed8ee42cSDaniel P. Berrange #include "qom/object_interfaces.h" 34ed8ee42cSDaniel P. Berrange 35ed8ee42cSDaniel P. Berrange #ifdef QCRYPTO_HAVE_TLS_TEST_SUPPORT 36ed8ee42cSDaniel P. Berrange 37ed8ee42cSDaniel P. Berrange #define WORKDIR "tests/test-io-channel-tls-work/" 38ed8ee42cSDaniel P. Berrange #define KEYFILE WORKDIR "key-ctx.pem" 39ed8ee42cSDaniel P. Berrange 40ed8ee42cSDaniel P. Berrange struct QIOChannelTLSTestData { 41ed8ee42cSDaniel P. Berrange const char *servercacrt; 42ed8ee42cSDaniel P. Berrange const char *clientcacrt; 43ed8ee42cSDaniel P. Berrange const char *servercrt; 44ed8ee42cSDaniel P. Berrange const char *clientcrt; 45ed8ee42cSDaniel P. Berrange bool expectServerFail; 46ed8ee42cSDaniel P. Berrange bool expectClientFail; 47ed8ee42cSDaniel P. Berrange const char *hostname; 48ed8ee42cSDaniel P. Berrange const char *const *wildcards; 49ed8ee42cSDaniel P. Berrange }; 50ed8ee42cSDaniel P. Berrange 51ed8ee42cSDaniel P. Berrange struct QIOChannelTLSHandshakeData { 52ed8ee42cSDaniel P. Berrange bool finished; 53ed8ee42cSDaniel P. Berrange bool failed; 54ed8ee42cSDaniel P. Berrange }; 55ed8ee42cSDaniel P. Berrange 5660e705c5SDaniel P. Berrange static void test_tls_handshake_done(QIOTask *task, 57ed8ee42cSDaniel P. Berrange gpointer opaque) 58ed8ee42cSDaniel P. Berrange { 59ed8ee42cSDaniel P. Berrange struct QIOChannelTLSHandshakeData *data = opaque; 60ed8ee42cSDaniel P. Berrange 61ed8ee42cSDaniel P. Berrange data->finished = true; 6260e705c5SDaniel P. Berrange data->failed = qio_task_propagate_error(task, NULL); 63ed8ee42cSDaniel P. Berrange } 64ed8ee42cSDaniel P. Berrange 65ed8ee42cSDaniel P. Berrange 66ed8ee42cSDaniel P. Berrange static QCryptoTLSCreds *test_tls_creds_create(QCryptoTLSCredsEndpoint endpoint, 67ed8ee42cSDaniel P. Berrange const char *certdir, 68ed8ee42cSDaniel P. Berrange Error **errp) 69ed8ee42cSDaniel P. Berrange { 70ed8ee42cSDaniel P. Berrange Object *parent = object_get_objects_root(); 71ed8ee42cSDaniel P. Berrange Object *creds = object_new_with_props( 72ed8ee42cSDaniel P. Berrange TYPE_QCRYPTO_TLS_CREDS_X509, 73ed8ee42cSDaniel P. Berrange parent, 74ed8ee42cSDaniel P. Berrange (endpoint == QCRYPTO_TLS_CREDS_ENDPOINT_SERVER ? 75ed8ee42cSDaniel P. Berrange "testtlscredsserver" : "testtlscredsclient"), 76ed8ee42cSDaniel P. Berrange errp, 77ed8ee42cSDaniel P. Berrange "endpoint", (endpoint == QCRYPTO_TLS_CREDS_ENDPOINT_SERVER ? 78ed8ee42cSDaniel P. Berrange "server" : "client"), 79ed8ee42cSDaniel P. Berrange "dir", certdir, 80ed8ee42cSDaniel P. Berrange "verify-peer", "yes", 81*057ad0b4SDaniel P. Berrangé "priority", "NORMAL", 82ed8ee42cSDaniel P. Berrange /* We skip initial sanity checks here because we 83ed8ee42cSDaniel P. Berrange * want to make sure that problems are being 84ed8ee42cSDaniel P. Berrange * detected at the TLS session validation stage, 85ed8ee42cSDaniel P. Berrange * and the test-crypto-tlscreds test already 86ed8ee42cSDaniel P. Berrange * validate the sanity check code. 87ed8ee42cSDaniel P. Berrange */ 88ed8ee42cSDaniel P. Berrange "sanity-check", "no", 89ed8ee42cSDaniel P. Berrange NULL 90ed8ee42cSDaniel P. Berrange ); 91ed8ee42cSDaniel P. Berrange 92ed8ee42cSDaniel P. Berrange if (*errp) { 93ed8ee42cSDaniel P. Berrange return NULL; 94ed8ee42cSDaniel P. Berrange } 95ed8ee42cSDaniel P. Berrange return QCRYPTO_TLS_CREDS(creds); 96ed8ee42cSDaniel P. Berrange } 97ed8ee42cSDaniel P. Berrange 98ed8ee42cSDaniel P. Berrange 99ed8ee42cSDaniel P. Berrange /* 100ed8ee42cSDaniel P. Berrange * This tests validation checking of peer certificates 101ed8ee42cSDaniel P. Berrange * 102ed8ee42cSDaniel P. Berrange * This is replicating the checks that are done for an 103ed8ee42cSDaniel P. Berrange * active TLS session after handshake completes. To 104ed8ee42cSDaniel P. Berrange * simulate that we create our TLS contexts, skipping 105ed8ee42cSDaniel P. Berrange * sanity checks. When then get a socketpair, and 106ed8ee42cSDaniel P. Berrange * initiate a TLS session across them. Finally do 107ed8ee42cSDaniel P. Berrange * do actual cert validation tests 108ed8ee42cSDaniel P. Berrange */ 109ed8ee42cSDaniel P. Berrange static void test_io_channel_tls(const void *opaque) 110ed8ee42cSDaniel P. Berrange { 111ed8ee42cSDaniel P. Berrange struct QIOChannelTLSTestData *data = 112ed8ee42cSDaniel P. Berrange (struct QIOChannelTLSTestData *)opaque; 113ed8ee42cSDaniel P. Berrange QCryptoTLSCreds *clientCreds; 114ed8ee42cSDaniel P. Berrange QCryptoTLSCreds *serverCreds; 115ed8ee42cSDaniel P. Berrange QIOChannelTLS *clientChanTLS; 116ed8ee42cSDaniel P. Berrange QIOChannelTLS *serverChanTLS; 117ed8ee42cSDaniel P. Berrange QIOChannelSocket *clientChanSock; 118ed8ee42cSDaniel P. Berrange QIOChannelSocket *serverChanSock; 119ed8ee42cSDaniel P. Berrange qemu_acl *acl; 120ed8ee42cSDaniel P. Berrange const char * const *wildcards; 121ed8ee42cSDaniel P. Berrange int channel[2]; 122ed8ee42cSDaniel P. Berrange struct QIOChannelTLSHandshakeData clientHandshake = { false, false }; 123ed8ee42cSDaniel P. Berrange struct QIOChannelTLSHandshakeData serverHandshake = { false, false }; 124ed8ee42cSDaniel P. Berrange Error *err = NULL; 125ed8ee42cSDaniel P. Berrange QIOChannelTest *test; 126ed8ee42cSDaniel P. Berrange GMainContext *mainloop; 127ed8ee42cSDaniel P. Berrange 128ed8ee42cSDaniel P. Berrange /* We'll use this for our fake client-server connection */ 129ed8ee42cSDaniel P. Berrange g_assert(socketpair(AF_UNIX, SOCK_STREAM, 0, channel) == 0); 130ed8ee42cSDaniel P. Berrange 131d4adf967SDaniel P. Berrange #define CLIENT_CERT_DIR "tests/test-io-channel-tls-client/" 132d4adf967SDaniel P. Berrange #define SERVER_CERT_DIR "tests/test-io-channel-tls-server/" 133ed8ee42cSDaniel P. Berrange mkdir(CLIENT_CERT_DIR, 0700); 134ed8ee42cSDaniel P. Berrange mkdir(SERVER_CERT_DIR, 0700); 135ed8ee42cSDaniel P. Berrange 136ed8ee42cSDaniel P. Berrange unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); 137ed8ee42cSDaniel P. Berrange unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); 138ed8ee42cSDaniel P. Berrange unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); 139ed8ee42cSDaniel P. Berrange 140ed8ee42cSDaniel P. Berrange unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); 141ed8ee42cSDaniel P. Berrange unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); 142ed8ee42cSDaniel P. Berrange unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); 143ed8ee42cSDaniel P. Berrange 144ed8ee42cSDaniel P. Berrange g_assert(link(data->servercacrt, 145ed8ee42cSDaniel P. Berrange SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT) == 0); 146ed8ee42cSDaniel P. Berrange g_assert(link(data->servercrt, 147ed8ee42cSDaniel P. Berrange SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT) == 0); 148ed8ee42cSDaniel P. Berrange g_assert(link(KEYFILE, 149ed8ee42cSDaniel P. Berrange SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY) == 0); 150ed8ee42cSDaniel P. Berrange 151ed8ee42cSDaniel P. Berrange g_assert(link(data->clientcacrt, 152ed8ee42cSDaniel P. Berrange CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT) == 0); 153ed8ee42cSDaniel P. Berrange g_assert(link(data->clientcrt, 154ed8ee42cSDaniel P. Berrange CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT) == 0); 155ed8ee42cSDaniel P. Berrange g_assert(link(KEYFILE, 156ed8ee42cSDaniel P. Berrange CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY) == 0); 157ed8ee42cSDaniel P. Berrange 158ed8ee42cSDaniel P. Berrange clientCreds = test_tls_creds_create( 159ed8ee42cSDaniel P. Berrange QCRYPTO_TLS_CREDS_ENDPOINT_CLIENT, 160ed8ee42cSDaniel P. Berrange CLIENT_CERT_DIR, 161ed8ee42cSDaniel P. Berrange &err); 162ed8ee42cSDaniel P. Berrange g_assert(clientCreds != NULL); 163ed8ee42cSDaniel P. Berrange 164ed8ee42cSDaniel P. Berrange serverCreds = test_tls_creds_create( 165ed8ee42cSDaniel P. Berrange QCRYPTO_TLS_CREDS_ENDPOINT_SERVER, 166ed8ee42cSDaniel P. Berrange SERVER_CERT_DIR, 167ed8ee42cSDaniel P. Berrange &err); 168ed8ee42cSDaniel P. Berrange g_assert(serverCreds != NULL); 169ed8ee42cSDaniel P. Berrange 170ed8ee42cSDaniel P. Berrange acl = qemu_acl_init("channeltlsacl"); 171ed8ee42cSDaniel P. Berrange qemu_acl_reset(acl); 172ed8ee42cSDaniel P. Berrange wildcards = data->wildcards; 173ed8ee42cSDaniel P. Berrange while (wildcards && *wildcards) { 174ed8ee42cSDaniel P. Berrange qemu_acl_append(acl, 0, *wildcards); 175ed8ee42cSDaniel P. Berrange wildcards++; 176ed8ee42cSDaniel P. Berrange } 177ed8ee42cSDaniel P. Berrange 178ed8ee42cSDaniel P. Berrange clientChanSock = qio_channel_socket_new_fd( 179ed8ee42cSDaniel P. Berrange channel[0], &err); 180ed8ee42cSDaniel P. Berrange g_assert(clientChanSock != NULL); 181ed8ee42cSDaniel P. Berrange serverChanSock = qio_channel_socket_new_fd( 182ed8ee42cSDaniel P. Berrange channel[1], &err); 183ed8ee42cSDaniel P. Berrange g_assert(serverChanSock != NULL); 184ed8ee42cSDaniel P. Berrange 185ed8ee42cSDaniel P. Berrange /* 186ed8ee42cSDaniel P. Berrange * We have an evil loop to do the handshake in a single 187ed8ee42cSDaniel P. Berrange * thread, so we need these non-blocking to avoid deadlock 188ed8ee42cSDaniel P. Berrange * of ourselves 189ed8ee42cSDaniel P. Berrange */ 190ed8ee42cSDaniel P. Berrange qio_channel_set_blocking(QIO_CHANNEL(clientChanSock), false, NULL); 191ed8ee42cSDaniel P. Berrange qio_channel_set_blocking(QIO_CHANNEL(serverChanSock), false, NULL); 192ed8ee42cSDaniel P. Berrange 193ed8ee42cSDaniel P. Berrange /* Now the real part of the test, setup the sessions */ 194ed8ee42cSDaniel P. Berrange clientChanTLS = qio_channel_tls_new_client( 195ed8ee42cSDaniel P. Berrange QIO_CHANNEL(clientChanSock), clientCreds, 196ed8ee42cSDaniel P. Berrange data->hostname, &err); 197ed8ee42cSDaniel P. Berrange g_assert(clientChanTLS != NULL); 198ed8ee42cSDaniel P. Berrange 199ed8ee42cSDaniel P. Berrange serverChanTLS = qio_channel_tls_new_server( 200ed8ee42cSDaniel P. Berrange QIO_CHANNEL(serverChanSock), serverCreds, 201ed8ee42cSDaniel P. Berrange "channeltlsacl", &err); 202ed8ee42cSDaniel P. Berrange g_assert(serverChanTLS != NULL); 203ed8ee42cSDaniel P. Berrange 204ed8ee42cSDaniel P. Berrange qio_channel_tls_handshake(clientChanTLS, 205ed8ee42cSDaniel P. Berrange test_tls_handshake_done, 206ed8ee42cSDaniel P. Berrange &clientHandshake, 2071939ccdaSPeter Xu NULL, 208ed8ee42cSDaniel P. Berrange NULL); 209ed8ee42cSDaniel P. Berrange qio_channel_tls_handshake(serverChanTLS, 210ed8ee42cSDaniel P. Berrange test_tls_handshake_done, 211ed8ee42cSDaniel P. Berrange &serverHandshake, 2121939ccdaSPeter Xu NULL, 213ed8ee42cSDaniel P. Berrange NULL); 214ed8ee42cSDaniel P. Berrange 215ed8ee42cSDaniel P. Berrange /* 216ed8ee42cSDaniel P. Berrange * Finally we loop around & around doing handshake on each 217ed8ee42cSDaniel P. Berrange * session until we get an error, or the handshake completes. 218ed8ee42cSDaniel P. Berrange * This relies on the socketpair being nonblocking to avoid 219ed8ee42cSDaniel P. Berrange * deadlocking ourselves upon handshake 220ed8ee42cSDaniel P. Berrange */ 221ed8ee42cSDaniel P. Berrange mainloop = g_main_context_default(); 222ed8ee42cSDaniel P. Berrange do { 223ed8ee42cSDaniel P. Berrange g_main_context_iteration(mainloop, TRUE); 224689ed13eSDaniel P. Berrange } while (!clientHandshake.finished || 225ed8ee42cSDaniel P. Berrange !serverHandshake.finished); 226ed8ee42cSDaniel P. Berrange 227ed8ee42cSDaniel P. Berrange g_assert(clientHandshake.failed == data->expectClientFail); 228ed8ee42cSDaniel P. Berrange g_assert(serverHandshake.failed == data->expectServerFail); 229ed8ee42cSDaniel P. Berrange 230ed8ee42cSDaniel P. Berrange test = qio_channel_test_new(); 231ed8ee42cSDaniel P. Berrange qio_channel_test_run_threads(test, false, 232ed8ee42cSDaniel P. Berrange QIO_CHANNEL(clientChanTLS), 233ed8ee42cSDaniel P. Berrange QIO_CHANNEL(serverChanTLS)); 234ed8ee42cSDaniel P. Berrange qio_channel_test_validate(test); 235ed8ee42cSDaniel P. Berrange 236ed8ee42cSDaniel P. Berrange test = qio_channel_test_new(); 237ed8ee42cSDaniel P. Berrange qio_channel_test_run_threads(test, true, 238ed8ee42cSDaniel P. Berrange QIO_CHANNEL(clientChanTLS), 239ed8ee42cSDaniel P. Berrange QIO_CHANNEL(serverChanTLS)); 240ed8ee42cSDaniel P. Berrange qio_channel_test_validate(test); 241ed8ee42cSDaniel P. Berrange 242ed8ee42cSDaniel P. Berrange unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); 243ed8ee42cSDaniel P. Berrange unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); 244ed8ee42cSDaniel P. Berrange unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); 245ed8ee42cSDaniel P. Berrange 246ed8ee42cSDaniel P. Berrange unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); 247ed8ee42cSDaniel P. Berrange unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); 248ed8ee42cSDaniel P. Berrange unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); 249ed8ee42cSDaniel P. Berrange 250ed8ee42cSDaniel P. Berrange rmdir(CLIENT_CERT_DIR); 251ed8ee42cSDaniel P. Berrange rmdir(SERVER_CERT_DIR); 252ed8ee42cSDaniel P. Berrange 253ed8ee42cSDaniel P. Berrange object_unparent(OBJECT(serverCreds)); 254ed8ee42cSDaniel P. Berrange object_unparent(OBJECT(clientCreds)); 255ed8ee42cSDaniel P. Berrange 256ed8ee42cSDaniel P. Berrange object_unref(OBJECT(serverChanTLS)); 257ed8ee42cSDaniel P. Berrange object_unref(OBJECT(clientChanTLS)); 258ed8ee42cSDaniel P. Berrange 259ed8ee42cSDaniel P. Berrange object_unref(OBJECT(serverChanSock)); 260ed8ee42cSDaniel P. Berrange object_unref(OBJECT(clientChanSock)); 261ed8ee42cSDaniel P. Berrange 262ed8ee42cSDaniel P. Berrange close(channel[0]); 263ed8ee42cSDaniel P. Berrange close(channel[1]); 264ed8ee42cSDaniel P. Berrange } 265ed8ee42cSDaniel P. Berrange 266ed8ee42cSDaniel P. Berrange 267ed8ee42cSDaniel P. Berrange int main(int argc, char **argv) 268ed8ee42cSDaniel P. Berrange { 269ed8ee42cSDaniel P. Berrange int ret; 270ed8ee42cSDaniel P. Berrange 271d26d6b5dSDaniel P. Berrange g_assert(qcrypto_init(NULL) == 0); 272d26d6b5dSDaniel P. Berrange 273ed8ee42cSDaniel P. Berrange module_call_init(MODULE_INIT_QOM); 274ed8ee42cSDaniel P. Berrange g_test_init(&argc, &argv, NULL); 275ed8ee42cSDaniel P. Berrange setenv("GNUTLS_FORCE_FIPS_MODE", "2", 1); 276ed8ee42cSDaniel P. Berrange 277ed8ee42cSDaniel P. Berrange mkdir(WORKDIR, 0700); 278ed8ee42cSDaniel P. Berrange 279ed8ee42cSDaniel P. Berrange test_tls_init(KEYFILE); 280ed8ee42cSDaniel P. Berrange 281ed8ee42cSDaniel P. Berrange # define TEST_CHANNEL(name, caCrt, \ 282ed8ee42cSDaniel P. Berrange serverCrt, clientCrt, \ 283ed8ee42cSDaniel P. Berrange expectServerFail, expectClientFail, \ 284ed8ee42cSDaniel P. Berrange hostname, wildcards) \ 285ed8ee42cSDaniel P. Berrange struct QIOChannelTLSTestData name = { \ 286ed8ee42cSDaniel P. Berrange caCrt, caCrt, serverCrt, clientCrt, \ 287ed8ee42cSDaniel P. Berrange expectServerFail, expectClientFail, \ 288ed8ee42cSDaniel P. Berrange hostname, wildcards \ 289ed8ee42cSDaniel P. Berrange }; \ 290ed8ee42cSDaniel P. Berrange g_test_add_data_func("/qio/channel/tls/" # name, \ 291ed8ee42cSDaniel P. Berrange &name, test_io_channel_tls); 292ed8ee42cSDaniel P. Berrange 293ed8ee42cSDaniel P. Berrange /* A perfect CA, perfect client & perfect server */ 294ed8ee42cSDaniel P. Berrange 295ed8ee42cSDaniel P. Berrange /* Basic:CA:critical */ 296ed8ee42cSDaniel P. Berrange TLS_ROOT_REQ(cacertreq, 297ed8ee42cSDaniel P. Berrange "UK", "qemu CA", NULL, NULL, NULL, NULL, 298ed8ee42cSDaniel P. Berrange true, true, true, 299ed8ee42cSDaniel P. Berrange true, true, GNUTLS_KEY_KEY_CERT_SIGN, 300ed8ee42cSDaniel P. Berrange false, false, NULL, NULL, 301ed8ee42cSDaniel P. Berrange 0, 0); 302ed8ee42cSDaniel P. Berrange TLS_CERT_REQ(servercertreq, cacertreq, 303ed8ee42cSDaniel P. Berrange "UK", "qemu.org", NULL, NULL, NULL, NULL, 304ed8ee42cSDaniel P. Berrange true, true, false, 305ed8ee42cSDaniel P. Berrange true, true, 306ed8ee42cSDaniel P. Berrange GNUTLS_KEY_DIGITAL_SIGNATURE | GNUTLS_KEY_KEY_ENCIPHERMENT, 307ed8ee42cSDaniel P. Berrange true, true, GNUTLS_KP_TLS_WWW_SERVER, NULL, 308ed8ee42cSDaniel P. Berrange 0, 0); 309ed8ee42cSDaniel P. Berrange TLS_CERT_REQ(clientcertreq, cacertreq, 310ed8ee42cSDaniel P. Berrange "UK", "qemu", NULL, NULL, NULL, NULL, 311ed8ee42cSDaniel P. Berrange true, true, false, 312ed8ee42cSDaniel P. Berrange true, true, 313ed8ee42cSDaniel P. Berrange GNUTLS_KEY_DIGITAL_SIGNATURE | GNUTLS_KEY_KEY_ENCIPHERMENT, 314ed8ee42cSDaniel P. Berrange true, true, GNUTLS_KP_TLS_WWW_CLIENT, NULL, 315ed8ee42cSDaniel P. Berrange 0, 0); 316ed8ee42cSDaniel P. Berrange 317ed8ee42cSDaniel P. Berrange const char *const wildcards[] = { 318ed8ee42cSDaniel P. Berrange "C=UK,CN=qemu*", 319ed8ee42cSDaniel P. Berrange NULL, 320ed8ee42cSDaniel P. Berrange }; 321ed8ee42cSDaniel P. Berrange TEST_CHANNEL(basic, cacertreq.filename, servercertreq.filename, 322ed8ee42cSDaniel P. Berrange clientcertreq.filename, false, false, 323ed8ee42cSDaniel P. Berrange "qemu.org", wildcards); 324ed8ee42cSDaniel P. Berrange 325ed8ee42cSDaniel P. Berrange ret = g_test_run(); 326ed8ee42cSDaniel P. Berrange 327ed8ee42cSDaniel P. Berrange test_tls_discard_cert(&clientcertreq); 328ed8ee42cSDaniel P. Berrange test_tls_discard_cert(&servercertreq); 329ed8ee42cSDaniel P. Berrange test_tls_discard_cert(&cacertreq); 330ed8ee42cSDaniel P. Berrange 331ed8ee42cSDaniel P. Berrange test_tls_cleanup(KEYFILE); 332ed8ee42cSDaniel P. Berrange rmdir(WORKDIR); 333ed8ee42cSDaniel P. Berrange 334ed8ee42cSDaniel P. Berrange return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; 335ed8ee42cSDaniel P. Berrange } 336ed8ee42cSDaniel P. Berrange 337ed8ee42cSDaniel P. Berrange #else /* ! QCRYPTO_HAVE_TLS_TEST_SUPPORT */ 338ed8ee42cSDaniel P. Berrange 339ed8ee42cSDaniel P. Berrange int 340ed8ee42cSDaniel P. Berrange main(void) 341ed8ee42cSDaniel P. Berrange { 342ed8ee42cSDaniel P. Berrange return EXIT_SUCCESS; 343ed8ee42cSDaniel P. Berrange } 344ed8ee42cSDaniel P. Berrange 345ed8ee42cSDaniel P. Berrange #endif /* ! QCRYPTO_HAVE_TLS_TEST_SUPPORT */ 346