You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.3 KiB

  1. use crate::error::Error;
  2. use openssl::ec::{EcGroup, EcKey};
  3. use openssl::nid::Nid;
  4. use openssl::pkey::{PKey, Private, Public};
  5. use openssl::rsa::Rsa;
  6. fn gen_ec_pair(nid: Nid) -> Result<(PKey<Private>, PKey<Public>), Error> {
  7. let group = EcGroup::from_curve_name(nid).unwrap();
  8. let ec_priv_key = EcKey::generate(&group).unwrap();
  9. let public_key_point = ec_priv_key.public_key();
  10. let ec_pub_key = EcKey::from_public_key(&group, public_key_point).unwrap();
  11. Ok((
  12. PKey::from_ec_key(ec_priv_key).unwrap(),
  13. PKey::from_ec_key(ec_pub_key).unwrap(),
  14. ))
  15. }
  16. pub fn p256() -> Result<(PKey<Private>, PKey<Public>), Error> {
  17. gen_ec_pair(Nid::X9_62_PRIME256V1)
  18. }
  19. pub fn p384() -> Result<(PKey<Private>, PKey<Public>), Error> {
  20. gen_ec_pair(Nid::SECP384R1)
  21. }
  22. fn gen_rsa_pair(nb_bits: u32) -> Result<(PKey<Private>, PKey<Public>), Error> {
  23. let priv_key = Rsa::generate(nb_bits).unwrap();
  24. let pub_key = Rsa::from_public_components(
  25. priv_key.n().to_owned().unwrap(),
  26. priv_key.e().to_owned().unwrap(),
  27. )
  28. .unwrap();
  29. Ok((
  30. PKey::from_rsa(priv_key).unwrap(),
  31. PKey::from_rsa(pub_key).unwrap(),
  32. ))
  33. }
  34. pub fn rsa2048() -> Result<(PKey<Private>, PKey<Public>), Error> {
  35. gen_rsa_pair(2048)
  36. }
  37. pub fn rsa4096() -> Result<(PKey<Private>, PKey<Public>), Error> {
  38. gen_rsa_pair(4096)
  39. }