Skip to content

Commit 3e112a3

Browse files
committed
Extend CMAC API to pull in label/id extension functions to pass down to the AES init call
Refactor CMAC init to common function, add wc_AesNew_Id/Label API, do same for RSA new functions, and add test init helpers for id[] support along with some test disable options
1 parent 4b7ff29 commit 3e112a3

8 files changed

Lines changed: 679 additions & 69 deletions

File tree

wolfcrypt/benchmark/benchmark.c

Lines changed: 134 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4993,6 +4993,125 @@ void bench_rng(void)
49934993
#endif /* WC_NO_RNG */
49944994

49954995

4996+
/* ============================================================================
4997+
* Benchmark init helpers -- use id[] when WC_TEST_*_ID is defined and
4998+
* useDeviceID is true, else plain init.
4999+
* ========================================================================= */
5000+
5001+
/* --- AES CBC --- */
5002+
#if !defined(NO_AES) && defined(HAVE_AES_CBC)
5003+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_AES_CBC_ID)
5004+
static unsigned char benchAesCbcId[] = WC_TEST_AES_CBC_ID;
5005+
static int benchAesCbcIdLen = (int)sizeof(benchAesCbcId);
5006+
#endif
5007+
5008+
static WC_MAYBE_UNUSED int bench_AesCbcInit(Aes* aes, void* heap,
5009+
int declaredDevId)
5010+
{
5011+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_AES_CBC_ID)
5012+
return wc_AesInit_Id(aes, benchAesCbcId, benchAesCbcIdLen, heap,
5013+
declaredDevId);
5014+
#else
5015+
return wc_AesInit(aes, heap, declaredDevId);
5016+
#endif
5017+
}
5018+
#endif /* !NO_AES && HAVE_AES_CBC */
5019+
5020+
/* --- AES GCM --- */
5021+
#if !defined(NO_AES) && defined(HAVE_AESGCM)
5022+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_AES_GCM_ID)
5023+
static unsigned char benchAesGcmId[] = WC_TEST_AES_GCM_ID;
5024+
static int benchAesGcmIdLen = (int)sizeof(benchAesGcmId);
5025+
#endif
5026+
5027+
static WC_MAYBE_UNUSED int bench_AesGcmInit(Aes* aes, void* heap,
5028+
int declaredDevId)
5029+
{
5030+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_AES_GCM_ID)
5031+
return wc_AesInit_Id(aes, benchAesGcmId, benchAesGcmIdLen, heap,
5032+
declaredDevId);
5033+
#else
5034+
return wc_AesInit(aes, heap, declaredDevId);
5035+
#endif
5036+
}
5037+
#endif /* !NO_AES && HAVE_AESGCM */
5038+
5039+
/* --- RSA --- */
5040+
#if !defined(NO_RSA)
5041+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_RSA_PRIV_ID)
5042+
static unsigned char benchRsaPrivId[] = WC_TEST_RSA_PRIV_ID;
5043+
static int benchRsaPrivIdLen = (int)sizeof(benchRsaPrivId);
5044+
#endif
5045+
5046+
static WC_MAYBE_UNUSED int bench_RsaInit(RsaKey* key, void* heap,
5047+
int declaredDevId)
5048+
{
5049+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_RSA_PRIV_ID)
5050+
return wc_InitRsaKey_Id(key, benchRsaPrivId, benchRsaPrivIdLen, heap,
5051+
declaredDevId);
5052+
#else
5053+
return wc_InitRsaKey_ex(key, heap, declaredDevId);
5054+
#endif
5055+
}
5056+
#endif /* !NO_RSA */
5057+
5058+
/* --- CMAC --- */
5059+
#ifdef WOLFSSL_CMAC
5060+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_CMAC_ID)
5061+
static unsigned char benchCmacId[] = WC_TEST_CMAC_ID;
5062+
static int benchCmacIdLen = (int)sizeof(benchCmacId);
5063+
#endif
5064+
5065+
static WC_MAYBE_UNUSED int bench_CmacInit(Cmac* cmac, const byte* key,
5066+
word32 keySz, int type,
5067+
void* unused, void* heap,
5068+
int declaredDevId)
5069+
{
5070+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_CMAC_ID)
5071+
return wc_InitCmac_Id(cmac, key, keySz, type, unused,
5072+
benchCmacId, benchCmacIdLen, heap, declaredDevId);
5073+
#elif !defined(HAVE_FIPS)
5074+
return wc_InitCmac_ex(cmac, key, keySz, type, unused, heap, declaredDevId);
5075+
#else
5076+
(void)heap;
5077+
(void)declaredDevId;
5078+
return wc_InitCmac(cmac, key, keySz, type, unused);
5079+
#endif
5080+
}
5081+
#endif /* WOLFSSL_CMAC */
5082+
5083+
/* --- ECC --- */
5084+
#ifdef HAVE_ECC
5085+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_ECC_PAIR_P256_ID)
5086+
static unsigned char benchEccPairP256Id[] = WC_TEST_ECC_PAIR_P256_ID;
5087+
static int benchEccPairP256IdLen = (int)sizeof(benchEccPairP256Id);
5088+
#endif
5089+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_ECC_PAIR_P521_ID)
5090+
static unsigned char benchEccPairP521Id[] = WC_TEST_ECC_PAIR_P521_ID;
5091+
static int benchEccPairP521IdLen = (int)sizeof(benchEccPairP521Id);
5092+
#endif
5093+
5094+
static WC_MAYBE_UNUSED int bench_EccInit_Pair(ecc_key* key, int keySize,
5095+
void* heap, int declaredDevId)
5096+
{
5097+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_ECC_PAIR_P256_ID)
5098+
if (keySize == 32) {
5099+
return wc_ecc_init_id(key, benchEccPairP256Id,
5100+
benchEccPairP256IdLen, heap, declaredDevId);
5101+
}
5102+
#endif
5103+
#if defined(WOLF_PRIVATE_KEY_ID) && defined(WC_TEST_ECC_PAIR_P521_ID)
5104+
if (keySize == 66) {
5105+
return wc_ecc_init_id(key, benchEccPairP521Id,
5106+
benchEccPairP521IdLen, heap, declaredDevId);
5107+
}
5108+
#endif
5109+
(void)keySize;
5110+
return wc_ecc_init_ex(key, heap, declaredDevId);
5111+
}
5112+
#endif /* HAVE_ECC */
5113+
5114+
49965115
#ifndef NO_AES
49975116

