1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2014-2019, Linaro Limited 4 */ 5 6 #include <crypto/crypto.h> 7 #include <stdlib.h> 8 #include <string.h> 9 #include <tee_api_types.h> 10 #include <trace.h> 11 #include <utee_defines.h> 12 13 #include "acipher_helpers.h" 14 15 TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s, 16 size_t key_size_bits __unused) 17 { 18 memset(s, 0, sizeof(*s)); 19 if (!bn_alloc_max(&s->g)) 20 return TEE_ERROR_OUT_OF_MEMORY; 21 if (!bn_alloc_max(&s->p)) 22 goto err; 23 if (!bn_alloc_max(&s->y)) 24 goto err; 25 if (!bn_alloc_max(&s->x)) 26 goto err; 27 if (!bn_alloc_max(&s->q)) 28 goto err; 29 return TEE_SUCCESS; 30 err: 31 crypto_bignum_free(s->g); 32 crypto_bignum_free(s->p); 33 crypto_bignum_free(s->y); 34 crypto_bignum_free(s->x); 35 return TEE_ERROR_OUT_OF_MEMORY; 36 } 37 38 TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key, struct bignum *q, 39 size_t xbits, size_t key_size) 40 { 41 TEE_Result res = TEE_ERROR_GENERIC; 42 dh_key ltc_tmp_key = { }; 43 int ltc_res = 0; 44 45 if (key_size != 8 * mp_unsigned_bin_size(key->p)) 46 return TEE_ERROR_BAD_PARAMETERS; 47 48 ltc_res = mp_init_multi(<c_tmp_key.base, <c_tmp_key.prime, NULL); 49 if (ltc_res != CRYPT_OK) 50 return TEE_ERROR_OUT_OF_MEMORY; 51 52 /* Generate the DH key */ 53 mp_copy(key->g, ltc_tmp_key.base); 54 mp_copy(key->p, ltc_tmp_key.prime); 55 ltc_res = dh_make_key(NULL, find_prng("prng_crypto"), q, xbits, 56 <c_tmp_key); 57 if (ltc_res != CRYPT_OK) { 58 res = TEE_ERROR_BAD_PARAMETERS; 59 } else { 60 ltc_mp.copy(ltc_tmp_key.y, key->y); 61 ltc_mp.copy(ltc_tmp_key.x, key->x); 62 res = TEE_SUCCESS; 63 } 64 65 dh_free(<c_tmp_key); 66 return res; 67 } 68 69 TEE_Result crypto_acipher_dh_shared_secret(struct dh_keypair *private_key, 70 struct bignum *public_key, 71 struct bignum *secret) 72 { 73 int err; 74 75 if (!private_key || !public_key || !secret) 76 return TEE_ERROR_BAD_PARAMETERS; 77 78 err = mp_exptmod(public_key, private_key->x, private_key->p, secret); 79 return ((err == CRYPT_OK) ? TEE_SUCCESS : TEE_ERROR_BAD_PARAMETERS); 80 81 } 82