1

今まで私は次のことをしました:

    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 エンジンを使用できるようにしたいと考えています。これがどのように行われるか教えてもらえますか?

4

1 に答える 1

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(...)。おそらく既に switch ケースがあるので、別のケースを追加するだけです。

アプリケーションからこのコマンドを呼び出すENGINE_ctrl_cmd("CMD_GEN_KEYPAIR", 1, (void *)(&adittionalInfo));には、キーを生成するのに十分な情報を aditionalInfo に入力して使用します。私の場合、アプリケーションとエンジンの両方がそれを認識している C 構造体のようなフックを作成したので、エンジンはそれを盲目的に正しい型にキャストできます。

キーを生成したら、それをロードしENGINE_load_private_keyます。

これが「最良の」方法かどうかはわかりませんが、私のニーズには適していました。

于 2013-04-10T14:11:38.383 に答える