/*
 * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved.
 * Copyright (c) 2019, Oracle and/or its affiliates.  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
 */

#include <string.h>
#include <openssl/params.h>
#include <openssl/err.h>
#include "internal/thread_once.h"
#include "internal/numbers.h"
#include "internal/endian.h"
#include "internal/params.h"
#include "internal/packet.h"
#include "internal/common.h"

/* Shortcuts for raising errors that are widely used */
#define err_unsigned_negative \
    ERR_raise(ERR_LIB_CRYPTO, \
        CRYPTO_R_PARAM_UNSIGNED_INTEGER_NEGATIVE_VALUE_UNSUPPORTED)
#define err_out_of_range      \
    ERR_raise(ERR_LIB_CRYPTO, \
        CRYPTO_R_PARAM_VALUE_TOO_LARGE_FOR_DESTINATION)
#define err_inexact           \
    ERR_raise(ERR_LIB_CRYPTO, \
        CRYPTO_R_PARAM_CANNOT_BE_REPRESENTED_EXACTLY)
#define err_not_integer \
    ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_PARAM_NOT_INTEGER_TYPE)
#define err_too_small \
    ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_TOO_SMALL_BUFFER)
#define err_bad_type \
    ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_PARAM_OF_INCOMPATIBLE_TYPE)
#define err_null_argument \
    ERR_raise(ERR_LIB_CRYPTO, ERR_R_PASSED_NULL_PARAMETER)
#define err_unsupported_real \
    ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_PARAM_UNSUPPORTED_FLOATING_POINT_FORMAT)

#ifndef OPENSSL_SYS_UEFI
/*
 * Return the number of bits in the mantissa of a double.  This is used to
 * shift a larger integral value to determine if it will exactly fit into a
 * double.
 */
static unsigned int real_shift(void)
{
    return sizeof(double) == 4 ? 24 : 53;
}
#endif

OSSL_PARAM *OSSL_PARAM_locate(OSSL_PARAM *p, const char *key)
{
    if (ossl_likely(p != NULL && key != NULL))
        for (; p->key != NULL; p++)
            if (strcmp(key, p->key) == 0)
                return p;
    return NULL;
}

const OSSL_PARAM *OSSL_PARAM_locate_const(const OSSL_PARAM *p, const char *key)
{
    return OSSL_PARAM_locate((OSSL_PARAM *)p, key);
}

static OSSL_PARAM ossl_param_construct(const char *key, unsigned int data_type,
    void *data, size_t data_size)
{
    OSSL_PARAM res;

    res.key = key;
    res.data_type = data_type;
    res.data = data;
    res.data_size = data_size;
    res.return_size = OSSL_PARAM_UNMODIFIED;
    return res;
}

int OSSL_PARAM_modified(const OSSL_PARAM *p)
{
    return p != NULL && p->return_size != OSSL_PARAM_UNMODIFIED;
}

void OSSL_PARAM_set_all_unmodified(OSSL_PARAM *p)
{
    if (p != NULL)
        while (p->key != NULL)
            p++->return_size = OSSL_PARAM_UNMODIFIED;
}

/* Return non-zero if the signed number is negative */
static int is_negative(const void *number, size_t s)
{
    const unsigned char *n = number;
    DECLARE_IS_ENDIAN;

    return 0x80 & (IS_BIG_ENDIAN ? n[0] : n[s - 1]);
}

/* Check that all the bytes specified match the expected sign byte */
static int check_sign_bytes(const unsigned char *p, size_t n, unsigned char s)
{
    size_t i;

    for (i = 0; i < n; i++)
        if (p[i] != s)
            return 0;
    return 1;
}

/*
 * Copy an integer to another integer.
 * Handle different length integers and signed and unsigned integers.
 * Both integers are in native byte ordering.
 */
static int copy_integer(unsigned char *dest, size_t dest_len,
    const unsigned char *src, size_t src_len,
    unsigned char pad, int signed_int)
{
    size_t n;
    DECLARE_IS_ENDIAN;

    if (IS_BIG_ENDIAN) {
        if (src_len < dest_len) {
            n = dest_len - src_len;
            memset(dest, pad, n);
            memcpy(dest + n, src, src_len);
        } else {
            n = src_len - dest_len;
            if (!check_sign_bytes(src, n, pad)
                /*
                 * Shortening a signed value must retain the correct sign.
                 * Avoiding this kind of thing: -253 = 0xff03 -> 0x03 = 3
                 */
                || (signed_int && ((pad ^ src[n]) & 0x80) != 0)) {
                err_out_of_range;
                return 0;
            }
            memcpy(dest, src + n, dest_len);
        }
    } else /* IS_LITTLE_ENDIAN */ {
        if (src_len < dest_len) {
            n = dest_len - src_len;
            memset(dest + src_len, pad, n);
            memcpy(dest, src, src_len);
        } else {
            n = src_len - dest_len;
            if (!check_sign_bytes(src + dest_len, n, pad)
                /*
                 * Shortening a signed value must retain the correct sign.
                 * Avoiding this kind of thing: 130 = 0x0082 -> 0x82 = -126
                 */
                || (signed_int && ((pad ^ src[dest_len - 1]) & 0x80) != 0)) {
                err_out_of_range;
                return 0;
            }
            memcpy(dest, src, dest_len);
        }
    }
    return 1;
}

/* Copy a signed number to a signed number of possibly different length */
static int signed_from_signed(void *dest, size_t dest_len,
    const void *src, size_t src_len)
{
    return copy_integer(dest, dest_len, src, src_len,
        is_negative(src, src_len) ? 0xff : 0, 1);
}

/* Copy an unsigned number to a signed number of possibly different length */
static int signed_from_unsigned(void *dest, size_t dest_len,
    const void *src, size_t src_len)
{
    return copy_integer(dest, dest_len, src, src_len, 0, 1);
}

/* Copy a signed number to an unsigned number of possibly different length */
static int unsigned_from_signed(void *dest, size_t dest_len,
    const void *src, size_t src_len)
{
    if (is_negative(src, src_len)) {
        err_unsigned_negative;
        return 0;
    }
    return copy_integer(dest, dest_len, src, src_len, 0, 0);
}

