Пропавшие без вести равноправного ключа

Контекст, используемый для разделяемой секретной деривации, сопоставлен с равноправным ключом 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 проверяет на закрытый ключ в разделяемой секретной деривации.

Риск

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

Фиксация

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

  • Сгенерируйте непустой равноправный ключ.

    Например:

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

  • Сопоставьте непустой объект контекста с равноправным ключом.

    Например:

    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 и сопоставить равноправный ключ с объектом контекста. Убедитесь, что равноправный ключ является непустым.

#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
Влияние: носитель
ID CWE: 310, 320, 573, 664

Введенный в R2018a