use super::{
enforcer::{enforce_compiled_policy, enforce_pair_compiled_policyset},
CompiledPolicy, CompiledPolicySet,
};
use crate::{
symcc::{
factory,
term::{Term, TermPrim},
verifier::Asserts,
},
symccopt::enforcer::enforce_pair_compiled_policy,
};
use std::sync::Arc;
pub fn verify_evaluate_opt(phi: impl FnOnce(&Term) -> Term, policy: &CompiledPolicy) -> Asserts {
match factory::not(phi(&policy.term)) {
Term::Prim(TermPrim::Bool(false)) => Arc::new(vec![false.into()]),
assert => Arc::new(
enforce_compiled_policy(policy)
.into_iter()
.chain(std::iter::once(assert))
.collect(),
),
}
}
pub fn verify_evaluate_pair_opt(
phi: impl FnOnce(&Term, &Term) -> Term,
policy1: &CompiledPolicy,
policy2: &CompiledPolicy,
) -> Asserts {
assert_eq!(&policy1.symenv, &policy2.symenv);
match factory::not(phi(&policy1.term, &policy2.term)) {
Term::Prim(TermPrim::Bool(false)) => Arc::new(vec![false.into()]),
assert => Arc::new(
enforce_pair_compiled_policy(policy1, policy2)
.into_iter()
.chain(std::iter::once(assert))
.collect(),
),
}
}
pub fn verify_is_authorized_opt(
phi: impl FnOnce(&Term, &Term) -> Term,
policies1: &CompiledPolicySet,
policies2: &CompiledPolicySet,
) -> Asserts {
assert_eq!(&policies1.symenv, &policies2.symenv);
match factory::not(phi(&policies1.term, &policies2.term)) {
Term::Prim(TermPrim::Bool(false)) => Arc::new(vec![false.into()]),
assert => Arc::new(
enforce_pair_compiled_policyset(policies1, policies2)
.into_iter()
.chain(std::iter::once(assert))
.collect(),
),
}
}
pub fn verify_never_errors_opt(policy: &CompiledPolicy) -> Asserts {
verify_evaluate_opt(|term| factory::is_some(term.clone()), policy)
}
pub fn verify_always_matches_opt(policy: &CompiledPolicy) -> Asserts {
verify_evaluate_opt(
|term| factory::eq(term.clone(), factory::some_of(true.into())),
policy,
)
}
pub fn verify_never_matches_opt(policy: &CompiledPolicy) -> Asserts {
verify_evaluate_opt(
|term| factory::not(factory::eq(term.clone(), factory::some_of(true.into()))),
policy,
)
}
pub fn verify_matches_equivalent_opt(
policy1: &CompiledPolicy,
policy2: &CompiledPolicy,
) -> Asserts {
verify_evaluate_pair_opt(
|term1, term2| {
let t1matches = factory::eq(term1.clone(), factory::some_of(true.into()));
let t2matches = factory::eq(term2.clone(), factory::some_of(true.into()));
factory::eq(t1matches, t2matches)
},
policy1,
policy2,
)
}
pub fn verify_matches_implies_opt(policy1: &CompiledPolicy, policy2: &CompiledPolicy) -> Asserts {
verify_evaluate_pair_opt(
|term1, term2| {
let t1matches = factory::eq(term1.clone(), factory::some_of(true.into()));
let t2matches = factory::eq(term2.clone(), factory::some_of(true.into()));
factory::implies(t1matches, t2matches)
},
policy1,
policy2,
)
}
pub fn verify_matches_disjoint_opt(policy1: &CompiledPolicy, policy2: &CompiledPolicy) -> Asserts {
let disjoint = |t1: Term, t2: Term| factory::not(factory::and(t1, t2));
verify_evaluate_pair_opt(
|term1, term2| {
let t1matches = factory::eq(term1.clone(), factory::some_of(true.into()));
let t2matches = factory::eq(term2.clone(), factory::some_of(true.into()));
disjoint(t1matches, t2matches)
},
policy1,
policy2,
)
}
pub fn verify_implies_opt(policies1: &CompiledPolicySet, policies2: &CompiledPolicySet) -> Asserts {
verify_is_authorized_opt(
|term1, term2| factory::implies(term1.clone(), term2.clone()),
policies1,
policies2,
)
}
pub fn verify_always_allows_opt(policies: &CompiledPolicySet) -> Asserts {
verify_implies_opt(
&CompiledPolicySet::allow_all(policies.symenv.clone()),
policies,
)
}
pub fn verify_always_denies_opt(policies: &CompiledPolicySet) -> Asserts {
verify_implies_opt(
policies,
&CompiledPolicySet::deny_all(policies.symenv.clone()),
)
}
pub fn verify_equivalent_opt(
policies1: &CompiledPolicySet,
policies2: &CompiledPolicySet,
) -> Asserts {
verify_is_authorized_opt(
|term1, term2| factory::eq(term1.clone(), term2.clone()),
policies1,
policies2,
)
}
pub fn verify_disjoint_opt(
policies1: &CompiledPolicySet,
policies2: &CompiledPolicySet,
) -> Asserts {
let disjoint = |t1: &Term, t2: &Term| factory::not(factory::and(t1.clone(), t2.clone()));
verify_is_authorized_opt(disjoint, policies1, policies2)
}