Skip to content

Commit 2fc79c6

Browse files
committed
nrf_security: drivers: cracen: Remove sicrypto for ecdsa
Add support for ecdsa directly in cracenpsa Remove sicrypto from cracenpsa for escda operations Add support files needed for escda, randinrange, hmac, ecc. Add privat and public ecc key generation without sicrypto Signed-off-by: Dag Erik Gjørvad <dag.erik.gjorvad@nordicsemi.no>
1 parent 66dcd8a commit 2fc79c6

File tree

11 files changed

+1154
-104
lines changed

11 files changed

+1154
-104
lines changed

subsys/nrf_security/src/drivers/cracen/cracenpsa/cracenpsa.cmake

+6
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,12 @@ endif()
4444
if(CONFIG_PSA_NEED_CRACEN_ASYMMETRIC_SIGNATURE_DRIVER)
4545
list(APPEND cracen_driver_sources
4646
${CMAKE_CURRENT_LIST_DIR}/src/sign.c
47+
${CMAKE_CURRENT_LIST_DIR}/src/ecdsa.c
48+
${CMAKE_CURRENT_LIST_DIR}/src/ecc.c
49+
${CMAKE_CURRENT_LIST_DIR}/src/rndinrange.c
4750
${CMAKE_CURRENT_LIST_DIR}/src/ed25519.c
51+
${CMAKE_CURRENT_LIST_DIR}/src/util.c
52+
${CMAKE_CURRENT_LIST_DIR}/src/hmac.c
4853
)
4954
endif()
5055

