Skip to content

Commit 3321d70

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 7efc962 commit 3321d70

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
@@ -4992,6 +4992,125 @@ void bench_rng(void)
49924992
#endif /* WC_NO_RNG */
49934993

49944994

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

49975116
#ifdef HAVE_AES_CBC
@@ -5015,8 +5134,9 @@ static void bench_aescbc_internal(int useDeviceID,
50155134

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

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

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

52925413
/* init keys */
52935414
for (i = 0; i < BENCH_MAX_PENDING; i++) {
5294-
if ((ret = wc_AesInit(dec[i], HEAP_HINT,
5295-
useDeviceID ? devId: INVALID_DEVID)) != 0) {
5415+
ret = bench_AesGcmInit(dec[i], HEAP_HINT,
5416+
useDeviceID ? devId : INVALID_DEVID);
5417+
if (ret != 0) {
52965418
printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret);
52975419
goto exit;
52985420
}
@@ -9099,7 +9221,7 @@ static void bench_cmac_helper(word32 keySz, const char* outMsg, int useDeviceID)
90999221
#ifdef HAVE_FIPS
91009222
ret = wc_InitCmac(&cmac, bench_key, keySz, WC_CMAC_AES, NULL);
91019223
#else
9102-
ret = wc_InitCmac_ex(&cmac, bench_key, keySz, WC_CMAC_AES, NULL,
9224+
ret = bench_CmacInit(&cmac, bench_key, keySz, WC_CMAC_AES, NULL,
91039225
HEAP_HINT, useDeviceID ? devId : INVALID_DEVID);
91049226
#endif
91059227
if (ret != 0) {
@@ -10163,7 +10285,7 @@ void bench_rsa(int useDeviceID)
1016310285
/* init keys */
1016410286
for (i = 0; i < BENCH_MAX_PENDING; i++) {
1016510287
/* setup an async context for each key */
10166-
ret = wc_InitRsaKey_ex(rsaKey[i], HEAP_HINT,
10288+
ret = bench_RsaInit(rsaKey[i], HEAP_HINT,
1016710289
useDeviceID ? devId : INVALID_DEVID);
1016810290
if (ret < 0) {
1016910291
goto exit;
@@ -12347,7 +12469,8 @@ void bench_ecc(int useDeviceID, int curveId)
1234712469
/* init keys */
1234812470
for (i = 0; i < BENCH_MAX_PENDING; i++) {
1234912471
/* setup an context for each key */
12350-
if ((ret = wc_ecc_init_ex(genKey[i], HEAP_HINT, deviceID)) < 0) {
12472+
if ((ret = bench_EccInit_Pair(genKey[i], keySize, HEAP_HINT,
12473+
deviceID)) < 0) {
1235112474
goto exit;
1235212475
}
1235312476
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
@@ -13555,27 +13555,76 @@ int wc_AesCcmEncrypt_ex(Aes* aes, byte* out, const byte* in, word32 sz,
1355513555
#endif /* HAVE_AESCCM */
1355613556

1355713557
#ifndef WC_NO_CONSTRUCTORS
13558-
Aes* wc_AesNew(void* heap, int devId, int *result_code)
13558+
13559+
#define AES_NEW_INIT_PLAIN 0
13560+
#ifdef WOLF_PRIVATE_KEY_ID
13561+
#define AES_NEW_INIT_ID 1
13562+
#define AES_NEW_INIT_LABEL 2
13563+
#endif
13564+
13565+
static Aes* _AesNew_common(void* heap, int devId, int *result_code,
13566+
int aesInitType, void* aesInitData,
13567+
int aesInitDataLen)
1355913568
{
1356013569
int ret;
1356113570
Aes* aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_AES);
1356213571
if (aes == NULL) {
1356313572
ret = MEMORY_E;
1356413573
}
1356513574
else {
13566-
ret = wc_AesInit(aes, heap, devId);
13575+
switch (aesInitType) {
13576+
#ifdef WOLF_PRIVATE_KEY_ID
13577+
case AES_NEW_INIT_ID:
13578+
ret = wc_AesInit_Id(aes, (unsigned char*)aesInitData,
13579+
aesInitDataLen, heap, devId);
13580+
break;
13581+
case AES_NEW_INIT_LABEL:
13582+
ret = wc_AesInit_Label(aes, (const char*)aesInitData,
13583+
heap, devId);
13584+
break;
13585+
#endif
13586+
default:
13587+
ret = wc_AesInit(aes, heap, devId);
13588+
break;
13589+
}
1356713590
if (ret != 0) {
1356813591
XFREE(aes, heap, DYNAMIC_TYPE_AES);
1356913592
aes = NULL;
1357013593
}
1357113594
}
13595+
(void)aesInitType;
13596+
(void)aesInitData;
13597+
(void)aesInitDataLen;
1357213598

13573-
if (result_code != NULL)
13599+
if (result_code != NULL) {
1357413600
*result_code = ret;
13601+
}
1357513602

1357613603
return aes;
1357713604
}
1357813605

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

0 commit comments

Comments
 (0)