Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/Isabelle/HOL/Auth/   (Beweissystem Isabelle Version 2025-1©)  Datei vom 16.11.2025 mit Größe 29 kB image not shown  

Quelle  Kerberos_BAN_Gets.thy   Sprache: Isabelle

 
(*  Title:      HOL/Auth/Kerberos_BAN_Gets.thy
    Author:     Giampaolo Bella, Catania University
*)


sectionThe Kerberos Protocol, BAN Version, with Gets event

theory Kerberos_BAN_Gets imports Public begin

textFrom page 251 of
  Burrows, Abadi and Needham (1989).  A Logic of Authentication.
  Proc. Royal Soc. 426

  Confidentiality (secrecy) and authentication properties rely on
  temporal checks: strong guarantees in a little abstracted - but
  very realistic - model.


(* Temporal modelization: session keys can be leaked
                          ONLY when they have expired *)


consts

    (*Duration of the session key*)
    sesKlife   :: nat

    (*Duration of the authenticator*)
    authlife :: nat

textThe ticket should remain fresh for two journeys on the network at least
textThe Gets event causes longer traces for the protocol to reach its end
specification (sesKlife)
  sesKlife_LB [iff]: "4 \ sesKlife"
    by blast

textThe authenticator only for one journey
textThe Gets event causes longer traces for the protocol to reach its end
specification (authlife)
  authlife_LB [iff]:    "2 \ authlife"
    by blast


abbreviation
  CT :: "event list \ nat" where
  "CT == length"

abbreviation
  expiredK :: "[nat, event list] \ bool" where
  "expiredK T evs == sesKlife + T < CT evs"

abbreviation
  expiredA :: "[nat, event list] \ bool" where
  "expiredA T evs == authlife + T < CT evs"


definition
 (* Yields the subtrace of a given trace from its beginning to a given event *)
  before :: "[event, event list] \ event list" (before _ on _)
  where "before ev on evs = takeWhile (\z. z \ ev) (rev evs)"

definition
 (* States than an event really appears only once on a trace *)
  Unique :: "[event, event list] \ bool" (Unique _ on _)
  where "Unique ev on evs = (ev \ set (tl (dropWhile (\z. z \ ev) evs)))"


inductive_set bankerb_gets :: "event list set"
 where

   Nil:  "[] \ bankerb_gets"

 | Fake: "\ evsf \ bankerb_gets; X \ synth (analz (knows Spy evsf)) \
          ==> Says Spy B X # evsf  bankerb_gets"

 | Reception: "\ evsr\ bankerb_gets; Says A B X \ set evsr \
                ==> Gets B X # evsr  bankerb_gets"

 | BK1:  "\ evs1 \ bankerb_gets \
          ==> Says A Server {Agent A, Agent B} # evs1
                  bankerb_gets"


 | BK2:  "\ evs2 \ bankerb_gets; Key K \ used evs2; K \ symKeys;
             Gets Server {Agent A, Agent B}  set evs2 ]
          ==> Says Server A
                (Crypt (shrK A)
                   {Number (CT evs2), Agent B, Key K,
                    (Crypt (shrK B) {Number (CT evs2), Agent A, Key K})})
                # evs2  bankerb_gets"


 | BK3:  "\ evs3 \ bankerb_gets;
             Gets A (Crypt (shrK A) {Number Tk, Agent B, Key K, Ticket})
                set evs3;
             Says A Server {Agent A, Agent B}  set evs3;
             ¬ expiredK Tk evs3 ]
          ==> Says A B {Ticket, Crypt K {Agent A, Number (CT evs3)} }
               # evs3  bankerb_gets"


 | BK4:  "\ evs4 \ bankerb_gets;
             Gets B {(Crypt (shrK B) {Number Tk, Agent A, Key K}),
                         (Crypt K {Agent A, Number Ta}}  set evs4;
             ¬ expiredK Tk evs4;  ¬ expiredA Ta evs4 ]
          ==> Says B A (Crypt K (Number Ta)) # evs4
                 bankerb_gets"

        (*Old session keys may become compromised*)
 | Oops"\ evso \ bankerb_gets;
         Says Server A (Crypt (shrK A) {Number Tk, Agent B, Key K, Ticket})
                set evso;
             expiredK Tk evso ]
          ==> Notes Spy {Number Tk, Key K} # evso  bankerb_gets"


