/*
 *  Self-test demonstration program
 *
 *  Copyright The Mbed TLS Contributors
 *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
 */

#define MBEDTLS_ALLOW_PRIVATE_ACCESS

#include "mbedtls/build_info.h"

#include "mbedtls/entropy.h"
#include "mbedtls/hmac_drbg.h"
#include "mbedtls/ctr_drbg.h"
#include "mbedtls/dhm.h"
#include "mbedtls/gcm.h"
#include "mbedtls/ccm.h"
#include "mbedtls/cmac.h"
#include "mbedtls/md5.h"
#include "mbedtls/ripemd160.h"
#include "mbedtls/sha1.h"
#include "mbedtls/sha256.h"
#include "mbedtls/sha512.h"
#include "mbedtls/sha3.h"
#include "mbedtls/des.h"
#include "mbedtls/aes.h"
#include "mbedtls/camellia.h"
#include "mbedtls/aria.h"
#include "mbedtls/chacha20.h"
#include "mbedtls/poly1305.h"
#include "mbedtls/chachapoly.h"
#include "mbedtls/base64.h"
#include "mbedtls/bignum.h"
#include "mbedtls/rsa.h"
#include "mbedtls/x509.h"
#include "mbedtls/pkcs5.h"
#include "mbedtls/ecp.h"
#include "mbedtls/ecjpake.h"
#include "mbedtls/timing.h"
#include "mbedtls/nist_kw.h"
#include "mbedtls/debug.h"

#include <limits.h>
#include <string.h>

#include "mbedtls/platform.h"

#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
#include "mbedtls/memory_buffer_alloc.h"
#endif


#if defined MBEDTLS_SELF_TEST
/* Sanity check for malloc. This is not expected to fail, and is rather
 * intended to display potentially useful information about the platform,
 * in particular the behavior of malloc(0). */
static int calloc_self_test(int verbose)
{
    int failures = 0;
    void *empty1 = mbedtls_calloc(0, 1);
    void *empty2 = mbedtls_calloc(0, 1);
    void *buffer1 = mbedtls_calloc(1, 1);
    void *buffer2 = mbedtls_calloc(1, 1);
    unsigned int buffer_3_size = 256;
    unsigned int buffer_4_size = 4097; /* Allocate more than the usual page size */
    unsigned char *buffer3 = mbedtls_calloc(buffer_3_size, 1);
    unsigned char *buffer4 = mbedtls_calloc(buffer_4_size, 1);

    if (empty1 == NULL && empty2 == NULL) {
        if (verbose) {
            mbedtls_printf("  CALLOC(0,1): passed (NULL)\n");
        }
    } else if (empty1 == NULL || empty2 == NULL) {
        if (verbose) {
            mbedtls_printf("  CALLOC(0,1): failed (mix of NULL and non-NULL)\n");
        }
        ++failures;
    } else if (empty1 == empty2) {
        if (verbose) {
            mbedtls_printf("  CALLOC(0,1): passed (same non-null)\n");
        }
        empty2 = NULL;
    } else {
        if (verbose) {
            mbedtls_printf("  CALLOC(0,1): passed (distinct non-null)\n");
        }
    }

    mbedtls_free(empty1);
    mbedtls_free(empty2);

    empty1 = mbedtls_calloc(1, 0);
    empty2 = mbedtls_calloc(1, 0);
    if (empty1 == NULL && empty2 == NULL) {
        if (verbose) {
            mbedtls_printf("  CALLOC(1,0): passed (NULL)\n");
        }
    } else if (empty1 == NULL || empty2 == NULL) {
        if (verbose) {
            mbedtls_printf("  CALLOC(1,0): failed (mix of NULL and non-NULL)\n");
        }
        ++failures;
    } else if (empty1 == empty2) {
        if (verbose) {
            mbedtls_printf("  CALLOC(1,0): passed (same non-null)\n");
        }
        empty2 = NULL;
    } else {
        if (verbose) {
            mbedtls_printf("  CALLOC(1,0): passed (distinct non-null)\n");
        }
    }

    if (buffer1 == NULL || buffer2 == NULL) {
        if (verbose) {
            mbedtls_printf("  CALLOC(1): failed (NULL)\n");
        }
        ++failures;
    } else if (buffer1 == buffer2) {
        if (verbose) {
            mbedtls_printf("  CALLOC(1): failed (same buffer twice)\n");
        }
        ++failures;
        buffer2 = NULL;
    } else {
        if (verbose) {
            mbedtls_printf("  CALLOC(1): passed\n");
        }
    }

    mbedtls_free(buffer1);
    buffer1 = mbedtls_calloc(1, 1);
    if (buffer1 == NULL) {
        if (verbose) {
            mbedtls_printf("  CALLOC(1 again): failed (NULL)\n");
        }
        ++failures;
    } else {
        if (verbose) {
            mbedtls_printf("  CALLOC(1 again): passed\n");
        }
    }

    for (unsigned int i = 0; i < buffer_3_size; i++) {
        if (buffer3[i] != 0) {
            ++failures;
            if (verbose) {
                mbedtls_printf("  CALLOC(%u): failed (memory not initialized to 0)\n",
                               buffer_3_size);
            }
            break;
        }
    }

    for (unsigned int i = 0; i < buffer_4_size; i++) {
        if (buffer4[i] != 0) {
            ++failures;
            if (verbose) {
                mbedtls_printf("  CALLOC(%u): failed (memory not initialized to 0)\n",
                               buffer_4_size);
            }
            break;
        }
    }

    if (verbose) {
        mbedtls_printf("\n");
    }
    mbedtls_free(empty1);
    mbedtls_free(empty2);
    mbedtls_free(buffer1);
    mbedtls_free(buffer2);
    mbedtls_free(buffer3);
    mbedtls_free(buffer4);
    return failures;
}
#endif /* MBEDTLS_SELF_TEST */

