@@ -27974,6 +27974,35 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2797427974 ret, *info->pk.eccsign.outlen);
2797527975 #endif
2797627976 }
27977+ else if (info->pk.type == WC_PK_TYPE_EC_GET_SIZE) {
27978+ WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27979+ WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27980+ if (!WC_VAR_OK(tmpEcc)) {
27981+ ret = MEMORY_E;
27982+ }
27983+ else {
27984+ XMEMCPY(tmpEcc, info->pk.ecc_get_size.key, sizeof(ecc_key));
27985+ tmpEcc->devId = INVALID_DEVID;
27986+ *info->pk.ecc_get_size.keySize = wc_ecc_size(tmpEcc);
27987+ WC_FREE_VAR(tmpEcc, NULL);
27988+ ret = 0;
27989+ }
27990+ }
27991+ else if (info->pk.type == WC_PK_TYPE_EC_GET_SIG_SIZE) {
27992+ WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27993+ WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27994+ if (!WC_VAR_OK(tmpEcc)) {
27995+ ret = MEMORY_E;
27996+ }
27997+ else {
27998+ XMEMCPY(tmpEcc, info->pk.ecc_get_sig_size.key,
27999+ sizeof(ecc_key));
28000+ tmpEcc->devId = INVALID_DEVID;
28001+ *info->pk.ecc_get_sig_size.sigSize = wc_ecc_sig_size(tmpEcc);
28002+ WC_FREE_VAR(tmpEcc, NULL);
28003+ ret = 0;
28004+ }
28005+ }
2797728006 #endif /* HAVE_ECC */
2797828007 #ifdef HAVE_ED25519
2797928008 if (info->pk.type == WC_PK_TYPE_ED25519_SIGN) {
@@ -28399,39 +28428,75 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2839928428 {
2840028429 ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2840128430 ecc_key* eccTmp = (ecc_key*)info->setkey.key;
28402- byte buf[ECC_BUFSIZE];
28403- word32 bufSz = sizeof(buf);
28431+ word32 bufSz = ECC_BUFSIZE;
2840428432 int curveId;
28433+ WC_DECLARE_VAR(buf, byte, ECC_BUFSIZE, NULL);
28434+ WC_ALLOC_VAR(buf, byte, ECC_BUFSIZE, NULL);
28435+ if (!WC_VAR_OK(buf)) {
28436+ ret = MEMORY_E;
28437+ break;
28438+ }
2840528439
2840628440 ret = wc_ecc_export_x963(eccTmp, buf, &bufSz);
28407- if (ret != 0) break;
28441+ if (ret != 0) {
28442+ WC_FREE_VAR(buf, NULL);
28443+ break;
28444+ }
2840828445
2840928446 curveId = wc_ecc_get_curve_id(eccTmp->idx);
2841028447 eccObj->devId = INVALID_DEVID;
2841128448 ret = wc_ecc_import_x963_ex2(buf, bufSz, eccObj, curveId, 0);
2841228449 eccObj->devId = thisDevId;
28450+
28451+ WC_FREE_VAR(buf, NULL);
2841328452 break;
2841428453 }
2841528454 case WC_SETKEY_ECC_PRIV:
2841628455 {
2841728456 ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2841828457 ecc_key* eccTmp = (ecc_key*)info->setkey.key;
28419- byte pubBuf[ECC_BUFSIZE];
28420- byte privBuf[MAX_ECC_BYTES];
28421- word32 pubSz = sizeof(pubBuf);
28422- word32 privSz = sizeof(privBuf);
28458+ word32 pubSz = ECC_BUFSIZE;
28459+ word32 privSz = MAX_ECC_BYTES;
28460+ byte* pubPtr = NULL;
2842328461 int curveId;
28462+ WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28463+ WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28464+ WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28465+ WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28466+ if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28467+ WC_FREE_VAR(pubBuf, NULL);
28468+ WC_FREE_VAR(privBuf, NULL);
28469+ ret = MEMORY_E;
28470+ break;
28471+ }
28472+
28473+ /* Export public key from temp (if available) */
28474+ if (eccTmp->type != ECC_PRIVATEKEY_ONLY) {
28475+ ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
28476+ if (ret != 0) {
28477+ WC_FREE_VAR(pubBuf, NULL);
28478+ WC_FREE_VAR(privBuf, NULL);
28479+ break;
28480+ }
28481+ pubPtr = pubBuf;
28482+ }
2842428483
28425- ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
28426- if (ret != 0) break;
2842728484 ret = wc_ecc_export_private_only(eccTmp, privBuf, &privSz);
28428- if (ret != 0) break;
28485+ if (ret != 0) {
28486+ WC_FREE_VAR(pubBuf, NULL);
28487+ WC_FREE_VAR(privBuf, NULL);
28488+ break;
28489+ }
2842928490
2843028491 curveId = wc_ecc_get_curve_id(eccTmp->idx);
2843128492 eccObj->devId = INVALID_DEVID;
2843228493 ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28433- pubBuf, pubSz, eccObj, curveId);
28494+ pubPtr, (pubPtr != NULL) ? pubSz : 0,
28495+ eccObj, curveId);
2843428496 eccObj->devId = thisDevId;
28497+
28498+ WC_FREE_VAR(pubBuf, NULL);
28499+ WC_FREE_VAR(privBuf, NULL);
2843528500 break;
2843628501 }
2843728502 #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
@@ -28441,6 +28506,123 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2844128506 }
2844228507 }
2844328508#endif /* WOLF_CRYPTO_CB_SETKEY */
28509+ #ifdef WOLF_CRYPTO_CB_EXPORT_KEY
28510+ else if (info->algo_type == WC_ALGO_TYPE_EXPORT_KEY) {
28511+ #ifdef DEBUG_WOLFSSL
28512+ fprintf(stderr, "test_CryptoCb_Func: ExportKey Type=%d\n",
28513+ info->export_key.type);
28514+ #endif
28515+ switch (info->export_key.type) {
28516+ #if !defined(NO_RSA) && defined(WOLFSSL_KEY_TO_DER)
28517+ case WC_PK_TYPE_RSA:
28518+ {
28519+ RsaKey* src = (RsaKey*)info->export_key.obj;
28520+ RsaKey* dst = (RsaKey*)info->export_key.out;
28521+ int derSz;
28522+ word32 idx = 0;
28523+ byte* der = NULL;
28524+
28525+ /* Try private key export first, fall back to public */
28526+ derSz = wc_RsaKeyToDer(src, NULL, 0);
28527+ if (derSz > 0) {
28528+ der = (byte*)XMALLOC(derSz, NULL,
28529+ DYNAMIC_TYPE_TMP_BUFFER);
28530+ if (der == NULL) { ret = MEMORY_E; break; }
28531+ derSz = wc_RsaKeyToDer(src, der, (word32)derSz);
28532+ if (derSz > 0) {
28533+ ret = wc_RsaPrivateKeyDecode(der, &idx, dst,
28534+ (word32)derSz);
28535+ }
28536+ else {
28537+ ret = derSz;
28538+ }
28539+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28540+ }
28541+ else {
28542+ /* Public key only */
28543+ derSz = wc_RsaPublicKeyDerSize(src, 1);
28544+ if (derSz <= 0) { ret = derSz; break; }
28545+ der = (byte*)XMALLOC(derSz, NULL,
28546+ DYNAMIC_TYPE_TMP_BUFFER);
28547+ if (der == NULL) { ret = MEMORY_E; break; }
28548+ derSz = wc_RsaKeyToPublicDer_ex(src, der,
28549+ (word32)derSz, 1);
28550+ if (derSz > 0) {
28551+ ret = wc_RsaPublicKeyDecode(der, &idx, dst,
28552+ (word32)derSz);
28553+ }
28554+ else {
28555+ ret = derSz;
28556+ }
28557+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28558+ }
28559+ break;
28560+ }
28561+ #endif /* !NO_RSA && WOLFSSL_KEY_TO_DER */
28562+ #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && \
28563+ defined(HAVE_ECC_KEY_IMPORT)
28564+ case WC_PK_TYPE_ECDSA_SIGN: /* ECC key */
28565+ {
28566+ ecc_key* src = (ecc_key*)info->export_key.obj;
28567+ ecc_key* dst = (ecc_key*)info->export_key.out;
28568+ word32 pubSz = ECC_BUFSIZE;
28569+ word32 privSz = MAX_ECC_BYTES;
28570+ byte* pubPtr = NULL;
28571+ int curveId;
28572+ WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28573+ WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28574+ WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28575+ WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28576+ if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28577+ WC_FREE_VAR(pubBuf, NULL);
28578+ WC_FREE_VAR(privBuf, NULL);
28579+ ret = MEMORY_E;
28580+ break;
28581+ }
28582+
28583+ /* Export public key if available */
28584+ if (src->type != ECC_PRIVATEKEY_ONLY) {
28585+ ret = wc_ecc_export_x963(src, pubBuf, &pubSz);
28586+ if (ret != 0) {
28587+ WC_FREE_VAR(pubBuf, NULL);
28588+ WC_FREE_VAR(privBuf, NULL);
28589+ break;
28590+ }
28591+ pubPtr = pubBuf;
28592+ }
28593+
28594+ /* Export private key if available */
28595+ if (src->type != ECC_PUBLICKEY) {
28596+ ret = wc_ecc_export_private_only(src, privBuf,
28597+ &privSz);
28598+ if (ret != 0) {
28599+ WC_FREE_VAR(pubBuf, NULL);
28600+ WC_FREE_VAR(privBuf, NULL);
28601+ break;
28602+ }
28603+
28604+ curveId = wc_ecc_get_curve_id(src->idx);
28605+ ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28606+ pubPtr, (pubPtr != NULL) ? pubSz : 0,
28607+ dst, curveId);
28608+ }
28609+ else {
28610+ /* Public key only */
28611+ curveId = wc_ecc_get_curve_id(src->idx);
28612+ ret = wc_ecc_import_x963_ex2(pubBuf, pubSz, dst,
28613+ curveId, 0);
28614+ }
28615+ WC_FREE_VAR(pubBuf, NULL);
28616+ WC_FREE_VAR(privBuf, NULL);
28617+ break;
28618+ }
28619+ #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
28620+ default:
28621+ ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
28622+ break;
28623+ }
28624+ }
28625+ #endif /* WOLF_CRYPTO_CB_EXPORT_KEY */
2844428626 (void)thisDevId;
2844528627 (void)keyFormat;
2844628628
0 commit comments