@@ -27740,6 +27740,35 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2774027740 ret, *info->pk.eccsign.outlen);
2774127741 #endif
2774227742 }
27743+ else if (info->pk.type == WC_PK_TYPE_EC_GET_SIZE) {
27744+ WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27745+ WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27746+ if (!WC_VAR_OK(tmpEcc)) {
27747+ ret = MEMORY_E;
27748+ }
27749+ else {
27750+ XMEMCPY(tmpEcc, info->pk.ecc_get_size.key, sizeof(ecc_key));
27751+ tmpEcc->devId = INVALID_DEVID;
27752+ *info->pk.ecc_get_size.keySize = wc_ecc_size(tmpEcc);
27753+ WC_FREE_VAR(tmpEcc, NULL);
27754+ ret = 0;
27755+ }
27756+ }
27757+ else if (info->pk.type == WC_PK_TYPE_EC_GET_SIG_SIZE) {
27758+ WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27759+ WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27760+ if (!WC_VAR_OK(tmpEcc)) {
27761+ ret = MEMORY_E;
27762+ }
27763+ else {
27764+ XMEMCPY(tmpEcc, info->pk.ecc_get_sig_size.key,
27765+ sizeof(ecc_key));
27766+ tmpEcc->devId = INVALID_DEVID;
27767+ *info->pk.ecc_get_sig_size.sigSize = wc_ecc_sig_size(tmpEcc);
27768+ WC_FREE_VAR(tmpEcc, NULL);
27769+ ret = 0;
27770+ }
27771+ }
2774327772 #endif /* HAVE_ECC */
2774427773 #ifdef HAVE_ED25519
2774527774 if (info->pk.type == WC_PK_TYPE_ED25519_SIGN) {
@@ -28165,39 +28194,75 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2816528194 {
2816628195 ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2816728196 ecc_key* eccTmp = (ecc_key*)info->setkey.key;
28168- byte buf[ECC_BUFSIZE];
28169- word32 bufSz = sizeof(buf);
28197+ word32 bufSz = ECC_BUFSIZE;
2817028198 int curveId;
28199+ WC_DECLARE_VAR(buf, byte, ECC_BUFSIZE, NULL);
28200+ WC_ALLOC_VAR(buf, byte, ECC_BUFSIZE, NULL);
28201+ if (!WC_VAR_OK(buf)) {
28202+ ret = MEMORY_E;
28203+ break;
28204+ }
2817128205
2817228206 ret = wc_ecc_export_x963(eccTmp, buf, &bufSz);
28173- if (ret != 0) break;
28207+ if (ret != 0) {
28208+ WC_FREE_VAR(buf, NULL);
28209+ break;
28210+ }
2817428211
2817528212 curveId = wc_ecc_get_curve_id(eccTmp->idx);
2817628213 eccObj->devId = INVALID_DEVID;
2817728214 ret = wc_ecc_import_x963_ex2(buf, bufSz, eccObj, curveId, 0);
2817828215 eccObj->devId = thisDevId;
28216+
28217+ WC_FREE_VAR(buf, NULL);
2817928218 break;
2818028219 }
2818128220 case WC_SETKEY_ECC_PRIV:
2818228221 {
2818328222 ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2818428223 ecc_key* eccTmp = (ecc_key*)info->setkey.key;
28185- byte pubBuf[ECC_BUFSIZE];
28186- byte privBuf[MAX_ECC_BYTES];
28187- word32 pubSz = sizeof(pubBuf);
28188- word32 privSz = sizeof(privBuf);
28224+ word32 pubSz = ECC_BUFSIZE;
28225+ word32 privSz = MAX_ECC_BYTES;
28226+ byte* pubPtr = NULL;
2818928227 int curveId;
28228+ WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28229+ WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28230+ WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28231+ WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28232+ if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28233+ WC_FREE_VAR(pubBuf, NULL);
28234+ WC_FREE_VAR(privBuf, NULL);
28235+ ret = MEMORY_E;
28236+ break;
28237+ }
28238+
28239+ /* Export public key from temp (if available) */
28240+ if (eccTmp->type != ECC_PRIVATEKEY_ONLY) {
28241+ ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
28242+ if (ret != 0) {
28243+ WC_FREE_VAR(pubBuf, NULL);
28244+ WC_FREE_VAR(privBuf, NULL);
28245+ break;
28246+ }
28247+ pubPtr = pubBuf;
28248+ }
2819028249
28191- ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
28192- if (ret != 0) break;
2819328250 ret = wc_ecc_export_private_only(eccTmp, privBuf, &privSz);
28194- if (ret != 0) break;
28251+ if (ret != 0) {
28252+ WC_FREE_VAR(pubBuf, NULL);
28253+ WC_FREE_VAR(privBuf, NULL);
28254+ break;
28255+ }
2819528256
2819628257 curveId = wc_ecc_get_curve_id(eccTmp->idx);
2819728258 eccObj->devId = INVALID_DEVID;
2819828259 ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28199- pubBuf, pubSz, eccObj, curveId);
28260+ pubPtr, (pubPtr != NULL) ? pubSz : 0,
28261+ eccObj, curveId);
2820028262 eccObj->devId = thisDevId;
28263+
28264+ WC_FREE_VAR(pubBuf, NULL);
28265+ WC_FREE_VAR(privBuf, NULL);
2820128266 break;
2820228267 }
2820328268 #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
@@ -28207,6 +28272,123 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2820728272 }
2820828273 }
2820928274#endif /* WOLF_CRYPTO_CB_SETKEY */
28275+ #ifdef WOLF_CRYPTO_CB_EXPORT_KEY
28276+ else if (info->algo_type == WC_ALGO_TYPE_EXPORT_KEY) {
28277+ #ifdef DEBUG_WOLFSSL
28278+ fprintf(stderr, "test_CryptoCb_Func: ExportKey Type=%d\n",
28279+ info->export_key.type);
28280+ #endif
28281+ switch (info->export_key.type) {
28282+ #if !defined(NO_RSA) && defined(WOLFSSL_KEY_TO_DER)
28283+ case WC_PK_TYPE_RSA:
28284+ {
28285+ RsaKey* src = (RsaKey*)info->export_key.obj;
28286+ RsaKey* dst = (RsaKey*)info->export_key.out;
28287+ int derSz;
28288+ word32 idx = 0;
28289+ byte* der = NULL;
28290+
28291+ /* Try private key export first, fall back to public */
28292+ derSz = wc_RsaKeyToDer(src, NULL, 0);
28293+ if (derSz > 0) {
28294+ der = (byte*)XMALLOC(derSz, NULL,
28295+ DYNAMIC_TYPE_TMP_BUFFER);
28296+ if (der == NULL) { ret = MEMORY_E; break; }
28297+ derSz = wc_RsaKeyToDer(src, der, (word32)derSz);
28298+ if (derSz > 0) {
28299+ ret = wc_RsaPrivateKeyDecode(der, &idx, dst,
28300+ (word32)derSz);
28301+ }
28302+ else {
28303+ ret = derSz;
28304+ }
28305+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28306+ }
28307+ else {
28308+ /* Public key only */
28309+ derSz = wc_RsaPublicKeyDerSize(src, 1);
28310+ if (derSz <= 0) { ret = derSz; break; }
28311+ der = (byte*)XMALLOC(derSz, NULL,
28312+ DYNAMIC_TYPE_TMP_BUFFER);
28313+ if (der == NULL) { ret = MEMORY_E; break; }
28314+ derSz = wc_RsaKeyToPublicDer_ex(src, der,
28315+ (word32)derSz, 1);
28316+ if (derSz > 0) {
28317+ ret = wc_RsaPublicKeyDecode(der, &idx, dst,
28318+ (word32)derSz);
28319+ }
28320+ else {
28321+ ret = derSz;
28322+ }
28323+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28324+ }
28325+ break;
28326+ }
28327+ #endif /* !NO_RSA && WOLFSSL_KEY_TO_DER */
28328+ #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && \
28329+ defined(HAVE_ECC_KEY_IMPORT)
28330+ case WC_PK_TYPE_ECDSA_SIGN: /* ECC key */
28331+ {
28332+ ecc_key* src = (ecc_key*)info->export_key.obj;
28333+ ecc_key* dst = (ecc_key*)info->export_key.out;
28334+ word32 pubSz = ECC_BUFSIZE;
28335+ word32 privSz = MAX_ECC_BYTES;
28336+ byte* pubPtr = NULL;
28337+ int curveId;
28338+ WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28339+ WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28340+ WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28341+ WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28342+ if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28343+ WC_FREE_VAR(pubBuf, NULL);
28344+ WC_FREE_VAR(privBuf, NULL);
28345+ ret = MEMORY_E;
28346+ break;
28347+ }
28348+
28349+ /* Export public key if available */
28350+ if (src->type != ECC_PRIVATEKEY_ONLY) {
28351+ ret = wc_ecc_export_x963(src, pubBuf, &pubSz);
28352+ if (ret != 0) {
28353+ WC_FREE_VAR(pubBuf, NULL);
28354+ WC_FREE_VAR(privBuf, NULL);
28355+ break;
28356+ }
28357+ pubPtr = pubBuf;
28358+ }
28359+
28360+ /* Export private key if available */
28361+ if (src->type != ECC_PUBLICKEY) {
28362+ ret = wc_ecc_export_private_only(src, privBuf,
28363+ &privSz);
28364+ if (ret != 0) {
28365+ WC_FREE_VAR(pubBuf, NULL);
28366+ WC_FREE_VAR(privBuf, NULL);
28367+ break;
28368+ }
28369+
28370+ curveId = wc_ecc_get_curve_id(src->idx);
28371+ ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28372+ pubPtr, (pubPtr != NULL) ? pubSz : 0,
28373+ dst, curveId);
28374+ }
28375+ else {
28376+ /* Public key only */
28377+ curveId = wc_ecc_get_curve_id(src->idx);
28378+ ret = wc_ecc_import_x963_ex2(pubBuf, pubSz, dst,
28379+ curveId, 0);
28380+ }
28381+ WC_FREE_VAR(pubBuf, NULL);
28382+ WC_FREE_VAR(privBuf, NULL);
28383+ break;
28384+ }
28385+ #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
28386+ default:
28387+ ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
28388+ break;
28389+ }
28390+ }
28391+ #endif /* WOLF_CRYPTO_CB_EXPORT_KEY */
2821028392 (void)thisDevId;
2821128393 (void)keyFormat;
2821228394
0 commit comments