diff --git a/examples/export.rs b/examples/export.rs index a1b073e..035ecb0 100644 --- a/examples/export.rs +++ b/examples/export.rs @@ -10,16 +10,18 @@ fn main() { let msg2 = "This is another message"; let key2 = fb.add(msg2.as_bytes()); - // Export + // Export as base64 let cipher = fb.export_cipher(); - let keybase = fb.export_keybase(); + let keybase = fb.export_keybase(); let key1_exp = key1.export(); - let key2_exp = key2.export(); + // Or as raw bytes + let key2_exp = key2.to_bytes(); - // Import + // Import from base64 let fb_new = FB128::import(&cipher, &keybase).unwrap(); let key1_imp = FBKey::import(&key1_exp).unwrap(); - let key2_imp = FBKey::import(&key2_exp).unwrap(); + // Or as raw bytes + let key2_imp = FBKey::from_bytes(&key2_exp).unwrap(); // Decryption let decr1 = fb_new.decrypt(&key1_imp).unwrap(); @@ -30,7 +32,7 @@ fn main() { CipherText: \n{cipher}\n KeyBase: \n{keybase}\n Key 1: {key1_exp} -Key 2: {key2_exp} +Key 2: {key2_exp:?} "); assert_eq!(msg1.as_bytes(), decr1); diff --git a/src/encoding.rs b/src/encoding.rs index caa5e3d..0ba7a1c 100644 --- a/src/encoding.rs +++ b/src/encoding.rs @@ -4,39 +4,38 @@ use base64::{prelude::BASE64_STANDARD, Engine}; pub trait Encode where - Self: FBObjTrait, - T: ArrayEncoding + Bounded, + Self: FBObjTrait, + T: ArrayEncoding + Bounded, { - fn export_cipher(&self) -> String { - let c_bytes: Vec = self.cipher().iter() + fn to_bytes_cipher(&self) -> Vec { + self.cipher().iter() .flat_map(|bigint| bigint.to_le_byte_array()) - .collect(); - - BASE64_STANDARD.encode(c_bytes) + .collect() } - fn export_keybase(&self) -> String { - let r_bytes: Vec = self.keybase().iter() + fn to_bytes_keybase(&self) -> Vec { + self.keybase().iter() .flat_map(|bigint| bigint.to_le_byte_array()) - .collect(); + .collect() + } - BASE64_STANDARD.encode(r_bytes) - } + fn export_cipher(&self) -> String { + BASE64_STANDARD.encode(self.to_bytes_cipher()) + } - fn import(cipher: &str, keybase: &str) -> Result, FBError> { - let c_bytes = BASE64_STANDARD.decode(cipher) - .map_err(|_| FBError::DecodeError)?; - let r_bytes = BASE64_STANDARD.decode(keybase) - .map_err(|_| FBError::DecodeError)?; + fn export_keybase(&self) -> String { + BASE64_STANDARD.encode(self.to_bytes_keybase()) + } - let chunk_to_uint = |chunk| { - T::from_le_byte_array( - GenericArray::clone_from_slice(chunk) - )}; - let c: Vec = c_bytes.chunks_exact(T::BYTES) + fn from_bytes(cipher: &[u8], keybase: &[u8]) -> Result, FBError> { + let chunk_to_uint = |chunk| { + T::from_le_byte_array( + GenericArray::clone_from_slice(chunk) + )}; + let c: Vec = cipher.chunks_exact(T::BYTES) .map(chunk_to_uint) .collect(); - let r: Vec = r_bytes.chunks_exact(T::BYTES) + let r: Vec = keybase.chunks_exact(T::BYTES) .map(chunk_to_uint) .collect(); if r.len() > c.len() || r.len() < 2 { @@ -45,4 +44,13 @@ where Ok(FBObj {c, r}) } + + fn import(cipher: &str, keybase: &str) -> Result, FBError> { + let c_bytes = BASE64_STANDARD.decode(cipher) + .map_err(|_| FBError::DecodeError)?; + let r_bytes = BASE64_STANDARD.decode(keybase) + .map_err(|_| FBError::DecodeError)?; + + Self::from_bytes(&c_bytes, &r_bytes) + } } diff --git a/src/fbkey.rs b/src/fbkey.rs index cd5caaf..18ae16c 100644 --- a/src/fbkey.rs +++ b/src/fbkey.rs @@ -8,19 +8,19 @@ pub struct FBKey { impl FBKey { - pub fn export(&self) -> String { + pub fn to_bytes(&self) -> Vec { let binc = DefaultOptions::new(); - let indice_bytes = binc.serialize(&self.indices) - .unwrap(); - - BASE64_STANDARD.encode(&indice_bytes) + binc.serialize(&self.indices) + .expect("Should be fine") } - pub fn import(key_str: &str) -> Result { + pub fn export(&self) -> String { + BASE64_STANDARD.encode(&self.to_bytes()) + } + + pub fn from_bytes(fbkey: &[u8]) -> Result { let binc = DefaultOptions::new(); - let indice_bytes = BASE64_STANDARD.decode(key_str) - .map_err(|_| FBError::DecodeError)?; - let indices: Vec<_> = binc.deserialize(&indice_bytes) + let indices: Vec<_> = binc.deserialize(&fbkey) .map_err(|_| FBError::DecodeError)?; if indices.len() < 2 { return Err(FBError::DecodeError); @@ -28,4 +28,11 @@ impl FBKey { Ok (FBKey {indices}) } + + pub fn import(key_str: &str) -> Result { + let indice_bytes = BASE64_STANDARD.decode(key_str) + .map_err(|_| FBError::DecodeError)?; + + Self::from_bytes(&indice_bytes) + } }