首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mbedtls熵生成永远运行

Mbedtls熵生成永远运行
EN

Stack Overflow用户
提问于 2018-11-26 13:07:46
回答 2查看 322关注 0票数 0

我试图为mbedtls编写一个测试函数,它随机生成一个AES加密密钥。我使用mbedtls的原始教程代码。当执行"mbedtls_ctr_drbg_seed()“时,我的程序总是停止。

关于我的环境:来自STM_CUBEmx的基本源文件,板: ST32F767核心,基于STM_Cube的Makefile编译

代码语言:javascript
复制
  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;
  }

提前谢谢你

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-08 10:33:12

我找到了原因

STM32 Cube将RNG的hasn函数放在mbedtls Init之后,所以当我在mbedtls_init()中调用mbedtls_ctr_drbg_seed()时,RNG尚未初始化,它在其中永远迭代:

代码语言:javascript
复制
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 );

解决方案

换行

票数 0
EN

Stack Overflow用户

发布于 2019-01-10 11:01:15

根据您的描述,我假设您的应用程序被困在了对mbedtls_ctr_drbg_seed()的调用中。最可能的原因,IMHO,是在函数mbedtls_entropy_func()

代码语言:javascript
复制
    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或类似的东西,并且您的hw熵收集器实际上返回熵数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53481818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档