scosh-core 0.1.0

Portable session state and terminal event core for scosh
Documentation
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));
}