/* Copy an unsigned number to an unsigned number of possibly different length */
static int unsigned_from_unsigned(void *dest, size_t dest_len,
    const void *src, size_t src_len)
{
    return copy_integer(dest, dest_len, src, src_len, 0, 0);
}

/* General purpose get integer parameter call that handles odd sizes */
static int general_get_int(const OSSL_PARAM *p, void *val, size_t val_size)
{
    if (p->data == NULL) {
        err_null_argument;
        return 0;
    }
    if (p->data_type == OSSL_PARAM_INTEGER)
        return signed_from_signed(val, val_size, p->data, p->data_size);
    if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER)
        return signed_from_unsigned(val, val_size, p->data, p->data_size);
    err_not_integer;
    return 0;
}

/* General purpose set integer parameter call that handles odd sizes */
static int general_set_int(OSSL_PARAM *p, void *val, size_t val_size)
{
    int r = 0;

    if (p->data == NULL) {
        p->return_size = val_size; /* Expected size */
        return 1;
    }
    if (p->data_type == OSSL_PARAM_INTEGER)
        r = signed_from_signed(p->data, p->data_size, val, val_size);
    else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER)
        r = unsigned_from_signed(p->data, p->data_size, val, val_size);
    else
        err_not_integer;
    p->return_size = r ? p->data_size : val_size;
    return r;
}

/* General purpose get unsigned integer parameter call that handles odd sizes */
static int general_get_uint(const OSSL_PARAM *p, void *val, size_t val_size)
{

    if (p->data == NULL) {
        err_null_argument;
        return 0;
    }
    if (p->data_type == OSSL_PARAM_INTEGER)
        return unsigned_from_signed(val, val_size, p->data, p->data_size);
    if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER)
        return unsigned_from_unsigned(val, val_size, p->data, p->data_size);
    err_not_integer;
    return 0;
}

/* General purpose set unsigned integer parameter call that handles odd sizes */
static int general_set_uint(OSSL_PARAM *p, void *val, size_t val_size)
{
    int r = 0;

    if (p->data == NULL) {
        p->return_size = val_size; /* Expected size */
        return 1;
    }
    if (p->data_type == OSSL_PARAM_INTEGER)
        r = signed_from_unsigned(p->data, p->data_size, val, val_size);
    else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER)
        r = unsigned_from_unsigned(p->data, p->data_size, val, val_size);
    else
        err_not_integer;
    p->return_size = r ? p->data_size : val_size;
    return r;
}

int OSSL_PARAM_get_int(const OSSL_PARAM *p, int *val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(int)) {
    case sizeof(int32_t):
        return OSSL_PARAM_get_int32(p, (int32_t *)val);
    case sizeof(int64_t):
        return OSSL_PARAM_get_int64(p, (int64_t *)val);
    }
#endif
    return general_get_int(p, val, sizeof(*val));
}

int OSSL_PARAM_set_int(OSSL_PARAM *p, int val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(int)) {
    case sizeof(int32_t):
        return OSSL_PARAM_set_int32(p, (int32_t)val);
    case sizeof(int64_t):
        return OSSL_PARAM_set_int64(p, (int64_t)val);
    }
#endif
    return general_set_int(p, &val, sizeof(val));
}

OSSL_PARAM OSSL_PARAM_construct_int(const char *key, int *buf)
{
    return ossl_param_construct(key, OSSL_PARAM_INTEGER, buf, sizeof(int));
}

int OSSL_PARAM_get_uint(const OSSL_PARAM *p, unsigned int *val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(unsigned int)) {
    case sizeof(uint32_t):
        return OSSL_PARAM_get_uint32(p, (uint32_t *)val);
    case sizeof(uint64_t):
        return OSSL_PARAM_get_uint64(p, (uint64_t *)val);
    }
#endif
    return general_get_uint(p, val, sizeof(*val));
}

int OSSL_PARAM_set_uint(OSSL_PARAM *p, unsigned int val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(unsigned int)) {
    case sizeof(uint32_t):
        return OSSL_PARAM_set_uint32(p, (uint32_t)val);
    case sizeof(uint64_t):
        return OSSL_PARAM_set_uint64(p, (uint64_t)val);
    }
#endif
    return general_set_uint(p, &val, sizeof(val));
}

OSSL_PARAM OSSL_PARAM_construct_uint(const char *key, unsigned int *buf)
{
    return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER, buf,
        sizeof(unsigned int));
}

int OSSL_PARAM_get_long(const OSSL_PARAM *p, long int *val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(long int)) {
    case sizeof(int32_t):
        return OSSL_PARAM_get_int32(p, (int32_t *)val);
    case sizeof(int64_t):
        return OSSL_PARAM_get_int64(p, (int64_t *)val);
    }
#endif
    return general_get_int(p, val, sizeof(*val));
}

int OSSL_PARAM_set_long(OSSL_PARAM *p, long int val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(long int)) {
    case sizeof(int32_t):
        return OSSL_PARAM_set_int32(p, (int32_t)val);
    case sizeof(int64_t):
        return OSSL_PARAM_set_int64(p, (int64_t)val);
    }
#endif
    return general_set_int(p, &val, sizeof(val));
}

OSSL_PARAM OSSL_PARAM_construct_long(const char *key, long int *buf)
{
    return ossl_param_construct(key, OSSL_PARAM_INTEGER, buf, sizeof(long int));
}

int OSSL_PARAM_get_ulong(const OSSL_PARAM *p, unsigned long int *val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(unsigned long int)) {
    case sizeof(uint32_t):
        return OSSL_PARAM_get_uint32(p, (uint32_t *)val);
    case sizeof(uint64_t):
        return OSSL_PARAM_get_uint64(p, (uint64_t *)val);
    }
#endif
    return general_get_uint(p, val, sizeof(*val));
}

int OSSL_PARAM_set_ulong(OSSL_PARAM *p, unsigned long int val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(unsigned long int)) {
    case sizeof(uint32_t):
        return OSSL_PARAM_set_uint32(p, (uint32_t)val);
    case sizeof(uint64_t):
        return OSSL_PARAM_set_uint64(p, (uint64_t)val);
    }
#endif
    return general_set_uint(p, &val, sizeof(val));
}

