已合并
refator the dependency order of the CRYPT_EAL_Init function #1097
refator the dependency order of the CRYPT_EAL_Init function #1097
已合并
liwei3013创建于 2月24日
共 1 个文件变更+29-17
@@ -199,36 +199,45 @@ int32_t CRYPT_EAL_Init(uint64_t opts)
199 int32_t alg = CRYPT_RAND_SHA256;199 int32_t alg = CRYPT_RAND_SHA256;
200#endif200#endif
201 201 
202+ // Step 1: CPU capability detection (no dependencies)
202 if ((initOpt & CRYPT_EAL_INIT_CPU) && (g_ealInitOpts & CRYPT_EAL_INIT_CPU) == 0) {203 if ((initOpt & CRYPT_EAL_INIT_CPU) && (g_ealInitOpts & CRYPT_EAL_INIT_CPU) == 0) {
203 GetCpuInstrSupportState();204 GetCpuInstrSupportState();
204 g_ealInitOpts |= CRYPT_EAL_INIT_CPU;205 g_ealInitOpts |= CRYPT_EAL_INIT_CPU;
205 }206 }
206 207 
208+ // Step 2: BSL initialization (foundational layer, no dependencies)
207 ret = BslModuleInit(initOpt);209 ret = BslModuleInit(initOpt);
208 if (ret != CRYPT_SUCCESS) {210 if (ret != CRYPT_SUCCESS) {
209 return ret;211 return ret;
210 }212 }
211-
212- ret = ProviderModuleInit(initOpt, alg);
213- if (ret != CRYPT_SUCCESS) {
214- BslModuleFree(initOpt);
215- return ret;
216- }
217- 
218- ret = RandModuleInit(initOpt, alg);
219- if (ret != CRYPT_SUCCESS) {
220- BslModuleFree(initOpt);
221- ProviderModuleFree(initOpt);
222- return ret;
223- }
224 213 
214+ // Step 3: Global lock initialization (must be before Rand and Provider Rand)
215+ // The seed lock (g_seedLock) is used by EAL_GetDefaultSeed() which may be
216+ // called during DRBG initialization in both RandModuleInit and ProviderModuleInit.
225 ret = GlobalLockInit(initOpt, alg);217 ret = GlobalLockInit(initOpt, alg);
226 if (ret != CRYPT_SUCCESS) {218 if (ret != CRYPT_SUCCESS) {
227- RandModuleFree(initOpt);
228 BslModuleFree(initOpt);219 BslModuleFree(initOpt);
229- ProviderModuleFree(initOpt);
230 return ret;220 return ret;
231 }221 }
222+ 
223+ // Step 4: Provider initialization (depends on BSL and Lock)
224+ ret = ProviderModuleInit(initOpt, alg);
225+ if (ret != CRYPT_SUCCESS) {
226+ GlobalLockFree(initOpt);
227+ BslModuleFree(initOpt);
228+ return ret;
229+ }
230+ 
231+ // Step 5: Rand module initialization (depends on BSL and Lock, independent of Provider)
232+ // Note: Rand and Provider are independent parallel paths for random number generation
233+ ret = RandModuleInit(initOpt, alg);
234+ if (ret != CRYPT_SUCCESS) {
235+ ProviderModuleFree(initOpt);
236+ GlobalLockFree(initOpt);
237+ BslModuleFree(initOpt);
238+ return ret;
239+ }
240+ 
232 return ret;241 return ret;
233}242}
234 243 
@@ -243,10 +252,13 @@ void CRYPT_EAL_Cleanup(uint64_t opts)
243 initOpt = CRYPT_EAL_INIT_ALL;252 initOpt = CRYPT_EAL_INIT_ALL;
244#endif253#endif
245 254 
246- ProviderModuleFree(initOpt);255+ // Cleanup in reverse order of initialization (LIFO principle)
256+ // Init order: CPU → BSL → Lock → Provider → Rand
257+ // Cleanup order: Rand → Provider → Lock → BSL
247 RandModuleFree(initOpt);258 RandModuleFree(initOpt);
248- BslModuleFree(initOpt);259+ ProviderModuleFree(initOpt);
249 GlobalLockFree(initOpt);260 GlobalLockFree(initOpt);
261+ BslModuleFree(initOpt);
250 g_ealInitOpts &= (~initOpt);262 g_ealInitOpts &= (~initOpt);
251}263}
252 264