static int test_snprintf(size_t n, const char *ref_buf, int ref_ret)
{
    int ret;
    char buf[10] = "xxxxxxxxx";
    const char ref[10] = "xxxxxxxxx";

    ret = mbedtls_snprintf(buf, n, "%s", "123");
    if (ret < 0 || (size_t) ret >= n) {
        ret = -1;
    }

    if (strncmp(ref_buf, buf, sizeof(buf)) != 0 ||
        ref_ret != ret ||
        memcmp(buf + n, ref + n, sizeof(buf) - n) != 0) {
        return 1;
    }

    return 0;
}

static int run_test_snprintf(void)
{
    return test_snprintf(0, "xxxxxxxxx",  -1) != 0 ||
           test_snprintf(1, "",           -1) != 0 ||
           test_snprintf(2, "1",          -1) != 0 ||
           test_snprintf(3, "12",         -1) != 0 ||
           test_snprintf(4, "123",         3) != 0 ||
           test_snprintf(5, "123",         3) != 0;
}

/*
 * Check if a seed file is present, and if not create one for the entropy
 * self-test. If this fails, we attempt the test anyway, so no error is passed
 * back.
 */
#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_ENTROPY_C)
#if defined(MBEDTLS_ENTROPY_NV_SEED) && !defined(MBEDTLS_NO_PLATFORM_ENTROPY)
static void create_entropy_seed_file(void)
{
    int result;
    size_t output_len = 0;
    unsigned char seed_value[MBEDTLS_ENTROPY_BLOCK_SIZE];

    /* Attempt to read the entropy seed file. If this fails - attempt to write
     * to the file to ensure one is present. */
    result = mbedtls_platform_std_nv_seed_read(seed_value,
                                               MBEDTLS_ENTROPY_BLOCK_SIZE);
    if (0 == result) {
        return;
    }

    result = mbedtls_platform_entropy_poll(NULL,
                                           seed_value,
                                           MBEDTLS_ENTROPY_BLOCK_SIZE,
                                           &output_len);
    if (0 != result) {
        return;
    }

    if (MBEDTLS_ENTROPY_BLOCK_SIZE != output_len) {
        return;
    }

    mbedtls_platform_std_nv_seed_write(seed_value, MBEDTLS_ENTROPY_BLOCK_SIZE);
}
#endif

int mbedtls_entropy_self_test_wrapper(int verbose)
{
#if defined(MBEDTLS_ENTROPY_NV_SEED) && !defined(MBEDTLS_NO_PLATFORM_ENTROPY)
    create_entropy_seed_file();
#endif
    return mbedtls_entropy_self_test(verbose);
}
#endif