declare Says_imp_knows_Spy [THEN parts.Inj, dest]
declare parts.Body [dest]
declare analz_into_parts [dest]
declare Fake_parts_insert_in_Un [dest]
declare knows_Spy_partsEs [elim]


text"possibility property": there are traces that reach the end.
lemma "\Key K \ used []; K \ symKeys\
       ==> Timestamp. evs  bankerb_gets.
             Says B A (Crypt K (Number Timestamp))
                   set evs"
apply (cut_tac sesKlife_LB)
apply (cut_tac authlife_LB)
apply (intro exI bexI)
apply (rule_tac [2]
           bankerb_gets.Nil [THEN bankerb_gets.BK1, THEN bankerb_gets.Reception,
                            THEN bankerb_gets.BK2, THEN bankerb_gets.Reception,
                            THEN bankerb_gets.BK3, THEN bankerb_gets.Reception,
                            THEN bankerb_gets.BK4])
apply (possibility, simp_all (no_asm_simp) add: used_Cons)
done


textLemmas about reception invariant: if a message is received it certainly
was sent
lemma Gets_imp_Says :
     "\ Gets B X \ set evs; evs \ bankerb_gets \ \ \A. Says A B X \ set evs"
apply (erule rev_mp)
apply (erule bankerb_gets.induct)
apply auto
done

lemma Gets_imp_knows_Spy: 
     "\ Gets B X \ set evs; evs \ bankerb_gets \ \ X \ knows Spy evs"
apply (blast dest!: Gets_imp_Says Says_imp_knows_Spy)
done

lemma Gets_imp_knows_Spy_parts[dest]:
    "\ Gets B X \ set evs; evs \ bankerb_gets \ \ X \ parts (knows Spy evs)"
apply (blast dest: Gets_imp_knows_Spy [THEN parts.Inj])
done

lemma Gets_imp_knows:
     "\ Gets B X \ set evs; evs \ bankerb_gets \ \ X \ knows B evs"
by (metis Gets_imp_knows_Spy Gets_imp_knows_agents)

lemma Gets_imp_knows_analz:
    "\ Gets B X \ set evs; evs \ bankerb_gets \ \ X \ analz (knows B evs)"
apply (blast dest: Gets_imp_knows [THEN analz.Inj])
done

textLemmas for reasoning about predicate "before"
lemma used_Says_rev: "used (evs @ [Says A B X]) = parts {X} \ (used evs)"
apply (induct_tac "evs")
apply simp
apply (rename_tac a b)
apply (induct_tac "a")
apply auto
done

lemma used_Notes_rev: "used (evs @ [Notes A X]) = parts {X} \ (used evs)"
apply (induct_tac "evs")
apply simp
apply (rename_tac a b)
apply (induct_tac "a")
apply auto
done

lemma used_Gets_rev: "used (evs @ [Gets B X]) = used evs"
apply (induct_tac "evs")
apply simp
apply (rename_tac a b)
apply (induct_tac "a")
apply auto
done

lemma used_evs_rev: "used evs = used (rev evs)"
apply (induct_tac "evs")
apply simp
apply (rename_tac a b)
apply (induct_tac "a")
apply (simp add: used_Says_rev)
apply (simp add: used_Gets_rev)
apply (simp add: used_Notes_rev)
done

lemma used_takeWhile_used [rule_format]: 
      "x \ used (takeWhile P X) \ x \ used X"
apply (induct_tac "X")
apply simp
apply (rename_tac a b)
apply (induct_tac "a")
apply (simp_all add: used_Nil)
apply (blast dest!: initState_into_used)+
done

lemma set_evs_rev: "set evs = set (rev evs)"
apply auto
done

lemma takeWhile_void [rule_format]:
      "x \ set evs \ takeWhile (\z. z \ x) evs = evs"
apply auto
done

(**** Inductive proofs about bankerb_gets ****)

textForwarding Lemma for reasoning about the encrypted portion of message BK3
lemma BK3_msg_in_parts_knows_Spy:
     "\Gets A (Crypt KA \Timestamp, B, K, X\) \ set evs; evs \ bankerb_gets \
      ==> X  parts (knows Spy evs)"
apply blast
done

lemma Oops_parts_knows_Spy:
     "Says Server A (Crypt (shrK A) \Timestamp, B, K, X\) \ set evs
      ==> K  parts (knows Spy evs)"
