use crypto::key::*;
use crypto::keystore::*;
use std::fs;
use testing::temp;
#[test]
fn test_keystore_save_round_trip() {
let file = temp::File::new_file().unwrap();
fs::remove_file(file.path()).unwrap();
let wrap_key = Key::new_random().unwrap();
let master_key: Option<Key>;
{
let keystore = KeyStore::open_or_new(file.path(), &wrap_key).unwrap();
master_key = Some(keystore.get_master_key().clone());
}
{
let keystore = KeyStore::open_or_new(file.path(), &wrap_key).unwrap();
assert_eq!(
master_key.as_ref().unwrap().get_digest(),
keystore.get_master_key().get_digest()
);
}
}
#[test]
fn test_keystore_open_with_added_key() {
let file = temp::File::new_file().unwrap();
fs::remove_file(file.path()).unwrap();
let salt = Salt::default();
let keya = Key::new_password(
"foo".as_bytes(),
&salt,
OPS_LIMIT_INTERACTIVE,
MEM_LIMIT_INTERACTIVE,
).unwrap();
let keyb = Key::new_password(
"bar".as_bytes(),
&salt,
OPS_LIMIT_INTERACTIVE,
MEM_LIMIT_INTERACTIVE,
).unwrap();
assert_ne!(keya.get_digest(), keyb.get_digest());
let master_key: Option<Key>;
{
let mut keystore = KeyStore::open_or_new(file.path(), &keya).unwrap();
master_key = Some(keystore.get_master_key().clone());
assert!(keystore.add_key(&keyb).unwrap());
}
{
let keystore = KeyStore::open_or_new(file.path(), &keyb).unwrap();
assert_eq!(
master_key.as_ref().unwrap().get_digest(),
keystore.get_master_key().get_digest()
);
}
}
#[test]
fn test_add_duplicate_key() {
let file = temp::File::new_file().unwrap();
fs::remove_file(file.path()).unwrap();
let wrap_key = Key::new_random().unwrap();
let mut keystore = KeyStore::open_or_new(file.path(), &wrap_key).unwrap();
assert!(!keystore.add_key(&wrap_key).unwrap());
}
#[test]
fn test_remove_unused_key() {
let file = temp::File::new_file().unwrap();
fs::remove_file(file.path()).unwrap();
let salt = Salt::default();
let keya = Key::new_password(
"foo".as_bytes(),
&salt,
OPS_LIMIT_INTERACTIVE,
MEM_LIMIT_INTERACTIVE,
).unwrap();
let keyb = Key::new_password(
"bar".as_bytes(),
&salt,
OPS_LIMIT_INTERACTIVE,
MEM_LIMIT_INTERACTIVE,
).unwrap();
assert_ne!(keya.get_digest(), keyb.get_digest());
let mut keystore = KeyStore::open_or_new(file.path(), &keya).unwrap();
assert!(!keystore.remove_key(&keyb).unwrap());
}
#[test]
fn test_remove_only_key() {
let file = temp::File::new_file().unwrap();
fs::remove_file(file.path()).unwrap();
let key = Key::new_random().unwrap();
let mut keystore = KeyStore::open_or_new(file.path(), &key).unwrap();
assert!(keystore.remove_key(&key).is_err());
}