From e28c83fcb8c989bdc31ebdfe10902f0855b08192 Mon Sep 17 00:00:00 2001 From: Evan Feenstra Date: Wed, 29 Jun 2022 11:03:31 -0700 Subject: [PATCH] test RSA encrypt/decrypt --- sphinx-key/Cargo.toml | 3 +++ sphinx-key/src/conn/http.rs | 12 ++++++++++++ sphinx-key/src/main.rs | 28 ++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/sphinx-key/Cargo.toml b/sphinx-key/Cargo.toml index 5d266b2..d227160 100644 --- a/sphinx-key/Cargo.toml +++ b/sphinx-key/Cargo.toml @@ -31,6 +31,9 @@ url = "2" serde_urlencoded = "0.7.1" serde = { version = "1.0.137", default-features = false } serde_json = { version = "1.0.81", default-features = false } +rsa = "0.7.0-pre" +rand = "0.8" +hex = "0.4.3" [patch.crates-io] # updates the "rand" create to use esp RNG diff --git a/sphinx-key/src/conn/http.rs b/sphinx-key/src/conn/http.rs index f21cc1c..b167598 100644 --- a/sphinx-key/src/conn/http.rs +++ b/sphinx-key/src/conn/http.rs @@ -7,6 +7,9 @@ use std::sync::{Condvar, Mutex, Arc}; use embedded_svc::httpd::registry::Registry; use serde::Deserialize; +use rsa::{PublicKey, RsaPrivateKey, RsaPublicKey, PaddingScheme}; +use rsa::pkcs8::EncodePublicKey; + #[derive(Clone, Debug, Deserialize)] pub struct Params { pub config: String @@ -15,9 +18,18 @@ pub struct Params { #[allow(unused_variables)] pub fn config_server(mutex: Arc<(Mutex>, Condvar)>) -> Result { + let mut rng = rand::thread_rng(); + let bits = 2048; + let priv_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key"); + let pub_key = RsaPublicKey::from(&priv_key); + let der = pub_key.to_public_key_der().expect("could not encode DER"); + let hexder = der.into_vec(); + let server = idf::ServerRegistry::new() .at("/") .get(|_| Ok(html::HTML.into()))? + .at("/pubkey") + .get(move |_| Ok(hex::encode(hexder.clone()).into()))? .at("/config") .post(move |request| { let bod = &request.query_string() diff --git a/sphinx-key/src/main.rs b/sphinx-key/src/main.rs index 3f5e11f..e9aa4d6 100644 --- a/sphinx-key/src/main.rs +++ b/sphinx-key/src/main.rs @@ -34,6 +34,8 @@ fn main() -> Result<()> { // or else some patches to the runtime implemented by esp-idf-sys might not link properly. esp_idf_sys::link_patches(); + test_rsa(); + let network: Network = if let Some(n) = NETWORK { match n { "bitcoin" => Network::Bitcoin, @@ -96,3 +98,29 @@ fn main() -> Result<()> { Ok(()) } + +fn test_rsa() { + std::thread::spawn(move || { + println!("TEST RSA"); + use rsa::{PublicKey, RsaPrivateKey, RsaPublicKey, PaddingScheme}; + let mut rng = rand::thread_rng(); + println!("TEST RSA1"); + let bits = 1024; + println!("TEST RSA2"); + let priv_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key"); + println!("TEST RSA3"); + let pub_key = RsaPublicKey::from(&priv_key); + println!("TEST RSA4"); + // Encrypt + let data = b"hello world"; + println!("TEST RSA5"); + let enc_data = pub_key.encrypt(&mut rng, PaddingScheme::new_pkcs1v15_encrypt(), &data[..]).expect("failed to encrypt"); + assert_ne!(&data[..], &enc_data[..]); + println!("TEST RSA6"); + // Decrypt + let dec_data = priv_key.decrypt(PaddingScheme::new_pkcs1v15_encrypt(), &enc_data).expect("failed to decrypt"); + println!("TEST RSA7"); + assert_eq!(&data[..], &dec_data[..]); + }); + +} \ No newline at end of file