如何编写 OpenSSL 引擎

8

我希望编写一个openssl动态引擎,但是我找不到任何相关的文档。

我想要编写的算法是一个加密算法(例如RSA)和一个哈希算法(例如MD5)。

有没有一些简单的引擎源代码,我可以修改并使用?


可能对其他人有所帮助,虽然有些晚了:为OpenSSL开发引擎 - javex
1
对于所有寻求者,现在可以在OpenSSL Wiki上找到更好的示例,附带源代码:https://wiki.openssl.org/index.php/Creating_an_OpenSSL_Engine_to_use_indigenous_ECDH_ECDSA_and_HASH_Algorithms 祝你好运。 - Jonas
2个回答

2

有没有简单的引擎源代码可以更改并使用?

英特尔的RDRAND引擎非常容易理解。您可以在以下位置找到其源代码:

openssl-1.0.1f$ grep -R -i ENGINE_rdrand *
crypto/engine/eng_rdrand.c:static ENGINE *ENGINE_rdrand(void)
crypto/engine/eng_rdrand.c:    ENGINE *toadd = ENGINE_rdrand();

以下是如何加载并将其设置为默认的随机数生成器引擎(来源于随机数|硬件):

unsigned long err = 0;
int rc = 0;

OPENSSL_cpuid_setup();
ENGINE_load_rdrand();

ENGINE* eng = ENGINE_by_id("rdrand");
err = ERR_get_error();

if(NULL == eng) {
    fprintf(stderr, "ENGINE_load_rdrand failed, err = 0x%lx\n", err);
    abort(); /* failed */
}

rc = ENGINE_init(eng);
err = ERR_get_error();

if(0 == rc) {
    fprintf(stderr, "ENGINE_init failed, err = 0x%lx\n", err);
    abort(); /* failed */
}

rc = ENGINE_set_default(eng, ENGINE_METHOD_RAND);
err = ERR_get_error();

if(0 == rc) {
    fprintf(stderr, "ENGINE_set_default failed, err = 0x%lx\n", err);
    abort(); /* failed */
}

/* OK to proceed */

...
ENGINE_finish(eng);
ENGINE_free(eng);

0

我建议你这样做

apt-get source openssl

这将给您提供openssl源代码。在树中,您可以找到例如crypto/rsa和crypto/md5目录,这可能是您项目的良好起点。此外,它还附带了一些README等形式的文档。

祝玩得愉快。


我能在动态引擎模式下使用它们吗? - hamSh
在我看来就是这样。请查看README.ENGINE文件。它说: 此外,现在通过一个名为“dynamic”的特殊ENGINE提供对外部ENGINE实现的动态绑定。有关详细信息,请参见下面的“DYNAMIC ENGINE”部分。 - Nodebody
好的,我明白了。但是如何编写引擎以动态加载呢?有没有示例引擎可以编译和加载进行测试? - hamSh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接