OSSL_PARAM OSSL_PARAM_construct_ulong(const char *key, unsigned long int *buf)
{
    return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER, buf,
        sizeof(unsigned long int));
}

int OSSL_PARAM_get_int32(const OSSL_PARAM *p, int32_t *val)
{
    if (val == NULL || p == NULL) {
        err_null_argument;
        return 0;
    }

    if (p->data == NULL) {
        err_null_argument;
        return 0;
    }

    if (p->data_type == OSSL_PARAM_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        int64_t i64;

        switch (p->data_size) {
        case sizeof(int32_t):
            *val = *(const int32_t *)p->data;
            return 1;
        case sizeof(int64_t):
            i64 = *(const int64_t *)p->data;
            if (i64 >= INT32_MIN && i64 <= INT32_MAX) {
                *val = (int32_t)i64;
                return 1;
            }
            err_out_of_range;
            return 0;
        }
#endif
        return general_get_int(p, val, sizeof(*val));

    } else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        uint32_t u32;
        uint64_t u64;

        switch (p->data_size) {
        case sizeof(uint32_t):
            u32 = *(const uint32_t *)p->data;
            if (u32 <= INT32_MAX) {
                *val = (int32_t)u32;
                return 1;
            }
            err_out_of_range;
            return 0;
        case sizeof(uint64_t):
            u64 = *(const uint64_t *)p->data;
            if (u64 <= INT32_MAX) {
                *val = (int32_t)u64;
                return 1;
            }
            err_out_of_range;
            return 0;
        }
#endif
        return general_get_int(p, val, sizeof(*val));

    } else if (p->data_type == OSSL_PARAM_REAL) {
#ifndef OPENSSL_SYS_UEFI
        double d;

        switch (p->data_size) {
        case sizeof(double):
            d = *(const double *)p->data;
            if (d >= INT32_MIN && d <= INT32_MAX && d == (int32_t)d) {
                *val = (int32_t)d;
                return 1;
            }
            err_out_of_range;
            return 0;
        }
        err_unsupported_real;
        return 0;
#endif
    }
    err_bad_type;
    return 0;
}

int OSSL_PARAM_set_int32(OSSL_PARAM *p, int32_t val)
{
    if (p == NULL) {
        err_null_argument;
        return 0;
    }
    p->return_size = 0;
    if (p->data_type == OSSL_PARAM_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        p->return_size = sizeof(int32_t); /* Minimum expected size */
        if (p->data == NULL)
            return 1;
        switch (p->data_size) {
        case sizeof(int32_t):
            *(int32_t *)p->data = val;
            return 1;
        case sizeof(int64_t):
            p->return_size = sizeof(int64_t);
            *(int64_t *)p->data = (int64_t)val;
            return 1;
        }
#endif
        return general_set_int(p, &val, sizeof(val));
    } else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER && val >= 0) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        p->return_size = sizeof(uint32_t); /* Minimum expected size */
        if (p->data == NULL)
            return 1;
        switch (p->data_size) {
        case sizeof(uint32_t):
            *(uint32_t *)p->data = (uint32_t)val;
            return 1;
        case sizeof(uint64_t):
            p->return_size = sizeof(uint64_t);
            *(uint64_t *)p->data = (uint64_t)val;
            return 1;
        }
#endif
        return general_set_int(p, &val, sizeof(val));
    } else if (p->data_type == OSSL_PARAM_REAL) {
#ifndef OPENSSL_SYS_UEFI
        uint32_t u32;
        unsigned int shift;

        p->return_size = sizeof(double);
        if (p->data == NULL)
            return 1;
        switch (p->data_size) {
        case sizeof(double):
            shift = real_shift();
            if (shift < 8 * sizeof(val) - 1) {
                u32 = val < 0 ? -val : val;
                if ((u32 >> shift) != 0) {
                    err_inexact;
                    return 0;
                }
            }
            *(double *)p->data = (double)val;
            return 1;
        }
        err_unsupported_real;
        return 0;
#endif
    }
    err_bad_type;
    return 0;
}

OSSL_PARAM OSSL_PARAM_construct_int32(const char *key, int32_t *buf)
{
    return ossl_param_construct(key, OSSL_PARAM_INTEGER, buf,
        sizeof(int32_t));
}

int OSSL_PARAM_get_uint32(const OSSL_PARAM *p, uint32_t *val)
{
    if (val == NULL || p == NULL) {
        err_null_argument;
        return 0;
    }

    if (p->data == NULL) {
        err_null_argument;
        return 0;
    }

    if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        uint64_t u64;

        switch (p->data_size) {
        case sizeof(uint32_t):
            *val = *(const uint32_t *)p->data;
            return 1;
        case sizeof(uint64_t):
            u64 = *(const uint64_t *)p->data;
            if (u64 <= UINT32_MAX) {
                *val = (uint32_t)u64;
                return 1;
            }
            err_out_of_range;
            return 0;
        }
#endif
        return general_get_uint(p, val, sizeof(*val));
    } else if (p->data_type == OSSL_PARAM_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        int32_t i32;
        int64_t i64;

        switch (p->data_size) {
        case sizeof(int32_t):
            i32 = *(const int32_t *)p->data;
            if (i32 >= 0) {
                *val = i32;
                return 1;
            }
            err_unsigned_negative;
            return 0;
        case sizeof(int64_t):
            i64 = *(const int64_t *)p->data;
            if (i64 >= 0 && i64 <= UINT32_MAX) {
                *val = (uint32_t)i64;
                return 1;
            }
            if (i64 < 0)
                err_unsigned_negative;
            else
                err_out_of_range;
            return 0;
        }
#endif
        return general_get_uint(p, val, sizeof(*val));
    } else if (p->data_type == OSSL_PARAM_REAL) {
#ifndef OPENSSL_SYS_UEFI
        double d;

        switch (p->data_size) {
        case sizeof(double):
            d = *(const double *)p->data;
            if (d >= 0 && d <= UINT32_MAX && d == (uint32_t)d) {
                *val = (uint32_t)d;
                return 1;
            }
            err_inexact;
            return 0;
        }
        err_unsupported_real;
        return 0;
#endif
    }
    err_bad_type;
    return 0;
}

