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