/*
 * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#ifndef OSSL_INTERNAL_COMMON_H
#define OSSL_INTERNAL_COMMON_H
#pragma once

#include <stdlib.h>
#include <string.h>
#include "openssl/configuration.h"

#include "internal/e_os.h" /* ossl_inline in many files */
#include "internal/nelem.h"

#if defined(__GNUC__) || defined(__clang__)
#define ossl_likely(x) __builtin_expect(!!(x), 1)
#define ossl_unlikely(x) __builtin_expect(!!(x), 0)
#else
#define ossl_likely(x) (x)
#define ossl_unlikely(x) (x)
#endif

#if defined(__GNUC__) || defined(__clang__)
#define ALIGN32 __attribute((aligned(32)))
#define ALIGN64 __attribute((aligned(64)))
#elif defined(_MSC_VER)
#define ALIGN32 __declspec(align(32))
#define ALIGN64 __declspec(align(64))
#else
#define ALIGN32
#define ALIGN64
#endif

#ifdef NDEBUG
#define ossl_assert(x) ossl_likely((x) != 0)
#else
__owur static ossl_inline int ossl_assert_int(int expr, const char *exprstr,
    const char *file, int line)
{
    if (!expr)
        OPENSSL_die(exprstr, file, line);

    return expr;
}

#define ossl_assert(x) ossl_assert_int((x) != 0, "Assertion failed: " #x, \
    __FILE__, __LINE__)

#endif

/* Check if |pre|, which must be a string literal, is a prefix of |str| */
#define HAS_PREFIX(str, pre) (strncmp(str, pre "", sizeof(pre) - 1) == 0)
/* As before, and if check succeeds, advance |str| past the prefix |pre| */
#define CHECK_AND_SKIP_PREFIX(str, pre) \
    (HAS_PREFIX(str, pre) ? ((str) += sizeof(pre) - 1, 1) : 0)
/* Check if the string literal |p| is a case-insensitive prefix of |s| */
#define HAS_CASE_PREFIX(s, p) (OPENSSL_strncasecmp(s, p "", sizeof(p) - 1) == 0)
/* As before, and if check succeeds, advance |str| past the prefix |pre| */
#define CHECK_AND_SKIP_CASE_PREFIX(str, pre) \
    (HAS_CASE_PREFIX(str, pre) ? ((str) += sizeof(pre) - 1, 1) : 0)
/* Check if the string literal |suffix| is a case-insensitive suffix of |str| */
#define HAS_CASE_SUFFIX(str, suffix) (strlen(str) < sizeof(suffix) - 1 ? 0 : OPENSSL_strcasecmp(str + strlen(str) - sizeof(suffix) + 1, suffix "") == 0)

/*
 * Use this inside a union with the field that needs to be aligned to a
 * reasonable boundary for the platform.  The most pessimistic alignment
 * of the listed types will be used by the compiler.
 */
#define OSSL_UNION_ALIGN      \
    double align;             \
    ossl_uintmax_t align_int; \
    void *align_ptr

#define OPENSSL_CONF "openssl.cnf"

#ifndef OPENSSL_SYS_VMS
#define X509_CERT_AREA OPENSSLDIR
#define X509_CERT_DIR OPENSSLDIR "/certs"
#define X509_CERT_FILE OPENSSLDIR "/cert.pem"
#define X509_PRIVATE_DIR OPENSSLDIR "/private"
#define CTLOG_FILE OPENSSLDIR "/ct_log_list.cnf"
#else
#define X509_CERT_AREA "OSSL$DATAROOT:[000000]"
#define X509_CERT_DIR "OSSL$DATAROOT:[CERTS]"
#define X509_CERT_FILE "OSSL$DATAROOT:[000000]cert.pem"
#define X509_PRIVATE_DIR "OSSL$DATAROOT:[PRIVATE]"
#define CTLOG_FILE "OSSL$DATAROOT:[000000]ct_log_list.cnf"
#endif

#define X509_CERT_DIR_EVP "SSL_CERT_DIR"
#define X509_CERT_FILE_EVP "SSL_CERT_FILE"
#define CTLOG_FILE_EVP "CTLOG_FILE"

/* size of string representations */
#define DECIMAL_SIZE(type) ((sizeof(type) * 8 + 2) / 3 + 1)
#define HEX_SIZE(type) (sizeof(type) * 2)

#define c2l(c, l) (l = ((unsigned long)(*((c)++))), \
    l |= (((unsigned long)(*((c)++))) << 8),        \
    l |= (((unsigned long)(*((c)++))) << 16),       \
    l |= (((unsigned long)(*((c)++))) << 24))

/* NOTE - c is not incremented as per c2l */
#define c2ln(c, l1, l2, n)                           \
    {                                                \
        c += n;                                      \
        l1 = l2 = 0;                                 \
        switch (n) {                                 \
        case 8:                                      \
            l2 = ((unsigned long)(*(--(c)))) << 24;  \
        case 7:                                      \
            l2 |= ((unsigned long)(*(--(c)))) << 16; \
        case 6:                                      \
            l2 |= ((unsigned long)(*(--(c)))) << 8;  \
        case 5:                                      \
            l2 |= ((unsigned long)(*(--(c))));       \
        case 4:                                      \
            l1 = ((unsigned long)(*(--(c)))) << 24;  \
        case 3:                                      \
            l1 |= ((unsigned long)(*(--(c)))) << 16; \
        case 2:                                      \
            l1 |= ((unsigned long)(*(--(c)))) << 8;  \
        case 1:                                      \
            l1 |= ((unsigned long)(*(--(c))));       \
        }                                            \
    }