apply blast
done


textSpy never sees another agent's shared key! (unless it's bad at start)
lemma Spy_see_shrK [simp]:
     "evs \ bankerb_gets \ (Key (shrK A) \ parts (knows Spy evs)) = (A \ bad)"
apply (erule bankerb_gets.induct)
apply (frule_tac [8] Oops_parts_knows_Spy)
apply (frule_tac [6] BK3_msg_in_parts_knows_Spy, simp_all, blast+)
done


lemma Spy_analz_shrK [simp]:
     "evs \ bankerb_gets \ (Key (shrK A) \ analz (knows Spy evs)) = (A \ bad)"
by auto

lemma Spy_see_shrK_D [dest!]:
     "\ Key (shrK A) \ parts (knows Spy evs);
                evs  bankerb_gets ] ==> Abad"
by (blast dest: Spy_see_shrK)

lemmas Spy_analz_shrK_D = analz_subset_parts [THEN subsetD, THEN Spy_see_shrK_D,  dest!]


textNobody can have used non-existent keys!
lemma new_keys_not_used [simp]:
    "\Key K \ used evs; K \ symKeys; evs \ bankerb_gets\
     ==> K  keysFor (parts (knows Spy evs))"
apply (erule rev_mp)
apply (erule bankerb_gets.induct)
apply (frule_tac [8] Oops_parts_knows_Spy)
apply (frule_tac [6] BK3_msg_in_parts_knows_Spy, simp_all)
txtFake
apply (force dest!: keysFor_parts_insert)
txtBK2, BK3, BK4
apply (force dest!: analz_shrK_Decrypt)+
done

subsectionLemmas concerning the form of items passed in messages

textDescribes the form of K, X and K' when the Server sends this message.\
lemma Says_Server_message_form:
     "\ Says Server A (Crypt K' \Number Tk, Agent B, Key K, Ticket\)
          set evs; evs  bankerb_gets ]
      ==> K' = shrK A \ K \ range shrK \
          Ticket = (Crypt (shrK B) {Number Tk, Agent A, Key K}
          Key K  used(before
                  Says Server A (Crypt K' \Number Tk, Agent B, Key K, Ticket\)
                  on evs) 
          Tk = CT(before 
                  Says Server A (Crypt K' \Number Tk, Agent B, Key K, Ticket\)
                  on evs)"
unfolding before_def
apply (erule rev_mp)
apply (erule bankerb_gets.induct, simp_all)
txtWe need this simplification only for Message 2
apply (simp (no_asm) add: takeWhile_tail)
apply auto
txtTwo subcases of Message 2. Subcase: used before
apply (blast dest: used_evs_rev [THEN equalityD2, THEN contra_subsetD] 
                   used_takeWhile_used)
txtsubcase: CT before
apply (fastforce dest!: set_evs_rev [THEN equalityD2, THEN contra_subsetD, THEN takeWhile_void])
done


textIf the encrypted message appears then it originated with the Server
  PROVIDED that A is NOT compromised!
  This allows A to verify freshness of the session key.

lemma Kab_authentic:
     "\ Crypt (shrK A) \Number Tk, Agent B, Key K, X\
            parts (knows Spy evs);
         A  bad;  evs  bankerb_gets ]
       ==> Says Server A (Crypt (shrK A) {Number Tk, Agent B, Key K, X})
              set evs"
apply (erule rev_mp)
apply (erule bankerb_gets.induct)
apply (frule_tac [8] Oops_parts_knows_Spy)
apply (frule_tac [6] BK3_msg_in_parts_knows_Spy, simp_all, blast)
done


textIf the TICKET appears then it originated with the Server
textFRESHNESS OF THE SESSION KEY to B
lemma ticket_authentic:
     "\ Crypt (shrK B) \Number Tk, Agent A, Key K\ \ parts (knows Spy evs);
         B  bad;  evs  bankerb_gets ]
       ==> Says Server A
            (Crypt (shrK A) {Number Tk, Agent B, Key K,
                          Crypt (shrK B) {Number Tk, Agent A, Key K}})
            set evs"
apply (erule rev_mp)
apply (erule bankerb_gets.induct)
apply (frule_tac [8] Oops_parts_knows_Spy)
apply (frule_tac [6] BK3_msg_in_parts_knows_Spy, simp_all, blast)
done


