Skip to content

Commit ea76f23

Browse files
committed
Add setkey/exportkey/eccgetsize test coverage in api.c
1 parent feca775 commit ea76f23

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
@@ -27961,6 +27961,35 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2796127961
ret, *info->pk.eccsign.outlen);
2796227962
#endif
2796327963
}
27964+
else if (info->pk.type == WC_PK_TYPE_EC_GET_SIZE) {
27965+
WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27966+
WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27967+
if (!WC_VAR_OK(tmpEcc)) {
27968+
ret = MEMORY_E;
27969+
}
27970+
else {
27971+
XMEMCPY(tmpEcc, info->pk.ecc_get_size.key, sizeof(ecc_key));
27972+
tmpEcc->devId = INVALID_DEVID;
27973+
*info->pk.ecc_get_size.keySize = wc_ecc_size(tmpEcc);
27974+
WC_FREE_VAR(tmpEcc, NULL);
27975+
ret = 0;
27976+
}
27977+
}
27978+
else if (info->pk.type == WC_PK_TYPE_EC_GET_SIG_SIZE) {
27979+
WC_DECLARE_VAR(tmpEcc, ecc_key, 1, NULL);
27980+
WC_ALLOC_VAR(tmpEcc, ecc_key, 1, NULL);
27981+
if (!WC_VAR_OK(tmpEcc)) {
27982+
ret = MEMORY_E;
27983+
}
27984+
else {
27985+
XMEMCPY(tmpEcc, info->pk.ecc_get_sig_size.key,
27986+
sizeof(ecc_key));
27987+
tmpEcc->devId = INVALID_DEVID;
27988+
*info->pk.ecc_get_sig_size.sigSize = wc_ecc_sig_size(tmpEcc);
27989+
WC_FREE_VAR(tmpEcc, NULL);
27990+
ret = 0;
27991+
}
27992+
}
2796427993
#endif /* HAVE_ECC */
2796527994
#ifdef HAVE_ED25519
2796627995
if (info->pk.type == WC_PK_TYPE_ED25519_SIGN) {
@@ -28386,39 +28415,75 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2838628415
{
2838728416
ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2838828417
ecc_key* eccTmp = (ecc_key*)info->setkey.key;
28389-
byte buf[ECC_BUFSIZE];
28390-
word32 bufSz = sizeof(buf);
28418+
word32 bufSz = ECC_BUFSIZE;
2839128419
int curveId;
28420+
WC_DECLARE_VAR(buf, byte, ECC_BUFSIZE, NULL);
28421+
WC_ALLOC_VAR(buf, byte, ECC_BUFSIZE, NULL);
28422+
if (!WC_VAR_OK(buf)) {
28423+
ret = MEMORY_E;
28424+
break;
28425+
}
2839228426

2839328427
ret = wc_ecc_export_x963(eccTmp, buf, &bufSz);
28394-
if (ret != 0) break;
28428+
if (ret != 0) {
28429+
WC_FREE_VAR(buf, NULL);
28430+
break;
28431+
}
2839528432

2839628433
curveId = wc_ecc_get_curve_id(eccTmp->idx);
2839728434
eccObj->devId = INVALID_DEVID;
2839828435
ret = wc_ecc_import_x963_ex2(buf, bufSz, eccObj, curveId, 0);
2839928436
eccObj->devId = thisDevId;
28437+
28438+
WC_FREE_VAR(buf, NULL);
2840028439
break;
2840128440
}
2840228441
case WC_SETKEY_ECC_PRIV:
2840328442
{
2840428443
ecc_key* eccObj = (ecc_key*)info->setkey.obj;
2840528444
ecc_key* eccTmp = (ecc_key*)info->setkey.key;
28406-
byte pubBuf[ECC_BUFSIZE];
28407-
byte privBuf[MAX_ECC_BYTES];
28408-
word32 pubSz = sizeof(pubBuf);
28409-
word32 privSz = sizeof(privBuf);
28445+
word32 pubSz = ECC_BUFSIZE;
28446+
word32 privSz = MAX_ECC_BYTES;
28447+
byte* pubPtr = NULL;
2841028448
int curveId;
28449+
WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28450+
WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28451+
WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28452+
WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28453+
if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28454+
WC_FREE_VAR(pubBuf, NULL);
28455+
WC_FREE_VAR(privBuf, NULL);
28456+
ret = MEMORY_E;
28457+
break;
28458+
}
28459+
28460+
/* Export public key from temp (if available) */
28461+
if (eccTmp->type != ECC_PRIVATEKEY_ONLY) {
28462+
ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
28463+
if (ret != 0) {
28464+
WC_FREE_VAR(pubBuf, NULL);
28465+
WC_FREE_VAR(privBuf, NULL);
28466+
break;
28467+
}
28468+
pubPtr = pubBuf;
28469+
}
2841128470

28412-
ret = wc_ecc_export_x963(eccTmp, pubBuf, &pubSz);
28413-
if (ret != 0) break;
2841428471
ret = wc_ecc_export_private_only(eccTmp, privBuf, &privSz);
28415-
if (ret != 0) break;
28472+
if (ret != 0) {
28473+
WC_FREE_VAR(pubBuf, NULL);
28474+
WC_FREE_VAR(privBuf, NULL);
28475+
break;
28476+
}
2841628477

2841728478
curveId = wc_ecc_get_curve_id(eccTmp->idx);
2841828479
eccObj->devId = INVALID_DEVID;
2841928480
ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28420-
pubBuf, pubSz, eccObj, curveId);
28481+
pubPtr, (pubPtr != NULL) ? pubSz : 0,
28482+
eccObj, curveId);
2842128483
eccObj->devId = thisDevId;
28484+
28485+
WC_FREE_VAR(pubBuf, NULL);
28486+
WC_FREE_VAR(privBuf, NULL);
2842228487
break;
2842328488
}
2842428489
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
@@ -28428,6 +28493,123 @@ static int test_CryptoCb_Func(int thisDevId, wc_CryptoInfo* info, void* ctx)
2842828493
}
2842928494
}
2843028495
#endif /* WOLF_CRYPTO_CB_SETKEY */
28496+
#ifdef WOLF_CRYPTO_CB_EXPORT_KEY
28497+
else if (info->algo_type == WC_ALGO_TYPE_EXPORT_KEY) {
28498+
#ifdef DEBUG_WOLFSSL
28499+
fprintf(stderr, "test_CryptoCb_Func: ExportKey Type=%d\n",
28500+
info->export_key.type);
28501+
#endif
28502+
switch (info->export_key.type) {
28503+
#if !defined(NO_RSA) && defined(WOLFSSL_KEY_TO_DER)
28504+
case WC_PK_TYPE_RSA:
28505+
{
28506+
RsaKey* src = (RsaKey*)info->export_key.obj;
28507+
RsaKey* dst = (RsaKey*)info->export_key.out;
28508+
int derSz;
28509+
word32 idx = 0;
28510+
byte* der = NULL;
28511+
28512+
/* Try private key export first, fall back to public */
28513+
derSz = wc_RsaKeyToDer(src, NULL, 0);
28514+
if (derSz > 0) {
28515+
der = (byte*)XMALLOC(derSz, NULL,
28516+
DYNAMIC_TYPE_TMP_BUFFER);
28517+
if (der == NULL) { ret = MEMORY_E; break; }
28518+
derSz = wc_RsaKeyToDer(src, der, (word32)derSz);
28519+
if (derSz > 0) {
28520+
ret = wc_RsaPrivateKeyDecode(der, &idx, dst,
28521+
(word32)derSz);
28522+
}
28523+
else {
28524+
ret = derSz;
28525+
}
28526+
XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28527+
}
28528+
else {
28529+
/* Public key only */
28530+
derSz = wc_RsaPublicKeyDerSize(src, 1);
28531+
if (derSz <= 0) { ret = derSz; break; }
28532+
der = (byte*)XMALLOC(derSz, NULL,
28533+
DYNAMIC_TYPE_TMP_BUFFER);
28534+
if (der == NULL) { ret = MEMORY_E; break; }
28535+
derSz = wc_RsaKeyToPublicDer_ex(src, der,
28536+
(word32)derSz, 1);
28537+
if (derSz > 0) {
28538+
ret = wc_RsaPublicKeyDecode(der, &idx, dst,
28539+
(word32)derSz);
28540+
}
28541+
else {
28542+
ret = derSz;
28543+
}
28544+
XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
28545+
}
28546+
break;
28547+
}
28548+
#endif /* !NO_RSA && WOLFSSL_KEY_TO_DER */
28549+
#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && \
28550+
defined(HAVE_ECC_KEY_IMPORT)
28551+
case WC_PK_TYPE_ECDSA_SIGN: /* ECC key */
28552+
{
28553+
ecc_key* src = (ecc_key*)info->export_key.obj;
28554+
ecc_key* dst = (ecc_key*)info->export_key.out;
28555+
word32 pubSz = ECC_BUFSIZE;
28556+
word32 privSz = MAX_ECC_BYTES;
28557+
byte* pubPtr = NULL;
28558+
int curveId;
28559+
WC_DECLARE_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28560+
WC_DECLARE_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28561+
WC_ALLOC_VAR(pubBuf, byte, ECC_BUFSIZE, NULL);
28562+
WC_ALLOC_VAR(privBuf, byte, MAX_ECC_BYTES, NULL);
28563+
if (!WC_VAR_OK(pubBuf) || !WC_VAR_OK(privBuf)) {
28564+
WC_FREE_VAR(pubBuf, NULL);
28565+
WC_FREE_VAR(privBuf, NULL);
28566+
ret = MEMORY_E;
28567+
break;
28568+
}
28569+
28570+
/* Export public key if available */
28571+
if (src->type != ECC_PRIVATEKEY_ONLY) {
28572+
ret = wc_ecc_export_x963(src, pubBuf, &pubSz);
28573+
if (ret != 0) {
28574+
WC_FREE_VAR(pubBuf, NULL);
28575+
WC_FREE_VAR(privBuf, NULL);
28576+
break;
28577+
}
28578+
pubPtr = pubBuf;
28579+
}
28580+
28581+
/* Export private key if available */
28582+
if (src->type != ECC_PUBLICKEY) {
28583+
ret = wc_ecc_export_private_only(src, privBuf,
28584+
&privSz);
28585+
if (ret != 0) {
28586+
WC_FREE_VAR(pubBuf, NULL);
28587+
WC_FREE_VAR(privBuf, NULL);
28588+
break;
28589+
}
28590+
28591+
curveId = wc_ecc_get_curve_id(src->idx);
28592+
ret = wc_ecc_import_private_key_ex(privBuf, privSz,
28593+
pubPtr, (pubPtr != NULL) ? pubSz : 0,
28594+
dst, curveId);
28595+
}
28596+
else {
28597+
/* Public key only */
28598+
curveId = wc_ecc_get_curve_id(src->idx);
28599+
ret = wc_ecc_import_x963_ex2(pubBuf, pubSz, dst,
28600+
curveId, 0);
28601+
}
28602+
WC_FREE_VAR(pubBuf, NULL);
28603+
WC_FREE_VAR(privBuf, NULL);
28604+
break;
28605+
}
28606+
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT && HAVE_ECC_KEY_IMPORT */
28607+
default:
28608+
ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN);
28609+
break;
28610+
}
28611+
}
28612+
#endif /* WOLF_CRYPTO_CB_EXPORT_KEY */
2843128613
(void)thisDevId;
2843228614
(void)keyFormat;
2843328615

0 commit comments

Comments
 (0)