Skip to content

Commit 4fe873f

Browse files
committed
Add setkey/exportkey/eccgetsize test coverage in api.c
1 parent 6841231 commit 4fe873f

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

Comments
 (0)