Как создать EVP_KEY для однорангового ключа с учетом кодировки Base64?

Используя OpenSSL, я создал свой личный / открытый ключ Диффи-Хеллмана и получил открытый ключ моего партнера. Я могу декодировать ключ своего пира из строки Base64 в байтовый массив, но как мне вставить это в мою исходную структуру открытого / закрытого ключа EVP_KEY, чтобы его можно было использовать с EVP_PKEY_derive () для создания общего ключа?

Очень непонятно, что именно нужно делать, чтобы создать EVP_PKEY «peerkey», но вот мой код, который делает это.

void CreateSharedKey(string &peerKey64)
{
EVP_PKEY *publicKey;  // Created earlier
EVP_PKEY *peerKey;

// Decode peer key
unsigned char *pBuff;
int buffLen = base64Decode(peerKey64, &pBuff);
const unsigned char *pConst = pBuff;

// Create peer key
peerKey = d2i_PUBKEY(NULL, &pConst, buffLen);
if (peerKey == NULL)
return;

// Create shared key context
EVP_PKEY_CTX *ctxShared;
ctxShared = EVP_PKEY_CTX_new(publicKey, NULL);
if (ctxShared == NULL)
return;

// Initialize for deriving shared key
if (EVP_PKEY_derive_init(ctxShared) <= 0)
return;

// Add peer key to context
if (int rc = EVP_PKEY_derive_set_peer(ctxShared, peerKey) <= 0)
return;

// Determine buffer length for shared key
size_t sharedKeyBufferSize;
if (EVP_PKEY_derive(ctxShared, NULL, &sharedKeyBufferSize) <= 0)
return;

// Allocate buffer for shared key
unsigned char *sharedKeyBuffer = new unsigned char[sharedKeyBufferSize];
if (sharedKeyBuffer == NULL)
return;

// Derive the shared key
if (EVP_PKEY_derive(ctxShared, sharedKeyBuffer, &sharedKeyBufferSize) <= 0)
{
unsigned long error = ERR_get_error();
cout << "Failed to derive shared key. Error code = " << error << std::endl;
cout << ERR_reason_error_string(error) << std::endl;

return;
}

// Free shared key context
EVP_PKEY_CTX_free(ctxShared);

// Create Base64 shared key string
base64Encode(sharedKeyStr, sharedKeyBuffer, sharedKeyBufferSize);
}

Вывод ошибки OpenSSL выглядит следующим образом:

Не удалось добавить одноранговый узел в контекст общего ключа. Код ошибки = 101298329
разные параметры

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

3

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]