int OSSL_PARAM_set_uint32(OSSL_PARAM *p, uint32_t val)
{
    if (p == NULL) {
        err_null_argument;
        return 0;
    }
    p->return_size = 0;

    if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        p->return_size = sizeof(uint32_t); /* Minimum expected size */
        if (p->data == NULL)
            return 1;
        switch (p->data_size) {
        case sizeof(uint32_t):
            *(uint32_t *)p->data = val;
            return 1;
        case sizeof(uint64_t):
            p->return_size = sizeof(uint64_t);
            *(uint64_t *)p->data = val;
            return 1;
        }
#endif
        return general_set_uint(p, &val, sizeof(val));
    } else if (p->data_type == OSSL_PARAM_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        p->return_size = sizeof(int32_t); /* Minimum expected size */
        if (p->data == NULL)
            return 1;
        switch (p->data_size) {
        case sizeof(int32_t):
            if (val <= INT32_MAX) {
                *(int32_t *)p->data = (int32_t)val;
                return 1;
            }
            err_out_of_range;
            return 0;
        case sizeof(int64_t):
            p->return_size = sizeof(int64_t);
            *(int64_t *)p->data = (int64_t)val;
            return 1;
        }
#endif
        return general_set_uint(p, &val, sizeof(val));
    } else if (p->data_type == OSSL_PARAM_REAL) {
#ifndef OPENSSL_SYS_UEFI
        unsigned int shift;

        if (p->data == NULL) {
            p->return_size = sizeof(double);
            return 1;
        }
        switch (p->data_size) {
        case sizeof(double):
            shift = real_shift();
            if (shift < 8 * sizeof(val) && (val >> shift) != 0) {
                err_inexact;
                return 0;
            }
            *(double *)p->data = (double)val;
            p->return_size = sizeof(double);
            return 1;
        }
        err_unsupported_real;
        return 0;
#endif
    }
    err_bad_type;
    return 0;
}

OSSL_PARAM OSSL_PARAM_construct_uint32(const char *key, uint32_t *buf)
{
    return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER, buf,
        sizeof(uint32_t));
}

int OSSL_PARAM_get_int64(const OSSL_PARAM *p, int64_t *val)
{
    if (val == NULL || p == NULL) {
        err_null_argument;
        return 0;
    }

    if (p->data == NULL) {
        err_null_argument;
        return 0;
    }

    if (p->data_type == OSSL_PARAM_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        switch (p->data_size) {
        case sizeof(int32_t):
            *val = *(const int32_t *)p->data;
            return 1;
        case sizeof(int64_t):
            *val = *(const int64_t *)p->data;
            return 1;
        }
#endif
        return general_get_int(p, val, sizeof(*val));
    } else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        uint64_t u64;

        switch (p->data_size) {
        case sizeof(uint32_t):
            *val = *(const uint32_t *)p->data;
            return 1;
        case sizeof(uint64_t):
            u64 = *(const uint64_t *)p->data;
            if (u64 <= INT64_MAX) {
                *val = (int64_t)u64;
                return 1;
            }
            err_out_of_range;
            return 0;
        }
#endif
        return general_get_int(p, val, sizeof(*val));
    } else if (p->data_type == OSSL_PARAM_REAL) {
#ifndef OPENSSL_SYS_UEFI
        double d;

        switch (p->data_size) {
        case sizeof(double):
            d = *(const double *)p->data;
            if (d >= INT64_MIN
                /*
                 * By subtracting 65535 (2^16-1) we cancel the low order
                 * 15 bits of INT64_MAX to avoid using imprecise floating
                 * point values.
                 */
                && d < (double)(INT64_MAX - 65535) + 65536.0
                && d == (int64_t)d) {
                *val = (int64_t)d;
                return 1;
            }
            err_inexact;
            return 0;
        }
        err_unsupported_real;
        return 0;
#endif
    }
    err_bad_type;
    return 0;
}

int OSSL_PARAM_set_int64(OSSL_PARAM *p, int64_t val)
{
    if (p == NULL) {
        err_null_argument;
        return 0;
    }
    p->return_size = 0;
    if (p->data_type == OSSL_PARAM_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        if (p->data == NULL) {
            p->return_size = sizeof(int64_t); /* Expected size */
            return 1;
        }
        switch (p->data_size) {
        case sizeof(int32_t):
            if (val >= INT32_MIN && val <= INT32_MAX) {
                p->return_size = sizeof(int32_t);
                *(int32_t *)p->data = (int32_t)val;
                return 1;
            }
            err_out_of_range;
            return 0;
        case sizeof(int64_t):
            p->return_size = sizeof(int64_t);
            *(int64_t *)p->data = val;
            return 1;
        }
#endif
        return general_set_int(p, &val, sizeof(val));
    } else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER && val >= 0) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        if (p->data == NULL) {
            p->return_size = sizeof(uint64_t); /* Expected size */
            return 1;
        }
        switch (p->data_size) {
        case sizeof(uint32_t):
            if (val <= UINT32_MAX) {
                p->return_size = sizeof(uint32_t);
                *(uint32_t *)p->data = (uint32_t)val;
                return 1;
            }
            err_out_of_range;
            return 0;
        case sizeof(uint64_t):
            p->return_size = sizeof(uint64_t);
            *(uint64_t *)p->data = (uint64_t)val;
            return 1;
        }
#endif
        return general_set_int(p, &val, sizeof(val));
    } else if (p->data_type == OSSL_PARAM_REAL) {
#ifndef OPENSSL_SYS_UEFI
        uint64_t u64;

        if (p->data == NULL) {
            p->return_size = sizeof(double);
            return 1;
        }
        switch (p->data_size) {
        case sizeof(double):
            u64 = val < 0 ? -val : val;
            if ((u64 >> real_shift()) == 0) {
                p->return_size = sizeof(double);
                *(double *)p->data = (double)val;
                return 1;
            }
            err_inexact;
            return 0;
        }
        err_unsupported_real;
        return 0;
#endif
    }
    err_bad_type;
    return 0;
}

OSSL_PARAM OSSL_PARAM_construct_int64(const char *key, int64_t *buf)
{
    return ossl_param_construct(key, OSSL_PARAM_INTEGER, buf, sizeof(int64_t));
}

