@@ -27516,6 +27516,35 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2751627516 ret, *info->pk.eccsign.outlen);
2751727517 #endif
2751827518 }
27519+ else if (info->pk.type == WC_PK_TYPE_EC_GET_SIZE) {
27520+ WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27521+ WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27522+ if (!WC_VAR_OK(tmpEcc)) {
27523+ ret = MEMORY_E;
27524+ }
27525+ else {
27526+ XMEMCPY(tmpEcc, info->pk.ecc_get_size.key, sizeof(ecc_key));
27527+ tmpEcc->devId = INVALID_DEVID;
27528+ *info->pk.ecc_get_size.keySize = wc_ecc_size(tmpEcc);
27529+ WC_FREE_VAR(tmpEcc, NULL);
27530+ ret = 0;
27531+ }
27532+ }
27533+ else if (info->pk.type == WC_PK_TYPE_EC_GET_SIG_SIZE) {
27534+ WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27535+ WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27536+ if (!WC_VAR_OK(tmpEcc)) {
27537+ ret = MEMORY_E;
27538+ }
27539+ else {
27540+ XMEMCPY(tmpEcc, info->pk.ecc_get_sig_size.key,
27541+ sizeof(ecc_key));
27542+ tmpEcc->devId = INVALID_DEVID;
27543+ *info->pk.ecc_get_sig_size.sigSize = wc_ecc_sig_size(tmpEcc);
27544+ WC_FREE_VAR(tmpEcc, NULL);
27545+ ret = 0;
27546+ }
27547+ }
2751927548 #endif /* HAVE_ECC */
2752027549 #ifdef HAVE_ED25519
2752127550 if (info->pk.type == WC_PK_TYPE_ED25519_SIGN) {
@@ -27941,39 +27970,75 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2794127970 {
2794227971 ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2794327972 ecc_key* eccTmp = (ecc_key*)info->setkey.key;
27944- byte buf[ECC_BUFSIZE];
27945- word32 bufSz = sizeof(buf);
27973+ word32 bufSz = ECC_BUFSIZE;
2794627974 int curveId;
27975+ WC_DECLARE_VAR(buf, byte, ECC_BUFSIZE, NULL);
27976+ WC_ALLOC_VAR(buf, byte, ECC_BUFSIZE, NULL);
27977+ if (!WC_VAR_OK(buf)) {
27978+ ret = MEMORY_E;
27979+ break;
27980+ }
2794727981
2794827982 ret = wc_ecc_export_x963(eccTmp, buf, &bufSz);
27949- if (ret != 0) break;
27983+ if (ret != 0) {
27984+ WC_FREE_VAR(buf, NULL);
27985+ break;
27986+ }
2795027987
2795127988 curveId = wc_ecc_get_curve_id(eccTmp->idx);
2795227989 eccObj->devId = INVALID_DEVID;
2795327990 ret = wc_ecc_import_x963_ex2(buf, bufSz, eccObj, curveId, 0);
2795427991 eccObj->devId = thisDevId;
27992+
27993+ WC_FREE_VAR(buf, NULL);
2795527994 break;
2795627995 }
2795727996 case WC_SETKEY_ECC_PRIV:
2795827997 {
2795927998 ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2796027999 ecc_key* eccTmp = (ecc_key*)info->setkey.key;
27961- byte pubBuf[ECC_BUFSIZE];
27962- byte privBuf[MAX_ECC_BYTES];
27963- word32 pubSz = sizeof(pubBuf);
27964- word32 privSz = sizeof(privBuf);
28000+ word32 pubSz = ECC_BUFSIZE;
28001+ word32 privSz = MAX_ECC_BYTES;
28002+ byte* pubPtr = NULL;
2796528003 int curveId;
28004+ WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28005+ WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28006+ WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28007+ WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28008+ if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28009+ WC_FREE_VAR(pubBuf, NULL);
28010+ WC_FREE_VAR(privBuf, NULL);
28011+ ret = MEMORY_E;
28012+ break;
28013+ }
28014+
28015+ /* Export public key from temp (if available) */
28016+ if (eccTmp->type != ECC_PRIVATEKEY_ONLY) {
28017+ ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
28018+ if (ret != 0) {
28019+ WC_FREE_VAR(pubBuf, NULL);
28020+ WC_FREE_VAR(privBuf, NULL);
28021+ break;
28022+ }
28023+ pubPtr = pubBuf;
28024+ }
2796628025
27967- ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
27968- if (ret != 0) break;
2796928026 ret = wc_ecc_export_private_only(eccTmp, privBuf, &privSz);
27970- if (ret != 0) break;
28027+ if (ret != 0) {
28028+ WC_FREE_VAR(pubBuf, NULL);
28029+ WC_FREE_VAR(privBuf, NULL);
28030+ break;
28031+ }
2797128032
2797228033 curveId = wc_ecc_get_curve_id(eccTmp->idx);
2797328034 eccObj->devId = INVALID_DEVID;
2797428035 ret = wc_ecc_import_private_key_ex(privBuf, privSz,
27975- pubBuf, pubSz, eccObj, curveId);
28036+ pubPtr, (pubPtr != NULL) ? pubSz : 0,
28037+ eccObj, curveId);
2797628038 eccObj->devId = thisDevId;
28039+
28040+ WC_FREE_VAR(pubBuf, NULL);
28041+ WC_FREE_VAR(privBuf, NULL);
2797728042 break;
2797828043 }
2797928044 #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
@@ -27983,6 +28048,123 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2798328048 }
2798428049 }
2798528050#endif /* WOLF_CRYPTO_CB_SETKEY */
28051+ #ifdef WOLF_CRYPTO_CB_EXPORT_KEY
28052+ else if (info->algo_type == WC_ALGO_TYPE_EXPORT_KEY) {
28053+ #ifdef DEBUG_WOLFSSL
28054+ fprintf(stderr, "test_CryptoCb_Func: ExportKey Type=%d\n",
28055+ info->export_key.type);
28056+ #endif
28057+ switch (info->export_key.type) {
28058+ #if !defined(NO_RSA) && defined(WOLFSSL_KEY_TO_DER)
28059+ case WC_PK_TYPE_RSA:
28060+ {
28061+ RsaKey* src = (RsaKey*)info->export_key.obj;
28062+ RsaKey* dst = (RsaKey*)info->export_key.out;
28063+ int derSz;
28064+ word32 idx = 0;
28065+ byte* der = NULL;
28066+
28067+ /* Try private key export first, fall back to public */
28068+ derSz = wc_RsaKeyToDer(src, NULL, 0);
28069+ if (derSz > 0) {
28070+ der = (byte*)XMALLOC(derSz, NULL,
28071+ DYNAMIC_TYPE_TMP_BUFFER);
28072+ if (der == NULL) { ret = MEMORY_E; break; }
28073+ derSz = wc_RsaKeyToDer(src, der, (word32)derSz);
28074+ if (derSz > 0) {
28075+ ret = wc_RsaPrivateKeyDecode(der, &idx, dst,
28076+ (word32)derSz);
28077+ }
28078+ else {
28079+ ret = derSz;
28080+ }
28081+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28082+ }
28083+ else {
28084+ /* Public key only */
28085+ derSz = wc_RsaPublicKeyDerSize(src, 1);
28086+ if (derSz <= 0) { ret = derSz; break; }
28087+ der = (byte*)XMALLOC(derSz, NULL,
28088+ DYNAMIC_TYPE_TMP_BUFFER);
28089+ if (der == NULL) { ret = MEMORY_E; break; }
28090+ derSz = wc_RsaKeyToPublicDer_ex(src, der,
28091+ (word32)derSz, 1);
28092+ if (derSz > 0) {
28093+ ret = wc_RsaPublicKeyDecode(der, &idx, dst,
28094+ (word32)derSz);
28095+ }
28096+ else {
28097+ ret = derSz;
28098+ }
28099+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28100+ }
28101+ break;
28102+ }
28103+ #endif /* !NO_RSA && WOLFSSL_KEY_TO_DER */
28104+ #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && \
28105+ defined(HAVE_ECC_KEY_IMPORT)
28106+ case WC_PK_TYPE_ECDSA_SIGN: /* ECC key */
28107+ {
28108+ ecc_key* src = (ecc_key*)info->export_key.obj;
28109+ ecc_key* dst = (ecc_key*)info->export_key.out;
28110+ word32 pubSz = ECC_BUFSIZE;
28111+ word32 privSz = MAX_ECC_BYTES;
28112+ byte* pubPtr = NULL;
28113+ int curveId;
28114+ WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28115+ WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28116+ WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28117+ WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28118+ if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28119+ WC_FREE_VAR(pubBuf, NULL);
28120+ WC_FREE_VAR(privBuf, NULL);
28121+ ret = MEMORY_E;
28122+ break;
28123+ }
28124+
28125+ /* Export public key if available */
28126+ if (src->type != ECC_PRIVATEKEY_ONLY) {
28127+ ret = wc_ecc_export_x963(src, pubBuf, &pubSz);
28128+ if (ret != 0) {
28129+ WC_FREE_VAR(pubBuf, NULL);
28130+ WC_FREE_VAR(privBuf, NULL);
28131+ break;
28132+ }
28133+ pubPtr = pubBuf;
28134+ }
28135+
28136+ /* Export private key if available */
28137+ if (src->type != ECC_PUBLICKEY) {
28138+ ret = wc_ecc_export_private_only(src, privBuf,
28139+ &privSz);
28140+ if (ret != 0) {
28141+ WC_FREE_VAR(pubBuf, NULL);
28142+ WC_FREE_VAR(privBuf, NULL);
28143+ break;
28144+ }
28145+
28146+ curveId = wc_ecc_get_curve_id(src->idx);
28147+ ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28148+ pubPtr, (pubPtr != NULL) ? pubSz : 0,
28149+ dst, curveId);
28150+ }
28151+ else {
28152+ /* Public key only */
28153+ curveId = wc_ecc_get_curve_id(src->idx);
28154+ ret = wc_ecc_import_x963_ex2(pubBuf, pubSz, dst,
28155+ curveId, 0);
28156+ }
28157+ WC_FREE_VAR(pubBuf, NULL);
28158+ WC_FREE_VAR(privBuf, NULL);
28159+ break;
28160+ }
28161+ #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
28162+ default:
28163+ ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
28164+ break;
28165+ }
28166+ }
28167+ #endif /* WOLF_CRYPTO_CB_EXPORT_KEY */
2798628168 (void)thisDevId;
2798728169 (void)keyFormat;
2798828170
0 commit comments