
diff -r 8b24773de6db -r 58573e7041b4 src/HOL/Auth/NS_Shared.thy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/Auth/NS_Shared.thy	Wed Aug 21 13:25:27 1996 +0200
@@ -0,0 +1,67 @@
+(*  Title:      HOL/Auth/NS_Shared
+    ID:         $Id$
+    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
+    Copyright   1996  University of Cambridge
+
+Inductive relation "ns_shared" for Needham-Schroeder Shared-Key protocol.
+
+From page 247 of
+  Burrows, Abadi and Needham.  A Logic of Authentication.
+  Proc. Royal Soc. 426 (1989)
+*)
+
+NS_Shared = Shared + 
+
+consts  ns_shared   :: "event list set"
+inductive ns_shared
+  intrs 
+         (*Initial trace is empty*)
+    Nil  "[]: ns_shared"
+
+         (*The enemy MAY say anything he CAN say.  We do not expect him to
+           invent new nonces here, but he can also use NS1.  Common to
+           all similar protocols.*)
+    Fake "[| evs: ns_shared;  B ~= Enemy;  X: synth (analz (sees Enemy evs))
+          |] ==> (Says Enemy B X) # evs : ns_shared"
+
+         (*Alice initiates a protocol run*)
+    NS1  "[| evs: ns_shared;  A ~= Server
+          |] ==> (Says A Server {|Agent A, Agent B, Nonce (newN evs)|}) 
+                 # evs : ns_shared"
+
+         (*Server's response to Alice's message.
+           !! It may respond more than once to A's request !!
+	   Server doesn't know who the true sender is, hence the A' in
+               the sender field.*)
+    NS2  "[| evs: ns_shared;  A ~= B;  A ~= Server;
+             (Says A' Server {|Agent A, Agent B, Nonce NA|}) : set_of_list evs
+          |] ==> (Says Server A 
+                  (Crypt {|Nonce NA, Agent B, Key (newK evs),   
+                           (Crypt {|Key (newK evs), Agent A|} (serverKey B))|}
+                   (serverKey A))) # evs : ns_shared"
+
+          (*We can't assume S=Server.  Agent A "remembers" her nonce.
+            May assume WLOG that she is NOT the Enemy: the Fake rule
+            covers this case.  Can inductively show A ~= Server*)
+    NS3  "[| evs: ns_shared;  A ~= B;
+             (Says S A (Crypt {|Nonce NA, Agent B, Key K, X|} (serverKey A))) 
+               : set_of_list evs;
+             A = Friend i;
+             (Says A Server {|Agent A, Agent B, Nonce NA|}) : set_of_list evs
+          |] ==> (Says A B X) # evs : ns_shared"
+
+         (*Bob's nonce exchange.  He does not know who the message came
+           from, but responds to A because she is mentioned inside.*)
+    NS4  "[| evs: ns_shared;  A ~= B;  
+             (Says A' B (Crypt {|Key K, Agent A|} (serverKey B))) 
+               : set_of_list evs
+          |] ==> (Says B A (Crypt (Nonce (newN evs)) K)) # evs : ns_shared"
+
+         (*Alice responds with (Suc N), if she has seen the key before.*)
+    NS5  "[| evs: ns_shared;  A ~= B;  
+             (Says B' A (Crypt (Nonce N) K)) : set_of_list evs;
+             (Says S  A (Crypt {|Nonce NA, Agent B, Key K, X|} (serverKey A))) 
+               : set_of_list evs
+          |] ==> (Says A B (Crypt (Nonce (Suc N)) K)) # evs : ns_shared"
+
+end




