基于引擎为EVP生成密钥对

时间:2013-04-10 09:11:09

标签: openssl rsa

到目前为止,我做了以下事情:

    rsa=RSA_generate_key(2048,RSA_F4,NULL,NULL);
    if (rsa == NULL){
        fprintf(stderr, "Could not generate keypair \r\n");
        return EXIT_FAILURE;
    }     
    if ((pk=EVP_PKEY_new()) == NULL){ 
        fprintf(stderr, "Could not instantiate new evp key storage\r\n");
        return EXIT_FAILURE;
    }    

    if (!EVP_PKEY_assign_RSA(pk,rsa)){
        fprintf(stderr, "Could not assign keypair to evp key storage\r\n");
        return EXIT_FAILURE;
    }  

但是,现在我希望能够使用我的自定义openssl引擎。你能告诉我这是怎么做到的吗?

1 个答案:

答案 0 :(得分:3)

您必须先加载引擎。我认为最好的方法是动态加载它(否则你需要与openssl一起编译它):

ENGINE_load_dynamic();
ENGINE *your_engine = ENGINE_by_id("dynamic");

...

if (!ENGINE_ctrl_cmd_string(your_engine, "SO_PATH", "path to your engine here (*.so or *.dll), 0))
{
    // your error handler   
}
if (!ENGINE_ctrl_cmd_string(your_engine, "LIST_ADD", "1", 0))
{
 // your error handler  
}
if (!ENGINE_ctrl_cmd_string(your_engine, "LOAD", NULL, 0))
{
    // your error handler       
}
if (!ENGINE_init(your_engine))
{   
    // your error handler   
}

// You can load your private keys this way:
if (!(pk = ENGINE_load_private_key(your_engine, "probably your password...", NULL, NULL))) 
{

}

// You need to tell OpenSSL that you want to use your Engine, for RSA stuff, for example you may do like this
ENGINE_set_default_RSA(your_engine);

...

然而,要生成密钥,我不知道是否可以仅使用OpenSSL本机接口。对于我的项目,我创建了一个自定义命令。因此,在引擎内的ENGINE_CMD_DEFN中,我添加了以下内容:

static const ENGINE_CMD_DEFN md_defns[] = {
    ...    
    {CMD_GEN_KEYPAIR, "CMD_GEN_KEYPAIR", "Used to generate a key pair", ENGINE_CMD_FLAG_STRING}
    ...
};

然后,您必须在重载的ctrl_function(您使用ENGINE_set_ctrl_function(...)设置的那个)中处理此命令。您可能已经有一个切换案例,所以只需添加另一个案例。

要从您的应用程序调用此命令,请使用ENGINE_ctrl_cmd("CMD_GEN_KEYPAIR", 1, (void *)(&adittionalInfo));,为adittionalInfo提供足够的信息以生成密钥。在我的例子中,我创建了一个类似于C struct的钩子,我的应用程序和我的引擎都知道它,所以我的引擎可以盲目地将它转换为正确的类型。

生成密钥后,请使用ENGINE_load_private_key

加载密钥

我不知道这是否是“最佳”方式,但是适合我的需要。