ic-auth 0.35.1

Portable authentication, delegation proof verification and local session machinery
Documentation
use super::*;
use ic_auth_protocol_types::CanonicalId;

#[test]
fn live_replacement_preserves_binding_pool_denial_and_retention() {
    let binding = LoginBinding {
        issuer: Principal::from_slice(&[1]),
        subject: Principal::from_slice(&[2]),
        started_at_ns: 1,
        deadline_ns: 10,
    };
    let change = |state, until_ns| {
        LoginRevocationChange(LoginData {
            audience: AudienceId {
                canonical_network_id: CanonicalId::from_bytes([1; 32]),
                fleet_id: CanonicalId::from_bytes([2; 32]),
            },
            caller: Principal::from_slice(&[3]),
            record: Record { state, until_ns },
        })
    };
    let reserved = change(LoginRecordState::Reserved(binding), 11);
    let revoked = change(LoginRecordState::Revoked(Some(binding)), 12);
    assert_eq!(reserved.check_replacement(&reserved, 10), Ok(()));
    assert_eq!(revoked.check_replacement(&reserved, 10), Ok(()));
    for proposed in [
        change(LoginRecordState::Reserved(binding), 13),
        change(LoginRecordState::Revoked(Some(binding)), 11),
        change(LoginRecordState::Revoked(None), 13),
        change(
            LoginRecordState::Revoked(Some(LoginBinding {
                subject: Principal::from_slice(&[9]),
                ..binding
            })),
            13,
        ),
    ] {
        assert_eq!(
            proposed.check_replacement(&revoked, 11),
            Err(LoginRevocationError::InvalidPolicy)
        );
        assert_eq!(
            proposed.check_replacement(&revoked, 12),
            Ok(()),
            "exclusive expiry permits a new association or pool"
        );
    }
    let unknown = change(LoginRecordState::Revoked(None), 12);
    assert_eq!(unknown.check_replacement(&unknown, 11), Ok(()));
    assert_eq!(
        reserved.check_replacement(&unknown, 11),
        Err(LoginRevocationError::InvalidPolicy)
    );
    let mut wrong_key = change(LoginRecordState::Reserved(binding), 13);
    wrong_key.0.caller = Principal::from_slice(&[4]);
    assert_eq!(
        wrong_key.check_replacement(&revoked, 12),
        Err(LoginRevocationError::InvalidPolicy)
    );
    wrong_key.0.caller = revoked.0.caller;
    wrong_key.0.audience.fleet_id = CanonicalId::from_bytes([3; 32]);
    assert_eq!(
        wrong_key.check_replacement(&revoked, 12),
        Err(LoginRevocationError::InvalidPolicy)
    );
}