gpt4 book ai didi

linux - 支持 FIPS 的 OpenSSL 交叉编译 : incore fingerprint issue

转载 作者:IT王子 更新时间:2023-10-29 01:20:25 25 4
gpt4 key购买 nike

我在尝试在 MIPS 设备上使用编译为 FIPS 能力OpenSSL 共享库 (libcrypto) 时遇到问题。
我以下列方式(总结)交叉编译了 FIPS 对象模块和 OpenSSL 库:

export FIPS_SIG=<my_path>/incore
./config fips --with-fipsdir=<my_path>/fips-2.0
make depend
make
make install

我完成了所有需要的步骤,所以我能够编译和安装库。
当我尝试从链接 OpenSSL 库的应用程序运行 FIPS_mod_set(1) API 时出现问题。
FIPS 模式初始化失败收到此错误:

2010346568:error:2D06B06F:lib(45):func(107):reason(111):NA:0:

调试 FIPS 代码,我发现问题出在 FIPS_check_incore_fingerprint(void) 函数中:
检查 memcmp(FIPS_signature,sig,sizeof(FIPS_signature)) 失败。
深入调试我发现 FIPS_signature 值仍然是默认值,所以我怀疑 incore 脚本,由 fipsld 调用> 实用程序,未将指纹正确嵌入 OpenSSL 共享对象中。
如何检查 incore 脚本是否在共享对象中嵌入了指纹?
如何打印出预期的指纹?
我需要调整 incore 脚本吗? (我想这是不允许的)
你有什么建议吗?
非常感谢!

附注:我正在使用 x86 Linux 机器进行交叉编译。

最佳答案

我找到问题了!我将尝试解释整个调试过程和解决方案。

简介:

当 OpenSSL 配置为支持 FIPS 时,在编译过程中 Makefile 会调用实用程序 fipsld,这两者都会执行 FIPS 检查对象模块并为应用程序可执行文件生成新的 HMAC-SHA-1 摘要(如官方 OpenSSL 用户指南 https://www.openssl.org/docs/fips/UserGuide-2.0.pdf 中所述)

fipsld 命令需要设置 CCFIPSLD_CC 环境变量,后者优先。
在 Makefile 中你会发现这样的东西:

libcrypto$(SHLIB_EXT): libcrypto.a fips_premain_dso$(EXE_EXT)
@if [ "$(SHLIB_TARGET)" != "" ]; then \
if [ "$(FIPSCANLIB)" = "libcrypto" ]; then \
FIPSLD_LIBCRYPTO=libcrypto.a ; \
FIPSLD_CC="$(CC)"; CC=$(FIPSDIR)/bin/fipsld; \
export CC FIPSLD_CC FIPSLD_LIBCRYPTO; \
fi; \
$(MAKE) -e SHLIBDIRS=crypto CC="$${CC:-$(CC)}" build-shared && \
(touch -c fips_premain_dso$(EXE_EXT) || :); \
else \
echo "There's no support for shared libraries on this platform" >&2; \
exit 1; \
fi

然后,fipsld 实用程序调用 shell 脚本 incore,用于将 FIPS 对象模块的预期指纹嵌入到 OpenSSL 共享对象中。通过 FIPS_SIG env 变量指定 incore 路径很重要,例如:

export FIPS_SIG=$PWD/openssl­fips­2.0/util/incore

调试:

调试 incore 脚本,我可以看到该脚本试图将签名嵌入到偏移量 0x001EE6B0 的共享对象中,而 FIPS_signature 共享对象内的符号位于不同的偏移处,更具体地说是 0x001F0630:

objdump -t libcrypto.so.1.0.0 | grep FIPS_signature
001f0630 g O .data 00000014 FIPS_signature

readelf -a libcrypto.so.1.0.0 | grep FIPS_signature
870: 001f0630 20 OBJECT GLOBAL DEFAULT 18 FIPS_signature
3925: 001f0630 20 OBJECT GLOBAL DEFAULT 18 FIPS_signature

此外,转储共享对象时,我无法在偏移量 0x001EE6B0 处找到生成的签名,因此我得出的结论是,共享对象在签名嵌入过程后由其他进程编辑。

解决方案:

我正在为 OpenSSL 数据包使用一个包 Makefile,格式如下:

$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)
<options>
all
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)
<options>
build-shared
rm $(PKG_BUILD_DIR)/libssl.so.*.*.*
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)
<options>
do_linux-shared
$(MAKE) -C $(PKG_BUILD_DIR)
<options>
install

正如所怀疑的那样,ma​​ke build-sharedma​​ke do_linux-shared 命令导致以错误的方式更改共享对象。
注意 make build-shared 被调用时没有使用正确的环境变量。

我更改了包 Makefile:

$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)
<options>
all
$(MAKE) -C $(PKG_BUILD_DIR)
<options>
install

现在 FIPS_check_incore_fingerprint(void) 函数成功返回,一切正常!

注意:

以下适用于 Android 设备的指南对于找到合适的解决方案非常有用。 https://wiki.openssl.org/index.php/FIPS_Library_and_Android

关于linux - 支持 FIPS 的 OpenSSL 交叉编译 : incore fingerprint issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42995572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com