int OSSL_PARAM_get_uint64(const OSSL_PARAM *p, uint64_t *val)
{
    if (val == NULL || p == NULL) {
        err_null_argument;
        return 0;
    }

    if (p->data == NULL) {
        err_null_argument;
        return 0;
    }

    if (ossl_likely(p->data_type == OSSL_PARAM_UNSIGNED_INTEGER)) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        switch (p->data_size) {
        case sizeof(uint32_t):
            *val = *(const uint32_t *)p->data;
            return 1;
        case sizeof(uint64_t):
            *val = *(const uint64_t *)p->data;
            return 1;
        }
#endif
        return general_get_uint(p, val, sizeof(*val));
    } else if (p->data_type == OSSL_PARAM_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        int32_t i32;
        int64_t i64;

        switch (p->data_size) {
        case sizeof(int32_t):
            i32 = *(const int32_t *)p->data;
            if (i32 >= 0) {
                *val = (uint64_t)i32;
                return 1;
            }
            err_unsigned_negative;
            return 0;
        case sizeof(int64_t):
            i64 = *(const int64_t *)p->data;
            if (i64 >= 0) {
                *val = (uint64_t)i64;
                return 1;
            }
            err_unsigned_negative;
            return 0;
        }
#endif
        return general_get_uint(p, val, sizeof(*val));
    } else if (p->data_type == OSSL_PARAM_REAL) {
#ifndef OPENSSL_SYS_UEFI
        double d;

        switch (p->data_size) {
        case sizeof(double):
            d = *(const double *)p->data;
            if (d >= 0
                /*
                 * By subtracting 65535 (2^16-1) we cancel the low order
                 * 15 bits of UINT64_MAX to avoid using imprecise floating
                 * point values.
                 */
                && d < (double)(UINT64_MAX - 65535) + 65536.0
                && d == (uint64_t)d) {
                *val = (uint64_t)d;
                return 1;
            }
            err_inexact;
            return 0;
        }
        err_unsupported_real;
        return 0;
#endif
    }
    err_bad_type;
    return 0;
}

int OSSL_PARAM_set_uint64(OSSL_PARAM *p, uint64_t val)
{
    if (p == NULL) {
        err_null_argument;
        return 0;
    }
    p->return_size = 0;

    if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        if (p->data == NULL) {
            p->return_size = sizeof(uint64_t); /* Expected size */
            return 1;
        }
        switch (p->data_size) {
        case sizeof(uint32_t):
            if (val <= UINT32_MAX) {
                p->return_size = sizeof(uint32_t);
                *(uint32_t *)p->data = (uint32_t)val;
                return 1;
            }
            err_out_of_range;
            return 0;
        case sizeof(uint64_t):
            p->return_size = sizeof(uint64_t);
            *(uint64_t *)p->data = val;
            return 1;
        }
#endif
        return general_set_uint(p, &val, sizeof(val));
    } else if (p->data_type == OSSL_PARAM_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
        if (p->data == NULL) {
            p->return_size = sizeof(int64_t); /* Expected size */
            return 1;
        }
        switch (p->data_size) {
        case sizeof(int32_t):
            if (val <= INT32_MAX) {
                p->return_size = sizeof(int32_t);
                *(int32_t *)p->data = (int32_t)val;
                return 1;
            }
            err_out_of_range;
            return 0;
        case sizeof(int64_t):
            if (val <= INT64_MAX) {
                p->return_size = sizeof(int64_t);
                *(int64_t *)p->data = (int64_t)val;
                return 1;
            }
            err_out_of_range;
            return 0;
        }
#endif
        return general_set_uint(p, &val, sizeof(val));
    } else if (p->data_type == OSSL_PARAM_REAL) {
#ifndef OPENSSL_SYS_UEFI
        switch (p->data_size) {
        case sizeof(double):
            if ((val >> real_shift()) == 0) {
                p->return_size = sizeof(double);
                *(double *)p->data = (double)val;
                return 1;
            }
            err_inexact;
            return 0;
        }
        err_unsupported_real;
        return 0;
#endif
    }
    err_bad_type;
    return 0;
}

OSSL_PARAM OSSL_PARAM_construct_uint64(const char *key, uint64_t *buf)
{
    return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER, buf,
        sizeof(uint64_t));
}

int OSSL_PARAM_get_size_t(const OSSL_PARAM *p, size_t *val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(size_t)) {
    case sizeof(uint32_t):
        return OSSL_PARAM_get_uint32(p, (uint32_t *)val);
    case sizeof(uint64_t):
        return OSSL_PARAM_get_uint64(p, (uint64_t *)val);
    }
#endif
    return general_get_uint(p, val, sizeof(*val));
}

int OSSL_PARAM_set_size_t(OSSL_PARAM *p, size_t val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(size_t)) {
    case sizeof(uint32_t):
        return OSSL_PARAM_set_uint32(p, (uint32_t)val);
    case sizeof(uint64_t):
        return OSSL_PARAM_set_uint64(p, (uint64_t)val);
    }
#endif
    return general_set_uint(p, &val, sizeof(val));
}

OSSL_PARAM OSSL_PARAM_construct_size_t(const char *key, size_t *buf)
{
    return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER, buf,
        sizeof(size_t));
}

int OSSL_PARAM_get_time_t(const OSSL_PARAM *p, time_t *val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(time_t)) {
    case sizeof(int32_t):
        return OSSL_PARAM_get_int32(p, (int32_t *)val);
    case sizeof(int64_t):
        return OSSL_PARAM_get_int64(p, (int64_t *)val);
    }
#endif
    return general_get_int(p, val, sizeof(*val));
}

int OSSL_PARAM_set_time_t(OSSL_PARAM *p, time_t val)
{
#ifndef OPENSSL_SMALL_FOOTPRINT
    switch (sizeof(time_t)) {
    case sizeof(int32_t):
        return OSSL_PARAM_set_int32(p, (int32_t)val);
    case sizeof(int64_t):
        return OSSL_PARAM_set_int64(p, (int64_t)val);
    }
#endif
    return general_set_int(p, &val, sizeof(val));
}

