inductive
msgrel::"freemsg ==> freemsg ==> bool" (infixl‹∼› 50) where CD: "CRYPT K (DECRYPT K X) ∼ X"
| DC: "DECRYPT K (CRYPT K X) ∼ X"
| NONCE: "NONCE N ∼ NONCE N"
| MPAIR: "[X ∼ X'; Y ∼ Y']==> MPAIR X Y ∼ MPAIR X' Y'"
| CRYPT: "X ∼ X' ==> CRYPT K X ∼ CRYPT K X'"
| DECRYPT: "X ∼ X' ==> DECRYPT K X ∼ DECRYPT K X'"
| SYM: "X ∼ Y ==> Y ∼ X"
| TRANS: "[X ∼ Y; Y ∼ Z]==> X ∼ Z"
primrec
freenonces :: "freemsg ==> nat set" where "freenonces (NONCE N) = {N}"
| "freenonces (MPAIR X Y) = freenonces X ∪ freenonces Y"
| "freenonces (CRYPT K X) = freenonces X"
| "freenonces (DECRYPT K X) = freenonces X"
theorem msgrel_imp_eq_freenonces: assumes a: "U ∼ V" shows"freenonces U = freenonces V" using a by (induct) (auto)
subsubsection‹The Left Projection›
text‹A function to return the left part of the top pair in a message. It will be lifted to the initial algebra, to serve as an example of that process.› primrec
freeleft :: "freemsg ==> freemsg" where "freeleft (NONCE N) = NONCE N"
| "freeleft (MPAIR X Y) = X"
| "freeleft (CRYPT K X) = freeleft X"
| "freeleft (DECRYPT K X) = freeleft X"
text‹This theorem lets us prove that the left function respects the equivalence relation. It also helps us prove that MPair (the abstract constructor) is injective› lemma msgrel_imp_eqv_freeleft_aux: shows"freeleft U ∼ freeleft U" by (fact msgrel_refl)
theorem msgrel_imp_eqv_freeleft: assumes a: "U ∼ V" shows"freeleft U ∼ freeleft V" using a by (induct) (auto intro: msgrel_imp_eqv_freeleft_aux)
subsubsection‹The Right Projection›
text‹A function to return the right part of the top pair in a message.› primrec
freeright :: "freemsg ==> freemsg" where "freeright (NONCE N) = NONCE N"
| "freeright (MPAIR X Y) = Y"
| "freeright (CRYPT K X) = freeright X"
| "freeright (DECRYPT K X) = freeright X"
text‹This theorem lets us prove that the right function respects the equivalence relation. It also helps us prove that MPair (the abstract constructor) is injective› lemma msgrel_imp_eqv_freeright_aux: shows"freeright U ∼ freeright U" by (fact msgrel_refl)
theorem msgrel_imp_eqv_freeright: assumes a: "U ∼ V" shows"freeright U ∼ freeright V" using a by (induct) (auto intro: msgrel_imp_eqv_freeright_aux)
subsubsection‹The Discriminator for Constructors›
text‹A function to distinguish nonces, mpairs and encryptions› primrec
freediscrim :: "freemsg ==> int" where "freediscrim (NONCE N) = 0"
| "freediscrim (MPAIR X Y) = 1"
| "freediscrim (CRYPT K X) = freediscrim X + 2"
| "freediscrim (DECRYPT K X) = freediscrim X - 2"
text‹This theorem helps us prove 🍋‹Nonce N ≠ MPair X Y›\› theorem msgrel_imp_eq_freediscrim: assumes a: "U ∼ V" shows"freediscrim U = freediscrim V" using a by (induct) (auto)
subsection‹The Initial Algebra: A Quotiented Message Type›
quotient_type msg = freemsg / msgrel by (rule equiv_msgrel)
text‹The abstract message constructors›
quotient_definition "Nonce :: nat ==> msg" is "NONCE" done
quotient_definition "MPair :: msg ==> msg ==> msg" is "MPAIR" by (rule MPAIR)
quotient_definition "Crypt :: nat ==> msg ==> msg" is "CRYPT" by (rule CRYPT)
quotient_definition "Decrypt :: nat ==> msg ==> msg" is "DECRYPT" by (rule DECRYPT)
text‹Establishing these two equations is the point of the whole exercise› theorem CD_eq [simp]: shows"Crypt K (Decrypt K X) = X" by (lifting CD)
theorem DC_eq [simp]: shows"Decrypt K (Crypt K X) = X" by (lifting DC)
subsection‹The Abstract Function to Return the Set of Nonces›
quotient_definition "nonces:: msg ==> nat set" is "freenonces" by (rule msgrel_imp_eq_freenonces)
lemma right_MPair [simp]: shows"right (MPair X Y) = Y" by (lifting freeright.simps(2))
lemma right_Crypt [simp]: shows"right (Crypt K X) = right X" by (lifting freeright.simps(3))
lemma right_Decrypt [simp]: shows"right (Decrypt K X) = right X" by (lifting freeright.simps(4))
subsection‹Injectivity Properties of Some Constructors›
text‹Can also be proved using the function 🍋‹nonces›\› lemma Nonce_Nonce_eq [iff]: shows"(Nonce m = Nonce n) = (m = n)" proof assume"Nonce m = Nonce n" thenshow"m = n" by (descending) (drule msgrel_imp_eq_freenonces, simp) next assume"m = n" thenshow"Nonce m = Nonce n"by simp qed
lemma MPair_imp_eq_left: assumes eq: "MPair X Y = MPair X' Y'" shows"X = X'" using eq by (descending) (drule msgrel_imp_eqv_freeleft, simp)
lemma MPair_imp_eq_right: shows"MPair X Y = MPair X' Y' ==> Y = Y'" by (descending) (drule msgrel_imp_eqv_freeright, simp)
theorem MPair_MPair_eq [iff]: shows"(MPair X Y = MPair X' Y') = (X=X' & Y=Y')" by (blast dest: MPair_imp_eq_left MPair_imp_eq_right)
theorem Nonce_neq_MPair [iff]: shows"Nonce N ≠ MPair X Y" by (descending) (auto dest: msgrel_imp_eq_freediscrim)
text‹Example suggested by a referee›
theorem Crypt_Nonce_neq_Nonce: shows"Crypt K (Nonce M) ≠ Nonce N" by (descending) (auto dest: msgrel_imp_eq_freediscrim)
text‹...and many similar results›
theorem Crypt2_Nonce_neq_Nonce: shows"Crypt K (Crypt K' (Nonce M)) ≠ Nonce N" by (descending) (auto dest: msgrel_imp_eq_freediscrim)
theorem Crypt_Crypt_eq [iff]: shows"(Crypt K X = Crypt K X') = (X=X')" proof assume"Crypt K X = Crypt K X'" hence"Decrypt K (Crypt K X) = Decrypt K (Crypt K X')"by simp thus"X = X'"by simp next assume"X = X'" thus"Crypt K X = Crypt K X'"by simp qed
theorem Decrypt_Decrypt_eq [iff]: shows"(Decrypt K X = Decrypt K X') = (X=X')" proof assume"Decrypt K X = Decrypt K X'" hence"Crypt K (Decrypt K X) = Crypt K (Decrypt K X')"by simp thus"X = X'"by simp next assume"X = X'" thus"Decrypt K X = Decrypt K X'"by simp qed
lemma msg_induct [case_names Nonce MPair Crypt Decrypt, cases type: msg]: assumes N: "∧N. P (Nonce N)" and M: "∧X Y. [P X; P Y]==> P (MPair X Y)" and C: "∧K X. P X ==> P (Crypt K X)" and D: "∧K X. P X ==> P (Decrypt K X)" shows"P msg" using N M C D by (descending) (auto intro: freemsg.induct)
subsection‹The Abstract Discriminator›
text‹However, as ‹Crypt_Nonce_neq_Nonce›above illustrates, we don't need this function in order to prove discrimination theorems.›
quotient_definition "discrim:: msg ==> int" is "freediscrim" by (rule msgrel_imp_eq_freediscrim)
text‹Now prove the four equations for 🍋‹discrim›\›
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 und die Messung sind noch experimentell.