textEITHER describes the form of X when the following message is sent,
  OR     reduces it to the Fake case.
  Use Says_Server_message_form if applicable.
lemma Gets_Server_message_form:
     "\ Gets A (Crypt (shrK A) \Number Tk, Agent B, Key K, X\)
             set evs;
         evs  bankerb_gets ]
 ==> (K  range shrK  X = (Crypt (shrK B) {Number Tk, Agent A, Key K}))
          | X  analz (knows Spy evs)"
apply (case_tac "A \ bad")
apply (force dest!: Gets_imp_knows_Spy [THEN analz.Inj])
apply (blast dest!: Kab_authentic Says_Server_message_form)
done


textReliability guarantees: honest agents act as we expect

lemma BK3_imp_Gets:
   "\ Says A B \Ticket, Crypt K \Agent A, Number Ta\\ \ set evs;
      A  bad; evs  bankerb_gets ]
    ==>  Tk. Gets A (Crypt (shrK A) {Number Tk, Agent B, Key K, Ticket})
       set evs"
apply (erule rev_mp)
apply (erule bankerb_gets.induct)
apply auto
done

lemma BK4_imp_Gets:
   "\ Says B A (Crypt K (Number Ta)) \ set evs;
      B  bad; evs  bankerb_gets ]
  ==>  Tk. Gets B {Crypt (shrK B) {Number Tk, Agent A, Key K},
                    Crypt K {Agent A, Number Ta}}  set evs"
apply (erule rev_mp)
apply (erule bankerb_gets.induct)
apply auto
done

lemma Gets_A_knows_K:
  "\ Gets A (Crypt (shrK A) \Number Tk, Agent B, Key K, Ticket\) \ set evs;
     evs  bankerb_gets ]
 ==> Key K  analz (knows A evs)"
apply (force dest: Gets_imp_knows_analz)
done

lemma Gets_B_knows_K:
  "\ Gets B \Crypt (shrK B) \Number Tk, Agent A, Key K\,
             Crypt K {Agent A, Number Ta}}  set evs;
     evs  bankerb_gets ]
 ==> Key K  analz (knows B evs)"
apply (force dest: Gets_imp_knows_analz)
done


(****
 The following is to prove theorems of the form

  Key K \<in> analz (insert (Key KAB) (knows Spy evs)) \<Longrightarrow>
  Key K \<in> analz (knows Spy evs)

 A more general formula must be proved inductively.

****)



