Экспорт E C publi c ключ с использованием Rust openssl - PullRequest
0 голосов
/ 12 марта 2020

Я только начинаю с ржавчины и играю с игрушечной библиотекой шифрования, следуя документам на https://docs.rs/openssl/0.10.28/openssl/. Я хотел бы сгенерировать пару ключей ellipti c -curve private + publi c и распечатать их в форматах der или pem. Я обнаружил, что это довольно просто сделать с закрытым ключом

use openssl::ec::{EcKey,EcGroup};
use openssl::nid::Nid;

pub fn generate_keypair() {
    let group = EcGroup::from_curve_name(Nid::SECP256K1).unwrap();
    let key = EcKey::generate(&group).unwrap();
    println!("{:?}", key.private_key_to_der().unwrap()); // can use pem instead and print as utf8-string
}

Однако, похоже, не существует метода, подобного public_key_to_der для EcKey, для экспорта открытого ключа c, даже для отладки. печать не работает:

let public = key.public_key();
println!("{:?}", public);

выдает ошибку компиляции

openssl::ec::EcPointRef` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Хорошо, похоже, мне нужно сначала обернуть его в PKey, используя pkey::from_ec_key.

0 голосов
/ 04 апреля 2020
use openssl::ec::{EcKey,EcGroup, EcPoint};
use openssl::nid::Nid;

fn key_from_public_key() {

    let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap();
    let key = EcKey::generate(&group).unwrap();
    let mut ctx = openssl::bn::BigNumContext::new().unwrap();

    println!("private eckey = {:?}", key.private_key());

    let bytes = key.public_key().to_bytes(&group,
        openssl::ec::PointConversionForm::COMPRESSED, &mut ctx).unwrap();

    println!("public key = {:?}", bytes);

    drop(key);
    let public_key = EcPoint::from_bytes(&group, &bytes, &mut ctx).unwrap();
    let ec_key = EcKey::from_public_key(&group, &public_key).unwrap();

    assert!(ec_key.check_key().is_ok());

}
...