mod key;
pub use key::{Key, SyncKey};
mod keypair;
pub use keypair::{EphemeralKeypair, Keypair};
mod mac;
pub use mac::Mac;
mod public_key;
pub use public_key::PublicKey;
mod shared_secret;
pub use shared_secret::SharedSecret;
mod nonce;
pub use nonce::Nonce;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct MacNotEqual;
#[cfg(test)]
#[allow(deprecated)]
mod tests {
use super::*;
#[cfg(feature = "b64")]
use std::str::FromStr;
#[test]
pub fn diffie_keypair() {
let alice = Keypair::new();
let bob = Keypair::new();
let alice_ssk = alice.diffie_hellman(bob.public());
let bob_ssk = bob.diffie_hellman(alice.public());
assert_eq!(alice_ssk, bob_ssk);
}
#[test]
pub fn diffie_ephemeral_keypair() {
let alice = EphemeralKeypair::new();
let bob = EphemeralKeypair::new();
let alice_public_key = alice.public().clone();
let alice_ssk = alice.diffie_hellman(bob.public());
let bob_ssk = bob.diffie_hellman(&alice_public_key);
assert_eq!(alice_ssk, bob_ssk);
}
#[cfg(feature = "b64")]
#[test]
pub fn b64() {
let alice = Keypair::new();
let b64 = alice.to_string();
let alice_2 = Keypair::from_str(&b64).unwrap();
assert_eq!(b64, alice_2.to_string());
}
#[test]
pub fn to_key() {
let alice = Keypair::new();
let bob = Keypair::new();
let alice_ssk = alice.diffie_hellman(bob.public());
let bob_ssk = bob.diffie_hellman(alice.public());
let nonce = Nonce::ones();
let mut alice_key = alice_ssk.to_key(nonce.clone());
let mut bob_key = bob_ssk.to_key(nonce);
let msg = b"hey thats a nice message";
let mut msg1 = msg.clone();
let mut msg2 = msg.clone();
let mac1 = alice_key.encrypt(&mut msg1);
let mac2 = alice_key.encrypt(&mut msg2);
assert_ne!(msg1, msg2);
assert_ne!(mac1, mac2);
assert!(bob_key.decrypt(&mut msg1, &mac1).is_ok());
assert!(bob_key.decrypt(&mut msg2, &mac2).is_ok());
assert_eq!(msg, &msg1);
assert_eq!(msg, &msg2);
let mac3 = bob_key.encrypt(&mut msg1);
let mac4 = bob_key.encrypt(&mut msg2);
assert_ne!(msg1, msg2);
assert_ne!(mac1, mac2);
assert_ne!(mac1, mac3);
assert_ne!(mac2, mac4);
assert!(alice_key.decrypt(&mut msg1, &mac3).is_ok());
assert!(alice_key.decrypt(&mut msg2, &mac4).is_ok());
assert_eq!(msg, &msg1);
assert_eq!(msg, &msg2);
}
#[cfg(feature = "b64")]
#[test]
pub fn static_encrypt_decrypt() {
let alice = Keypair::from_str("4KbU6aVELDln5wCADIA53wBrldKuaoRFA4Pw0WB73XQ").unwrap();
let bob = Keypair::from_str("WG1CTI9LGEtUZbLFI1glU-8jIsfh3VkzrUKrmUqeqU8").unwrap();
let alice_ssk = alice.diffie_hellman(bob.public());
let bob_ssk = bob.diffie_hellman(alice.public());
let ssk = base64::encode(alice_ssk.as_slice());
assert_eq!(ssk, "1+4cB2I8Gq2kgtRO4BtVJXdpyZtUIfIUEd1F63PDfmE=");
let nonce = Nonce::ones();
let mut alice_key = alice_ssk.to_key(nonce.clone());
let mut bob_key = bob_ssk.to_key(nonce);
let msg = b"hey thats a nice message";
let mut msg1 = msg.clone();
let mut msg2 = msg.clone();
let mac1 = alice_key.encrypt(&mut msg1);
let b64_msg1 = base64::encode(&msg1);
assert_eq!(b64_msg1, "FOu4ZRRo6yKfAiXQU2xcOm9vDm7WmhLP");
let b64_mac1 = base64::encode(&mac1.clone().into_bytes());
assert_eq!(b64_mac1, "RKm3Qw36yEUK3nzYE6dPYQ==");
let mac2 = alice_key.encrypt(&mut msg2);
let b64_msg2 = base64::encode(&msg2);
assert_eq!(b64_msg2, "TZl9ZfKUMlOtZxTHkAFIkl2t2l2K6YHG");
let b64_mac2 = base64::encode(&mac2.clone().into_bytes());
assert_eq!(b64_mac2, "EwvenIiLVd/luXHXisfRKw==");
assert!(bob_key.decrypt(&mut msg1, &mac1).is_ok());
assert!(bob_key.decrypt(&mut msg2, &mac2).is_ok());
assert_eq!(msg, &msg1);
assert_eq!(msg, &msg2);
}
}