src/HOL/SET-Protocol/Purchase.thy
author chaieb
Fri, 19 Nov 2004 14:00:31 +0100
changeset 15298 a5bea99352d6
parent 15214 d3ab9b76ccb7
child 15481 fc075ae929e4
permissions -rw-r--r--
Barith removed VS: ----------------------------------------------------------------------
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
     1
(*  Title:      HOL/Auth/SET/Purchase
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
     2
    ID:         $Id$
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
     3
    Authors:    Giampaolo Bella, Fabio Massacci, Lawrence C Paulson
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
     4
*)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
     5
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
     6
header{*Purchase Phase of SET*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
     7
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
     8
theory Purchase = PublicSET:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
     9
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    10
text{*
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    11
Note: nonces seem to consist of 20 bytes.  That includes both freshness
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    12
challenges (Chall-EE, etc.) and important secrets (CardSecret, PANsecret)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    13
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    14
This version omits @{text LID_C} but retains @{text LID_M}. At first glance
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    15
(Programmer's Guide page 267) it seems that both numbers are just introduced
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    16
for the respective convenience of the Cardholder's and Merchant's
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    17
system. However, omitting both of them would create a problem of
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    18
identification: how can the Merchant's system know what transaction is it
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    19
supposed to process?
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    20
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    21
Further reading (Programmer's guide page 309) suggest that there is an outside
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    22
bootstrapping message (SET initiation message) which is used by the Merchant
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    23
and the Cardholder to agree on the actual transaction. This bootstrapping
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    24
message is described in the SET External Interface Guide and ought to generate
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    25
@{text LID_M}. According SET Extern Interface Guide, this number might be a
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    26
cookie, an invoice number etc. The Programmer's Guide on page 310, states that
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    27
in absence of @{text LID_M} the protocol must somehow ("outside SET") identify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    28
the transaction from OrderDesc, which is assumed to be a searchable text only
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    29
field. Thus, it is assumed that the Merchant or the Cardholder somehow agreed
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    30
out-of-bad on the value of @{text LID_M} (for instance a cookie in a web
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    31
transaction etc.). This out-of-band agreement is expressed with a preliminary
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    32
start action in which the merchant and the Cardholder agree on the appropriate
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    33
values. Agreed values are stored with a suitable notes action.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    34
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    35
"XID is a transaction ID that is usually generated by the Merchant system,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    36
unless there is no PInitRes, in which case it is generated by the Cardholder
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    37
system. It is a randomly generated 20 byte variable that is globally unique
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    38
(statistically). Merchant and Cardholder systems shall use appropriate random
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    39
number generators to ensure the global uniqueness of XID."
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    40
--Programmer's Guide, page 267.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    41
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    42
PI (Payment Instruction) is the most central and sensitive data structure in
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    43
SET. It is used to pass the data required to authorize a payment card payment
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    44
from the Cardholder to the Payment Gateway, which will use the data to
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    45
initiate a payment card transaction through the traditional payment card
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    46
financial network. The data is encrypted by the Cardholder and sent via the
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    47
Merchant, such that the data is hidden from the Merchant unless the Acquirer
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    48
passes the data back to the Merchant.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    49
--Programmer's Guide, page 271.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    50
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    51
consts
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    52
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    53
    CardSecret :: "nat => nat"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    54
     (*Maps Cardholders to CardSecrets.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    55
       A CardSecret of 0 means no cerificate, must use unsigned format.*)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    56
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    57
    PANSecret :: "nat => nat"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    58
     (*Maps Cardholders to PANSecrets.*)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    59
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    60
    set_pur  :: "event list set"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    61
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    62
inductive set_pur
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    63
 intros
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    64
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    65
  Nil:   --{*Initial trace is empty*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    66
	 "[] \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    67
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    68
  Fake:  --{*The spy MAY say anything he CAN say.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    69
	 "[| evsf \<in> set_pur;  X \<in> synth(analz(knows Spy evsf)) |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    70
	  ==> Says Spy B X  # evsf \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    71
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    72
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    73
  Reception: --{*If A sends a message X to B, then B might receive it*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    74
	     "[| evsr \<in> set_pur;  Says A B X \<in> set evsr |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    75
	      ==> Gets B X  # evsr \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    76
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    77
  Start: 
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    78
      --{*Added start event which is out-of-band for SET: the Cardholder and
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    79
	  the merchant agree on the amounts and uses @{text LID_M} as an
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    80
          identifier.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    81
	  This is suggested by the External Interface Guide. The Programmer's
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    82
	  Guide, in absence of @{text LID_M}, states that the merchant uniquely
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    83
	  identifies the order out of some data contained in OrderDesc.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    84
   "[|evsStart \<in> set_pur;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    85
      Number LID_M \<notin> used evsStart;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    86
      C = Cardholder k; M = Merchant i; P = PG j;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    87
      Transaction = {|Agent M, Agent C, Number OrderDesc, Number PurchAmt|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    88
      LID_M \<notin> range CardSecret;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    89
      LID_M \<notin> range PANSecret |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    90
     ==> Notes C {|Number LID_M, Transaction|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    91
       # Notes M {|Number LID_M, Agent P, Transaction|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    92
       # evsStart \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    93
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    94
  PInitReq:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    95
     --{*Purchase initialization, page 72 of Formal Protocol Desc.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    96
   "[|evsPIReq \<in> set_pur;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    97
      Transaction = {|Agent M, Agent C, Number OrderDesc, Number PurchAmt|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    98
      Nonce Chall_C \<notin> used evsPIReq;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
    99
      Chall_C \<notin> range CardSecret; Chall_C \<notin> range PANSecret;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   100
      Notes C {|Number LID_M, Transaction |} \<in> set evsPIReq |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   101
    ==> Says C M {|Number LID_M, Nonce Chall_C|} # evsPIReq \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   102
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   103
  PInitRes:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   104
     --{*Merchant replies with his own label XID and the encryption
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   105
	 key certificate of his chosen Payment Gateway. Page 74 of Formal
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   106
         Protocol Desc. We use @{text LID_M} to identify Cardholder*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   107
   "[|evsPIRes \<in> set_pur;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   108
      Gets M {|Number LID_M, Nonce Chall_C|} \<in> set evsPIRes;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   109
      Transaction = {|Agent M, Agent C, Number OrderDesc, Number PurchAmt|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   110
      Notes M {|Number LID_M, Agent P, Transaction|} \<in> set evsPIRes;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   111
      Nonce Chall_M \<notin> used evsPIRes;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   112
      Chall_M \<notin> range CardSecret; Chall_M \<notin> range PANSecret;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   113
      Number XID \<notin> used evsPIRes;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   114
      XID \<notin> range CardSecret; XID \<notin> range PANSecret|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   115
    ==> Says M C (sign (priSK M)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   116
		       {|Number LID_M, Number XID,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   117
			 Nonce Chall_C, Nonce Chall_M,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   118
			 cert P (pubEK P) onlyEnc (priSK RCA)|})
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   119
          # evsPIRes \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   120
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   121
  PReqUns:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   122
      --{*UNSIGNED Purchase request (CardSecret = 0).
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   123
	Page 79 of Formal Protocol Desc.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   124
	Merchant never sees the amount in clear. This holds of the real
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   125
	protocol, where XID identifies the transaction. We omit
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   126
	Hash{|Number XID, Nonce (CardSecret k)|} from PIHead because
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   127
	the CardSecret is 0 and because AuthReq treated the unsigned case
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   128
	very differently from the signed one anyway.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   129
   "[|evsPReqU \<in> set_pur;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   130
      C = Cardholder k; CardSecret k = 0;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   131
      Key KC1 \<notin> used evsPReqU;  KC1 \<in> symKeys;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   132
      Transaction = {|Agent M, Agent C, Number OrderDesc, Number PurchAmt|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   133
      HOD = Hash{|Number OrderDesc, Number PurchAmt|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   134
      OIData = {|Number LID_M, Number XID, Nonce Chall_C, HOD,Nonce Chall_M|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   135
      PIHead = {|Number LID_M, Number XID, HOD, Number PurchAmt, Agent M|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   136
      Gets C (sign (priSK M)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   137
		   {|Number LID_M, Number XID,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   138
		     Nonce Chall_C, Nonce Chall_M,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   139
		     cert P EKj onlyEnc (priSK RCA)|})
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   140
	\<in> set evsPReqU;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   141
      Says C M {|Number LID_M, Nonce Chall_C|} \<in> set evsPReqU;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   142
      Notes C {|Number LID_M, Transaction|} \<in> set evsPReqU |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   143
    ==> Says C M
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   144
	     {|EXHcrypt KC1 EKj {|PIHead, Hash OIData|} (Pan (pan C)),
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   145
	       OIData, Hash{|PIHead, Pan (pan C)|} |}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   146
	  # Notes C {|Key KC1, Agent M|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   147
	  # evsPReqU \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   148
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   149
  PReqS:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   150
      --{*SIGNED Purchase request.  Page 77 of Formal Protocol Desc.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   151
          We could specify the equation
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   152
	  @{term "PIReqSigned = {| PIDualSigned, OIDualSigned |}"}, since the
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   153
	  Formal Desc. gives PIHead the same format in the unsigned case.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   154
	  However, there's little point, as P treats the signed and 
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   155
          unsigned cases differently.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   156
   "[|evsPReqS \<in> set_pur;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   157
      C = Cardholder k;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   158
      CardSecret k \<noteq> 0;  Key KC2 \<notin> used evsPReqS;  KC2 \<in> symKeys;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   159
      Transaction = {|Agent M, Agent C, Number OrderDesc, Number PurchAmt|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   160
      HOD = Hash{|Number OrderDesc, Number PurchAmt|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   161
      OIData = {|Number LID_M, Number XID, Nonce Chall_C, HOD, Nonce Chall_M|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   162
      PIHead = {|Number LID_M, Number XID, HOD, Number PurchAmt, Agent M,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   163
		  Hash{|Number XID, Nonce (CardSecret k)|}|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   164
      PANData = {|Pan (pan C), Nonce (PANSecret k)|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   165
      PIData = {|PIHead, PANData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   166
      PIDualSigned = {|sign (priSK C) {|Hash PIData, Hash OIData|},
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   167
		       EXcrypt KC2 EKj {|PIHead, Hash OIData|} PANData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   168
      OIDualSigned = {|OIData, Hash PIData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   169
      Gets C (sign (priSK M)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   170
		   {|Number LID_M, Number XID,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   171
		     Nonce Chall_C, Nonce Chall_M,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   172
		     cert P EKj onlyEnc (priSK RCA)|})
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   173
	\<in> set evsPReqS;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   174
      Says C M {|Number LID_M, Nonce Chall_C|} \<in> set evsPReqS;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   175
      Notes C {|Number LID_M, Transaction|} \<in> set evsPReqS |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   176
    ==> Says C M {|PIDualSigned, OIDualSigned|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   177
	  # Notes C {|Key KC2, Agent M|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   178
	  # evsPReqS \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   179
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   180
  --{*Authorization Request.  Page 92 of Formal Protocol Desc.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   181
    Sent in response to Purchase Request.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   182
  AuthReq:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   183
   "[| evsAReq \<in> set_pur;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   184
       Key KM \<notin> used evsAReq;  KM \<in> symKeys;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   185
       Transaction = {|Agent M, Agent C, Number OrderDesc, Number PurchAmt|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   186
       HOD = Hash{|Number OrderDesc, Number PurchAmt|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   187
       OIData = {|Number LID_M, Number XID, Nonce Chall_C, HOD,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   188
		  Nonce Chall_M|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   189
       CardSecret k \<noteq> 0 -->
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   190
	 P_I = {|sign (priSK C) {|HPIData, Hash OIData|}, encPANData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   191
       Gets M {|P_I, OIData, HPIData|} \<in> set evsAReq;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   192
       Says M C (sign (priSK M) {|Number LID_M, Number XID,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   193
				  Nonce Chall_C, Nonce Chall_M,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   194
				  cert P EKj onlyEnc (priSK RCA)|})
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   195
	 \<in> set evsAReq;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   196
	Notes M {|Number LID_M, Agent P, Transaction|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   197
	   \<in> set evsAReq |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   198
    ==> Says M P
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   199
	     (EncB (priSK M) KM (pubEK P)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   200
	       {|Number LID_M, Number XID, Hash OIData, HOD|}	P_I)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   201
	  # evsAReq \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   202
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   203
  --{*Authorization Response has two forms: for UNSIGNED and SIGNED PIs.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   204
    Page 99 of Formal Protocol Desc.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   205
    PI is a keyword (product!), so we call it @{text P_I}. The hashes HOD and
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   206
    HOIData occur independently in @{text P_I} and in M's message.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   207
    The authCode in AuthRes represents the baggage of EncB, which in the
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   208
    full protocol is [CapToken], [AcqCardMsg], [AuthToken]:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   209
    optional items for split shipments, recurring payments, etc.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   210
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   211
  AuthResUns:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   212
    --{*Authorization Response, UNSIGNED*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   213
   "[| evsAResU \<in> set_pur;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   214
       C = Cardholder k; M = Merchant i;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   215
       Key KP \<notin> used evsAResU;  KP \<in> symKeys;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   216
       CardSecret k = 0;  KC1 \<in> symKeys;  KM \<in> symKeys;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   217
       PIHead = {|Number LID_M, Number XID, HOD, Number PurchAmt, Agent M|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   218
       P_I = EXHcrypt KC1 EKj {|PIHead, HOIData|} (Pan (pan C));
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   219
       Gets P (EncB (priSK M) KM (pubEK P)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   220
	       {|Number LID_M, Number XID, HOIData, HOD|} P_I)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   221
	   \<in> set evsAResU |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   222
   ==> Says P M
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   223
	    (EncB (priSK P) KP (pubEK M)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   224
	      {|Number LID_M, Number XID, Number PurchAmt|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   225
	      authCode)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   226
       # evsAResU \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   227
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   228
  AuthResS:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   229
    --{*Authorization Response, SIGNED*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   230
   "[| evsAResS \<in> set_pur;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   231
       C = Cardholder k;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   232
       Key KP \<notin> used evsAResS;  KP \<in> symKeys;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   233
       CardSecret k \<noteq> 0;  KC2 \<in> symKeys;  KM \<in> symKeys;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   234
       P_I = {|sign (priSK C) {|Hash PIData, HOIData|},
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   235
	       EXcrypt KC2 (pubEK P) {|PIHead, HOIData|} PANData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   236
       PANData = {|Pan (pan C), Nonce (PANSecret k)|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   237
       PIData = {|PIHead, PANData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   238
       PIHead = {|Number LID_M, Number XID, HOD, Number PurchAmt, Agent M,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   239
		  Hash{|Number XID, Nonce (CardSecret k)|}|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   240
       Gets P (EncB (priSK M) KM (pubEK P)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   241
		{|Number LID_M, Number XID, HOIData, HOD|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   242
	       P_I)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   243
	   \<in> set evsAResS |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   244
   ==> Says P M
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   245
	    (EncB (priSK P) KP (pubEK M)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   246
	      {|Number LID_M, Number XID, Number PurchAmt|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   247
	      authCode)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   248
       # evsAResS \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   249
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   250
  PRes:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   251
    --{*Purchase response.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   252
   "[| evsPRes \<in> set_pur;  KP \<in> symKeys;  M = Merchant i;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   253
       Transaction = {|Agent M, Agent C, Number OrderDesc, Number PurchAmt|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   254
       Gets M (EncB (priSK P) KP (pubEK M)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   255
	      {|Number LID_M, Number XID, Number PurchAmt|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   256
	      authCode)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   257
	  \<in> set evsPRes;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   258
       Gets M {|Number LID_M, Nonce Chall_C|} \<in> set evsPRes;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   259
       Says M P
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   260
	    (EncB (priSK M) KM (pubEK P)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   261
	      {|Number LID_M, Number XID, Hash OIData, HOD|} P_I)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   262
	 \<in> set evsPRes;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   263
       Notes M {|Number LID_M, Agent P, Transaction|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   264
	  \<in> set evsPRes
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   265
      |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   266
   ==> Says M C
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   267
	 (sign (priSK M) {|Number LID_M, Number XID, Nonce Chall_C,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   268
			   Hash (Number PurchAmt)|})
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   269
	 # evsPRes \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   270
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   271
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   272
specification (CardSecret PANSecret)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   273
  inj_CardSecret:  "inj CardSecret"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   274
  inj_PANSecret:   "inj PANSecret"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   275
  CardSecret_neq_PANSecret: "CardSecret k \<noteq> PANSecret k'"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   276
    --{*No CardSecret equals any PANSecret*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   277
  apply (rule_tac x="curry nat2_to_nat 0" in exI)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   278
  apply (rule_tac x="curry nat2_to_nat 1" in exI)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   279
  apply (simp add: nat2_to_nat_inj [THEN inj_eq] inj_on_def)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   280
  done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   281
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   282
declare Says_imp_knows_Spy [THEN parts.Inj, dest]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   283
declare parts.Body [dest]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   284
declare analz_into_parts [dest]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   285
declare Fake_parts_insert_in_Un [dest]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   286
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   287
declare CardSecret_neq_PANSecret [iff] 
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   288
        CardSecret_neq_PANSecret [THEN not_sym, iff]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   289
declare inj_CardSecret [THEN inj_eq, iff] 
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   290
        inj_PANSecret [THEN inj_eq, iff]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   291
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   292
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   293
subsection{*Possibility Properties*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   294
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   295
lemma Says_to_Gets:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   296
     "Says A B X # evs \<in> set_pur ==> Gets B X # Says A B X # evs \<in> set_pur"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   297
by (rule set_pur.Reception, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   298
14206
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   299
text{*Possibility for UNSIGNED purchases. Note that we need to ensure
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   300
that XID differs from OrderDesc and PurchAmt, since it is supposed to be
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   301
a unique number!*}
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   302
lemma possibility_Uns:
14206
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   303
    "[| CardSecret k = 0;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   304
        C = Cardholder k;  M = Merchant i;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   305
	Key KC \<notin> used []; Key KM \<notin> used []; Key KP \<notin> used []; 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   306
	KC \<in> symKeys; KM \<in> symKeys; KP \<in> symKeys; 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   307
	KC < KM; KM < KP;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   308
	Nonce Chall_C \<notin> used []; Chall_C \<notin> range CardSecret \<union> range PANSecret;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   309
        Nonce Chall_M \<notin> used []; Chall_M \<notin> range CardSecret \<union> range PANSecret;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   310
	Chall_C < Chall_M; 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   311
        Number LID_M \<notin> used []; LID_M \<notin> range CardSecret \<union> range PANSecret;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   312
        Number XID \<notin> used []; XID \<notin> range CardSecret \<union> range PANSecret;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   313
        LID_M < XID; XID < OrderDesc; OrderDesc < PurchAmt |] 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   314
   ==> \<exists>evs \<in> set_pur.
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   315
          Says M C
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   316
               (sign (priSK M)
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   317
                    {|Number LID_M, Number XID, Nonce Chall_C, 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   318
                      Hash (Number PurchAmt)|})
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   319
                  \<in> set evs" 
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   320
apply (intro exI bexI)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   321
apply (rule_tac [2]
14206
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   322
	set_pur.Nil
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   323
         [THEN set_pur.Start [of _ LID_M C k M i _ _ _ OrderDesc PurchAmt], 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   324
	  THEN set_pur.PInitReq [of concl: C M LID_M Chall_C],
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   325
          THEN Says_to_Gets, 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   326
	  THEN set_pur.PInitRes [of concl: M C LID_M XID Chall_C Chall_M], 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   327
          THEN Says_to_Gets,
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   328
	  THEN set_pur.PReqUns [of concl: C M KC],
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   329
          THEN Says_to_Gets, 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   330
	  THEN set_pur.AuthReq [of concl: M "PG j" KM LID_M XID], 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   331
          THEN Says_to_Gets, 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   332
	  THEN set_pur.AuthResUns [of concl: "PG j" M KP LID_M XID],
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   333
          THEN Says_to_Gets, 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   334
	  THEN set_pur.PRes]) 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   335
apply (tactic "basic_possibility_tac")
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   336
apply (simp_all add: used_Cons symKeys_neq_imp_neq) 
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   337
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   338
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   339
lemma possibility_S:
14206
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   340
    "[| CardSecret k \<noteq> 0;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   341
        C = Cardholder k;  M = Merchant i;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   342
	Key KC \<notin> used []; Key KM \<notin> used []; Key KP \<notin> used []; 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   343
	KC \<in> symKeys; KM \<in> symKeys; KP \<in> symKeys; 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   344
	KC < KM; KM < KP;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   345
	Nonce Chall_C \<notin> used []; Chall_C \<notin> range CardSecret \<union> range PANSecret;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   346
        Nonce Chall_M \<notin> used []; Chall_M \<notin> range CardSecret \<union> range PANSecret;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   347
	Chall_C < Chall_M; 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   348
        Number LID_M \<notin> used []; LID_M \<notin> range CardSecret \<union> range PANSecret;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   349
        Number XID \<notin> used []; XID \<notin> range CardSecret \<union> range PANSecret;
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   350
        LID_M < XID; XID < OrderDesc; OrderDesc < PurchAmt |] 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   351
   ==>  \<exists>evs \<in> set_pur.
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   352
            Says M C
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   353
                 (sign (priSK M) {|Number LID_M, Number XID, Nonce Chall_C, 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   354
                                   Hash (Number PurchAmt)|})
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   355
               \<in> set evs"
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   356
apply (intro exI bexI)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   357
apply (rule_tac [2]
14206
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   358
	set_pur.Nil
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   359
         [THEN set_pur.Start [of _ LID_M C k M i _ _ _ OrderDesc PurchAmt], 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   360
	  THEN set_pur.PInitReq [of concl: C M LID_M Chall_C],
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   361
          THEN Says_to_Gets, 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   362
	  THEN set_pur.PInitRes [of concl: M C LID_M XID Chall_C Chall_M], 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   363
          THEN Says_to_Gets,
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   364
	  THEN set_pur.PReqS [of concl: C M _ _ KC],
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   365
          THEN Says_to_Gets, 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   366
	  THEN set_pur.AuthReq [of concl: M "PG j" KM LID_M XID], 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   367
          THEN Says_to_Gets, 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   368
	  THEN set_pur.AuthResS [of concl: "PG j" M KP LID_M XID],
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   369
          THEN Says_to_Gets, 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   370
	  THEN set_pur.PRes]) 
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   371
apply (tactic "basic_possibility_tac")
77bf175f5145 Tidying of SET's "possibility theorems" (removal of Key_supply_ax)
paulson
parents: 14199
diff changeset
   372
apply (auto simp add: used_Cons symKeys_neq_imp_neq) 
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   373
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   374
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   375
(*General facts about message reception*)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   376
lemma Gets_imp_Says:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   377
     "[| Gets B X \<in> set evs; evs \<in> set_pur |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   378
   ==> \<exists>A. Says A B X \<in> set evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   379
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   380
apply (erule set_pur.induct, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   381
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   382
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   383
lemma Gets_imp_knows_Spy:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   384
     "[| Gets B X \<in> set evs; evs \<in> set_pur |]  ==> X \<in> knows Spy evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   385
by (blast dest!: Gets_imp_Says Says_imp_knows_Spy)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   386
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   387
declare Gets_imp_knows_Spy [THEN parts.Inj, dest]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   388
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   389
text{*Forwarding lemmas, to aid simplification*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   390
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   391
lemma AuthReq_msg_in_parts_spies:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   392
     "[|Gets M {|P_I, OIData, HPIData|} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   393
        evs \<in> set_pur|] ==> P_I \<in> parts (knows Spy evs)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   394
by auto
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   395
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   396
lemma AuthReq_msg_in_analz_spies:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   397
     "[|Gets M {|P_I, OIData, HPIData|} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   398
        evs \<in> set_pur|] ==> P_I \<in> analz (knows Spy evs)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   399
by (blast dest: Gets_imp_knows_Spy [THEN analz.Inj])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   400
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   401
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   402
subsection{*Proofs on Asymmetric Keys*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   403
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   404
text{*Private Keys are Secret*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   405
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   406
text{*Spy never sees an agent's private keys! (unless it's bad at start)*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   407
lemma Spy_see_private_Key [simp]:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   408
     "evs \<in> set_pur
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   409
      ==> (Key(invKey (publicKey b A)) \<in> parts(knows Spy evs)) = (A \<in> bad)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   410
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   411
apply (frule_tac [9] AuthReq_msg_in_parts_spies) --{*AuthReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   412
apply auto
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   413
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   414
declare Spy_see_private_Key [THEN [2] rev_iffD1, dest!]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   415
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   416
lemma Spy_analz_private_Key [simp]:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   417
     "evs \<in> set_pur ==>
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   418
     (Key(invKey (publicKey b A)) \<in> analz(knows Spy evs)) = (A \<in> bad)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   419
by auto
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   420
declare Spy_analz_private_Key [THEN [2] rev_iffD1, dest!]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   421
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   422
text{*rewriting rule for priEK's*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   423
lemma parts_image_priEK:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   424
     "[|Key (priEK C) \<in> parts (Key`KK Un (knows Spy evs));
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   425
        evs \<in> set_pur|] ==> priEK C \<in> KK | C \<in> bad"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   426
by auto
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   427
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   428
text{*trivial proof because (priEK C) never appears even in (parts evs)*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   429
lemma analz_image_priEK:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   430
     "evs \<in> set_pur ==>
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   431
          (Key (priEK C) \<in> analz (Key`KK Un (knows Spy evs))) =
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   432
          (priEK C \<in> KK | C \<in> bad)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   433
by (blast dest!: parts_image_priEK intro: analz_mono [THEN [2] rev_subsetD])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   434
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   435
subsection{*Public Keys in Certificates are Correct*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   436
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   437
lemma Crypt_valid_pubEK [dest!]:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   438
     "[| Crypt (priSK RCA) {|Agent C, Key EKi, onlyEnc|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   439
           \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   440
         evs \<in> set_pur |] ==> EKi = pubEK C"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   441
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   442
apply (erule set_pur.induct, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   443
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   444
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   445
lemma Crypt_valid_pubSK [dest!]:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   446
     "[| Crypt (priSK RCA) {|Agent C, Key SKi, onlySig|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   447
           \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   448
         evs \<in> set_pur |] ==> SKi = pubSK C"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   449
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   450
apply (erule set_pur.induct, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   451
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   452
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   453
lemma certificate_valid_pubEK:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   454
    "[| cert C EKi onlyEnc (priSK RCA) \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   455
        evs \<in> set_pur |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   456
     ==> EKi = pubEK C"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   457
by (unfold cert_def signCert_def, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   458
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   459
lemma certificate_valid_pubSK:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   460
    "[| cert C SKi onlySig (priSK RCA) \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   461
        evs \<in> set_pur |] ==> SKi = pubSK C"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   462
by (unfold cert_def signCert_def, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   463
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   464
lemma Says_certificate_valid [simp]:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   465
     "[| Says A B (sign SK {|lid, xid, cc, cm,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   466
                           cert C EK onlyEnc (priSK RCA)|}) \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   467
         evs \<in> set_pur |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   468
      ==> EK = pubEK C"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   469
by (unfold sign_def, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   470
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   471
lemma Gets_certificate_valid [simp]:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   472
     "[| Gets A (sign SK {|lid, xid, cc, cm,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   473
                           cert C EK onlyEnc (priSK RCA)|}) \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   474
         evs \<in> set_pur |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   475
      ==> EK = pubEK C"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   476
by (frule Gets_imp_Says, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   477
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   478
ML
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   479
{*
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   480
val Gets_certificate_valid = thm "Gets_certificate_valid";
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   481
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   482
fun valid_certificate_tac i =
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   483
    EVERY [ftac Gets_certificate_valid i,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   484
           assume_tac i, REPEAT (hyp_subst_tac i)];
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   485
*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   486
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   487
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   488
subsection{*Proofs on Symmetric Keys*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   489
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   490
text{*Nobody can have used non-existent keys!*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   491
lemma new_keys_not_used [rule_format,simp]:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   492
     "evs \<in> set_pur
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   493
      ==> Key K \<notin> used evs --> K \<in> symKeys -->
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   494
          K \<notin> keysFor (parts (knows Spy evs))"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   495
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   496
apply (tactic{*valid_certificate_tac 8*}) --{*PReqS*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   497
apply (tactic{*valid_certificate_tac 7*}) --{*PReqUns*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   498
apply auto
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   499
apply (force dest!: usedI keysFor_parts_insert) --{*Fake*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   500
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   501
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   502
lemma new_keys_not_analzd:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   503
     "[|Key K \<notin> used evs; K \<in> symKeys; evs \<in> set_pur |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   504
      ==> K \<notin> keysFor (analz (knows Spy evs))"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   505
by (blast intro: keysFor_mono [THEN [2] rev_subsetD] dest: new_keys_not_used)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   506
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   507
lemma Crypt_parts_imp_used:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   508
     "[|Crypt K X \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   509
        K \<in> symKeys; evs \<in> set_pur |] ==> Key K \<in> used evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   510
apply (rule ccontr)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   511
apply (force dest: new_keys_not_used Crypt_imp_invKey_keysFor)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   512
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   513
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   514
lemma Crypt_analz_imp_used:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   515
     "[|Crypt K X \<in> analz (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   516
        K \<in> symKeys; evs \<in> set_pur |] ==> Key K \<in> used evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   517
by (blast intro: Crypt_parts_imp_used)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   518
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   519
text{*New versions: as above, but generalized to have the KK argument*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   520
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   521
lemma gen_new_keys_not_used:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   522
     "[|Key K \<notin> used evs; K \<in> symKeys; evs \<in> set_pur |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   523
      ==> Key K \<notin> used evs --> K \<in> symKeys -->
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   524
          K \<notin> keysFor (parts (Key`KK Un knows Spy evs))"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   525
by auto
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   526
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   527
lemma gen_new_keys_not_analzd:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   528
     "[|Key K \<notin> used evs; K \<in> symKeys; evs \<in> set_pur |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   529
      ==> K \<notin> keysFor (analz (Key`KK Un knows Spy evs))"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   530
by (blast intro: keysFor_mono [THEN subsetD] dest: gen_new_keys_not_used)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   531
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   532
lemma analz_Key_image_insert_eq:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   533
     "[|Key K \<notin> used evs; K \<in> symKeys; evs \<in> set_pur |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   534
      ==> analz (Key ` (insert K KK) \<union> knows Spy evs) =
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   535
          insert (Key K) (analz (Key ` KK \<union> knows Spy evs))"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   536
by (simp add: gen_new_keys_not_analzd)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   537
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   538
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   539
subsection{*Secrecy of Symmetric Keys*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   540
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   541
lemma Key_analz_image_Key_lemma:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   542
     "P --> (Key K \<in> analz (Key`KK Un H)) --> (K\<in>KK | Key K \<in> analz H)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   543
      ==>
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   544
      P --> (Key K \<in> analz (Key`KK Un H)) = (K\<in>KK | Key K \<in> analz H)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   545
by (blast intro: analz_mono [THEN [2] rev_subsetD])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   546
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   547
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   548
lemma symKey_compromise:
15205
ecf9a884970d some x-symbols
paulson
parents: 14256
diff changeset
   549
     "evs \<in> set_pur \<Longrightarrow>
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   550
      (\<forall>SK KK. SK \<in> symKeys \<longrightarrow>
15205
ecf9a884970d some x-symbols
paulson
parents: 14256
diff changeset
   551
        (\<forall>K \<in> KK. K \<notin> range(\<lambda>C. priEK C)) \<longrightarrow>
ecf9a884970d some x-symbols
paulson
parents: 14256
diff changeset
   552
               (Key SK \<in> analz (Key`KK \<union> (knows Spy evs))) =
ecf9a884970d some x-symbols
paulson
parents: 14256
diff changeset
   553
               (SK \<in> KK \<or> Key SK \<in> analz (knows Spy evs)))"
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   554
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   555
apply (rule_tac [!] allI)+
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   556
apply (rule_tac [!] impI [THEN Key_analz_image_Key_lemma, THEN impI])+
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   557
apply (frule_tac [9] AuthReq_msg_in_analz_spies) --{*AReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   558
apply (tactic{*valid_certificate_tac 8*}) --{*PReqS*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   559
apply (tactic{*valid_certificate_tac 7*}) --{*PReqUns*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   560
apply (simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   561
         del: image_insert image_Un imp_disjL
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   562
         add: analz_image_keys_simps disj_simps
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   563
              analz_Key_image_insert_eq notin_image_iff
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   564
              analz_insert_simps analz_image_priEK)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   565
  --{*35 seconds on a 1.8GHz machine*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   566
apply spy_analz --{*Fake*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   567
apply (blast elim!: ballE)+ --{*PReq: unsigned and signed*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   568
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   569
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   570
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   571
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   572
subsection{*Secrecy of Nonces*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   573
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   574
text{*As usual: we express the property as a logical equivalence*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   575
lemma Nonce_analz_image_Key_lemma:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   576
     "P --> (Nonce N \<in> analz (Key`KK Un H)) --> (Nonce N \<in> analz H)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   577
      ==> P --> (Nonce N \<in> analz (Key`KK Un H)) = (Nonce N \<in> analz H)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   578
by (blast intro: analz_mono [THEN [2] rev_subsetD])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   579
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   580
text{*The @{text "(no_asm)"} attribute is essential, since it retains
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   581
  the quantifier and allows the simprule's condition to itself be simplified.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   582
lemma Nonce_compromise [rule_format (no_asm)]:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   583
     "evs \<in> set_pur ==>
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   584
      (\<forall>N KK. (\<forall>K \<in> KK. K \<notin> range(\<lambda>C. priEK C))   -->
14256
paulson
parents: 14206
diff changeset
   585
              (Nonce N \<in> analz (Key`KK \<union> (knows Spy evs))) =
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   586
              (Nonce N \<in> analz (knows Spy evs)))"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   587
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   588
apply (rule_tac [!] allI)+
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   589
apply (rule_tac [!] impI [THEN Nonce_analz_image_Key_lemma])+
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   590
apply (frule_tac [9] AuthReq_msg_in_analz_spies) --{*AReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   591
apply (tactic{*valid_certificate_tac 8*}) --{*PReqS*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   592
apply (tactic{*valid_certificate_tac 7*}) --{*PReqUns*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   593
apply (simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   594
         del: image_insert image_Un imp_disjL
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   595
         add: analz_image_keys_simps disj_simps symKey_compromise
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   596
              analz_Key_image_insert_eq notin_image_iff
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   597
              analz_insert_simps analz_image_priEK)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   598
  --{*35 seconds on a 1.8GHz machine*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   599
apply spy_analz --{*Fake*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   600
apply (blast elim!: ballE) --{*PReqS*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   601
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   602
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   603
lemma PANSecret_notin_spies:
14256
paulson
parents: 14206
diff changeset
   604
     "[|Nonce (PANSecret k) \<in> analz (knows Spy evs);  evs \<in> set_pur|]
paulson
parents: 14206
diff changeset
   605
      ==> 
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   606
       (\<exists>V W X Y KC2 M. \<exists>P \<in> bad.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   607
          Says (Cardholder k) M
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   608
               {|{|W, EXcrypt KC2 (pubEK P) X {|Y, Nonce (PANSecret k)|}|},
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   609
                 V|}  \<in>  set evs)"
14256
paulson
parents: 14206
diff changeset
   610
apply (erule rev_mp)
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   611
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   612
apply (frule_tac [9] AuthReq_msg_in_analz_spies)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   613
apply (tactic{*valid_certificate_tac 8*}) --{*PReqS*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   614
apply (simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   615
         del: image_insert image_Un imp_disjL
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   616
         add: analz_image_keys_simps disj_simps
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   617
              symKey_compromise pushes sign_def Nonce_compromise
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   618
              analz_Key_image_insert_eq notin_image_iff
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   619
              analz_insert_simps analz_image_priEK)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   620
  --{*13 seconds on a 1.8GHz machine*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   621
apply spy_analz
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   622
apply (blast dest!: Gets_imp_knows_Spy [THEN analz.Inj])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   623
apply (blast dest: Says_imp_knows_Spy [THEN analz.Inj] 
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   624
                   Gets_imp_knows_Spy [THEN analz.Inj])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   625
apply (blast dest: Gets_imp_knows_Spy [THEN analz.Inj]) --{*PReqS*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   626
apply (blast dest: Says_imp_knows_Spy [THEN analz.Inj] 
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   627
                   Gets_imp_knows_Spy [THEN analz.Inj]) --{*PRes*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   628
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   629
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   630
text{*This theorem is a bit silly, in that many CardSecrets are 0!
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   631
  But then we don't care.  NOT USED*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   632
lemma CardSecret_notin_spies:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   633
     "evs \<in> set_pur ==> Nonce (CardSecret i) \<notin> parts (knows Spy evs)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   634
by (erule set_pur.induct, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   635
15214
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   636
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   637
subsection{*Confidentiality of PAN*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   638
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   639
lemma analz_image_pan_lemma:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   640
     "(Pan P \<in> analz (Key`nE Un H)) --> (Pan P \<in> analz H)  ==>
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   641
      (Pan P \<in> analz (Key`nE Un H)) =   (Pan P \<in> analz H)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   642
by (blast intro: analz_mono [THEN [2] rev_subsetD])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   643
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   644
text{*The @{text "(no_asm)"} attribute is essential, since it retains
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   645
  the quantifier and allows the simprule's condition to itself be simplified.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   646
lemma analz_image_pan [rule_format (no_asm)]:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   647
     "evs \<in> set_pur ==>
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   648
       \<forall>KK. (\<forall>K \<in> KK. K \<notin> range(\<lambda>C. priEK C)) -->
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   649
            (Pan P \<in> analz (Key`KK Un (knows Spy evs))) =
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   650
            (Pan P \<in> analz (knows Spy evs))"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   651
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   652
apply (rule_tac [!] allI impI)+
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   653
apply (rule_tac [!] analz_image_pan_lemma)+
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   654
apply (frule_tac [9] AuthReq_msg_in_analz_spies) --{*AReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   655
apply (tactic{*valid_certificate_tac 8*}) --{*PReqS*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   656
apply (tactic{*valid_certificate_tac 7*}) --{*PReqUns*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   657
apply (simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   658
         del: image_insert image_Un imp_disjL
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   659
         add: analz_image_keys_simps
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   660
              symKey_compromise pushes sign_def
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   661
              analz_Key_image_insert_eq notin_image_iff
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   662
              analz_insert_simps analz_image_priEK)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   663
  --{*32 seconds on a 1.8GHz machine*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   664
apply spy_analz --{*Fake*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   665
apply auto
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   666
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   667
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   668
lemma analz_insert_pan:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   669
     "[| evs \<in> set_pur;  K \<notin> range(\<lambda>C. priEK C) |] ==>
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   670
          (Pan P \<in> analz (insert (Key K) (knows Spy evs))) =
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   671
          (Pan P \<in> analz (knows Spy evs))"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   672
by (simp del: image_insert image_Un
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   673
         add: analz_image_keys_simps analz_image_pan)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   674
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   675
text{*Confidentiality of the PAN, unsigned case.*}
15214
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   676
theorem pan_confidentiality_unsigned:
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   677
     "[| Pan (pan C) \<in> analz(knows Spy evs);  C = Cardholder k;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   678
         CardSecret k = 0;  evs \<in> set_pur|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   679
    ==> \<exists>P M KC1 K X Y.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   680
     Says C M {|EXHcrypt KC1 (pubEK P) X (Pan (pan C)), Y|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   681
          \<in> set evs  &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   682
     P \<in> bad"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   683
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   684
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   685
apply (frule_tac [9] AuthReq_msg_in_analz_spies) --{*AReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   686
apply (tactic{*valid_certificate_tac 8*}) --{*PReqS*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   687
apply (tactic{*valid_certificate_tac 7*}) --{*PReqUns*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   688
apply (simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   689
         del: image_insert image_Un imp_disjL
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   690
         add: analz_image_keys_simps analz_insert_pan analz_image_pan
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   691
              notin_image_iff
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   692
              analz_insert_simps analz_image_priEK)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   693
  --{*15 seconds on a 1.8GHz machine*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   694
apply spy_analz --{*Fake*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   695
apply blast --{*PReqUns: unsigned*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   696
apply force --{*PReqS: signed*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   697
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   698
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   699
text{*Confidentiality of the PAN, signed case.*}
15214
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   700
theorem pan_confidentiality_signed:
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   701
 "[|Pan (pan C) \<in> analz(knows Spy evs);  C = Cardholder k;
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   702
    CardSecret k \<noteq> 0;  evs \<in> set_pur|]
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   703
  ==> \<exists>P M KC2 PIDualSign_1 PIDualSign_2 other OIDualSign.
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   704
      Says C M {|{|PIDualSign_1, 
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   705
                   EXcrypt KC2 (pubEK P) PIDualSign_2 {|Pan (pan C), other|}|}, 
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   706
       OIDualSign|} \<in> set evs  &  P \<in> bad"
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   707
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   708
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   709
apply (frule_tac [9] AuthReq_msg_in_analz_spies) --{*AReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   710
apply (tactic{*valid_certificate_tac 8*}) --{*PReqS*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   711
apply (tactic{*valid_certificate_tac 7*}) --{*PReqUns*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   712
apply (simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   713
         del: image_insert image_Un imp_disjL
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   714
         add: analz_image_keys_simps analz_insert_pan analz_image_pan
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   715
              notin_image_iff
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   716
              analz_insert_simps analz_image_priEK)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   717
  --{*17 seconds on a 1.8GHz machine*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   718
apply spy_analz --{*Fake*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   719
apply force --{*PReqUns: unsigned*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   720
apply blast --{*PReqS: signed*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   721
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   722
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   723
text{*General goal: that C, M and PG agree on those details of the transaction
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   724
     that they are allowed to know about.  PG knows about price and account
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   725
     details.  M knows about the order description and price.  C knows both.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   726
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   727
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   728
subsection{*Proofs Common to Signed and Unsigned Versions*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   729
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   730
lemma M_Notes_PG:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   731
     "[|Notes M {|Number LID_M, Agent P, Agent M, Agent C, etc|} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   732
        evs \<in> set_pur|] ==> \<exists>j. P = PG j"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   733
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   734
apply (erule set_pur.induct, simp_all)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   735
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   736
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   737
text{*If we trust M, then @{term LID_M} determines his choice of P
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   738
      (Payment Gateway)*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   739
lemma goodM_gives_correct_PG:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   740
     "[| MsgPInitRes = 
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   741
            {|Number LID_M, xid, cc, cm, cert P EKj onlyEnc (priSK RCA)|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   742
         Crypt (priSK M) (Hash MsgPInitRes) \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   743
         evs \<in> set_pur; M \<notin> bad |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   744
      ==> \<exists>j trans.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   745
            P = PG j &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   746
            Notes M {|Number LID_M, Agent P, trans|} \<in> set evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   747
apply clarify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   748
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   749
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   750
apply (frule_tac [9] AuthReq_msg_in_parts_spies) --{*AuthReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   751
apply simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   752
apply (blast intro: M_Notes_PG)+
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   753
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   754
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   755
lemma C_gets_correct_PG:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   756
     "[| Gets A (sign (priSK M) {|Number LID_M, xid, cc, cm,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   757
                              cert P EKj onlyEnc (priSK RCA)|}) \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   758
         evs \<in> set_pur;  M \<notin> bad|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   759
      ==> \<exists>j trans.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   760
            P = PG j &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   761
            Notes M {|Number LID_M, Agent P, trans|} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   762
            EKj = pubEK P"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   763
by (rule refl [THEN goodM_gives_correct_PG, THEN exE], auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   764
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   765
text{*When C receives PInitRes, he learns M's choice of P*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   766
lemma C_verifies_PInitRes:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   767
 "[| MsgPInitRes = {|Number LID_M, Number XID, Nonce Chall_C, Nonce Chall_M,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   768
	   cert P EKj onlyEnc (priSK RCA)|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   769
     Crypt (priSK M) (Hash MsgPInitRes) \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   770
     evs \<in> set_pur;  M \<notin> bad|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   771
  ==> \<exists>j trans.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   772
         Notes M {|Number LID_M, Agent P, trans|} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   773
         P = PG j &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   774
         EKj = pubEK P"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   775
apply clarify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   776
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   777
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   778
apply (frule_tac [9] AuthReq_msg_in_parts_spies) --{*AuthReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   779
apply simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   780
apply (blast intro: M_Notes_PG)+
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   781
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   782
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   783
text{*Corollary of previous one*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   784
lemma Says_C_PInitRes:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   785
     "[|Says A C (sign (priSK M)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   786
                      {|Number LID_M, Number XID,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   787
                        Nonce Chall_C, Nonce Chall_M,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   788
                        cert P EKj onlyEnc (priSK RCA)|})
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   789
           \<in> set evs;  M \<notin> bad;  evs \<in> set_pur|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   790
      ==> \<exists>j trans.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   791
           Notes M {|Number LID_M, Agent P, trans|} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   792
           P = PG j &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   793
           EKj = pubEK (PG j)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   794
apply (frule Says_certificate_valid)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   795
apply (auto simp add: sign_def)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   796
apply (blast dest: refl [THEN goodM_gives_correct_PG])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   797
apply (blast dest: refl [THEN C_verifies_PInitRes])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   798
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   799
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   800
text{*When P receives an AuthReq, he knows that the signed part originated 
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   801
      with M. PIRes also has a signed message from M....*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   802
lemma P_verifies_AuthReq:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   803
     "[| AuthReqData = {|Number LID_M, Number XID, HOIData, HOD|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   804
         Crypt (priSK M) (Hash {|AuthReqData, Hash P_I|})
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   805
           \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   806
         evs \<in> set_pur;  M \<notin> bad|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   807
      ==> \<exists>j trans KM OIData HPIData.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   808
            Notes M {|Number LID_M, Agent (PG j), trans|} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   809
            Gets M {|P_I, OIData, HPIData|} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   810
            Says M (PG j) (EncB (priSK M) KM (pubEK (PG j)) AuthReqData P_I)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   811
              \<in> set evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   812
apply clarify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   813
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   814
apply (erule set_pur.induct, simp_all)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   815
apply (frule_tac [4] M_Notes_PG, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   816
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   817
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   818
text{*When M receives AuthRes, he knows that P signed it, including
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   819
  the identifying tages and the purchase amount, which he can verify.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   820
  (Although the spec has SIGNED and UNSIGNED forms of AuthRes, they
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   821
   send the same message to M.)*}
15214
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   822
theorem M_verifies_AuthRes:
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   823
  "[| MsgAuthRes = {|Number LID_M, Number XID, Number PurchAmt|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   824
      Crypt (priSK (PG j)) (Hash MsgAuthRes) \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   825
      evs \<in> set_pur;  PG j \<notin> bad|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   826
   ==> \<exists>i KM HOIData HOD P_I.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   827
	Gets (PG j)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   828
	   (EncB (priSK (Merchant i)) KM (pubEK (PG j))
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   829
		    {|Number LID_M, Number XID, HOIData, HOD|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   830
		    P_I) \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   831
	Says (PG j) (Merchant i)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   832
	     (Crypt (pubEK (Merchant i)) (sign (priSK (PG j)) MsgAuthRes))
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   833
          \<in> set evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   834
apply clarify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   835
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   836
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   837
apply (frule_tac [9] AuthReq_msg_in_parts_spies) --{*AuthReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   838
apply simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   839
apply blast+
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   840
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   841
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   842
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   843
subsection{*Proofs for Unsigned Purchases*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   844
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   845
text{*What we can derive from the ASSUMPTION that C issued a purchase request.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   846
   In the unsigned case, we must trust "C": there's no authentication.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   847
lemma C_determines_EKj:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   848
     "[| Says C M {|EXHcrypt KC1 EKj {|PIHead, Hash OIData|} (Pan (pan C)),
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   849
                    OIData, Hash{|PIHead, Pan (pan C)|} |} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   850
         PIHead = {|Number LID_M, Trans_details|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   851
         evs \<in> set_pur;  C = Cardholder k;  M \<notin> bad|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   852
  ==> \<exists>trans j.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   853
               Notes M {|Number LID_M, Agent (PG j), trans |} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   854
               EKj = pubEK (PG j)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   855
apply clarify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   856
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   857
apply (erule set_pur.induct, simp_all)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   858
apply (tactic{*valid_certificate_tac 2*}) --{*PReqUns*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   859
apply auto
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   860
apply (blast dest: Gets_imp_Says Says_C_PInitRes)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   861
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   862
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   863
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   864
text{*Unicity of @{term LID_M} between Merchant and Cardholder notes*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   865
lemma unique_LID_M:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   866
     "[|Notes (Merchant i) {|Number LID_M, Agent P, Trans|} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   867
        Notes C {|Number LID_M, Agent M, Agent C, Number OD,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   868
             Number PA|} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   869
        evs \<in> set_pur|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   870
      ==> M = Merchant i & Trans = {|Agent M, Agent C, Number OD, Number PA|}"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   871
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   872
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   873
apply (erule set_pur.induct, simp_all)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   874
apply (force dest!: Notes_imp_parts_subset_used)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   875
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   876
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   877
text{*Unicity of @{term LID_M}, for two Merchant Notes events*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   878
lemma unique_LID_M2:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   879
     "[|Notes M {|Number LID_M, Trans|} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   880
        Notes M {|Number LID_M, Trans'|} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   881
        evs \<in> set_pur|] ==> Trans' = Trans"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   882
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   883
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   884
apply (erule set_pur.induct, simp_all)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   885
apply (force dest!: Notes_imp_parts_subset_used)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   886
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   887
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   888
text{*Lemma needed below: for the case that
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   889
  if PRes is present, then @{term LID_M} has been used.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   890
lemma signed_imp_used:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   891
     "[| Crypt (priSK M) (Hash X) \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   892
         M \<notin> bad;  evs \<in> set_pur|] ==> parts {X} \<subseteq> used evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   893
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   894
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   895
apply (frule_tac [9] AuthReq_msg_in_parts_spies) --{*AuthReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   896
apply simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   897
apply safe
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   898
apply blast+
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   899
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   900
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   901
text{*Similar, with nested Hash*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   902
lemma signed_Hash_imp_used:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   903
     "[| Crypt (priSK C) (Hash {|H, Hash X|}) \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   904
         C \<notin> bad;  evs \<in> set_pur|] ==> parts {X} \<subseteq> used evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   905
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   906
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   907
apply (frule_tac [9] AuthReq_msg_in_parts_spies) --{*AuthReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   908
apply simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   909
apply safe
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   910
apply blast+
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   911
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   912
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   913
text{*Lemma needed below: for the case that
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   914
  if PRes is present, then @{text LID_M} has been used.*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   915
lemma PRes_imp_LID_used:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   916
     "[| Crypt (priSK M) (Hash {|N, X|}) \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   917
         M \<notin> bad;  evs \<in> set_pur|] ==> N \<in> used evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   918
by (drule signed_imp_used, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   919
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   920
text{*When C receives PRes, he knows that M and P agreed to the purchase details.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   921
  He also knows that P is the same PG as before*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   922
lemma C_verifies_PRes_lemma:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   923
     "[| Crypt (priSK M) (Hash MsgPRes) \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   924
         Notes C {|Number LID_M, Trans |} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   925
         Trans = {| Agent M, Agent C, Number OrderDesc, Number PurchAmt |};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   926
         MsgPRes = {|Number LID_M, Number XID, Nonce Chall_C,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   927
                Hash (Number PurchAmt)|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   928
         evs \<in> set_pur;  M \<notin> bad|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   929
  ==> \<exists>j KP.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   930
        Notes M {|Number LID_M, Agent (PG j), Trans |}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   931
          \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   932
        Gets M (EncB (priSK (PG j)) KP (pubEK M)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   933
                {|Number LID_M, Number XID, Number PurchAmt|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   934
                authCode)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   935
          \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   936
        Says M C (sign (priSK M) MsgPRes) \<in> set evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   937
apply clarify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   938
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   939
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   940
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   941
apply (frule_tac [9] AuthReq_msg_in_parts_spies) --{*AuthReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   942
apply simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   943
apply blast
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   944
apply blast
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   945
apply (blast dest: PRes_imp_LID_used)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   946
apply (frule M_Notes_PG, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   947
apply (blast dest: unique_LID_M)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   948
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   949
15214
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   950
text{*When the Cardholder receives Purchase Response from an uncompromised
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   951
Merchant, he knows that M sent it. He also knows that M received a message signed
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   952
by a Payment Gateway chosen by M to authorize the purchase.*}
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   953
theorem C_verifies_PRes:
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   954
     "[| MsgPRes = {|Number LID_M, Number XID, Nonce Chall_C,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   955
                     Hash (Number PurchAmt)|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   956
         Gets C (sign (priSK M) MsgPRes) \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   957
         Notes C {|Number LID_M, Agent M, Agent C, Number OrderDesc,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   958
                   Number PurchAmt|} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   959
         evs \<in> set_pur;  M \<notin> bad|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   960
  ==> \<exists>P KP trans.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   961
        Notes M {|Number LID_M,Agent P, trans|} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   962
        Gets M (EncB (priSK P) KP (pubEK M)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   963
                {|Number LID_M, Number XID, Number PurchAmt|}
15214
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
   964
                authCode)  \<in>  set evs &
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   965
        Says M C (sign (priSK M) MsgPRes) \<in> set evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   966
apply (rule C_verifies_PRes_lemma [THEN exE])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   967
apply (auto simp add: sign_def)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   968
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   969
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   970
subsection{*Proofs for Signed Purchases*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   971
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   972
text{*Some Useful Lemmas: the cardholder knows what he is doing*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   973
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   974
lemma Crypt_imp_Says_Cardholder:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   975
     "[| Crypt K {|{|{|Number LID_M, others|}, Hash OIData|}, Hash PANData|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   976
           \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   977
         PANData = {|Pan (pan (Cardholder k)), Nonce (PANSecret k)|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   978
         Key K \<notin> analz (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   979
         evs \<in> set_pur|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   980
  ==> \<exists>M shash EK HPIData.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   981
       Says (Cardholder k) M {|{|shash,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   982
          Crypt K
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   983
            {|{|{|Number LID_M, others|}, Hash OIData|}, Hash PANData|},
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   984
           Crypt EK {|Key K, PANData|}|},
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   985
          OIData, HPIData|} \<in> set evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   986
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   987
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   988
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   989
apply (erule set_pur.induct, analz_mono_contra)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   990
apply (frule_tac [9] AuthReq_msg_in_parts_spies) --{*AuthReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   991
apply simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   992
apply auto
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   993
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   994
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   995
lemma Says_PReqS_imp_trans_details_C:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   996
     "[| MsgPReqS = {|{|shash,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   997
                 Crypt K
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   998
                  {|{|{|Number LID_M, PIrest|}, Hash OIData|}, hashpd|},
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
   999
            cryptek|}, data|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1000
         Says (Cardholder k) M MsgPReqS \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1001
         evs \<in> set_pur |]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1002
   ==> \<exists>trans.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1003
           Notes (Cardholder k) 
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1004
                 {|Number LID_M, Agent M, Agent (Cardholder k), trans|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1005
            \<in> set evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1006
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1007
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1008
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1009
apply (simp_all (no_asm_simp))
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1010
apply auto
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1011
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1012
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1013
text{*Can't happen: only Merchants create this type of Note*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1014
lemma Notes_Cardholder_self_False:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1015
     "[|Notes (Cardholder k)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1016
          {|Number n, Agent P, Agent (Cardholder k), Agent C, etc|} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1017
        evs \<in> set_pur|] ==> False"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1018
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1019
apply (erule set_pur.induct, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1020
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1021
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1022
text{*When M sees a dual signature, he knows that it originated with C.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1023
  Using XID he knows it was intended for him.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1024
  This guarantee isn't useful to P, who never gets OIData.*}
15214
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1025
theorem M_verifies_Signed_PReq:
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1026
 "[| MsgDualSign = {|HPIData, Hash OIData|};
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1027
     OIData = {|Number LID_M, etc|};
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1028
     Crypt (priSK C) (Hash MsgDualSign) \<in> parts (knows Spy evs);
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1029
     Notes M {|Number LID_M, Agent P, extras|} \<in> set evs;
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1030
     M = Merchant i;  C = Cardholder k;  C \<notin> bad;  evs \<in> set_pur|]
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1031
  ==> \<exists>PIData PICrypt.
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1032
	HPIData = Hash PIData &
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1033
	Says C M {|{|sign (priSK C) MsgDualSign, PICrypt|}, OIData, Hash PIData|}
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1034
	  \<in> set evs"
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1035
apply clarify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1036
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1037
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1038
apply (erule set_pur.induct)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1039
apply (frule_tac [9] AuthReq_msg_in_parts_spies) --{*AuthReq*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1040
apply simp_all
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1041
apply blast
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1042
apply (force dest!: signed_Hash_imp_used)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1043
apply (clarify) --{*speeds next step*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1044
apply (blast dest: unique_LID_M)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1045
apply (blast dest!: Notes_Cardholder_self_False)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1046
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1047
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1048
text{*When P sees a dual signature, he knows that it originated with C.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1049
  and was intended for M. This guarantee isn't useful to M, who never gets
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1050
  PIData. I don't see how to link @{term "PG j"} and @{text LID_M} without
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1051
  assuming @{term "M \<notin> bad"}.*}
15214
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1052
theorem P_verifies_Signed_PReq:
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1053
     "[| MsgDualSign = {|Hash PIData, HOIData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1054
         PIData = {|PIHead, PANData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1055
         PIHead = {|Number LID_M, Number XID, HOD, Number PurchAmt, Agent M,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1056
                    TransStain|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1057
         Crypt (priSK C) (Hash MsgDualSign) \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1058
         evs \<in> set_pur;  C \<notin> bad;  M \<notin> bad|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1059
    ==> \<exists>OIData OrderDesc K j trans.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1060
          HOD = Hash{|Number OrderDesc, Number PurchAmt|} &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1061
          HOIData = Hash OIData &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1062
          Notes M {|Number LID_M, Agent (PG j), trans|} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1063
          Says C M {|{|sign (priSK C) MsgDualSign,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1064
                     EXcrypt K (pubEK (PG j))
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1065
                                {|PIHead, Hash OIData|} PANData|},
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1066
                     OIData, Hash PIData|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1067
            \<in> set evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1068
apply clarify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1069
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1070
apply (erule set_pur.induct, simp_all)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1071
apply (auto dest!: C_gets_correct_PG)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1072
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1073
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1074
lemma C_determines_EKj_signed:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1075
     "[| Says C M {|{|sign (priSK C) text,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1076
                      EXcrypt K EKj {|PIHead, X|} Y|}, Z|} \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1077
         PIHead = {|Number LID_M, Number XID, W|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1078
         C = Cardholder k;  evs \<in> set_pur;  M \<notin> bad|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1079
  ==> \<exists> trans j.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1080
         Notes M {|Number LID_M, Agent (PG j), trans|} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1081
         EKj = pubEK (PG j)"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1082
apply clarify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1083
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1084
apply (erule set_pur.induct, simp_all, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1085
apply (blast dest: C_gets_correct_PG)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1086
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1087
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1088
lemma M_Says_AuthReq:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1089
     "[| AuthReqData = {|Number LID_M, Number XID, HOIData, HOD|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1090
         sign (priSK M) {|AuthReqData, Hash P_I|} \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1091
         evs \<in> set_pur;  M \<notin> bad|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1092
   ==> \<exists>j trans KM.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1093
           Notes M {|Number LID_M, Agent (PG j), trans |} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1094
             Says M (PG j)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1095
               (EncB (priSK M) KM (pubEK (PG j)) AuthReqData P_I)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1096
              \<in> set evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1097
apply (rule refl [THEN P_verifies_AuthReq, THEN exE])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1098
apply (auto simp add: sign_def)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1099
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1100
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1101
text{*A variant of @{text M_verifies_Signed_PReq} with explicit PI information.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1102
  Even here we cannot be certain about what C sent to M, since a bad
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1103
  PG could have replaced the two key fields.  (NOT USED)*}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1104
lemma Signed_PReq_imp_Says_Cardholder:
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1105
     "[| MsgDualSign = {|Hash PIData, Hash OIData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1106
         OIData = {|Number LID_M, Number XID, Nonce Chall_C, HOD, etc|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1107
         PIHead = {|Number LID_M, Number XID, HOD, Number PurchAmt, Agent M,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1108
                    TransStain|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1109
         PIData = {|PIHead, PANData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1110
         Crypt (priSK C) (Hash MsgDualSign) \<in> parts (knows Spy evs);
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1111
         M = Merchant i;  C = Cardholder k;  C \<notin> bad;  evs \<in> set_pur|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1112
      ==> \<exists>KC EKj.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1113
            Says C M {|{|sign (priSK C) MsgDualSign,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1114
                       EXcrypt KC EKj {|PIHead, Hash OIData|} PANData|},
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1115
                       OIData, Hash PIData|}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1116
              \<in> set evs"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1117
apply clarify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1118
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1119
apply (erule rev_mp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1120
apply (erule set_pur.induct, simp_all, auto)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1121
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1122
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1123
text{*When P receives an AuthReq and a dual signature, he knows that C and M
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1124
  agree on the essential details.  PurchAmt however is never sent by M to
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1125
  P; instead C and M both send 
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1126
     @{term "HOD = Hash{|Number OrderDesc, Number PurchAmt|}"}
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1127
  and P compares the two copies of HOD.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1128
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1129
  Agreement can't be proved for some things, including the symmetric keys
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1130
  used in the digital envelopes.  On the other hand, M knows the true identity
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1131
  of PG (namely j'), and sends AReq there; he can't, however, check that
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1132
  the EXcrypt involves the correct PG's key.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1133
*}
15214
d3ab9b76ccb7 tidying up; identifying the main theorems
paulson
parents: 15205
diff changeset
  1134
theorem P_sees_CM_agreement:
14199
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1135
     "[| AuthReqData = {|Number LID_M, Number XID, HOIData, HOD|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1136
         KC \<in> symKeys;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1137
         Gets (PG j) (EncB (priSK M) KM (pubEK (PG j)) AuthReqData P_I)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1138
           \<in> set evs;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1139
         C = Cardholder k;
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1140
         PI_sign = sign (priSK C) {|Hash PIData, HOIData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1141
         P_I = {|PI_sign,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1142
                 EXcrypt KC (pubEK (PG j)) {|PIHead, HOIData|} PANData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1143
         PANData = {|Pan (pan C), Nonce (PANSecret k)|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1144
         PIData = {|PIHead, PANData|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1145
         PIHead = {|Number LID_M, Number XID, HOD, Number PurchAmt, Agent M,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1146
                    TransStain|};
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1147
         evs \<in> set_pur;  C \<notin> bad;  M \<notin> bad|]
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1148
  ==> \<exists>OIData OrderDesc KM' trans j' KC' KC'' P_I' P_I''.
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1149
           HOD = Hash{|Number OrderDesc, Number PurchAmt|} &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1150
           HOIData = Hash OIData &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1151
           Notes M {|Number LID_M, Agent (PG j'), trans|} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1152
           Says C M {|P_I', OIData, Hash PIData|} \<in> set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1153
           Says M (PG j') (EncB (priSK M) KM' (pubEK (PG j'))
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1154
                           AuthReqData P_I'')  \<in>  set evs &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1155
           P_I' = {|PI_sign,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1156
             EXcrypt KC' (pubEK (PG j')) {|PIHead, Hash OIData|} PANData|} &
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1157
           P_I'' = {|PI_sign,
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1158
             EXcrypt KC'' (pubEK (PG j)) {|PIHead, Hash OIData|} PANData|}"
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1159
apply clarify
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1160
apply (rule exE)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1161
apply (rule P_verifies_Signed_PReq [OF refl refl refl])
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1162
apply (simp (no_asm_use) add: sign_def EncB_def, blast)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1163
apply (assumption+, clarify, simp)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1164
apply (drule Gets_imp_knows_Spy [THEN parts.Inj], assumption)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1165
apply (blast elim: EncB_partsE dest: refl [THEN M_Says_AuthReq] unique_LID_M2)
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1166
done
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1167
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1168
end
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1169
d3b8d972a488 new session HOL-SET-Protocol
paulson
parents:
diff changeset
  1170