快速提问:如何验证从命令行编写的自定义openSSL引擎的功能?

现在,我将按照this优秀教程进行操作,并且能够使用我的测试程序(source code here,位于test / wssha256engine_test.c的测试程序)成功地练习引擎(该引擎返回所有2的摘要值)。 。

brett@wintermute:~/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
brett@wintermute:~/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不存在,而只是使用标准算法对字符串进行哈希处理:

brett@wintermute:~/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程序来加载它?以及如何使用引擎从命令行计算摘要?

注意:我可以从命令行加载引擎,只是不使用它。

最佳答案

经过一番挖掘后,我能够弄清为什么引擎的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通过以下(单独的)方式调用摘要选择器功能:


摘要为NULL。在这种情况下,* nids有望被分配一个
零终止的NID数组,并返回带有可用NID数量的调用。 OpenSSL使用它来确定此引擎支持哪些摘要。
摘要为非NULL。在这种情况下,* digest有望被分配给指向与nid给定的NID对应的EVP_MD结构的指针。如果请求NID是此引擎支持的请求,则调用以1返回,否则返回0。


因此,即使我的引擎支持sha256,CLI调用也不起作用,因为在调用摘要选择器功能之前,必须未使用摘要对它进行初始化(不知道使用CLI时的操作顺序)。但是,当我在测试程序中手动将其初始化时,一切正常。更改为非失败的返回值以支持调用1.以上已解决了该问题。

关于c - 从命令行测试自定义OpenSSL引擎,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43442572/

10-13 22:38