OpenSSL FIPS模块Incore脚本签名一个接一个地

时间:2018-03-15 11:17:22

标签: openssl fips

我正在构建一个支持FIPS的OpenSSL版本,用作共享库,使用以下版本:

FIPS模块:2.0.16

OpenSSL:1.0.2n

当我本地为x86构建它时,我没有问题,模块可以成功进入FIPS模式(通过FIPS_mode_set(1))。

然而,当我为arm(linux_armv4)交叉编译并使用提供的incore脚本生成库指纹时," FIPS_mode_set(1)"呼叫失败,指纹无效。

我将此跟踪到了incore脚本本身,其中脚本获得了" FIPS_text_start"和" FIPS_text_end"。当被删除时,这些地址似乎是库中符号的实际位置值的1。为了确认,我从每个中减去1并重新运行签名生成(在下面给出之前和之后):

注意:此代码段从内容脚本的第407行开始

在:

sub FIPS_incore_fingerprint {
  my $p1  = $FIPS_text_start->{st_offset};
  my $p2  = $FIPS_text_end->{st_offset};

在:

sub FIPS_incore_fingerprint {
  my $p1  = $FIPS_text_start->{st_offset}-1;
  my $p2  = $FIPS_text_end->{st_offset}-1;

当加载到arm系统时,传递指纹并返回" FIPS_mode_set"成功。

但是,根据OpenSSL FIPS用户指南中的指导,该更改可能会使库的FIPS认证失效。我对perl并不是很熟悉,除了某种我不熟悉的编译器细微差别,并且正在寻找人们可能提出的任何建议之外,我不知道是什么原因导致了这种情况。

要点:

  • 生成支持FIPS的OpenSSL版本
  • 在x86上正常工作
  • 交叉编译失败指纹检查由于出现故障 由FIPS_text_start和的incore脚本找到的不正确的偏移量(偏离1) FIPS_text_end
  • 不确定如何正确修复,因为相信脚本修改被认为是禁止的

1 个答案:

答案 0 :(得分:0)

我只是在Linux / ARM平台上遇到了同样的问题。您是否有可能在构建THUMB代码而不是ARM?

不幸的是,似乎FIPS incore脚本仅支持传统的ARM指令集,而不考虑THUMB模式。

知道您是否正在使用THUMB代码进行构建的一种简单方法是在gcc命令行中查找“ -mthumb”标志。就我而言,我删除了“ -mthumb”标志,所有内容突然正确对齐,而无需更改incore脚本。

说明

ARM体系结构支持2个指令集系列:传统的32位ARM指令和16位THUMB指令。

在ARM模式下,所有地址必须被4整除(对齐4个字节),在THUMB模式下,所有地址必须被2整除(对齐2个字节),而所有奇数地址都未使用。他们决定使用地址的最低有效位(始终为零)来确定是否应使用ARM(LSB = 0)或THUMB(LSB = 1)指令运行分支的代码。换句话说,当我们看到一个奇数的地址号时,这意味着位于[odd_address-1]的代码需要被解释为THUMB指令。参考:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0100a/armasm_cegbgefe.htm

FIPS incore脚本直接使用ELF符号表来查找FIPS_text_start和FIPS_text_end对象的地址,而无需查看它们是否为奇/偶数。如果要签名的模块是在THUMB模式下构建的,则地址的LSB将设置为1,解释脚本中所需的“ -1”偏移量。当然,如果模块是使用传统的ARM指令集构建的,则地址的LSB设置为0,并且所有内容都对齐。