Missing peer key

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