admin 管理员组文章数量: 887007
UEFI开发探索93–UEFI下使用YIE002随机数发生器
(请保留-> 作者: 罗冰 )
UEFI下使用YIE002随机数发生器
- 1 代码编写
- 2 测试
在UEFI开发探索72中,曾经规划过YIE002的开发板计划。当时的主要目标是使用YIE002做USB HID的双向通信设备,并在Windows、Linux和UEFI下都实现上位机访问程序。
如今,这些目标都已经实现了。特别是Windows下的测试程序UsbHID,现在成为我专用的测试工具了。
当时的开发计划中,还有一项目前还没有完成,那就是让YIE002开发板提供生成随机数的功能,使得在各个系统下都能通过USB通道得到生成的随机数,包括UEFI系统。
这个目标的灵感来源于国外工程师开发的ChaosKey,是以前学习UEFI开发时,在网上搜寻资料时偶然遇到的。一个小小的产生随机数的设备(U盘大小),作者花了不少心思来制作,让我觉得很有意思。因此,在设计YIE002的时候,就预留了生成随机数的机制。
周末的时候,花了一点时间,终于把这个随机数生成器做成了。具体的过程,请见我的另外一篇博客:YIE002开发探索10-随机数生成器。
今天就来UEFI下使用下这个小设备。
1 代码编写
代码编写的过程实际非常简单,借用了UEFI开发探索88篇的工程HelloHID,稍微修改了下其中的函数,就实现了需要的功能。
将HelloHID改为RngUEFI,包括INF文件和源文件名,都修改下。然后在RobinPkg.dsc中,添加对RngUEFI工程的编译支持,就完成了框架调整。
由于YIE002随机数生成器提供了三种USB HID通信能力,可以使用任意一种方式与之通信。因此,我就直接用Feature Report通信的方式来编写代码了。
增加获取随机数的函数如下:
//Name: GetRNG_YIE002
//Input: index
//Output: RNG
UINT16 GetRNG_YIE002(IN INT16 index)
{EFI_STATUS Status;UINT8 ReportId;UINT8 myBuffer[16];UINT16 random_value;gBS->SetMem(myBuffer,16,0xA0);ReportId = 0;Status = UsbSetReportRequest(gUsbIO[index],0, //interface,ReportId,HID_FEATURE_REPORT,16,myBuffer);if(EFI_ERROR(Status)){Print(L"UsbSetReportRequest Error!\n");return FALSE;}gBS->SetMem(myBuffer,16,0x00);Status = UsbGetReportRequest(gUsbIO[index],0, //interface,ReportId,HID_FEATURE_REPORT,16,myBuffer);if(EFI_ERROR(Status)){Print(L"UsbGetReportRequest Error!\n");return FALSE;}random_value = myBuffer[1];random_value = (random_value<<8);random_value += myBuffer[0];return random_value;
}
主程序中增加访问设备的语句:
//测试YIE002制作的随机数生成器if(retVal){for(i=0; i<20; i++){wRandomValue = GetRNG_YIE002(myDevice);Print(L"------ %02d Get Random number from YIE002:%04x\n",i,wRandomValue);Delayms(1000);}}
就完成了获取随机数的代码了。
实际代码如往常一样,放在了文末了,有兴趣可以自己阅读一下。
2 测试
使用如下命令编译代码:
C:\vUDK2018\edk2>build -p RobinPkg\RobinPkg.dsc -m RobinPkg\Applications\RngUEFI\RngUEFI.inf -a X64
将生成文件RngUEFI.efi拷贝到测试用的UEFI启动U盘中,并将YIE002连接到测试用机器上,启动UEFI Shell。测试结果如图1所示。
图1 测试YIE002的随机数生成器
测试时,将YIE002插在测试机器的USB口上候,在UEFI Shell下使用之前的枚举工具ListUsb.efi,可以看到设备是否插入(我们使用的PID和VID分别为0x4321和0x8765)。
运行RngUEFI.efi,将持续向YIE002获取随机数,图1中可以看出,所得到的都是16位随机值。
测试随机数获取前,运行了三种USB HID的通信方式。上位机通过端点1访问的方式(也即读写文件的访问方式,YIE002使用端点1读写来对应此方式),在此测试机器上不支持,因此返回了错误。
至此,当时设定的YIE002开发板编程几乎,就全部完成了。
Gitee地址:
项目代码位于:/ FF RobinPkg/RobinPkg/Applications/RngUEFI下
本文标签: UEFI开发探索93–UEFI下使用YIE002随机数发生器
版权声明:本文标题:UEFI开发探索93–UEFI下使用YIE002随机数发生器 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732361769h1535417.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论