Skip to content

Commit 88a49d5

Browse files
committed
Add setkey/exportkey/eccgetsize test coverage in api.c
1 parent 3284bc5 commit 88a49d5

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
@@ -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

Comments
 (0)