Missing peer key

Контекст, используемый для производной от общего секрета, связан с одноранговым ключом NULL или не связан с одноранговым ключом вообще

Описание

Этот дефект возникает, когда вы используете объект контекста для деривации общего секрета, но ранее вы не связывали объект с одноранговым ключом, отличным от NULL.

Например, вы инициализируете объект контекста, а затем используете объект для деривации общего секрета без промежуточного шага, где объект связан с одноранговым ключом:

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

Блок проверки аналогов Missing private key проверяет наличие закрытого ключа при деривации общего секрета.

Риск

Без однорангового ключа шаг вывода общего секрета не происходит. Избыточная операция часто указывает на ошибку кодирования.

Зафиксировать

Проверьте размещение шага деривации общего секрета. Если операция предназначена, убедитесь, что вы завершили следующие шаги до операции:

  • Сгенерируйте одноранговый ключ, отличный от 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 связан с закрытым ключом, но не с одноранговым ключом. The EVP_PKEY_derive функция использует этот контекстный объект для производных от общего секрета.

Коррекция - Установите одноранговый ключ в контексте

Одной из возможных коррекций является использование функции 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++
По умолчанию: Off
Синтаксис командной строки : CRYPTO_PKEY_NO_PEER
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 310, 320, 573, 664
Введенный в R2018a