Skip to content

Commit 6aee6af

Browse files
committed
Add setkey/exportkey/eccgetsize test coverage in api.c
1 parent 724d06d commit 6aee6af

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
@@ -27740,6 +27740,35 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2774027740
ret, *info->pk.eccsign.outlen);
2774127741
#endif
2774227742
}
27743+
else if (info->pk.type == WC_PK_TYPE_EC_GET_SIZE) {
27744+
WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27745+
WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27746+
if (!WC_VAR_OK(tmpEcc)) {
27747+
ret = MEMORY_E;
27748+
}
27749+
else {
27750+
XMEMCPY(tmpEcc, info->pk.ecc_get_size.key, sizeof(ecc_key));
27751+
tmpEcc->devId = INVALID_DEVID;
27752+
*info->pk.ecc_get_size.keySize = wc_ecc_size(tmpEcc);
27753+
WC_FREE_VAR(tmpEcc, NULL);
27754+
ret = 0;
27755+
}
27756+
}
27757+
else if (info->pk.type == WC_PK_TYPE_EC_GET_SIG_SIZE) {
27758+
WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27759+
WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27760+
if (!WC_VAR_OK(tmpEcc)) {
27761+
ret = MEMORY_E;
27762+
}
27763+
else {
27764+
XMEMCPY(tmpEcc, info->pk.ecc_get_sig_size.key,
27765+
sizeof(ecc_key));
27766+
tmpEcc->devId = INVALID_DEVID;
27767+
*info->pk.ecc_get_sig_size.sigSize = wc_ecc_sig_size(tmpEcc);
27768+
WC_FREE_VAR(tmpEcc, NULL);
27769+
ret = 0;
27770+
}
27771+
}
2774327772
#endif /* HAVE_ECC */
2774427773
#ifdef HAVE_ED25519
2774527774
if (info->pk.type == WC_PK_TYPE_ED25519_SIGN) {
@@ -28165,39 +28194,75 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2816528194
{
2816628195
ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2816728196
ecc_key* eccTmp = (ecc_key*)info->setkey.key;
28168-
byte buf[ECC_BUFSIZE];
28169-
word32 bufSz = sizeof(buf);
28197+
word32 bufSz = ECC_BUFSIZE;
2817028198
int curveId;
28199+
WC_DECLARE_VAR(buf, byte, ECC_BUFSIZE, NULL);
28200+
WC_ALLOC_VAR(buf, byte, ECC_BUFSIZE, NULL);
28201+
if (!WC_VAR_OK(buf)) {
28202+
ret = MEMORY_E;
28203+
break;
28204+
}
2817128205

2817228206
ret = wc_ecc_export_x963(eccTmp, buf, &bufSz);
28173-
if (ret != 0) break;
28207+
if (ret != 0) {
28208+
WC_FREE_VAR(buf, NULL);
28209+
break;
28210+
}
2817428211

2817528212
curveId = wc_ecc_get_curve_id(eccTmp->idx);
2817628213
eccObj->devId = INVALID_DEVID;
2817728214
ret = wc_ecc_import_x963_ex2(buf, bufSz, eccObj, curveId, 0);
2817828215
eccObj->devId = thisDevId;
28216+
28217+
WC_FREE_VAR(buf, NULL);
2817928218
break;
2818028219
}
2818128220
case WC_SETKEY_ECC_PRIV:
2818228221
{
2818328222
ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2818428223
ecc_key* eccTmp = (ecc_key*)info->setkey.key;
28185-
byte pubBuf[ECC_BUFSIZE];
28186-
byte privBuf[MAX_ECC_BYTES];
28187-
word32 pubSz = sizeof(pubBuf);
28188-
word32 privSz = sizeof(privBuf);
28224+
word32 pubSz = ECC_BUFSIZE;
28225+
word32 privSz = MAX_ECC_BYTES;
28226+
byte* pubPtr = NULL;
2818928227
int curveId;
28228+
WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28229+
WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28230+
WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28231+
WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28232+
if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28233+
WC_FREE_VAR(pubBuf, NULL);
28234+
WC_FREE_VAR(privBuf, NULL);
28235+
ret = MEMORY_E;
28236+
break;
28237+
}
28238+
28239+
/* Export public key from temp (if available) */
28240+
if (eccTmp->type != ECC_PRIVATEKEY_ONLY) {
28241+
ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
28242+
if (ret != 0) {
28243+
WC_FREE_VAR(pubBuf, NULL);
28244+
WC_FREE_VAR(privBuf, NULL);
28245+
break;
28246+
}
28247+
pubPtr = pubBuf;
28248+
}
2819028249

28191-
ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
28192-
if (ret != 0) break;
2819328250
ret = wc_ecc_export_private_only(eccTmp, privBuf, &privSz);
28194-
if (ret != 0) break;
28251+
if (ret != 0) {
28252+
WC_FREE_VAR(pubBuf, NULL);
28253+
WC_FREE_VAR(privBuf, NULL);
28254+
break;
28255+
}
2819528256

2819628257
curveId = wc_ecc_get_curve_id(eccTmp->idx);
2819728258
eccObj->devId = INVALID_DEVID;
2819828259
ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28199-
pubBuf, pubSz, eccObj, curveId);
28260+
pubPtr, (pubPtr != NULL) ? pubSz : 0,
28261+
eccObj, curveId);
2820028262
eccObj->devId = thisDevId;
28263+
28264+
WC_FREE_VAR(pubBuf, NULL);
28265+
WC_FREE_VAR(privBuf, NULL);
2820128266
break;
2820228267
}
2820328268
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
@@ -28207,6 +28272,123 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2820728272
}
2820828273
}
2820928274
#endif /* WOLF_CRYPTO_CB_SETKEY */
28275+
#ifdef WOLF_CRYPTO_CB_EXPORT_KEY
28276+
else if (info->algo_type == WC_ALGO_TYPE_EXPORT_KEY) {
28277+
#ifdef DEBUG_WOLFSSL
28278+
fprintf(stderr, "test_CryptoCb_Func: ExportKey Type=%d\n",
28279+
info->export_key.type);
28280+
#endif
28281+
switch (info->export_key.type) {
28282+
#if !defined(NO_RSA) && defined(WOLFSSL_KEY_TO_DER)
28283+
case WC_PK_TYPE_RSA:
28284+
{
28285+
RsaKey* src = (RsaKey*)info->export_key.obj;
28286+
RsaKey* dst = (RsaKey*)info->export_key.out;
28287+
int derSz;
28288+
word32 idx = 0;
28289+
byte* der = NULL;
28290+
28291+
/* Try private key export first, fall back to public */
28292+
derSz = wc_RsaKeyToDer(src, NULL, 0);
28293+
if (derSz > 0) {
28294+
der = (byte*)XMALLOC(derSz, NULL,
28295+
DYNAMIC_TYPE_TMP_BUFFER);
28296+
if (der == NULL) { ret = MEMORY_E; break; }
28297+
derSz = wc_RsaKeyToDer(src, der, (word32)derSz);
28298+
if (derSz > 0) {
28299+
ret = wc_RsaPrivateKeyDecode(der, &idx, dst,
28300+
(word32)derSz);
28301+
}
28302+
else {
28303+
ret = derSz;
28304+
}
28305+
XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28306+
}
28307+
else {
28308+
/* Public key only */
28309+
derSz = wc_RsaPublicKeyDerSize(src, 1);
28310+
if (derSz <= 0) { ret = derSz; break; }
28311+
der = (byte*)XMALLOC(derSz, NULL,
28312+
DYNAMIC_TYPE_TMP_BUFFER);
28313+
if (der == NULL) { ret = MEMORY_E; break; }
28314+
derSz = wc_RsaKeyToPublicDer_ex(src, der,
28315+
(word32)derSz, 1);
28316+
if (derSz > 0) {
28317+
ret = wc_RsaPublicKeyDecode(der, &idx, dst,
28318+
(word32)derSz);
28319+
}
28320+
else {
28321+
ret = derSz;
28322+
}
28323+
XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28324+
}
28325+
break;
28326+
}
28327+
#endif /* !NO_RSA && WOLFSSL_KEY_TO_DER */
28328+
#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && \
28329+
defined(HAVE_ECC_KEY_IMPORT)
28330+
case WC_PK_TYPE_ECDSA_SIGN: /* ECC key */
28331+
{
28332+
ecc_key* src = (ecc_key*)info->export_key.obj;
28333+
ecc_key* dst = (ecc_key*)info->export_key.out;
28334+
word32 pubSz = ECC_BUFSIZE;
28335+
word32 privSz = MAX_ECC_BYTES;
28336+
byte* pubPtr = NULL;
28337+
int curveId;
28338+
WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28339+
WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28340+
WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28341+
WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28342+
if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28343+
WC_FREE_VAR(pubBuf, NULL);
28344+
WC_FREE_VAR(privBuf, NULL);
28345+
ret = MEMORY_E;
28346+
break;
28347+
}
28348+
28349+
/* Export public key if available */
28350+
if (src->type != ECC_PRIVATEKEY_ONLY) {
28351+
ret = wc_ecc_export_x963(src, pubBuf, &pubSz);
28352+
if (ret != 0) {
28353+
WC_FREE_VAR(pubBuf, NULL);
28354+
WC_FREE_VAR(privBuf, NULL);
28355+
break;
28356+
}
28357+
pubPtr = pubBuf;
28358+
}
28359+
28360+
/* Export private key if available */
28361+
if (src->type != ECC_PUBLICKEY) {
28362+
ret = wc_ecc_export_private_only(src, privBuf,
28363+
&privSz);
28364+
if (ret != 0) {
28365+
WC_FREE_VAR(pubBuf, NULL);
28366+
WC_FREE_VAR(privBuf, NULL);
28367+
break;
28368+
}
28369+
28370+
curveId = wc_ecc_get_curve_id(src->idx);
28371+
ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28372+
pubPtr, (pubPtr != NULL) ? pubSz : 0,
28373+
dst, curveId);
28374+
}
28375+
else {
28376+
/* Public key only */
28377+
curveId = wc_ecc_get_curve_id(src->idx);
28378+
ret = wc_ecc_import_x963_ex2(pubBuf, pubSz, dst,
28379+
curveId, 0);
28380+
}
28381+
WC_FREE_VAR(pubBuf, NULL);
28382+
WC_FREE_VAR(privBuf, NULL);
28383+
break;
28384+
}
28385+
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
28386+
default:
28387+
ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
28388+
break;
28389+
}
28390+
}
28391+
#endif /* WOLF_CRYPTO_CB_EXPORT_KEY */
2821028392
(void)thisDevId;
2821128393
(void)keyFormat;
2821228394

0 commit comments

Comments
 (0)