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
|
use cast5::Cast5;
use cipher::{generic_array::GenericArray, BlockDecrypt, BlockEncrypt, KeyInit};
use hex_literal::hex;
/// Test vectors from RFC 2144 Appendix B.1
/// https://tools.ietf.org/html/rfc2144#appendix-B.1
#[test]
fn rfc2144_b1() {
let key128 = hex!("0123456712345678234567893456789A");
let key80 = hex!("01234567123456782345");
let key40 = hex!("0123456712");
let ct128 = GenericArray::from(hex!("238B4FE5847E44B2"));
let ct80 = GenericArray::from(hex!("EB6A711A2C02271B"));
let ct40 = GenericArray::from(hex!("7AC816D16E9B302E"));
let pt = GenericArray::from(hex!("0123456789ABCDEF"));
let mut buf = pt.clone();
let c = Cast5::new_from_slice(&key128).unwrap();
c.encrypt_block(&mut buf);
assert_eq!(buf, ct128);
c.decrypt_block(&mut buf);
assert_eq!(buf, pt);
let c = Cast5::new_from_slice(&key80).unwrap();
c.encrypt_block(&mut buf);
assert_eq!(buf, ct80);
c.decrypt_block(&mut buf);
assert_eq!(buf, pt);
let c = Cast5::new_from_slice(&key40).unwrap();
c.encrypt_block(&mut buf);
assert_eq!(buf, ct40);
c.decrypt_block(&mut buf);
assert_eq!(buf, pt);
}
/// Test based on RFC 2144 Appendix B.2
/// https://tools.ietf.org/html/rfc2144#appendix-B.1
#[test]
fn full_maintance_test() {
let mut a = hex!("0123456712345678234567893456789A");
let mut b = hex!("0123456712345678234567893456789A");
let verify_a = hex!("EEA9D0A249FD3BA6B3436FB89D6DCA92");
let verify_b = hex!("B2C95EB00C31AD7180AC05B8E83D696E");
let count = 1_000_000;
let (al, ar) = a.split_at_mut(8);
let (bl, br) = b.split_at_mut(8);
let mut al = GenericArray::from_mut_slice(al);
let mut ar = GenericArray::from_mut_slice(ar);
let mut bl = GenericArray::from_mut_slice(bl);
let mut br = GenericArray::from_mut_slice(br);
for _ in 0..count {
let mut k = GenericArray::from([0u8; 16]);
k[..8].copy_from_slice(bl);
k[8..].copy_from_slice(br);
let c = Cast5::new(&k);
c.encrypt_block(&mut al);
c.encrypt_block(&mut ar);
k[..8].copy_from_slice(al);
k[8..].copy_from_slice(ar);
let c = Cast5::new(&k);
c.encrypt_block(&mut bl);
c.encrypt_block(&mut br);
}
assert_eq!(&al[..], &verify_a[..8]);
assert_eq!(&ar[..], &verify_a[8..]);
assert_eq!(&bl[..], &verify_b[..8]);
assert_eq!(&br[..], &verify_b[8..]);
}
// Test vectors from NESSIE:
// https://www.cosic.esat.kuleuven.be/nessie/testvectors/bc/cast-128/Cast-128-128-64.verified.test-vectors
cipher::block_cipher_test!(cast5_nessie, "cast5", cast5::Cast5);
|