@@ -120,12 +120,12 @@ static int stsafe_get_key_size(stsafe_curve_id_t curve_id)
120120{
121121 switch (curve_id ) {
122122 case STSAFE_ECC_CURVE_P256 :
123- #ifdef STSAFE_ECC_CURVE_BP256
123+ #if defined( HAVE_ECC_BRAINPOOL ) && defined( STSE_CONF_ECC_BRAINPOOL_P_256 )
124124 case STSAFE_ECC_CURVE_BP256 :
125125 #endif
126126 return 32 ;
127127 case STSAFE_ECC_CURVE_P384 :
128- #ifdef STSAFE_ECC_CURVE_BP384
128+ #if defined( HAVE_ECC_BRAINPOOL ) && defined( STSE_CONF_ECC_BRAINPOOL_P_384 )
129129 case STSAFE_ECC_CURVE_BP384 :
130130 #endif
131131 return 48 ;
@@ -145,11 +145,11 @@ static stsafe_curve_id_t stsafe_get_ecc_curve_id(int ecc_curve)
145145 return STSAFE_ECC_CURVE_P256 ;
146146 case ECC_SECP384R1 :
147147 return STSAFE_ECC_CURVE_P384 ;
148- #if defined(HAVE_ECC_BRAINPOOL ) && defined(STSAFE_ECC_CURVE_BP256 )
148+ #if defined(HAVE_ECC_BRAINPOOL ) && defined(STSE_CONF_ECC_BRAINPOOL_P_256 )
149149 case ECC_BRAINPOOLP256R1 :
150150 return STSAFE_ECC_CURVE_BP256 ;
151151 #endif
152- #if defined(HAVE_ECC_BRAINPOOL ) && defined(STSAFE_ECC_CURVE_BP384 )
152+ #if defined(HAVE_ECC_BRAINPOOL ) && defined(STSE_CONF_ECC_BRAINPOOL_P_384 )
153153 case ECC_BRAINPOOLP384R1 :
154154 return STSAFE_ECC_CURVE_BP384 ;
155155 #endif
@@ -170,11 +170,11 @@ static int stsafe_get_ecc_curve(stsafe_curve_id_t curve_id)
170170 return ECC_SECP256R1 ;
171171 case STSAFE_ECC_CURVE_P384 :
172172 return ECC_SECP384R1 ;
173- #if defined(HAVE_ECC_BRAINPOOL ) && defined(STSAFE_ECC_CURVE_BP256 )
173+ #if defined(HAVE_ECC_BRAINPOOL ) && defined(STSE_CONF_ECC_BRAINPOOL_P_256 )
174174 case STSAFE_ECC_CURVE_BP256 :
175175 return ECC_BRAINPOOLP256R1 ;
176176 #endif
177- #if defined(HAVE_ECC_BRAINPOOL ) && defined(STSAFE_ECC_CURVE_BP384 )
177+ #if defined(HAVE_ECC_BRAINPOOL ) && defined(STSE_CONF_ECC_BRAINPOOL_P_384 )
178178 case STSAFE_ECC_CURVE_BP384 :
179179 return ECC_BRAINPOOLP384R1 ;
180180 #endif
@@ -413,13 +413,25 @@ static int stsafe_shared_secret(stsafe_slot_t slot, stsafe_curve_id_t curve_id,
413413 int rc = STSAFE_A_OK ;
414414 stse_ReturnCode_t ret ;
415415 int key_sz = stsafe_get_key_size (curve_id );
416+ #if defined(WOLFSSL_SMALL_STACK ) && !defined(WOLFSSL_NO_MALLOC )
417+ uint8_t * peerPubKey = NULL ;
418+ #else
416419 uint8_t peerPubKey [STSAFE_MAX_PUBKEY_RAW_LEN ];
420+ #endif
417421
418422 if (pPubKeyX == NULL || pPubKeyY == NULL || pSharedSecret == NULL ||
419423 pSharedSecretLen == NULL ) {
420424 return BAD_FUNC_ARG ;
421425 }
422426
427+ #if defined(WOLFSSL_SMALL_STACK ) && !defined(WOLFSSL_NO_MALLOC )
428+ peerPubKey = (uint8_t * )XMALLOC (STSAFE_MAX_PUBKEY_RAW_LEN , NULL ,
429+ DYNAMIC_TYPE_TMP_BUFFER );
430+ if (peerPubKey == NULL ) {
431+ return MEMORY_E ;
432+ }
433+ #endif
434+
423435 /* Combine peer X and Y (X||Y format) */
424436 XMEMCPY (peerPubKey , pPubKeyX , key_sz );
425437 XMEMCPY (peerPubKey + key_sz , pPubKeyY , key_sz );
@@ -441,6 +453,10 @@ static int stsafe_shared_secret(stsafe_slot_t slot, stsafe_curve_id_t curve_id,
441453 * pSharedSecretLen = (int32_t )key_sz ;
442454 }
443455
456+ #if defined(WOLFSSL_SMALL_STACK ) && !defined(WOLFSSL_NO_MALLOC )
457+ XFREE (peerPubKey , NULL , DYNAMIC_TYPE_TMP_BUFFER );
458+ #endif
459+
444460 return rc ;
445461}
446462
@@ -458,13 +474,25 @@ static int stsafe_shared_secret_ecdhe(stsafe_curve_id_t curve_id,
458474 int rc = STSAFE_A_OK ;
459475 stse_ReturnCode_t ret ;
460476 int key_sz = stsafe_get_key_size (curve_id );
477+ #if defined(WOLFSSL_SMALL_STACK ) && !defined(WOLFSSL_NO_MALLOC )
478+ uint8_t * peerPubKey = NULL ;
479+ #else
461480 uint8_t peerPubKey [STSAFE_MAX_PUBKEY_RAW_LEN ];
481+ #endif
462482
463483 if (pPubKeyX == NULL || pPubKeyY == NULL || pSharedSecret == NULL ||
464484 pSharedSecretLen == NULL || key_sz == 0 ) {
465485 return BAD_FUNC_ARG ;
466486 }
467487
488+ #if defined(WOLFSSL_SMALL_STACK ) && !defined(WOLFSSL_NO_MALLOC )
489+ peerPubKey = (uint8_t * )XMALLOC (STSAFE_MAX_PUBKEY_RAW_LEN , NULL ,
490+ DYNAMIC_TYPE_TMP_BUFFER );
491+ if (peerPubKey == NULL ) {
492+ return MEMORY_E ;
493+ }
494+ #endif
495+
468496 /* Combine peer X and Y (X||Y format) */
469497 XMEMCPY (peerPubKey , pPubKeyX , key_sz );
470498 XMEMCPY (peerPubKey + key_sz , pPubKeyY , key_sz );
@@ -483,6 +511,10 @@ static int stsafe_shared_secret_ecdhe(stsafe_curve_id_t curve_id,
483511 * pSharedSecretLen = (int32_t )key_sz ;
484512 }
485513
514+ #if defined(WOLFSSL_SMALL_STACK ) && !defined(WOLFSSL_NO_MALLOC )
515+ XFREE (peerPubKey , NULL , DYNAMIC_TYPE_TMP_BUFFER );
516+ #endif
517+
486518 return rc ;
487519}
488520
@@ -1820,7 +1852,14 @@ int wolfSSL_STSAFE_CryptoDevCb(int devId, wc_CryptoInfo* info, void* ctx)
18201852 curve_id = stsafe_get_ecc_curve_id (ecc_curve );
18211853 /* Note: STSAFE_ECC_CURVE_P256 is 0, so we can't use STSAFE_DEFAULT_CURVE check.
18221854 * Instead, verify the curve_id is valid by checking it's one of the supported curves */
1823- if (curve_id != STSAFE_ECC_CURVE_P256 && curve_id != STSAFE_ECC_CURVE_P384 ) {
1855+ if (curve_id != STSAFE_ECC_CURVE_P256 && curve_id != STSAFE_ECC_CURVE_P384
1856+ #if defined(HAVE_ECC_BRAINPOOL ) && defined(STSE_CONF_ECC_BRAINPOOL_P_256 )
1857+ & & curve_id != STSAFE_ECC_CURVE_BP256
1858+ #endif
1859+ #if defined(HAVE_ECC_BRAINPOOL ) && defined(STSE_CONF_ECC_BRAINPOOL_P_384 )
1860+ & & curve_id != STSAFE_ECC_CURVE_BP384
1861+ #endif
1862+ ) {
18241863 rc = BAD_FUNC_ARG ;
18251864 }
18261865 }
@@ -1873,35 +1912,52 @@ int wolfSSL_STSAFE_CryptoDevCb(int devId, wc_CryptoInfo* info, void* ctx)
18731912 * existing key in ephemeral slot, so for bidirectional ECDH, both keys
18741913 * should be generated in ephemeral slot from the start. */
18751914 stse_ReturnCode_t ret ;
1915+ #if defined(WOLFSSL_SMALL_STACK ) && !defined(WOLFSSL_NO_MALLOC )
1916+ byte * ephemeralPubKey = NULL ;
1917+ #else
18761918 byte ephemeralPubKey [STSAFE_MAX_PUBKEY_RAW_LEN ];
1919+ #endif
18771920 int key_sz = stsafe_get_key_size (curve_id );
18781921 slot = STSAFE_KEY_SLOT_EPHEMERAL ;
18791922
1880- ret = stse_generate_ecc_key_pair (& g_stse_handler , slot ,
1881- (stse_ecc_key_type_t )curve_id ,
1882- STSAFE_EPHEMERAL_KEY_USAGE_LIMIT ,
1883- ephemeralPubKey );
1884- if (ret != STSE_OK ) {
1885- STSAFE_INTERFACE_PRINTF ("stse_generate_ecc_key_pair (ephemeral for ECDH) error: %d\n" , ret );
1886- rc = (int )ret ;
1887- } else {
1888- WOLFSSL_MSG ("STSAFE: Generated ephemeral key for ECDH" );
1889- /* Update devCtx to reflect ephemeral slot for this key */
1890- if (info -> pk .ecdh .private_key != NULL ) {
1891- info -> pk .ecdh .private_key -> devCtx = STSAFE_SLOT_TO_DEVCXT (slot );
1892- }
1893- /* Update the public key in the key structure to match the new ephemeral key */
1894- if (info -> pk .ecdh .private_key != NULL && rc == 0 ) {
1895- void * saved_devCtx = info -> pk .ecdh .private_key -> devCtx ;
1896- rc = wc_ecc_import_unsigned (info -> pk .ecdh .private_key ,
1897- ephemeralPubKey , & ephemeralPubKey [key_sz ],
1898- NULL , ecc_curve );
1899- /* Restore devCtx in case import cleared it */
1900- if (saved_devCtx != NULL && info -> pk .ecdh .private_key -> devCtx != saved_devCtx ) {
1901- info -> pk .ecdh .private_key -> devCtx = saved_devCtx ;
1923+ #if defined(WOLFSSL_SMALL_STACK ) && !defined(WOLFSSL_NO_MALLOC )
1924+ ephemeralPubKey = (byte * )XMALLOC (STSAFE_MAX_PUBKEY_RAW_LEN , NULL ,
1925+ DYNAMIC_TYPE_TMP_BUFFER );
1926+ if (ephemeralPubKey == NULL ) {
1927+ rc = MEMORY_E ;
1928+ }
1929+ #endif
1930+
1931+ if (rc == 0 ) {
1932+ ret = stse_generate_ecc_key_pair (& g_stse_handler , slot ,
1933+ (stse_ecc_key_type_t )curve_id ,
1934+ STSAFE_EPHEMERAL_KEY_USAGE_LIMIT ,
1935+ ephemeralPubKey );
1936+ if (ret != STSE_OK ) {
1937+ STSAFE_INTERFACE_PRINTF ("stse_generate_ecc_key_pair (ephemeral for ECDH) error: %d\n" , ret );
1938+ rc = (int )ret ;
1939+ } else {
1940+ WOLFSSL_MSG ("STSAFE: Generated ephemeral key for ECDH" );
1941+ /* Update devCtx to reflect ephemeral slot for this key */
1942+ if (info -> pk .ecdh .private_key != NULL ) {
1943+ info -> pk .ecdh .private_key -> devCtx = STSAFE_SLOT_TO_DEVCXT (slot );
1944+ }
1945+ /* Update the public key in the key structure to match the new ephemeral key */
1946+ if (info -> pk .ecdh .private_key != NULL && rc == 0 ) {
1947+ void * saved_devCtx = info -> pk .ecdh .private_key -> devCtx ;
1948+ rc = wc_ecc_import_unsigned (info -> pk .ecdh .private_key ,
1949+ ephemeralPubKey , & ephemeralPubKey [key_sz ],
1950+ NULL , ecc_curve );
1951+ /* Restore devCtx in case import cleared it */
1952+ if (saved_devCtx != NULL && info -> pk .ecdh .private_key -> devCtx != saved_devCtx ) {
1953+ info -> pk .ecdh .private_key -> devCtx = saved_devCtx ;
1954+ }
19021955 }
19031956 }
19041957 }
1958+ #if defined(WOLFSSL_SMALL_STACK ) && !defined(WOLFSSL_NO_MALLOC )
1959+ XFREE (ephemeralPubKey , NULL , DYNAMIC_TYPE_TMP_BUFFER );
1960+ #endif
19051961#else /* WOLFSSL_STSAFEA100 */
19061962 /* For A100/A110, ephemeral key generation in ECDH callback
19071963 * is not supported. Keys must be generated in ephemeral slot
0 commit comments