Skip to content

Commit cf98494

Browse files
committed
se050: key_only_id bug fixes
1 parent 3330bdc commit cf98494

3 files changed

Lines changed: 69 additions & 12 deletions

File tree

wolfcrypt/src/port/nxp/se050_port.c

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2806,6 +2806,13 @@ int se050_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key,
28062806
if (public_key->keyIdSet == 0) {
28072807
byte derBuf[SE050_ECC_DER_MAX];
28082808
word32 derSz;
2809+
#ifdef WOLFSSL_SE050_ONLY_KEY_ID
2810+
/* The peer's public key is uploaded for this derivation only and
2811+
* erased afterwards, so it must not occupy SE050 flash. */
2812+
sss_key_object_mode_t pubKeyMode = kKeyObject_Mode_Transient;
2813+
#else
2814+
sss_key_object_mode_t pubKeyMode = kKeyObject_Mode_Persistent;
2815+
#endif
28092816

28102817
ret = wc_EccPublicKeyToDer(public_key, derBuf,
28112818
(word32)sizeof(derBuf), 1);
@@ -2820,7 +2827,7 @@ int se050_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key,
28202827
keyId = se050_allocate_key(SE050_ECC_KEY);
28212828
status = sss_key_object_allocate_handle(&ref_public_key,
28222829
keyId, kSSS_KeyPart_Public, curveType, keySize,
2823-
kKeyObject_Mode_Persistent);
2830+
pubKeyMode);
28242831
}
28252832
if (status == kStatus_SSS_Success) {
28262833
/* Try to delete existing key first, ignore return since will
@@ -2877,8 +2884,18 @@ int se050_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key,
28772884
}
28782885

28792886
if (status == kStatus_SSS_Success) {
2880-
public_key->keyId = keyId;
2881-
public_key->keyIdSet = 1;
2887+
#ifdef WOLFSSL_SE050_ONLY_KEY_ID
2888+
if (keyCreated) {
2889+
/* The peer's public key was uploaded for this derivation only. */
2890+
sss_key_store_erase_key(&host_keystore, &ref_public_key);
2891+
sss_key_object_free(&ref_public_key);
2892+
}
2893+
else
2894+
#endif
2895+
{
2896+
public_key->keyId = keyId;
2897+
public_key->keyIdSet = 1;
2898+
}
28822899
ret = 0;
28832900
}
28842901
else {
@@ -3458,8 +3475,18 @@ int se050_curve25519_shared_secret(curve25519_key* private_key,
34583475
}
34593476

34603477
if (status == kStatus_SSS_Success) {
3461-
public_key->keyId = keyId;
3462-
public_key->keyIdSet = 1;
3478+
#ifdef WOLFSSL_SE050_ONLY_KEY_ID
3479+
if (keyCreated) {
3480+
/* The peer's public key was uploaded for this derivation only.*/
3481+
sss_key_store_erase_key(&host_keystore, &ref_public_key);
3482+
sss_key_object_free(&ref_public_key);
3483+
}
3484+
else
3485+
#endif
3486+
{
3487+
public_key->keyId = keyId;
3488+
public_key->keyIdSet = 1;
3489+
}
34633490
ret = 0;
34643491
}
34653492
else {

wolfcrypt/src/rsa.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5418,7 +5418,8 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
54185418
int err;
54195419

54205420
#if !defined(WOLFSSL_CRYPTOCELL) && \
5421-
(!defined(WOLFSSL_SE050) || defined(WOLFSSL_SE050_NO_RSA)) && \
5421+
(!defined(WOLFSSL_SE050) || defined(WOLFSSL_SE050_NO_RSA) || \
5422+
defined(WOLFSSL_SE050_ONLY_KEY_ID)) && \
54225423
!defined(WOLF_CRYPTO_CB_ONLY_RSA) && \
54235424
!defined(WOLFSSL_MICROCHIP_TA100) && \
54245425
!defined(WOLFSSL_SMALL_STACK) && defined(WOLFSSL_CHECK_MEM_ZERO)

wolfcrypt/test/test.c

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30403,9 +30403,9 @@ static wc_test_ret_t rsa_certreq_test(RsaKey* key, RsaKey* keypub,
3040330403
* WOLFSSL_CERT_REQ && !WOLFSSL_NO_MALLOC */
3040430404

3040530405
#if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_ONLY_KEY_ID) && \
30406-
!defined(WOLFSSL_SE050_NO_RSA) && !defined(WOLFSSL_SE050_NO_RSA_VERIFY) && \
30407-
!defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) && \
30408-
!defined(WOLFSSL_RSA_VERIFY_ONLY)
30406+
defined(WOLFSSL_KEY_GEN) && !defined(WOLFSSL_SE050_NO_RSA) && \
30407+
!defined(WOLFSSL_SE050_NO_RSA_VERIFY) && !defined(WOLFSSL_NO_MALLOC) && \
30408+
!defined(WOLFSSL_RSA_PUBLIC_ONLY) && !defined(WOLFSSL_RSA_VERIFY_ONLY)
3040930409

3041030410
/* SE050 key ID for the ONLY_KEY_ID RSA test. Must be < SE050_KEYID_START. */
3041130411
#define SE050_ONLYKEYID_TEST_RSA_ID 51
@@ -30438,6 +30438,15 @@ static wc_test_ret_t rsa_se050_onlykeyid_test(WC_RNG* rng)
3043830438
return WC_TEST_RET_ENC_EC(ret);
3043930439
swInit = 1;
3044030440

30441+
/* An invalid key size must fail cleanly. This drives the early 'goto out'
30442+
* cleanup in wc_MakeRsaKey(), which under WOLFSSL_CHECK_MEM_ZERO must not
30443+
* scan the never-initialized stack temporaries. */
30444+
ret = wc_MakeRsaKey(&swKey, 0, WC_RSA_EXPONENT, rng);
30445+
if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) {
30446+
ret = WC_TEST_RET_ENC_NC;
30447+
goto done;
30448+
}
30449+
3044130450
/* Key generation must produce a software key (keyIdSet == 0). */
3044230451
ret = wc_MakeRsaKey(&swKey, 2048, WC_RSA_EXPONENT, rng);
3044330452
if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); goto done; }
@@ -30878,9 +30887,9 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t rsa_test(void)
3087830887
#endif
3087930888

