コンテキストが暗号化操作用に正しく初期化されていません
公開鍵の暗号化操作に使用されるコンテキストが別の操作用に初期化されている
説明
この欠陥は、特定の公開鍵暗号化操作用に EVP_PKEY_CTX オブジェクトを初期化したが、そのオブジェクトを別の操作に使用した場合に発生します。
たとえば、暗号化用にコンテキストを初期化します。
ret = EVP_PKEY_encrypt_init(ctx);
ret = EVP_PKEY_decrypt(ctx, out, &out_len, in, in_len);
チェッカーでは、次の関数で使用されているコンテキスト オブジェクトが、対応する初期化関数を使用して初期化されているかどうかを検出します。EVP_PKEY_paramgen、EVP_PKEY_keygen、EVP_PKEY_encrypt、EVP_PKEY_verify、EVP_PKEY_verify_recover、EVP_PKEY_decrypt、EVP_PKEY_sign、EVP_PKEY_derive および EVP_PKEY_derive_set_peer。
リスク
同じコンテキストに対してさまざまな操作を混在させると、コードがわかりにくくなる可能性があります。現在のオブジェクトを暗号化、復号化、署名、または別の操作のどれに使用しているか、ひとめで判断するのは難しくなります。また、混在により、操作の失敗や予期しない暗号文につながる可能性もあります。
修正方法
操作の特定のファミリに対してコンテキストを設定した後は、その操作のファミリにのみそのコンテキストを使用します。たとえば、EVP_PKEY_CTX コンテキスト オブジェクトを初期化および使用するために、以下のペアの関数を使用します。
EVP_PKEY_encryptを使用して暗号化を行う場合は、コンテキストの初期化にEVP_PKEY_encrypt_initを使用する。EVP_PKEY_verifyを使用して署名検証を行う場合は、コンテキストの初期化にEVP_PKEY_verify_initを使用する。EVP_PKEY_keygenを使用してキー生成を行う場合は、コンテキストの初期化にEVP_PKEY_keygen_initを使用する。
操作の別のファミリに対して既存のコンテキスト オブジェクトを再利用する場合は、そのコンテキストを再初期化します。
例
結果情報
| グループ: 暗号化 |
| 言語: C | C++ |
| 既定値: オフ |
コマンド ライン構文: CRYPTO_PKEY_INCORRECT_INIT |
| 影響度: Medium |
バージョン履歴
R2018a で導入