Skip to content

Commit a62db85

Browse files
committed
Introduce wolfCrypt_Init warmup, NO_WOLFSSL_WARMUP
1 parent d4f8c9c commit a62db85

File tree

2 files changed

+71
-2
lines changed

2 files changed

+71
-2
lines changed

.wolfssl_known_macro_extras

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@ NO_WOLFSSL_SHA512_INTERLEAVE
437437
NO_WOLFSSL_SKIP_TRAILING_PAD
438438
NO_WOLFSSL_SMALL_STACK_STATIC
439439
NO_WOLFSSL_USE_ASM_CERT
440+
NO_WOLFSSL_WARMUP
440441
NO_WOLFSSL_XILINX_TAG_MALLOC
441442
NRF52
442443
NRF52_SERIES

wolfcrypt/src/wc_port.c

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@
150150
#endif
151151
#endif
152152

153+
#if !defined(NO_AES) && !defined(WC_NO_AES)
154+
#include <wolfssl/wolfcrypt/aes.h>
155+
#endif
156+
153157
/* prevent multiple mutex initializations */
154158
static volatile int initRefCount = 0;
155159

@@ -164,9 +168,71 @@ WOLFSSL_ABI
164168
int wolfCrypt_Init(void)
165169
{
166170
int ret = 0;
171+
172+
#ifndef NO_WOLFSSL_WARMUP
173+
WC_RNG rng;
174+
byte dummy;
175+
#if !defined(NO_AES) && !defined(WC_NO_AES) && defined(HAVE_AESGCM)
176+
Aes aes;
177+
unsigned char key16[16];
178+
unsigned char iv[12];
179+
unsigned char in[16];
180+
unsigned char out[16];
181+
unsigned char tag[16];
182+
int devId;
183+
#endif
184+
#endif /* NO_WOLFSSL_WARMUP*/
185+
167186
if (initRefCount == 0) {
168187
WOLFSSL_ENTER("wolfCrypt_Init");
169188

189+
#ifndef NO_WOLFSSL_WARMUP
190+
/* Warm up the hardware to allocate any heap & semaphore early */
191+
#if defined(DEBUG_WOLFSSL_MALLOC_VERBOSE)
192+
WOLFSSL_MSG("Warming up RNG");
193+
#endif
194+
ret = wc_InitRng(&rng);
195+
if (ret == 0) {
196+
/* forces Hash_DRBG/SHA */
197+
ret = wc_RNG_GenerateBlock(&rng, &dummy, 1);
198+
if (ret != 0) {
199+
WOLFSSL_MSG("wolfCrypt_Init wc_RNG_GenerateBlock failed");
200+
}
201+
}
202+
if (ret != 0) {
203+
WOLFSSL_MSG("wolfCrypt_Init RNG warmup failed");
204+
}
205+
ret = wc_FreeRng(&rng);
206+
if (ret != 0) {
207+
WOLFSSL_MSG("wolfCrypt_Init wc_FreeRng failed");
208+
}
209+
210+
#if !defined(NO_AES) && !defined(WC_NO_AES) && defined(HAVE_AESGCM)
211+
#if defined(DEBUG_WOLFSSL_MALLOC_VERBOSE)
212+
WOLFSSL_MSG("Warming up AES");
213+
#endif
214+
memset(key16, 0, sizeof(key16));
215+
memset(iv, 0, sizeof(iv));
216+
memset(in, 0, sizeof(in));
217+
devId = INVALID_DEVID;
218+
219+
ret = wc_AesInit(&aes, NULL, devId);
220+
if (ret == 0) {
221+
ret = wc_AesGcmSetKey(&aes, key16, sizeof(key16));
222+
}
223+
if (ret == 0) {
224+
ret = wc_AesGcmEncrypt(&aes, out, in, (word32)sizeof(in),
225+
iv, (word32)sizeof(iv),
226+
tag, (word32)sizeof(tag),
227+
NULL, 0);
228+
}
229+
if (ret != 0) {
230+
WOLFSSL_MSG("AES warmup failed during wolfCrypt_Init");
231+
}
232+
wc_AesFree(&aes);
233+
#endif /* !NO_AES && !WC_NO_AES && HAVE_AESGCM */
234+
#endif /* NO_WOLFSSL_WARMUP */
235+
170236
#if defined(__aarch64__) && defined(WOLFSSL_ARMASM_BARRIER_DETECT)
171237
aarch64_use_sb = IS_AARCH64_SB(cpuid_get_flags());
172238
#endif
@@ -444,11 +510,13 @@ int wolfCrypt_Init(void)
444510
return ret;
445511
}
446512
#endif
447-
}
513+
514+
} /* (initRefCount == 0) */
515+
448516
initRefCount++;
449517

450518
return ret;
451-
}
519+
} /* wolfCrypt_Init */
452520

453521
#if defined(WOLFSSL_TRACK_MEMORY_VERBOSE) && !defined(WOLFSSL_STATIC_MEMORY)
454522
long wolfCrypt_heap_peakAllocs_checkpoint(void) {

0 commit comments

Comments
 (0)