@@ -27961,6 +27961,35 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2796127961 ret, *info->pk.eccsign.outlen);
2796227962 #endif
2796327963 }
27964+ else if (info->pk.type == WC_PK_TYPE_EC_GET_SIZE) {
27965+ WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27966+ WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27967+ if (!WC_VAR_OK(tmpEcc)) {
27968+ ret = MEMORY_E;
27969+ }
27970+ else {
27971+ XMEMCPY(tmpEcc, info->pk.ecc_get_size.key, sizeof(ecc_key));
27972+ tmpEcc->devId = INVALID_DEVID;
27973+ *info->pk.ecc_get_size.keySize = wc_ecc_size(tmpEcc);
27974+ WC_FREE_VAR(tmpEcc, NULL);
27975+ ret = 0;
27976+ }
27977+ }
27978+ else if (info->pk.type == WC_PK_TYPE_EC_GET_SIG_SIZE) {
27979+ WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27980+ WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27981+ if (!WC_VAR_OK(tmpEcc)) {
27982+ ret = MEMORY_E;
27983+ }
27984+ else {
27985+ XMEMCPY(tmpEcc, info->pk.ecc_get_sig_size.key,
27986+ sizeof(ecc_key));
27987+ tmpEcc->devId = INVALID_DEVID;
27988+ *info->pk.ecc_get_sig_size.sigSize = wc_ecc_sig_size(tmpEcc);
27989+ WC_FREE_VAR(tmpEcc, NULL);
27990+ ret = 0;
27991+ }
27992+ }
2796427993 #endif /* HAVE_ECC */
2796527994 #ifdef HAVE_ED25519
2796627995 if (info->pk.type == WC_PK_TYPE_ED25519_SIGN) {
@@ -28386,39 +28415,75 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2838628415 {
2838728416 ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2838828417 ecc_key* eccTmp = (ecc_key*)info->setkey.key;
28389- byte buf[ECC_BUFSIZE];
28390- word32 bufSz = sizeof(buf);
28418+ word32 bufSz = ECC_BUFSIZE;
2839128419 int curveId;
28420+ WC_DECLARE_VAR(buf, byte, ECC_BUFSIZE, NULL);
28421+ WC_ALLOC_VAR(buf, byte, ECC_BUFSIZE, NULL);
28422+ if (!WC_VAR_OK(buf)) {
28423+ ret = MEMORY_E;
28424+ break;
28425+ }
2839228426
2839328427 ret = wc_ecc_export_x963(eccTmp, buf, &bufSz);
28394- if (ret != 0) break;
28428+ if (ret != 0) {
28429+ WC_FREE_VAR(buf, NULL);
28430+ break;
28431+ }
2839528432
2839628433 curveId = wc_ecc_get_curve_id(eccTmp->idx);
2839728434 eccObj->devId = INVALID_DEVID;
2839828435 ret = wc_ecc_import_x963_ex2(buf, bufSz, eccObj, curveId, 0);
2839928436 eccObj->devId = thisDevId;
28437+
28438+ WC_FREE_VAR(buf, NULL);
2840028439 break;
2840128440 }
2840228441 case WC_SETKEY_ECC_PRIV:
2840328442 {
2840428443 ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2840528444 ecc_key* eccTmp = (ecc_key*)info->setkey.key;
28406- byte pubBuf[ECC_BUFSIZE];
28407- byte privBuf[MAX_ECC_BYTES];
28408- word32 pubSz = sizeof(pubBuf);
28409- word32 privSz = sizeof(privBuf);
28445+ word32 pubSz = ECC_BUFSIZE;
28446+ word32 privSz = MAX_ECC_BYTES;
28447+ byte* pubPtr = NULL;
2841028448 int curveId;
28449+ WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28450+ WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28451+ WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28452+ WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28453+ if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28454+ WC_FREE_VAR(pubBuf, NULL);
28455+ WC_FREE_VAR(privBuf, NULL);
28456+ ret = MEMORY_E;
28457+ break;
28458+ }
28459+
28460+ /* Export public key from temp (if available) */
28461+ if (eccTmp->type != ECC_PRIVATEKEY_ONLY) {
28462+ ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
28463+ if (ret != 0) {
28464+ WC_FREE_VAR(pubBuf, NULL);
28465+ WC_FREE_VAR(privBuf, NULL);
28466+ break;
28467+ }
28468+ pubPtr = pubBuf;
28469+ }
2841128470
28412- ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
28413- if (ret != 0) break;
2841428471 ret = wc_ecc_export_private_only(eccTmp, privBuf, &privSz);
28415- if (ret != 0) break;
28472+ if (ret != 0) {
28473+ WC_FREE_VAR(pubBuf, NULL);
28474+ WC_FREE_VAR(privBuf, NULL);
28475+ break;
28476+ }
2841628477
2841728478 curveId = wc_ecc_get_curve_id(eccTmp->idx);
2841828479 eccObj->devId = INVALID_DEVID;
2841928480 ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28420- pubBuf, pubSz, eccObj, curveId);
28481+ pubPtr, (pubPtr != NULL) ? pubSz : 0,
28482+ eccObj, curveId);
2842128483 eccObj->devId = thisDevId;
28484+
28485+ WC_FREE_VAR(pubBuf, NULL);
28486+ WC_FREE_VAR(privBuf, NULL);
2842228487 break;
2842328488 }
2842428489 #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
@@ -28428,6 +28493,123 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2842828493 }
2842928494 }
2843028495#endif /* WOLF_CRYPTO_CB_SETKEY */
28496+ #ifdef WOLF_CRYPTO_CB_EXPORT_KEY
28497+ else if (info->algo_type == WC_ALGO_TYPE_EXPORT_KEY) {
28498+ #ifdef DEBUG_WOLFSSL
28499+ fprintf(stderr, "test_CryptoCb_Func: ExportKey Type=%d\n",
28500+ info->export_key.type);
28501+ #endif
28502+ switch (info->export_key.type) {
28503+ #if !defined(NO_RSA) && defined(WOLFSSL_KEY_TO_DER)
28504+ case WC_PK_TYPE_RSA:
28505+ {
28506+ RsaKey* src = (RsaKey*)info->export_key.obj;
28507+ RsaKey* dst = (RsaKey*)info->export_key.out;
28508+ int derSz;
28509+ word32 idx = 0;
28510+ byte* der = NULL;
28511+
28512+ /* Try private key export first, fall back to public */
28513+ derSz = wc_RsaKeyToDer(src, NULL, 0);
28514+ if (derSz > 0) {
28515+ der = (byte*)XMALLOC(derSz, NULL,
28516+ DYNAMIC_TYPE_TMP_BUFFER);
28517+ if (der == NULL) { ret = MEMORY_E; break; }
28518+ derSz = wc_RsaKeyToDer(src, der, (word32)derSz);
28519+ if (derSz > 0) {
28520+ ret = wc_RsaPrivateKeyDecode(der, &idx, dst,
28521+ (word32)derSz);
28522+ }
28523+ else {
28524+ ret = derSz;
28525+ }
28526+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28527+ }
28528+ else {
28529+ /* Public key only */
28530+ derSz = wc_RsaPublicKeyDerSize(src, 1);
28531+ if (derSz <= 0) { ret = derSz; break; }
28532+ der = (byte*)XMALLOC(derSz, NULL,
28533+ DYNAMIC_TYPE_TMP_BUFFER);
28534+ if (der == NULL) { ret = MEMORY_E; break; }
28535+ derSz = wc_RsaKeyToPublicDer_ex(src, der,
28536+ (word32)derSz, 1);
28537+ if (derSz > 0) {
28538+ ret = wc_RsaPublicKeyDecode(der, &idx, dst,
28539+ (word32)derSz);
28540+ }
28541+ else {
28542+ ret = derSz;
28543+ }
28544+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28545+ }
28546+ break;
28547+ }
28548+ #endif /* !NO_RSA && WOLFSSL_KEY_TO_DER */
28549+ #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && \
28550+ defined(HAVE_ECC_KEY_IMPORT)
28551+ case WC_PK_TYPE_ECDSA_SIGN: /* ECC key */
28552+ {
28553+ ecc_key* src = (ecc_key*)info->export_key.obj;
28554+ ecc_key* dst = (ecc_key*)info->export_key.out;
28555+ word32 pubSz = ECC_BUFSIZE;
28556+ word32 privSz = MAX_ECC_BYTES;
28557+ byte* pubPtr = NULL;
28558+ int curveId;
28559+ WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28560+ WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28561+ WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28562+ WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28563+ if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28564+ WC_FREE_VAR(pubBuf, NULL);
28565+ WC_FREE_VAR(privBuf, NULL);
28566+ ret = MEMORY_E;
28567+ break;
28568+ }
28569+
28570+ /* Export public key if available */
28571+ if (src->type != ECC_PRIVATEKEY_ONLY) {
28572+ ret = wc_ecc_export_x963(src, pubBuf, &pubSz);
28573+ if (ret != 0) {
28574+ WC_FREE_VAR(pubBuf, NULL);
28575+ WC_FREE_VAR(privBuf, NULL);
28576+ break;
28577+ }
28578+ pubPtr = pubBuf;
28579+ }
28580+
28581+ /* Export private key if available */
28582+ if (src->type != ECC_PUBLICKEY) {
28583+ ret = wc_ecc_export_private_only(src, privBuf,
28584+ &privSz);
28585+ if (ret != 0) {
28586+ WC_FREE_VAR(pubBuf, NULL);
28587+ WC_FREE_VAR(privBuf, NULL);
28588+ break;
28589+ }
28590+
28591+ curveId = wc_ecc_get_curve_id(src->idx);
28592+ ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28593+ pubPtr, (pubPtr != NULL) ? pubSz : 0,
28594+ dst, curveId);
28595+ }
28596+ else {
28597+ /* Public key only */
28598+ curveId = wc_ecc_get_curve_id(src->idx);
28599+ ret = wc_ecc_import_x963_ex2(pubBuf, pubSz, dst,
28600+ curveId, 0);
28601+ }
28602+ WC_FREE_VAR(pubBuf, NULL);
28603+ WC_FREE_VAR(privBuf, NULL);
28604+ break;
28605+ }
28606+ #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
28607+ default:
28608+ ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
28609+ break;
28610+ }
28611+ }
28612+ #endif /* WOLF_CRYPTO_CB_EXPORT_KEY */
2843128613 (void)thisDevId;
2843228614 (void)keyFormat;
2843328615
0 commit comments