#if defined(MBEDTLS_SELF_TEST)
#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
int mbedtls_memory_buffer_alloc_free_and_self_test(int verbose)
{
    if (verbose != 0) {
#if defined(MBEDTLS_MEMORY_DEBUG)
        mbedtls_memory_buffer_alloc_status();
#endif
    }
    mbedtls_memory_buffer_alloc_free();
    return mbedtls_memory_buffer_alloc_self_test(verbose);
}
#endif

typedef struct {
    const char *name;
    int (*function)(int);
} selftest_t;

const selftest_t selftests[] =
{
    { "calloc", calloc_self_test },
#if defined(MBEDTLS_MD5_C)
    { "md5", mbedtls_md5_self_test },
#endif
#if defined(MBEDTLS_RIPEMD160_C)
    { "ripemd160", mbedtls_ripemd160_self_test },
#endif
#if defined(MBEDTLS_SHA1_C)
    { "sha1", mbedtls_sha1_self_test },
#endif
#if defined(MBEDTLS_SHA224_C)
    { "sha224", mbedtls_sha224_self_test },
#endif
#if defined(MBEDTLS_SHA256_C)
    { "sha256", mbedtls_sha256_self_test },
#endif
#if defined(MBEDTLS_SHA384_C)
    { "sha384", mbedtls_sha384_self_test },
#endif
#if defined(MBEDTLS_SHA512_C)
    { "sha512", mbedtls_sha512_self_test },
#endif
#if defined(MBEDTLS_SHA3_C)
    { "sha3", mbedtls_sha3_self_test },
#endif
#if defined(MBEDTLS_DES_C)
    { "des", mbedtls_des_self_test },
#endif
#if defined(MBEDTLS_AES_C)
    { "aes", mbedtls_aes_self_test },
#endif
#if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_AES_C)
    { "gcm", mbedtls_gcm_self_test },
#endif
#if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_AES_C)
    { "ccm", mbedtls_ccm_self_test },
#endif
#if defined(MBEDTLS_NIST_KW_C) && defined(MBEDTLS_AES_C)
    { "nist_kw", mbedtls_nist_kw_self_test },
#endif
#if defined(MBEDTLS_CMAC_C)
    { "cmac", mbedtls_cmac_self_test },
#endif
#if defined(MBEDTLS_CHACHA20_C)
    { "chacha20", mbedtls_chacha20_self_test },
#endif
#if defined(MBEDTLS_POLY1305_C)
    { "poly1305", mbedtls_poly1305_self_test },
#endif
#if defined(MBEDTLS_CHACHAPOLY_C)
    { "chacha20-poly1305", mbedtls_chachapoly_self_test },
#endif
#if defined(MBEDTLS_BASE64_C)
    { "base64", mbedtls_base64_self_test },
#endif
#if defined(MBEDTLS_BIGNUM_C)
    { "mpi", mbedtls_mpi_self_test },
#endif
#if defined(MBEDTLS_RSA_C)
    { "rsa", mbedtls_rsa_self_test },
#endif
#if defined(MBEDTLS_CAMELLIA_C)
    { "camellia", mbedtls_camellia_self_test },
#endif
#if defined(MBEDTLS_ARIA_C)
    { "aria", mbedtls_aria_self_test },
#endif
#if defined(MBEDTLS_CTR_DRBG_C)
    { "ctr_drbg", mbedtls_ctr_drbg_self_test },
#endif
#if defined(MBEDTLS_HMAC_DRBG_C)
    { "hmac_drbg", mbedtls_hmac_drbg_self_test },
#endif
#if defined(MBEDTLS_ECP_C)
    { "ecp", mbedtls_ecp_self_test },
#endif
#if defined(MBEDTLS_ECJPAKE_C)
    { "ecjpake", mbedtls_ecjpake_self_test },
#endif
#if defined(MBEDTLS_DHM_C)
    { "dhm", mbedtls_dhm_self_test },
#endif
#if defined(MBEDTLS_ENTROPY_C)
    { "entropy", mbedtls_entropy_self_test_wrapper },
#endif
#if defined(MBEDTLS_PKCS5_C)
    { "pkcs5", mbedtls_pkcs5_self_test },
#endif
/* Heap test comes last */
#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
    { "memory_buffer_alloc", mbedtls_memory_buffer_alloc_free_and_self_test },
#endif
    { NULL, NULL }
};
#endif /* MBEDTLS_SELF_TEST */

