OpenSSL C API — получение длины открытого ключа в кодировке DER

#c #openssl #public-key

#c #openssl #открытый ключ

Вопрос:

Я хотел бы определить длину ключа открытого ключа, закодированного в DER формате, при использовании OpenSSL API C .

Это довольно просто сделать с ключом, закодированным в PEM формате:

 FILE *fp = fopen(argv[1], "rb");
RSA *rsa_key = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL);
int keylength = RSA_size(rsa_key);
  

(предполагается, что загружаемый ключ был передан в качестве аргумента)

К сожалению, эквивалентной DER_read_RSA_PUBKEY функции нет. Я пробовал это с i2d_RSA_PUBKEY_fp помощью and d2i_RSA_PUBKEY_fp , но безрезультатно — только ошибки сегментации.

Разница между _RSA_PUBKEY и _RSAPublicKey, по-видимому, заключается в том, что первый использует структуру SubjectPublicKeyInfo (открытый ключ сертификата), а второй использует структуру RSAPublicKey PKCS # 1.

Комментарии:

1. d2i_RSA_PUBKEY_fp — эквивалентная функция для чтения DER. Если вы видите ошибки seg из-за этого, возможно, вы хотели бы поделиться проблемным кодом?

Ответ №1:

Семейство функций d2i_ * доступно для преобразования DER во внутренние структуры данных openssl.

Итак, вы должны иметь возможность использовать:

 FILE *fp = fopen(argv[1], "rb");
RSA *rsa_key = d2i_RSAPublicKey_fp(fp, NULL);
int keylength = RSA_size(rsa_key);
  

для достижения того, чего вы хотите.

Комментарии:

1. Примечание: d2i_RSAPublicKey_fp это API OpenSSL 1.1.0 и более поздних версий. Если вы все еще используете OpenSSL 1.0.2 (скорее всего, из-за соответствия требованиям FIPS), этот API недоступен, и вам придется использовать свой собственный.

2. Это было абсолютно полезно и кратко, спасибо @Ctx. Дополнительная информация для тех, кто может использовать это решение и по-прежнему получает ошибки сегментации: попробуйте инициализировать свою структуру RSA с помощью NULL, а не только объявлять ее без инициализации.