Поколение энтропии Mbedtls работает вечно
Я пытаюсь написать тестовую функцию для mbedtls, которая случайным образом генерирует ключ для шифрования AES. Я использую оригинальный учебный код от mbedtls. Моя программа всегда останавливается при выполнении "mbedtls_ctr_drbg_seed()".
О моей среде: основные исходные файлы из STM_CUBEmx, плата: ST32F767 Nucleo, компиляция на основе Makefile из STM_Cube
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;
}
заранее спасибо
0 ответов
Из вашего описания я предполагаю, что ваше приложение застряло в вызове 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
или что-то в этом роде, и что ваш сборщик энтропии hw на самом деле возвращает энтропийные данные.
Я нашел причину
STM32 Cube MX помещает функцию инициализации HAL для ГСЧ после инициализации mbedtls. Поэтому, когда я вызываю mbedtls_ctr_drbg_seed() внутри mbedtls_init(), ГСЧ еще не инициализирован, и он итерирует вечно внутри:
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 );
Решение
поменять местами