2012-01-11 10 views
3

私はECDH鍵交換GOST 34.10-2001をOpenSSL 1.0.0dを使って実装しようとしています。 私はこのようなGOSTエンジンを搭載しています:(私はそう思う)ロードされ、正常に動作しているこの時点で、GOSTエンジンでOpenSSL Gostエンジンの問題

ENGINE * e = ENGINE_by_id("gost"); 

    if(!e) 
    { 
     e = ENGINE_by_id("dynamic"); 
     if (!e) 
     { 
      ENGINE_load_dynamic(); 
      e = ENGINE_by_id("dynamic"); 
     } 

     if (e && (!ENGINE_ctrl_cmd_string(e, "SO_PATH", "gost", 0) || !ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0))) 
      return 1; 
    } 

    if(!ENGINE_init(e)) 
     return 1; 

    ENGINE_set_default(e, ENGINE_METHOD_ALL); 
    OpenSSL_add_all_algorithms(); 

。私はハッシングと暗号化アルゴリズムを使っていくつかのテストを行った。

しかし、私はECDH(他の側の公開鍵をインポートして共有鍵の生成)を実装しようとすると、不適切な結果(共有鍵が相手側と異なる)が発生しています。

私は、a、b、p、q、x、yのパラメータ、チェックされたコードフローをチェックしましたが、何が間違っているのか理解できませんでした。 VKO 34.10から2001アルゴリズムは、\ ccgost \ gost2001_keyx.c(関数VKO_compute_key)のopenssl \エンジンに実装されているが、私は一般的な機能のECDH_compute_keyを呼んでいるとき、それはVKO_compute_keyにはつながらない。

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD94 
a6 
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD97 
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C611070995AD10045841B09B761B893 
1 
8D91E471E0989CDA27DF505A453F2B7635294F2DDF23E3B122ACC99C9E9F1E14 

あり、一つのことです(これを確認するには、VKO_compute_keyの先頭にint3を設定します)。

私は何か誤解しましたか?または、誰かがopensslのgostエンジンを使用して共有鍵を生成する例を表示できますか?

答えて

0

私はそれが古い質問であることは知っていますが、まだ一部の人にとっては話題かもしれません。

次のコードは、GOSTエンジンを使用するときに共有秘密情報を生成します。

int get_shared_key(
    EVP_PKEY *priv, 
    EVP_PKEY *peer,  
    unsigned char *ukm, 
    int ukm_size, 
    unsigned char *secret, 
    size_t *secret_len) 
{ 
    int result = 0; 
    EVP_PKEY_CTX *ctx = NULL; 
    int key_size = 0; 

    if((ctx = EVP_PKEY_CTX_new(priv, NULL)) == NULL) 
     goto err; 
    if(EVP_PKEY_derive_init(ctx) != 1) 
     goto err; 
    if(EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_SET_IV, ukm_size, ukm) != 1) 
     goto err; 
    if(EVP_PKEY_derive_set_peer(ctx, peer) != 1) 
     goto err; 
    key_size=EVP_PKEY_derive(ctx, NULL, secret_len); 
    if(key_size != GOST_R_34_12_2015_KEY_SIZE) 
     goto err; 
    if(EVP_PKEY_derive(ctx, secret, secret_len) != 1) 
     goto err; 

    result = 1; 
    goto end; 
err: 
    ERR_print_errors_fp(stderr); 
end: 
    if(ctx) 
     EVP_PKEY_CTX_free(ctx); 
    return result; 
} 
関連する問題