我正在构建一个支持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并不是很熟悉,除了某种我不熟悉的编译器细微差别,并且正在寻找人们可能提出的任何建议之外,我不知道是什么原因导致了这种情况。
要点:
答案 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,并且所有内容都对齐。