Skip to content

Commit 79b0d9f

Browse files
committed
Add setkey/exportkey/eccgetsize test coverage in api.c
1 parent 1295f4f commit 79b0d9f

1 file changed

Lines changed: 193 additions & 11 deletions

File tree

tests/api.c

Lines changed: 193 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)