Blame test/ssltest_old.c

Packit Service 084de1
/*
Packit Service 084de1
 * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
Packit Service 084de1
 * Copyright 2005 Nokia. All rights reserved.
Packit Service 084de1
 *
Packit Service 084de1
 * Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
 * this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
 * in the file LICENSE in the source distribution or at
Packit Service 084de1
 * https://www.openssl.org/source/license.html
Packit Service 084de1
 */
Packit Service 084de1
Packit Service 084de1
#include "e_os.h"
Packit Service 084de1
Packit Service 084de1
/* Or gethostname won't be declared properly on Linux and GNU platforms. */
Packit Service 084de1
#ifndef _BSD_SOURCE
Packit Service 084de1
# define _BSD_SOURCE 1
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef _DEFAULT_SOURCE
Packit Service 084de1
# define _DEFAULT_SOURCE 1
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
#include <assert.h>
Packit Service 084de1
#include <errno.h>
Packit Service 084de1
#include <limits.h>
Packit Service 084de1
#include <stdio.h>
Packit Service 084de1
#include <stdlib.h>
Packit Service 084de1
#include <string.h>
Packit Service 084de1
#include <time.h>
Packit Service 084de1
Packit Service 084de1
#include "internal/nelem.h"
Packit Service 084de1
Packit Service 084de1
#ifdef OPENSSL_SYS_VMS
Packit Service 084de1
/*
Packit Service 084de1
 * Or isascii won't be declared properly on VMS (at least with DECompHP C).
Packit Service 084de1
 */
Packit Service 084de1
# define _XOPEN_SOURCE 500
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
#include <ctype.h>
Packit Service 084de1
Packit Service 084de1
#include <openssl/bio.h>
Packit Service 084de1
#include <openssl/crypto.h>
Packit Service 084de1
#include <openssl/evp.h>
Packit Service 084de1
#include <openssl/x509.h>
Packit Service 084de1
#include <openssl/x509v3.h>
Packit Service 084de1
#include <openssl/ssl.h>
Packit Service 084de1
#include <openssl/err.h>
Packit Service 084de1
#include <openssl/rand.h>
Packit Service 084de1
#ifndef OPENSSL_NO_RSA
Packit Service 084de1
# include <openssl/rsa.h>
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_DSA
Packit Service 084de1
# include <openssl/dsa.h>
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_DH
Packit Service 084de1
# include <openssl/dh.h>
Packit Service 084de1
#endif
Packit Service 084de1
#include <openssl/bn.h>
Packit Service 084de1
#ifndef OPENSSL_NO_CT
Packit Service 084de1
# include <openssl/ct.h>
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Or gethostname won't be declared properly
Packit Service 084de1
 * on Compaq platforms (at least with DEC C).
Packit Service 084de1
 * Do not try to put it earlier, or IPv6 includes
Packit Service 084de1
 * get screwed...
Packit Service 084de1
 */
Packit Service 084de1
#define _XOPEN_SOURCE_EXTENDED  1
Packit Service 084de1
Packit Service 084de1
#ifdef OPENSSL_SYS_WINDOWS
Packit Service 084de1
# include <winsock.h>
Packit Service 084de1
#else
Packit Service 084de1
# include OPENSSL_UNISTD
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
static SSL_CTX *s_ctx = NULL;
Packit Service 084de1
static SSL_CTX *s_ctx2 = NULL;
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * There is really no standard for this, so let's assign something
Packit Service 084de1
 * only for this test
Packit Service 084de1
 */
