Openssl 基于引擎为EVP生成密钥对

Openssl 基于引擎为EVP生成密钥对,openssl,rsa,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, "

到目前为止,我做了以下工作:

    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;
    }  
static const ENGINE_CMD_DEFN md_defns[] = {
    ...    
    {CMD_GEN_KEYPAIR, "CMD_GEN_KEYPAIR", "Used to generate a key pair", ENGINE_CMD_FLAG_STRING}
    ...
};

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

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

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

    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;
    }  
static const ENGINE_CMD_DEFN md_defns[] = {
    ...    
    {CMD_GEN_KEYPAIR, "CMD_GEN_KEYPAIR", "Used to generate a key pair", ENGINE_CMD_FLAG_STRING}
    ...
};
然后,您必须在重载的ctrl\u函数(即您使用
引擎设置的ctrl\u函数(…)设置的函数)中处理此命令。
。您可能已经有了一个开关大小写,所以只需添加另一个大小写即可

要从应用程序调用此命令,请使用
ENGINE\u ctrl\u cmd(“cmd\u GEN\u KEYPAIR”,1,(void*)(&aditioninfo))
,输入足够的信息以生成密钥。在我的例子中,我创建了一个类似钩子的C结构,我的应用程序和引擎都知道它,这样我的引擎就可以盲目地将它转换为正确的类型

生成密钥后,使用
引擎\u加载\u私钥
加载密钥

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