xref: /optee_os/lib/libmbedtls/core/mbed_helpers.c (revision c84eee6397bb8ae0745d9aa24b5228a58793378b)
1*c84eee63SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
2*c84eee63SJerome Forissier /*
3*c84eee63SJerome Forissier  * Copyright (c) 2021 Huawei Technologies Co., Ltd
4*c84eee63SJerome Forissier  */
5*c84eee63SJerome Forissier 
6*c84eee63SJerome Forissier #include <compiler.h>
7*c84eee63SJerome Forissier #include <crypto/crypto.h>
8*c84eee63SJerome Forissier #include <mbedtls/bignum.h>
9*c84eee63SJerome Forissier #include <stddef.h>
10*c84eee63SJerome Forissier #include <tee_api_defines.h>
11*c84eee63SJerome Forissier #include <tee_api_types.h>
12*c84eee63SJerome Forissier 
13*c84eee63SJerome Forissier #include "mbed_helpers.h"
14*c84eee63SJerome Forissier 
15*c84eee63SJerome Forissier /* Generate random number 1 <= n < max */
mbed_gen_random_upto(mbedtls_mpi * n,mbedtls_mpi * max)16*c84eee63SJerome Forissier TEE_Result mbed_gen_random_upto(mbedtls_mpi *n, mbedtls_mpi *max)
17*c84eee63SJerome Forissier {
18*c84eee63SJerome Forissier 	size_t sz = mbedtls_mpi_size(max);
19*c84eee63SJerome Forissier 	bool found = false;
20*c84eee63SJerome Forissier 	int mres = 0;
21*c84eee63SJerome Forissier 
22*c84eee63SJerome Forissier 	do {
23*c84eee63SJerome Forissier 		mres = mbedtls_mpi_fill_random(n, sz, mbd_rand, NULL);
24*c84eee63SJerome Forissier 		if (mres)
25*c84eee63SJerome Forissier 			return TEE_ERROR_BAD_STATE;
26*c84eee63SJerome Forissier 		if (mbedtls_mpi_bitlen(n) != 0 &&
27*c84eee63SJerome Forissier 		    mbedtls_mpi_cmp_mpi(n, max) == -1)
28*c84eee63SJerome Forissier 			found = true;
29*c84eee63SJerome Forissier 	} while (!found);
30*c84eee63SJerome Forissier 
31*c84eee63SJerome Forissier 	return TEE_SUCCESS;
32*c84eee63SJerome Forissier }
33*c84eee63SJerome Forissier 
34