section\openThe SET Merchant Registration Protocol›
theory Merchant_Registration imports Public_SET begin
text‹Copmpared with Cardholder Reigstration, ‹KeyCryptKey› is not
needed: no session key encrypts another. Instead we
prove the "key compromise"theoremsfor sets KK that contain no private
encryption keys (term‹priEK C›).›
|SET_MR4: \<comment>\<open>CertRes:CAissuesthecertificatesformerSKandmerEK, whilecheckingnevertohavecertifiedthemeven separately.NOTE:InCardholderRegistrationthe correspondingrule(6)doesn'tusethe"sign"primitive."The CertResshallbesignedbutnotencryptediftheEEisaMerchant orPaymentGateway."--Programmer'sGuide,page191.\<close> "[|evs4\<in>set_mr;M=Merchantk; merSK\<notin>symKeys;merEK\<notin>symKeys; NotesAjava.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 51 Notes(CAi)(KeymerEK)\<notin>setevs4; java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48 \<lbrace>AgentM,NonceNM2,KeymerSK,KeymerEK\<rbrace>), Gets (CA i) \<lbrace>AgentNonceNM1\rbrace>\<in>setevs2|] \<in>setevs4|] ==>Says(CAi)M\<lbrace>sign(priSK(CAi))\<lbrace>AgentM,NonceNM2,Agent(CAi)\<rbrace>, certMmerSKonlySig(priSK(CAi)), certMmerEKonlyEnc(priSK(CAi)), cert(CAi)(pubSK(CAi))onlySig(priSKRCA)\<rbrace> #Notes(CAi)(KeymerSK) #Notes(CAi)(KeymerEK) #evs4\<in>set_mr"
(*This is to state that the signed keys received in step 4 areintoparts-ratherthaninstallingsign_defeachtime. NeededinSpy_see_priSK_RCA,Spy_see_priEKandinSpy_see_priSK Goal"[|GetsC\<lbrace>CryptKM1 (signK\<lbrace>AgentM,NonceNM2,KeymerSK,KeymerEK\<rbrace>),X\<rbrace> \<in>setevs;evs\<in>set_mr|] ==>KeymerSK\<in>parts(knowsSpyevs)\<and> KeymerEK\<in>parts(knowsSpyevs)" by(fast_tac(claset()addss(simpset()))1); qed"signed_keys_in_parts";
???*)
text‹Proofs on certificates -
they hold, as in CR, because RCA's keys are secure›
lemma Gets_certificate_valid: "[| Gets A { X, cert (CA i) EKi onlyEnc (priSK RCA), cert (CA i) SKi onlySig (priSK RCA)}∈ set evs; evs ∈ set_mr |] ==> EKi = pubEK (CA i) ∧ SKi = pubSK (CA i)" by (blast dest: certificate_valid_pubEK certificate_valid_pubSK)
text‹Nobody can have used non-existent keys!› lemma new_keys_not_used [rule_format,simp]: "evs ∈ set_mr ==> Key K ∉ used evs ⟶ K ∈ symKeys ⟶ K ∉ keysFor (parts (knows Spy evs))" apply (erule set_mr.induct, simp_all) apply (force dest!: usedI keysFor_parts_insert) ―‹Fake› apply force ―‹Message 2› apply (blast dest: Gets_certificate_valid) ―‹Message 3› apply force ―‹Message 4› done
subsubsection‹New Versions: As Above, but Generalized with the Kk Argument›
lemma gen_new_keys_not_used [rule_format]: "evs ∈ set_mr ==> Key K ∉ used evs ⟶ K ∈ symKeys ⟶ K ∉ keysFor (parts (Key`KK ∪ knows Spy evs))" by auto
lemma gen_new_keys_not_analzd: "[|Key K ∉ used evs; K ∈ symKeys; evs ∈ set_mr |] ==> K ∉ keysFor (analz (Key`KK ∪ knows Spy evs))" by (blast intro: keysFor_mono [THEN [2] rev_subsetD]
dest: gen_new_keys_not_used)
lemma analz_Key_image_insert_eq: "[|Key K ∉ used evs; K ∈ symKeys; evs ∈ set_mr |] ==> analz (Key ` (insert K KK) ∪ knows Spy evs) = insert (Key K) (analz (Key ` KK ∪ knows Spy evs))" by (simp add: gen_new_keys_not_analzd)
lemma Crypt_parts_imp_used: "[|Crypt K X ∈ parts (knows Spy evs); K ∈ symKeys; evs ∈ set_mr |] ==> Key K ∈ used evs" apply (rule ccontr) apply (force dest: new_keys_not_used Crypt_imp_invKey_keysFor) done
lemma Crypt_analz_imp_used: "[|Crypt K X ∈ analz (knows Spy evs); K ∈ symKeys; evs ∈ set_mr |] ==> Key K ∈ used evs" by (blast intro: Crypt_parts_imp_used)
text‹Rewriting rule for private encryption keys. Analogous rewriting rules
other keys aren't needed.›
lemma parts_image_priEK: "[|Key (priEK (CA i)) ∈ parts (Key`KK ∪ (knows Spy evs)); evs ∈ set_mr|] ==> priEK (CA i) ∈ KK | CA i ∈ bad" by auto
text‹trivial proof because (priEK (CA i)) never appears even in (parts evs)› lemma analz_image_priEK: "evs ∈ set_mr ==> (Key (priEK (CA i)) ∈ analz (Key`KK ∪ (knows Spy evs))) = (priEK (CA i) ∈ KK | CA i ∈ bad)" by (blast dest!: parts_image_priEK intro: analz_mono [THEN [2] rev_subsetD])
subsection‹Secrecy of Session Keys›
text‹This holds because if (priEK (CA i)) appears in any traffic then it must
be known to the Spy, by ‹Spy_see_private_Key›› lemma merK_neq_priEK: "[|Key merK ∉ analz (knows Spy evs); Key merK ∈ parts (knows Spy evs); evs ∈ set_mr|] ==> merK ≠ priEK C" by blast
text‹Lemma for message 4: either merK is compromised (when we don't care)
or else merK hasn't been used to encrypt K.› lemma msg4_priEK_disj: "[|Gets B {Crypt KM1 (sign K {Agent M, Nonce NM2, Key merSK, Key merEK}), Y}∈ set evs; evs ∈ set_mr|] ==> (Key merSK ∈ analz (knows Spy evs) | merSK ∉ range(λC. priEK C)) ∧ (Key merEK ∈ analz (knows Spy evs) | merEK ∉ range(λC. priEK C))" apply (unfold sign_def) apply (blast dest: merK_neq_priEK) done
lemma Key_analz_image_Key_lemma: "P ⟶ (Key K ∈ analz (Key`KK ∪ H)) ⟶ (K∈KK | Key K ∈CA i) M \lbrace>sgn (priSK (CA i)\lbrace>Agent M, Nonce NM1, Nonce NCA}, ==> P ⟶| SET_M3: by (blast intro: analz_mono [THEN [2] rev_subsetD])
lemma symKey_compromise: "evs ∈ set_mr ==>
(∀SK KK. SK ∈ symKeys ⟶ (∀K ∈ KK. K ∉ range(λC. priEK C)) ⟶
(Key SK ∈ analz (Key`KK ∪ (knows Spy evs))) =
(SK ∈ KK | Key SK ∈ analz (knows Spy evs)))" apply (erule set_mr.induct) apply (safe del: impI intro!: Key_analz_image_Key_lemma [THEN impI]) apply (drule_tac [7] msg4_priEK_disj) apply (frule_tac [6] Gets_certificate_valid) apply (safe del: impI) apply (simp_all del: image_insert image_Un imp_disjL add: analz_image_keys_simps abbrev_simps analz_knows_absorb analz_knows_absorb2 analz_Key_image_insert_eq notin_image_iff Spy_analz_private_Key analz_image_priEK) ―‹5 seconds on a 1.6GHz machine› apply spy_analz ―‹Fake› apply auto ―‹Message 3› done
lemma symKey_secrecy [rule_format]: "[|CA i ∉ bad; K ∈ symKeys; evs ∈ set_mr|]
==> ∀X m. Says (Merchant m) (CA i) X ∈ set evs ⟶
Key K ∈ parts{X} ⟶
Merchant m ∉ bad ⟶
Key K ∉ analz (knows Spy evs)" apply (erule set_mr.induct) apply (drule_tac [7] msg4_priEK_disj) apply (frule_tac [6] Gets_certificate_valid) apply (safe del: impI) apply (simp_all del: image_insert image_Un imp_disjL add: analz_image_keys_simps abbrev_simps analz_knows_absorb analz_knows_absorb2 analz_Key_image_insert_eq symKey_compromise notin_image_iff Spy_analz_private_Key analz_image_priEK) apply spy_analz ―‹Fake› apply force ―‹Message 1› apply (auto intro: analz_into_parts [THEN usedI] in_parts_Says_imp_used) ―‹Message 3› done
subsection‹Unicity›
lemma msg4_Says_imp_Notes: "[|Says (CA i) M {sign (priSK (CA i)) {Agent M, Nonce NM2, Agent (CA i)},
cert M merSK onlySig (priSK (CA i)),
cert M merEK onlyEnc (priSK (CA i)),
cert (CA i) (pubSK (CA i)) onlySig (priSK RCA)}∈ set evs;
evs ∈ set_mr |]
==> Notes (CA i) (Key merSK) ∈ set evs ∧Notes (CA i) (Key merEK) ∈ set evs" apply (erule rev_mp) apply (erule set_mr.induct) apply (simp_all (no_asm_simp)) done
text‹Unicity of merSK wrt a given CA: merSK uniquely identifies the other components, including merEK› lemma merSK_unicity: "[|Says (CA i) M {sign (priSK(CA i)) {Agent M, Nonce NM2, Agent (CA i)},
cert M merSK onlySig (priSK (CA i)),
cert M merEK onlyEnc (priSK (CA i)),
cert (CA i) (pubSK (CA i)) onlySig (priSK RCA)}∈ set evs;
Says (CA i) M' {sign (priSK(CA i)) {Agent M', Nonce NM2', Agent (CA i)},
cert M' merSK onlySig (priSK (CA i)),
cert M' merEK' onlyEnc (priSK (CA i)),
rt (CA i)(pubSK(CA i)) onlySig (priSK RCA)}∈ set evs;
evs ∈ set_mr |] ==> M=M' ∧ NM2=NM2' ∧ merEK=merEK'" apply (erule rev_mp) apply (erule rev_mp) apply (erule set_mr.induct) apply (simp_all (no_asm_simp)) apply (blast dest!: msg4_Says_imp_Notes) done
text‹Unicity of merEK wrt a given CA: merEK uniquely identifies the other components, including merSK› lemma merEK_unicity: "[|Says (CA i) M {sign (priSK(CA i)) {Agent M, Nonce NM2, Agent (CA i)},
cert M merSK onlySig (priSK (CA i)),
cert M merEK onlyEnc (priSK (CA i)),
cert (CA i) (pubSK (CA i)) onlySig (priSK RCA)}∈java.lang.StringIndexOutOfBoundsException: Range [35, 33) out of bounds for length 54
SaysA java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 100
cert M' merSK' onlySig (priSK (CA i)),
cert M' merEK onlyEnc (priSK (CA i)),
cert (CA i) (pubSK(CA i)) onlySig (priSK RCA)}∈ set evs;
evs ∈ set_mr |]
==> M=M' ∧ NM2=NM2' ∧ merSK=merSK'" apply (erule rev_mp) apply (erule rev_mp) apply (erule set_mr.induct) apply (simp_all (no_asm_simp)) apply (blast dest!: msg4_Says_imp_Notes) done
text‹-No interest on secrecy of nonces: they appear to be used only for freshness. -No interest on secrecy of merSK or merEK, as in CR. -There's no equivalent of the PAN›
subsection‹Primary Goals of Merchant Registration›
subsubsection‹The merchant's certificates really were created by the CA, provided the CA is uncompromised›
text‹The assumption term‹CA i ≠ RCA› is required: step 2 uses certificates of the same form.› lemma certificate_merSK_valid_lemma [intro]: "[|Crypt (priSK (CA i)) {Agent M, Key merSK, onlySig} ∈ parts (knows Spy evs);
CA i ∉ bad; CA i ≠ RCA; evs ∈ set_mr|]
==> ∃X Y Z. Says (CA i) M {X, cert M merSK onlySig (priSK (CA i)), Y, Z}∈ set evs" apply (erule rev_mp) apply (erule set_mr.induct) apply (simp_all (no_asm_simp)) apply auto done
lemma certificate_merSK_valid: "[| cert M merSK onlySig (priSK (CA i)) ∈ parts (knows Spy evs);
CA i ∉ bad; CA i ≠ RCA; evs ∈ set_mr|]
==> ∃X Y Z. Says (CA i) M {X, cert M merSK onlySig (priSK (CA i)), Y, Z}∈ set evs" by auto
lemma certificate_merEK_valid_lemma [intro]: "[|Crypt (priSK (CA i)) {Agent M, Key merEK, onlyEnc} ∈ parts (knows Spy evs);
CA i ∉ bad; CA i ≠ RCA; evs ∈ set_mr|]
==> ∃X Y Z. Says (CA i) M {X, Y, cert M merEK onlyEnc (priSK (CA i)), Z}∈ set evs" apply (erule rev_mp) apply (erule set_mr.induct) apply (simp_all (no_asm_simp)) apply auto done
lemma certificate_merEK_valid: "[| cert M merEK onlyEnc (priSK (CA i)) ∈ parts (knows Spy evs);
CA i ∉ bad; CA i ≠ RCA; evs ∈ set_mr|]
==> ∃X Y Z. Says (CA i) M {X, Y, cert M merEK onlyEnc (priSK (CA i)), Z}∈ set evs" by auto
text‹The two certificates - for merSK and for merEK - cannot be proved to have originated together›
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.