int main(int argc, char *argv[])
{
#if defined(MBEDTLS_SELF_TEST)
    const selftest_t *test;
#endif /* MBEDTLS_SELF_TEST */
    char **argp;
    int v = 1; /* v=1 for verbose mode */
    int exclude_mode = 0;
    int suites_tested = 0, suites_failed = 0;
#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_SELF_TEST)
    unsigned char buf[1000000];
#endif
    void *pointer;

    /*
     * Check some basic platform requirements as specified in README.md
     */
    if (SIZE_MAX < INT_MAX || SIZE_MAX < UINT_MAX) {
        mbedtls_printf("SIZE_MAX must be at least as big as INT_MAX and UINT_MAX\n");
        mbedtls_exit(MBEDTLS_EXIT_FAILURE);
    }

    if (sizeof(int) < 4) {
        mbedtls_printf("int must be at least 32 bits\n");
        mbedtls_exit(MBEDTLS_EXIT_FAILURE);
    }

    if (sizeof(size_t) < 4) {
        mbedtls_printf("size_t must be at least 32 bits\n");
        mbedtls_exit(MBEDTLS_EXIT_FAILURE);
    }

    uint32_t endian_test = 0x12345678;
    char *p = (char *) &endian_test;
    if (!(p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78) &&
        !(p[3] == 0x12 && p[2] == 0x34 && p[1] == 0x56 && p[0] == 0x78)) {
        mbedtls_printf("Mixed-endian platforms are not supported\n");
        mbedtls_exit(MBEDTLS_EXIT_FAILURE);
    }

    /*
     * The C standard doesn't guarantee that all-bits-0 is the representation
     * of a NULL pointer. We do however use that in our code for initializing
     * structures, which should work on every modern platform. Let's be sure.
     */
    memset(&pointer, 0, sizeof(void *));
    if (pointer != NULL) {
        mbedtls_printf("all-bits-zero is not a NULL pointer\n");
        mbedtls_exit(MBEDTLS_EXIT_FAILURE);
    }

    /*
     * The C standard allows padding bits in the representation
     * of standard integer types, but our code does currently not
     * support them.
     *
     * Here we check that the underlying C implementation doesn't
     * use padding bits, and fail cleanly if it does.
     *
     * The check works by casting the maximum value representable
     * by a given integer type into the unpadded integer type of the
     * same bit-width and checking that it agrees with the maximum value
     * of that unpadded type. For example, for a 4-byte int,
     * MAX_INT should be 0x7fffffff in int32_t. This assumes that
     * CHAR_BIT == 8, which is checked in check_config.h.
     *
     * We assume that [u]intxx_t exist and that they don't
     * have padding bits, as the standard requires.
     */

#define CHECK_PADDING_SIGNED(TYPE, NAME)                                \
    do                                                                  \
    {                                                                   \
        if (sizeof(TYPE) == 2 || sizeof(TYPE) == 4 ||               \
            sizeof(TYPE) == 8) {                                 \
            if ((sizeof(TYPE) == 2 &&                                \
                 (int16_t) NAME ## _MAX != 0x7FFF)             ||       \
                (sizeof(TYPE) == 4 &&                                \
                 (int32_t) NAME ## _MAX != 0x7FFFFFFF)         ||       \
                (sizeof(TYPE) == 8 &&                                \
                 (int64_t) NAME ## _MAX != 0x7FFFFFFFFFFFFFFF))        \
            {                                                           \
                mbedtls_printf("Type '" #TYPE "' has padding bits\n"); \
                mbedtls_exit(MBEDTLS_EXIT_FAILURE);                   \
            }                                                           \
        } else {                                                        \
            mbedtls_printf("Padding checks only implemented for types of size 2, 4 or 8" \
                           " - cannot check type '" #TYPE "' of size %" MBEDTLS_PRINTF_SIZET "\n",       \
                           sizeof(TYPE));                                       \
            mbedtls_exit(MBEDTLS_EXIT_FAILURE);                       \
        }                                                               \
    } while (0)

#define CHECK_PADDING_UNSIGNED(TYPE, NAME)                              \
    do                                                                  \
    {                                                                   \
        if ((sizeof(TYPE) == 2 &&                                    \
             (uint16_t) NAME ## _MAX != 0xFFFF)             ||        \
            (sizeof(TYPE) == 4 &&                                    \
             (uint32_t) NAME ## _MAX != 0xFFFFFFFF)         ||        \
            (sizeof(TYPE) == 8 &&                                    \
             (uint64_t) NAME ## _MAX != 0xFFFFFFFFFFFFFFFF))         \
        {                                                               \
            mbedtls_printf("Type '" #TYPE "' has padding bits\n");    \
            mbedtls_exit(MBEDTLS_EXIT_FAILURE);                       \
        }                                                               \
    } while (0)

    CHECK_PADDING_SIGNED(short,        SHRT);
    CHECK_PADDING_SIGNED(int,           INT);
    CHECK_PADDING_SIGNED(long,         LONG);
    CHECK_PADDING_SIGNED(long long,   LLONG);
    CHECK_PADDING_SIGNED(ptrdiff_t, PTRDIFF);

    CHECK_PADDING_UNSIGNED(unsigned short,      USHRT);
    CHECK_PADDING_UNSIGNED(unsigned,             UINT);
    CHECK_PADDING_UNSIGNED(unsigned long,       ULONG);
    CHECK_PADDING_UNSIGNED(unsigned long long, ULLONG);
    CHECK_PADDING_UNSIGNED(size_t,               SIZE);

#undef CHECK_PADDING_SIGNED
#undef CHECK_PADDING_UNSIGNED

    /*
     * Make sure we have a snprintf that correctly zero-terminates
     */
    if (run_test_snprintf() != 0) {
        mbedtls_printf("the snprintf implementation is broken\n");
        mbedtls_exit(MBEDTLS_EXIT_FAILURE);
    }

    for (argp = argv + (argc >= 1 ? 1 : argc); *argp != NULL; ++argp) {
        if (strcmp(*argp, "--quiet") == 0 ||
            strcmp(*argp, "-q") == 0) {
            v = 0;
        } else if (strcmp(*argp, "--exclude") == 0 ||
                   strcmp(*argp, "-x") == 0) {
            exclude_mode = 1;
        } else {
            break;
        }
    }

    if (v != 0) {
        mbedtls_printf("\n");
    }

#if defined(MBEDTLS_SELF_TEST)

#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
    mbedtls_memory_buffer_alloc_init(buf, sizeof(buf));
#endif

    if (*argp != NULL && exclude_mode == 0) {
        /* Run the specified tests */
        for (; *argp != NULL; argp++) {
            for (test = selftests; test->name != NULL; test++) {
                if (!strcmp(*argp, test->name)) {
                    if (test->function(v)  != 0) {
                        suites_failed++;
                    }
                    suites_tested++;
                    break;
                }
            }
            if (test->name == NULL) {
                mbedtls_printf("  Test suite %s not available -> failed\n\n", *argp);
                suites_failed++;
            }
        }
    } else {
        /* Run all the tests except excluded ones */
        for (test = selftests; test->name != NULL; test++) {
            if (exclude_mode) {
                char **excluded;
                for (excluded = argp; *excluded != NULL; ++excluded) {
                    if (!strcmp(*excluded, test->name)) {
                        break;
                    }
                }
                if (*excluded) {
                    if (v) {
                        mbedtls_printf("  Skip: %s\n", test->name);
                    }
                    continue;
                }
            }
            if (test->function(v)  != 0) {
                suites_failed++;
            }
            suites_tested++;
        }
    }

#else
    (void) exclude_mode;
    mbedtls_printf(" MBEDTLS_SELF_TEST not defined.\n");
#endif

    if (v != 0) {
        mbedtls_printf("  Executed %d test suites\n\n", suites_tested);

        if (suites_failed > 0) {
            mbedtls_printf("  [ %d tests FAIL ]\n\n", suites_failed);
        } else {
            mbedtls_printf("  [ All tests PASS ]\n\n");
        }
    }

    if (suites_failed > 0) {
        mbedtls_exit(MBEDTLS_EXIT_FAILURE);
    }

    mbedtls_exit(MBEDTLS_EXIT_SUCCESS);
}
