Skip to content

Commit e3b426a

Browse files
tomi-fontendre-nordic
authored andcommitted
nrf_security: drivers: cracen: fix ECDSA internal octet feeding
Ensure that the memory pointing to the internal octet remains valid and untouched until the task's execution is complete as si_task_consume() says. This provoked issues in certain cases on CRACEN Lite because it's slower and takes more time to retrieve the data through DMA. Signed-off-by: Tomi Fontanilles <[email protected]>
1 parent ad164e2 commit e3b426a

File tree

1 file changed

+25
-10
lines changed
  • subsys/nrf_security/src/drivers/cracen/sicrypto/src

1 file changed

+25
-10
lines changed

subsys/nrf_security/src/drivers/cracen/sicrypto/src/ecdsa.c

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@
4343
#define MIN(x, y) (x) < (y) ? (x) : (y)
4444
#define ROUND_UP(x, align) \
4545
(((unsigned long)(x) + ((unsigned long)(align)-1)) & ~((unsigned long)(align)-1))
46-
#define INTERNAL_OCTET_NOT_USED ((uint8_t)0xFFu)
46+
47+
typedef enum {
48+
INTERNAL_OCTET_ZERO,
49+
INTERNAL_OCTET_ONE,
50+
INTERNAL_OCTET_UNUSED,
51+
} internal_octet_t;
4752

4853
#ifndef MAX_ECDSA_ATTEMPTS
4954
#define MAX_ECDSA_ATTEMPTS 255
@@ -316,14 +321,22 @@ static void run_ecdsa_sign_rnd(struct sitask *t)
316321

317322
static void deterministic_ecdsa_hmac(struct sitask *t, const struct sxhashalg *hashalg,
318323
uint8_t *key, const uint8_t *v, size_t hash_len,
319-
uint8_t internal_octet, uint8_t *sk, uint8_t *hash,
320-
size_t key_len, uint8_t *hmac)
324+
internal_octet_t internal_octet, const uint8_t *sk,
325+
const uint8_t *hash, size_t key_len, uint8_t *hmac)
321326
{
322327
si_mac_create_hmac(t, hashalg, key, hash_len);
323328
si_task_consume(t, v, hash_len);
324329

325-
if (internal_octet != INTERNAL_OCTET_NOT_USED) {
326-
si_task_consume(t, &internal_octet, sizeof(internal_octet));
330+
if (internal_octet != INTERNAL_OCTET_UNUSED) {
331+
/* Not const because CRACEN cannot access MRAM on 54H20. */
332+
static uint8_t internal_octet_values[] = {
333+
[INTERNAL_OCTET_ZERO] = 0,
334+
[INTERNAL_OCTET_ONE] = 1,
335+
[INTERNAL_OCTET_UNUSED] = 0xFF,
336+
};
337+
338+
si_task_consume(t, &internal_octet_values[internal_octet],
339+
sizeof(*internal_octet_values));
327340
}
328341
if (sk) {
329342
si_task_consume(t, sk, key_len);
@@ -424,26 +437,28 @@ static int run_deterministic_ecdsa_hmac_step(struct sitask *t, struct siwq *wq)
424437

425438
si_wq_run_after(t, wq, run_deterministic_ecdsa_hmac_step);
426439
deterministic_ecdsa_hmac(t, t->params.ecdsa_sign.privkey->hashalg, K, V, digestsz,
427-
0, t->params.ecdsa_sign.privkey->key.eckey.d, T, opsz, K);
440+
INTERNAL_OCTET_ZERO,
441+
t->params.ecdsa_sign.privkey->key.eckey.d, T, opsz, K);
428442
break;
429443

430444
case 1: /* V = HMAC_K(V) */
431445
si_wq_run_after(t, wq, run_deterministic_ecdsa_hmac_step);
432446
deterministic_ecdsa_hmac(t, t->params.ecdsa_sign.privkey->hashalg, K, V, digestsz,
433-
INTERNAL_OCTET_NOT_USED, NULL, NULL, opsz, V);
447+
INTERNAL_OCTET_UNUSED, NULL, NULL, opsz, V);
434448
break;
435449

436450
case 2: /* K = HMAC_K(V || 0x01 || privkey || h1) */
437451
si_wq_run_after(t, wq, run_deterministic_ecdsa_hmac_step);
438452
deterministic_ecdsa_hmac(t, t->params.ecdsa_sign.privkey->hashalg, K, V, digestsz,
439-
1, t->params.ecdsa_sign.privkey->key.eckey.d, T, opsz, K);
453+
INTERNAL_OCTET_ONE,
454+
t->params.ecdsa_sign.privkey->key.eckey.d, T, opsz, K);
440455
break;
441456

442457
case 3: /* V = HMAC_K(V) */
443458
case 4: /* same as case 3. */
444459
si_wq_run_after(t, wq, run_deterministic_ecdsa_hmac_step);
445460
deterministic_ecdsa_hmac(t, t->params.ecdsa_sign.privkey->hashalg, K, V, digestsz,
446-
INTERNAL_OCTET_NOT_USED, NULL, NULL, opsz, V);
461+
INTERNAL_OCTET_UNUSED, NULL, NULL, opsz, V);
447462
break;
448463

449464
case 5: /* T = T || V */
@@ -486,7 +501,7 @@ static int run_deterministic_ecdsa_hmac_step(struct sitask *t, struct siwq *wq)
486501
t->params.ecdsa_sign.deterministic_retries++;
487502
/* K = HMAC_K(V || 0x00) */
488503
deterministic_ecdsa_hmac(t, t->params.ecdsa_sign.privkey->hashalg, K, V,
489-
digestsz, 0, NULL, NULL, 0, K);
504+
digestsz, INTERNAL_OCTET_ZERO, NULL, NULL, 0, K);
490505
return SX_ERR_HW_PROCESSING;
491506
}
492507

0 commit comments

Comments
 (0)