3088030889
#if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_ONLY_KEY_ID) && \
30881-
!defined(WOLFSSL_SE050_NO_RSA) && !defined(WOLFSSL_SE050_NO_RSA_VERIFY) && \
30882-
!defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) && \
30883-
!defined(WOLFSSL_RSA_VERIFY_ONLY)
30890+
defined(WOLFSSL_KEY_GEN) && !defined(WOLFSSL_SE050_NO_RSA) && \
30891+
!defined(WOLFSSL_SE050_NO_RSA_VERIFY) && !defined(WOLFSSL_NO_MALLOC) && \
30892+
!defined(WOLFSSL_RSA_PUBLIC_ONLY) && !defined(WOLFSSL_RSA_VERIFY_ONLY)
3088430893
ret = rsa_se050_onlykeyid_test(&rng);
3088530894
if (ret != 0) {
3088630895
printf("rsa_se050_onlykeyid_test failed!\n");
@@ -43985,6 +43994,20 @@ static wc_test_ret_t ecc_se050_onlykeyid_test(WC_RNG* rng)
4398543994
if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); goto done; }
4398643995
if (verify != 1) { ret = WC_TEST_RET_ENC_NC; goto done; }
4398743996

43997+
/* A corrupted signature must be rejected on the hardware route. The SE050
43998+
* port reports a failed hardware verify as WC_HW_E with res still 0 (the
43999+
* SSS API does not distinguish a bad signature from an operation failure),
44000+
* matching the always-offload SE050 build's error mapping. */
44001+
sigHw[10] ^= 0x01;
44002+
verify = 1;
44003+
ret = wc_ecc_verify_hash(sigHw, sigHwSz, hash, (word32)sizeof(hash),
44004+
&verify, &hwKey);
44005+
sigHw[10] ^= 0x01;
44006+
if (ret != WC_NO_ERR_TRACE(WC_HW_E) || verify != 0) {
44007+
ret = WC_TEST_RET_ENC_NC; goto done;
44008+
}
44009+
ret = 0;
44010+
4398844011
#if defined(HAVE_ECC_DHE) && !defined(WOLFSSL_SE050_NO_ECDHE)
4398944012
{
4399044013
/* ECDH with the software key must match ECDH with the same key after it
@@ -44012,6 +44035,12 @@ static wc_test_ret_t ecc_se050_onlykeyid_test(WC_RNG* rng)
4401244035
ret = wc_ecc_shared_secret(&hwKey, &peer, secretHw, &secretHwSz);
4401344036
if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); goto ecdh_done; }
4401444037

44038+
/* The peer was and must remain a software key (keyIdSet == 0) */
44039+
if (peer.keyIdSet != 0) {
44040+
ret = WC_TEST_RET_ENC_NC;
44041+
goto ecdh_done;
44042+
}
44043+
4401544044
if (secretSwSz != secretHwSz ||
4401644045
XMEMCMP(secretSw, secretHw, secretSwSz) != 0) {
4401744046
ret = WC_TEST_RET_ENC_NC;

0 commit comments

Comments
 (0)