|
43 | 43 | #define MIN(x, y) (x) < (y) ? (x) : (y) |
44 | 44 | #define ROUND_UP(x, align) \ |
45 | 45 | (((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; |
47 | 52 |
|
48 | 53 | #ifndef MAX_ECDSA_ATTEMPTS |
49 | 54 | #define MAX_ECDSA_ATTEMPTS 255 |
@@ -316,14 +321,22 @@ static void run_ecdsa_sign_rnd(struct sitask *t) |
316 | 321 |
|
317 | 322 | static void deterministic_ecdsa_hmac(struct sitask *t, const struct sxhashalg *hashalg, |
318 | 323 | 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) |
321 | 326 | { |
322 | 327 | si_mac_create_hmac(t, hashalg, key, hash_len); |
323 | 328 | si_task_consume(t, v, hash_len); |
324 | 329 |
|
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)); |
327 | 340 | } |
328 | 341 | if (sk) { |
329 | 342 | si_task_consume(t, sk, key_len); |
@@ -424,26 +437,28 @@ static int run_deterministic_ecdsa_hmac_step(struct sitask *t, struct siwq *wq) |
424 | 437 |
|
425 | 438 | si_wq_run_after(t, wq, run_deterministic_ecdsa_hmac_step); |
426 | 439 | 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); |
428 | 442 | break; |
429 | 443 |
|
430 | 444 | case 1: /* V = HMAC_K(V) */ |
431 | 445 | si_wq_run_after(t, wq, run_deterministic_ecdsa_hmac_step); |
432 | 446 | 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); |
434 | 448 | break; |
435 | 449 |
|
436 | 450 | case 2: /* K = HMAC_K(V || 0x01 || privkey || h1) */ |
437 | 451 | si_wq_run_after(t, wq, run_deterministic_ecdsa_hmac_step); |
438 | 452 | 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); |
440 | 455 | break; |
441 | 456 |
|
442 | 457 | case 3: /* V = HMAC_K(V) */ |
443 | 458 | case 4: /* same as case 3. */ |
444 | 459 | si_wq_run_after(t, wq, run_deterministic_ecdsa_hmac_step); |
445 | 460 | 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); |
447 | 462 | break; |
448 | 463 |
|
449 | 464 | case 5: /* T = T || V */ |
@@ -486,7 +501,7 @@ static int run_deterministic_ecdsa_hmac_step(struct sitask *t, struct siwq *wq) |
486 | 501 | t->params.ecdsa_sign.deterministic_retries++; |
487 | 502 | /* K = HMAC_K(V || 0x00) */ |
488 | 503 | 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); |
490 | 505 | return SX_ERR_HW_PROCESSING; |
491 | 506 | } |
492 | 507 |
|
|
0 commit comments