/*
 This file is part of libmicrohttpd
 Copyright (C) 2007 Christian Grothoff
 Copyright (C) 2017-2022 Evgeny Grin (Karlson2k)

 libmicrohttpd is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published
 by the Free Software Foundation; either version 2, or (at your
 option) any later version.

 libmicrohttpd is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with libmicrohttpd; see the file COPYING.  If not, write to the
 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 Boston, MA 02110-1301, USA.
 */

#ifndef TLS_TEST_COMMON_H_
#define TLS_TEST_COMMON_H_

#include "platform.h"
#include "microhttpd.h"
#include <curl/curl.h>
#include <sys/stat.h>
#include <limits.h>
#include <gnutls/gnutls.h>

#ifndef CURL_VERSION_BITS
#define CURL_VERSION_BITS(x,y,z) ((x) << 16 | (y) << 8 | (z))
#endif /* ! CURL_VERSION_BITS */
#ifndef CURL_AT_LEAST_VERSION
#define CURL_AT_LEAST_VERSION(x,y,z) \
  (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS (x, y, z))
#endif /* ! CURL_AT_LEAST_VERSION */

#define test_data "Hello World\n"
#define ca_cert_file_name SRCDIR "/test-ca.crt"

#define EMPTY_PAGE \
  "<html><head><title>Empty page</title></head><body>Empty page</body></html>"
#define PAGE_NOT_FOUND \
  "<html><head><title>File not found</title></head><body>File not found</body></html>"

#define MHD_E_MEM "Error: memory error\n"
#define MHD_E_SERVER_INIT "Error: failed to start server\n"
#define MHD_E_TEST_FILE_CREAT "Error: failed to setup test file\n"
#define MHD_E_CERT_FILE_CREAT "Error: failed to setup test certificate\n"
#define MHD_E_KEY_FILE_CREAT "Error: failed to setup test certificate\n"
#define MHD_E_FAILED_TO_CONNECT \
  "Error: server connection could not be established\n"

#ifndef MHD_STATICSTR_LEN_
/**
 * Determine length of static string / macro strings at compile time.
 */
#define MHD_STATICSTR_LEN_(macro) (sizeof(macro) / sizeof(char) - 1)
#endif /* ! MHD_STATICSTR_LEN_ */


/* The local copy if GnuTLS IDs to avoid long #ifdefs list with various
 * GnuTLS versions */
/**
 * The list of know (at the moment of writing) GnuTLS IDs of TLS versions.
 * Can be safely casted to/from @a gnutls_protocol_t.
 */
enum know_gnutls_tls_id
{
  KNOWN_BAD = 0,       /**< No TLS */
  KNOWN_TLS_SSLv3 = 1, /**< GNUTLS_SSL3 */
  KNOWN_TLS_V1_0 =  2, /**< GNUTLS_TLS1_0 */
  KNOWN_TLS_V1_1 =  3, /**< GNUTLS_TLS1_1 */
  KNOWN_TLS_V1_2 =  4, /**< GNUTLS_TLS1_2 */
  KNOWN_TLS_V1_3 =  5, /**< GNUTLS_TLS1_3 */
  KNOWN_TLS_MIN = KNOWN_TLS_SSLv3, /**< Minimum valid value */
  KNOWN_TLS_MAX = KNOWN_TLS_V1_3   /**< Maximum valid value */
};

#define KNOW_TLS_IDS_COUNT 6 /* KNOWN_TLS_MAX + 1 */
/**
 * Map @a know_gnutls_tls_ids values to printable names.
 */
extern const char *tls_names[KNOW_TLS_IDS_COUNT];

/**
 * Map @a know_gnutls_tls_ids values to GnuTLS priorities strings.
 */
extern const char *priorities_map[KNOW_TLS_IDS_COUNT];

/**
 * Map @a know_gnutls_tls_ids values to GnuTLS priorities append strings.
 */
extern const char *priorities_append_map[KNOW_TLS_IDS_COUNT];

