xref: /optee_os/core/drivers/crypto/versal/pki/ecc_pki_common.c (revision 684b77de8bc819d83dab8e1f791804cbd5e01bc8)
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