2017-04-16 84 views
0

快速問題:如何驗證我從命令行寫入的自定義openSSL引擎的功能?從命令行測試自定義openSSL引擎

現在我與this偉大的教程進行操作,請和我能夠成功地發揮發動機使用我的測試程序(source code here,位於測試/ wssha256engine_test.c測試程序)(返回全2的的摘要值) 。

[email protected]:~/openssl_ws/wssha256engine$ make test 
make[1]: Entering directory 
/home/brett/openssl_ws/wssha256engine/test 
make[1]: '../bin/test' is up to date. 
make[1]: Leaving directory 
/home/brett/openssl_ws/wssha256engine/test 
[email protected]:~/openssl_ws/wssha256engine$ bin/test 
Engine Loaded... 
Initializing wssha256 engine... 
*TEST: Successfuly initialized engine [A test engine for the ws sha256 hardware encryption module, on the Xilinx ZYNQ7000] 
    init result = 1 
Digest NID=672 requested 
SHA256 algorithm context initialized 
*TEST: Digest INIT 1 
SHA256 update 
*TEST: Digest Update 1 
SHA256 final: sizeof(EVP_MD)= 120 
SHA256 cleanup 
*TEST: Digest Final 1 Digest size:32 
22222222222222222222222222222222 

然而,由於原因,我想也使用OpenSSL命令行界面來鍛鍊我剛寫的引擎,並將其計算摘要一個隨機字符串的像this other tutorial,僅僅使用SHA256,而不是MD5。

但是當我嘗試這樣做,發動機不加載,並導致一個錯誤告訴我,我消化的NID不存在,只是與散列標準算法不是字符串:

[email protected]:~/openssl_ws/wssha256engine$ echo "Hello" | openssl dgst -engine /home/brett/Thesis/openssl_ws/wssha256engine/bin/libwssha256engine.so -sha256 
ERROR: Digest is empty! (NID = 0) 
engine "wssha256" set. 
(stdin)= 66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18 

爲什麼我不能在命令行上使用我的引擎,但是我可以創建一個C程序來加載它?我怎樣才能使用我的引擎從命令行計算摘要?

注:我可以從命令行加載引擎,只是不使用它。

+0

如果我遵循你的最終問題,答案將是你的'shell'不知道你爲了加載它而編寫的C程序加載的初始化openssl環境。據我所知,無法告訴openssl界面使用單獨的引擎。如果你想通過CLI界面使你的引擎可用,那麼你需要實現一個小shell(通過'execv'等)將命令傳遞給你的引擎,或者爲你的引擎提供一個輸入例程,你可以重定向想要的命令。 –

+0

@ DavidC.Rankin我不認爲是這樣。許多教程以我想要的方式使用引擎API – Brett

+0

現在,您變得更有意義了。你的C程序是根據特定的API編寫的。您在說openssl CLI爲您使用的API提供了特定的鉤子,但是當您嘗試使用C程序時,當您嘗試初始化引擎時,會收到'錯誤:摘要爲空!你是否遵守了頁面的**準備**部分的所有**要求?特別是「* OpenSSL引擎存儲在/ usr/lib/engines/*」中? –

回答

0

經過一番挖掘,我能夠弄清楚爲什麼我的引擎的CLI調用不起作用,並解決了問題。

問題出在我的摘要選擇器函數中(原始的破壞代碼在下面註釋掉)。最初,我從摘要選擇器函數返回了一個失敗狀態,而不是返回引擎支持的摘要ID的數量。

static int wssha256engine_digest_selector(ENGINE *e, const EVP_MD **digest, const int **nids, int nid) 
{ 
    if (!digest) 
    { 
    *nids = wssha256_digest_ids; 

    // THIS ORIGINAL CODE CAUSES THE ENGINE TO NEVER INITIALIZE FROM A CLI INVOCATION 
    //printf("ERROR: Digest is empty! (NID = %d)\n",nid); 
    //return FAIL; 

    // THIS FIXES IT 
    int retnids = sizeof(wssha256_digest_ids - 1)/sizeof(wssha256_digest_ids[0]); 
    printf("wssha256engine: digest nids requested...returning [%d]\n",retnids); 
    return retnids; 
} 

閱讀更加緊密,我們可以發現,OpenSSL的在下面(獨立)的方式調用摘要選擇功能:

  1. 與消化爲NULL。在這種情況下,* nids預計會被分配一個 零終止的NID數組,並且該調用將返回可用的NID數。 OpenSSL使用它來確定此引擎支持哪些摘要。
  2. 其中digest非空。在這種情況下,*摘要應該被分配一個指向EVID_MD結構的指針,該結構對應於由nid給出的NID。如果請求NID是該引擎支持的請求,則返回1,否則返回0.

所以即使我的引擎支持sha256,在調用摘要選擇器函數之前(不知道使用CLI時的操作順序)。但是,當我在我的測試程序中手動初始化它時,一切正常。更改爲非故障返回值以支持調用1.上面解決了問題。