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 */
154158static volatile int initRefCount = 0 ;
155159
@@ -164,9 +168,71 @@ WOLFSSL_ABI
164168int 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 )
454522long wolfCrypt_heap_peakAllocs_checkpoint (void ) {
0 commit comments