OSSL_PARAM OSSL_PARAM_construct_time_t(const char *key, time_t *buf)
{
    return ossl_param_construct(key, OSSL_PARAM_INTEGER, buf, sizeof(time_t));
}

int OSSL_PARAM_get_BN(const OSSL_PARAM *p, BIGNUM **val)
{
    BIGNUM *b = NULL;

    if (val == NULL || p == NULL || p->data == NULL) {
        err_null_argument;
        return 0;
    }

    switch (p->data_type) {
    case OSSL_PARAM_UNSIGNED_INTEGER:
        b = BN_native2bn(p->data, (int)p->data_size, *val);
        break;
    case OSSL_PARAM_INTEGER:
        b = BN_signed_native2bn(p->data, (int)p->data_size, *val);
        break;
    default:
        err_bad_type;
        break;
    }

    if (b == NULL) {
        ERR_raise(ERR_LIB_CRYPTO, ERR_R_BN_LIB);
        return 0;
    }

    *val = b;
    return 1;
}

int OSSL_PARAM_set_BN(OSSL_PARAM *p, const BIGNUM *val)
{
    size_t bytes;

    if (p == NULL) {
        err_null_argument;
        return 0;
    }
    p->return_size = 0;
    if (val == NULL) {
        err_null_argument;
        return 0;
    }
    if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER && BN_is_negative(val)) {
        err_bad_type;
        return 0;
    }

    bytes = (size_t)BN_num_bytes(val);
    /* We add 1 byte for signed numbers, to make space for a sign extension */
    if (p->data_type == OSSL_PARAM_INTEGER)
        bytes++;
    /* We make sure that at least one byte is used, so zero is properly set */
    if (bytes == 0)
        bytes++;

    if (p->data == NULL) {
        p->return_size = bytes;
        return 1;
    }
    if (p->data_size >= bytes) {

        switch (p->data_type) {
        case OSSL_PARAM_UNSIGNED_INTEGER:
            if (BN_bn2nativepad(val, p->data, (int)p->data_size) < 0) {
                ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_INTEGER_OVERFLOW);
                return 0;
            }
            break;
        case OSSL_PARAM_INTEGER:
            if (BN_signed_bn2native(val, p->data, (int)p->data_size) < 0) {
                ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_INTEGER_OVERFLOW);
                return 0;
            }
            break;
        default:
            err_bad_type;
            return 0;
        }
        p->return_size = p->data_size;
        return 1;
    }
    p->return_size = bytes;
    err_too_small;
    return 0;
}

OSSL_PARAM OSSL_PARAM_construct_BN(const char *key, unsigned char *buf,
    size_t bsize)
{
    return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER,
        buf, bsize);
}

#ifndef OPENSSL_SYS_UEFI
int OSSL_PARAM_get_double(const OSSL_PARAM *p, double *val)
{
    int64_t i64;
    uint64_t u64;

    if (val == NULL || p == NULL || p->data == NULL) {
        err_null_argument;
        return 0;
    }

    if (p->data_type == OSSL_PARAM_REAL) {
        switch (p->data_size) {
        case sizeof(double):
            *val = *(const double *)p->data;
            return 1;
        }
        err_unsupported_real;
        return 0;
    } else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
        switch (p->data_size) {
        case sizeof(uint32_t):
            *val = *(const uint32_t *)p->data;
            return 1;
        case sizeof(uint64_t):
            u64 = *(const uint64_t *)p->data;
            if ((u64 >> real_shift()) == 0) {
                *val = (double)u64;
                return 1;
            }
            err_inexact;
            return 0;
        }
    } else if (p->data_type == OSSL_PARAM_INTEGER) {
        switch (p->data_size) {
        case sizeof(int32_t):
            *val = *(const int32_t *)p->data;
            return 1;
        case sizeof(int64_t):
            i64 = *(const int64_t *)p->data;
            u64 = i64 < 0 ? -i64 : i64;
            if ((u64 >> real_shift()) == 0) {
                *val = 0.0 + i64;
                return 1;
            }
            err_inexact;
            return 0;
        }
    }
    err_bad_type;
    return 0;
}

int OSSL_PARAM_set_double(OSSL_PARAM *p, double val)
{
#define D_POW_31 ((double)(((uint32_t)1) << 31))
    const double d_pow_31 = D_POW_31;
    const double d_pow_32 = 2.0 * D_POW_31;
    const double d_pow_63 = 2.0 * D_POW_31 * D_POW_31;
    const double d_pow_64 = 4.0 * D_POW_31 * D_POW_31;

    if (p == NULL) {
        err_null_argument;
        return 0;
    }
    p->return_size = 0;

    if (p->data_type == OSSL_PARAM_REAL) {
        if (p->data == NULL) {
            p->return_size = sizeof(double);
            return 1;
        }
        switch (p->data_size) {
        case sizeof(double):
            p->return_size = sizeof(double);
            *(double *)p->data = val;
            return 1;
        }
        err_unsupported_real;
        return 0;
    } else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
        if (p->data == NULL) {
            /*
             * Unclear how this is usable, the parameter's type is integral.
             * Its size should be the size of some integral type.
             */
            p->return_size = sizeof(double);
            return 1;
        }
        if (val != (uint64_t)val) {
            err_inexact;
            return 0;
        }
        switch (p->data_size) {
        case sizeof(uint32_t):
            if (val >= 0 && val < d_pow_32) {
                p->return_size = sizeof(uint32_t);
                *(uint32_t *)p->data = (uint32_t)val;
                return 1;
            }
            err_out_of_range;
            return 0;
        case sizeof(uint64_t):
            if (val >= 0 && val < d_pow_64) {
                p->return_size = sizeof(uint64_t);
                *(uint64_t *)p->data = (uint64_t)val;
                return 1;
            }
            err_out_of_range;
            return 0;
        }
    } else if (p->data_type == OSSL_PARAM_INTEGER) {
        if (p->data == NULL) {
            /*
             * Unclear how this is usable, the parameter's type is integral.
             * Its size should be the size of some integral type.
             */
            p->return_size = sizeof(double);
            return 1;
        }
        if (val != (int64_t)val) {
            err_inexact;
            return 0;
        }
        switch (p->data_size) {
        case sizeof(int32_t):
            if (val >= -d_pow_31 && val < d_pow_31) {
                p->return_size = sizeof(int32_t);
                *(int32_t *)p->data = (int32_t)val;
                return 1;
            }
            err_out_of_range;
            return 0;
        case sizeof(int64_t):
            if (val >= -d_pow_63 && val < d_pow_63) {
                p->return_size = sizeof(int64_t);
                *(int64_t *)p->data = (int64_t)val;
                return 1;
            }
            err_out_of_range;
            return 0;
        }
    }
    err_bad_type;
    return 0;
}