Packit Service 084de1
#define COMP_ZLIB       1
Packit Service 084de1
Packit Service 084de1
static int verify_callback(int ok, X509_STORE_CTX *ctx);
Packit Service 084de1
static int app_verify_callback(X509_STORE_CTX *ctx, void *arg);
Packit Service 084de1
#define APP_CALLBACK_STRING "Test Callback Argument"
Packit Service 084de1
struct app_verify_arg {
Packit Service 084de1
    char *string;
Packit Service 084de1
    int app_verify;
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_DH
Packit Service 084de1
static DH *get_dh512(void);
Packit Service 084de1
static DH *get_dh1024(void);
Packit Service 084de1
static DH *get_dh1024dsa(void);
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
static char *psk_key = NULL;    /* by default PSK is not used */
Packit Service 084de1
#ifndef OPENSSL_NO_PSK
Packit Service 084de1
static unsigned int psk_client_callback(SSL *ssl, const char *hint,
Packit Service 084de1
                                        char *identity,
Packit Service 084de1
                                        unsigned int max_identity_len,
Packit Service 084de1
                                        unsigned char *psk,
Packit Service 084de1
                                        unsigned int max_psk_len);
Packit Service 084de1
static unsigned int psk_server_callback(SSL *ssl, const char *identity,
Packit Service 084de1
                                        unsigned char *psk,
Packit Service 084de1
                                        unsigned int max_psk_len);
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
static BIO *bio_err = NULL;
Packit Service 084de1
static BIO *bio_stdout = NULL;
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_NEXTPROTONEG
Packit Service 084de1
/* Note that this code assumes that this is only a one element list: */
Packit Service 084de1
static const char NEXT_PROTO_STRING[] = "\x09testproto";
Packit Service 084de1
static int npn_client = 0;
Packit Service 084de1
static int npn_server = 0;
Packit Service 084de1
static int npn_server_reject = 0;
Packit Service 084de1
Packit Service 084de1
static int cb_client_npn(SSL *s, unsigned char **out, unsigned char *outlen,
Packit Service 084de1
                         const unsigned char *in, unsigned int inlen,
Packit Service 084de1
                         void *arg)
Packit Service 084de1
{
Packit Service 084de1
    /*
Packit Service 084de1
     * This callback only returns the protocol string, rather than a length
Packit Service 084de1
     * prefixed set. We assume that NEXT_PROTO_STRING is a one element list
Packit Service 084de1
     * and remove the first byte to chop off the length prefix.
Packit Service 084de1
     */
Packit Service 084de1
    *out = (unsigned char *)NEXT_PROTO_STRING + 1;
Packit Service 084de1
    *outlen = sizeof(NEXT_PROTO_STRING) - 2;
Packit Service 084de1
    return SSL_TLSEXT_ERR_OK;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int cb_server_npn(SSL *s, const unsigned char **data,
Packit Service 084de1
                         unsigned int *len, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    *data = (const unsigned char *)NEXT_PROTO_STRING;
Packit Service 084de1
    *len = sizeof(NEXT_PROTO_STRING) - 1;
Packit Service 084de1
    return SSL_TLSEXT_ERR_OK;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int cb_server_rejects_npn(SSL *s, const unsigned char **data,
Packit Service 084de1
                                 unsigned int *len, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    return SSL_TLSEXT_ERR_NOACK;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int verify_npn(SSL *client, SSL *server)
Packit Service 084de1
{
Packit Service 084de1
    const unsigned char *client_s;
Packit Service 084de1
    unsigned client_len;
Packit Service 084de1
    const unsigned char *server_s;
Packit Service 084de1
    unsigned server_len;
Packit Service 084de1
Packit Service 084de1
    SSL_get0_next_proto_negotiated(client, &client_s, &client_len);
Packit Service 084de1
    SSL_get0_next_proto_negotiated(server, &server_s, &server_len);
Packit Service 084de1
Packit Service 084de1
    if (client_len) {
Packit Service 084de1
        BIO_printf(bio_stdout, "Client NPN: ");
Packit Service 084de1
        BIO_write(bio_stdout, client_s, client_len);
Packit Service 084de1
        BIO_printf(bio_stdout, "\n");
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (server_len) {
Packit Service 084de1
        BIO_printf(bio_stdout, "Server NPN: ");
Packit Service 084de1
        BIO_write(bio_stdout, server_s, server_len);
Packit Service 084de1
        BIO_printf(bio_stdout, "\n");
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * If an NPN string was returned, it must be the protocol that we
Packit Service 084de1
     * expected to negotiate.
Packit Service 084de1
     */
Packit Service 084de1
    if (client_len && (client_len != sizeof(NEXT_PROTO_STRING) - 2 ||
Packit Service 084de1
                       memcmp(client_s, NEXT_PROTO_STRING + 1, client_len)))
Packit Service 084de1
        return -1;
Packit Service 084de1
    if (server_len && (server_len != sizeof(NEXT_PROTO_STRING) - 2 ||
Packit Service 084de1
                       memcmp(server_s, NEXT_PROTO_STRING + 1, server_len)))
Packit Service 084de1
        return -1;
Packit Service 084de1
Packit Service 084de1
    if (!npn_client && client_len)
Packit Service 084de1
        return -1;
Packit Service 084de1
    if (!npn_server && server_len)
Packit Service 084de1
        return -1;
Packit Service 084de1
    if (npn_server_reject && server_len)
Packit Service 084de1
        return -1;
Packit Service 084de1
    if (npn_client && npn_server && (!client_len || !server_len))
Packit Service 084de1
        return -1;
Packit Service 084de1
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
static const char *alpn_client;
Packit Service 084de1
static char *alpn_server;
Packit Service 084de1
static char *alpn_server2;
Packit Service 084de1
static const char *alpn_expected;
Packit Service 084de1
static unsigned char *alpn_selected;
Packit Service 084de1
static const char *server_min_proto;
Packit Service 084de1
static const char *server_max_proto;
Packit Service 084de1
static const char *client_min_proto;
Packit Service 084de1
static const char *client_max_proto;
Packit Service 084de1
static const char *should_negotiate;
Packit Service 084de1
static const char *sn_client;
Packit Service 084de1
static const char *sn_server1;
Packit Service 084de1
static const char *sn_server2;
Packit Service 084de1
static int sn_expect = 0;
Packit Service 084de1
static const char *server_sess_out;
Packit Service 084de1
static const char *server_sess_in;
Packit Service 084de1
static const char *client_sess_out;
Packit Service 084de1
static const char *client_sess_in;
Packit Service 084de1
static SSL_SESSION *server_sess;
Packit Service 084de1
static SSL_SESSION *client_sess;
Packit Service 084de1
Packit Service 084de1
static int servername_cb(SSL *s, int *ad, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
Packit Service 084de1
    if (sn_server2 == NULL) {
Packit Service 084de1
        BIO_printf(bio_stdout, "Servername 2 is NULL\n");
Packit Service 084de1
        return SSL_TLSEXT_ERR_NOACK;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (servername) {
Packit Service 084de1
        if (s_ctx2 != NULL && sn_server2 != NULL &&
Packit Service 084de1
            !strcasecmp(servername, sn_server2)) {
Packit Service 084de1
            BIO_printf(bio_stdout, "Switching server context.\n");
Packit Service 084de1
            SSL_set_SSL_CTX(s, s_ctx2);
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    return SSL_TLSEXT_ERR_OK;
Packit Service 084de1
}
Packit Service 084de1
static int verify_servername(SSL *client, SSL *server)
Packit Service 084de1
{
Packit Service 084de1
    /* just need to see if sn_context is what we expect */
Packit Service 084de1
    SSL_CTX* ctx = SSL_get_SSL_CTX(server);
Packit Service 084de1
    if (sn_expect == 0)
Packit Service 084de1
        return 0;
Packit Service 084de1
    if (sn_expect == 1 && ctx == s_ctx)
Packit Service 084de1
        return 0;
Packit Service 084de1
    if (sn_expect == 2 && ctx == s_ctx2)
Packit Service 084de1
        return 0;
Packit Service 084de1
    BIO_printf(bio_stdout, "Servername: expected context %d\n", sn_expect);
Packit Service 084de1
    if (ctx == s_ctx2)
Packit Service 084de1
        BIO_printf(bio_stdout, "Servername: context is 2\n");
Packit Service 084de1
    else if (ctx == s_ctx)
Packit Service 084de1
        BIO_printf(bio_stdout, "Servername: context is 1\n");
Packit Service 084de1
    else
Packit Service 084de1
        BIO_printf(bio_stdout, "Servername: context is unknown\n");
Packit Service 084de1
    return -1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
Packit Service 084de1
/*-
Packit Service 084de1
 * next_protos_parse parses a comma separated list of strings into a string
Packit Service 084de1
 * in a format suitable for passing to SSL_CTX_set_next_protos_advertised.
Packit Service 084de1
 *   outlen: (output) set to the length of the resulting buffer on success.
Packit Service 084de1
 *   in: a NUL terminated string like "abc,def,ghi"
Packit Service 084de1
 *
Packit Service 084de1
 *   returns: a malloced buffer or NULL on failure.
Packit Service 084de1
 */
Packit Service 084de1
static unsigned char *next_protos_parse(size_t *outlen,
Packit Service 084de1
                                        const char *in)
Packit Service 084de1
{
Packit Service 084de1
    size_t len;
Packit Service 084de1
    unsigned char *out;
Packit Service 084de1
    size_t i, start = 0;
Packit Service 084de1
Packit Service 084de1
    len = strlen(in);
Packit Service 084de1
    if (len >= 65535)
Packit Service 084de1
        return NULL;
Packit Service 084de1
Packit Service 084de1
    out = OPENSSL_malloc(strlen(in) + 1);
Packit Service 084de1
    if (!out)
Packit Service 084de1
        return NULL;
Packit Service 084de1
Packit Service 084de1
    for (i = 0; i <= len; ++i) {
Packit Service 084de1
        if (i == len || in[i] == ',') {
Packit Service 084de1
            if (i - start > 255) {
Packit Service 084de1
                OPENSSL_free(out);
Packit Service 084de1
                return NULL;
Packit Service 084de1
            }
Packit Service 084de1
            out[start] = (unsigned char)(i - start);
Packit Service 084de1
            start = i + 1;
Packit Service 084de1
        } else
Packit Service 084de1
            out[i + 1] = in[i];
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    *outlen = len + 1;
Packit Service 084de1
    return out;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int cb_server_alpn(SSL *s, const unsigned char **out,
Packit Service 084de1
                          unsigned char *outlen, const unsigned char *in,
Packit Service 084de1
                          unsigned int inlen, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    unsigned char *protos;
Packit Service 084de1
    size_t protos_len;
Packit Service 084de1
    char* alpn_str = arg;
Packit Service 084de1
Packit Service 084de1
    protos = next_protos_parse(&protos_len, alpn_str);
Packit Service 084de1
    if (protos == NULL) {
Packit Service 084de1
        fprintf(stderr, "failed to parser ALPN server protocol string: %s\n",
Packit Service 084de1
                alpn_str);
Packit Service 084de1
        abort();
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (SSL_select_next_proto
Packit Service 084de1
        ((unsigned char **)out, outlen, protos, protos_len, in,
Packit Service 084de1
         inlen) != OPENSSL_NPN_NEGOTIATED) {
Packit Service 084de1
        OPENSSL_free(protos);
Packit Service 084de1
        return SSL_TLSEXT_ERR_NOACK;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Make a copy of the selected protocol which will be freed in
Packit Service 084de1
     * verify_alpn.
Packit Service 084de1
     */
Packit Service 084de1
    alpn_selected = OPENSSL_malloc(*outlen);
Packit Service 084de1
    memcpy(alpn_selected, *out, *outlen);
Packit Service 084de1
    *out = alpn_selected;
Packit Service 084de1
Packit Service 084de1
    OPENSSL_free(protos);
Packit Service 084de1
    return SSL_TLSEXT_ERR_OK;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int verify_alpn(SSL *client, SSL *server)
Packit Service 084de1
{
Packit Service 084de1
    const unsigned char *client_proto, *server_proto;
Packit Service 084de1
    unsigned int client_proto_len = 0, server_proto_len = 0;
Packit Service 084de1
    SSL_get0_alpn_selected(client, &client_proto, &client_proto_len);
Packit Service 084de1
    SSL_get0_alpn_selected(server, &server_proto, &server_proto_len);
Packit Service 084de1
Packit Service 084de1
    OPENSSL_free(alpn_selected);
Packit Service 084de1
    alpn_selected = NULL;
Packit Service 084de1
Packit Service 084de1
    if (client_proto_len != server_proto_len) {
Packit Service 084de1
        BIO_printf(bio_stdout, "ALPN selected protocols differ!\n");
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (client_proto != NULL &&
Packit Service 084de1
        memcmp(client_proto, server_proto, client_proto_len) != 0) {
Packit Service 084de1
        BIO_printf(bio_stdout, "ALPN selected protocols differ!\n");
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (client_proto_len > 0 && alpn_expected == NULL) {
Packit Service 084de1
        BIO_printf(bio_stdout, "ALPN unexpectedly negotiated\n");
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (alpn_expected != NULL &&
Packit Service 084de1
        (client_proto_len != strlen(alpn_expected) ||
Packit Service 084de1
         memcmp(client_proto, alpn_expected, client_proto_len) != 0)) {
Packit Service 084de1
        BIO_printf(bio_stdout,
Packit Service 084de1
                   "ALPN selected protocols not equal to expected protocol: %s\n",
Packit Service 084de1
                   alpn_expected);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 0;
Packit Service 084de1
Packit Service 084de1
 err:
Packit Service 084de1
    BIO_printf(bio_stdout, "ALPN results: client: '");
Packit Service 084de1
    BIO_write(bio_stdout, client_proto, client_proto_len);
Packit Service 084de1
    BIO_printf(bio_stdout, "', server: '");
Packit Service 084de1
    BIO_write(bio_stdout, server_proto, server_proto_len);
Packit Service 084de1
    BIO_printf(bio_stdout, "'\n");
Packit Service 084de1
    BIO_printf(bio_stdout, "ALPN configured: client: '%s', server: '",
Packit Service 084de1
                   alpn_client);
Packit Service 084de1
    if (SSL_get_SSL_CTX(server) == s_ctx2) {
Packit Service 084de1
        BIO_printf(bio_stdout, "%s'\n",
Packit Service 084de1
                   alpn_server2);
Packit Service 084de1
    } else {
Packit Service 084de1
        BIO_printf(bio_stdout, "%s'\n",
Packit Service 084de1
                   alpn_server);
Packit Service 084de1
    }
Packit Service 084de1
    return -1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * WARNING : below extension types are *NOT* IETF assigned, and could
Packit Service 084de1
 * conflict if these types are reassigned and handled specially by OpenSSL
Packit Service 084de1
 * in the future
Packit Service 084de1
 */
Packit Service 084de1
#define TACK_EXT_TYPE 62208
Packit Service 084de1
#define CUSTOM_EXT_TYPE_0 1000
Packit Service 084de1
#define CUSTOM_EXT_TYPE_1 1001
Packit Service 084de1
#define CUSTOM_EXT_TYPE_2 1002
Packit Service 084de1
#define CUSTOM_EXT_TYPE_3 1003
Packit Service 084de1
Packit Service 084de1
static const char custom_ext_cli_string[] = "abc";
Packit Service 084de1
static const char custom_ext_srv_string[] = "defg";
Packit Service 084de1
Packit Service 084de1
/* These set from cmdline */
Packit Service 084de1
static char *serverinfo_file = NULL;
Packit Service 084de1
static int serverinfo_sct = 0;
Packit Service 084de1
static int serverinfo_tack = 0;
Packit Service 084de1
Packit Service 084de1
/* These set based on extension callbacks */
Packit Service 084de1
static int serverinfo_sct_seen = 0;
Packit Service 084de1
static int serverinfo_tack_seen = 0;
Packit Service 084de1
static int serverinfo_other_seen = 0;
Packit Service 084de1
Packit Service 084de1
/* This set from cmdline */
Packit Service 084de1
static int custom_ext = 0;
Packit Service 084de1
Packit Service 084de1
/* This set based on extension callbacks */
Packit Service 084de1
static int custom_ext_error = 0;
Packit Service 084de1
Packit Service 084de1
static int serverinfo_cli_parse_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                   const unsigned char *in, size_t inlen,
Packit Service 084de1
                                   int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    if (ext_type == TLSEXT_TYPE_signed_certificate_timestamp)
Packit Service 084de1
        serverinfo_sct_seen++;
Packit Service 084de1
    else if (ext_type == TACK_EXT_TYPE)
Packit Service 084de1
        serverinfo_tack_seen++;
Packit Service 084de1
    else
Packit Service 084de1
        serverinfo_other_seen++;
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int verify_serverinfo(void)
Packit Service 084de1
{
Packit Service 084de1
    if (serverinfo_sct != serverinfo_sct_seen)
Packit Service 084de1
        return -1;
Packit Service 084de1
    if (serverinfo_tack != serverinfo_tack_seen)
Packit Service 084de1
        return -1;
Packit Service 084de1
    if (serverinfo_other_seen)
Packit Service 084de1
        return -1;
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*-
Packit Service 084de1
 * Four test cases for custom extensions:
Packit Service 084de1
 * 0 - no ClientHello extension or ServerHello response
Packit Service 084de1
 * 1 - ClientHello with "abc", no response
Packit Service 084de1
 * 2 - ClientHello with "abc", empty response
Packit Service 084de1
 * 3 - ClientHello with "abc", "defg" response
Packit Service 084de1
 */
Packit Service 084de1
Packit Service 084de1
static int custom_ext_0_cli_add_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                   const unsigned char **out,
Packit Service 084de1
                                   size_t *outlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    if (ext_type != CUSTOM_EXT_TYPE_0)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    return 0;                   /* Don't send an extension */
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_0_cli_parse_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                     const unsigned char *in,
Packit Service 084de1
                                     size_t inlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_1_cli_add_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                   const unsigned char **out,
Packit Service 084de1
                                   size_t *outlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    if (ext_type != CUSTOM_EXT_TYPE_1)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    *out = (const unsigned char *)custom_ext_cli_string;
Packit Service 084de1
    *outlen = strlen(custom_ext_cli_string);
Packit Service 084de1
    return 1;                   /* Send "abc" */
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_1_cli_parse_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                     const unsigned char *in,
Packit Service 084de1
                                     size_t inlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_2_cli_add_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                   const unsigned char **out,
Packit Service 084de1
                                   size_t *outlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    if (ext_type != CUSTOM_EXT_TYPE_2)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    *out = (const unsigned char *)custom_ext_cli_string;
Packit Service 084de1
    *outlen = strlen(custom_ext_cli_string);
Packit Service 084de1
    return 1;                   /* Send "abc" */
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_2_cli_parse_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                     const unsigned char *in,
Packit Service 084de1
                                     size_t inlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    if (ext_type != CUSTOM_EXT_TYPE_2)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    if (inlen != 0)
Packit Service 084de1
        custom_ext_error = 1;   /* Should be empty response */
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_3_cli_add_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                   const unsigned char **out,
Packit Service 084de1
                                   size_t *outlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    if (ext_type != CUSTOM_EXT_TYPE_3)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    *out = (const unsigned char *)custom_ext_cli_string;
Packit Service 084de1
    *outlen = strlen(custom_ext_cli_string);
Packit Service 084de1
    return 1;                   /* Send "abc" */
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_3_cli_parse_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                     const unsigned char *in,
Packit Service 084de1
                                     size_t inlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    if (ext_type != CUSTOM_EXT_TYPE_3)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    if (inlen != strlen(custom_ext_srv_string))
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    if (memcmp(custom_ext_srv_string, in, inlen) != 0)
Packit Service 084de1
        custom_ext_error = 1;   /* Check for "defg" */
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * custom_ext_0_cli_add_cb returns 0 - the server won't receive a callback
Packit Service 084de1
 * for this extension
Packit Service 084de1
 */
Packit Service 084de1
static int custom_ext_0_srv_parse_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                     const unsigned char *in,
Packit Service 084de1
                                     size_t inlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    custom_ext_error = 1;
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/* 'add' callbacks are only called if the 'parse' callback is called */
Packit Service 084de1
static int custom_ext_0_srv_add_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                   const unsigned char **out,
Packit Service 084de1
                                   size_t *outlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    /* Error: should not have been called */
Packit Service 084de1
    custom_ext_error = 1;
Packit Service 084de1
    return 0;                   /* Don't send an extension */
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_1_srv_parse_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                     const unsigned char *in,
Packit Service 084de1
                                     size_t inlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    if (ext_type != CUSTOM_EXT_TYPE_1)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    /* Check for "abc" */
Packit Service 084de1
    if (inlen != strlen(custom_ext_cli_string))
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    if (memcmp(in, custom_ext_cli_string, inlen) != 0)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_1_srv_add_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                   const unsigned char **out,
Packit Service 084de1
                                   size_t *outlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    return 0;                   /* Don't send an extension */
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_2_srv_parse_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                     const unsigned char *in,
Packit Service 084de1
                                     size_t inlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    if (ext_type != CUSTOM_EXT_TYPE_2)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    /* Check for "abc" */
Packit Service 084de1
    if (inlen != strlen(custom_ext_cli_string))
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    if (memcmp(in, custom_ext_cli_string, inlen) != 0)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_2_srv_add_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                   const unsigned char **out,
Packit Service 084de1
                                   size_t *outlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    *out = NULL;
Packit Service 084de1
    *outlen = 0;
Packit Service 084de1
    return 1;                   /* Send empty extension */
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_3_srv_parse_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                     const unsigned char *in,
Packit Service 084de1
                                     size_t inlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    if (ext_type != CUSTOM_EXT_TYPE_3)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    /* Check for "abc" */
Packit Service 084de1
    if (inlen != strlen(custom_ext_cli_string))
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    if (memcmp(in, custom_ext_cli_string, inlen) != 0)
Packit Service 084de1
        custom_ext_error = 1;
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int custom_ext_3_srv_add_cb(SSL *s, unsigned int ext_type,
Packit Service 084de1
                                   const unsigned char **out,
Packit Service 084de1
                                   size_t *outlen, int *al, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    *out = (const unsigned char *)custom_ext_srv_string;
Packit Service 084de1
    *outlen = strlen(custom_ext_srv_string);
Packit Service 084de1
    return 1;                   /* Send "defg" */
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static char *cipher = NULL;
Packit Service 084de1
static char *ciphersuites = NULL;
Packit Service 084de1
static int verbose = 0;
Packit Service 084de1
static int debug = 0;
Packit Service 084de1
Packit Service 084de1
int doit_localhost(SSL *s_ssl, SSL *c_ssl, int family,
Packit Service 084de1
                   long bytes, clock_t *s_time, clock_t *c_time);
Packit Service 084de1
int doit_biopair(SSL *s_ssl, SSL *c_ssl, long bytes, clock_t *s_time,
Packit Service 084de1
                 clock_t *c_time);
Packit Service 084de1
int doit(SSL *s_ssl, SSL *c_ssl, long bytes);
Packit Service 084de1
Packit Service 084de1
static void sv_usage(void)
Packit Service 084de1
{
Packit Service 084de1
    fprintf(stderr, "usage: ssltest [args ...]\n");
Packit Service 084de1
    fprintf(stderr, "\n");
Packit Service 084de1
    fprintf(stderr, " -server_auth  - check server certificate\n");
Packit Service 084de1
    fprintf(stderr, " -client_auth  - do client authentication\n");
Packit Service 084de1
    fprintf(stderr, " -v            - more output\n");
Packit Service 084de1
    fprintf(stderr, " -d            - debug output\n");
Packit Service 084de1
    fprintf(stderr, " -reuse        - use session-id reuse\n");
Packit Service 084de1
    fprintf(stderr, " -num <val>    - number of connections to perform\n");
Packit Service 084de1
    fprintf(stderr,
Packit Service 084de1
            " -bytes <val>  - number of bytes to swap between client/server\n");
Packit Service 084de1
#ifndef OPENSSL_NO_DH
Packit Service 084de1
    fprintf(stderr,
Packit Service 084de1
            " -dhe512       - use 512 bit key for DHE (to test failure)\n");
Packit Service 084de1
    fprintf(stderr,
Packit Service 084de1
            " -dhe1024      - use 1024 bit key (safe prime) for DHE (default, no-op)\n");
Packit Service 084de1
    fprintf(stderr,
Packit Service 084de1
            " -dhe1024dsa   - use 1024 bit key (with 160-bit subprime) for DHE\n");
Packit Service 084de1
    fprintf(stderr, " -no_dhe       - disable DHE\n");
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_EC
Packit Service 084de1
    fprintf(stderr, " -no_ecdhe     - disable ECDHE\nTODO(openssl-team): no_ecdhe was broken by auto ecdh. Make this work again.\n");
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_PSK
Packit Service 084de1
    fprintf(stderr, " -psk arg      - PSK in hex (without 0x)\n");
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_SSL3
Packit Service 084de1
    fprintf(stderr, " -ssl3         - use SSLv3\n");
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_TLS1
Packit Service 084de1
    fprintf(stderr, " -tls1         - use TLSv1\n");
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_DTLS
Packit Service 084de1
    fprintf(stderr, " -dtls         - use DTLS\n");
Packit Service 084de1
#ifndef OPENSSL_NO_DTLS1
Packit Service 084de1
    fprintf(stderr, " -dtls1        - use DTLSv1\n");
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_DTLS1_2
Packit Service 084de1
    fprintf(stderr, " -dtls12       - use DTLSv1.2\n");
Packit Service 084de1
#endif
Packit Service 084de1
#endif
Packit Service 084de1
    fprintf(stderr, " -CApath arg   - PEM format directory of CA's\n");
Packit Service 084de1
    fprintf(stderr, " -CAfile arg   - PEM format file of CA's\n");
Packit Service 084de1
    fprintf(stderr, " -cert arg     - Server certificate file\n");
Packit Service 084de1
    fprintf(stderr,
Packit Service 084de1
            " -key arg      - Server key file (default: same as -cert)\n");
Packit Service 084de1
    fprintf(stderr, " -c_cert arg   - Client certificate file\n");
Packit Service 084de1
    fprintf(stderr,
Packit Service 084de1
            " -c_key arg    - Client key file (default: same as -c_cert)\n");
Packit Service 084de1
    fprintf(stderr, " -cipher arg   - The TLSv1.2 and below cipher list\n");
Packit Service 084de1
    fprintf(stderr, " -ciphersuites arg   - The TLSv1.3 ciphersuites\n");
Packit Service 084de1
    fprintf(stderr, " -bio_pair     - Use BIO pairs\n");
Packit Service 084de1
    fprintf(stderr, " -ipv4         - Use IPv4 connection on localhost\n");
Packit Service 084de1
    fprintf(stderr, " -ipv6         - Use IPv6 connection on localhost\n");
Packit Service 084de1
    fprintf(stderr, " -f            - Test even cases that can't work\n");
Packit Service 084de1
    fprintf(stderr,
Packit Service 084de1
            " -time         - measure processor time used by client and server\n");
Packit Service 084de1
    fprintf(stderr, " -zlib         - use zlib compression\n");
Packit Service 084de1
#ifndef OPENSSL_NO_NEXTPROTONEG
Packit Service 084de1
    fprintf(stderr, " -npn_client - have client side offer NPN\n");
Packit Service 084de1
    fprintf(stderr, " -npn_server - have server side offer NPN\n");
Packit Service 084de1
    fprintf(stderr, " -npn_server_reject - have server reject NPN\n");
Packit Service 084de1
#endif
Packit Service 084de1
    fprintf(stderr, " -serverinfo_file file - have server use this file\n");
Packit Service 084de1
    fprintf(stderr, " -serverinfo_sct  - have client offer and expect SCT\n");
Packit Service 084de1
    fprintf(stderr,
Packit Service 084de1
            " -serverinfo_tack - have client offer and expect TACK\n");
Packit Service 084de1
    fprintf(stderr,
Packit Service 084de1
            " -custom_ext - try various custom extension callbacks\n");
Packit Service 084de1
    fprintf(stderr, " -alpn_client <string> - have client side offer ALPN\n");
Packit Service 084de1
    fprintf(stderr, " -alpn_server <string> - have server side offer ALPN\n");
Packit Service 084de1
    fprintf(stderr, " -alpn_server1 <string> - alias for -alpn_server\n");
Packit Service 084de1
    fprintf(stderr, " -alpn_server2 <string> - have server side context 2 offer ALPN\n");
Packit Service 084de1
    fprintf(stderr,
Packit Service 084de1
            " -alpn_expected <string> - the ALPN protocol that should be negotiated\n");
Packit Service 084de1
    fprintf(stderr, " -server_min_proto <string> - Minimum version the server should support\n");
Packit Service 084de1
    fprintf(stderr, " -server_max_proto <string> - Maximum version the server should support\n");
Packit Service 084de1
    fprintf(stderr, " -client_min_proto <string> - Minimum version the client should support\n");
Packit Service 084de1
    fprintf(stderr, " -client_max_proto <string> - Maximum version the client should support\n");
Packit Service 084de1
    fprintf(stderr, " -should_negotiate <string> - The version that should be negotiated, fail-client or fail-server\n");
Packit Service 084de1
#ifndef OPENSSL_NO_CT
Packit Service 084de1
    fprintf(stderr, " -noct         - no certificate transparency\n");
Packit Service 084de1
    fprintf(stderr, " -requestct    - request certificate transparency\n");
Packit Service 084de1
    fprintf(stderr, " -requirect    - require certificate transparency\n");
Packit Service 084de1
#endif
Packit Service 084de1
    fprintf(stderr, " -sn_client <string>  - have client request this servername\n");
Packit Service 084de1
    fprintf(stderr, " -sn_server1 <string> - have server context 1 respond to this servername\n");
Packit Service 084de1
    fprintf(stderr, " -sn_server2 <string> - have server context 2 respond to this servername\n");
Packit Service 084de1
    fprintf(stderr, " -sn_expect1          - expected server 1\n");
Packit Service 084de1
    fprintf(stderr, " -sn_expect2          - expected server 2\n");
Packit Service 084de1
    fprintf(stderr, " -server_sess_out <file>    - Save the server session to a file\n");
Packit Service 084de1
    fprintf(stderr, " -server_sess_in <file>     - Read the server session from a file\n");
Packit Service 084de1
    fprintf(stderr, " -client_sess_out <file>    - Save the client session to a file\n");
Packit Service 084de1
    fprintf(stderr, " -client_sess_in <file>     - Read the client session from a file\n");
Packit Service 084de1
    fprintf(stderr, " -should_reuse <number>     - The expected state of reusing the session\n");
Packit Service 084de1
    fprintf(stderr, " -no_ticket    - do not issue TLS session ticket\n");
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static void print_key_details(BIO *out, EVP_PKEY *key)
Packit Service 084de1
{
Packit Service 084de1
    int keyid = EVP_PKEY_id(key);
Packit Service 084de1
#ifndef OPENSSL_NO_EC
Packit Service 084de1
    if (keyid == EVP_PKEY_EC) {
Packit Service 084de1
        EC_KEY *ec = EVP_PKEY_get1_EC_KEY(key);
Packit Service 084de1
        int nid;
Packit Service 084de1
        const char *cname;
Packit Service 084de1
        nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec));
Packit Service 084de1
        EC_KEY_free(ec);
Packit Service 084de1
        cname = EC_curve_nid2nist(nid);
Packit Service 084de1
        if (!cname)
Packit Service 084de1
            cname = OBJ_nid2sn(nid);
Packit Service 084de1
        BIO_printf(out, "%d bits EC (%s)", EVP_PKEY_bits(key), cname);
Packit Service 084de1
    } else
Packit Service 084de1
#endif
Packit Service 084de1
    {
Packit Service 084de1
        const char *algname;
Packit Service 084de1
        switch (keyid) {
Packit Service 084de1
        case EVP_PKEY_RSA:
Packit Service 084de1
            algname = "RSA";
Packit Service 084de1
            break;
Packit Service 084de1
        case EVP_PKEY_DSA:
Packit Service 084de1
            algname = "DSA";
Packit Service 084de1
            break;
Packit Service 084de1
        case EVP_PKEY_DH:
Packit Service 084de1
            algname = "DH";
Packit Service 084de1
            break;
Packit Service 084de1
        default:
Packit Service 084de1
            algname = OBJ_nid2sn(keyid);
Packit Service 084de1
            break;
Packit Service 084de1
        }
Packit Service 084de1
        BIO_printf(out, "%d bits %s", EVP_PKEY_bits(key), algname);
Packit Service 084de1
    }
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static void print_details(SSL *c_ssl, const char *prefix)
Packit Service 084de1
{
Packit Service 084de1
    const SSL_CIPHER *ciph;
Packit Service 084de1
    int mdnid;
Packit Service 084de1
    X509 *cert;
Packit Service 084de1
    EVP_PKEY *pkey;
Packit Service 084de1
Packit Service 084de1
    ciph = SSL_get_current_cipher(c_ssl);
Packit Service 084de1
    BIO_printf(bio_stdout, "%s%s, cipher %s %s",
Packit Service 084de1
               prefix,
Packit Service 084de1
               SSL_get_version(c_ssl),
Packit Service 084de1
               SSL_CIPHER_get_version(ciph), SSL_CIPHER_get_name(ciph));
Packit Service 084de1
    cert = SSL_get_peer_certificate(c_ssl);
Packit Service 084de1
    if (cert != NULL) {
Packit Service 084de1
        EVP_PKEY* pubkey = X509_get0_pubkey(cert);
Packit Service 084de1
Packit Service 084de1
        if (pubkey != NULL) {
Packit Service 084de1
            BIO_puts(bio_stdout, ", ");
Packit Service 084de1
            print_key_details(bio_stdout, pubkey);
Packit Service 084de1
        }
Packit Service 084de1
        X509_free(cert);
Packit Service 084de1
    }
Packit Service 084de1
    if (SSL_get_peer_tmp_key(c_ssl, &pkey)) {
Packit Service 084de1
        BIO_puts(bio_stdout, ", temp key: ");
Packit Service 084de1
        print_key_details(bio_stdout, pkey);
Packit Service 084de1
        EVP_PKEY_free(pkey);
Packit Service 084de1
    }
Packit Service 084de1
    if (SSL_get_peer_signature_nid(c_ssl, &mdnid))
Packit Service 084de1
        BIO_printf(bio_stdout, ", digest=%s", OBJ_nid2sn(mdnid));
Packit Service 084de1
    BIO_printf(bio_stdout, "\n");
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * protocol_from_string - converts a protocol version string to a number
Packit Service 084de1
 *
Packit Service 084de1
 * Returns -1 on failure or the version on success
Packit Service 084de1
 */
Packit Service 084de1
static int protocol_from_string(const char *value)
Packit Service 084de1
{
Packit Service 084de1
    struct protocol_versions {
Packit Service 084de1
        const char *name;
Packit Service 084de1
        int version;
Packit Service 084de1
    };
Packit Service 084de1
    static const struct protocol_versions versions[] = {
Packit Service 084de1
        {"ssl3", SSL3_VERSION},
Packit Service 084de1
        {"tls1", TLS1_VERSION},
Packit Service 084de1
        {"tls1.1", TLS1_1_VERSION},
Packit Service 084de1
        {"tls1.2", TLS1_2_VERSION},
Packit Service 084de1
        {"tls1.3", TLS1_3_VERSION},
Packit Service 084de1
        {"dtls1", DTLS1_VERSION},
Packit Service 084de1
        {"dtls1.2", DTLS1_2_VERSION}};
Packit Service 084de1
    size_t i;
Packit Service 084de1
    size_t n = OSSL_NELEM(versions);
Packit Service 084de1
Packit Service 084de1
    for (i = 0; i < n; i++)
Packit Service 084de1
        if (strcmp(versions[i].name, value) == 0)
Packit Service 084de1
            return versions[i].version;
Packit Service 084de1
    return -1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static SSL_SESSION *read_session(const char *filename)
Packit Service 084de1
{
Packit Service 084de1
    SSL_SESSION *sess;
Packit Service 084de1
    BIO *f = BIO_new_file(filename, "r");
Packit Service 084de1
Packit Service 084de1
    if (f == NULL) {
Packit Service 084de1
        BIO_printf(bio_err, "Can't open session file %s\n", filename);
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
        return NULL;
Packit Service 084de1
    }
Packit Service 084de1
    sess = PEM_read_bio_SSL_SESSION(f, NULL, 0, NULL);
Packit Service 084de1
    if (sess == NULL) {
Packit Service 084de1
        BIO_printf(bio_err, "Can't parse session file %s\n", filename);
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
    }
Packit Service 084de1
    BIO_free(f);
Packit Service 084de1
    return sess;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int write_session(const char *filename, SSL_SESSION *sess)
Packit Service 084de1
{
Packit Service 084de1
    BIO *f = BIO_new_file(filename, "w");
Packit Service 084de1
Packit Service 084de1
    if (sess == NULL) {
Packit Service 084de1
        BIO_printf(bio_err, "No session information\n");
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    if (f == NULL) {
Packit Service 084de1
        BIO_printf(bio_err, "Can't open session file %s\n", filename);
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    PEM_write_bio_SSL_SESSION(f, sess);
Packit Service 084de1
    BIO_free(f);
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * set_protocol_version - Sets protocol version minimum or maximum
Packit Service 084de1
 *
Packit Service 084de1
 * Returns 0 on failure and 1 on success
Packit Service 084de1
 */
Packit Service 084de1
static int set_protocol_version(const char *version, SSL *ssl, int setting)
Packit Service 084de1
{
Packit Service 084de1
    if (version != NULL) {
Packit Service 084de1
        int ver = protocol_from_string(version);
Packit Service 084de1
        if (ver < 0) {
Packit Service 084de1
            BIO_printf(bio_err, "Error parsing: %s\n", version);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        return SSL_ctrl(ssl, setting, ver, NULL);
Packit Service 084de1
    }
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int main(int argc, char *argv[])
Packit Service 084de1
{
Packit Service 084de1
    const char *CApath = NULL, *CAfile = NULL;
Packit Service 084de1
    int badop = 0;
Packit Service 084de1
    enum { BIO_MEM, BIO_PAIR, BIO_IPV4, BIO_IPV6 } bio_type = BIO_MEM;
Packit Service 084de1
    int force = 0;
Packit Service 084de1
    int dtls1 = 0, dtls12 = 0, dtls = 0, tls1 = 0, tls1_2 = 0, ssl3 = 0;
Packit Service 084de1
    int ret = EXIT_FAILURE;
Packit Service 084de1
    int client_auth = 0;
Packit Service 084de1
    int server_auth = 0, i;
Packit Service 084de1
    struct app_verify_arg app_verify_arg =
Packit Service 084de1
        { APP_CALLBACK_STRING, 0 };
Packit Service 084de1
    char *p;
Packit Service 084de1
    SSL_CTX *c_ctx = NULL;
Packit Service 084de1
    const SSL_METHOD *meth = NULL;
Packit Service 084de1
    SSL *c_ssl, *s_ssl;
Packit Service 084de1
    int number = 1, reuse = 0;
Packit Service 084de1
    int should_reuse = -1;
Packit Service 084de1
    int no_ticket = 0;
Packit Service 084de1
    long bytes = 256L;
Packit Service 084de1
#ifndef OPENSSL_NO_DH
Packit Service 084de1
    DH *dh;
Packit Service 084de1
    int dhe512 = 0, dhe1024dsa = 0;
Packit Service 084de1
#endif
Packit Service 084de1
    int no_dhe = 0;
Packit Service 084de1
    int no_psk = 0;
Packit Service 084de1
    int print_time = 0;
Packit Service 084de1
    clock_t s_time = 0, c_time = 0;
Packit Service 084de1
#ifndef OPENSSL_NO_COMP
Packit Service 084de1
    int n, comp = 0;
Packit Service 084de1
    COMP_METHOD *cm = NULL;
Packit Service 084de1
    STACK_OF(SSL_COMP) *ssl_comp_methods = NULL;
Packit Service 084de1
#endif
Packit Service 084de1
    int no_protocol;
Packit Service 084de1
    int min_version = 0, max_version = 0;
Packit Service 084de1
#ifndef OPENSSL_NO_CT
Packit Service 084de1
    /*
Packit Service 084de1
     * Disable CT validation by default, because it will interfere with
Packit Service 084de1
     * anything using custom extension handlers to deal with SCT extensions.
Packit Service 084de1
     */
Packit Service 084de1
    int ct_validation = 0;
Packit Service 084de1
#endif
Packit Service 084de1
    SSL_CONF_CTX *s_cctx = NULL, *c_cctx = NULL, *s_cctx2 = NULL;
Packit Service 084de1
    STACK_OF(OPENSSL_STRING) *conf_args = NULL;
Packit Service 084de1
    char *arg = NULL, *argn = NULL;
Packit Service 084de1
Packit Service 084de1
    verbose = 0;
Packit Service 084de1
    debug = 0;
Packit Service 084de1
Packit Service 084de1
    bio_err = BIO_new_fp(stderr, BIO_NOCLOSE | BIO_FP_TEXT);
Packit Service 084de1
Packit Service 084de1
    p = getenv("OPENSSL_DEBUG_MEMORY");
Packit Service 084de1
    if (p != NULL && strcmp(p, "on") == 0)
Packit Service 084de1
        CRYPTO_set_mem_debug(1);
Packit Service 084de1
    CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
Packit Service 084de1
Packit Service 084de1
    bio_stdout = BIO_new_fp(stdout, BIO_NOCLOSE | BIO_FP_TEXT);
Packit Service 084de1
Packit Service 084de1
    s_cctx = SSL_CONF_CTX_new();
Packit Service 084de1
    s_cctx2 = SSL_CONF_CTX_new();
Packit Service 084de1
    c_cctx = SSL_CONF_CTX_new();
Packit Service 084de1
Packit Service 084de1
    if (!s_cctx || !c_cctx || !s_cctx2) {
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
        goto end;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    SSL_CONF_CTX_set_flags(s_cctx,
Packit Service 084de1
                           SSL_CONF_FLAG_CMDLINE | SSL_CONF_FLAG_SERVER |
Packit Service 084de1
                           SSL_CONF_FLAG_CERTIFICATE |
Packit Service 084de1
                           SSL_CONF_FLAG_REQUIRE_PRIVATE);
Packit Service 084de1
    SSL_CONF_CTX_set_flags(s_cctx2,
Packit Service 084de1
                           SSL_CONF_FLAG_CMDLINE | SSL_CONF_FLAG_SERVER |
Packit Service 084de1
                           SSL_CONF_FLAG_CERTIFICATE |
Packit Service 084de1
                           SSL_CONF_FLAG_REQUIRE_PRIVATE);
Packit Service 084de1
    if (!SSL_CONF_CTX_set1_prefix(s_cctx, "-s_")) {
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
        goto end;
Packit Service 084de1
    }
Packit Service 084de1
    if (!SSL_CONF_CTX_set1_prefix(s_cctx2, "-s_")) {
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
        goto end;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    SSL_CONF_CTX_set_flags(c_cctx,
Packit Service 084de1
                           SSL_CONF_FLAG_CMDLINE | SSL_CONF_FLAG_CLIENT |
Packit Service 084de1
                           SSL_CONF_FLAG_CERTIFICATE |
Packit Service 084de1
                           SSL_CONF_FLAG_REQUIRE_PRIVATE);
Packit Service 084de1
    if (!SSL_CONF_CTX_set1_prefix(c_cctx, "-c_")) {
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
        goto end;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    argc--;
Packit Service 084de1
    argv++;
Packit Service 084de1
Packit Service 084de1
    while (argc >= 1) {
Packit Service 084de1
        if (strcmp(*argv, "-F") == 0) {
Packit Service 084de1
            fprintf(stderr,
Packit Service 084de1
                    "not compiled with FIPS support, so exiting without running.\n");
Packit Service 084de1
            EXIT(0);
Packit Service 084de1
        } else if (strcmp(*argv, "-server_auth") == 0)
Packit Service 084de1
            server_auth = 1;
Packit Service 084de1
        else if (strcmp(*argv, "-client_auth") == 0)
Packit Service 084de1
            client_auth = 1;
Packit Service 084de1
        else if (strcmp(*argv, "-v") == 0)
Packit Service 084de1
            verbose = 1;
Packit Service 084de1
        else if (strcmp(*argv, "-d") == 0)
Packit Service 084de1
            debug = 1;
Packit Service 084de1
        else if (strcmp(*argv, "-reuse") == 0)
Packit Service 084de1
            reuse = 1;
Packit Service 084de1
        else if (strcmp(*argv, "-dhe512") == 0) {
Packit Service 084de1
#ifndef OPENSSL_NO_DH
Packit Service 084de1
            dhe512 = 1;
Packit Service 084de1
#else
Packit Service 084de1
            fprintf(stderr,
Packit Service 084de1
                    "ignoring -dhe512, since I'm compiled without DH\n");
Packit Service 084de1
#endif
Packit Service 084de1
        } else if (strcmp(*argv, "-dhe1024dsa") == 0) {
Packit Service 084de1
#ifndef OPENSSL_NO_DH
Packit Service 084de1
            dhe1024dsa = 1;
Packit Service 084de1
#else
Packit Service 084de1
            fprintf(stderr,
Packit Service 084de1
                    "ignoring -dhe1024dsa, since I'm compiled without DH\n");
Packit Service 084de1
#endif
Packit Service 084de1
        } else if (strcmp(*argv, "-no_dhe") == 0)
Packit Service 084de1
            no_dhe = 1;
Packit Service 084de1
        else if (strcmp(*argv, "-no_ecdhe") == 0)
Packit Service 084de1
            /* obsolete */;
Packit Service 084de1
        else if (strcmp(*argv, "-psk") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            psk_key = *(++argv);
Packit Service 084de1
#ifndef OPENSSL_NO_PSK
Packit Service 084de1
            if (strspn(psk_key, "abcdefABCDEF1234567890") != strlen(psk_key)) {
Packit Service 084de1
                BIO_printf(bio_err, "Not a hex number '%s'\n", *argv);
Packit Service 084de1
                goto bad;
Packit Service 084de1
            }
Packit Service 084de1
#else
Packit Service 084de1
            no_psk = 1;
Packit Service 084de1
#endif
Packit Service 084de1
        }
Packit Service 084de1
        else if (strcmp(*argv, "-tls1_2") == 0) {
Packit Service 084de1
            tls1_2 = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-tls1") == 0) {
Packit Service 084de1
            tls1 = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-ssl3") == 0) {
Packit Service 084de1
            ssl3 = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-dtls1") == 0) {
Packit Service 084de1
            dtls1 = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-dtls12") == 0) {
Packit Service 084de1
            dtls12 = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-dtls") == 0) {
Packit Service 084de1
            dtls = 1;
Packit Service 084de1
        } else if (strncmp(*argv, "-num", 4) == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            number = atoi(*(++argv));
Packit Service 084de1
            if (number == 0)
Packit Service 084de1
                number = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-bytes") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            bytes = atol(*(++argv));
Packit Service 084de1
            if (bytes == 0L)
Packit Service 084de1
                bytes = 1L;
Packit Service 084de1
            i = strlen(argv[0]);
Packit Service 084de1
            if (argv[0][i - 1] == 'k')
Packit Service 084de1
                bytes *= 1024L;
Packit Service 084de1
            if (argv[0][i - 1] == 'm')
Packit Service 084de1
                bytes *= 1024L * 1024L;
Packit Service 084de1
        } else if (strcmp(*argv, "-cipher") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            cipher = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-ciphersuites") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            ciphersuites = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-CApath") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            CApath = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-CAfile") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            CAfile = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-bio_pair") == 0) {
Packit Service 084de1
            bio_type = BIO_PAIR;
Packit Service 084de1
        }
Packit Service 084de1
#ifndef OPENSSL_NO_SOCK
Packit Service 084de1
        else if (strcmp(*argv, "-ipv4") == 0) {
Packit Service 084de1
            bio_type = BIO_IPV4;
Packit Service 084de1
        } else if (strcmp(*argv, "-ipv6") == 0) {
Packit Service 084de1
            bio_type = BIO_IPV6;
Packit Service 084de1
        }
Packit Service 084de1
#endif
Packit Service 084de1
        else if (strcmp(*argv, "-f") == 0) {
Packit Service 084de1
            force = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-time") == 0) {
Packit Service 084de1
            print_time = 1;
Packit Service 084de1
        }
Packit Service 084de1
#ifndef OPENSSL_NO_CT
Packit Service 084de1
        else if (strcmp(*argv, "-noct") == 0) {
Packit Service 084de1
            ct_validation = 0;
Packit Service 084de1
        }
Packit Service 084de1
        else if (strcmp(*argv, "-ct") == 0) {
Packit Service 084de1
            ct_validation = 1;
Packit Service 084de1
        }
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_COMP
Packit Service 084de1
        else if (strcmp(*argv, "-zlib") == 0) {
Packit Service 084de1
            comp = COMP_ZLIB;
Packit Service 084de1
        }
Packit Service 084de1
#endif
Packit Service 084de1
        else if (strcmp(*argv, "-app_verify") == 0) {
Packit Service 084de1
            app_verify_arg.app_verify = 1;
Packit Service 084de1
        }
Packit Service 084de1
#ifndef OPENSSL_NO_NEXTPROTONEG
Packit Service 084de1
          else if (strcmp(*argv, "-npn_client") == 0) {
Packit Service 084de1
            npn_client = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-npn_server") == 0) {
Packit Service 084de1
            npn_server = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-npn_server_reject") == 0) {
Packit Service 084de1
            npn_server_reject = 1;
Packit Service 084de1
        }
Packit Service 084de1
#endif
Packit Service 084de1
        else if (strcmp(*argv, "-serverinfo_sct") == 0) {
Packit Service 084de1
            serverinfo_sct = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-serverinfo_tack") == 0) {
Packit Service 084de1
            serverinfo_tack = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-serverinfo_file") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            serverinfo_file = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-custom_ext") == 0) {
Packit Service 084de1
            custom_ext = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-alpn_client") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            alpn_client = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-alpn_server") == 0 ||
Packit Service 084de1
                   strcmp(*argv, "-alpn_server1") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            alpn_server = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-alpn_server2") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            alpn_server2 = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-alpn_expected") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            alpn_expected = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-server_min_proto") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            server_min_proto = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-server_max_proto") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            server_max_proto = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-client_min_proto") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            client_min_proto = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-client_max_proto") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            client_max_proto = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-should_negotiate") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            should_negotiate = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-sn_client") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            sn_client = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-sn_server1") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            sn_server1 = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-sn_server2") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            sn_server2 = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-sn_expect1") == 0) {
Packit Service 084de1
            sn_expect = 1;
Packit Service 084de1
        } else if (strcmp(*argv, "-sn_expect2") == 0) {
Packit Service 084de1
            sn_expect = 2;
Packit Service 084de1
        } else if (strcmp(*argv, "-server_sess_out") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            server_sess_out = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-server_sess_in") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            server_sess_in = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-client_sess_out") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            client_sess_out = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-client_sess_in") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            client_sess_in = *(++argv);
Packit Service 084de1
        } else if (strcmp(*argv, "-should_reuse") == 0) {
Packit Service 084de1
            if (--argc < 1)
Packit Service 084de1
                goto bad;
Packit Service 084de1
            should_reuse = !!atoi(*(++argv));
Packit Service 084de1
        } else if (strcmp(*argv, "-no_ticket") == 0) {
Packit Service 084de1
            no_ticket = 1;
Packit Service 084de1
        } else {
Packit Service 084de1
            int rv;
Packit Service 084de1
            arg = argv[0];
Packit Service 084de1
            argn = argv[1];
Packit Service 084de1
            /* Try to process command using SSL_CONF */
Packit Service 084de1
            rv = SSL_CONF_cmd_argv(c_cctx, &argc, &argv);
Packit Service 084de1
            /* If not processed try server */
Packit Service 084de1
            if (rv == 0)
Packit Service 084de1
                rv = SSL_CONF_cmd_argv(s_cctx, &argc, &argv);
Packit Service 084de1
            /* Recognised: store it for later use */
Packit Service 084de1
            if (rv > 0) {
Packit Service 084de1
                if (rv == 1)
Packit Service 084de1
                    argn = NULL;
Packit Service 084de1
                if (!conf_args) {
Packit Service 084de1
                    conf_args = sk_OPENSSL_STRING_new_null();
Packit Service 084de1
                    if (!conf_args)
Packit Service 084de1
                        goto end;
Packit Service 084de1
                }
Packit Service 084de1
                if (!sk_OPENSSL_STRING_push(conf_args, arg))
Packit Service 084de1
                    goto end;
Packit Service 084de1
                if (!sk_OPENSSL_STRING_push(conf_args, argn))
Packit Service 084de1
                    goto end;
Packit Service 084de1
                continue;
Packit Service 084de1
            }
Packit Service 084de1
            if (rv == -3)
Packit Service 084de1
                BIO_printf(bio_err, "Missing argument for %s\n", arg);
Packit Service 084de1
            else if (rv < 0)
Packit Service 084de1
                BIO_printf(bio_err, "Error with command %s\n", arg);
Packit Service 084de1
            else if (rv == 0)
Packit Service 084de1
                BIO_printf(bio_err, "unknown option %s\n", arg);
Packit Service 084de1
            badop = 1;
Packit Service 084de1
            break;
Packit Service 084de1
        }
Packit Service 084de1
        argc--;
Packit Service 084de1
        argv++;
Packit Service 084de1
    }
Packit Service 084de1
    if (badop) {
Packit Service 084de1
 bad:
Packit Service 084de1
        sv_usage();
Packit Service 084de1
        goto end;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (ssl3 + tls1 + tls1_2 + dtls + dtls1 + dtls12 > 1) {
Packit Service 084de1
        fprintf(stderr, "At most one of -ssl3, -tls1, -tls1_2, -dtls, -dtls1 or -dtls12 should "
Packit Service 084de1
                "be requested.\n");
Packit Service 084de1
        EXIT(1);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
#ifdef OPENSSL_NO_SSL3
Packit Service 084de1
    if (ssl3)
Packit Service 084de1
        no_protocol = 1;
Packit Service 084de1
    else
Packit Service 084de1
#endif
Packit Service 084de1
#ifdef OPENSSL_NO_TLS1
Packit Service 084de1
    if (tls1)
Packit Service 084de1
        no_protocol = 1;
Packit Service 084de1
    else
Packit Service 084de1
#endif
Packit Service 084de1
#ifdef OPENSSL_NO_TLS1_2
Packit Service 084de1
    if (tls1_2)
Packit Service 084de1
        no_protocol = 1;
Packit Service 084de1
    else
Packit Service 084de1
#endif
Packit Service 084de1
#if defined(OPENSSL_NO_DTLS) || defined(OPENSSL_NO_DTLS1)
Packit Service 084de1
    if (dtls1)
Packit Service 084de1
        no_protocol = 1;
Packit Service 084de1
    else
Packit Service 084de1
#endif
Packit Service 084de1
#if defined(OPENSSL_NO_DTLS) || defined(OPENSSL_NO_DTLS1_2)
Packit Service 084de1
    if (dtls12)
Packit Service 084de1
        no_protocol = 1;
Packit Service 084de1
    else
Packit Service 084de1
#endif
Packit Service 084de1
        no_protocol = 0;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Testing was requested for a compiled-out protocol (e.g. SSLv3).
Packit Service 084de1
     * Ideally, we would error out, but the generic test wrapper can't know
Packit Service 084de1
     * when to expect failure. So we do nothing and return success.
Packit Service 084de1
     */
Packit Service 084de1
    if (no_protocol) {
Packit Service 084de1
        fprintf(stderr, "Testing was requested for a disabled protocol. "
Packit Service 084de1
                "Skipping tests.\n");
Packit Service 084de1
        ret = EXIT_SUCCESS;
Packit Service 084de1
        goto end;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (!ssl3 && !tls1 && !tls1_2 && !dtls && !dtls1 && !dtls12 && number > 1
Packit Service 084de1
            && !reuse && !force) {
Packit Service 084de1
        fprintf(stderr, "This case cannot work.  Use -f to perform "
Packit Service 084de1
                "the test anyway (and\n-d to see what happens), "
Packit Service 084de1
                "or add one of -ssl3, -tls1, -tls1_2, -dtls, -dtls1, -dtls12, -reuse\n"
Packit Service 084de1
                "to avoid protocol mismatch.\n");
Packit Service 084de1
        EXIT(1);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (print_time) {
Packit Service 084de1
        if (bio_type != BIO_PAIR) {
Packit Service 084de1
            fprintf(stderr, "Using BIO pair (-bio_pair)\n");
Packit Service 084de1
            bio_type = BIO_PAIR;
Packit Service 084de1
        }
Packit Service 084de1
        if (number < 50 && !force)
Packit Service 084de1
            fprintf(stderr,
Packit Service 084de1
                    "Warning: For accurate timings, use more connections (e.g. -num 1000)\n");
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_COMP
Packit Service 084de1
    if (comp == COMP_ZLIB)
Packit Service 084de1
        cm = COMP_zlib();
Packit Service 084de1
    if (cm != NULL) {
Packit Service 084de1
        if (COMP_get_type(cm) != NID_undef) {
Packit Service 084de1
            if (SSL_COMP_add_compression_method(comp, cm) != 0) {
Packit Service 084de1
                fprintf(stderr, "Failed to add compression method\n");
Packit Service 084de1
                ERR_print_errors_fp(stderr);
Packit Service 084de1
            }
Packit Service 084de1
        } else {
Packit Service 084de1
            fprintf(stderr,
Packit Service 084de1
                    "Warning: %s compression not supported\n",
Packit Service 084de1
                    comp == COMP_ZLIB ? "zlib" : "unknown");
Packit Service 084de1
            ERR_print_errors_fp(stderr);
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    ssl_comp_methods = SSL_COMP_get_compression_methods();
Packit Service 084de1
    n = sk_SSL_COMP_num(ssl_comp_methods);
Packit Service 084de1
    if (n) {
Packit Service 084de1
        int j;
Packit Service 084de1
        printf("Available compression methods:");
Packit Service 084de1
        for (j = 0; j < n; j++) {
Packit Service 084de1
            SSL_COMP *c = sk_SSL_COMP_value(ssl_comp_methods, j);
Packit Service 084de1
            printf("  %s:%d", SSL_COMP_get0_name(c), SSL_COMP_get_id(c));
Packit Service 084de1
        }
Packit Service 084de1
        printf("\n");
Packit Service 084de1
    }
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_TLS
Packit Service 084de1
    meth = TLS_method();
Packit Service 084de1
    if (ssl3) {
Packit Service 084de1
        min_version = SSL3_VERSION;
Packit Service 084de1
        max_version = SSL3_VERSION;
Packit Service 084de1
    } else if (tls1) {
Packit Service 084de1
        min_version = TLS1_VERSION;
Packit Service 084de1
        max_version = TLS1_VERSION;
Packit Service 084de1
    } else if (tls1_2) {
Packit Service 084de1
        min_version = TLS1_2_VERSION;
Packit Service 084de1
        max_version = TLS1_2_VERSION;
Packit Service 084de1
    } else {
Packit Service 084de1
        min_version = SSL3_VERSION;
Packit Service 084de1
        max_version = TLS_MAX_VERSION;
Packit Service 084de1
    }
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_DTLS
Packit Service 084de1
    if (dtls || dtls1 || dtls12) {
Packit Service 084de1
        meth = DTLS_method();
Packit Service 084de1
        if (dtls1) {
Packit Service 084de1
            min_version = DTLS1_VERSION;
Packit Service 084de1
            max_version = DTLS1_VERSION;
Packit Service 084de1
        } else if (dtls12) {
Packit Service 084de1
            min_version = DTLS1_2_VERSION;
Packit Service 084de1
            max_version = DTLS1_2_VERSION;
Packit Service 084de1
        } else {
Packit Service 084de1
            min_version = DTLS_MIN_VERSION;
Packit Service 084de1
            max_version = DTLS_MAX_VERSION;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
    c_ctx = SSL_CTX_new(meth);
Packit Service 084de1
    s_ctx = SSL_CTX_new(meth);
Packit Service 084de1
    s_ctx2 = SSL_CTX_new(meth); /* no SSL_CTX_dup! */
Packit Service 084de1
    if ((c_ctx == NULL) || (s_ctx == NULL) || (s_ctx2 == NULL)) {
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
        goto end;
Packit Service 084de1
    }
Packit Service 084de1
    /*
Packit Service 084de1
     * Since we will use low security ciphersuites and keys for testing set
Packit Service 084de1
     * security level to zero by default. Tests can override this by adding
Packit Service 084de1
     * "@SECLEVEL=n" to the cipher string.
Packit Service 084de1
     */
Packit Service 084de1
    SSL_CTX_set_security_level(c_ctx, 0);
Packit Service 084de1
    SSL_CTX_set_security_level(s_ctx, 0);
Packit Service 084de1
    SSL_CTX_set_security_level(s_ctx2, 0);
Packit Service 084de1
Packit Service 084de1
    if (no_ticket) {
Packit Service 084de1
        SSL_CTX_set_options(c_ctx, SSL_OP_NO_TICKET);
Packit Service 084de1
        SSL_CTX_set_options(s_ctx, SSL_OP_NO_TICKET);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (SSL_CTX_set_min_proto_version(c_ctx, min_version) == 0)
Packit Service 084de1
        goto end;
Packit Service 084de1
    if (SSL_CTX_set_max_proto_version(c_ctx, max_version) == 0)
Packit Service 084de1
        goto end;
Packit Service 084de1
    if (SSL_CTX_set_min_proto_version(s_ctx, min_version) == 0)
Packit Service 084de1
        goto end;
Packit Service 084de1
    if (SSL_CTX_set_max_proto_version(s_ctx, max_version) == 0)
Packit Service 084de1
        goto end;
Packit Service 084de1
Packit Service 084de1
    if (cipher != NULL) {
Packit Service 084de1
        if (strcmp(cipher, "") == 0) {
Packit Service 084de1
            if (!SSL_CTX_set_cipher_list(c_ctx, cipher)) {
Packit Service 084de1
                if (ERR_GET_REASON(ERR_peek_error()) == SSL_R_NO_CIPHER_MATCH) {
Packit Service 084de1
                    ERR_clear_error();
Packit Service 084de1
                } else {
Packit Service 084de1
                    ERR_print_errors(bio_err);
Packit Service 084de1
                    goto end;
Packit Service 084de1
                }
Packit Service 084de1
            } else {
Packit Service 084de1
                /* Should have failed when clearing all TLSv1.2 ciphers. */
Packit Service 084de1
                fprintf(stderr, "CLEARING ALL TLSv1.2 CIPHERS SHOULD FAIL\n");
Packit Service 084de1
                goto end;
Packit Service 084de1
            }
Packit Service 084de1
Packit Service 084de1
            if (!SSL_CTX_set_cipher_list(s_ctx, cipher)) {
Packit Service 084de1
                if (ERR_GET_REASON(ERR_peek_error()) == SSL_R_NO_CIPHER_MATCH) {
Packit Service 084de1
                    ERR_clear_error();
Packit Service 084de1
                } else {
Packit Service 084de1
                    ERR_print_errors(bio_err);
Packit Service 084de1
                    goto end;
Packit Service 084de1
                }
Packit Service 084de1
            } else {
Packit Service 084de1
                /* Should have failed when clearing all TLSv1.2 ciphers. */
Packit Service 084de1
                fprintf(stderr, "CLEARING ALL TLSv1.2 CIPHERS SHOULD FAIL\n");
Packit Service 084de1
                goto end;
Packit Service 084de1
            }
Packit Service 084de1
Packit Service 084de1
            if (!SSL_CTX_set_cipher_list(s_ctx2, cipher)) {
Packit Service 084de1
                if (ERR_GET_REASON(ERR_peek_error()) == SSL_R_NO_CIPHER_MATCH) {
Packit Service 084de1
                    ERR_clear_error();
Packit Service 084de1
                } else {
Packit Service 084de1
                    ERR_print_errors(bio_err);
Packit Service 084de1
                    goto end;
Packit Service 084de1
                }
Packit Service 084de1
            } else {
Packit Service 084de1
                /* Should have failed when clearing all TLSv1.2 ciphers. */
Packit Service 084de1
                fprintf(stderr, "CLEARING ALL TLSv1.2 CIPHERS SHOULD FAIL\n");
Packit Service 084de1
                goto end;
Packit Service 084de1
            }
Packit Service 084de1
        } else {
Packit Service 084de1
            if (!SSL_CTX_set_cipher_list(c_ctx, cipher)
Packit Service 084de1
                    || !SSL_CTX_set_cipher_list(s_ctx, cipher)
Packit Service 084de1
                    || !SSL_CTX_set_cipher_list(s_ctx2, cipher)) {
Packit Service 084de1
                ERR_print_errors(bio_err);
Packit Service 084de1
                goto end;
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    if (ciphersuites != NULL) {
Packit Service 084de1
        if (!SSL_CTX_set_ciphersuites(c_ctx, ciphersuites)
Packit Service 084de1
            || !SSL_CTX_set_ciphersuites(s_ctx, ciphersuites)
Packit Service 084de1
            || !SSL_CTX_set_ciphersuites(s_ctx2, ciphersuites)) {
Packit Service 084de1
            ERR_print_errors(bio_err);
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_CT
Packit Service 084de1
    if (ct_validation &&
Packit Service 084de1
        !SSL_CTX_enable_ct(c_ctx, SSL_CT_VALIDATION_STRICT)) {
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
        goto end;
Packit Service 084de1
    }
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
    /* Process SSL_CONF arguments */
Packit Service 084de1
    SSL_CONF_CTX_set_ssl_ctx(c_cctx, c_ctx);
Packit Service 084de1
    SSL_CONF_CTX_set_ssl_ctx(s_cctx, s_ctx);
Packit Service 084de1
    SSL_CONF_CTX_set_ssl_ctx(s_cctx2, s_ctx2);
Packit Service 084de1
Packit Service 084de1
    for (i = 0; i < sk_OPENSSL_STRING_num(conf_args); i += 2) {
Packit Service 084de1
        int rv;
Packit Service 084de1
        arg = sk_OPENSSL_STRING_value(conf_args, i);
Packit Service 084de1
        argn = sk_OPENSSL_STRING_value(conf_args, i + 1);
Packit Service 084de1
        rv = SSL_CONF_cmd(c_cctx, arg, argn);
Packit Service 084de1
        /* If not recognised use server context */
Packit Service 084de1
        if (rv == -2) {
Packit Service 084de1
            rv = SSL_CONF_cmd(s_cctx2, arg, argn);
Packit Service 084de1
            if (rv > 0)
Packit Service 084de1
                rv = SSL_CONF_cmd(s_cctx, arg, argn);
Packit Service 084de1
        }
Packit Service 084de1
        if (rv <= 0) {
Packit Service 084de1
            BIO_printf(bio_err, "Error processing %s %s\n",
Packit Service 084de1
                       arg, argn ? argn : "");
Packit Service 084de1
            ERR_print_errors(bio_err);
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (!SSL_CONF_CTX_finish(s_cctx) || !SSL_CONF_CTX_finish(c_cctx) || !SSL_CONF_CTX_finish(s_cctx2)) {
Packit Service 084de1
        BIO_puts(bio_err, "Error finishing context\n");
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
        goto end;
Packit Service 084de1
    }
Packit Service 084de1
#ifndef OPENSSL_NO_DH
Packit Service 084de1
    if (!no_dhe) {
Packit Service 084de1
        if (dhe1024dsa) {
Packit Service 084de1
            dh = get_dh1024dsa();
Packit Service 084de1
        } else if (dhe512)
Packit Service 084de1
            dh = get_dh512();
Packit Service 084de1
        else
Packit Service 084de1
            dh = get_dh1024();
Packit Service 084de1
        SSL_CTX_set_tmp_dh(s_ctx, dh);
Packit Service 084de1
        SSL_CTX_set_tmp_dh(s_ctx2, dh);
Packit Service 084de1
        DH_free(dh);
Packit Service 084de1
    }
Packit Service 084de1
#else
Packit Service 084de1
    (void)no_dhe;
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
    if ((!SSL_CTX_load_verify_locations(s_ctx, CAfile, CApath)) ||
Packit Service 084de1
        (!SSL_CTX_set_default_verify_paths(s_ctx)) ||
Packit Service 084de1
        (!SSL_CTX_load_verify_locations(s_ctx2, CAfile, CApath)) ||
Packit Service 084de1
        (!SSL_CTX_set_default_verify_paths(s_ctx2)) ||
Packit Service 084de1
        (!SSL_CTX_load_verify_locations(c_ctx, CAfile, CApath)) ||
Packit Service 084de1
        (!SSL_CTX_set_default_verify_paths(c_ctx))) {
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_CT
Packit Service 084de1
    if (!SSL_CTX_set_default_ctlog_list_file(s_ctx) ||
Packit Service 084de1
        !SSL_CTX_set_default_ctlog_list_file(s_ctx2) ||
Packit Service 084de1
        !SSL_CTX_set_default_ctlog_list_file(c_ctx)) {
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
    }
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
    if (client_auth) {
Packit Service 084de1
        printf("client authentication\n");
Packit Service 084de1
        SSL_CTX_set_verify(s_ctx,
Packit Service 084de1
                           SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
Packit Service 084de1
                           verify_callback);
Packit Service 084de1
        SSL_CTX_set_verify(s_ctx2,
Packit Service 084de1
                           SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
Packit Service 084de1
                           verify_callback);
Packit Service 084de1
        SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback,
Packit Service 084de1
                                         &app_verify_arg);
Packit Service 084de1
        SSL_CTX_set_cert_verify_callback(s_ctx2, app_verify_callback,
Packit Service 084de1
                                         &app_verify_arg);
Packit Service 084de1
    }
Packit Service 084de1
    if (server_auth) {
Packit Service 084de1
        printf("server authentication\n");
Packit Service 084de1
        SSL_CTX_set_verify(c_ctx, SSL_VERIFY_PEER, verify_callback);
Packit Service 084de1
        SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback,
Packit Service 084de1
                                         &app_verify_arg);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    {
Packit Service 084de1
        int session_id_context = 0;
Packit Service 084de1
        if (!SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context,
Packit Service 084de1
                                            sizeof(session_id_context)) ||
Packit Service 084de1
            !SSL_CTX_set_session_id_context(s_ctx2, (void *)&session_id_context,
Packit Service 084de1
                                            sizeof(session_id_context))) {
Packit Service 084de1
            ERR_print_errors(bio_err);
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /* Use PSK only if PSK key is given */
Packit Service 084de1
    if (psk_key != NULL) {
Packit Service 084de1
        /*
Packit Service 084de1
         * no_psk is used to avoid putting psk command to openssl tool
Packit Service 084de1
         */
Packit Service 084de1
        if (no_psk) {
Packit Service 084de1
            /*
Packit Service 084de1
             * if PSK is not compiled in and psk key is given, do nothing and
Packit Service 084de1
             * exit successfully
Packit Service 084de1
             */
Packit Service 084de1
            ret = EXIT_SUCCESS;
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
#ifndef OPENSSL_NO_PSK
Packit Service 084de1
        SSL_CTX_set_psk_client_callback(c_ctx, psk_client_callback);
Packit Service 084de1
        SSL_CTX_set_psk_server_callback(s_ctx, psk_server_callback);
Packit Service 084de1
        SSL_CTX_set_psk_server_callback(s_ctx2, psk_server_callback);
Packit Service 084de1
        if (debug)
Packit Service 084de1
            BIO_printf(bio_err, "setting PSK identity hint to s_ctx\n");
Packit Service 084de1
        if (!SSL_CTX_use_psk_identity_hint(s_ctx, "ctx server identity_hint") ||
Packit Service 084de1
            !SSL_CTX_use_psk_identity_hint(s_ctx2, "ctx server identity_hint")) {
Packit Service 084de1
            BIO_printf(bio_err, "error setting PSK identity hint to s_ctx\n");
Packit Service 084de1
            ERR_print_errors(bio_err);
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
#endif
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_NEXTPROTONEG
Packit Service 084de1
    if (npn_client) {
Packit Service 084de1
        SSL_CTX_set_next_proto_select_cb(c_ctx, cb_client_npn, NULL);
Packit Service 084de1
    }
Packit Service 084de1
    if (npn_server) {
Packit Service 084de1
        if (npn_server_reject) {
Packit Service 084de1
            BIO_printf(bio_err,
Packit Service 084de1
                       "Can't have both -npn_server and -npn_server_reject\n");
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
        SSL_CTX_set_npn_advertised_cb(s_ctx, cb_server_npn, NULL);
Packit Service 084de1
        SSL_CTX_set_npn_advertised_cb(s_ctx2, cb_server_npn, NULL);
Packit Service 084de1
    }
Packit Service 084de1
    if (npn_server_reject) {
Packit Service 084de1
        SSL_CTX_set_npn_advertised_cb(s_ctx, cb_server_rejects_npn, NULL);
Packit Service 084de1
        SSL_CTX_set_npn_advertised_cb(s_ctx2, cb_server_rejects_npn, NULL);
Packit Service 084de1
    }
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
    if (serverinfo_sct) {
Packit Service 084de1
        if (!SSL_CTX_add_client_custom_ext(c_ctx,
Packit Service 084de1
                TLSEXT_TYPE_signed_certificate_timestamp,
Packit Service 084de1
                NULL, NULL, NULL,
Packit Service 084de1
                serverinfo_cli_parse_cb, NULL)) {
Packit Service 084de1
            BIO_printf(bio_err, "Error adding SCT extension\n");
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    if (serverinfo_tack) {
Packit Service 084de1
        if (!SSL_CTX_add_client_custom_ext(c_ctx, TACK_EXT_TYPE,
Packit Service 084de1
                                      NULL, NULL, NULL,
Packit Service 084de1
                                      serverinfo_cli_parse_cb, NULL)) {
Packit Service 084de1
            BIO_printf(bio_err, "Error adding TACK extension\n");
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    if (serverinfo_file)
Packit Service 084de1
        if (!SSL_CTX_use_serverinfo_file(s_ctx, serverinfo_file) ||
Packit Service 084de1
            !SSL_CTX_use_serverinfo_file(s_ctx2, serverinfo_file)) {
Packit Service 084de1
            BIO_printf(bio_err, "missing serverinfo file\n");
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
    if (custom_ext) {
Packit Service 084de1
        if (!SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_0,
Packit Service 084de1
                                      custom_ext_0_cli_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_0_cli_parse_cb, NULL)
Packit Service 084de1
            || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_1,
Packit Service 084de1
                                      custom_ext_1_cli_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_1_cli_parse_cb, NULL)
Packit Service 084de1
            || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_2,
Packit Service 084de1
                                      custom_ext_2_cli_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_2_cli_parse_cb, NULL)
Packit Service 084de1
            || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_3,
Packit Service 084de1
                                      custom_ext_3_cli_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_3_cli_parse_cb, NULL)
Packit Service 084de1
            || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_0,
Packit Service 084de1
                                      custom_ext_0_srv_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_0_srv_parse_cb, NULL)
Packit Service 084de1
            || !SSL_CTX_add_server_custom_ext(s_ctx2, CUSTOM_EXT_TYPE_0,
Packit Service 084de1
                                      custom_ext_0_srv_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_0_srv_parse_cb, NULL)
Packit Service 084de1
            || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_1,
Packit Service 084de1
                                      custom_ext_1_srv_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_1_srv_parse_cb, NULL)
Packit Service 084de1
            || !SSL_CTX_add_server_custom_ext(s_ctx2, CUSTOM_EXT_TYPE_1,
Packit Service 084de1
                                      custom_ext_1_srv_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_1_srv_parse_cb, NULL)
Packit Service 084de1
            || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_2,
Packit Service 084de1
                                      custom_ext_2_srv_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_2_srv_parse_cb, NULL)
Packit Service 084de1
            || !SSL_CTX_add_server_custom_ext(s_ctx2, CUSTOM_EXT_TYPE_2,
Packit Service 084de1
                                      custom_ext_2_srv_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_2_srv_parse_cb, NULL)
Packit Service 084de1
            || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_3,
Packit Service 084de1
                                      custom_ext_3_srv_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_3_srv_parse_cb, NULL)
Packit Service 084de1
            || !SSL_CTX_add_server_custom_ext(s_ctx2, CUSTOM_EXT_TYPE_3,
Packit Service 084de1
                                      custom_ext_3_srv_add_cb,
Packit Service 084de1
                                      NULL, NULL,
Packit Service 084de1
                                      custom_ext_3_srv_parse_cb, NULL)) {
Packit Service 084de1
            BIO_printf(bio_err, "Error setting custom extensions\n");
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (alpn_server)
Packit Service 084de1
        SSL_CTX_set_alpn_select_cb(s_ctx, cb_server_alpn, alpn_server);
Packit Service 084de1
    if (alpn_server2)
Packit Service 084de1
        SSL_CTX_set_alpn_select_cb(s_ctx2, cb_server_alpn, alpn_server2);
Packit Service 084de1
Packit Service 084de1
    if (alpn_client) {
Packit Service 084de1
        size_t alpn_len;
Packit Service 084de1
        unsigned char *alpn = next_protos_parse(&alpn_len, alpn_client);
Packit Service 084de1
Packit Service 084de1
        if (alpn == NULL) {
Packit Service 084de1
            BIO_printf(bio_err, "Error parsing -alpn_client argument\n");
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
        /* Returns 0 on success!! */
Packit Service 084de1
        if (SSL_CTX_set_alpn_protos(c_ctx, alpn, alpn_len)) {
Packit Service 084de1
            BIO_printf(bio_err, "Error setting ALPN\n");
Packit Service 084de1
            OPENSSL_free(alpn);
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
        OPENSSL_free(alpn);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (server_sess_in != NULL) {
Packit Service 084de1
        server_sess = read_session(server_sess_in);
Packit Service 084de1
        if (server_sess == NULL)
Packit Service 084de1
            goto end;
Packit Service 084de1
    }
Packit Service 084de1
    if (client_sess_in != NULL) {
Packit Service 084de1
        client_sess = read_session(client_sess_in);
Packit Service 084de1
        if (client_sess == NULL)
Packit Service 084de1
            goto end;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (server_sess_out != NULL || server_sess_in != NULL) {
Packit Service 084de1
        char *keys;
Packit Service 084de1
        long size;
Packit Service 084de1
Packit Service 084de1
        /* Use a fixed key so that we can decrypt the ticket. */
Packit Service 084de1
        size = SSL_CTX_set_tlsext_ticket_keys(s_ctx, NULL, 0);
Packit Service 084de1
        keys = OPENSSL_zalloc(size);
Packit Service 084de1
        SSL_CTX_set_tlsext_ticket_keys(s_ctx, keys, size);
Packit Service 084de1
        OPENSSL_free(keys);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (sn_server1 != NULL || sn_server2 != NULL)
Packit Service 084de1
        SSL_CTX_set_tlsext_servername_callback(s_ctx, servername_cb);
Packit Service 084de1
Packit Service 084de1
    c_ssl = SSL_new(c_ctx);
Packit Service 084de1
    s_ssl = SSL_new(s_ctx);
Packit Service 084de1
Packit Service 084de1
    if (sn_client)
Packit Service 084de1
        SSL_set_tlsext_host_name(c_ssl, sn_client);
Packit Service 084de1
Packit Service 084de1
    if (!set_protocol_version(server_min_proto, s_ssl, SSL_CTRL_SET_MIN_PROTO_VERSION))
Packit Service 084de1
        goto end;
Packit Service 084de1
    if (!set_protocol_version(server_max_proto, s_ssl, SSL_CTRL_SET_MAX_PROTO_VERSION))
Packit Service 084de1
        goto end;
Packit Service 084de1
    if (!set_protocol_version(client_min_proto, c_ssl, SSL_CTRL_SET_MIN_PROTO_VERSION))
Packit Service 084de1
        goto end;
Packit Service 084de1
    if (!set_protocol_version(client_max_proto, c_ssl, SSL_CTRL_SET_MAX_PROTO_VERSION))
Packit Service 084de1
        goto end;
Packit Service 084de1
Packit Service 084de1
    if (server_sess) {
Packit Service 084de1
        if (SSL_CTX_add_session(s_ctx, server_sess) == 0) {
Packit Service 084de1
            BIO_printf(bio_err, "Can't add server session\n");
Packit Service 084de1
            ERR_print_errors(bio_err);
Packit Service 084de1
            goto end;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    BIO_printf(bio_stdout, "Doing handshakes=%d bytes=%ld\n", number, bytes);
Packit Service 084de1
    for (i = 0; i < number; i++) {
Packit Service 084de1
        if (!reuse) {
Packit Service 084de1
            if (!SSL_set_session(c_ssl, NULL)) {
Packit Service 084de1
                BIO_printf(bio_err, "Failed to set session\n");
Packit Service 084de1
                goto end;
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
        if (client_sess_in != NULL) {
Packit Service 084de1
            if (SSL_set_session(c_ssl, client_sess) == 0) {
Packit Service 084de1
                BIO_printf(bio_err, "Can't set client session\n");
Packit Service 084de1
                ERR_print_errors(bio_err);
Packit Service 084de1
                goto end;
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
        switch (bio_type) {
Packit Service 084de1
        case BIO_MEM:
Packit Service 084de1
            ret = doit(s_ssl, c_ssl, bytes);
Packit Service 084de1
            break;
Packit Service 084de1
        case BIO_PAIR:
Packit Service 084de1
            ret = doit_biopair(s_ssl, c_ssl, bytes, &s_time, &c_time);
Packit Service 084de1
            break;
Packit Service 084de1
#ifndef OPENSSL_NO_SOCK
Packit Service 084de1
        case BIO_IPV4:
Packit Service 084de1
            ret = doit_localhost(s_ssl, c_ssl, BIO_FAMILY_IPV4,
Packit Service 084de1
                                 bytes, &s_time, &c_time);
Packit Service 084de1
            break;
Packit Service 084de1
        case BIO_IPV6:
Packit Service 084de1
            ret = doit_localhost(s_ssl, c_ssl, BIO_FAMILY_IPV6,
Packit Service 084de1
                                 bytes, &s_time, &c_time);
Packit Service 084de1
            break;
Packit Service 084de1
#else
Packit Service 084de1
        case BIO_IPV4:
Packit Service 084de1
        case BIO_IPV6:
Packit Service 084de1
            ret = EXIT_FAILURE;
Packit Service 084de1
            goto err;
Packit Service 084de1
#endif
Packit Service 084de1
        }
Packit Service 084de1
        if (ret != EXIT_SUCCESS)  break;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (should_negotiate && ret == EXIT_SUCCESS &&
Packit Service 084de1
        strcmp(should_negotiate, "fail-server") != 0 &&
Packit Service 084de1
        strcmp(should_negotiate, "fail-client") != 0) {
Packit Service 084de1
        int version = protocol_from_string(should_negotiate);
Packit Service 084de1
        if (version < 0) {
Packit Service 084de1
            BIO_printf(bio_err, "Error parsing: %s\n", should_negotiate);
Packit Service 084de1
            ret = EXIT_FAILURE;
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
        if (SSL_version(c_ssl) != version) {
Packit Service 084de1
            BIO_printf(bio_err, "Unexpected version negotiated. "
Packit Service 084de1
                "Expected: %s, got %s\n", should_negotiate, SSL_get_version(c_ssl));
Packit Service 084de1
            ret = EXIT_FAILURE;
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (should_reuse != -1) {
Packit Service 084de1
        if (SSL_session_reused(s_ssl) != should_reuse ||
Packit Service 084de1
            SSL_session_reused(c_ssl) != should_reuse) {
Packit Service 084de1
            BIO_printf(bio_err, "Unexpected session reuse state. "
Packit Service 084de1
                "Expected: %d, server: %d, client: %d\n", should_reuse,
Packit Service 084de1
                SSL_session_reused(s_ssl), SSL_session_reused(c_ssl));
Packit Service 084de1
            ret = EXIT_FAILURE;
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (server_sess_out != NULL) {
Packit Service 084de1
        if (write_session(server_sess_out, SSL_get_session(s_ssl)) == 0) {
Packit Service 084de1
            ret = EXIT_FAILURE;
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    if (client_sess_out != NULL) {
Packit Service 084de1
        if (write_session(client_sess_out, SSL_get_session(c_ssl)) == 0) {
Packit Service 084de1
            ret = EXIT_FAILURE;
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (!verbose) {
Packit Service 084de1
        print_details(c_ssl, "");
Packit Service 084de1
    }
Packit Service 084de1
    if (print_time) {
Packit Service 084de1
#ifdef CLOCKS_PER_SEC
Packit Service 084de1
        /*
Packit Service 084de1
         * "To determine the time in seconds, the value returned by the clock
Packit Service 084de1
         * function should be divided by the value of the macro
Packit Service 084de1
         * CLOCKS_PER_SEC." -- ISO/IEC 9899
Packit Service 084de1
         */
Packit Service 084de1
        BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
Packit Service 084de1
                   "Approximate total client time: %6.2f s\n",
Packit Service 084de1
                   (double)s_time / CLOCKS_PER_SEC,
Packit Service 084de1
                   (double)c_time / CLOCKS_PER_SEC);
Packit Service 084de1
#else
Packit Service 084de1
        BIO_printf(bio_stdout,
Packit Service 084de1
                   "Approximate total server time: %6.2f units\n"
Packit Service 084de1
                   "Approximate total client time: %6.2f units\n",
Packit Service 084de1
                   (double)s_time, (double)c_time);
Packit Service 084de1
#endif
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
 err:
Packit Service 084de1
    SSL_free(s_ssl);
Packit Service 084de1
    SSL_free(c_ssl);
Packit Service 084de1
Packit Service 084de1
 end:
Packit Service 084de1
    SSL_CTX_free(s_ctx);
Packit Service 084de1
    SSL_CTX_free(s_ctx2);
Packit Service 084de1
    SSL_CTX_free(c_ctx);
Packit Service 084de1
    SSL_CONF_CTX_free(s_cctx);
Packit Service 084de1
    SSL_CONF_CTX_free(s_cctx2);
Packit Service 084de1
    SSL_CONF_CTX_free(c_cctx);
Packit Service 084de1
    sk_OPENSSL_STRING_free(conf_args);
Packit Service 084de1
Packit Service 084de1
    BIO_free(bio_stdout);
Packit Service 084de1
Packit Service 084de1
    SSL_SESSION_free(server_sess);
Packit Service 084de1
    SSL_SESSION_free(client_sess);
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_CRYPTO_MDEBUG
Packit Service 084de1
    if (CRYPTO_mem_leaks(bio_err) <= 0)
Packit Service 084de1
        ret = EXIT_FAILURE;
Packit Service 084de1
#endif
Packit Service 084de1
    BIO_free(bio_err);
Packit Service 084de1
    EXIT(ret);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_SOCK
Packit Service 084de1
int doit_localhost(SSL *s_ssl, SSL *c_ssl, int family, long count,
Packit Service 084de1
                   clock_t *s_time, clock_t *c_time)
Packit Service 084de1
{
Packit Service 084de1
    long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
Packit Service 084de1
    BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
Packit Service 084de1
    BIO *acpt = NULL, *server = NULL, *client = NULL;
Packit Service 084de1
    char addr_str[40];
Packit Service 084de1
    int ret = EXIT_FAILURE;
Packit Service 084de1
    int err_in_client = 0;
Packit Service 084de1
    int err_in_server = 0;
Packit Service 084de1
Packit Service 084de1
    acpt = BIO_new_accept(family == BIO_FAMILY_IPV4 ? "127.0.0.1:0"
Packit Service 084de1
                                                    : "[::1]:0");
Packit Service 084de1
    if (acpt == NULL)
Packit Service 084de1
        goto err;
Packit Service 084de1
    BIO_set_accept_ip_family(acpt, family);
Packit Service 084de1
    BIO_set_bind_mode(acpt, BIO_SOCK_NONBLOCK | BIO_SOCK_REUSEADDR);
Packit Service 084de1
    if (BIO_do_accept(acpt) <= 0)
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    BIO_snprintf(addr_str, sizeof(addr_str), ":%s", BIO_get_accept_port(acpt));
Packit Service 084de1
Packit Service 084de1
    client = BIO_new_connect(addr_str);
Packit Service 084de1
    BIO_set_conn_ip_family(client, family);
Packit Service 084de1
    if (!client)
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    if (BIO_set_nbio(client, 1) <= 0)
Packit Service 084de1
        goto err;
Packit Service 084de1
    if (BIO_set_nbio(acpt, 1) <= 0)
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    {
Packit Service 084de1
        int st_connect = 0, st_accept = 0;
Packit Service 084de1
Packit Service 084de1
        while(!st_connect || !st_accept) {
Packit Service 084de1
            if (!st_connect) {
Packit Service 084de1
                if (BIO_do_connect(client) <= 0) {
Packit Service 084de1
                    if (!BIO_should_retry(client))
Packit Service 084de1
                        goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    st_connect = 1;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
            if (!st_accept) {
Packit Service 084de1
                if (BIO_do_accept(acpt) <= 0) {
Packit Service 084de1
                    if (!BIO_should_retry(acpt))
Packit Service 084de1
                        goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    st_accept = 1;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    /* We're not interested in accepting further connects */
Packit Service 084de1
    server = BIO_pop(acpt);
Packit Service 084de1
    BIO_free_all(acpt);
Packit Service 084de1
    acpt = NULL;
Packit Service 084de1
Packit Service 084de1
    s_ssl_bio = BIO_new(BIO_f_ssl());
Packit Service 084de1
    if (!s_ssl_bio)
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    c_ssl_bio = BIO_new(BIO_f_ssl());
Packit Service 084de1
    if (!c_ssl_bio)
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    SSL_set_connect_state(c_ssl);
Packit Service 084de1
    SSL_set_bio(c_ssl, client, client);
Packit Service 084de1
    (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
Packit Service 084de1
Packit Service 084de1
    SSL_set_accept_state(s_ssl);
Packit Service 084de1
    SSL_set_bio(s_ssl, server, server);
Packit Service 084de1
    (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
Packit Service 084de1
Packit Service 084de1
    do {
Packit Service 084de1
        /*-
Packit Service 084de1
         * c_ssl_bio:          SSL filter BIO
Packit Service 084de1
         *
Packit Service 084de1
         * client:             I/O for SSL library
Packit Service 084de1
         *
Packit Service 084de1
         *
Packit Service 084de1
         * server:             I/O for SSL library
Packit Service 084de1
         *
Packit Service 084de1
         * s_ssl_bio:          SSL filter BIO
Packit Service 084de1
         */
Packit Service 084de1
Packit Service 084de1
        /*
Packit Service 084de1
         * We have non-blocking behaviour throughout this test program, but
Packit Service 084de1
         * can be sure that there is *some* progress in each iteration; so we
Packit Service 084de1
         * don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE --
Packit Service 084de1
         * we just try everything in each iteration
Packit Service 084de1
         */
Packit Service 084de1
Packit Service 084de1
        {
Packit Service 084de1
            /* CLIENT */
Packit Service 084de1
Packit Service 084de1
            char cbuf[1024 * 8];
Packit Service 084de1
            int i, r;
Packit Service 084de1
            clock_t c_clock = clock();
Packit Service 084de1
Packit Service 084de1
            memset(cbuf, 0, sizeof(cbuf));
Packit Service 084de1
Packit Service 084de1
            if (debug)
Packit Service 084de1
                if (SSL_in_init(c_ssl))
Packit Service 084de1
                    printf("client waiting in SSL_connect - %s\n",
Packit Service 084de1
                           SSL_state_string_long(c_ssl));
Packit Service 084de1
Packit Service 084de1
            if (cw_num > 0) {
Packit Service 084de1
                /* Write to server. */
Packit Service 084de1
Packit Service 084de1
                if (cw_num > (long)sizeof(cbuf))
Packit Service 084de1
                    i = sizeof(cbuf);
Packit Service 084de1
                else
Packit Service 084de1
                    i = (int)cw_num;
Packit Service 084de1
                r = BIO_write(c_ssl_bio, cbuf, i);
Packit Service 084de1
                if (r < 0) {
Packit Service 084de1
                    if (!BIO_should_retry(c_ssl_bio)) {
Packit Service 084de1
                        fprintf(stderr, "ERROR in CLIENT\n");
Packit Service 084de1
                        err_in_client = 1;
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                    /*
Packit Service 084de1
                     * BIO_should_retry(...) can just be ignored here. The
Packit Service 084de1
                     * library expects us to call BIO_write with the same
Packit Service 084de1
                     * arguments again, and that's what we will do in the
Packit Service 084de1
                     * next iteration.
Packit Service 084de1
                     */
Packit Service 084de1
                } else if (r == 0) {
Packit Service 084de1
                    fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("client wrote %d\n", r);
Packit Service 084de1
                    cw_num -= r;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
Packit Service 084de1
            if (cr_num > 0) {
Packit Service 084de1
                /* Read from server. */
Packit Service 084de1
Packit Service 084de1
                r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
Packit Service 084de1
                if (r < 0) {
Packit Service 084de1
                    if (!BIO_should_retry(c_ssl_bio)) {
Packit Service 084de1
                        fprintf(stderr, "ERROR in CLIENT\n");
Packit Service 084de1
                        err_in_client = 1;
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                    /*
Packit Service 084de1
                     * Again, "BIO_should_retry" can be ignored.
Packit Service 084de1
                     */
Packit Service 084de1
                } else if (r == 0) {
Packit Service 084de1
                    fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("client read %d\n", r);
Packit Service 084de1
                    cr_num -= r;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
Packit Service 084de1
            /*
Packit Service 084de1
             * c_time and s_time increments will typically be very small
Packit Service 084de1
             * (depending on machine speed and clock tick intervals), but
Packit Service 084de1
             * sampling over a large number of connections should result in
Packit Service 084de1
             * fairly accurate figures.  We cannot guarantee a lot, however
Packit Service 084de1
             * -- if each connection lasts for exactly one clock tick, it
Packit Service 084de1
             * will be counted only for the client or only for the server or
Packit Service 084de1
             * even not at all.
Packit Service 084de1
             */
Packit Service 084de1
            *c_time += (clock() - c_clock);
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        {
Packit Service 084de1
            /* SERVER */
Packit Service 084de1
Packit Service 084de1
            char sbuf[1024 * 8];
Packit Service 084de1
            int i, r;
Packit Service 084de1
            clock_t s_clock = clock();
Packit Service 084de1
Packit Service 084de1
            memset(sbuf, 0, sizeof(sbuf));
Packit Service 084de1
Packit Service 084de1
            if (debug)
Packit Service 084de1
                if (SSL_in_init(s_ssl))
Packit Service 084de1
                    printf("server waiting in SSL_accept - %s\n",
Packit Service 084de1
                           SSL_state_string_long(s_ssl));
Packit Service 084de1
Packit Service 084de1
            if (sw_num > 0) {
Packit Service 084de1
                /* Write to client. */
Packit Service 084de1
Packit Service 084de1
                if (sw_num > (long)sizeof(sbuf))
Packit Service 084de1
                    i = sizeof(sbuf);
Packit Service 084de1
                else
Packit Service 084de1
                    i = (int)sw_num;
Packit Service 084de1
                r = BIO_write(s_ssl_bio, sbuf, i);
Packit Service 084de1
                if (r < 0) {
Packit Service 084de1
                    if (!BIO_should_retry(s_ssl_bio)) {
Packit Service 084de1
                        fprintf(stderr, "ERROR in SERVER\n");
Packit Service 084de1
                        err_in_server = 1;
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                    /* Ignore "BIO_should_retry". */
Packit Service 084de1
                } else if (r == 0) {
Packit Service 084de1
                    fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("server wrote %d\n", r);
Packit Service 084de1
                    sw_num -= r;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
Packit Service 084de1
            if (sr_num > 0) {
Packit Service 084de1
                /* Read from client. */
Packit Service 084de1
Packit Service 084de1
                r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
Packit Service 084de1
                if (r < 0) {
Packit Service 084de1
                    if (!BIO_should_retry(s_ssl_bio)) {
Packit Service 084de1
                        fprintf(stderr, "ERROR in SERVER\n");
Packit Service 084de1
                        err_in_server = 1;
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                    /* blah, blah */
Packit Service 084de1
                } else if (r == 0) {
Packit Service 084de1
                    fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("server read %d\n", r);
Packit Service 084de1
                    sr_num -= r;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
Packit Service 084de1
            *s_time += (clock() - s_clock);
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
Packit Service 084de1
Packit Service 084de1
    if (verbose)
Packit Service 084de1
        print_details(c_ssl, "DONE via TCP connect: ");
Packit Service 084de1
# ifndef OPENSSL_NO_NEXTPROTONEG
Packit Service 084de1
    if (verify_npn(c_ssl, s_ssl) < 0)
Packit Service 084de1
        goto end;
Packit Service 084de1
# endif
Packit Service 084de1
    if (verify_serverinfo() < 0) {
Packit Service 084de1
        fprintf(stderr, "Server info verify error\n");
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
    if (verify_alpn(c_ssl, s_ssl) < 0
Packit Service 084de1
            || verify_servername(c_ssl, s_ssl) < 0)
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    if (custom_ext_error) {
Packit Service 084de1
        fprintf(stderr, "Custom extension error\n");
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
# ifndef OPENSSL_NO_NEXTPROTONEG
Packit Service 084de1
 end:
Packit Service 084de1
# endif
Packit Service 084de1
    ret = EXIT_SUCCESS;
Packit Service 084de1
Packit Service 084de1
 err:
Packit Service 084de1
    ERR_print_errors(bio_err);
Packit Service 084de1
Packit Service 084de1
    BIO_free_all(acpt);
Packit Service 084de1
    BIO_free(server);
Packit Service 084de1
    BIO_free(client);
Packit Service 084de1
    BIO_free(s_ssl_bio);
Packit Service 084de1
    BIO_free(c_ssl_bio);
Packit Service 084de1
Packit Service 084de1
    if (should_negotiate != NULL && strcmp(should_negotiate, "fail-client") == 0)
Packit Service 084de1
        ret = (err_in_client != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
Packit Service 084de1
    else if (should_negotiate != NULL && strcmp(should_negotiate, "fail-server") == 0)
Packit Service 084de1
        ret = (err_in_server != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
Packit Service 084de1
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
Packit Service 084de1
                 clock_t *s_time, clock_t *c_time)
Packit Service 084de1
{
Packit Service 084de1
    long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
Packit Service 084de1
    BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
Packit Service 084de1
    BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL;
Packit Service 084de1
    int ret = EXIT_FAILURE;
Packit Service 084de1
    int err_in_client = 0;
Packit Service 084de1
    int err_in_server = 0;
Packit Service 084de1
Packit Service 084de1
    size_t bufsiz = 256;        /* small buffer for testing */
Packit Service 084de1
Packit Service 084de1
    if (!BIO_new_bio_pair(&server, bufsiz, &server_io, bufsiz))
Packit Service 084de1
        goto err;
Packit Service 084de1
    if (!BIO_new_bio_pair(&client, bufsiz, &client_io, bufsiz))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    s_ssl_bio = BIO_new(BIO_f_ssl());
Packit Service 084de1
    if (!s_ssl_bio)
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    c_ssl_bio = BIO_new(BIO_f_ssl());
Packit Service 084de1
    if (!c_ssl_bio)
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    SSL_set_connect_state(c_ssl);
Packit Service 084de1
    SSL_set_bio(c_ssl, client, client);
Packit Service 084de1
    (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
Packit Service 084de1
Packit Service 084de1
    SSL_set_accept_state(s_ssl);
Packit Service 084de1
    SSL_set_bio(s_ssl, server, server);
Packit Service 084de1
    (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
Packit Service 084de1
Packit Service 084de1
    do {
Packit Service 084de1
        /*-
Packit Service 084de1
         * c_ssl_bio:          SSL filter BIO
Packit Service 084de1
         *
Packit Service 084de1
         * client:             pseudo-I/O for SSL library
Packit Service 084de1
         *
Packit Service 084de1
         * client_io:          client's SSL communication; usually to be
Packit Service 084de1
         *                     relayed over some I/O facility, but in this
Packit Service 084de1
         *                     test program, we're the server, too:
Packit Service 084de1
         *
Packit Service 084de1
         * server_io:          server's SSL communication
Packit Service 084de1
         *
Packit Service 084de1
         * server:             pseudo-I/O for SSL library
Packit Service 084de1
         *
Packit Service 084de1
         * s_ssl_bio:          SSL filter BIO
Packit Service 084de1
         *
Packit Service 084de1
         * The client and the server each employ a "BIO pair":
Packit Service 084de1
         * client + client_io, server + server_io.
Packit Service 084de1
         * BIO pairs are symmetric.  A BIO pair behaves similar
Packit Service 084de1
         * to a non-blocking socketpair (but both endpoints must
Packit Service 084de1
         * be handled by the same thread).
Packit Service 084de1
         * [Here we could connect client and server to the ends
Packit Service 084de1
         * of a single BIO pair, but then this code would be less
Packit Service 084de1
         * suitable as an example for BIO pairs in general.]
Packit Service 084de1
         *
Packit Service 084de1
         * Useful functions for querying the state of BIO pair endpoints:
Packit Service 084de1
         *
Packit Service 084de1
         * BIO_ctrl_pending(bio)              number of bytes we can read now
Packit Service 084de1
         * BIO_ctrl_get_read_request(bio)     number of bytes needed to fulfill
Packit Service 084de1
         *                                      other side's read attempt
Packit Service 084de1
         * BIO_ctrl_get_write_guarantee(bio)   number of bytes we can write now
Packit Service 084de1
         *
Packit Service 084de1
         * ..._read_request is never more than ..._write_guarantee;
Packit Service 084de1
         * it depends on the application which one you should use.
Packit Service 084de1
         */
Packit Service 084de1
Packit Service 084de1
        /*
Packit Service 084de1
         * We have non-blocking behaviour throughout this test program, but
Packit Service 084de1
         * can be sure that there is *some* progress in each iteration; so we
Packit Service 084de1
         * don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE --
Packit Service 084de1
         * we just try everything in each iteration
Packit Service 084de1
         */
Packit Service 084de1
Packit Service 084de1
        {
Packit Service 084de1
            /* CLIENT */
Packit Service 084de1
Packit Service 084de1
            char cbuf[1024 * 8];
Packit Service 084de1
            int i, r;
Packit Service 084de1
            clock_t c_clock = clock();
Packit Service 084de1
Packit Service 084de1
            memset(cbuf, 0, sizeof(cbuf));
Packit Service 084de1
Packit Service 084de1
            if (debug)
Packit Service 084de1
                if (SSL_in_init(c_ssl))
Packit Service 084de1
                    printf("client waiting in SSL_connect - %s\n",
Packit Service 084de1
                           SSL_state_string_long(c_ssl));
Packit Service 084de1
Packit Service 084de1
            if (cw_num > 0) {
Packit Service 084de1
                /* Write to server. */
Packit Service 084de1
Packit Service 084de1
                if (cw_num > (long)sizeof(cbuf))
Packit Service 084de1
                    i = sizeof(cbuf);
Packit Service 084de1
                else
Packit Service 084de1
                    i = (int)cw_num;
Packit Service 084de1
                r = BIO_write(c_ssl_bio, cbuf, i);
Packit Service 084de1
                if (r < 0) {
Packit Service 084de1
                    if (!BIO_should_retry(c_ssl_bio)) {
Packit Service 084de1
                        fprintf(stderr, "ERROR in CLIENT\n");
Packit Service 084de1
                        err_in_client = 1;
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                    /*
Packit Service 084de1
                     * BIO_should_retry(...) can just be ignored here. The
Packit Service 084de1
                     * library expects us to call BIO_write with the same
Packit Service 084de1
                     * arguments again, and that's what we will do in the
Packit Service 084de1
                     * next iteration.
Packit Service 084de1
                     */
Packit Service 084de1
                } else if (r == 0) {
Packit Service 084de1
                    fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("client wrote %d\n", r);
Packit Service 084de1
                    cw_num -= r;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
Packit Service 084de1
            if (cr_num > 0) {
Packit Service 084de1
                /* Read from server. */
Packit Service 084de1
Packit Service 084de1
                r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
Packit Service 084de1
                if (r < 0) {
Packit Service 084de1
                    if (!BIO_should_retry(c_ssl_bio)) {
Packit Service 084de1
                        fprintf(stderr, "ERROR in CLIENT\n");
Packit Service 084de1
                        err_in_client = 1;
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                    /*
Packit Service 084de1
                     * Again, "BIO_should_retry" can be ignored.
Packit Service 084de1
                     */
Packit Service 084de1
                } else if (r == 0) {
Packit Service 084de1
                    fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("client read %d\n", r);
Packit Service 084de1
                    cr_num -= r;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
Packit Service 084de1
            /*
Packit Service 084de1
             * c_time and s_time increments will typically be very small
Packit Service 084de1
             * (depending on machine speed and clock tick intervals), but
Packit Service 084de1
             * sampling over a large number of connections should result in
Packit Service 084de1
             * fairly accurate figures.  We cannot guarantee a lot, however
Packit Service 084de1
             * -- if each connection lasts for exactly one clock tick, it
Packit Service 084de1
             * will be counted only for the client or only for the server or
Packit Service 084de1
             * even not at all.
Packit Service 084de1
             */
Packit Service 084de1
            *c_time += (clock() - c_clock);
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        {
Packit Service 084de1
            /* SERVER */
Packit Service 084de1
Packit Service 084de1
            char sbuf[1024 * 8];
Packit Service 084de1
            int i, r;
Packit Service 084de1
            clock_t s_clock = clock();
Packit Service 084de1
Packit Service 084de1
            memset(sbuf, 0, sizeof(sbuf));
Packit Service 084de1
Packit Service 084de1
            if (debug)
Packit Service 084de1
                if (SSL_in_init(s_ssl))
Packit Service 084de1
                    printf("server waiting in SSL_accept - %s\n",
Packit Service 084de1
                           SSL_state_string_long(s_ssl));
Packit Service 084de1
Packit Service 084de1
            if (sw_num > 0) {
Packit Service 084de1
                /* Write to client. */
Packit Service 084de1
Packit Service 084de1
                if (sw_num > (long)sizeof(sbuf))
Packit Service 084de1
                    i = sizeof(sbuf);
Packit Service 084de1
                else
Packit Service 084de1
                    i = (int)sw_num;
Packit Service 084de1
                r = BIO_write(s_ssl_bio, sbuf, i);
Packit Service 084de1
                if (r < 0) {
Packit Service 084de1
                    if (!BIO_should_retry(s_ssl_bio)) {
Packit Service 084de1
                        fprintf(stderr, "ERROR in SERVER\n");
Packit Service 084de1
                        err_in_server = 1;
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                    /* Ignore "BIO_should_retry". */
Packit Service 084de1
                } else if (r == 0) {
Packit Service 084de1
                    fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("server wrote %d\n", r);
Packit Service 084de1
                    sw_num -= r;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
Packit Service 084de1
            if (sr_num > 0) {
Packit Service 084de1
                /* Read from client. */
Packit Service 084de1
Packit Service 084de1
                r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
Packit Service 084de1
                if (r < 0) {
Packit Service 084de1
                    if (!BIO_should_retry(s_ssl_bio)) {
Packit Service 084de1
                        fprintf(stderr, "ERROR in SERVER\n");
Packit Service 084de1
                        err_in_server = 1;
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                    /* blah, blah */
Packit Service 084de1
                } else if (r == 0) {
Packit Service 084de1
                    fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("server read %d\n", r);
Packit Service 084de1
                    sr_num -= r;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
Packit Service 084de1
            *s_time += (clock() - s_clock);
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        {
Packit Service 084de1
            /* "I/O" BETWEEN CLIENT AND SERVER. */
Packit Service 084de1
Packit Service 084de1
            size_t r1, r2;
Packit Service 084de1
            BIO *io1 = server_io, *io2 = client_io;
Packit Service 084de1
            /*
Packit Service 084de1
             * we use the non-copying interface for io1 and the standard
Packit Service 084de1
             * BIO_write/BIO_read interface for io2
Packit Service 084de1
             */
Packit Service 084de1
Packit Service 084de1
            static int prev_progress = 1;
Packit Service 084de1
            int progress = 0;
Packit Service 084de1
Packit Service 084de1
            /* io1 to io2 */
Packit Service 084de1
            do {
Packit Service 084de1
                size_t num;
Packit Service 084de1
                int r;
Packit Service 084de1
Packit Service 084de1
                r1 = BIO_ctrl_pending(io1);
Packit Service 084de1
                r2 = BIO_ctrl_get_write_guarantee(io2);
Packit Service 084de1
Packit Service 084de1
                num = r1;
Packit Service 084de1
                if (r2 < num)
Packit Service 084de1
                    num = r2;
Packit Service 084de1
                if (num) {
Packit Service 084de1
                    char *dataptr;
Packit Service 084de1
Packit Service 084de1
                    if (INT_MAX < num) /* yeah, right */
Packit Service 084de1
                        num = INT_MAX;
Packit Service 084de1
Packit Service 084de1
                    r = BIO_nread(io1, &dataptr, (int)num);
Packit Service 084de1
                    assert(r > 0);
Packit Service 084de1
                    assert(r <= (int)num);
Packit Service 084de1
                    /*
Packit Service 084de1
                     * possibly r < num (non-contiguous data)
Packit Service 084de1
                     */
Packit Service 084de1
                    num = r;
Packit Service 084de1
                    r = BIO_write(io2, dataptr, (int)num);
Packit Service 084de1
                    if (r != (int)num) { /* can't happen */
Packit Service 084de1
                        fprintf(stderr, "ERROR: BIO_write could not write "
Packit Service 084de1
                                "BIO_ctrl_get_write_guarantee() bytes");
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                    progress = 1;
Packit Service 084de1
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf((io1 == client_io) ?
Packit Service 084de1
                               "C->S relaying: %d bytes\n" :
Packit Service 084de1
                               "S->C relaying: %d bytes\n", (int)num);
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
            while (r1 && r2);
Packit Service 084de1
Packit Service 084de1
            /* io2 to io1 */
Packit Service 084de1
            {
Packit Service 084de1
                size_t num;
Packit Service 084de1
                int r;
Packit Service 084de1
Packit Service 084de1
                r1 = BIO_ctrl_pending(io2);
Packit Service 084de1
                r2 = BIO_ctrl_get_read_request(io1);
Packit Service 084de1
                /*
Packit Service 084de1
                 * here we could use ..._get_write_guarantee instead of
Packit Service 084de1
                 * ..._get_read_request, but by using the latter we test
Packit Service 084de1
                 * restartability of the SSL implementation more thoroughly
Packit Service 084de1
                 */
Packit Service 084de1
                num = r1;
Packit Service 084de1
                if (r2 < num)
Packit Service 084de1
                    num = r2;
Packit Service 084de1
                if (num) {
Packit Service 084de1
                    char *dataptr;
Packit Service 084de1
Packit Service 084de1
                    if (INT_MAX < num)
Packit Service 084de1
                        num = INT_MAX;
Packit Service 084de1
Packit Service 084de1
                    if (num > 1)
Packit Service 084de1
                        --num;  /* test restartability even more thoroughly */
Packit Service 084de1
Packit Service 084de1
                    r = BIO_nwrite0(io1, &dataptr);
Packit Service 084de1
                    assert(r > 0);
Packit Service 084de1
                    if (r < (int)num)
Packit Service 084de1
                        num = r;
Packit Service 084de1
                    r = BIO_read(io2, dataptr, (int)num);
Packit Service 084de1
                    if (r != (int)num) { /* can't happen */
Packit Service 084de1
                        fprintf(stderr, "ERROR: BIO_read could not read "
Packit Service 084de1
                                "BIO_ctrl_pending() bytes");
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                    progress = 1;
Packit Service 084de1
                    r = BIO_nwrite(io1, &dataptr, (int)num);
Packit Service 084de1
                    if (r != (int)num) { /* can't happen */
Packit Service 084de1
                        fprintf(stderr, "ERROR: BIO_nwrite() did not accept "
Packit Service 084de1
                                "BIO_nwrite0() bytes");
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf((io2 == client_io) ?
Packit Service 084de1
                               "C->S relaying: %d bytes\n" :
Packit Service 084de1
                               "S->C relaying: %d bytes\n", (int)num);
Packit Service 084de1
                }
Packit Service 084de1
            }                   /* no loop, BIO_ctrl_get_read_request now
Packit Service 084de1
                                 * returns 0 anyway */
Packit Service 084de1
Packit Service 084de1
            if (!progress && !prev_progress)
Packit Service 084de1
                if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0) {
Packit Service 084de1
                    fprintf(stderr, "ERROR: got stuck\n");
Packit Service 084de1
                    fprintf(stderr, " ERROR.\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                }
Packit Service 084de1
            prev_progress = progress;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
Packit Service 084de1
Packit Service 084de1
    if (verbose)
Packit Service 084de1
        print_details(c_ssl, "DONE via BIO pair: ");
Packit Service 084de1
#ifndef OPENSSL_NO_NEXTPROTONEG
Packit Service 084de1
    if (verify_npn(c_ssl, s_ssl) < 0)
Packit Service 084de1
        goto end;
Packit Service 084de1
#endif
Packit Service 084de1
    if (verify_serverinfo() < 0) {
Packit Service 084de1
        fprintf(stderr, "Server info verify error\n");
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
    if (verify_alpn(c_ssl, s_ssl) < 0
Packit Service 084de1
            || verify_servername(c_ssl, s_ssl) < 0)
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    if (custom_ext_error) {
Packit Service 084de1
        fprintf(stderr, "Custom extension error\n");
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_NEXTPROTONEG
Packit Service 084de1
 end:
Packit Service 084de1
#endif
Packit Service 084de1
    ret = EXIT_SUCCESS;
Packit Service 084de1
Packit Service 084de1
 err:
Packit Service 084de1
    ERR_print_errors(bio_err);
Packit Service 084de1
Packit Service 084de1
    BIO_free(server);
Packit Service 084de1
    BIO_free(server_io);
Packit Service 084de1
    BIO_free(client);
Packit Service 084de1
    BIO_free(client_io);
Packit Service 084de1
    BIO_free(s_ssl_bio);
Packit Service 084de1
    BIO_free(c_ssl_bio);
Packit Service 084de1
Packit Service 084de1
    if (should_negotiate != NULL && strcmp(should_negotiate, "fail-client") == 0)
Packit Service 084de1
        ret = (err_in_client != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
Packit Service 084de1
    else if (should_negotiate != NULL && strcmp(should_negotiate, "fail-server") == 0)
Packit Service 084de1
        ret = (err_in_server != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
Packit Service 084de1
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
#define W_READ  1
Packit Service 084de1
#define W_WRITE 2
Packit Service 084de1
#define C_DONE  1
Packit Service 084de1
#define S_DONE  2
Packit Service 084de1
Packit Service 084de1
int doit(SSL *s_ssl, SSL *c_ssl, long count)
Packit Service 084de1
{
Packit Service 084de1
    char *cbuf = NULL, *sbuf = NULL;
Packit Service 084de1
    long bufsiz;
Packit Service 084de1
    long cw_num = count, cr_num = count;
Packit Service 084de1
    long sw_num = count, sr_num = count;
Packit Service 084de1
    int ret = EXIT_FAILURE;
Packit Service 084de1
    BIO *c_to_s = NULL;
Packit Service 084de1
    BIO *s_to_c = NULL;
Packit Service 084de1
    BIO *c_bio = NULL;
Packit Service 084de1
    BIO *s_bio = NULL;
Packit Service 084de1
    int c_r, c_w, s_r, s_w;
Packit Service 084de1
    int i, j;
Packit Service 084de1
    int done = 0;
Packit Service 084de1
    int c_write, s_write;
Packit Service 084de1
    int do_server = 0, do_client = 0;
Packit Service 084de1
    int max_frag = 5 * 1024;
Packit Service 084de1
    int err_in_client = 0;
Packit Service 084de1
    int err_in_server = 0;
Packit Service 084de1
Packit Service 084de1
    bufsiz = count > 40 * 1024 ? 40 * 1024 : count;
Packit Service 084de1
Packit Service 084de1
    if ((cbuf = OPENSSL_zalloc(bufsiz)) == NULL)
Packit Service 084de1
        goto err;
Packit Service 084de1
    if ((sbuf = OPENSSL_zalloc(bufsiz)) == NULL)
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    c_to_s = BIO_new(BIO_s_mem());
Packit Service 084de1
    s_to_c = BIO_new(BIO_s_mem());
Packit Service 084de1
    if ((s_to_c == NULL) || (c_to_s == NULL)) {
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    c_bio = BIO_new(BIO_f_ssl());
Packit Service 084de1
    s_bio = BIO_new(BIO_f_ssl());
Packit Service 084de1
    if ((c_bio == NULL) || (s_bio == NULL)) {
Packit Service 084de1
        ERR_print_errors(bio_err);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    SSL_set_connect_state(c_ssl);
Packit Service 084de1
    SSL_set_bio(c_ssl, s_to_c, c_to_s);
Packit Service 084de1
    SSL_set_max_send_fragment(c_ssl, max_frag);
Packit Service 084de1
    BIO_set_ssl(c_bio, c_ssl, BIO_NOCLOSE);
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * We've just given our ref to these BIOs to c_ssl. We need another one to
Packit Service 084de1
     * give to s_ssl
Packit Service 084de1
     */
Packit Service 084de1
    if (!BIO_up_ref(c_to_s)) {
Packit Service 084de1
        /* c_to_s and s_to_c will get freed when we free c_ssl */
Packit Service 084de1
        c_to_s = NULL;
Packit Service 084de1
        s_to_c = NULL;
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
    if (!BIO_up_ref(s_to_c)) {
Packit Service 084de1
        /* s_to_c will get freed when we free c_ssl */
Packit Service 084de1
        s_to_c = NULL;
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    SSL_set_accept_state(s_ssl);
Packit Service 084de1
    SSL_set_bio(s_ssl, c_to_s, s_to_c);
Packit Service 084de1
Packit Service 084de1
    /* We've used up all our refs to these now */
Packit Service 084de1
    c_to_s = NULL;
Packit Service 084de1
    s_to_c = NULL;
Packit Service 084de1
Packit Service 084de1
    SSL_set_max_send_fragment(s_ssl, max_frag);
Packit Service 084de1
    BIO_set_ssl(s_bio, s_ssl, BIO_NOCLOSE);
Packit Service 084de1
Packit Service 084de1
    c_r = 0;
Packit Service 084de1
    s_r = 1;
Packit Service 084de1
    c_w = 1;
Packit Service 084de1
    s_w = 0;
Packit Service 084de1
    c_write = 1, s_write = 0;
Packit Service 084de1
Packit Service 084de1
    /* We can always do writes */
Packit Service 084de1
    for (;;) {
Packit Service 084de1
        do_server = 0;
Packit Service 084de1
        do_client = 0;
Packit Service 084de1
Packit Service 084de1
        i = (int)BIO_pending(s_bio);
Packit Service 084de1
        if ((i && s_r) || s_w)
Packit Service 084de1
            do_server = 1;
Packit Service 084de1
Packit Service 084de1
        i = (int)BIO_pending(c_bio);
Packit Service 084de1
        if ((i && c_r) || c_w)
Packit Service 084de1
            do_client = 1;
Packit Service 084de1
Packit Service 084de1
        if (do_server && debug) {
Packit Service 084de1
            if (SSL_in_init(s_ssl))
Packit Service 084de1
                printf("server waiting in SSL_accept - %s\n",
Packit Service 084de1
                       SSL_state_string_long(s_ssl));
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        if (do_client && debug) {
Packit Service 084de1
            if (SSL_in_init(c_ssl))
Packit Service 084de1
                printf("client waiting in SSL_connect - %s\n",
Packit Service 084de1
                       SSL_state_string_long(c_ssl));
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        if (!do_client && !do_server) {
Packit Service 084de1
            fprintf(stdout, "ERROR IN STARTUP\n");
Packit Service 084de1
            ERR_print_errors(bio_err);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
        if (do_client && !(done & C_DONE)) {
Packit Service 084de1
            if (c_write) {
Packit Service 084de1
                j = (cw_num > bufsiz) ? (int)bufsiz : (int)cw_num;
Packit Service 084de1
                i = BIO_write(c_bio, cbuf, j);
Packit Service 084de1
                if (i < 0) {
Packit Service 084de1
                    c_r = 0;
Packit Service 084de1
                    c_w = 0;
Packit Service 084de1
                    if (BIO_should_retry(c_bio)) {
Packit Service 084de1
                        if (BIO_should_read(c_bio))
Packit Service 084de1
                            c_r = 1;
Packit Service 084de1
                        if (BIO_should_write(c_bio))
Packit Service 084de1
                            c_w = 1;
Packit Service 084de1
                    } else {
Packit Service 084de1
                        fprintf(stderr, "ERROR in CLIENT\n");
Packit Service 084de1
                        err_in_client = 1;
Packit Service 084de1
                        ERR_print_errors(bio_err);
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                } else if (i == 0) {
Packit Service 084de1
                    fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("client wrote %d\n", i);
Packit Service 084de1
                    /* ok */
Packit Service 084de1
                    s_r = 1;
Packit Service 084de1
                    c_write = 0;
Packit Service 084de1
                    cw_num -= i;
Packit Service 084de1
                    if (max_frag > 1029)
Packit Service 084de1
                        SSL_set_max_send_fragment(c_ssl, max_frag -= 5);
Packit Service 084de1
                }
Packit Service 084de1
            } else {
Packit Service 084de1
                i = BIO_read(c_bio, cbuf, bufsiz);
Packit Service 084de1
                if (i < 0) {
Packit Service 084de1
                    c_r = 0;
Packit Service 084de1
                    c_w = 0;
Packit Service 084de1
                    if (BIO_should_retry(c_bio)) {
Packit Service 084de1
                        if (BIO_should_read(c_bio))
Packit Service 084de1
                            c_r = 1;
Packit Service 084de1
                        if (BIO_should_write(c_bio))
Packit Service 084de1
                            c_w = 1;
Packit Service 084de1
                    } else {
Packit Service 084de1
                        fprintf(stderr, "ERROR in CLIENT\n");
Packit Service 084de1
                        err_in_client = 1;
Packit Service 084de1
                        ERR_print_errors(bio_err);
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                } else if (i == 0) {
Packit Service 084de1
                    fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("client read %d\n", i);
Packit Service 084de1
                    cr_num -= i;
Packit Service 084de1
                    if (sw_num > 0) {
Packit Service 084de1
                        s_write = 1;
Packit Service 084de1
                        s_w = 1;
Packit Service 084de1
                    }
Packit Service 084de1
                    if (cr_num <= 0) {
Packit Service 084de1
                        s_write = 1;
Packit Service 084de1
                        s_w = 1;
Packit Service 084de1
                        done = S_DONE | C_DONE;
Packit Service 084de1
                    }
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        if (do_server && !(done & S_DONE)) {
Packit Service 084de1
            if (!s_write) {
Packit Service 084de1
                i = BIO_read(s_bio, sbuf, bufsiz);
Packit Service 084de1
                if (i < 0) {
Packit Service 084de1
                    s_r = 0;
Packit Service 084de1
                    s_w = 0;
Packit Service 084de1
                    if (BIO_should_retry(s_bio)) {
Packit Service 084de1
                        if (BIO_should_read(s_bio))
Packit Service 084de1
                            s_r = 1;
Packit Service 084de1
                        if (BIO_should_write(s_bio))
Packit Service 084de1
                            s_w = 1;
Packit Service 084de1
                    } else {
Packit Service 084de1
                        fprintf(stderr, "ERROR in SERVER\n");
Packit Service 084de1
                        err_in_server = 1;
Packit Service 084de1
                        ERR_print_errors(bio_err);
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                } else if (i == 0) {
Packit Service 084de1
                    ERR_print_errors(bio_err);
Packit Service 084de1
                    fprintf(stderr,
Packit Service 084de1
                            "SSL SERVER STARTUP FAILED in SSL_read\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("server read %d\n", i);
Packit Service 084de1
                    sr_num -= i;
Packit Service 084de1
                    if (cw_num > 0) {
Packit Service 084de1
                        c_write = 1;
Packit Service 084de1
                        c_w = 1;
Packit Service 084de1
                    }
Packit Service 084de1
                    if (sr_num <= 0) {
Packit Service 084de1
                        s_write = 1;
Packit Service 084de1
                        s_w = 1;
Packit Service 084de1
                        c_write = 0;
Packit Service 084de1
                    }
Packit Service 084de1
                }
Packit Service 084de1
            } else {
Packit Service 084de1
                j = (sw_num > bufsiz) ? (int)bufsiz : (int)sw_num;
Packit Service 084de1
                i = BIO_write(s_bio, sbuf, j);
Packit Service 084de1
                if (i < 0) {
Packit Service 084de1
                    s_r = 0;
Packit Service 084de1
                    s_w = 0;
Packit Service 084de1
                    if (BIO_should_retry(s_bio)) {
Packit Service 084de1
                        if (BIO_should_read(s_bio))
Packit Service 084de1
                            s_r = 1;
Packit Service 084de1
                        if (BIO_should_write(s_bio))
Packit Service 084de1
                            s_w = 1;
Packit Service 084de1
                    } else {
Packit Service 084de1
                        fprintf(stderr, "ERROR in SERVER\n");
Packit Service 084de1
                        err_in_server = 1;
Packit Service 084de1
                        ERR_print_errors(bio_err);
Packit Service 084de1
                        goto err;
Packit Service 084de1
                    }
Packit Service 084de1
                } else if (i == 0) {
Packit Service 084de1
                    ERR_print_errors(bio_err);
Packit Service 084de1
                    fprintf(stderr,
Packit Service 084de1
                            "SSL SERVER STARTUP FAILED in SSL_write\n");
Packit Service 084de1
                    goto err;
Packit Service 084de1
                } else {
Packit Service 084de1
                    if (debug)
Packit Service 084de1
                        printf("server wrote %d\n", i);
Packit Service 084de1
                    sw_num -= i;
Packit Service 084de1
                    s_write = 0;
Packit Service 084de1
                    c_r = 1;
Packit Service 084de1
                    if (sw_num <= 0)
Packit Service 084de1
                        done |= S_DONE;
Packit Service 084de1
                    if (max_frag > 1029)
Packit Service 084de1
                        SSL_set_max_send_fragment(s_ssl, max_frag -= 5);
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        if ((done & S_DONE) && (done & C_DONE))
Packit Service 084de1
            break;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (verbose)
Packit Service 084de1
        print_details(c_ssl, "DONE: ");
Packit Service 084de1
#ifndef OPENSSL_NO_NEXTPROTONEG
Packit Service 084de1
    if (verify_npn(c_ssl, s_ssl) < 0)
Packit Service 084de1
        goto err;
Packit Service 084de1
#endif
Packit Service 084de1
    if (verify_serverinfo() < 0) {
Packit Service 084de1
        fprintf(stderr, "Server info verify error\n");
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
    if (custom_ext_error) {
Packit Service 084de1
        fprintf(stderr, "Custom extension error\n");
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
    ret = EXIT_SUCCESS;
Packit Service 084de1
 err:
Packit Service 084de1
    BIO_free(c_to_s);
Packit Service 084de1
    BIO_free(s_to_c);
Packit Service 084de1
    BIO_free_all(c_bio);
Packit Service 084de1
    BIO_free_all(s_bio);
Packit Service 084de1
    OPENSSL_free(cbuf);
Packit Service 084de1
    OPENSSL_free(sbuf);
Packit Service 084de1
Packit Service 084de1
    if (should_negotiate != NULL && strcmp(should_negotiate, "fail-client") == 0)
Packit Service 084de1
        ret = (err_in_client != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
Packit Service 084de1
    else if (should_negotiate != NULL && strcmp(should_negotiate, "fail-server") == 0)
Packit Service 084de1
        ret = (err_in_server != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
Packit Service 084de1
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int verify_callback(int ok, X509_STORE_CTX *ctx)
Packit Service 084de1
{
Packit Service 084de1
    char *s, buf[256];
Packit Service 084de1
Packit Service 084de1
    s = X509_NAME_oneline(X509_get_subject_name(X509_STORE_CTX_get_current_cert(ctx)),
Packit Service 084de1
                          buf, sizeof(buf));
Packit Service 084de1
    if (s != NULL) {
Packit Service 084de1
        if (ok)
Packit Service 084de1
            printf("depth=%d %s\n", X509_STORE_CTX_get_error_depth(ctx), buf);
Packit Service 084de1
        else {
Packit Service 084de1
            fprintf(stderr, "depth=%d error=%d %s\n",
Packit Service 084de1
                    X509_STORE_CTX_get_error_depth(ctx),
Packit Service 084de1
                    X509_STORE_CTX_get_error(ctx), buf);
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (ok == 0) {
Packit Service 084de1
        int i = X509_STORE_CTX_get_error(ctx);
Packit Service 084de1
Packit Service 084de1
        switch (i) {
Packit Service 084de1
        default:
Packit Service 084de1
            fprintf(stderr, "Error string: %s\n",
Packit Service 084de1
                    X509_verify_cert_error_string(i));
Packit Service 084de1
            break;
Packit Service 084de1
        case X509_V_ERR_CERT_NOT_YET_VALID:
Packit Service 084de1
        case X509_V_ERR_CERT_HAS_EXPIRED:
Packit Service 084de1
        case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
Packit Service 084de1
            ok = 1;
Packit Service 084de1
            break;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return ok;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int app_verify_callback(X509_STORE_CTX *ctx, void *arg)
Packit Service 084de1
{
Packit Service 084de1
    int ok = 1;
Packit Service 084de1
    struct app_verify_arg *cb_arg = arg;
Packit Service 084de1
Packit Service 084de1
    if (cb_arg->app_verify) {
Packit Service 084de1
        char *s = NULL, buf[256];
Packit Service 084de1
        X509 *c = X509_STORE_CTX_get0_cert(ctx);
Packit Service 084de1
Packit Service 084de1
        printf("In app_verify_callback, allowing cert. ");
Packit Service 084de1
        printf("Arg is: %s\n", cb_arg->string);
Packit Service 084de1
        printf("Finished printing do we have a context? 0x%p a cert? 0x%p\n",
Packit Service 084de1
                (void *)ctx, (void *)c);
Packit Service 084de1
        if (c)
Packit Service 084de1
            s = X509_NAME_oneline(X509_get_subject_name(c), buf, 256);
Packit Service 084de1
        if (s != NULL) {
Packit Service 084de1
            printf("cert depth=%d %s\n",
Packit Service 084de1
                    X509_STORE_CTX_get_error_depth(ctx), buf);
Packit Service 084de1
        }
Packit Service 084de1
        return 1;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    ok = X509_verify_cert(ctx);
Packit Service 084de1
Packit Service 084de1
    return ok;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_DH
Packit Service 084de1
/*-
Packit Service 084de1
 * These DH parameters have been generated as follows:
Packit Service 084de1
 *    $ openssl dhparam -C -noout 512
Packit Service 084de1
 *    $ openssl dhparam -C -noout 1024
Packit Service 084de1
 *    $ openssl dhparam -C -noout -dsaparam 1024
Packit Service 084de1
 * (The third function has been renamed to avoid name conflicts.)
Packit Service 084de1
 */
Packit Service 084de1
static DH *get_dh512(void)
Packit Service 084de1
{
Packit Service 084de1
    static unsigned char dh512_p[] = {
Packit Service 084de1
        0xCB, 0xC8, 0xE1, 0x86, 0xD0, 0x1F, 0x94, 0x17, 0xA6, 0x99, 0xF0,
Packit Service 084de1
        0xC6,
Packit Service 084de1
        0x1F, 0x0D, 0xAC, 0xB6, 0x25, 0x3E, 0x06, 0x39, 0xCA, 0x72, 0x04,
Packit Service 084de1
        0xB0,
Packit Service 084de1
        0x6E, 0xDA, 0xC0, 0x61, 0xE6, 0x7A, 0x77, 0x25, 0xE8, 0x3B, 0xB9,
Packit Service 084de1
        0x5F,
Packit Service 084de1
        0x9A, 0xB6, 0xB5, 0xFE, 0x99, 0x0B, 0xA1, 0x93, 0x4E, 0x35, 0x33,
Packit Service 084de1
        0xB8,
Packit Service 084de1
        0xE1, 0xF1, 0x13, 0x4F, 0x59, 0x1A, 0xD2, 0x57, 0xC0, 0x26, 0x21,
Packit Service 084de1
        0x33,
Packit Service 084de1
        0x02, 0xC5, 0xAE, 0x23,
Packit Service 084de1
    };
Packit Service 084de1
    static unsigned char dh512_g[] = {
Packit Service 084de1
        0x02,
Packit Service 084de1
    };
Packit Service 084de1
    DH *dh;
Packit Service 084de1
    BIGNUM *p, *g;
Packit Service 084de1
Packit Service 084de1
    if ((dh = DH_new()) == NULL)
Packit Service 084de1
        return NULL;
Packit Service 084de1
    p = BN_bin2bn(dh512_p, sizeof(dh512_p), NULL);
Packit Service 084de1
    g = BN_bin2bn(dh512_g, sizeof(dh512_g), NULL);
Packit Service 084de1
    if ((p == NULL) || (g == NULL) || !DH_set0_pqg(dh, p, NULL, g)) {
Packit Service 084de1
        DH_free(dh);
Packit Service 084de1
        BN_free(p);
Packit Service 084de1
        BN_free(g);
Packit Service 084de1
        return NULL;
Packit Service 084de1
    }
Packit Service 084de1
    return dh;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static DH *get_dh1024(void)
Packit Service 084de1
{
Packit Service 084de1
    static unsigned char dh1024_p[] = {
Packit Service 084de1
        0xF8, 0x81, 0x89, 0x7D, 0x14, 0x24, 0xC5, 0xD1, 0xE6, 0xF7, 0xBF,
Packit Service 084de1
        0x3A,
Packit Service 084de1
        0xE4, 0x90, 0xF4, 0xFC, 0x73, 0xFB, 0x34, 0xB5, 0xFA, 0x4C, 0x56,
Packit Service 084de1
        0xA2,
Packit Service 084de1
        0xEA, 0xA7, 0xE9, 0xC0, 0xC0, 0xCE, 0x89, 0xE1, 0xFA, 0x63, 0x3F,
Packit Service 084de1
        0xB0,
Packit Service 084de1
        0x6B, 0x32, 0x66, 0xF1, 0xD1, 0x7B, 0xB0, 0x00, 0x8F, 0xCA, 0x87,
Packit Service 084de1
        0xC2,
Packit Service 084de1
        0xAE, 0x98, 0x89, 0x26, 0x17, 0xC2, 0x05, 0xD2, 0xEC, 0x08, 0xD0,
Packit Service 084de1
        0x8C,
Packit Service 084de1
        0xFF, 0x17, 0x52, 0x8C, 0xC5, 0x07, 0x93, 0x03, 0xB1, 0xF6, 0x2F,
Packit Service 084de1
        0xB8,
Packit Service 084de1
        0x1C, 0x52, 0x47, 0x27, 0x1B, 0xDB, 0xD1, 0x8D, 0x9D, 0x69, 0x1D,
Packit Service 084de1
        0x52,
Packit Service 084de1
        0x4B, 0x32, 0x81, 0xAA, 0x7F, 0x00, 0xC8, 0xDC, 0xE6, 0xD9, 0xCC,
Packit Service 084de1
        0xC1,
Packit Service 084de1
        0x11, 0x2D, 0x37, 0x34, 0x6C, 0xEA, 0x02, 0x97, 0x4B, 0x0E, 0xBB,
Packit Service 084de1
        0xB1,
Packit Service 084de1
        0x71, 0x33, 0x09, 0x15, 0xFD, 0xDD, 0x23, 0x87, 0x07, 0x5E, 0x89,
Packit Service 084de1
        0xAB,
Packit Service 084de1
        0x6B, 0x7C, 0x5F, 0xEC, 0xA6, 0x24, 0xDC, 0x53,
Packit Service 084de1
    };
Packit Service 084de1
    static unsigned char dh1024_g[] = {
Packit Service 084de1
        0x02,
Packit Service 084de1
    };
Packit Service 084de1
    DH *dh;
Packit Service 084de1
    BIGNUM *p, *g;
Packit Service 084de1
Packit Service 084de1
    if ((dh = DH_new()) == NULL)
Packit Service 084de1
        return NULL;
Packit Service 084de1
    p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);
Packit Service 084de1
    g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL);
Packit Service 084de1
    if ((p == NULL) || (g == NULL) || !DH_set0_pqg(dh, p, NULL, g)) {
Packit Service 084de1
        DH_free(dh);
Packit Service 084de1
        BN_free(p);
Packit Service 084de1
        BN_free(g);
Packit Service 084de1
        return NULL;
Packit Service 084de1
    }
Packit Service 084de1
    return dh;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static DH *get_dh1024dsa(void)
Packit Service 084de1
{
Packit Service 084de1
    static unsigned char dh1024_p[] = {
Packit Service 084de1
        0xC8, 0x00, 0xF7, 0x08, 0x07, 0x89, 0x4D, 0x90, 0x53, 0xF3, 0xD5,
Packit Service 084de1
        0x00,
Packit Service 084de1
        0x21, 0x1B, 0xF7, 0x31, 0xA6, 0xA2, 0xDA, 0x23, 0x9A, 0xC7, 0x87,
Packit Service 084de1
        0x19,
Packit Service 084de1
        0x3B, 0x47, 0xB6, 0x8C, 0x04, 0x6F, 0xFF, 0xC6, 0x9B, 0xB8, 0x65,
Packit Service 084de1
        0xD2,
Packit Service 084de1
        0xC2, 0x5F, 0x31, 0x83, 0x4A, 0xA7, 0x5F, 0x2F, 0x88, 0x38, 0xB6,
Packit Service 084de1
        0x55,
Packit Service 084de1
        0xCF, 0xD9, 0x87, 0x6D, 0x6F, 0x9F, 0xDA, 0xAC, 0xA6, 0x48, 0xAF,
Packit Service 084de1
        0xFC,
Packit Service 084de1
        0x33, 0x84, 0x37, 0x5B, 0x82, 0x4A, 0x31, 0x5D, 0xE7, 0xBD, 0x52,
Packit Service 084de1
        0x97,
Packit Service 084de1
        0xA1, 0x77, 0xBF, 0x10, 0x9E, 0x37, 0xEA, 0x64, 0xFA, 0xCA, 0x28,
Packit Service 084de1
        0x8D,
Packit Service 084de1
        0x9D, 0x3B, 0xD2, 0x6E, 0x09, 0x5C, 0x68, 0xC7, 0x45, 0x90, 0xFD,
Packit Service 084de1
        0xBB,
Packit Service 084de1
        0x70, 0xC9, 0x3A, 0xBB, 0xDF, 0xD4, 0x21, 0x0F, 0xC4, 0x6A, 0x3C,
Packit Service 084de1
        0xF6,
Packit Service 084de1
        0x61, 0xCF, 0x3F, 0xD6, 0x13, 0xF1, 0x5F, 0xBC, 0xCF, 0xBC, 0x26,
Packit Service 084de1
        0x9E,
Packit Service 084de1
        0xBC, 0x0B, 0xBD, 0xAB, 0x5D, 0xC9, 0x54, 0x39,
Packit Service 084de1
    };
Packit Service 084de1
    static unsigned char dh1024_g[] = {
Packit Service 084de1
        0x3B, 0x40, 0x86, 0xE7, 0xF3, 0x6C, 0xDE, 0x67, 0x1C, 0xCC, 0x80,
Packit Service 084de1
        0x05,
Packit Service 084de1
        0x5A, 0xDF, 0xFE, 0xBD, 0x20, 0x27, 0x74, 0x6C, 0x24, 0xC9, 0x03,
Packit Service 084de1
        0xF3,
Packit Service 084de1
        0xE1, 0x8D, 0xC3, 0x7D, 0x98, 0x27, 0x40, 0x08, 0xB8, 0x8C, 0x6A,
Packit Service 084de1
        0xE9,
Packit Service 084de1
        0xBB, 0x1A, 0x3A, 0xD6, 0x86, 0x83, 0x5E, 0x72, 0x41, 0xCE, 0x85,
Packit Service 084de1
        0x3C,
Packit Service 084de1
        0xD2, 0xB3, 0xFC, 0x13, 0xCE, 0x37, 0x81, 0x9E, 0x4C, 0x1C, 0x7B,
Packit Service 084de1
        0x65,
Packit Service 084de1
        0xD3, 0xE6, 0xA6, 0x00, 0xF5, 0x5A, 0x95, 0x43, 0x5E, 0x81, 0xCF,
Packit Service 084de1
        0x60,
Packit Service 084de1
        0xA2, 0x23, 0xFC, 0x36, 0xA7, 0x5D, 0x7A, 0x4C, 0x06, 0x91, 0x6E,
Packit Service 084de1
        0xF6,
Packit Service 084de1
        0x57, 0xEE, 0x36, 0xCB, 0x06, 0xEA, 0xF5, 0x3D, 0x95, 0x49, 0xCB,
Packit Service 084de1
        0xA7,
Packit Service 084de1
        0xDD, 0x81, 0xDF, 0x80, 0x09, 0x4A, 0x97, 0x4D, 0xA8, 0x22, 0x72,
Packit Service 084de1
        0xA1,
Packit Service 084de1
        0x7F, 0xC4, 0x70, 0x56, 0x70, 0xE8, 0x20, 0x10, 0x18, 0x8F, 0x2E,
Packit Service 084de1
        0x60,
Packit Service 084de1
        0x07, 0xE7, 0x68, 0x1A, 0x82, 0x5D, 0x32, 0xA2,
Packit Service 084de1
    };
Packit Service 084de1
    DH *dh;
Packit Service 084de1
    BIGNUM *p, *g;
Packit Service 084de1
Packit Service 084de1
    if ((dh = DH_new()) == NULL)
Packit Service 084de1
        return NULL;
Packit Service 084de1
    p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);
Packit Service 084de1
    g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL);
Packit Service 084de1
    if ((p == NULL) || (g == NULL) || !DH_set0_pqg(dh, p, NULL, g)) {
Packit Service 084de1
        DH_free(dh);
Packit Service 084de1
        BN_free(p);
Packit Service 084de1
        BN_free(g);
Packit Service 084de1
        return NULL;
Packit Service 084de1
    }
Packit Service 084de1
    DH_set_length(dh, 160);
Packit Service 084de1
    return dh;
Packit Service 084de1
}
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_PSK
Packit Service 084de1
/* convert the PSK key (psk_key) in ascii to binary (psk) */
Packit Service 084de1
static int psk_key2bn(const char *pskkey, unsigned char *psk,
Packit Service 084de1
                      unsigned int max_psk_len)
Packit Service 084de1
{
Packit Service 084de1
    int ret;
Packit Service 084de1
    BIGNUM *bn = NULL;
Packit Service 084de1
Packit Service 084de1
    ret = BN_hex2bn(&bn, pskkey);
Packit Service 084de1
    if (!ret) {
Packit Service 084de1
        BIO_printf(bio_err, "Could not convert PSK key '%s' to BIGNUM\n",
Packit Service 084de1
                   pskkey);
Packit Service 084de1
        BN_free(bn);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    if (BN_num_bytes(bn) > (int)max_psk_len) {
Packit Service 084de1
        BIO_printf(bio_err,
Packit Service 084de1
                   "psk buffer of callback is too small (%d) for key (%d)\n",
Packit Service 084de1
                   max_psk_len, BN_num_bytes(bn));
Packit Service 084de1
        BN_free(bn);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    ret = BN_bn2bin(bn, psk);
Packit Service 084de1
    BN_free(bn);
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static unsigned int psk_client_callback(SSL *ssl, const char *hint,
Packit Service 084de1
                                        char *identity,
Packit Service 084de1
                                        unsigned int max_identity_len,
Packit Service 084de1
                                        unsigned char *psk,
Packit Service 084de1
                                        unsigned int max_psk_len)
Packit Service 084de1
{
Packit Service 084de1
    int ret;
Packit Service 084de1
    unsigned int psk_len = 0;
Packit Service 084de1
Packit Service 084de1
    ret = BIO_snprintf(identity, max_identity_len, "Client_identity");
Packit Service 084de1
    if (ret < 0)
Packit Service 084de1
        goto out_err;
Packit Service 084de1
    if (debug)
Packit Service 084de1
        fprintf(stderr, "client: created identity '%s' len=%d\n", identity,
Packit Service 084de1
                ret);
Packit Service 084de1
    ret = psk_key2bn(psk_key, psk, max_psk_len);
Packit Service 084de1
    if (ret < 0)
Packit Service 084de1
        goto out_err;
Packit Service 084de1
    psk_len = ret;
Packit Service 084de1
 out_err:
Packit Service 084de1
    return psk_len;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static unsigned int psk_server_callback(SSL *ssl, const char *identity,
Packit Service 084de1
                                        unsigned char *psk,
Packit Service 084de1
                                        unsigned int max_psk_len)
Packit Service 084de1
{
Packit Service 084de1
    unsigned int psk_len = 0;
Packit Service 084de1
Packit Service 084de1
    if (strcmp(identity, "Client_identity") != 0) {
Packit Service 084de1
        BIO_printf(bio_err, "server: PSK error: client identity not found\n");
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    psk_len = psk_key2bn(psk_key, psk, max_psk_len);
Packit Service 084de1
    return psk_len;
Packit Service 084de1
}
Packit Service 084de1
#endif