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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
//! Integration tests.
//!
//! XChaCha20Poly1305 test vectors generated using `test-vector-gen` which uses
//! a libsodium reference.
//!
//! XSalsa20Poly1305 test vectors adapted from NaCl's `tests/secretbox.c` and
//! `tests/secretbox.out`.
#![cfg(any(feature = "chacha20", feature = "salsa20"))]
use hex_literal::hex;
const KEY: &[u8; 32] = &hex!("1b27556473e985d462cd51197a9a46c76009549eac6474f206c4ee0844f68389");
const NONCE: &[u8; 24] = &hex!("69696ee955b62b73cd62bda875fc73d68219e0036b7a0b37");
const PLAINTEXT: &[u8] = &hex!(
"be075fc53c81f2d5cf141316ebeb0c7b5228c52a4c62cbd44b66849b64244ffce5ecbaaf33bd751a"
"1ac728d45e6c61296cdc3c01233561f41db66cce314adb310e3be8250c46f06dceea3a7fa1348057"
"e2f6556ad6b1318a024a838f21af1fde048977eb48f59ffd4924ca1c60902e52f0a089bc76897040"
"e082f937763848645e0705"
);
macro_rules! impl_tests {
($cipher:path, $ciphertext:expr) => {
#[test]
fn encrypt() {
let key = GenericArray::from_slice(KEY);
let nonce = GenericArray::from_slice(NONCE);
let cipher = <$cipher>::new(key);
let ciphertext = cipher.encrypt(nonce, PLAINTEXT).unwrap();
assert_eq!($ciphertext, ciphertext.as_slice());
}
#[test]
fn decrypt() {
let key = GenericArray::from_slice(KEY);
let nonce = GenericArray::from_slice(NONCE);
let cipher = <$cipher>::new(key);
let plaintext = cipher.decrypt(nonce, $ciphertext).unwrap();
assert_eq!(PLAINTEXT, plaintext.as_slice());
}
#[test]
fn decrypt_modified() {
let key = GenericArray::from_slice(KEY);
let nonce = GenericArray::from_slice(NONCE);
let mut ciphertext = Vec::from($ciphertext);
// Tweak the first byte
ciphertext[0] ^= 0xaa;
let cipher = <$cipher>::new(key);
assert!(cipher.decrypt(nonce, ciphertext.as_slice()).is_err());
}
};
}
#[cfg(feature = "chacha20")]
mod xchacha20poly1305 {
use super::{KEY, NONCE, PLAINTEXT};
use crypto_secretbox::{
aead::{generic_array::GenericArray, Aead, KeyInit},
XChaCha20Poly1305,
};
use hex_literal::hex;
const CIPHERTEXT: &[u8] = &hex!(
"0c61fcffbc3fc8d3aa7464b91ab35374bf8af3198585e55d9cb07edcd1e5a69526547fbd0f2c642e"
"9ee96e19462031f1032f1cd862bb952900103c06ac16344d7f9c9df0feaaf5a733dea7ea2df70a61"
"9936fcc5501de75c5d112e8abd7573c461ada29ec016d131aa557804320011ff6d94092581ceea1b"
"ad3cf0d651938802ca867cd52bbe50c2da1161cb09514407609920"
);
impl_tests!(XChaCha20Poly1305, CIPHERTEXT);
}
#[cfg(feature = "salsa20")]
mod xsalsa20poly1305 {
use super::{KEY, NONCE, PLAINTEXT};
use crypto_secretbox::{
aead::{generic_array::GenericArray, Aead, KeyInit},
XSalsa20Poly1305,
};
use hex_literal::hex;
const CIPHERTEXT: &[u8] = &hex!(
"f3ffc7703f9400e52a7dfb4b3d3305d98e993b9f48681273c29650ba32fc76ce48332ea7164d96a4"
"476fb8c531a1186ac0dfc17c98dce87b4da7f011ec48c97271d2c20f9b928fe2270d6fb863d51738"
"b48eeee314a7cc8ab932164548e526ae90224368517acfeabd6bb3732bc0e9da99832b61ca01b6de"
"56244a9e88d5f9b37973f622a43d14a6599b1f654cb45a74e355a5"
);
impl_tests!(XSalsa20Poly1305, CIPHERTEXT);
}
|