已合并
refator the dependency order of the CRYPT_EAL_Init function #1097
liwei3013创建于 2月24日
refator the dependency order of the CRYPT_EAL_Init function #1097
已合并
共 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 | #endif | 200 | #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 | #endif | 253 | #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 | ||