OS_type_def.thy
changeset 1 7d9c0ed02b56
equal deleted inserted replaced
0:34d01e9a772e 1:7d9c0ed02b56
       
     1 theory OS_type_def
       
     2 imports Main Flask_type
       
     3 begin
       
     4 
       
     5 (****************************** os files ***************************)
       
     6 
       
     7 datatype t_open_must_flag =
       
     8   OF_RDONLY
       
     9 | OF_WRONLY
       
    10 | OF_RDWR
       
    11 
       
    12 datatype t_open_option_flag = 
       
    13   OF_APPEND
       
    14 | OF_CREAT
       
    15 (*
       
    16 | OF_TRUNC
       
    17 *)
       
    18 | OF_EXCL
       
    19 (*
       
    20 | OF_DIRECTORY
       
    21 
       
    22 | OF_OTHER
       
    23 *)
       
    24 
       
    25 type_synonym t_open_flags = "t_open_must_flag \<times> t_open_option_flag set"
       
    26 
       
    27 definition is_read_flag :: "t_open_flags \<Rightarrow> bool"
       
    28 where
       
    29   "is_read_flag flag \<equiv> let (mflag, oflag) = flag in (mflag = OF_RDONLY \<or> mflag = OF_RDWR)"
       
    30 
       
    31 definition is_write_flag :: "t_open_flags \<Rightarrow> bool"
       
    32 where
       
    33   "is_write_flag flag \<equiv> let (mflag, oflag) = flag in (mflag = OF_WRONLY \<or> mflag = OF_RDWR)"
       
    34 
       
    35 definition is_excl_flag :: "t_open_flags \<Rightarrow> bool"
       
    36 where
       
    37   "is_excl_flag flag \<equiv> let (mflag, oflag) = flag in (OF_EXCL \<in> oflag)"
       
    38 
       
    39 definition is_creat_flag :: "t_open_flags \<Rightarrow> bool"
       
    40 where
       
    41   "is_creat_flag flag \<equiv> let (mflag, oflag) = flag in (OF_CREAT \<in> oflag)"
       
    42 
       
    43 definition is_creat_excl_flag :: "t_open_flags \<Rightarrow> bool"
       
    44 where
       
    45   "is_creat_excl_flag flag \<equiv> let (mflag, oflag) = flag in (OF_CREAT \<in> oflag \<and> OF_EXCL \<in> oflag)"
       
    46 (*
       
    47 definition is_trunc_flag :: "t_open_flags \<Rightarrow> bool"
       
    48 where
       
    49   "is_trunc_flag flag \<equiv> let (mflag, oflag) = flag in (OF_TRUNC \<in> oflag \<and> is_write_flag flag)"
       
    50 
       
    51 definition is_cloexec_flag :: "t_open_flags \<Rightarrow> bool"
       
    52 where
       
    53   "is_cloexec_flag flag \<equiv> let (mflag, oflag) = flag in (OF_CLOEXEC \<in> oflag)"
       
    54 *)
       
    55 definition is_append_flag :: "t_open_flags \<Rightarrow> bool"
       
    56 where
       
    57   "is_append_flag flag \<equiv> let (mflag, oflag) = flag in (OF_APPEND \<in> oflag)"
       
    58 
       
    59 (*
       
    60 definition is_dir_flag :: "t_open_flags \<Rightarrow> bool"
       
    61 where
       
    62   "is_dir_flag flag \<equiv> let (mflag, oflag) = flag in (OF_DIRECTORY \<in> oflag)"
       
    63 *)
       
    64 
       
    65 
       
    66 type_synonym t_fname = string
       
    67 
       
    68 (* listing of file path:
       
    69  *   a#b#c:: b is a's parent and c is b's parent; 
       
    70  *   [] represents the root file 
       
    71  *)
       
    72 type_synonym t_file = "t_fname list" 
       
    73 
       
    74 type_synonym t_fd = "nat" (* given a fd, must has funs to tell its corresponding: "t_file \<times> t_open_flags \<times> t_inode" *) 
       
    75 
       
    76 
       
    77 (* need not consideration, for rdonly transfer virus too 
       
    78 datatype t_sharememo_flag = 
       
    79   SHM_RDONLY
       
    80 | SHM_OTHER
       
    81 
       
    82 type_synonym t_sharememo_flags = "t_sharememo_flag set"
       
    83 *)
       
    84 
       
    85 
       
    86 
       
    87 (****************************** os sockets ***************************)
       
    88 
       
    89 datatype t_shutdown_how =
       
    90   SHUT_RD
       
    91 | SHUT_WR
       
    92 | SHUT_RDWR
       
    93 
       
    94 datatype t_zero_one = 
       
    95   Z
       
    96 | O
       
    97 
       
    98 type_synonym t_inet_addr = "t_zero_one list"
       
    99 
       
   100 type_synonym t_socket_port = nat 
       
   101 
       
   102 type_synonym t_netif = string
       
   103 
       
   104 (*
       
   105 datatype t_socket_af = 
       
   106   AF_UNIX "t_file \<times> t_file"
       
   107 | AF_INET "t_inet_addr \<times> t_socket_port \<times> t_inet_addr \<times> t_socket_port \<times> t_netdev"
       
   108 *)
       
   109 
       
   110 datatype t_socket_af =
       
   111 (*  AF_UNIX  
       
   112 | *)AF_INET
       
   113 
       
   114 datatype t_socket_type =
       
   115   STREAM
       
   116 | DGRAM
       
   117 
       
   118 datatype t_sock_addr = 
       
   119   INET_ADDR t_inet_addr t_socket_port(*
       
   120 | UNIX_ADDR t_file*)
       
   121 
       
   122 type_synonym t_node = t_inet_addr (* a endpoint in the netword *)
       
   123 
       
   124 datatype t_sock_trans_state = 
       
   125   Trans_Recv
       
   126 | Trans_Send
       
   127 | Trans_RS
       
   128 | Trans_No
       
   129 
       
   130 datatype t_sock_state =
       
   131   SS_create
       
   132 | SS_bind
       
   133 | SS_connect
       
   134 | SS_listen
       
   135 | SS_accepted
       
   136 | SS_trans   "t_sock_trans_state" 
       
   137 
       
   138 
       
   139 (****************************** os other IPCs ***************************)
       
   140 
       
   141 datatype t_shm_attach_flag = 
       
   142   SHM_RDONLY
       
   143 | SHM_RDWR
       
   144 
       
   145 type_synonym t_shm = nat
       
   146 
       
   147 
       
   148 (* message queue is indexed by a nat, in OS
       
   149  * but logically it is a list, created as [], updated as a queue
       
   150  * so, it type should not be nat, but a t_msg list
       
   151  *)
       
   152 type_synonym t_msgq = nat
       
   153 
       
   154 (* a message of ID nat, but it has meaning under "in what message queue" *)
       
   155 type_synonym t_msg  = "nat"
       
   156 
       
   157 (****************************** os inodes ***************************)
       
   158 
       
   159 type_synonym t_inode_num = nat
       
   160 
       
   161 (*
       
   162 datatype t_sock_af = 
       
   163   Tag_AF_UNIX "(t_file option \<times> t_file option)"  "t_socket_type"
       
   164 | Tag_AF_INET "(t_inet_addr \<times> t_socket_port) option \<times> (t_inet_addr \<times> t_socket_port) option \<times> t_netdev option" "t_socket_type" 
       
   165 *)
       
   166 
       
   167 datatype t_inode_tag = 
       
   168   Tag_FILE                    (* this inode is a file, and its file is: "t_file" :: no need to do that and another reason is link may add two or more files to the inode, so it should be a list, can the maintainment of this list is tough *)
       
   169 | Tag_DIR  (* do not contain chs anymore, for more infomation see svn log 
       
   170   "t_inode_num list"   *)   (* Tag_DIR inode number list: the inode number list of subchild files (direct son the file) , means: new created child file should add to this field. *)
       
   171 | Tag_TCP_SOCK   (* information below is turn to seperative listener functions 
       
   172 "(t_inet_addr \<times> t_socket_port) option \<times> (t_inet_addr \<times> t_socket_port) option \<times> t_netdev option" "t_socket_type"  *)
       
   173 | Tag_UDP_SOCK
       
   174 
       
   175 (* type_synonym t_inode = "nat \<times> t_inode_tag" (* inode (id, tag) contains file internal id and directory tag attributes *)
       
   176   // not needed any more: for inode num and its tag now are seperated by two funcs.
       
   177 *)
       
   178 
       
   179 
       
   180 type_synonym t_process = nat
       
   181 
       
   182 type_synonym t_trunc_len = nat
       
   183 
       
   184 type_synonym t_socket = "t_process \<times> t_fd"
       
   185 
       
   186 (* each constructor is defined according to each security-class *)
       
   187 datatype t_object = 
       
   188   O_proc "t_process"
       
   189 
       
   190 | O_file "t_file"
       
   191 | O_fd   "t_process" "t_fd"
       
   192 | O_dir  "t_file" 
       
   193 
       
   194 | O_node     "t_node"
       
   195 | O_tcp_sock "t_socket"
       
   196 | O_udp_sock "t_socket"
       
   197 
       
   198 | O_shm  "t_shm"
       
   199 | O_msgq "t_msgq"
       
   200 | O_msg  "t_msgq"   "t_msg"
       
   201 
       
   202 (*
       
   203 datatype t_tainted_obj = 
       
   204   TO_proc "t_process"
       
   205 | TO_file "t_file"
       
   206 | TO_msg  "t_msgq"   "t_msg"
       
   207 *)
       
   208 
       
   209 
       
   210 (* not needed anymore 
       
   211 datatype t_clone_share_flag = 
       
   212 | CF_share_ipc
       
   213 | CF_share_fd
       
   214 | CF_share_both
       
   215 | CF_no_share  *)
       
   216 
       
   217 (* unformalised system calls:
       
   218  * 1. process management
       
   219  * 1.1 wait: nothing to do with tainting relation
       
   220  * 1.2 getpriority/setpriority/getsched/setsched: nothing to do with security
       
   221  * 1.3 getcap/setcap: "at this time that will not be done"
       
   222  * 1.4 getpgid/setpgid: ...
       
   223  *)
       
   224 datatype t_event = 
       
   225   (* process management *)
       
   226 (* trace can be done trough tags of cloning and execving, but I ignore this. *)
       
   227   Execve     "t_process" "t_file"     "t_fd set"
       
   228 (* | Uselib     "t_process" "t_file"  *)
       
   229 | Clone      "t_process" "t_process"  "t_fd set" "t_shm set" (* "t_clone_share_flag" is not needed, as event should record the fds and shms that passed to childprocess *)
       
   230 | Kill       "t_process" "t_process"
       
   231 | Ptrace     "t_process" "t_process"
       
   232 | Exit       "t_process"
       
   233 
       
   234 | Open          "t_process" "t_file" "t_open_flags" "t_fd" "nat option"  (* the last nat option : if create file, the is Some inode_num else None *)
       
   235 | ReadFile      "t_process" "t_fd"                          
       
   236 | WriteFile     "t_process" "t_fd"                          
       
   237 (* | Sendfile      "t_process" "t_fd"   "t_fd"
       
   238  can be modeled as readfile then writefile *)
       
   239 | CloseFd       "t_process" "t_fd"     
       
   240 | UnLink        "t_process" "t_file"                        
       
   241 | Rmdir         "t_process" "t_file"                        
       
   242 | Mkdir         "t_process" "t_file" "nat"                             (* last nat: inode_num *)
       
   243 | LinkHard      "t_process" "t_file" "t_file"               
       
   244 | Truncate      "t_process" "t_file" "t_trunc_len"          
       
   245 (* | FTruncate     "t_process" "t_fd"   "t_trunc_len"          *)
       
   246 (*
       
   247 | Rename        "t_process" "t_file" "t_file"               
       
   248 *)
       
   249 
       
   250 (* the message is in the msgq, so we must build a cache(list)
       
   251  * to store the unreceived msg yet. And the os_grant should
       
   252  * check if a message queue is empty before RecvMsg. 
       
   253  *)
       
   254 | CreateMsgq    "t_process" "t_msgq"                         
       
   255 | SendMsg       "t_process" "t_msgq" "t_msg"                         
       
   256 | RecvMsg       "t_process" "t_msgq" "t_msg"                         
       
   257 | RemoveMsgq    "t_process" "t_msgq"                         
       
   258 
       
   259 | CreateShM     "t_process" "t_shm"                         
       
   260 | Attach        "t_process" "t_shm" "t_shm_attach_flag"                        
       
   261 | Detach        "t_process" "t_shm"                         
       
   262 | DeleteShM     "t_process" "t_shm"                         
       
   263 
       
   264 | CreateSock    "t_process" "t_socket_af" "t_socket_type" "t_fd" "nat"  (* last nat: inode_num *)
       
   265 | Bind          "t_process" "t_fd"        "t_sock_addr"                    
       
   266 | Connect       "t_process" "t_fd"        "t_sock_addr"                     
       
   267 | Listen        "t_process" "t_fd"                                    
       
   268 | Accept        "t_process" "t_fd"        "t_sock_addr"   "nat"  "t_fd" "nat"  (* addr: remote socket address; nat: port num;  last nat: inode_num *)
       
   269 | SendSock      "t_process" "t_fd"                          
       
   270 | RecvSock      "t_process" "t_fd"                          
       
   271 | Shutdown      "t_process" "t_fd"        "t_shutdown_how"         
       
   272      
       
   273 (* the state of the system is decided by the initial state and the event trace*)
       
   274 type_synonym t_state = "t_event list"
       
   275 
       
   276 end