OSSL_PARAM OSSL_PARAM_construct_double(const char *key, double *buf)
{
    return ossl_param_construct(key, OSSL_PARAM_REAL, buf, sizeof(double));
}
#endif

static int get_string_internal(const OSSL_PARAM *p, void **val,
    size_t *max_len, size_t *used_len,
    unsigned int type)
{
    size_t sz, alloc_sz;

    if ((val == NULL && used_len == NULL) || p == NULL) {
        err_null_argument;
        return 0;
    }
    if (p->data_type != type) {
        err_bad_type;
        return 0;
    }

    sz = p->data_size;
    /*
     * If the input size is 0, or the input string needs NUL byte
     * termination, allocate an extra byte.
     */
    alloc_sz = sz + (type == OSSL_PARAM_UTF8_STRING || sz == 0);

    if (used_len != NULL)
        *used_len = sz;

    if (p->data == NULL) {
        err_null_argument;
        return 0;
    }

    if (val == NULL)
        return 1;

    if (*val == NULL) {
        char *const q = OPENSSL_malloc(alloc_sz);

        if (q == NULL)
            return 0;
        *val = q;
        *max_len = alloc_sz;
    }

    if (*max_len < sz) {
        err_too_small;
        return 0;
    }
    memcpy(*val, p->data, sz);
    return 1;
}

int OSSL_PARAM_get_utf8_string(const OSSL_PARAM *p, char **val, size_t max_len)
{
    int ret = get_string_internal(p, (void **)val, &max_len, NULL,
        OSSL_PARAM_UTF8_STRING);

    /*
     * We try to ensure that the copied string is terminated with a
     * NUL byte.  That should be easy, just place a NUL byte at
     * |((char*)*val)[p->data_size]|.
     * Unfortunately, we have seen cases where |p->data_size| doesn't
     * correctly reflect the length of the string, and just happens
     * to be out of bounds according to |max_len|, so in that case, we
     * make the extra step of trying to find the true length of the
     * string that |p->data| points at, and use that as an index to
     * place the NUL byte in |*val|.
     */
    size_t data_length = p->data_size;

    if (ret == 0)
        return 0;
    if (data_length >= max_len)
        data_length = OPENSSL_strnlen(p->data, data_length);
    if (data_length >= max_len) {
        ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_NO_SPACE_FOR_TERMINATING_NULL);
        return 0; /* No space for a terminating NUL byte */
    }
    (*val)[data_length] = '\0';

    return ret;
}

int OSSL_PARAM_get_octet_string(const OSSL_PARAM *p, void **val, size_t max_len,
    size_t *used_len)
{
    return get_string_internal(p, val, &max_len, used_len,
        OSSL_PARAM_OCTET_STRING);
}

static int set_string_internal(OSSL_PARAM *p, const void *val, size_t len,
    unsigned int type)
{
    if (p->data_type != type) {
        err_bad_type;
        return 0;
    }
    p->return_size = len;
    if (p->data == NULL)
        return 1;
    if (p->data_size < len) {
        err_too_small;
        return 0;
    }

    memcpy(p->data, val, len);
    /* If possible within the size of p->data, add a NUL terminator byte */
    if (type == OSSL_PARAM_UTF8_STRING && p->data_size > len)
        ((char *)p->data)[len] = '\0';
    return 1;
}

int OSSL_PARAM_set_utf8_string(OSSL_PARAM *p, const char *val)
{
    if (p == NULL || val == NULL) {
        err_null_argument;
        return 0;
    }
    p->return_size = 0;
    return set_string_internal(p, val, strlen(val), OSSL_PARAM_UTF8_STRING);
}

int OSSL_PARAM_set_octet_string(OSSL_PARAM *p, const void *val,
    size_t len)
{
    if (p == NULL || val == NULL) {
        err_null_argument;
        return 0;
    }
    p->return_size = 0;
    return set_string_internal(p, val, len, OSSL_PARAM_OCTET_STRING);
}

OSSL_PARAM OSSL_PARAM_construct_utf8_string(const char *key, char *buf,
    size_t bsize)
{
    if (buf != NULL && bsize == 0)
        bsize = strlen(buf);
    return ossl_param_construct(key, OSSL_PARAM_UTF8_STRING, buf, bsize);
}

OSSL_PARAM OSSL_PARAM_construct_octet_string(const char *key, void *buf,
    size_t bsize)
{
    return ossl_param_construct(key, OSSL_PARAM_OCTET_STRING, buf, bsize);
}

static int get_ptr_internal_skip_checks(const OSSL_PARAM *p, const void **val,
    size_t *used_len)
{
    if (used_len != NULL)
        *used_len = p->data_size;
    *val = *(const void **)p->data;
    return 1;
}

static int get_ptr_internal(const OSSL_PARAM *p, const void **val,
    size_t *used_len, unsigned int type)
{
    if (val == NULL || p == NULL) {
        err_null_argument;
        return 0;
    }
    if (p->data_type != type) {
        err_bad_type;
        return 0;
    }
    return get_ptr_internal_skip_checks(p, val, used_len);
}

int OSSL_PARAM_get_utf8_ptr(const OSSL_PARAM *p, const char **val)
{
    return get_ptr_internal(p, (const void **)val, NULL, OSSL_PARAM_UTF8_PTR);
}

int OSSL_PARAM_get_octet_ptr(const OSSL_PARAM *p, const void **val,
    size_t *used_len)
{
    return get_ptr_internal(p, val, used_len, OSSL_PARAM_OCTET_PTR);
}

