1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
//! Common functionality shared by tests
/// Test vectors
#[derive(Debug)]
pub struct TestVector<K: 'static> {
pub key: &'static K,
pub nonce: &'static [u8; 16],
pub aad: &'static [u8],
pub plaintext: &'static [u8],
pub ciphertext: &'static [u8],
}
#[macro_export]
macro_rules! tests {
($aead:ty, $vectors:expr) => {
#[test]
fn encrypt() {
for vector in $vectors {
let key = GenericArray::from_slice(vector.key);
let nonce = GenericArray::from_slice(vector.nonce);
let payload = Payload {
msg: vector.plaintext,
aad: vector.aad,
};
let cipher = <$aead>::new(key);
let ciphertext = cipher.encrypt(nonce, payload).unwrap();
assert_eq!(vector.ciphertext, ciphertext);
}
}
#[test]
fn decrypt() {
for vector in $vectors {
let key = GenericArray::from_slice(vector.key);
let nonce = GenericArray::from_slice(vector.nonce);
let ciphertext = Vec::from(vector.ciphertext);
let payload = Payload {
msg: &ciphertext,
aad: vector.aad,
};
let cipher = <$aead>::new(key);
let plaintext = cipher.decrypt(nonce, payload).unwrap();
assert_eq!(vector.plaintext, plaintext.as_slice());
}
}
#[test]
fn decrypt_modified() {
let vector = &$vectors[0];
let key = GenericArray::from_slice(vector.key);
let nonce = GenericArray::from_slice(vector.nonce);
let mut ciphertext = Vec::from(vector.ciphertext);
// Tweak the first byte
ciphertext[0] ^= 0xaa;
let payload = Payload {
msg: &ciphertext,
aad: vector.aad,
};
let cipher = <$aead>::new(key);
assert!(cipher.decrypt(nonce, payload).is_err());
// TODO(tarcieri): test ciphertext is unmodified in in-place API
}
};
}
|