Update to latest RSA

This commit is contained in:
asonix 2021-08-01 15:08:54 -05:00
parent 92173328fc
commit 3cf9079878
2 changed files with 22 additions and 22 deletions

View file

@ -1,7 +1,7 @@
[package]
name = "rsa-magic-public-key"
description = "Converting between the Magic Public Key format and a RustCrypto RSA type"
version = "0.3.0"
version = "0.4.0"
license-file = "LICENSE"
authors = ["asonix <asonix@asonix.dog>"]
edition = "2018"
@ -13,7 +13,7 @@ readme = "README.md"
[dependencies]
base64 = "0.13"
num-bigint-dig = "0.7"
rsa = "0.4.0"
rsa = "0.5.0"
thiserror = "1.0.9"
[dev-dependencies]

View file

@ -1,4 +1,4 @@
//! Encode RSA's Public Key as a Magic Public Key
//! Encode Rsa's Public Key as a Magic Public Key
//!
//! This implementation has been reverse-engineered from Mastodon's implementation, since no
//! documentation for the Magic Public Key format could be found online (Maybe I didn't look hard
@ -8,14 +8,14 @@
//! From private key
//! ```rust
//! # let mut rng = rand::thread_rng();
//! # let private_key = rsa::RSAPrivateKey::new(&mut rng, 2048).unwrap();
//! # let private_key = rsa::RsaPrivateKey::new(&mut rng, 2048).unwrap();
//! use rsa_magic_public_key::AsMagicPublicKey;
//! let string = private_key.as_magic_public_key();
//! ```
//! From public key
//! ```rust
//! # let mut rng = rand::thread_rng();
//! # let private_key = rsa::RSAPrivateKey::new(&mut rng, 2048).unwrap();
//! # let private_key = rsa::RsaPrivateKey::new(&mut rng, 2048).unwrap();
//! # let public_key = private_key.to_public_key();
//! use rsa_magic_public_key::AsMagicPublicKey;
//! let string = public_key.as_magic_public_key();
@ -24,24 +24,24 @@
//! ```rust
//! # use rsa_magic_public_key::AsMagicPublicKey;
//! # let mut rng = rand::thread_rng();
//! # let private_key = rsa::RSAPrivateKey::new(&mut rng, 2048).unwrap();
//! # let private_key = rsa::RsaPrivateKey::new(&mut rng, 2048).unwrap();
//! # let magic_public_key = private_key.as_magic_public_key();
//! use rsa::RSAPublicKey;
//! use rsa::RsaPublicKey;
//! use rsa_magic_public_key::FromMagicPublicKey;
//! let public_key = RSAPublicKey::from_magic_public_key(&magic_public_key).unwrap();
//! let public_key = RsaPublicKey::from_magic_public_key(&magic_public_key).unwrap();
//! ```
use base64::{decode_config, encode_config, URL_SAFE};
use num_bigint_dig::BigUint;
use rsa::{PublicKey, RSAPublicKey};
use rsa::{PublicKey, RsaPublicKey};
use thiserror::Error;
/// Helper trait to add functionality to RSA types
/// Helper trait to add functionality to Rsa types
pub trait AsMagicPublicKey {
/// Produce a magic-public-key formatted string
fn as_magic_public_key(&self) -> String;
}
/// Helper trait to add functionality to RSA types
/// Helper trait to add functionality to Rsa types
pub trait FromMagicPublicKey {
/// Parse a type from a magic-public-key formatted string
fn from_magic_public_key(magic_public_key: &str) -> Result<Self, KeyError>
@ -56,7 +56,7 @@ pub enum KeyError {
#[error("The provided key is malformed")]
Malformed,
/// The magic-public-key is not RSA
/// The magic-public-key is not Rsa
#[error("The provided key is of the wrong kind")]
Kind,
}
@ -69,17 +69,17 @@ where
let n = encode_config(&self.n().to_bytes_be(), URL_SAFE);
let e = encode_config(&self.e().to_bytes_be(), URL_SAFE);
format!("RSA.{}.{}", n, e)
format!("Rsa.{}.{}", n, e)
}
}
impl FromMagicPublicKey for RSAPublicKey {
impl FromMagicPublicKey for RsaPublicKey {
fn from_magic_public_key(magic_public_key: &str) -> Result<Self, KeyError> {
let mut iter = magic_public_key.split('.');
let kind = iter.next().ok_or(KeyError::Malformed)?;
match kind {
"RSA" => (),
"Rsa" => (),
_ => return Err(KeyError::Kind),
};
@ -92,7 +92,7 @@ impl FromMagicPublicKey for RSAPublicKey {
let n = BigUint::from_bytes_be(&n);
let e = BigUint::from_bytes_be(&e);
RSAPublicKey::new(n, e).map_err(|_| KeyError::Malformed)
RsaPublicKey::new(n, e).map_err(|_| KeyError::Malformed)
}
}
@ -105,32 +105,32 @@ impl From<base64::DecodeError> for KeyError {
#[cfg(test)]
mod tests {
use crate::{AsMagicPublicKey, FromMagicPublicKey};
use rsa::{RSAPrivateKey, RSAPublicKey};
use rsa::{RsaPrivateKey, RsaPublicKey};
#[test]
fn can_complete_cycle() {
let mut rng = rand::thread_rng();
let rsa = RSAPrivateKey::new(&mut rng, 2048).unwrap();
let rsa = RsaPrivateKey::new(&mut rng, 2048).unwrap();
let string = rsa.as_magic_public_key();
let res = RSAPublicKey::from_magic_public_key(&string);
let res = RsaPublicKey::from_magic_public_key(&string);
assert!(res.is_ok());
}
#[test]
fn asonix_key_is_valid() {
key_is_valid("RSA.wEvEsHqM3twoC2F3KYMQ9YOialfVQX4StkLvhLUwFv8qpmY7ZSHHl2TWpnzlo5iWS5Pi2vC41HUGYz9XT5G74IUOyuIkjTL1FIcPJDcUFCzQjN3QZcHLPJPJVNOOOEiOk8__paOyrqJTq9ikcJDMJ8KTWQgk1leOxUVEN5uaQ-p9IBFbXC76-RqabfEoqLZagVMDSOfeC2uR9xZ1q5HkFveRTGs84QLR7FJVvx078nszx4UQGnmP0M-0sOeRJGK17IoJmhaok1XBpP6XFQ45vYeIRiaFj0Pc9GNISCW70dVXKMhv-K07orQJm6PwP8USyhq4tLkq6tcPbGRqEk3ZXw==.AQAB");
key_is_valid("Rsa.wEvEsHqM3twoC2F3KYMQ9YOialfVQX4StkLvhLUwFv8qpmY7ZSHHl2TWpnzlo5iWS5Pi2vC41HUGYz9XT5G74IUOyuIkjTL1FIcPJDcUFCzQjN3QZcHLPJPJVNOOOEiOk8__paOyrqJTq9ikcJDMJ8KTWQgk1leOxUVEN5uaQ-p9IBFbXC76-RqabfEoqLZagVMDSOfeC2uR9xZ1q5HkFveRTGs84QLR7FJVvx078nszx4UQGnmP0M-0sOeRJGK17IoJmhaok1XBpP6XFQ45vYeIRiaFj0Pc9GNISCW70dVXKMhv-K07orQJm6PwP8USyhq4tLkq6tcPbGRqEk3ZXw==.AQAB");
}
#[test]
fn sir_boops_key_is_valid() {
key_is_valid("RSA.vwDujxmxoYHs64MyVB3LG5ZyBxV3ufaMRBFu42bkcTpISq1WwZ-3Zb6CI8zOO-nM-Q2llrVRYjZa4ZFnOLvMTq_Kf-Zf5wy2aCRer88gX-MsJOAtItSi412y0a_rKOuFaDYLOLeTkRvmGLgZWbsrZJOp-YWb3zQ5qsIOInkc5BwI172tMsGeFtsnbNApPV4lrmtTGaJ8RiM8MR7XANBOfOHggSt1-eAIKGIsCmINEMzs1mG9D75xKtC_sM8GfbvBclQcBstGkHAEj1VHPW0ch6Bok5_QQppicyb8UA1PAA9bznSFtKlYE4xCH8rlCDSDTBRtdnBWHKcj619Ujz4Qaw==.AQAB");
key_is_valid("Rsa.vwDujxmxoYHs64MyVB3LG5ZyBxV3ufaMRBFu42bkcTpISq1WwZ-3Zb6CI8zOO-nM-Q2llrVRYjZa4ZFnOLvMTq_Kf-Zf5wy2aCRer88gX-MsJOAtItSi412y0a_rKOuFaDYLOLeTkRvmGLgZWbsrZJOp-YWb3zQ5qsIOInkc5BwI172tMsGeFtsnbNApPV4lrmtTGaJ8RiM8MR7XANBOfOHggSt1-eAIKGIsCmINEMzs1mG9D75xKtC_sM8GfbvBclQcBstGkHAEj1VHPW0ch6Bok5_QQppicyb8UA1PAA9bznSFtKlYE4xCH8rlCDSDTBRtdnBWHKcj619Ujz4Qaw==.AQAB");
}
fn key_is_valid(key: &str) {
let res = RSAPublicKey::from_magic_public_key(key);
let res = RsaPublicKey::from_magic_public_key(key);
assert!(res.is_ok());