Я пытаюсь закодировать ключ ECDSA Curve448 в небольшой и переносимый байтовый массив. Я пытаюсь использовать DER для достижения этой цели, так как низкоуровневые API не работают с Curve448. Тем не менее, когда я использую следующий код:
std::vector<std::vector<uint8_t>> vecs;
uint8_t* buf = nullptr;
EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_ED448, NULL);
EVP_PKEY_keygen_init(pctx);
EVP_PKEY* pkey;
EVP_PKEY_keygen(pctx, &pkey);
EVP_PKEY_CTX_free(pctx);
size_t n = i2d_PublicKey(pkey, &buf);
ERR_print_errors_fp(stderr);
vecs.emplace_back(buf, buf + n);
n
установлен в -1, и так vecs.emplace_back
выходит из строя. ERR_print_errors_fp печатает:
140691149055104:error:0D0A40A7:asn1 encoding routines:i2d_PublicKey:unsupported public key type:../crypto/asn1/i2d_pu.c:35
Как мне решить эту проблему, или есть лучший способ, которым я должен идти об этом?
Я использую openssl v1.1.1 из экспериментального Debian.
Вы пытаетесь записать закрытый ключ или открытый ключ? Я спрашиваю, потому что ваш код выше имеет size_t n = i2d_PrivateKey(pkey, &buf);
то есть пытается закодировать закрытый ключ, но сообщение об ошибке говорит i2d_PublicKey:unsupported public key type
,
Тем не мение i2d_PublicKey
предназначен для записи открытых ключей в «традиционном» формате старого стиля. Поскольку ED448 является новым алгоритмом, для него не определен такой формат. Вместо этого вы должны использовать формат SubjectPublicKeyInfo. Функция OpenSSL для этого является (до смешного похожа) i2d_PUBKEY()
, Справочная страница находится здесь:
Других решений пока нет …