src/HOL/Auth/Shared.thy
author paulson
Mon Sep 09 17:44:20 1996 +0200 (1996-09-09)
changeset 1965 789c12ea0b30
parent 1943 20574dca5a3e
child 1967 0ff58b41c037
permissions -rw-r--r--
Stronger proofs; work for Otway-Rees
paulson@1934
     1
(*  Title:      HOL/Auth/Shared
paulson@1934
     2
    ID:         $Id$
paulson@1934
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
paulson@1934
     4
    Copyright   1996  University of Cambridge
paulson@1934
     5
paulson@1934
     6
Theory of Shared Keys (common to all symmetric-key protocols)
paulson@1934
     7
paulson@1934
     8
Server keys; initial states of agents; new nonces and keys; function "sees" 
paulson@1943
     9
paulson@1943
    10
IS THE Notes constructor needed??
paulson@1934
    11
*)
paulson@1934
    12
paulson@1934
    13
Shared = Message + List + 
paulson@1934
    14
paulson@1934
    15
consts
paulson@1943
    16
  shrK    :: agent => key  (*symmetric keys*)
paulson@1965
    17
  leaked  :: nat set       (*Friendly agents whose keys have leaked to Enemy*)
paulson@1934
    18
paulson@1934
    19
rules
paulson@1943
    20
  isSym_shrK "isSymKey (shrK A)"
paulson@1934
    21
paulson@1934
    22
consts  (*Initial states of agents -- parameter of the construction*)
paulson@1934
    23
  initState :: agent => msg set
paulson@1934
    24
paulson@1934
    25
primrec initState agent
paulson@1934
    26
        (*Server knows all keys; other agents know only their own*)
paulson@1943
    27
  initState_Server  "initState Server     = Key `` range shrK"
paulson@1943
    28
  initState_Friend  "initState (Friend i) = {Key (shrK (Friend i))}"
paulson@1965
    29
  initState_Enemy
paulson@1965
    30
    "initState Enemy = insert (Key (shrK Enemy)) (Key``shrK``Friend``leaked)"
paulson@1934
    31
paulson@1934
    32
datatype  (*Messages, and components of agent stores*)
paulson@1934
    33
  event = Says agent agent msg
paulson@1934
    34
        | Notes agent msg
paulson@1934
    35
paulson@1934
    36
consts  
paulson@1934
    37
  sees1 :: [agent, event] => msg set
paulson@1934
    38
paulson@1934
    39
primrec sees1 event
paulson@1934
    40
           (*First agent recalls all that it says, but NOT everything
paulson@1934
    41
             that is sent to it; it must note such things if/when received*)
paulson@1934
    42
  sees1_Says  "sees1 A (Says A' B X)  = (if A:{A',Enemy} then {X} else {})"
paulson@1934
    43
          (*part of A's internal state*)
paulson@1934
    44
  sees1_Notes "sees1 A (Notes A' X)   = (if A=A' then {X} else {})"
paulson@1934
    45
paulson@1934
    46
consts  
paulson@1934
    47
  sees :: [agent, event list] => msg set
paulson@1934
    48
paulson@1934
    49
primrec sees list
paulson@1934
    50
        (*Initial knowledge includes all public keys and own private key*)
paulson@1934
    51
  sees_Nil  "sees A []       = initState A"
paulson@1934
    52
  sees_Cons "sees A (ev#evs) = sees1 A ev Un sees A evs"
paulson@1934
    53
paulson@1934
    54
paulson@1934
    55
(*Agents generate "random" nonces.  Different traces always yield
paulson@1934
    56
  different nonces.  Same applies for keys.*)
paulson@1934
    57
consts
paulson@1934
    58
  newN :: "event list => nat"
paulson@1934
    59
  newK :: "event list => key"
paulson@1934
    60
paulson@1934
    61
rules
paulson@1943
    62
  inj_shrK "inj shrK"
paulson@1934
    63
paulson@1934
    64
  inj_newN   "inj newN"
paulson@1934
    65
  fresh_newN "Nonce (newN evs) ~: parts (initState B)" 
paulson@1934
    66
paulson@1934
    67
  inj_newK   "inj newK"
paulson@1934
    68
  fresh_newK "Key (newK evs) ~: parts (initState B)" 
paulson@1934
    69
  isSym_newK "isSymKey (newK evs)"
paulson@1934
    70
paulson@1934
    71
end