/**
 * Map @a know_gnutls_tls_ids values to libcurl @a CURLOPT_SSLVERSION value.
 */
extern const long libcurl_tls_vers_map[KNOW_TLS_IDS_COUNT];

#if CURL_AT_LEAST_VERSION (7,54,0)
/**
 * Map @a know_gnutls_tls_ids values to libcurl @a CURLOPT_SSLVERSION value
 * for maximum supported TLS version.
 */
extern const long libcurl_tls_max_vers_map[KNOW_TLS_IDS_COUNT];
#endif /* CURL_AT_LEAST_VERSION(7,54,0) */

struct https_test_data
{
  void *cls;
  uint16_t port;
  const char *cipher_suite;
  int proto_version;
};

struct CBC
{
  char *buf;
  size_t pos;
  size_t size;
};

int
curl_tls_is_gnutls (void);

int
curl_tls_is_openssl (void);

int
curl_tls_is_nss (void);

int
curl_tls_is_schannel (void);

int
curl_tls_is_sectransport (void);


enum test_get_result
{
  TEST_GET_OK = 0,
  TEST_GET_ERROR = 1,

  TEST_GET_MHD_ERROR = 16,
  TEST_GET_TRANSFER_ERROR = 17,

  TEST_GET_CURL_GEN_ERROR = 32,
  TEST_GET_CURL_CA_ERROR = 33,
  TEST_GET_CURL_NOT_IMPLT = 34,

  TEST_GET_HARD_ERROR = 999
};
/**
 * perform cURL request for file
 */
enum test_get_result
test_daemon_get (void *cls,
                 const char *cipher_suite, int proto_version,
                 uint16_t port, int ver_peer);

void
print_test_result (unsigned int test_outcome,
                   const char *test_name);

size_t
copyBuffer (void *ptr, size_t size, size_t nmemb, void *ctx);

enum MHD_Result
http_ahc (void *cls, struct MHD_Connection *connection,
          const char *url, const char *method, const char *upload_data,
          const char *version, size_t *upload_data_size, void **req_cls);

enum MHD_Result
http_dummy_ahc (void *cls, struct MHD_Connection *connection,
                const char *url, const char *method, const char *upload_data,
                const char *version, size_t *upload_data_size,
                void **req_cls);


/**
 * compile test URI
 *
 * @param[out] uri - char buffer into which the url is compiled
 * @param uri_len number of bytes available in @a url
 * @param port port to use for the test
 * @return 1 on error
 */
unsigned int
gen_test_uri (char *uri,
              size_t uri_len,
              uint16_t port);

CURLcode
send_curl_req (char *url,
               struct CBC *cbc,
               const char *cipher_suite,
               int proto_version);

unsigned int
test_https_transfer (void *cls,
                     uint16_t port,
                     const char *cipher_suite,
                     int proto_version);

unsigned int
setup_session (gnutls_session_t *session,
               gnutls_certificate_credentials_t *xcred);

unsigned int
teardown_session (gnutls_session_t session,
                  gnutls_certificate_credentials_t xcred);

unsigned int
test_wrap (const char *test_name, unsigned int
           (*test_function)(void *cls, uint16_t port, const char *cipher_suite,
                            int proto_version), void *cls,
           uint16_t port,
           unsigned int daemon_flags, const char *cipher_suite,
           int proto_version, ...);

int testsuite_curl_global_init (void);

/**
 * Check whether program name contains specific @a marker string.
 * Only last component in pathname is checked for marker presence,
 * all leading directories names (if any) are ignored. Directories
 * separators are handled correctly on both non-W32 and W32
 * platforms.
 * @param prog_name program name, may include path
 * @param marker    marker to look for.
 * @return zero if any parameter is NULL or empty string or
 *         @prog_name ends with slash or @marker is not found in
 *         program name, non-zero if @maker is found in program
 *         name.
 */
int
has_in_name (const char *prog_name, const char *marker);

#endif /* TLS_TEST_COMMON_H_ */
