监测前体的TRNGS的健康

2021-06-15 02:39:06

这篇文章是关于前体/德堡TRNG的健康监测的更长形式叙事的销请。这是两个帖子的第一个;第二,关于为TRNG实施CSPRNG调节器,将在以后上升。

在线健康监视器是简单的统计测试,使用户能够指示正在生产的熵的质量。在线健康测试就像发动机上的转速表:它们会呈现整体健康状况,并可以检测某些东西何时闻名;但是他们不能告诉你发动机是否正确设计。因此,它们是互惠互动,严谨的诊断测试。我们涵盖了我们的维基上的一些测试,加上我们有一个CI替补脚,它产生了巨大的原始熵,在数月中测量的运行时间,这是一系列打样工具,如Dieharder测试套件和NIST STS测试套房。

重要的是,在原始数据发生的任何调理或混合之前,都会发生健康监测,并且显着地,没有一个人的健康监视器对于TRNG:它甚至建议(NIST SP 800-90B SEC 4.4规范要具有对噪声源量身定制的测试。

我在做任何更改之前的第一件事是一些书籍研究。作为我的研究生顾问,古骑士,曾经说过,“你知道你可以通过在实验室长凳上支出两个星期的图书馆在图书馆中拯救整个下午吗?”

NIST SP 800-90B第4.4节规定了一些健康测试。 NIST规范似乎相当好,所以我将用它作为测试的起点。该测试具有警告,即他们只检测TRNGS中的灾难性失败;它们不替代对设计阶段的TRNG产出的非常详细,长期的统计分析(我们已经完成了)。 NIST建议进行两次测试:重复计数测试和自适应比例测试。

好的,所以现在我们知道测试。在我们的TRNGS的背景下,这些甚至是什么意思?

我们的环形振荡器架构由33个独立环形振荡器组成,可分两看。在第一阶段中,环振荡地彼此独立地收集相位噪声;每个环的状态通过定期拍摄的快照进入状态位。在第二阶段,它们被合并到单个大环振荡器中,然后它们必须达到共识。从共识振荡器拍摄单个比特,并逐渐移动到环形振荡器的状态。

上面是一个简化的“两位”版本的发电机,而不是33个振荡器我们有3个,而不是32位我们得到2.红色箭头是第一阶段的熵流,而绿色箭头是熵的流动是第二阶段的熵流。两阶段重复n + 1位次数(在完整实施的33次,上图中的简化图中的3次)。

由于在可以由软件设定的“停留”阶段,累积相位噪声的较小环振荡器中累积的随机相位(名义上1000ns)

与较小环振荡器的采样抖动相关联的决策噪声,具有初始采样触发器。请注意,环形振荡器以比触发器(100MHz)的采样率更高的频率(〜300-500MHz)操作。

全局阶段在较大环振荡器的共识过程中累积。实现共识的时间由软件设置的“延迟”参数设置(名义上是40ns)

通过对右侧的连续移位的交叉元件混合,以及相位的进一步xor

全局阶段共识和交叉元件混合非常重要,因为环振荡器由于信号和功率上的串扰侧通道而具有耦合和相位锁的趋势。在这种架构中,每个环的局部噪声条件(包括其串扰)应用于32个输出位中的每一个;每个环的振荡都是“复位”,每个交叉元素阶段之间具有任意起始值。

通过在并行描述上述核心的四个实例,将它们的结果一起运行,实现了更高的聚集熵率。此外,通过挑选一些生成的熵并将其添加到基本停留/延迟参数,在运行时动态调整实际延迟/停留参数。

于是,在看这个架构并将其与NIST规范相比,问题是,我们如何应用重复计数测试和自适应比例测试?重复计数测试可能不足以应用于32位聚合输出。在环形振荡器的采样输出,最佳地应用重复计数和自适应比例测试的重复计数和自适应比例测试,只是为了确认没有任何构成环振荡器是任何原因的“卡住”。但是,必须考虑添加这一点的逻辑资源的量,因为我们有(33 * 4)= 132个单独的振荡器来考虑。因此,出于实际原因,它对于从四个核心的每个核心仪器仪器的输出仅是可行的,该输出指示整个振荡器的整个振荡器的健康状况。

选择正确的仪器是棘手的。 “大”环形振荡器实际上是低质量的熵,因为它的时间约为30MHz,但在100MHz上过采样。因此,大多数熵是从“小”环的重复欠采样中的贡献。所选择的最终采样点是从小环和大环的组合“浸泡”足够的熵之后的采样寄存器的输出,以导致有用的测量。

最初,我试图看看“大”振荡器,只试图找到更多“RAW”,在假设下,我们更有可能在系统中捕获不太精致的阶段的问题;问题是,它是如此“生”,我们所捕获的只是问题。但是,我们确实使用此抽头作为“真正的否定”测试,以确保健康测试能够标记熵源,该熵源小于完美。

我还将推出一个额外的测试,它受到STS套件的运行测试的启发,我称之为“MINIRUN”。该测试记录了连续运行的频率:0/1,00/11,000/111,111,0000 / 1111等。该测试将提供更多地洞察环形振荡器的主导投影失效模式,即它振荡作为一个完美同步的方波 - 一种推荐的NIST测试能够捕获的条件。但是,如果振荡器也变得过于确定性,我们应该看到在MiniRuns测试中的运行长度分布的转变。

雪崩发电机由两台雪崩二极管组成,由共用电源偏置,由一对OP-AMPS采样,具有轻微的增益;有关物理和电子设计的详细信息,请参阅其运行理论的页面。在这里,我们专注于其系统集成。每个运算放大器的输出以12位ADC以〜1msps的速率进行采样,并在一起XOR。由于这种采样率接近二极管的有效噪声带宽,我们通过反复转换 - 5和XOR的结果来降低采样率,并且可以通过软件,名义上,32次可以设置的次数。 32位保持寄存器,形成最终的熵输出。该32倍过采样降低了系统的速率至31.25kHz。

两个单独二极管的雪崩特性。这些被认为是从真正热噪声的放大来源的高质量特性。

请注意,两个二极管确实共享偏置电源,因此有机会与电源噪音的一些互相关,但我们在实践中没有看到这一点。

因为我们将雪崩波形和将其折叠起来,我们通常测量的是雪崩波形的预计斜率加上ADC的噪声。值得注意的是,Xilinx 7系列“12位”ADC集成到我们的FPGA中的SNR为60dB。这意味着我们实际上只有10个“良好”位,暗示底部两位通常太吵以用于信号测量。 XADC原始通过提供超过16个样本的自动平均来补偿这种噪声;当采样雪崩噪声发生器时,我们会关闭这一点,因为我们实际上*想要*这种噪音,而是为了Xadc的所有其他职责来打开它。

考虑使用ADC采样此模拟波形的性质也很重要。实际波形本身可以具有DC偏移,或一些总幅度变化,因此自然地LSB将在熵中密集,而MSB可以是几乎恒定的。通过使用5位滑动窗口聚焦在12个中的底部5位,我们有效地忽略了前7位。这对有效波形做了什么?以图形方式显示它有点易于:

如果我们只考虑在12中只考虑11位,我们有效地花了一半的图形,并将“包装自身”,如下所示:

等等。当我们遵循的时间考虑到5位,我们现在拍摄了有效的DC偏移和幅度变化,并将它们转换为另一个随机变量,有助于添加到熵池。现在将其中的两个中有两个,XOR它们在一起,并在ADC本身的有效噪声中添加,并且您已到达ADC熵池的起点。

就在线熵测试而言,将重复计数测试和自适应比例测试应用于从每个雪崩二极管(与完整的12位输出相反的原始ADC进料的底部5位,它可能是最有意义的ADC)。我们不希望使用原始ADC饲料击中“完美熵”,但这些测试应该能够至少隔离例如例如时的情况。偏置电压过低,雪崩效果停止工作。

除了这些测试之外,拥有“绝对偏移”测试可能很好,其中原始雪崩波形的Min / Max在时间窗口中记录,以检测由于老化效果导致的平坦衬里的二极管,或者偏置电压源,否则是故障的。如果攻击者在雪崩二极管顶部恶意地注入确定性波形,但如果攻击者在雪崩二极管的顶部的确定性波形中,则该测试不适合捕获,但是在标称环境条件下是TRNG的核心机制的基本健康检查。

安装在构建前体/漂亮的Soc所需的工具后,我开始编写代码。

想想我想做什么。请参阅本文的第一部分。

将较小的模块包装成模拟框架,使大部分骷髅从壁橱中弹出。

重复1-3,向上工作,直到您到达完整的解决方案。

如果可能的话,通过重新运行SIM,通过重新运行您的SIM,或者更好地重新编译并重新运行您在实际硬件上的测试。

此循环的关键是模拟。你的模拟越好,结果越好。通过“更好的仿真”,我的意思是,测试台中的假设和近似值越少。例如,可以通过将其挂钩到一卷的Verilog向量集中模拟模块,该卷滚动读取和写入周期并验证任何爆炸;或者,可以通过将其挂钩到完全模拟的CPU的模块来模拟模块,使用电源复位和多个时钟阶段,并使用基于RUST的框架来锻炼相同的读取和写入。这两个测试台表面上达到了相同的结果,但后者检查了更多的毛茸茸的角落案例。

对于薄饼/前体,我们开发了一个综合性仿真框架,尽可能地实现了后一种情况。我们模拟了一个完整的门级vex cpu,运行了一个生锈构建的BIOS,就像许多Xilinx提供的硬件模型一样,我们可以为PLL和全球上电复位的东西。

这是我们把火鸡放入烤箱的烹饪秀的重点,对“......和大约五个小时内的效果来说,你应该完成的东西......”但是,以某种方式神奇地拉出一个成品的土耳其雕刻和雕刻当我们完成句子时呈现。

所以:经过更多的驾驶员写作和破坏信号以获得各种度量和故障模式的可见性,我们可以看到在线运行中的操作。

以上是前体上的TRNG测试数据输出的示例,设置为`RO 0`连接到“大”振荡器的位置,该振荡器运行过于缓慢(用作“真正的否定”测试),其他人连接到最终状态用于测试的输出水龙头(用作“真正的正面”)。在输出中,您可以看到四个环形振荡器(编号为0-3),其中每个五个运行长度中的每一个都打印出来。与其他振荡器相比,“RO 0”在跑步长1箱的计数中具有显着的抑郁症(440 VS 515,540和508)。

最后一个细节正在实施miniruns测试的自动决策机制。由于MiniRuns测试不是来自NIST套件,因此我无法简单地阅读手动来导出阈值。相反,我不得不咨询我的Perlfriend,他也恰好成为统计数据的专家,帮助我了解我正在做的事情并导出一个可以帮助我设定限制的模型。最初,她建议了Chi-Square测试。这将是很大的,但是对于自动的快速上电测试来说,数学将太复杂。因此,我们将测试降级为运行的每个“垃圾箱”的计数上的简单最大/最小阈值。我对NIST测试中建议的类似标准,即α= 2 ^ -20,设置阈值,并将其烘焙到硬件代码中。这是一种与原始电子表格的链接,她用于计算Chi-Square和最终,最简单的最小/最大测试。一个未来的升级可以是在XOUS中实施一些重复过程,从Miniruns测试中收集更新的结果,并对其中更复杂的Chi-Square测试;但这绝对是“道路的一个”功能。

结果是我们现在拥有所有强制性NIST测试以及每种类型的TRNG每次“量身定制”测试。添加Miniruns自动化标准将利用率提高到56.5% - 将测试使用的总空间从约2%的FPGA从约2%提高到4%以上。 MiniRuns测试是昂贵的,因为它目前配置为在长度1到5个环振荡器中检查运行范围 - 所以这是5 * 4 *(寄存器/运行〜30?)=〜600寄存器仅用于核心逻辑,不计算状态读数或配置输入。

后来,如果我开始空间耗尽,削减一些仪器或测量的运行的深度可能是合理的事情。我建议处理完全有利于家庭成长的测试的一些效率测试,但最终我可能必须踢出更有效的补充测试。现实是,捍卫在系统中保持较低的符合规范的测试是更容易的,而不是以规范测试为代价为卓越的测试进行卓越的测试。

这是第1部分。如果您超级渴望阅读更多,您可以阅读前体/ Betrusted文档Wiki的TRNG数据调节的完整Wiki条目。或者,您只需等到我绕过将页面砍下到尺寸并将其重新包装成一个更吻合的博客条目。