Ошибка кодирования OpenSSL DER ECDSA - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь закодировать ключ 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.

1 Ответ

0 голосов
/ 15 мая 2018

Вы пытаетесь записать закрытый ключ или открытый ключ? Я спрашиваю, потому что ваш код выше size_t n = i2d_PrivateKey(pkey, &buf);, то есть пытается кодировать закрытый ключ, но сообщение об ошибке говорит i2d_PublicKey:unsupported public key type.

В любом случае i2d_PublicKey предназначен для записи открытых ключей в "традиционном" формате старого стиля. Поскольку ED448 является новым алгоритмом, для него не определен такой формат. Вместо этого вы должны использовать формат SubjectPublicKeyInfo. Для этого используется функция OpenSSL (похожая до смешения) i2d_PUBKEY(). Справочная страница находится здесь:

https://www.openssl.org/docs/man1.1.1/man3/i2d_PUBKEY.html

...