1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3 * Copyright (C) Foundries Ltd. 2022.
4 * Author: Jorge Ramirez <jorge@foundries.io>
5 *
6 * Copyright (C) 2023 ProvenRun S.A.S
7 */
8
9 #include <crypto/crypto.h>
10 #include <ecc_pki.h>
11 #include <ecc.h>
12 #include <kernel/panic.h>
13 #include <stddef.h>
14 #include <stdint.h>
15 #include <tee_api_types.h>
16 #include <utee_defines.h>
17
pki_ecc_get_key_size(uint32_t curve,size_t * bytes,size_t * bits)18 TEE_Result pki_ecc_get_key_size(uint32_t curve, size_t *bytes, size_t *bits)
19 {
20 switch (curve) {
21 case TEE_ECC_CURVE_NIST_P256:
22 *bits = 256;
23 *bytes = 32;
24 break;
25 case TEE_ECC_CURVE_NIST_P384:
26 *bits = 384;
27 *bytes = 48;
28 break;
29 case TEE_ECC_CURVE_NIST_P521:
30 *bits = 521;
31 *bytes = 66;
32 break;
33 default:
34 return TEE_ERROR_NOT_SUPPORTED;
35 }
36
37 return TEE_SUCCESS;
38 }
39
pki_memcpy_swp(uint8_t * to,const uint8_t * from,size_t len)40 void pki_memcpy_swp(uint8_t *to, const uint8_t *from, size_t len)
41 {
42 size_t i = 0;
43
44 for (i = 0; i < len; i++)
45 to[i] = from[len - 1 - i];
46 }
47
pki_crypto_bignum_bn2bin_eswap(uint32_t curve,struct bignum * from,uint8_t * to)48 void pki_crypto_bignum_bn2bin_eswap(uint32_t curve,
49 struct bignum *from, uint8_t *to)
50 {
51 uint8_t pad[66] = { 0 };
52 size_t len = crypto_bignum_num_bytes(from);
53 size_t bytes = 0;
54 size_t bits = 0;
55
56 if (pki_ecc_get_key_size(curve, &bytes, &bits))
57 panic();
58
59 crypto_bignum_bn2bin(from, pad + bytes - len);
60 pki_memcpy_swp(to, pad, bytes);
61 }
62
pki_crypto_bignum_bin2bn_eswap(const uint8_t * from,size_t sz,struct bignum * to)63 void pki_crypto_bignum_bin2bn_eswap(const uint8_t *from, size_t sz,
64 struct bignum *to)
65 {
66 uint8_t pad[66] = { 0 };
67
68 pki_memcpy_swp(pad, from, sz);
69 crypto_bignum_bin2bn(pad, sz, to);
70 }
71
pki_ecc_prepare_msg(uint32_t algo,const uint8_t * msg,size_t msg_len,size_t * len,uint8_t * buf)72 TEE_Result pki_ecc_prepare_msg(uint32_t algo, const uint8_t *msg,
73 size_t msg_len, size_t *len, uint8_t *buf)
74 {
75 if (msg_len > TEE_SHA512_HASH_SIZE + 2)
76 return TEE_ERROR_BAD_PARAMETERS;
77
78 if (algo == TEE_ALG_ECDSA_SHA256)
79 *len = TEE_SHA256_HASH_SIZE;
80 else if (algo == TEE_ALG_ECDSA_SHA384)
81 *len = TEE_SHA384_HASH_SIZE;
82 else if (algo == TEE_ALG_ECDSA_SHA512)
83 *len = TEE_SHA512_HASH_SIZE + 2;
84 else
85 return TEE_ERROR_NOT_SUPPORTED;
86
87 /* Swap the hash/message */
88 pki_memcpy_swp(buf, msg, msg_len);
89
90 return TEE_SUCCESS;
91 }
92