2017-03-24 45 views
3

我有一個問題試圖使用編譯上一些MIPS設備能夠FIPS的的OpenSSL共享庫(libcrypto)。
我交叉編譯的FIPS對象模塊,然後OpenSSL庫按以下方式(總結):
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值仍然是默認的,所以我有懷疑,堆芯腳本,由fipsld實用叫,沒有嵌入正確的指紋內OpenSSL的共享調試不斷深入目的。
如何檢查incore腳本是否將指紋嵌入共享對象內?
如何打印預期的指紋?
我需要修改incore腳本嗎? (我想這是不允許的)
你有什麼建議嗎?
非常感謝!

P.S .:我使用x86 Linux機器進行交叉編譯。

+0

只是一個FYI ...只有一個MIPS平臺已被驗證。其採用TI TNETV1050處理器的VxWorks 6.8操作環境。另請參閱[OpenSSL FIPS 140-2安全策略2.0版。第9-10頁](https://www.openssl.org/docs/fips/SecurityPolicy-2.0.pdf)。 – jww

+0

[這裏](https://stackoverflow.com/questions/35664412/unable-to-build-a-working-fips-capable-openssl-on-hp-ux)是一個問題,我問了一陣子之前,當我有一個相關的問題。出於調試的目的,你可以修改任何文件(我爲_fips \ _premain.c_,_fips.c_,_fipsld_做過),但是在構建「官方」版本時,你不能改變任何東西(實際上有很多限制)。另外,請確保您的平臺/體系結構對受支持。 – CristiFati

+0

可能有用的問題缺少相當數量的信息。與其猜測潛在的問題,可能[OpenSSL FIPS對象模塊2.0版用戶指南](https://www.openssl.org/docs/fips/UserGuide-2.0.pdf)將是一個好的開始。 – jww

回答

1

我發現了這個問題!我將嘗試解釋整個調試過程和解決方案。

引言:

當OpenSSL的構成爲FIPS能,生成文件調用實用程序編譯過程中,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腳本,堆芯,用來嵌入FIPS目標模塊的預期指紋OpenSSL的共享對象。通過FIPS_SIG環境變量來指定堆內的路徑是很重要的,如:

export FIPS_SIG=$PWD/openssl­fips­2.0/util/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找到所生成的簽名,所以我得出的結論是共享對象被該簽名通過一些嵌入過程之後編輯其他過程。

SOLUTION:

我使用的包生成文件用於以下面的方式格式化的OpenSSL分組:

$(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 

作爲懷疑,化妝積聚共享化妝do_linux共享命令負責以錯誤的方式更改共享對象。
注意不要使用適當的環境變量來調用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

+0

「我可以看到腳本試圖將簽名嵌入到偏移量爲0x001EE6B0的共享對象中」您是否介意解釋如何找到它?謝謝! – zachwhaley

+1

我打印了incore腳本中使用的偏移量(修補代碼),並將偏移量與objdump檢查結果進行了比較 – neoben