1*000fae55SEdison Ai // SPDX-License-Identifier: BSD-2-Clause 2*000fae55SEdison Ai /* 3*000fae55SEdison Ai * Copyright (C) 2018, ARM Limited 4*000fae55SEdison Ai * Copyright (C) 2019, Linaro Limited 5*000fae55SEdison Ai */ 6*000fae55SEdison Ai 7*000fae55SEdison Ai #include <assert.h> 8*000fae55SEdison Ai #include <crypto/crypto.h> 9*000fae55SEdison Ai #include <kernel/panic.h> 10*000fae55SEdison Ai #include <mbedtls/bignum.h> 11*000fae55SEdison Ai #include <stdlib.h> 12*000fae55SEdison Ai #include <string.h> 13*000fae55SEdison Ai #include <util.h> 14*000fae55SEdison Ai 15*000fae55SEdison Ai #define ciL (sizeof(mbedtls_mpi_uint)) /* chars in limb */ 16*000fae55SEdison Ai #define biL (ciL << 3) /* bits in limb */ 17*000fae55SEdison Ai #define BITS_TO_LIMBS(i) ((i) / biL + ((i) % biL != 0)) 18*000fae55SEdison Ai 19*000fae55SEdison Ai size_t crypto_bignum_num_bytes(struct bignum *a) 20*000fae55SEdison Ai { 21*000fae55SEdison Ai assert(a != NULL); 22*000fae55SEdison Ai return mbedtls_mpi_size((const mbedtls_mpi *)a); 23*000fae55SEdison Ai } 24*000fae55SEdison Ai 25*000fae55SEdison Ai size_t crypto_bignum_num_bits(struct bignum *a) 26*000fae55SEdison Ai { 27*000fae55SEdison Ai assert(a != NULL); 28*000fae55SEdison Ai return mbedtls_mpi_bitlen((const mbedtls_mpi *)a); 29*000fae55SEdison Ai } 30*000fae55SEdison Ai 31*000fae55SEdison Ai int32_t crypto_bignum_compare(struct bignum *a, struct bignum *b) 32*000fae55SEdison Ai { 33*000fae55SEdison Ai int ret = 0; 34*000fae55SEdison Ai 35*000fae55SEdison Ai assert(a != NULL); 36*000fae55SEdison Ai assert(b != NULL); 37*000fae55SEdison Ai ret = mbedtls_mpi_cmp_mpi((const mbedtls_mpi *)a, 38*000fae55SEdison Ai (const mbedtls_mpi *)b); 39*000fae55SEdison Ai return CMP_TRILEAN(ret, 0); 40*000fae55SEdison Ai } 41*000fae55SEdison Ai 42*000fae55SEdison Ai void crypto_bignum_bn2bin(const struct bignum *from, uint8_t *to) 43*000fae55SEdison Ai { 44*000fae55SEdison Ai size_t len = 0; 45*000fae55SEdison Ai 46*000fae55SEdison Ai assert(from != NULL); 47*000fae55SEdison Ai assert(to != NULL); 48*000fae55SEdison Ai len = crypto_bignum_num_bytes((struct bignum *)from); 49*000fae55SEdison Ai if (mbedtls_mpi_write_binary((mbedtls_mpi *)from, to, len)) 50*000fae55SEdison Ai panic(); 51*000fae55SEdison Ai } 52*000fae55SEdison Ai 53*000fae55SEdison Ai TEE_Result crypto_bignum_bin2bn(const uint8_t *from, size_t fromsize, 54*000fae55SEdison Ai struct bignum *to) 55*000fae55SEdison Ai { 56*000fae55SEdison Ai assert(from != NULL); 57*000fae55SEdison Ai assert(to != NULL); 58*000fae55SEdison Ai if (mbedtls_mpi_read_binary((mbedtls_mpi *)to, from, fromsize)) 59*000fae55SEdison Ai return TEE_ERROR_BAD_PARAMETERS; 60*000fae55SEdison Ai return TEE_SUCCESS; 61*000fae55SEdison Ai } 62*000fae55SEdison Ai 63*000fae55SEdison Ai void crypto_bignum_copy(struct bignum *to, const struct bignum *from) 64*000fae55SEdison Ai { 65*000fae55SEdison Ai assert(from != NULL); 66*000fae55SEdison Ai assert(to != NULL); 67*000fae55SEdison Ai if (mbedtls_mpi_copy((mbedtls_mpi *)to, (const mbedtls_mpi *)from)) 68*000fae55SEdison Ai panic(); 69*000fae55SEdison Ai } 70*000fae55SEdison Ai 71*000fae55SEdison Ai struct bignum *crypto_bignum_allocate(size_t size_bits) 72*000fae55SEdison Ai { 73*000fae55SEdison Ai mbedtls_mpi *bn = NULL; 74*000fae55SEdison Ai 75*000fae55SEdison Ai if (size_bits > CFG_CORE_BIGNUM_MAX_BITS) 76*000fae55SEdison Ai size_bits = CFG_CORE_BIGNUM_MAX_BITS; 77*000fae55SEdison Ai 78*000fae55SEdison Ai bn = calloc(1, sizeof(mbedtls_mpi)); 79*000fae55SEdison Ai if (!bn) 80*000fae55SEdison Ai return NULL; 81*000fae55SEdison Ai mbedtls_mpi_init(bn); 82*000fae55SEdison Ai if (mbedtls_mpi_grow(bn, BITS_TO_LIMBS(size_bits)) != 0) { 83*000fae55SEdison Ai free(bn); 84*000fae55SEdison Ai return NULL; 85*000fae55SEdison Ai } 86*000fae55SEdison Ai 87*000fae55SEdison Ai return (struct bignum *)bn; 88*000fae55SEdison Ai } 89*000fae55SEdison Ai 90*000fae55SEdison Ai void crypto_bignum_free(struct bignum *s) 91*000fae55SEdison Ai { 92*000fae55SEdison Ai mbedtls_mpi_free((mbedtls_mpi *)s); 93*000fae55SEdison Ai free(s); 94*000fae55SEdison Ai } 95*000fae55SEdison Ai 96*000fae55SEdison Ai void crypto_bignum_clear(struct bignum *s) 97*000fae55SEdison Ai { 98*000fae55SEdison Ai mbedtls_mpi *bn = (mbedtls_mpi *)s; 99*000fae55SEdison Ai 100*000fae55SEdison Ai memset(bn->p, 0, mbedtls_mpi_size((const mbedtls_mpi *)bn)); 101*000fae55SEdison Ai } 102