use serde_json::{Map, Value};
use super::super::{Enrolled, Handoff, PUBLIC, SALT, enrolled};
use crate::qr::Symbol;
use crate::test_support::corpus::{fixture, root};
fn frames() -> Vec<Map<String, Value>> {
fixture(&root().join("answers").join("enrolled.json"))
.frames
.into_iter()
.map(|frame| frame.as_object().cloned().expect("an object"))
.collect()
}
fn read_frame(at: usize) -> Enrolled {
enrolled(frames().get(at).expect("the fixture carries the frame")).expect("it reads")
}
#[test]
fn the_pair_is_read_and_re_said_exactly_as_the_engine_says_it() {
let held = read_frame(1);
assert_eq!(
held.rendezvous,
Some(Handoff {
public: "0".repeat(64),
salt: "1".repeat(64),
})
);
assert_eq!(
held.envelope(),
r#"{"address":"engine.invalid:7737","ca":"-----BEGIN CERTIFICATE-----\nnotreal\n-----END CERTIFICATE-----\n","cert":"-----BEGIN CERTIFICATE-----\nnotreal\n-----END CERTIFICATE-----\n","grade":"foot","key":"-----BEGIN notreal KEY-----\nnotreal\n-----END notreal KEY-----\n","name":"builder","pairing_salt":"1111111111111111111111111111111111111111111111111111111111111111","rendezvous_pub":"0000000000000000000000000000000000000000000000000000000000000000","yog-enroll":1}"#
);
}
#[test]
fn a_loopback_enrollment_has_no_pair_and_the_envelope_says_none() {
let held = read_frame(0);
assert_eq!(held.rendezvous, None);
assert_eq!(
held.envelope(),
r#"{"address":"engine.invalid:7737","ca":"-----BEGIN CERTIFICATE-----\nnotreal\n-----END CERTIFICATE-----\n","cert":"-----BEGIN CERTIFICATE-----\nnotreal\n-----END CERTIFICATE-----\n","grade":"operator","key":"-----BEGIN notreal KEY-----\nnotreal\n-----END notreal KEY-----\n","name":"phone-1","yog-enroll":1}"#
);
}
#[test]
fn half_a_pair_refuses_and_names_both_keys() {
for dropped in [PUBLIC, SALT] {
let mut half = frames().swap_remove(1);
half.remove(dropped);
let said = enrolled(&half).expect_err("half a pair");
for named in [PUBLIC, SALT] {
assert!(said.contains(named), "{named} went unnamed: {said}");
}
}
}
#[test]
fn the_caption_says_nothing_of_the_pair() {
let said = read_frame(1).caption();
for secret in ["0000", "1111"] {
assert!(!said.contains(secret), "{secret} is in the caption: {said}");
}
}
fn pem(banner: &str, len: usize) -> String {
let head = format!("-----BEGIN {banner}-----\n");
let tail = format!("-----END {banner}-----\n");
let mut body = String::new();
let filler: Vec<char> = "notreal".chars().collect();
let mut at = 0;
while head.len() + body.len() + tail.len() < len {
let column = body.len() % 65;
if column == 64 {
body.push('\n');
} else {
body.push(filler.get(at % filler.len()).copied().unwrap_or('x'));
at += 1;
}
}
format!("{head}{body}{tail}")
}
#[test]
fn a_real_sized_envelope_with_the_pair_is_past_level_q_and_inside_level_m() {
let held = Enrolled {
grade: "foot".to_owned(),
name: "phone-1".to_owned(),
address: "engine.invalid:7737".to_owned(),
ca: pem("CERTIFICATE", 570),
cert: pem("CERTIFICATE", 623),
key: pem("notreal KEY", 241),
rendezvous: Some(Handoff {
public: "0".repeat(64),
salt: "1".repeat(64),
}),
};
let envelope = held.envelope();
let len = envelope.len();
assert!((1700..1760).contains(&len), "not the measured ~1730: {len}");
assert!(len > 1663, "it would still fit level Q: {len}");
assert!(
Symbol::encode(envelope.as_bytes()).is_ok(),
"level M: {len}"
);
}