static int set_ptr_internal(OSSL_PARAM *p, const void *val,
    unsigned int type, size_t len)
{
    if (p->data_type != type) {
        err_bad_type;
        return 0;
    }
    p->return_size = len;
    if (p->data != NULL)
        *(const void **)p->data = val;
    return 1;
}

int OSSL_PARAM_set_utf8_ptr(OSSL_PARAM *p, const char *val)
{
    if (p == NULL) {
        err_null_argument;
        return 0;
    }
    p->return_size = 0;
    return set_ptr_internal(p, val, OSSL_PARAM_UTF8_PTR,
        val == NULL ? 0 : strlen(val));
}

int OSSL_PARAM_set_octet_ptr(OSSL_PARAM *p, const void *val,
    size_t used_len)
{
    if (p == NULL) {
        err_null_argument;
        return 0;
    }
    p->return_size = 0;
    return set_ptr_internal(p, val, OSSL_PARAM_OCTET_PTR, used_len);
}

OSSL_PARAM OSSL_PARAM_construct_utf8_ptr(const char *key, char **buf,
    size_t bsize)
{
    return ossl_param_construct(key, OSSL_PARAM_UTF8_PTR, buf, bsize);
}

OSSL_PARAM OSSL_PARAM_construct_octet_ptr(const char *key, void **buf,
    size_t bsize)
{
    return ossl_param_construct(key, OSSL_PARAM_OCTET_PTR, buf, bsize);
}

/*
 * Extract the parameter into an allocated buffer.
 * Any existing allocation in *out is cleared and freed.
 *
 * Returns 1 on success, 0 on failure and -1 if there are no matching params.
 *
 * *out and *out_len are guaranteed to be untouched if this function
 * doesn't return success.
 */
int ossl_param_get1_octet_string_from_param(const OSSL_PARAM *p,
    unsigned char **out,
    size_t *out_len)
{
    void *buf = NULL;
    size_t len = 0;

    if (p == NULL)
        return -1;

    if (p->data != NULL
        && p->data_size > 0
        && !OSSL_PARAM_get_octet_string(p, &buf, 0, &len))
        return 0;

    OPENSSL_clear_free(*out, *out_len);
    *out = buf;
    *out_len = len;
    return 1;
}

int ossl_param_get1_octet_string(const OSSL_PARAM *params, const char *name,
    unsigned char **out, size_t *out_len)
{
    const OSSL_PARAM *p = OSSL_PARAM_locate_const(params, name);

    return ossl_param_get1_octet_string_from_param(p, out, out_len);
}

static int setbuf_fromparams(size_t n, OSSL_PARAM *p[],
    unsigned char *out, size_t *outlen)
{
    int ret = 0;
    WPACKET pkt;
    size_t i;

    if (out == NULL) {
        if (!WPACKET_init_null(&pkt, 0))
            return 0;
    } else {
        if (!WPACKET_init_static_len(&pkt, out, *outlen, 0))
            return 0;
    }

    for (i = 0; i < n; i++) {
        if (p[i]->data_type != OSSL_PARAM_OCTET_STRING)
            goto err;
        if (p[i]->data != NULL
            && p[i]->data_size != 0
            && !WPACKET_memcpy(&pkt, p[i]->data, p[i]->data_size))
            goto err;
    }
    if (!WPACKET_get_total_written(&pkt, outlen)
        || !WPACKET_finish(&pkt))
        goto err;
    ret = 1;
err:
    WPACKET_cleanup(&pkt);
    return ret;
}

int ossl_param_get1_concat_octet_string(size_t n, OSSL_PARAM *params[],
    unsigned char **out, size_t *out_len)
{
    unsigned char *res;
    size_t sz = 0;

    if (n == 0)
        return 1;

    /* Calculate the total size */
    if (!setbuf_fromparams(n, params, NULL, &sz))
        return 0;

    /* Special case zero length */
    if (sz == 0) {
        if ((res = OPENSSL_zalloc(1)) == NULL)
            return 0;
        goto fin;
    }

    /* Allocate the buffer */
    res = OPENSSL_malloc(sz);
    if (res == NULL)
        return 0;

    /* Concat one or more OSSL_KDF_PARAM_INFO fields */
    if (!setbuf_fromparams(n, params, res, &sz)) {
        OPENSSL_clear_free(res, sz);
        return 0;
    }

fin:
    OPENSSL_clear_free(*out, *out_len);
    *out = res;
    *out_len = sz;
    return 1;
}

OSSL_PARAM OSSL_PARAM_construct_end(void)
{
    OSSL_PARAM end = OSSL_PARAM_END;

    return end;
}

static int get_string_ptr_internal(const OSSL_PARAM *p, const void **val,
    size_t *used_len, unsigned int ref_type,
    unsigned int type)
{
    if (val == NULL || p == NULL) {
        err_null_argument;
        return 0;
    }

    if (p->data_type == ref_type)
        return get_ptr_internal_skip_checks(p, (const void **)val, used_len);

    if (p->data_type != type) {
        err_bad_type;
        return 0;
    }
    if (used_len != NULL)
        *used_len = p->data_size;
    *val = p->data;
    return 1;
}

int OSSL_PARAM_get_utf8_string_ptr(const OSSL_PARAM *p, const char **val)
{
    return get_string_ptr_internal(p, (const void **)val, NULL,
        OSSL_PARAM_UTF8_PTR,
        OSSL_PARAM_UTF8_STRING);
}

int OSSL_PARAM_get_octet_string_ptr(const OSSL_PARAM *p, const void **val,
    size_t *used_len)
{
    return get_string_ptr_internal(p, (const void **)val, used_len,
        OSSL_PARAM_OCTET_PTR,
        OSSL_PARAM_OCTET_STRING);
}

int OSSL_PARAM_set_octet_string_or_ptr(OSSL_PARAM *p, const void *val,
    size_t len)
{
    if (p == NULL) {
        err_null_argument;
        return 0;
    }

    if (p->data_type == OSSL_PARAM_OCTET_STRING)
        return OSSL_PARAM_set_octet_string(p, val, len);
    else if (p->data_type == OSSL_PARAM_OCTET_PTR)
        return OSSL_PARAM_set_octet_ptr(p, val, len);

    err_bad_type;
    return 0;
}
