0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

真随机数生成器TRNG外设模块应用要点

冬至子 来源:灵动MM32 MCU 作者:灵动MM32 MCU 2023-11-08 14:52 次阅读

简介

国产车规微控制器原厂云途半导体设计和发售的YTM32ME微控制器上集成的真随机数生成器TRNG(True Random Number Generator)外设模块,是一个可生成256位随机数的硬件模块,生成的随机数将用于数据加解密等应用场景。在功能安全相关的系统中,随机数也可以作为生成加密算法的种子数据的生成器。

原理与机制

TRNG包含了一个回环振荡器(Ring Oscillator)、一个随机比特流搜集器(Random Bits Collector)、一个时钟监测器(Clock Monitor)和一个错误检测器(Fault Detector)。有内部结构系统框图,如图x所示。

image.png

图x TRNG系统框图

其中,回环振荡器是随机噪声的高速时钟信号源,它对环境状况非常敏感,例如温度、电压、电磁干扰,以及别的潜在的噪声源。

这些噪声可以引起回环振荡器输出时钟频率产生微弱的、连续的和随机的变化,每个振荡时钟周期会产生非常微小的变化,因此,使用功能时钟信号(的上升沿)对回环振荡器时钟信号进行采样,得到的逻辑电平值,每次都是随机不确定的。这就是随机特性的最初来源。

随机比特位流搜集器的核心是一个定时器和一个计数器。其中,定时器的计数时钟源来自于外部的功能时钟,计时周期数量可由软件配置(TRNG_SDCTL[ENT_DLY])。

在定时器启动的同时,计数器也复位并开始启动,当定时器的周期数达到软件预先配置的数量时,使用功能时钟的上升沿对回环振荡器产生的高速时钟信号进行采样得到一个比特的逻辑值,会被送到随机数数据移位寄存器中并参与移位过程,如此周而复始,后续送入足够多的随机比特,形成比特流。

时钟监测器主要用于监测回环振荡器的频率的变化范围,软件可以读取回环振荡器频率的当前值(TRNG_FRQCNT),并可设定允许范围的上限(TRNG_FRQMAX)和下限(TRNG_FRQMIN),一旦频率的当前值超出设定允许的范围,TRNG就会设定一个标志位TRNG_STAT[FRQ_CT_IF],对应也可以触发中断。时钟检测器相当于实现了一个对回环振荡器频率的硬件比较机制。

错误检测器通过一些测试,以对产生随机数的过程进行统计分析。其中:

