use themis::{secure_comparator::SecureComparator, ErrorKind};
#[test]
fn compare_matching_data() {
let mut comparator1 = SecureComparator::new();
let mut comparator2 = SecureComparator::new();
comparator1.append_secret(b"se-e-ecrets").unwrap();
comparator2.append_secret(b"se-e-ecrets").unwrap();
let data = comparator1.begin_compare().unwrap();
let data = comparator2.proceed_compare(&data).unwrap();
let data = comparator1.proceed_compare(&data).unwrap();
let data = comparator2.proceed_compare(&data).unwrap();
let _ata = comparator1.proceed_compare(&data).unwrap();
assert!(comparator1.is_complete());
assert!(comparator2.is_complete());
assert!(comparator1.result().unwrap());
assert!(comparator2.result().unwrap());
}
#[test]
fn compare_different_data() {
let mut comparator1 = SecureComparator::new();
let mut comparator2 = SecureComparator::new();
assert!(!comparator1.is_complete());
assert!(!comparator2.is_complete());
comparator1
.append_secret(b"far from the worn path of reason")
.unwrap();
comparator2
.append_secret(b"further away from the sane")
.unwrap();
let data = comparator1.begin_compare().unwrap();
let data = comparator2.proceed_compare(&data).unwrap();
let data = comparator1.proceed_compare(&data).unwrap();
let data = comparator2.proceed_compare(&data).unwrap();
let _ata = comparator1.proceed_compare(&data).unwrap();
assert!(!comparator1.result().unwrap());
assert!(!comparator2.result().unwrap());
}
#[test]
fn split_secrets() {
let mut comparator1 = SecureComparator::new();
let mut comparator2 = SecureComparator::new();
comparator1.append_secret(b"123").unwrap();
comparator1.append_secret(b"456").unwrap();
comparator2.append_secret(b"123456").unwrap();
let data = comparator1.begin_compare().unwrap();
let data = comparator2.proceed_compare(&data).unwrap();
let data = comparator1.proceed_compare(&data).unwrap();
let data = comparator2.proceed_compare(&data).unwrap();
let _ata = comparator1.proceed_compare(&data).unwrap();
assert!(comparator1.result().unwrap());
assert!(comparator2.result().unwrap());
}
#[test]
fn simultaneous_start() {
let mut comparator1 = SecureComparator::new();
let mut comparator2 = SecureComparator::new();
comparator1.append_secret(b"se-e-ecrets").unwrap();
comparator2.append_secret(b"se-e-ecrets").unwrap();
let data1 = comparator1.begin_compare().unwrap();
let data2 = comparator2.begin_compare().unwrap();
let error1 = comparator1.proceed_compare(&data2).unwrap_err();
let error2 = comparator2.proceed_compare(&data1).unwrap_err();
assert_eq!(error1.kind(), ErrorKind::InvalidParameter);
assert_eq!(error2.kind(), ErrorKind::InvalidParameter);
assert!(!comparator1.is_complete());
assert!(!comparator2.is_complete());
}
#[test]
#[ignore]
fn data_corruption() {
let mut comparator1 = SecureComparator::new();
let mut comparator2 = SecureComparator::new();
comparator1.append_secret(b"se-e-ecrets").unwrap();
comparator2.append_secret(b"se-e-ecrets").unwrap();
let data = comparator1.begin_compare().unwrap();
let mut data = comparator2.proceed_compare(&data).unwrap();
data[20] = 42;
let data = comparator1.proceed_compare(&data).unwrap();
let data = comparator2.proceed_compare(&data).unwrap();
let _ata = comparator1.proceed_compare(&data).unwrap();
assert!(comparator1.result().unwrap());
assert!(comparator2.result().unwrap());
}
#[test]
fn reusing_comparators() {
let mut comparator1 = SecureComparator::new();
let mut comparator2 = SecureComparator::new();
comparator1.append_secret(b"test").unwrap();
comparator2.append_secret(b"data").unwrap();
let data = comparator1.begin_compare().unwrap();
let data = comparator2.proceed_compare(&data).unwrap();
let data = comparator1.proceed_compare(&data).unwrap();
let data = comparator2.proceed_compare(&data).unwrap();
let _ata = comparator1.proceed_compare(&data).unwrap();
assert!(!comparator1.result().unwrap());
assert!(!comparator2.result().unwrap());
assert!(comparator1.append_secret(b"something").is_err());
assert!(comparator2.begin_compare().is_err());
assert!(comparator1.is_complete());
assert!(comparator2.is_complete());
assert!(!comparator1.result().unwrap());
assert!(!comparator2.result().unwrap());
}