1e1051a39Sopenharmony_ci/*
2e1051a39Sopenharmony_ci * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci *
4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci * this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci */
9e1051a39Sopenharmony_ci
10e1051a39Sopenharmony_ci/*
11e1051a39Sopenharmony_ci * Key Management utility functions to share functionality between the export()
12e1051a39Sopenharmony_ci * and get_params() methods.
13e1051a39Sopenharmony_ci * export() uses OSSL_PARAM_BLD, and get_params() used the OSSL_PARAM[] to
14e1051a39Sopenharmony_ci * fill in parameter data for the same key and data fields.
15e1051a39Sopenharmony_ci */
16e1051a39Sopenharmony_ci
17e1051a39Sopenharmony_ci#include <openssl/core_names.h>
18e1051a39Sopenharmony_ci#include "internal/param_build_set.h"
19e1051a39Sopenharmony_ci
20e1051a39Sopenharmony_ciDEFINE_SPECIAL_STACK_OF_CONST(BIGNUM_const, BIGNUM)
21e1051a39Sopenharmony_ci
22e1051a39Sopenharmony_ciint ossl_param_build_set_int(OSSL_PARAM_BLD *bld, OSSL_PARAM *p,
23e1051a39Sopenharmony_ci                             const char *key, int num)
24e1051a39Sopenharmony_ci{
25e1051a39Sopenharmony_ci    if (bld != NULL)
26e1051a39Sopenharmony_ci        return OSSL_PARAM_BLD_push_int(bld, key, num);
27e1051a39Sopenharmony_ci    p = OSSL_PARAM_locate(p, key);
28e1051a39Sopenharmony_ci    if (p != NULL)
29e1051a39Sopenharmony_ci        return OSSL_PARAM_set_int(p, num);
30e1051a39Sopenharmony_ci    return 1;
31e1051a39Sopenharmony_ci}
32e1051a39Sopenharmony_ci
33e1051a39Sopenharmony_ciint ossl_param_build_set_long(OSSL_PARAM_BLD *bld, OSSL_PARAM *p,
34e1051a39Sopenharmony_ci                              const char *key, long num)
35e1051a39Sopenharmony_ci{
36e1051a39Sopenharmony_ci    if (bld != NULL)
37e1051a39Sopenharmony_ci        return OSSL_PARAM_BLD_push_long(bld, key, num);
38e1051a39Sopenharmony_ci    p = OSSL_PARAM_locate(p, key);
39e1051a39Sopenharmony_ci    if (p != NULL)
40e1051a39Sopenharmony_ci        return OSSL_PARAM_set_long(p, num);
41e1051a39Sopenharmony_ci    return 1;
42e1051a39Sopenharmony_ci}
43e1051a39Sopenharmony_ci
44e1051a39Sopenharmony_ciint ossl_param_build_set_utf8_string(OSSL_PARAM_BLD *bld, OSSL_PARAM *p,
45e1051a39Sopenharmony_ci                                     const char *key, const char *buf)
46e1051a39Sopenharmony_ci{
47e1051a39Sopenharmony_ci    if (bld != NULL)
48e1051a39Sopenharmony_ci        return OSSL_PARAM_BLD_push_utf8_string(bld, key, buf, 0);
49e1051a39Sopenharmony_ci    p = OSSL_PARAM_locate(p, key);
50e1051a39Sopenharmony_ci    if (p != NULL)
51e1051a39Sopenharmony_ci        return OSSL_PARAM_set_utf8_string(p, buf);
52e1051a39Sopenharmony_ci    return 1;
53e1051a39Sopenharmony_ci}
54e1051a39Sopenharmony_ci
55e1051a39Sopenharmony_ciint ossl_param_build_set_octet_string(OSSL_PARAM_BLD *bld, OSSL_PARAM *p,
56e1051a39Sopenharmony_ci                                      const char *key,
57e1051a39Sopenharmony_ci                                      const unsigned char *data,
58e1051a39Sopenharmony_ci                                      size_t data_len)
59e1051a39Sopenharmony_ci{
60e1051a39Sopenharmony_ci    if (bld != NULL)
61e1051a39Sopenharmony_ci        return OSSL_PARAM_BLD_push_octet_string(bld, key, data, data_len);
62e1051a39Sopenharmony_ci
63e1051a39Sopenharmony_ci    p = OSSL_PARAM_locate(p, key);
64e1051a39Sopenharmony_ci    if (p != NULL)
65e1051a39Sopenharmony_ci        return OSSL_PARAM_set_octet_string(p, data, data_len);
66e1051a39Sopenharmony_ci    return 1;
67e1051a39Sopenharmony_ci}
68e1051a39Sopenharmony_ci
69e1051a39Sopenharmony_ciint ossl_param_build_set_bn_pad(OSSL_PARAM_BLD *bld, OSSL_PARAM *p,
70e1051a39Sopenharmony_ci                                const char *key, const BIGNUM *bn,  size_t sz)
71e1051a39Sopenharmony_ci{
72e1051a39Sopenharmony_ci    if (bld != NULL)
73e1051a39Sopenharmony_ci        return OSSL_PARAM_BLD_push_BN_pad(bld, key, bn, sz);
74e1051a39Sopenharmony_ci    p = OSSL_PARAM_locate(p, key);
75e1051a39Sopenharmony_ci    if (p != NULL) {
76e1051a39Sopenharmony_ci        if (sz > p->data_size)
77e1051a39Sopenharmony_ci            return 0;
78e1051a39Sopenharmony_ci        p->data_size = sz;
79e1051a39Sopenharmony_ci        return OSSL_PARAM_set_BN(p, bn);
80e1051a39Sopenharmony_ci    }
81e1051a39Sopenharmony_ci    return 1;
82e1051a39Sopenharmony_ci}
83e1051a39Sopenharmony_ci
84e1051a39Sopenharmony_ciint ossl_param_build_set_bn(OSSL_PARAM_BLD *bld, OSSL_PARAM *p,
85e1051a39Sopenharmony_ci                            const char *key, const BIGNUM *bn)
86e1051a39Sopenharmony_ci{
87e1051a39Sopenharmony_ci    if (bld != NULL)
88e1051a39Sopenharmony_ci        return OSSL_PARAM_BLD_push_BN(bld, key, bn);
89e1051a39Sopenharmony_ci
90e1051a39Sopenharmony_ci    p = OSSL_PARAM_locate(p, key);
91e1051a39Sopenharmony_ci    if (p != NULL)
92e1051a39Sopenharmony_ci        return OSSL_PARAM_set_BN(p, bn) > 0;
93e1051a39Sopenharmony_ci    return 1;
94e1051a39Sopenharmony_ci}
95e1051a39Sopenharmony_ci
96e1051a39Sopenharmony_ciint ossl_param_build_set_multi_key_bn(OSSL_PARAM_BLD *bld, OSSL_PARAM *params,
97e1051a39Sopenharmony_ci                                      const char *names[],
98e1051a39Sopenharmony_ci                                      STACK_OF(BIGNUM_const) *stk)
99e1051a39Sopenharmony_ci{
100e1051a39Sopenharmony_ci    int i, sz = sk_BIGNUM_const_num(stk);
101e1051a39Sopenharmony_ci    OSSL_PARAM *p;
102e1051a39Sopenharmony_ci
103e1051a39Sopenharmony_ci
104e1051a39Sopenharmony_ci    if (bld != NULL) {
105e1051a39Sopenharmony_ci        for (i = 0; i < sz && names[i] != NULL; ++i) {
106e1051a39Sopenharmony_ci            if (!OSSL_PARAM_BLD_push_BN(bld, names[i],
107e1051a39Sopenharmony_ci                                        sk_BIGNUM_const_value(stk, i)))
108e1051a39Sopenharmony_ci                return 0;
109e1051a39Sopenharmony_ci        }
110e1051a39Sopenharmony_ci        return 1;
111e1051a39Sopenharmony_ci    }
112e1051a39Sopenharmony_ci
113e1051a39Sopenharmony_ci    for (i = 0; i < sz && names[i] != NULL; ++i) {
114e1051a39Sopenharmony_ci        p = OSSL_PARAM_locate(params, names[i]);
115e1051a39Sopenharmony_ci        if (p != NULL) {
116e1051a39Sopenharmony_ci            if (!OSSL_PARAM_set_BN(p, sk_BIGNUM_const_value(stk, i)))
117e1051a39Sopenharmony_ci                return 0;
118e1051a39Sopenharmony_ci        }
119e1051a39Sopenharmony_ci    }
120e1051a39Sopenharmony_ci    return 1;
121e1051a39Sopenharmony_ci}
122