@@ -64,6 +69,7 @@ if(CONFIG_PSA_NEED_CRACEN_KEY_MANAGEMENT_DRIVER OR CONFIG_PSA_NEED_CRACEN_KMU_DR
6469
list(APPEND cracen_driver_sources
6570
${CMAKE_CURRENT_LIST_DIR}/src/ed25519.c
6671
${CMAKE_CURRENT_LIST_DIR}/src/key_management.c
72+
${CMAKE_CURRENT_LIST_DIR}/src/ecdsa.c
6773
)
6874
endif()
6975

subsys/nrf_security/src/drivers/cracen/cracenpsa/include/cracen_psa.h

+51
Original file line numberDiff line numberDiff line change
@@ -377,4 +377,55 @@ int ed25519ph_verify(const uint8_t *pubkey, const char *message,
377377
int ed25519_create_pubkey(const uint8_t *privkey,
378378
uint8_t *pubkey);
379379

380+
int be_cmp(const unsigned char *a, const unsigned char *b, size_t sz, int carry);
381+
382+
struct sx_pk_ecurve;
383+
384+
struct ecdsa_signature {
385+
size_t sz; /**< Total signature size, in bytes. */
386+
char *r; /**< Signature element "r". */
387+
char *s; /**< Signature element "s". */
388+
};
389+
struct eccsk {
390+
const struct sx_pk_ecurve *curve;
391+
char *d;
392+
};
393+
394+
struct eccpk {
395+
const struct sx_pk_ecurve *curve;
396+
char *qx;
397+
char *qy;
398+
};
399+
400+
struct ecc_keypair {
401+
struct eccsk sk;
402+
struct eccpk pk;
403+
};
404+
405+
406+
int ecc_create_genpubkey(char *priv_key, char *pub_key, const struct sx_pk_ecurve *curve);
407+
408+
int ecc_create_genprivkey(const struct sx_pk_ecurve *curve,
409+
char *priv_key, size_t priv_key_size);
410+
411+
412+
int cracen_ecdsa_verify(char *pubkey, const struct sxhashalg *hashalg, const uint8_t *message,
413+
size_t message_length, const struct sx_pk_ecurve *curve,
414+
const uint8_t *signature);
415+
416+
int cracen_ecdsa_sign(const struct eccsk *privkey, size_t privkey_size,
417+
const struct sxhashalg *hashalg, const struct sx_pk_ecurve *curve,const uint8_t *message,
418+
size_t message_length, uint8_t *signature, size_t signature_size, size_t *signature_length);
419+
420+
int cracen_ecdsa_sign_deterministic(const struct eccsk *privkey, size_t privkey_size,
421+
const struct sxhashalg *hashalg, const struct sx_pk_ecurve *curve,const uint8_t *digest,
422+
size_t digest_length, uint8_t *signature, size_t signature_size, size_t *signature_length);
423+
424+
int rndinrange_create(const unsigned char *n, size_t nsz, unsigned char *out);
425+
426+
int mac_create_hmac(const struct sxhashalg *hashalg, struct sxhash *hashopctx, const char *key,
427+
size_t keysz, char *workmem, size_t workmemsz);
428+
429+
int hmac_produce(struct sxhash *hashctx, const struct sxhashalg *hashalg, char *out, size_t sz, char *workmem);
430+
380431
#endif /* CRACEN_PSA_H */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/* ECC key pair generation.
2+
* Based on FIPS 186-4, section B.4.2 "Key Pair Generation by Testing
3+
* Candidates".
4+
*
5+
* Copyright (c) 2023 Nordic Semiconductor ASA
6+
*
7+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
8+
*/
9+
10+
#include <string.h>
11+
#include <silexpk/core.h>
12+
#include <silexpk/iomem.h>
13+
#include <silexpk/cmddefs/ecc.h>
14+
#include <cracen/statuscodes.h>
15+
#include "cracen_psa.h"
16+
#include <zephyr/sys/printk.h>
17+
#include <zephyr/logging/log.h>
18+
19+
#define MAX_ECC_ATTEMPTS 10
20+
LOG_MODULE_REGISTER(ecc, LOG_LEVEL_DBG);
21+
22+
int ecc_create_genpubkey(char *priv_key, char *pub_key, const struct sx_pk_ecurve *curve)
23+
{
24+
const char **outputs;
25+
struct sx_pk_acq_req pkreq;
26+
struct sx_pk_inops_ecp_mult inputs;
27+
int opsz;
28+
int status;
29+
int attempts = MAX_ECC_ATTEMPTS;
30+
for (int i = 0; i <= MAX_ECC_ATTEMPTS; i++) {
31+
LOG_INF("ECC test");
32+
pkreq = sx_pk_acquire_req(SX_PK_CMD_ECC_PTMUL);
33+
if (pkreq.status) {
34+
return pkreq.status;
35+
}
36+
LOG_INF("list_ecc_inslots");
37+
pkreq.status = sx_pk_list_ecc_inslots(pkreq.req, curve, 0,
38+
(struct sx_pk_slot *)&inputs);
39+
if (pkreq.status) {
40+
return pkreq.status;
41+
}
42+
43+
opsz = sx_pk_curve_opsize(curve);
44+
LOG_INF("curve_opsize");
45+
46+
/* Write the private key (random) into ba414ep device memory */
47+
sx_wrpkmem(inputs.k.addr, priv_key, opsz);
48+
sx_pk_write_curve_gen(pkreq.req, curve, inputs.px, inputs.py);
49+
LOG_INF("curve_write");
50+
51+
sx_pk_run(pkreq.req);
52+
LOG_INF("pk_has_finished");
53+
54+
status = sx_pk_has_finished(pkreq.req);
55+
LOG_INF("sx_pk_wait");
56+
57+
status = sx_pk_wait(pkreq.req);
58+
if (status != SX_OK) {
59+
return status;
60+
}
61+
LOG_INF("output_ops");
62+
/* static int on_generated_public(struct sitask *t, struct siwq *wq) */
63+
outputs = sx_pk_get_output_ops(pkreq.req);
64+
LOG_INF("outputs");
65+
66+
/* When countermeasures are used, the operation may fail with error code
67+
* SX_ERR_NOT_INVERTIBLE. In this case we can try again.
68+
*/
69+
if (status == SX_ERR_NOT_INVERTIBLE) {
70+
sx_pk_release_req(pkreq.req);
71+
if (i == MAX_ECC_ATTEMPTS) {
72+
return SX_ERR_TOO_MANY_ATTEMPTS;
73+
}
74+
} else {
75+
break;
76+
}
77+
78+
}
79+
sx_rdpkmem(pub_key, outputs[0], opsz);
80+
81+
sx_rdpkmem(pub_key + opsz, outputs[1], opsz);
82+
sx_pk_release_req(pkreq.req);
83+
LOG_INF("last wait");
84+
return status;
85+
}
86+
87+
int ecc_create_genprivkey(const struct sx_pk_ecurve *curve,
88+
char *priv_key, size_t priv_key_size)
89+
{
90+
size_t keysz = (size_t)sx_pk_curve_opsize(curve);
91+
int status;
92+
int opsz = sx_pk_curve_opsize(curve);
93+
const char *curve_n = sx_pk_curve_order(curve);
94+
95+
if (priv_key_size < keysz) {
96+
return SX_ERR_OUTPUT_BUFFER_TOO_SMALL;
97+
}
98+
99+
/* generate private key, a random in [1, n-1], where n is the curve
100+
* order
101+
*/
102+
status = rndinrange_create((const unsigned char *)curve_n, opsz, priv_key);
103+
104+
return status;
105+
}

0 commit comments

Comments
 (0)