textSession keys are not used to encrypt other session keys
lemma analz_image_freshK [rule_format (no_asm)]:
     "evs \ bankerb_gets \
   K KK. KK  - (range shrK) 
          (Key K  analz (Key`KK  (knows Spy evs))) =
          (K  KK | Key K  analz (knows Spy evs))"
apply (erule bankerb_gets.induct)
apply (drule_tac [8] Says_Server_message_form)
apply (erule_tac [6] Gets_Server_message_form [THEN disjE], analz_freshK, spy_analz, auto) 
done


lemma analz_insert_freshK:
     "\ evs \ bankerb_gets; KAB \ range shrK \ \
      (Key K  analz (insert (Key KAB) (knows Spy evs))) =
      (K = KAB | Key K  analz (knows Spy evs))"
by (simp only: analz_image_freshK analz_image_freshK_simps)


textThe session key K uniquely identifies the message
lemma unique_session_keys:
     "\ Says Server A
           (Crypt (shrK A) {Number Tk, Agent B, Key K, X} set evs;
         Says Server A'
          (Crypt (shrK A') \Number Tk', Agent B', Key K, X'} set evs;
         evs  bankerb_gets ] ==> A=A' \ Tk=Tk'  B=B' \ X = X'"
apply (erule rev_mp)
apply (erule rev_mp)
apply (erule bankerb_gets.induct)
apply (frule_tac [8] Oops_parts_knows_Spy)
apply (frule_tac [6] BK3_msg_in_parts_knows_Spy, simp_all)
txtBK2: it can't be a new key\
apply blast
done

lemma unique_session_keys_Gets:
     "\ Gets A
           (Crypt (shrK A) {Number Tk, Agent B, Key K, X} set evs;
        Gets A
          (Crypt (shrK A) {Number Tk', Agent B', Key K, X'\) \ set evs;
        A  bad; evs  bankerb_gets ] ==> Tk=Tk' \ B=B'  X = X'"
apply (blast dest!: Kab_authentic unique_session_keys)
done


lemma Server_Unique:
     "\ Says Server A
            (Crypt (shrK A) {Number Tk, Agent B, Key K, Ticket} set evs;
        evs  bankerb_gets ] ==> 
   Unique Says Server A (Crypt (shrK A) {Number Tk, Agent B, Key K, Ticket})
   on evs"
apply (erule rev_mp, erule bankerb_gets.induct, simp_all add: Unique_def)
apply blast
done



subsectionNon-temporal guarantees, explicitly relying on non-occurrence of
oops events - refined below by temporal guarantees

textNon temporal treatment of confidentiality

textLemma: the session key sent in msg BK2 would be lost by oops
    if the spy could see it!
lemma lemma_conf [rule_format (no_asm)]:
     "\ A \ bad; B \ bad; evs \ bankerb_gets \
  ==> Says Server A
          (Crypt (shrK A) {Number Tk, Agent B, Key K,
                            Crypt (shrK B) {Number Tk, Agent A, Key K}})
          set evs 
      Key K  analz (knows Spy evs)  Notes Spy {Number Tk, Key K}  set evs"
apply (erule bankerb_gets.induct)
apply (frule_tac [8] Says_Server_message_form)
apply (frule_tac [6] Gets_Server_message_form [THEN disjE])
apply (simp_all (no_asm_simp) add: analz_insert_eq analz_insert_freshK pushes)
txtFake
apply spy_analz
txtBK2
apply (blast intro: parts_insertI)
txtBK3
apply (case_tac "Aa \ bad")
 prefer 2 apply (blast dest: Kab_authentic unique_session_keys)
apply (blast dest: Gets_imp_knows_Spy [THEN analz.Inj] Crypt_Spy_analz_bad elim!: MPair_analz)
txtOops
apply (blast dest: unique_session_keys)
done


textConfidentiality for the Server: Spy does not see the keys sent in msg BK2
as long as they have not expired.
lemma Confidentiality_S:
     "\ Says Server A
          (Crypt K' \Number Tk, Agent B, Key K, Ticket\) \ set evs;
        Notes Spy {Number Tk, Key K}  set evs;
         A  bad;  B  bad;  evs  bankerb_gets
      ] ==> Key K  analz (knows Spy evs)"
apply (frule Says_Server_message_form, assumption)
apply (blast intro: lemma_conf)
done

textConfidentiality for Alice
lemma Confidentiality_A:
     "\ Crypt (shrK A) \Number Tk, Agent B, Key K, X\ \ parts (knows Spy evs);
        Notes Spy {Number Tk, Key K}  set evs;
        A  bad;  B  bad;  evs  bankerb_gets
      ] ==> Key K  analz (knows Spy evs)"
by (blast dest!: Kab_authentic Confidentiality_S)

textConfidentiality for Bob
lemma Confidentiality_B:
     "\ Crypt (shrK B) \Number Tk, Agent A, Key K\
           parts (knows Spy evs);
        Notes Spy {Number Tk, Key K}  set evs;
        A  bad;  B  bad;  evs  bankerb_gets
      ] ==> Key K  analz (knows Spy evs)"
by (blast dest!: ticket_authentic Confidentiality_S)


textNon temporal treatment of authentication

textLemmas lemma_A and lemma_B in fact are common to both temporal and non-temporal treatments
lemma lemma_A [rule_format]:
     "\ A \ bad; B \ bad; evs \ bankerb_gets \
      ==>
         Key K  analz (knows Spy evs) 
         Says Server A (Crypt (shrK A) {Number Tk, Agent B, Key K, X})
          set evs 
          Crypt K {Agent A, Number Ta}  parts (knows Spy evs) 
         Says A B {X, Crypt K {Agent A, Number Ta}}
              set evs"
apply (erule bankerb_gets.induct)
apply (frule_tac [8] Oops_parts_knows_Spy)
apply (frule_tac [6] Gets_Server_message_form)
apply (frule_tac [7] BK3_msg_in_parts_knows_Spy, analz_mono_contra)
apply (simp_all (no_asm_simp) add: all_conj_distrib)
txtFake
apply blast
txtBK2
apply (force dest: Crypt_imp_invKey_keysFor)
txtBK3
apply (blast dest: Kab_authentic unique_session_keys)
done
lemma lemma_B [rule_format]:
     "\ B \ bad; evs \ bankerb_gets \
      ==> Key K  analz (knows Spy evs) 
          Says Server A (Crypt (shrK A) {Number Tk, Agent B, Key K, X})
           set evs 
          Crypt K (Number Ta)  parts (knows Spy evs) 
          Says B A (Crypt K (Number Ta))  set evs"
apply (erule bankerb_gets.induct)
apply (frule_tac [8] Oops_parts_knows_Spy)
apply (frule_tac [6] Gets_Server_message_form)
apply (drule_tac [7] BK3_msg_in_parts_knows_Spy, analz_mono_contra)
apply (simp_all (no_asm_simp) add: all_conj_distrib)
txtFake
apply blast
txtBK2 
apply (force dest: Crypt_imp_invKey_keysFor)
txtBK4
apply (blast dest: ticket_authentic unique_session_keys
                   Gets_imp_knows_Spy [THEN analz.Inj] Crypt_Spy_analz_bad)
done


textThe "r" suffix indicates theorems where the confidentiality assumptions are relaxed by the corresponding arguments.

textAuthentication of A to B
lemma B_authenticates_A_r:
     "\ Crypt K \Agent A, Number Ta\ \ parts (knows Spy evs);
         Crypt (shrK B) {Number Tk, Agent A, Key K}   parts (knows Spy evs);
        Notes Spy {Number Tk, Key K}  set evs;
         A  bad;  B  bad;  evs  bankerb_gets ]
      ==> Says A B {Crypt (shrK B) {Number Tk, Agent A, Key K},
                     Crypt K {Agent A, Number Ta}}  set evs"
by (blast dest!: ticket_authentic
          intro!: lemma_A
          elim!: Confidentiality_S [THEN [2] rev_notE])

textAuthentication of B to A
lemma A_authenticates_B_r:
     "\ Crypt K (Number Ta) \ parts (knows Spy evs);
        Crypt (shrK A) {Number Tk, Agent B, Key K, X}  parts (knows Spy evs);
        Notes Spy {Number Tk, Key K}  set evs;
        A  bad;  B  bad;  evs  bankerb_gets ]
      ==> Says B A (Crypt K (Number Ta))  set evs"
by (blast dest!: Kab_authentic
          intro!: lemma_B elim!: Confidentiality_S [THEN [2] rev_notE])

lemma B_authenticates_A:
     "\ Crypt K \Agent A, Number Ta\ \ parts (spies evs);
         Crypt (shrK B) {Number Tk, Agent A, Key K}   parts (spies evs);
        Key K  analz (spies evs);
         A  bad;  B  bad;  evs  bankerb_gets ]
      ==> Says A B {Crypt (shrK B) {Number Tk, Agent A, Key K},
                     Crypt K {Agent A, Number Ta}}  set evs"
apply (blast dest!: ticket_authentic intro!: lemma_A)
done

lemma A_authenticates_B:
     "\ Crypt K (Number Ta) \ parts (spies evs);
        Crypt (shrK A) {Number Tk, Agent B, Key K, X}  parts (spies evs);
        Key K  analz (spies evs);
        A  bad;  B  bad;  evs  bankerb_gets ]
      ==> Says B A (Crypt K (Number Ta))  set evs"
apply (blast dest!: Kab_authentic intro!: lemma_B)
done


subsectionTemporal guarantees, relying on a temporal check that insures that
no oops event occurred. These are available in the sense of goal availability


textTemporal treatment of confidentiality

textLemma: the session key sent in msg BK2 would be EXPIRED
    if the spy could see it!
lemma lemma_conf_temporal [rule_format (no_asm)]:
     "\ A \ bad; B \ bad; evs \ bankerb_gets \
  ==> Says Server A
          (Crypt (shrK A) {Number Tk, Agent B, Key K,
                            Crypt (shrK B) {Number Tk, Agent A, Key K}})
          set evs 
      Key K  analz (knows Spy evs)  expiredK Tk evs"
apply (erule bankerb_gets.induct)
apply (frule_tac [8] Says_Server_message_form)
apply (frule_tac [6] Gets_Server_message_form [THEN disjE])
apply (simp_all (no_asm_simp) add: less_SucI analz_insert_eq analz_insert_freshK pushes)
txtFake
apply spy_analz
txtBK2
apply (blast intro: parts_insertI less_SucI)
txtBK3
apply (case_tac "Aa \ bad")
 prefer 2 apply (blast dest: Kab_authentic unique_session_keys)
apply (blast dest: Gets_imp_knows_Spy [THEN analz.Inj] Crypt_Spy_analz_bad elim!: MPair_analz intro: less_SucI)
txtOopsPROOF FAILS if unsafe intro below
apply (blast dest: unique_session_keys intro!: less_SucI)
done


textConfidentiality for the Server: Spy does not see the keys sent in msg BK2
as long as they have not expired.
lemma Confidentiality_S_temporal:
     "\ Says Server A
          (Crypt K' \Number T, Agent B, Key K, X\) \ set evs;
         ¬ expiredK T evs;
         A  bad;  B  bad;  evs  bankerb_gets
      ] ==> Key K  analz (knows Spy evs)"
apply (frule Says_Server_message_form, assumption)
apply (blast intro: lemma_conf_temporal)
done

textConfidentiality for Alice
lemma Confidentiality_A_temporal:
     "\ Crypt (shrK A) \Number T, Agent B, Key K, X\ \ parts (knows Spy evs);
         ¬ expiredK T evs;
         A  bad;  B  bad;  evs  bankerb_gets
      ] ==> Key K  analz (knows Spy evs)"
by (blast dest!: Kab_authentic Confidentiality_S_temporal)

textConfidentiality for Bob
lemma Confidentiality_B_temporal:
     "\ Crypt (shrK B) \Number Tk, Agent A, Key K\
           parts (knows Spy evs);
        ¬ expiredK Tk evs;
        A  bad;  B  bad;  evs  bankerb_gets
      ] ==> Key K  analz (knows Spy evs)"
by (blast dest!: ticket_authentic Confidentiality_S_temporal)


textTemporal treatment of authentication

textAuthentication of A to B
lemma B_authenticates_A_temporal:
     "\ Crypt K \Agent A, Number Ta\ \ parts (knows Spy evs);
         Crypt (shrK B) {Number Tk, Agent A, Key K}
          parts (knows Spy evs);
         ¬ expiredK Tk evs;
         A  bad;  B  bad;  evs  bankerb_gets ]
      ==> Says A B {Crypt (shrK B) {Number Tk, Agent A, Key K},
                     Crypt K {Agent A, Number Ta}}  set evs"
by (blast dest!: ticket_authentic
          intro!: lemma_A
          elim!: Confidentiality_S_temporal [THEN [2] rev_notE])

textAuthentication of B to A
lemma A_authenticates_B_temporal:
     "\ Crypt K (Number Ta) \ parts (knows Spy evs);
         Crypt (shrK A) {Number Tk, Agent B, Key K, X}
          parts (knows Spy evs);
         ¬ expiredK Tk evs;
         A  bad;  B  bad;  evs  bankerb_gets ]
      ==> Says B A (Crypt K (Number Ta))  set evs"
by (blast dest!: Kab_authentic
          intro!: lemma_B elim!: Confidentiality_S_temporal [THEN [2] rev_notE])


subsectionCombined guarantees of key distribution and non-injective agreement on the session keys

lemma B_authenticates_and_keydist_to_A:
     "\ Gets B \Crypt (shrK B) \Number Tk, Agent A, Key K\,
                Crypt K {Agent A, Number Ta}}  set evs;
        Key K  analz (spies evs);
        A  bad;  B  bad;  evs  bankerb_gets ]
    ==> Says A B {Crypt (shrK B) {Number Tk, Agent A, Key K},
                  Crypt K {Agent A, Number Ta}}  set evs 
       Key K  analz (knows A evs)"
apply (blast dest: B_authenticates_A BK3_imp_Gets Gets_A_knows_K)
done

lemma A_authenticates_and_keydist_to_B:
     "\ Gets A (Crypt (shrK A) \Number Tk, Agent B, Key K, Ticket\) \ set evs;
        Gets A (Crypt K (Number Ta))  set evs;
        Key K  analz (spies evs);
        A  bad;  B  bad;  evs  bankerb_gets ]
    ==> Says B A (Crypt K (Number Ta))  set evs
       Key K  analz (knows B evs)"
apply (blast dest: A_authenticates_B BK4_imp_Gets Gets_B_knows_K)
done





end

Messung V0.5
C=92 H=96 G=93

¤ Dauer der Verarbeitung: 0.15 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

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.