长期运行测试(Long Run Test)可以限制在生成随机比特流中连续产生全0或全1的长度(TRNG_CTRL[LRUN_MAX],并称之为“长期运行”事件。当检测到长期运行事件时,TRNG将会自动清空当前缓存的比特流,重新开始新的随机比特流的生成过程。

单边位约束(Monobit Limitation)限制了产生随机比特流过程中,输出0或者1的总数(TRNG_SCML[MONO_RNG]TRNG_SCML[MONO_MAX]),如果产生的随机比特流中破坏了配置好的单边位约束,TRNG将会自动清空当前缓存的比特流,重新开始新的随机比特流的生成过程。

重试次数约束(Retry Count Limitation)限定了因上述原因产生重置的合法次数(TRNG_CTRL[RTY_CT]),当重置次数超过配置数量,将被视为产生错误(TRNG_STAT[HW_ERR_IF]

需要注意的是,这里产生的“错误”并不是因为硬件运行出现故障而产生的错误,而是表示产生随机数过程中超出了某些预设的约束条件,因为产生的数据是随机的,用户不能预判生成数据的内容,所以,当这些所谓的“错误”发生后,TRNG硬件上激活了一些标志位,可以当做是一些状态的提示,用户可以简单地忽略,或者为了适配某些使用随机数的算法,以某些处理方法,适当地重置随机过程并记录统计信息

应用要点

时钟源

TRNG外设相关的时钟源有3个:外设模块的访问时钟(总线时钟)、功能时钟,以及自己内部的回环振荡器。

TRNG挂在APB总线上,当AHB总线主机(CPU)访问TRNG的寄存器时,通过AHB总线到APB总线的外设桥转接到低速设备,此时用到的是系统时钟(System Clock)。

功能时钟(function clock)在手册中描述TRNG的章节中出现多次,通过查阅IPC中的可配置信息可知,YTM32ME微控制器上,固定使用SLOW_BUS_CLK作为时钟源。而SLOW_BUS_CLK`是从系统时钟经过两次分频后得到的。

回环振荡器是TRNG内部实现的一个高速时钟源,频率高(300MHz左右),但不准,作为获取随机数据的信号源。

中断源

TRNG模块设计的中断源如表x所示。

表x TRNG外设模块的中断源

image.png

TRNG的中断源未连接到DMA触发源,因此不能触发DMA搬运过程。

初始化

对TRNG外设模块的配置,包括各种参数、功能开关,均可在初始化过程中完成。

TRNG外设模块设计了一个锁定机制(TRNG_CTRL[UNLOCK]):只有当TRNG_CTRL[UNLOCK]寄存器的值为1时,才能向各配置寄存器中写数;配置完毕后,将TRNG_CTRL[UNLOCK]寄存器写0,以防止各配置参数被意外篡改。

TRNG外设模块包含一个自动复位硬件配置到复位状态的控制位TRNG_CTRL[SWR],每次向该位写1,都将复位多个配置寄存器的值至初始状态。当然,这个控制位,也需要再解锁状态下(TRNG_CTRL[UNLOCK]=1)操作。

TRNG外设模块设计了一个使能控制位TRNG_CTRL[TRNG_EN],这个控制位实际启用随机数生成器是否开始启动生成过程。其开关与否不影响修改其它配置。

数据

顾名思义,TRNG是一个数据生成器,仅输出数据。TRNG生成器每次执行过程,将生成1个256位的随机数,存放在TRNG_ENT0 - TRNG_ENT7的8个32位寄存器中。每当TRNG_STAT[ENT_VAL_IF]标志位置1时,表示这256个比特的随机数据流已经填充完毕,可供软件读走。在软件读走生成数据之前,TRNG将暂停工作。

特别注意,读TRNG_ENT7寄存器的操作,将会触发TRNG继续启动工作,因此,为了读到一个完整一致性的256位随机数,应该先从TRNG_ENT0寄存器开始读数,读到TRNG_ENT7时,软件可以拿已经读到的8个32位数进行后续计算,而硬件也将会重新生成新的随机数填充这8个寄存器。

软件支持

SDK为TRNG设计了驱动程序,供开发者使用。这里列写TRNG驱动程序的API,读者可以一窥TRNG驱动程序的用法。至于具体用法,读者可以体验一下ytmicro-sdk

bool TRNG_Init(TRNG_Type * base, trng_config_t *config);  
bool TRNG_GetEntropyValues(TRNG_Type * base, uint32_t * values);  
uint32_t TRNG_GetStatus(TRNG_Type * base);  
void TRNG_ClearStatus(TRNG_Type * base, uint32_t flags);
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7487

    浏览量

    151022
  • 振荡器
    +关注

    关注

    28

    文章

    3812

    浏览量

    138859
  • 定时器
    +关注

    关注

    23

    文章

    3237

    浏览量

    114442
  • 生成器
    +关注

    关注

    7

    文章

    313

    浏览量

    20973
  • 时钟源
    +关注

    关注

    0

    文章

    93

    浏览量

    15930
收藏 人收藏

    评论

    相关推荐

    TC389芯片上HSM的TRNG随机数功能,如何判断其随机能力呢?

    想咨询一下,TC389芯片上HSM的TRNG随机数功能,如何判断其随机能力呢?有什么资料或者测试内容吗?
    发表于 03-05 07:20

    关于随机数生成器复用的问题

    本人最近用verilog写了一个随机数生成器RNG,生成一个32bits的随机数,然后加入到信道仿真的模块中,在信道仿真的
    发表于 07-27 16:59

    用PIC16F87Aa怎么制作随机数生成器

    嗨,伙计们,我需要用PIC16F87Aa制作随机数生成器,它在两个数字(0-10)或(2-30)之间起作用。事实上,我用移位函数做了一个,但是每次给我相同的数字:(谢谢)
    发表于 04-20 09:52

    Kintex上的随机数生成器测试失败的原因有哪些?

    我想在Kintex-7上生成真正的随机数。我正在关注Xilinx发表的论文,其中环形振荡器用于随机数生成,LHCA已被用作扰码器。但是,每当我捕获11兆字节的数据(
    发表于 04-26 11:06

    YIE002-STM32的随机数生成器构建

    font color=#ff5555 size=2>YIE002开发探索之随机数生成器1 随机数生成器构建2 YIE002-STM32的随机数
    发表于 01-17 07:40

    新手求助怎样去使用随机数生成器RNG呢

    新手求助怎样去使用随机数生成器RNG呢?
    发表于 01-20 06:24

    i.MX8QM随机数生成器符合什么要求?

    大家好, 我们的客户要求我们指定一个真正的随机数生成器。 i.MX8QM 随机数生成器符合什么要求? 以下是对 SE050 中的
    发表于 05-18 06:13

    Arm随机数生成器固件接口1.0平台设计文件

    本文档定义了操作系统(OS)和提供条件熵源的TRNG FW实现之间的接口。 条件熵通常用于种子确定随机数生成器生成密钥,以及其他用例。 本文件认为
    发表于 08-11 07:26

    Arm随机数发生器(TRNG)表征应用说明

    本章概述ARM®随机数生成器(TRNG)及其特性。 ARM®随机数
    发表于 08-29 07:19

    STM32L4随机数生成器模块(RNG)介绍

    基于噪声源的32位随机数生成器。 •使用线性反馈移位寄存器进行后处理。 •由专用时钟(PLL48CLK)计时 •两个连续随机数之间的PLL48CLK时钟信号的40个周期 •可禁用以降
    发表于 09-11 07:29

    如何使用随机数生成器生成私钥

    ,尤其重要。 说到随机,有两个必须要搞清楚的概念:“随机数生成器”(TRNG)和伪
    发表于 03-18 10:40 5016次阅读
    如何使用<b class='flag-5'>随机数</b><b class='flag-5'>生成器</b>来<b class='flag-5'>生成</b>私钥

    在Arduino开放平台上用随机数生成器控制眼睛动作

    随机数生成器计算每只眼睛的新位置,给人一种自然又可怕的眼睛动作~
    的头像 发表于 05-24 06:20 3837次阅读

    YIE002开发探索10-随机数生成器

    生成器1 随机数生成器构建2 YIE002-STM32的随机数生成器编程2.1 随机数
    发表于 01-17 13:06 2次下载
    YIE002开发探索10-<b class='flag-5'>随机数</b><b class='flag-5'>生成器</b>

    Arduino Lotto随机数生成器

    电子发烧友网站提供《Arduino Lotto随机数生成器.zip》资料免费下载
    发表于 11-02 10:59 0次下载
    Arduino Lotto<b class='flag-5'>随机数</b><b class='flag-5'>生成器</b>

    随机数生成器开源分享

    电子发烧友网站提供《随机数生成器开源分享.zip》资料免费下载
    发表于 11-11 11:57 0次下载
    <b class='flag-5'>随机数</b><b class='flag-5'>生成器</b>开源分享