exponenta event banner

Отсутствует ключ однорангового узла

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

Описание

Этот дефект возникает при использовании объекта контекста для получения общего секрета, но ранее объект не был связан с равноправным ключом, отличным от 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 связан с закрытым ключом, но не с одноранговым ключом. 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++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_PKEY_NO_PEER
Воздействие: среднее
CWE ID: 310, 320, 573, 664
Представлен в R2018a