メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ピア キーが見つかりません

共有秘密の導出に使用されるコンテキストが、NULL ピア キーに関連付けられているか、ピア キーにまったく関連付けられていない

説明

この欠陥は、共有秘密の導出にコンテキスト オブジェクトを使用したが、そのオブジェクトを前もって非 NULL ピア キーに関連付けていなかった場合に発生します。

たとえば、コンテキスト オブジェクトを初期化してから、そのオブジェクトをピア キーに関連付ける中間ステップなしで、共有秘密の導出にそのオブジェクトを使用します。

EVP_PKEY_derive_init(ctx);
/* Missing step for associating peer key with context */
ret = EVP_PKEY_derive(ctx, out_buf, &out_len);

対応するチェッカー [秘密鍵が見つかりません] は、共有秘密の導出で秘密鍵をチェックします。

リスク

ピア キーがないと、共有秘密の導出ステップが発生しません。冗長な操作は多くの場合、コーディング エラーを示します。

修正方法

共有秘密の導出ステップの配置をチェックします。操作が意図されている場合、操作の前に次のステップを完了するようにします。

  • 非 NULL ピア キーを生成する。

    次に例を示します。

    EVP_PKEY* peerkey = NULL;
    EVP_PKEY_keygen(EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL), &peerkey);

  • 非 NULL コンテキスト オブジェクトとピア キーを関連付ける。

    次に例を示します。

    EVP_PKEY_derive_set_peer(ctx,peerkey);
    

すべて展開する

#include <stddef.h>
#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
size_t out_len;

int func(EVP_PKEY *pkey){
  if (pkey == NULL) fatal_error(); 

  EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(pkey, NULL); 
  if (ctx == NULL) fatal_error();
  ret = EVP_PKEY_derive_init(ctx);
  if (ret <= 0) fatal_error();
  return EVP_PKEY_derive(ctx, out_buf, &out_len); 
}

この例では、コンテキスト オブジェクト ctx が秘密鍵に関連付けられていますが、ピア キーには関連付けられていません。関数 EVP_PKEY_derive は、共有秘密の導出にこのコンテキスト オブジェクトを使用します。

修正 — コンテキストにピア キーを設定

1 つの修正方法として、関数 EVP_PKEY_derive_set_peer を使用してピア キーとコンテキスト オブジェクトを関連付けます。ピア キーが NULL でないことを確認します。

#include <stddef.h>
#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
size_t out_len;

int func(EVP_PKEY *pkey,  EVP_PKEY* peerkey){
  if (pkey == NULL) fatal_error(); 
  if (peerkey == NULL) fatal_error(); 
  
  EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(pkey, NULL); 
  if (ctx == NULL) fatal_error();
  ret = EVP_PKEY_derive_init(ctx);
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_derive_set_peer(ctx,peerkey); 
  if (ret <= 0) fatal_error();
  return EVP_PKEY_derive(ctx, out_buf, &out_len); 
}

結果情報

グループ: 暗号化
言語: C | C++
既定値: オフ
コマンド ライン構文: CRYPTO_PKEY_NO_PEER
影響度: Medium

バージョン履歴

R2018a で導入