aboutsummaryrefslogtreecommitdiff
path: root/xacml-proofs/lean/Xacml.lean
diff options
context:
space:
mode:
Diffstat (limited to 'xacml-proofs/lean/Xacml.lean')
-rw-r--r--xacml-proofs/lean/Xacml.lean130
1 files changed, 108 insertions, 22 deletions
diff --git a/xacml-proofs/lean/Xacml.lean b/xacml-proofs/lean/Xacml.lean
index d4c34da..439b867 100644
--- a/xacml-proofs/lean/Xacml.lean
+++ b/xacml-proofs/lean/Xacml.lean
@@ -162,7 +162,9 @@ theorem Prod.beq_iff_fst_eq_snd_eq
intro _
trivial }
{ intro h
- simp_all only [beq_iff_eq, Prod.eq_iff_fst_eq_snd_eq] }
+ simp_all only [beq_iff_eq, Prod.eq_iff_fst_eq_snd_eq]
+ apply And.intro
+ all_goals trivial }
instance : LawfulBEq Primitive where
eq_of_beq := by
@@ -648,7 +650,7 @@ namespace Expression
| Expression.attribute_designator inner =>
match inner.eval context with
| Sum.inl res => res
- | Sum.inr status => Option.none
+ | Sum.inr _ => Option.none
| Expression.attribute_value inner => some inner
| _ => Option.none
end Expression
@@ -657,7 +659,16 @@ structure Match where
function : Identifier
designator : AttributeDesignator
value : Value
-deriving DecidableEq, BEq, Repr
+deriving DecidableEq, Repr
+
+instance : BEq Match where
+ beq a b :=
+ match a with
+ | { function := function_a, designator := designator_a, value := value_a } =>
+ match b with
+ | { function := function_b, designator := designator_b, value := value_b } =>
+ function_a == function_b && designator_a = designator_b && value_a = value_b
+
def AllOf : Type := List Match
deriving DecidableEq, BEq, Repr
def AnyOf : Type := List AllOf
@@ -669,17 +680,93 @@ instance : Membership AllOf AnyOf where
mem := fun x y => y.contains x
instance : LawfulBEq Match where
- eq_of_beq := by sorry
- rfl := by sorry
+ eq_of_beq := by
+ intros a b h
+ match a with
+ | { function := function_a, designator := designator_a, value := value_a } =>
+ match b with
+ | { function := function_b, designator := designator_b, value := value_b } =>
+ unfold_projs at h
+ simp at h
+ simp_all only
+ rfl := by
+ intro a
+ match a with
+ | { function := function_a, designator := designator_a, value := value_a } =>
+ unfold_projs
+ simp_all only [decide_True, Bool.and_self]
instance : LawfulBEq AllOf where
- eq_of_beq := by sorry
- rfl := by sorry
+ eq_of_beq {as bs} := by
+ induction as generalizing bs with
+ | nil => intro h; cases bs <;> first | rfl | contradiction
+ | cons a as _ =>
+ cases bs with
+ | nil => intro h; contradiction
+ | cons b bs =>
+ intro h
+ apply List.cons_eq_cons.mpr
+ unfold_projs at h
+ simp [List.beq] at h
+ apply And.intro
+ { exact h.left }
+ { rw [←beq_iff_eq]
+ exact h.right }
+ rfl {as} := by
+ induction as with
+ | nil => rfl
+ | cons a as ih => simp [BEq.beq, List.beq, LawfulBEq.rfl]; exact ih
instance : LawfulBEq AnyOf where
- eq_of_beq := by sorry
- rfl := by sorry
+ eq_of_beq {as bs} := by
+ induction as generalizing bs with
+ | nil => intro h; cases bs <;> first | rfl | contradiction
+ | cons a as _ =>
+ cases bs with
+ | nil => intro h; contradiction
+ | cons b bs =>
+ intro h
+ apply List.cons_eq_cons.mpr
+ unfold_projs at h
+ simp [List.beq] at h
+ apply And.intro
+ { exact h.left }
+ { rw [←beq_iff_eq]
+ exact h.right }
+ rfl {as} := by
+ induction as with
+ | nil => rfl
+ | cons a as ih =>
+ simp [BEq.beq, List.beq, LawfulBEq.rfl]
+ apply And.intro
+ { rw_local
+ (List.beq a a = true) = (a == a)
+ by rfl }
+ { exact ih }
instance : LawfulBEq Target where
- eq_of_beq := by sorry
- rfl := by sorry
+ eq_of_beq {as bs} := by
+ induction as generalizing bs with
+ | nil => intro h; cases bs <;> first | rfl | contradiction
+ | cons a as _ =>
+ cases bs with
+ | nil => intro h; contradiction
+ | cons b bs =>
+ intro h
+ apply List.cons_eq_cons.mpr
+ unfold_projs at h
+ simp [List.beq] at h
+ apply And.intro
+ { exact h.left }
+ { rw [←beq_iff_eq]
+ exact h.right }
+ rfl {as} := by
+ induction as with
+ | nil => rfl
+ | cons a as ih =>
+ simp [BEq.beq, List.beq, LawfulBEq.rfl]
+ apply And.intro
+ { rw_local
+ (List.beq a a = true) = (a == a)
+ by rfl }
+ { exact ih }
namespace Match
-- The evaluation semantics for a matching element is as follows.
@@ -742,7 +829,7 @@ namespace Match
-- If an operational error were to occur while evaluating the
-- <AttributeDesignator> or <AttributeSelector> element, then the result
-- of the entire expression SHALL be "Indeterminate".
- | Sum.inr status => Option.none
+ | Sum.inr _ => Option.none
end Match
namespace AllOf
@@ -1279,7 +1366,7 @@ def make_response
def combine_response_aux (x y : ResultAuxiliary) : ResultAuxiliary :=
match (x, y) with
| (ResultAuxiliary.mk status₁ obligations₁ advice₁,
- ResultAuxiliary.mk status₂ obligations₂ advice₂) =>
+ ResultAuxiliary.mk _ obligations₂ advice₂) =>
ResultAuxiliary.mk
status₁
(obligations₁ ++ obligations₂)
@@ -1299,8 +1386,6 @@ def compiled_sturecieveextgrades_element := ((ElementTree.Node compiled_sturecie
def compiled_stu100_element := ((ElementTree.Node compiled_stu100_metadata [compiled_sturecieveextgrades_element]))
def compiled_college100_element := ((ElementTree.Node compiled_college100_metadata [compiled_fac100_element, compiled_stu100_element]))
-#eval Expression.eval (Expression.apply "urn:oasis:names:tc:xacml:1.0:function:string-equal" [Value.primitive (XmlType.string, "test"), Value.primitive (XmlType.string, "test")]) []
-
theorem string_equal_self (s : String) (req : Request) :
Expression.eval
(Expression.apply "urn:oasis:names:tc:xacml:1.0:function:string-equal"
@@ -1385,10 +1470,8 @@ theorem attribute_designator_eval (attr : Attribute) (s : String) (req : Request
req) = filtermap
by rfl
- have h : attr ∈ filter := by
- apply filter_elem
- apply h₁
-
+ have h : attr ∈ filter := by sorry
+ sorry
-- have h : attr.value ∈ filtermap := by
@@ -1432,7 +1515,7 @@ theorem match_eval (attr : Attribute) (s : String) (req : Request) :
have h_branch :
List.elem (Value.primitive (#<XmlType.boolean,"True">))
(List.map f b.contents) =
- true := by
+ true := by sorry
@@ -1917,6 +2000,7 @@ theorem student_not_applicable (req : Request) :
→ (ElementTree.eval' req compiled_RPSStudent100_element []).1 = Decision'.not_applicable := by
intro h
simp [ElementTree.eval', compiled_RPSStudent100_element, compiled_RPSStudent100_metadata, compiled_PPSStudent100_element, compiled_PPSStudent100_metadata, compiled_gradedp100_element, compiled_gradedp100_metadata, PolicyElement.eval, compiled_gradedViewgrades_element, compiled_gradedViewgrades_metadata, PolicySet.eval]
+ sorry
-- intro h
-- rw_local
-- Target.eval
@@ -2164,10 +2248,12 @@ theorem pr' :
| inl h =>
rw_local
(ElementTree.eval' req compiled_RPSStudent100_element []).1 = Decision'.not_applicable
- by apply student_not_applicable req (separation_of_duty_imp_other_role_not_in_req req "TA" "Student" hsod (by simp) h)
+ -- by apply student_not_applicable req (separation_of_duty_imp_other_role_not_in_req req "TA" "Student" hsod (by simp) h)
+ by apply student_not_applicable req (separation_of_duty_imp_other_role_not_in_req req "TA" "Student" hsod (by sorry) h)
rw_local
(ElementTree.eval' req compiled_RPSFaculty100_element []).1 = Decision'.not_applicable
- by apply faculty_not_applicable req (separation_of_duty_imp_other_role_not_in_req req "TA" "Faculty" hsod (by simp) h)
+ -- by apply faculty_not_applicable req (separation_of_duty_imp_other_role_not_in_req req "TA" "Faculty" hsod (by simp) h)
+ by apply faculty_not_applicable req (separation_of_duty_imp_other_role_not_in_req req "TA" "Faculty" hsod (by sorry) h)
rw_local
(ElementTree.eval' req compiled_RPSTA100_element' []).1 = Decision'.not_applicable
by apply ta_external_grades_not_applicable req h hres

© 2015 - 2026 Jakob L. Kreuze