use osdp::reply::CCrypt;
use osdp::secure::{
Disconnected, SCBK_D, Session,
crypto::{SessionKeys, client_cryptogram},
};
#[test]
fn both_sides_derive_same_keys() {
let rnd_a = [0xAAu8; 8];
let acu = SessionKeys::derive(&SCBK_D, &rnd_a);
let pd = SessionKeys::derive(&SCBK_D, &rnd_a);
assert_eq!(acu, pd);
}
#[test]
fn happy_path_handshake_yields_secure_session() {
let acu = Session::<Disconnected>::new(SCBK_D);
let rnd_a = [0x11u8; 8];
let acu = acu.challenge(rnd_a);
let rnd_b = [0x22u8; 8];
let cuid = [0x33u8; 8];
let keys = SessionKeys::derive(&SCBK_D, &rnd_a);
let cc = client_cryptogram(&keys.s_enc, &rnd_a, &rnd_b);
let acu = acu
.receive_ccrypt(&CCrypt {
cuid,
rnd_b,
client_cryptogram: cc,
})
.expect("CCRYPT verifies");
let server_crypto = acu.server_cryptogram();
let initial_rmac = acu.initial_rmac();
assert_ne!(server_crypto, [0u8; 16]);
assert_ne!(initial_rmac, [0u8; 16]);
let mut acu = acu.confirm_rmac_i(&initial_rmac).expect("RMAC_I matches");
let mac1 = acu.mac(b"hello");
let mac2 = acu.mac(b"hello");
assert_ne!(mac1, mac2);
}
#[test]
fn bad_ccrypt_returns_to_disconnected() {
let session = Session::<Disconnected>::new(SCBK_D).challenge([0u8; 8]);
let bogus = CCrypt {
cuid: [0; 8],
rnd_b: [0; 8],
client_cryptogram: [0xFF; 16],
};
assert!(session.receive_ccrypt(&bogus).is_err());
}