use std::time::{Duration, Instant};
use scosh_core::SdkError;
use scosh_core::bootstrap::{BootstrapPurpose, test_support};
#[test]
fn verified_bootstrap_is_bound_and_one_use() {
let owner = test_support::owner(1);
let server = test_support::server(2);
let now = Instant::now();
let mut gate = test_support::gate(owner, 7, BootstrapPurpose::Attach, server);
let grant = test_support::grant(
owner,
7,
BootstrapPurpose::Attach,
server,
3,
now + Duration::from_secs(1),
);
assert!(!gate.zero_rtt_enabled());
assert_eq!(gate.consume(grant, now), Ok(()));
assert_eq!(gate.consume(grant, now), Err(SdkError::CapabilityReplayed));
}
#[test]
fn capability_binding_and_server_pin_fail_closed() {
let owner = test_support::owner(1);
let now = Instant::now();
let mut gate = test_support::gate(owner, 7, BootstrapPurpose::Attach, test_support::server(2));
let wrong_server = test_support::grant(
owner,
7,
BootstrapPurpose::Attach,
test_support::server(9),
3,
now + Duration::from_secs(1),
);
assert_eq!(
gate.consume(wrong_server, now),
Err(SdkError::HostKeyRejected)
);
let wrong_epoch = test_support::grant(
owner,
8,
BootstrapPurpose::Attach,
test_support::server(2),
3,
now + Duration::from_secs(1),
);
assert_eq!(
gate.consume(wrong_epoch, now),
Err(SdkError::CapabilityBindingMismatch)
);
}
#[test]
fn expired_capability_is_not_consumed() {
let now = Instant::now();
let owner = test_support::owner(1);
let server = test_support::server(2);
let mut gate = test_support::gate(owner, 7, BootstrapPurpose::Attach, server);
let grant = test_support::grant(owner, 7, BootstrapPurpose::Attach, server, 3, now);
assert_eq!(gate.consume(grant, now), Err(SdkError::CapabilityExpired));
}