49985117
#ifdef HAVE_AES_CBC
@@ -5016,8 +5135,9 @@ static void bench_aescbc_internal(int useDeviceID,
50165135

50175136
/* init keys */
50185137
for (i = 0; i < BENCH_MAX_PENDING; i++) {
5019-
if ((ret = wc_AesInit(enc[i], HEAP_HINT,
5020-
useDeviceID ? devId: INVALID_DEVID)) != 0) {
5138+
ret = bench_AesCbcInit(enc[i], HEAP_HINT,
5139+
useDeviceID ? devId : INVALID_DEVID);
5140+
if (ret != 0) {
50215141
printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret);
50225142
goto exit;
50235143
}
@@ -5085,8 +5205,8 @@ static void bench_aescbc_internal(int useDeviceID,
50855205

50865206
/* init keys */
50875207
for (i = 0; i < BENCH_MAX_PENDING; i++) {
5088-
ret = wc_AesInit(enc[i], HEAP_HINT,
5089-
useDeviceID ? devId: INVALID_DEVID);
5208+
ret = bench_AesCbcInit(enc[i], HEAP_HINT,
5209+
useDeviceID ? devId : INVALID_DEVID);
50905210
if (ret != 0) {
50915211
printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret);
50925212
goto exit;
@@ -5207,8 +5327,9 @@ static void bench_aesgcm_internal(int useDeviceID,
52075327

52085328
/* init keys */
52095329
for (i = 0; i < BENCH_MAX_PENDING; i++) {
5210-
if ((ret = wc_AesInit(enc[i], HEAP_HINT,
5211-
useDeviceID ? devId: INVALID_DEVID)) != 0) {
5330+
ret = bench_AesGcmInit(enc[i], HEAP_HINT,
5331+
useDeviceID ? devId : INVALID_DEVID);
5332+
if (ret != 0) {
52125333
printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret);
52135334
goto exit;
52145335
}
@@ -5292,8 +5413,9 @@ static void bench_aesgcm_internal(int useDeviceID,
52925413

52935414
/* init keys */
52945415
for (i = 0; i < BENCH_MAX_PENDING; i++) {
5295-
if ((ret = wc_AesInit(dec[i], HEAP_HINT,
5296-
useDeviceID ? devId: INVALID_DEVID)) != 0) {
5416+
ret = bench_AesGcmInit(dec[i], HEAP_HINT,
5417+
useDeviceID ? devId : INVALID_DEVID);
5418+
if (ret != 0) {
52975419
printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret);
52985420
goto exit;
52995421
}
@@ -9100,7 +9222,7 @@ static void bench_cmac_helper(word32 keySz, const char* outMsg, int useDeviceID)
91009222
#ifdef HAVE_FIPS
91019223
ret = wc_InitCmac(&cmac, bench_key, keySz, WC_CMAC_AES, NULL);
91029224
#else
9103-
ret = wc_InitCmac_ex(&cmac, bench_key, keySz, WC_CMAC_AES, NULL,
9225+
ret = bench_CmacInit(&cmac, bench_key, keySz, WC_CMAC_AES, NULL,
91049226
HEAP_HINT, useDeviceID ? devId : INVALID_DEVID);
91059227
#endif
91069228
if (ret != 0) {
@@ -10164,7 +10286,7 @@ void bench_rsa(int useDeviceID)
1016410286
/* init keys */
1016510287
for (i = 0; i < BENCH_MAX_PENDING; i++) {
1016610288
/* setup an async context for each key */
10167-
ret = wc_InitRsaKey_ex(rsaKey[i], HEAP_HINT,
10289+
ret = bench_RsaInit(rsaKey[i], HEAP_HINT,
1016810290
useDeviceID ? devId : INVALID_DEVID);
1016910291
if (ret < 0) {
1017010292
goto exit;
@@ -12348,7 +12470,8 @@ void bench_ecc(int useDeviceID, int curveId)
1234812470
/* init keys */
1234912471
for (i = 0; i < BENCH_MAX_PENDING; i++) {
1235012472
/* setup an context for each key */
12351-
if ((ret = wc_ecc_init_ex(genKey[i], HEAP_HINT, deviceID)) < 0) {
12473+
if ((ret = bench_EccInit_Pair(genKey[i], keySize, HEAP_HINT,
12474+
deviceID)) < 0) {
1235212475
goto exit;
1235312476
}
1235412477
ret = wc_ecc_make_key_ex(&gRng, keySize, genKey[i], curveId);

wolfcrypt/src/aes.c

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13559,27 +13559,76 @@ int wc_AesCcmEncrypt_ex(Aes* aes, byte* out, const byte* in, word32 sz,
1355913559
#endif /* HAVE_AESCCM */
1356013560

1356113561
#ifndef WC_NO_CONSTRUCTORS
13562-
Aes* wc_AesNew(void* heap, int devId, int *result_code)
13562+
13563+
#define AES_NEW_INIT_PLAIN 0
13564+
#ifdef WOLF_PRIVATE_KEY_ID
13565+
#define AES_NEW_INIT_ID 1
13566+
#define AES_NEW_INIT_LABEL 2
13567+
#endif
13568+
13569+
static Aes* _AesNew_common(void* heap, int devId, int *result_code,
13570+
int aesInitType, void* aesInitData,
13571+
int aesInitDataLen)
1356313572
{
1356413573
int ret;
1356513574
Aes* aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_AES);
1356613575
if (aes == NULL) {
1356713576
ret = MEMORY_E;
1356813577
}
1356913578
else {
13570-
ret = wc_AesInit(aes, heap, devId);
13579+
switch (aesInitType) {
13580+
#ifdef WOLF_PRIVATE_KEY_ID
13581+
case AES_NEW_INIT_ID:
13582+
ret = wc_AesInit_Id(aes, (unsigned char*)aesInitData,
13583+
aesInitDataLen, heap, devId);
13584+
break;
13585+
case AES_NEW_INIT_LABEL:
13586+
ret = wc_AesInit_Label(aes, (const char*)aesInitData,
13587+
heap, devId);
13588+
break;
13589+
#endif
13590+
default:
13591+
ret = wc_AesInit(aes, heap, devId);
13592+
break;
13593+
}
1357113594
if (ret != 0) {
1357213595
XFREE(aes, heap, DYNAMIC_TYPE_AES);
1357313596
aes = NULL;
1357413597
}
1357513598
}
13599+
(void)aesInitType;
13600+
(void)aesInitData;
13601+
(void)aesInitDataLen;
1357613602

13577-
if (result_code != NULL)
13603+
if (result_code != NULL) {
1357813604
*result_code = ret;
13605+
}
1357913606

1358013607
return aes;
1358113608
}
1358213609

13610+
Aes* wc_AesNew(void* heap, int devId, int *result_code)
13611+
{
13612+
return _AesNew_common(heap, devId, result_code,
13613+
AES_NEW_INIT_PLAIN, NULL, 0);
13614+
}
13615+
13616+
#ifdef WOLF_PRIVATE_KEY_ID
13617+
Aes* wc_AesNew_Id(unsigned char* id, int len, void* heap, int devId,
13618+
int *result_code)
13619+
{
13620+
return _AesNew_common(heap, devId, result_code,
13621+
AES_NEW_INIT_ID, id, len);
13622+
}
13623+
13624+
Aes* wc_AesNew_Label(const char* label, void* heap, int devId,
13625+
int *result_code)
13626+
{
13627+
return _AesNew_common(heap, devId, result_code,
13628+
AES_NEW_INIT_LABEL, (void*)label, 0);
13629+
}
13630+
#endif /* WOLF_PRIVATE_KEY_ID */
13631+
1358313632
int wc_AesDelete(Aes *aes, Aes** aes_p)
1358413633
{
1358513634
if (aes == NULL)

0 commit comments

Comments
 (0)