#define l2c(l, c) (*((c)++) = (unsigned char)(((l)) & 0xff), \
    *((c)++) = (unsigned char)(((l) >> 8) & 0xff),           \
    *((c)++) = (unsigned char)(((l) >> 16) & 0xff),          \
    *((c)++) = (unsigned char)(((l) >> 24) & 0xff))

#define n2l(c, l) (l = ((unsigned long)(*((c)++))) << 24, \
    l |= ((unsigned long)(*((c)++))) << 16,               \
    l |= ((unsigned long)(*((c)++))) << 8,                \
    l |= ((unsigned long)(*((c)++))))

#define n2l8(c, l) (l = ((uint64_t)(*((c)++))) << 56, \
    l |= ((uint64_t)(*((c)++))) << 48,                \
    l |= ((uint64_t)(*((c)++))) << 40,                \
    l |= ((uint64_t)(*((c)++))) << 32,                \
    l |= ((uint64_t)(*((c)++))) << 24,                \
    l |= ((uint64_t)(*((c)++))) << 16,                \
    l |= ((uint64_t)(*((c)++))) << 8,                 \
    l |= ((uint64_t)(*((c)++))))

#define l2n(l, c) (*((c)++) = (unsigned char)(((l) >> 24) & 0xff), \
    *((c)++) = (unsigned char)(((l) >> 16) & 0xff),                \
    *((c)++) = (unsigned char)(((l) >> 8) & 0xff),                 \
    *((c)++) = (unsigned char)(((l)) & 0xff))

#define l2n8(l, c) (*((c)++) = (unsigned char)(((l) >> 56) & 0xff), \
    *((c)++) = (unsigned char)(((l) >> 48) & 0xff),                 \
    *((c)++) = (unsigned char)(((l) >> 40) & 0xff),                 \
    *((c)++) = (unsigned char)(((l) >> 32) & 0xff),                 \
    *((c)++) = (unsigned char)(((l) >> 24) & 0xff),                 \
    *((c)++) = (unsigned char)(((l) >> 16) & 0xff),                 \
    *((c)++) = (unsigned char)(((l) >> 8) & 0xff),                  \
    *((c)++) = (unsigned char)(((l)) & 0xff))

/* NOTE - c is not incremented as per l2c */
#define l2cn(l1, l2, c, n)                                   \
    {                                                        \
        c += n;                                              \
        switch (n) {                                         \
        case 8:                                              \
            *(--(c)) = (unsigned char)(((l2) >> 24) & 0xff); \
        case 7:                                              \
            *(--(c)) = (unsigned char)(((l2) >> 16) & 0xff); \
        case 6:                                              \
            *(--(c)) = (unsigned char)(((l2) >> 8) & 0xff);  \
        case 5:                                              \
            *(--(c)) = (unsigned char)(((l2)) & 0xff);       \
        case 4:                                              \
            *(--(c)) = (unsigned char)(((l1) >> 24) & 0xff); \
        case 3:                                              \
            *(--(c)) = (unsigned char)(((l1) >> 16) & 0xff); \
        case 2:                                              \
            *(--(c)) = (unsigned char)(((l1) >> 8) & 0xff);  \
        case 1:                                              \
            *(--(c)) = (unsigned char)(((l1)) & 0xff);       \
        }                                                    \
    }

#define n2s(c, s) ((s = (((unsigned int)((c)[0])) << 8) | (((unsigned int)((c)[1])))), (c) += 2)
#define s2n(s, c) (((c)[0] = (unsigned char)(((s) >> 8) & 0xff), \
                       (c)[1] = (unsigned char)(((s)) & 0xff)),  \
    (c) += 2)

#define n2l3(c, l) ((l = (((unsigned long)((c)[0])) << 16) | (((unsigned long)((c)[1])) << 8) | (((unsigned long)((c)[2])))), (c) += 3)

#define l2n3(l, c) (((c)[0] = (unsigned char)(((l) >> 16) & 0xff),   \
                        (c)[1] = (unsigned char)(((l) >> 8) & 0xff), \
                        (c)[2] = (unsigned char)(((l)) & 0xff)),     \
    (c) += 3)

static ossl_inline int ossl_ends_with_dirsep(const char *path)
{
    if (*path != '\0')
        path += strlen(path) - 1;
#if defined __VMS
    if (*path == ']' || *path == '>' || *path == ':')
        return 1;
#elif defined _WIN32
    if (*path == '\\')
        return 1;
#endif
    return *path == '/';
}

static ossl_inline char ossl_determine_dirsep(const char *path)
{
    if (ossl_ends_with_dirsep(path))
        return '\0';

#if defined(_WIN32)
    return '\\';
#elif defined(__VMS)
    return ':';
#else
    return '/';
#endif
}

static ossl_inline int ossl_is_absolute_path(const char *path)
{
#if defined __VMS
    if (strchr(path, ':') != NULL
        || ((path[0] == '[' || path[0] == '<')
            && path[1] != '.' && path[1] != '-'
            && path[1] != ']' && path[1] != '>'))
        return 1;
#elif defined _WIN32
    if (path[0] == '\\'
        || (path[0] != '\0' && path[1] == ':'))
        return 1;
#endif
    return path[0] == '/';
}

const char *ossl_get_openssldir(void);
const char *ossl_get_modulesdir(void);
const char *ossl_get_wininstallcontext(void);

#endif
