@@ -27479,6 +27479,35 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2747927479 ret, *info->pk.eccsign.outlen);
2748027480 #endif
2748127481 }
27482+ else if (info->pk.type == WC_PK_TYPE_EC_GET_SIZE) {
27483+ WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27484+ WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27485+ if (!WC_VAR_OK(tmpEcc)) {
27486+ ret = MEMORY_E;
27487+ }
27488+ else {
27489+ XMEMCPY(tmpEcc, info->pk.ecc_get_size.key, sizeof(ecc_key));
27490+ tmpEcc->devId = INVALID_DEVID;
27491+ *info->pk.ecc_get_size.keySize = wc_ecc_size(tmpEcc);
27492+ WC_FREE_VAR(tmpEcc, NULL);
27493+ ret = 0;
27494+ }
27495+ }
27496+ else if (info->pk.type == WC_PK_TYPE_EC_GET_SIG_SIZE) {
27497+ WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27498+ WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27499+ if (!WC_VAR_OK(tmpEcc)) {
27500+ ret = MEMORY_E;
27501+ }
27502+ else {
27503+ XMEMCPY(tmpEcc, info->pk.ecc_get_sig_size.key,
27504+ sizeof(ecc_key));
27505+ tmpEcc->devId = INVALID_DEVID;
27506+ *info->pk.ecc_get_sig_size.sigSize = wc_ecc_sig_size(tmpEcc);
27507+ WC_FREE_VAR(tmpEcc, NULL);
27508+ ret = 0;
27509+ }
27510+ }
2748227511 #endif /* HAVE_ECC */
2748327512 #ifdef HAVE_ED25519
2748427513 if (info->pk.type == WC_PK_TYPE_ED25519_SIGN) {
@@ -27904,39 +27933,75 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2790427933 {
2790527934 ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2790627935 ecc_key* eccTmp = (ecc_key*)info->setkey.key;
27907- byte buf[ECC_BUFSIZE];
27908- word32 bufSz = sizeof(buf);
27936+ word32 bufSz = ECC_BUFSIZE;
2790927937 int curveId;
27938+ WC_DECLARE_VAR(buf, byte, ECC_BUFSIZE, NULL);
27939+ WC_ALLOC_VAR(buf, byte, ECC_BUFSIZE, NULL);
27940+ if (!WC_VAR_OK(buf)) {
27941+ ret = MEMORY_E;
27942+ break;
27943+ }
2791027944
2791127945 ret = wc_ecc_export_x963(eccTmp, buf, &bufSz);
27912- if (ret != 0) break;
27946+ if (ret != 0) {
27947+ WC_FREE_VAR(buf, NULL);
27948+ break;
27949+ }
2791327950
2791427951 curveId = wc_ecc_get_curve_id(eccTmp->idx);
2791527952 eccObj->devId = INVALID_DEVID;
2791627953 ret = wc_ecc_import_x963_ex2(buf, bufSz, eccObj, curveId, 0);
2791727954 eccObj->devId = thisDevId;
27955+
27956+ WC_FREE_VAR(buf, NULL);
2791827957 break;
2791927958 }
2792027959 case WC_SETKEY_ECC_PRIV:
2792127960 {
2792227961 ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2792327962 ecc_key* eccTmp = (ecc_key*)info->setkey.key;
27924- byte pubBuf[ECC_BUFSIZE];
27925- byte privBuf[MAX_ECC_BYTES];
27926- word32 pubSz = sizeof(pubBuf);
27927- word32 privSz = sizeof(privBuf);
27963+ word32 pubSz = ECC_BUFSIZE;
27964+ word32 privSz = MAX_ECC_BYTES;
27965+ byte* pubPtr = NULL;
2792827966 int curveId;
27967+ WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
27968+ WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
27969+ WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
27970+ WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
27971+ if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
27972+ WC_FREE_VAR(pubBuf, NULL);
27973+ WC_FREE_VAR(privBuf, NULL);
27974+ ret = MEMORY_E;
27975+ break;
27976+ }
27977+
27978+ /* Export public key from temp (if available) */
27979+ if (eccTmp->type != ECC_PRIVATEKEY_ONLY) {
27980+ ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
27981+ if (ret != 0) {
27982+ WC_FREE_VAR(pubBuf, NULL);
27983+ WC_FREE_VAR(privBuf, NULL);
27984+ break;
27985+ }
27986+ pubPtr = pubBuf;
27987+ }
2792927988
27930- ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
27931- if (ret != 0) break;
2793227989 ret = wc_ecc_export_private_only(eccTmp, privBuf, &privSz);
27933- if (ret != 0) break;
27990+ if (ret != 0) {
27991+ WC_FREE_VAR(pubBuf, NULL);
27992+ WC_FREE_VAR(privBuf, NULL);
27993+ break;
27994+ }
2793427995
2793527996 curveId = wc_ecc_get_curve_id(eccTmp->idx);
2793627997 eccObj->devId = INVALID_DEVID;
2793727998 ret = wc_ecc_import_private_key_ex(privBuf, privSz,
27938- pubBuf, pubSz, eccObj, curveId);
27999+ pubPtr, (pubPtr != NULL) ? pubSz : 0,
28000+ eccObj, curveId);
2793928001 eccObj->devId = thisDevId;
28002+
28003+ WC_FREE_VAR(pubBuf, NULL);
28004+ WC_FREE_VAR(privBuf, NULL);
2794028005 break;
2794128006 }
2794228007 #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
@@ -27946,6 +28011,123 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2794628011 }
2794728012 }
2794828013#endif /* WOLF_CRYPTO_CB_SETKEY */
28014+ #ifdef WOLF_CRYPTO_CB_EXPORT_KEY
28015+ else if (info->algo_type == WC_ALGO_TYPE_EXPORT_KEY) {
28016+ #ifdef DEBUG_WOLFSSL
28017+ fprintf(stderr, "test_CryptoCb_Func: ExportKey Type=%d\n",
28018+ info->export_key.type);
28019+ #endif
28020+ switch (info->export_key.type) {
28021+ #if !defined(NO_RSA) && defined(WOLFSSL_KEY_TO_DER)
28022+ case WC_PK_TYPE_RSA:
28023+ {
28024+ RsaKey* src = (RsaKey*)info->export_key.obj;
28025+ RsaKey* dst = (RsaKey*)info->export_key.out;
28026+ int derSz;
28027+ word32 idx = 0;
28028+ byte* der = NULL;
28029+
28030+ /* Try private key export first, fall back to public */
28031+ derSz = wc_RsaKeyToDer(src, NULL, 0);
28032+ if (derSz > 0) {
28033+ der = (byte*)XMALLOC(derSz, NULL,
28034+ DYNAMIC_TYPE_TMP_BUFFER);
28035+ if (der == NULL) { ret = MEMORY_E; break; }
28036+ derSz = wc_RsaKeyToDer(src, der, (word32)derSz);
28037+ if (derSz > 0) {
28038+ ret = wc_RsaPrivateKeyDecode(der, &idx, dst,
28039+ (word32)derSz);
28040+ }
28041+ else {
28042+ ret = derSz;
28043+ }
28044+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28045+ }
28046+ else {
28047+ /* Public key only */
28048+ derSz = wc_RsaPublicKeyDerSize(src, 1);
28049+ if (derSz <= 0) { ret = derSz; break; }
28050+ der = (byte*)XMALLOC(derSz, NULL,
28051+ DYNAMIC_TYPE_TMP_BUFFER);
28052+ if (der == NULL) { ret = MEMORY_E; break; }
28053+ derSz = wc_RsaKeyToPublicDer_ex(src, der,
28054+ (word32)derSz, 1);
28055+ if (derSz > 0) {
28056+ ret = wc_RsaPublicKeyDecode(der, &idx, dst,
28057+ (word32)derSz);
28058+ }
28059+ else {
28060+ ret = derSz;
28061+ }
28062+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28063+ }
28064+ break;
28065+ }
28066+ #endif /* !NO_RSA && WOLFSSL_KEY_TO_DER */
28067+ #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && \
28068+ defined(HAVE_ECC_KEY_IMPORT)
28069+ case WC_PK_TYPE_ECDSA_SIGN: /* ECC key */
28070+ {
28071+ ecc_key* src = (ecc_key*)info->export_key.obj;
28072+ ecc_key* dst = (ecc_key*)info->export_key.out;
28073+ word32 pubSz = ECC_BUFSIZE;
28074+ word32 privSz = MAX_ECC_BYTES;
28075+ byte* pubPtr = NULL;
28076+ int curveId;
28077+ WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28078+ WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28079+ WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28080+ WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28081+ if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28082+ WC_FREE_VAR(pubBuf, NULL);
28083+ WC_FREE_VAR(privBuf, NULL);
28084+ ret = MEMORY_E;
28085+ break;
28086+ }
28087+
28088+ /* Export public key if available */
28089+ if (src->type != ECC_PRIVATEKEY_ONLY) {
28090+ ret = wc_ecc_export_x963(src, pubBuf, &pubSz);
28091+ if (ret != 0) {
28092+ WC_FREE_VAR(pubBuf, NULL);
28093+ WC_FREE_VAR(privBuf, NULL);
28094+ break;
28095+ }
28096+ pubPtr = pubBuf;
28097+ }
28098+
28099+ /* Export private key if available */
28100+ if (src->type != ECC_PUBLICKEY) {
28101+ ret = wc_ecc_export_private_only(src, privBuf,
28102+ &privSz);
28103+ if (ret != 0) {
28104+ WC_FREE_VAR(pubBuf, NULL);
28105+ WC_FREE_VAR(privBuf, NULL);
28106+ break;
28107+ }
28108+
28109+ curveId = wc_ecc_get_curve_id(src->idx);
28110+ ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28111+ pubPtr, (pubPtr != NULL) ? pubSz : 0,
28112+ dst, curveId);
28113+ }
28114+ else {
28115+ /* Public key only */
28116+ curveId = wc_ecc_get_curve_id(src->idx);
28117+ ret = wc_ecc_import_x963_ex2(pubBuf, pubSz, dst,
28118+ curveId, 0);
28119+ }
28120+ WC_FREE_VAR(pubBuf, NULL);
28121+ WC_FREE_VAR(privBuf, NULL);
28122+ break;
28123+ }
28124+ #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
28125+ default:
28126+ ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
28127+ break;
28128+ }
28129+ }
28130+ #endif /* WOLF_CRYPTO_CB_EXPORT_KEY */
2794928131 (void)thisDevId;
2795028132 (void)keyFormat;
2795128133
0 commit comments