mod compiled_policies;
pub use compiled_policies::{CompiledPolicies, CompiledPolicy};
mod enforcer;
mod verifier;
use crate::err::Result;
use crate::symcc::{concretizer::Env, solver::Solver, SymCompiler};
use crate::symccopt::verifier::{
verify_always_allows_opt, verify_always_denies_opt, verify_always_matches_opt,
verify_disjoint_opt, verify_equivalent_opt, verify_implies_opt, verify_never_errors_opt,
verify_never_matches_opt,
};
use cedar_policy_core::ast::Policy;
impl<S: Solver> SymCompiler<S> {
pub async fn check_never_errors_opt(&mut self, policy: &CompiledPolicy) -> Result<bool> {
self.check_unsat_asserts(&verify_never_errors_opt(policy), &policy.symenv)
.await
}
pub async fn check_never_errors_with_counterexample_opt(
&mut self,
policy: &CompiledPolicy,
) -> Result<Option<Env>> {
self.check_sat_asserts(
&verify_never_errors_opt(policy),
&policy.symenv,
std::iter::once(policy.policy.condition()),
)
.await
}
pub async fn check_always_matches_opt(&mut self, policy: &CompiledPolicy) -> Result<bool> {
self.check_unsat_asserts(&verify_always_matches_opt(policy), &policy.symenv)
.await
}
pub async fn check_always_matches_with_counterexample_opt(
&mut self,
policy: &CompiledPolicy,
) -> Result<Option<Env>> {
self.check_sat_asserts(
&verify_always_matches_opt(policy),
&policy.symenv,
std::iter::once(policy.policy.condition()),
)
.await
}
pub async fn check_never_matches_opt(&mut self, policy: &CompiledPolicy) -> Result<bool> {
self.check_unsat_asserts(&verify_never_matches_opt(policy), &policy.symenv)
.await
}
pub async fn check_never_matches_with_counterexample_opt(
&mut self,
policy: &CompiledPolicy,
) -> Result<Option<Env>> {
self.check_sat_asserts(
&verify_never_matches_opt(policy),
&policy.symenv,
std::iter::once(policy.policy.condition()),
)
.await
}
pub async fn check_implies_opt(
&mut self,
policies1: &CompiledPolicies,
policies2: &CompiledPolicies,
) -> Result<bool> {
self.check_unsat_asserts(&verify_implies_opt(policies1, policies2), &policies1.symenv)
.await
}
pub async fn check_implies_with_counterexample_opt(
&mut self,
policies1: &CompiledPolicies,
policies2: &CompiledPolicies,
) -> Result<Option<Env>> {
self.check_sat_asserts(
&verify_implies_opt(policies1, policies2),
&policies1.symenv,
policies1
.policies
.policies()
.chain(policies2.policies.policies())
.map(Policy::condition),
)
.await
}
pub async fn check_always_allows_opt(&mut self, policies: &CompiledPolicies) -> Result<bool> {
self.check_unsat_asserts(&verify_always_allows_opt(policies), &policies.symenv)
.await
}
pub async fn check_always_allows_with_counterexample_opt(
&mut self,
policies: &CompiledPolicies,
) -> Result<Option<Env>> {
self.check_sat_asserts(
&verify_always_allows_opt(policies),
&policies.symenv,
policies.policies.policies().map(Policy::condition),
)
.await
}
pub async fn check_always_denies_opt(&mut self, policies: &CompiledPolicies) -> Result<bool> {
self.check_unsat_asserts(&verify_always_denies_opt(policies), &policies.symenv)
.await
}
pub async fn check_always_denies_with_counterexample_opt(
&mut self,
policies: &CompiledPolicies,
) -> Result<Option<Env>> {
self.check_sat_asserts(
&verify_always_denies_opt(policies),
&policies.symenv,
policies.policies.policies().map(Policy::condition),
)
.await
}
pub async fn check_equivalent_opt(
&mut self,
policies1: &CompiledPolicies,
policies2: &CompiledPolicies,
) -> Result<bool> {
self.check_unsat_asserts(
&verify_equivalent_opt(policies1, policies2),
&policies1.symenv,
)
.await
}
pub async fn check_equivalent_with_counterexample_opt(
&mut self,
policies1: &CompiledPolicies,
policies2: &CompiledPolicies,
) -> Result<Option<Env>> {
self.check_sat_asserts(
&verify_equivalent_opt(policies1, policies2),
&policies1.symenv,
policies1
.policies
.policies()
.chain(policies2.policies.policies())
.map(Policy::condition),
)
.await
}
pub async fn check_disjoint_opt(
&mut self,
policies1: &CompiledPolicies,
policies2: &CompiledPolicies,
) -> Result<bool> {
self.check_unsat_asserts(
&verify_disjoint_opt(policies1, policies2),
&policies1.symenv,
)
.await
}
pub async fn check_disjoint_with_counterexample_opt(
&mut self,
policies1: &CompiledPolicies,
policies2: &CompiledPolicies,
) -> Result<Option<Env>> {
self.check_sat_asserts(
&verify_disjoint_opt(policies1, policies2),
&policies1.symenv,
policies1
.policies
.policies()
.chain(policies2.policies.policies())
.map(Policy::condition),
)
.await
}
}