Mbedtls 熵生成永远运行
Mbedtls entropy generation runs forever
我正在尝试为 mbedtls 编写一个测试函数,它随机生成一个用于 AES 加密的密钥。
我使用来自 mbedtls 的原始教程代码。
我的程序在执行 "mbedtls_ctr_drbg_seed()".
时总是停止
关于我的环境:来自STM_CUBEmx的基本源文件,开发板:ST32F767 Nucleo,基于来自STM_Cube
的Makefile编译
mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_entropy_context entropy;
char *pers="anything";
int ret;
//Start
mbedtls_entropy_init(&entropy);
debugPrintln("Init entropy done");
mbedtls_ctr_drbg_init(&ctr_drbg);
debugPrintln("Init ctr_drbg done");
if((ret=mbedtls_ctr_drbg_seed(&ctr_drbg,mbedtls_entropy_func,&entropy,(unsigned char *) pers,strlen(pers)))!=0){
//Error info
debugPrintln("ERROR ctr_drbg_seed ");
return -1;
}
debugPrintln("Init ctr_drbg_seed done");
if((ret=mbedtls_ctr_drbg_random(&ctr_drbg,key,32))!=0){
return -1;
}
提前致谢
根据你的描述,
我假设您的应用程序卡在对 mbedtls_ctr_drbg_seed()
的调用中。
恕我直言,最可能的原因是函数 mbedtls_entropy_func()
:
do
{
if( count++ > ENTROPY_MAX_LOOP )
{
ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;
goto exit;
}
if( ( ret = entropy_gather_internal( ctx ) ) != 0 )
goto exit;
done = 1;
for( i = 0; i < ctx->source_count; i++ )
if( ctx->source[i].size < ctx->source[i].threshold )
done = 0;
}
while( ! done );
您应该检查您的熵收集器是否增加了收集的大小,阈值不是 MAX_INT
或类似的东西,并且您的硬件熵收集器实际上 returns 熵数据。
找到原因了
STM32 Cube MX将RNG的HAL Init函数放在mbedtls init之后
因此,当我在 mbedtls_init() 中调用 mbedtls_ctr_drbg_seed() 时,RNG 尚未初始化并且它在内部永远迭代:
do
{
if( count++ > ENTROPY_MAX_LOOP )
{
ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;
goto exit;
}
if( ( ret = entropy_gather_internal( ctx ) ) != 0 )
goto exit;
done = 1;
for( i = 0; i < ctx->source_count; i++ )
if( ctx->source[i].size < ctx->source[i].threshold )
done = 0;
}
while( ! done );
解决方案
换行
我正在尝试为 mbedtls 编写一个测试函数,它随机生成一个用于 AES 加密的密钥。 我使用来自 mbedtls 的原始教程代码。 我的程序在执行 "mbedtls_ctr_drbg_seed()".
时总是停止关于我的环境:来自STM_CUBEmx的基本源文件,开发板:ST32F767 Nucleo,基于来自STM_Cube
的Makefile编译 mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_entropy_context entropy;
char *pers="anything";
int ret;
//Start
mbedtls_entropy_init(&entropy);
debugPrintln("Init entropy done");
mbedtls_ctr_drbg_init(&ctr_drbg);
debugPrintln("Init ctr_drbg done");
if((ret=mbedtls_ctr_drbg_seed(&ctr_drbg,mbedtls_entropy_func,&entropy,(unsigned char *) pers,strlen(pers)))!=0){
//Error info
debugPrintln("ERROR ctr_drbg_seed ");
return -1;
}
debugPrintln("Init ctr_drbg_seed done");
if((ret=mbedtls_ctr_drbg_random(&ctr_drbg,key,32))!=0){
return -1;
}
提前致谢
根据你的描述,
我假设您的应用程序卡在对 mbedtls_ctr_drbg_seed()
的调用中。
恕我直言,最可能的原因是函数 mbedtls_entropy_func()
:
do
{
if( count++ > ENTROPY_MAX_LOOP )
{
ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;
goto exit;
}
if( ( ret = entropy_gather_internal( ctx ) ) != 0 )
goto exit;
done = 1;
for( i = 0; i < ctx->source_count; i++ )
if( ctx->source[i].size < ctx->source[i].threshold )
done = 0;
}
while( ! done );
您应该检查您的熵收集器是否增加了收集的大小,阈值不是 MAX_INT
或类似的东西,并且您的硬件熵收集器实际上 returns 熵数据。
找到原因了
STM32 Cube MX将RNG的HAL Init函数放在mbedtls init之后 因此,当我在 mbedtls_init() 中调用 mbedtls_ctr_drbg_seed() 时,RNG 尚未初始化并且它在内部永远迭代:
do
{
if( count++ > ENTROPY_MAX_LOOP )
{
ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;
goto exit;
}
if( ( ret = entropy_gather_internal( ctx ) ) != 0 )
goto exit;
done = 1;
for( i = 0; i < ctx->source_count; i++ )
if( ctx->source[i].size < ctx->source[i].threshold )
done = 0;
}
while( ! done );
解决方案
换行