inductive sec_type :: "nat \ com \ bool" (\(_/ \ _)\ [0,0] 50) where
Skip: "l \ SKIP" |
Assign: "\ sec x \ sec a; sec x \ l \ \ l \ x ::= a" |
Seq: "\ l \ c\<^sub>1; l \ c\<^sub>2 \ \ l \ c\<^sub>1;;c\<^sub>2" | If: "\ max (sec b) l \ c\<^sub>1; max (sec b) l \ c\<^sub>2 \ \ l \ IF b THEN c\<^sub>1 ELSE c\<^sub>2" |
While: "max (sec b) l \ c \ l \ WHILE b DO c"
code_pred (expected_modes: i => i => bool) sec_type .
value"0 \ IF Less (V ''x1'') (V ''x'') THEN ''x1'' ::= N 0 ELSE SKIP" value"1 \ IF Less (V ''x1'') (V ''x'') THEN ''x'' ::= N 0 ELSE SKIP" value"2 \ IF Less (V ''x1'') (V ''x'') THEN ''x1'' ::= N 0 ELSE SKIP"
inductive_cases [elim!]: "l \ x ::= a" "l \ c\<^sub>1;;c\<^sub>2" "l \ IF b THEN c\<^sub>1 ELSE c\<^sub>2" "l \ WHILE b DO c"
text\<open>An important property: anti-monotonicity.\<close>
lemma anti_mono: "\ l \ c; l' \ l \ \ l' \ c" apply(induction arbitrary: l' rule: sec_type.induct) apply (metis sec_type.intros(1)) apply (metis le_trans sec_type.intros(2)) apply (metis sec_type.intros(3)) apply (metis If le_refl sup_mono sup_nat_def) apply (metis While le_refl sup_mono sup_nat_def) done
lemma confinement: "\ (c,s) \ t; l \ c \ \ s = t (< l)" proof(induction rule: big_step_induct) case Skip thus ?caseby simp next case Assign thus ?caseby auto next case Seq thus ?caseby auto next case (IfTrue b s c1) hence"max (sec b) l \ c1" by auto hence"l \ c1" by (metis max.cobounded2 anti_mono) thus ?caseusing IfTrue.IH by metis next case (IfFalse b s c2) hence"max (sec b) l \ c2" by auto hence"l \ c2" by (metis max.cobounded2 anti_mono) thus ?caseusing IfFalse.IH by metis next case WhileFalse thus ?caseby auto next case (WhileTrue b s1 c) hence"max (sec b) l \ c" by auto hence"l \ c" by (metis max.cobounded2 anti_mono) thus ?caseusing WhileTrue by metis qed
theorem noninterference: "\ (c,s) \ s'; (c,t) \ t'; 0 \ c; s = t (\ l) \ \<Longrightarrow> s' = t' (\<le> l)" proof(induction arbitrary: t t' rule: big_step_induct) case Skip thus ?caseby auto next case (Assign x a s) have [simp]: "t' = t(x := aval a t)"using Assign by auto have"sec x >= sec a"using\<open>0 \<turnstile> x ::= a\<close> by auto show ?case proof auto assume"sec x \ l" with\<open>sec x >= sec a\<close> have "sec a \<le> l" by arith thus"aval a s = aval a t" by (rule aval_eq_if_eq_le[OF \<open>s = t (\<le> l)\<close>]) next fix y assume"y \ x" "sec y \ l" thus"s y = t y"using\<open>s = t (\<le> l)\<close> by simp qed next case Seq thus ?caseby blast next case (IfTrue b s c1 s' c2) have"sec b \ c1" "sec b \ c2" using \0 \ IF b THEN c1 ELSE c2\ by auto show ?case proof cases assume"sec b \ l" hence"s = t (\ sec b)" using \s = t (\ l)\ by auto hence"bval b t"using\<open>bval b s\<close> by(simp add: bval_eq_if_eq_le) with IfTrue.IH IfTrue.prems(1,3) \<open>sec b \<turnstile> c1\<close> anti_mono show ?thesis by auto next assume"\ sec b \ l" have 1: "sec b \ IF b THEN c1 ELSE c2" by(rule sec_type.intros)(simp_all add: \<open>sec b \<turnstile> c1\<close> \<open>sec b \<turnstile> c2\<close>) from confinement[OF \<open>(c1, s) \<Rightarrow> s'\<close> \<open>sec b \<turnstile> c1\<close>] \<open>\<not> sec b \<le> l\<close> have"s = s' (\ l)" by auto moreover from confinement[OF \<open>(IF b THEN c1 ELSE c2, t) \<Rightarrow> t'\<close> 1] \<open>\<not> sec b \<le> l\<close> have"t = t' (\ l)" by auto ultimatelyshow"s' = t' (\ l)" using \s = t (\ l)\ by auto qed next case (IfFalse b s c2 s' c1) have"sec b \ c1" "sec b \ c2" using \0 \ IF b THEN c1 ELSE c2\ by auto show ?case proof cases assume"sec b \ l" hence"s = t (\ sec b)" using \s = t (\ l)\ by auto hence"\ bval b t" using \\ bval b s\ by(simp add: bval_eq_if_eq_le) with IfFalse.IH IfFalse.prems(1,3) \<open>sec b \<turnstile> c2\<close> anti_mono show ?thesis by auto next assume"\ sec b \ l" have 1: "sec b \ IF b THEN c1 ELSE c2" by(rule sec_type.intros)(simp_all add: \<open>sec b \<turnstile> c1\<close> \<open>sec b \<turnstile> c2\<close>) from confinement[OF big_step.IfFalse[OF IfFalse(1,2)] 1] \<open>\<not> sec b \<le> l\<close> have"s = s' (\ l)" by auto moreover from confinement[OF \<open>(IF b THEN c1 ELSE c2, t) \<Rightarrow> t'\<close> 1] \<open>\<not> sec b \<le> l\<close> have"t = t' (\ l)" by auto ultimatelyshow"s' = t' (\ l)" using \s = t (\ l)\ by auto qed next case (WhileFalse b s c) have"sec b \ c" using WhileFalse.prems(2) by auto show ?case proof cases assume"sec b \ l" hence"s = t (\ sec b)" using \s = t (\ l)\ by auto hence"\ bval b t" using \\ bval b s\ by(simp add: bval_eq_if_eq_le) with WhileFalse.prems(1,3) show ?thesis by auto next assume"\ sec b \ l" have 1: "sec b \ WHILE b DO c" by(rule sec_type.intros)(simp_all add: \<open>sec b \<turnstile> c\<close>) from confinement[OF \<open>(WHILE b DO c, t) \<Rightarrow> t'\<close> 1] \<open>\<not> sec b \<le> l\<close> have"t = t' (\ l)" by auto thus"s = t' (\ l)" using \s = t (\ l)\ by auto qed next case (WhileTrue b s1 c s2 s3 t1 t3) let ?w = "WHILE b DO c" have"sec b \ c" using \0 \ WHILE b DO c\ by auto show ?case proof cases assume"sec b \ l" hence"s1 = t1 (\ sec b)" using \s1 = t1 (\ l)\ by auto hence"bval b t1" using\<open>bval b s1\<close> by(simp add: bval_eq_if_eq_le) thenobtain t2 where"(c,t1) \ t2" "(?w,t2) \ t3" using\<open>(?w,t1) \<Rightarrow> t3\<close> by auto from WhileTrue.IH(2)[OF \<open>(?w,t2) \<Rightarrow> t3\<close> \<open>0 \<turnstile> ?w\<close>
WhileTrue.IH(1)[OF \<open>(c,t1) \<Rightarrow> t2\<close> anti_mono[OF \<open>sec b \<turnstile> c\<close>] \<open>s1 = t1 (\<le> l)\<close>]] show ?thesis by simp next assume"\ sec b \ l" have 1: "sec b \ ?w" by(rule sec_type.intros)(simp_all add: \sec b \ c\) from confinement[OF big_step.WhileTrue[OF WhileTrue.hyps] 1] \<open>\<not> sec b \<le> l\<close> have"s1 = s3 (\ l)" by auto moreover from confinement[OF \<open>(WHILE b DO c, t1) \<Rightarrow> t3\<close> 1] \<open>\<not> sec b \<le> l\<close> have"t1 = t3 (\ l)" by auto ultimatelyshow"s3 = t3 (\ l)" using \s1 = t1 (\ l)\ by auto qed qed
subsubsection "The Standard Typing System"
text\<open>The predicate \<^prop>\<open>l \<turnstile> c\<close> is nicely intuitive and executable. The
standard formulation, however, is slightly different, replacing the maximum
computation by an antimonotonicity rule. We introduce the standard system now andshow the equivalence with our formulation.\<close>
inductive sec_type' :: "nat \ com \ bool" (\(_/ \'' _)\ [0,0] 50) where
Skip': "l \' SKIP" |
Assign': "\ sec x \ sec a; sec x \ l \ \ l \' x ::= a" |
Seq': "\ l \' c\<^sub>1; l \' c\<^sub>2 \ \ l \' c\<^sub>1;;c\<^sub>2" | If': "\ sec b \ l; l \' c\<^sub>1; l \' c\<^sub>2 \ \ l \' IF b THEN c\<^sub>1 ELSE c\<^sub>2" |
While': "\ sec b \ l; l \' c \ \ l \' WHILE b DO c" |
anti_mono': "\ l \' c; l' \ l \ \ l' \' c"
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.