UEFI开发探索93 – UEFI下使用YIE002随机数发生器

请保留-> 【原文:  https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】

在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地址:https://gitee.com/luobing4365/uefi-explorer
项目代码位于:/ FF RobinPkg/RobinPkg/Applications/RngUEFI下

1,829 total views, 4 views today

发表评论

电子邮件地址不会被公开。