Auxiliary Lemmas

Require ModelProperties.


User defined tactics


Tactic Definition OpDontChangeStPSS :=
   Intros s t Sub SS TF;
   Inversion TF;
   Rewrite <- H3;
   Auto.

Tactic Definition OpDontChangeStPSP :=
   Intros s t Sub SP TF;
   Inversion TF;
   Rewrite <- H3;
   Auto.

Tactic Definition StartPCP :=
   Intros;
   Unfold PreservesControlProp;
   Intros Sub TF;
   Inversion TF;
   Unfold ControlProperty;
   Right;
   Left;
   Split with o;
   Intro MAC;
   Inversion MAC.

Tactic Definition StartPSS :=
  Intros s t Sub SS TF;
  Inversion TF.

Tactic Definition BreakSS :=
  Unfold SecureState in SS;
  Elim SS;
  Intros DAC MAC.

Tactic Definition StartPSP :=
  Intros s t Sub SP TF;
  Inversion TF.


Tactic Definition ProvePCP :=
  Intros;
  Unfold PreservesControlProp;
  Intros Sub TF; Inversion TF;
  Inversion H;
  Unfold ControlProperty;
  EAuto.


Lemmas

Lemma ReadWriteImpRead:
 (s:SFSstate)(DACSecureState s)
 ->(u:SUBJECT; o:OBJECT)
       Cases (fsecmat (secmat s) o) of
        |(Some y) => ((set_In u (ActReaders y))->(PreDACRead s u o))
        | None => True
       end.
Unfold DACSecureState.
Intros.
Cut Cases (fsecmat (secmat s) o) of
      (Some y) =>
       ((set_In u (ActReaders y))->(PreDACRead s u o))
       /\((set_In u (ActWriters y))->(PreDACWrite s u o))
    | None => True
    end.
Elim (fsecmat (secmat s) o).
Intros.
Elim H0; Intros.
Auto.

Auto.

Apply H.

Qed.




Lemma ReadWriteImpWrite:
 (s:SFSstate)(DACSecureState s)
 ->(u:SUBJECT; o:OBJECT)
       Cases (fsecmat (secmat s) o) of
        |(Some y) => ((set_In u (ActWriters y))->(PreDACWrite s u o))
        | None => True
       end.
Unfold DACSecureState.
Intros.
Cut Cases (fsecmat (secmat s) o) of
      (Some y) =>
       ((set_In u (ActReaders y))->(PreDACRead s u o))
       /\((set_In u (ActWriters y))->(PreDACWrite s u o))
    | None => True
    end.
Elim (fsecmat (secmat s) o).
Intros.
Elim H0; Intros.
Auto.

Auto.

Apply H.

Qed.




Lemma TwoImpLeft:
(s:SFSstate; u:SUBJECT)
 ((rw:ReadersWriters)
  (set_In rw (ransecmat (secmat s)))
  ->~(set_In u (ActReaders rw))/\~(set_In u (ActWriters rw)))
 ->((rw:ReadersWriters)
    (set_In rw (ransecmat (secmat s)))
    ->~(set_In u (ActReaders rw))).
Intros.
Cut ~(set_In u (ActReaders rw))/\~(set_In u (ActWriters rw)).
Tauto.

Auto.

Qed.




Lemma TwoImpRight:
(s:SFSstate; u:SUBJECT)
 ((rw:ReadersWriters)
  (set_In rw (ransecmat (secmat s)))
  ->~(set_In u (ActReaders rw))/\~(set_In u (ActWriters rw)))
 ->((rw:ReadersWriters)
    (set_In rw (ransecmat (secmat s)))
    ->~(set_In u (ActWriters rw))).
Intros.
Cut ~(set_In u (ActReaders rw))/\~(set_In u (ActWriters rw)).
Tauto.

Auto.

Qed.




Lemma UniqNames:
(s:SFSstate; o:OBJECT)
 (FuncPre1 s)
 ->~(set_In ((ObjName o),File) (domf (files s)))
 ->~(set_In ((ObjName o),Directory) (domd (directories s)))
 ->~(set_In o (DOM OBJeq_dec (acl s))).
Intro; Intro; Unfold FuncPre1; Elim o; Simpl; Intros.
Cut ((o:OBJECT)
      (set_In o (DOM OBJeq_dec (directories s)))->(ObjType o)=Directory)
    /\((o:OBJECT)(set_In o (DOM OBJeq_dec (files s)))->(ObjType o)=File)
      /\(DOM OBJeq_dec (acl s))
         =(set_union OBJeq_dec (DOM OBJeq_dec (files s))
            (DOM OBJeq_dec (directories s))).
Intro CUT; Elim CUT; Intros.
Elim H3; Intros.
Rewrite H5; Intro.
Cut (set_In (a,File) (domf (files s)))
    \/(set_In (a,Directory) (domd (directories s))).
Intro H7; Elim H7; Intro.
Auto.

Auto.

Generalize H6; Elim b; Intro.
Left; Cut ~(set_In (a,File) (DOM OBJeq_dec (directories s))).
Intro; Unfold domf.
Cut (set_In (a,File)
      (set_union OBJeq_dec (DOM OBJeq_dec (directories s))
        (DOM OBJeq_dec (files s)))).
Intro; EAuto.

Auto.

Intro; Absurd (ObjType (a,File))=Directory.
Simpl.
Intro H11; Discriminate H11.

Auto.

Auto.
Right.
Cut ~(set_In (a,Directory) (DOM OBJeq_dec (files s))).
Intro; Unfold domd; EAuto.

Intro; Absurd (ObjType (a,Directory))=File.
Simpl.
Intro H11; Discriminate H11.

Auto.

Auto.

Qed.


Hints Resolve UniqNames.




Lemma eq_scIMPLYle_sc: (a,b:SecClass)(eq_sc a b)->(le_sc a b).
Unfold eq_sc le_sc; Intros.
Elim H; Intros.
Rewrite H0; Rewrite H1.
Auto.
Qed.




Lemma NotInDOMIsUndef2:
(s:SFSstate; o1,o2:OBJECT)
 ~(set_In o1 (domsecmat (secmat s)))
 ->o1=o2
 ->(None ReadersWriters)=(fsecmat (secmat s) o2).
Intros.
Symmetry.
Rewrite H0 in H.
Unfold fsecmat; Apply NotInDOMIsUndef; Auto.

Qed.




Lemma NotInDOMIsUndef3:
 (s:SFSstate; p:OBJNAME; o:OBJECT)
  (FuncPre1 s)
  ->(FuncPre3 s)
  ->~(set_In (p,File) (domf (files s)))
  ->~(set_In (p,Directory) (domd (directories s)))
  ->p=(ObjName o)
  ->(None ReadersWriters)=(fsecmat (secmat s) o).
Intros until o; Elim o; Simpl.
Intros until b; Elim b; Intros.
Rewrite <- H3.
Symmetry; Unfold fsecmat; Apply NotInDOMIsUndef.
Cut ~(set_In (p,File) (DOM OBJeq_dec (acl s))).
Unfold FuncPre3 Included in H3.
Unfold FuncPre3 Included in H0.
Auto.

Apply UniqNames; Auto.

Rewrite <- H3.
Symmetry; Unfold fsecmat; Apply NotInDOMIsUndef.
Cut ~(set_In (p,Directory) (DOM OBJeq_dec (acl s))).
Unfold FuncPre3 Included in H3.
Unfold FuncPre3 Included in H0.
Auto.

Apply UniqNames; Auto.

Qed.




Lemma EqfOSC6:
(s:SFSstate; o1,o2:OBJECT; sc:SecClass)
 ~o1=o2
 ->(fOSC (objectSC s) o2)=(fOSC (chobjsc_SC s o1 sc) o2).
Intros; Unfold fOSC chobjsc_SC.
Elim (fOSC (objectSC s) o1).
Intro; Apply AddRemEq; Auto.

Auto.

Qed.




Lemma EqfOSC5:
(s:SFSstate; o:OBJECT; p:OBJNAME)
 (FuncPre1 s)
 ->(FuncPre2 s)
 ->~(set_In (p,File) (domf (files s)))
 ->~(set_In (p,Directory) (domd (directories s)))
 ->p=(ObjName o)
 ->(None SecClass)=(fOSC (objectSC s) o).
Intros.
Symmetry; Unfold fOSC; Apply NotInDOMIsUndef.
Replace (DOM OBJeq_dec (objectSC s)) with (DOM OBJeq_dec (acl s)).
Rewrite H3 in H1; Rewrite H3 in H2.
Auto.

Qed.




Lemma EqfOSC1:
 (s:SFSstate; o:OBJECT; p:OBJNAME; u:SUBJECT)
  ~p=(ObjName o)
  ->(fOSC (objectSC s) o)=(fOSC (create_oSC s u p) o).
Intros.
Unfold create_oSC.
Elim (fSSC (subjectSC s) u); Elim (fsecmat (secmat s) (MyDir p)).
Intros; Unfold fOSC; Apply AddEq.
Intro; Apply H.
Rewrite H0; Simpl; Auto.

Auto.

Auto.

Auto.

Qed.




Lemma EqfOSC2:
 (s:SFSstate; o:OBJECT; p:OBJNAME; u:SUBJECT)
  ~p=(ObjName o)
  ->(fOSC (objectSC s) o)=(fOSC (mkdir_oSC s u p) o).
Intros.
Unfold mkdir_oSC.
Elim (fSSC (subjectSC s) u); Elim (fsecmat (secmat s) (MyDir p)).
Intros; Unfold fOSC; Apply AddEq.
Intro; Apply H.
Rewrite H0; Simpl; Auto.

Auto.

Auto.

Auto.

Qed.




Lemma EqfOSC3:
 (s:SFSstate; o1,o2:OBJECT)
  ~o1=o2
  ->(fOSC (objectSC s) o2)=(fOSC (unlink_oSC s o1) o2).
Intros.
Unfold unlink_oSC.
Elim (fOSC (objectSC s) o1).
Intro; Unfold fOSC; Apply RemEq.
Auto.

Auto.

Qed.




Lemma Eqfacl1:
 (s:SFSstate; o:OBJECT; p:OBJNAME; u:SUBJECT; perms:PERMS)
  ~p=(ObjName o)
  ->(facl (acl s) o)=(facl (create_acl s u p perms) o).
Intros.
Unfold create_acl.
Elim (fSSC (subjectSC s) u); Elim (fsecmat (secmat s) (MyDir p)).
Intros; Unfold facl; Apply AddEq.
Intro y1; Apply H; Rewrite y1; Simpl; Auto.

Auto.

Auto.

Auto.

Qed.




Lemma Eqfacl2:
 (s:SFSstate; o:OBJECT; p:OBJNAME; u:SUBJECT; perms:PERMS)
  ~p=(ObjName o)
  ->(facl (acl s) o)=(facl (mkdir_acl s u p perms) o).
Intros.
Unfold mkdir_acl.
Elim (fSSC (subjectSC s) u); Elim (fsecmat (secmat s) (MyDir p)).
Intros; Unfold facl; Apply AddEq.
Intro y1; Apply H; Rewrite y1; Simpl; Auto.

Auto.

Auto.

Auto.

Qed.




Lemma Eqfacl3:
 (s:SFSstate; o1,o2:OBJECT)
  ~o1=o2
  ->(facl (acl s) o2)=(facl (unlink_acl s o1) o2).
Intros.
Unfold unlink_acl.
Elim (facl (acl s) o1).
Intros; Unfold facl; Apply RemEq.
Auto.

Auto.

Qed.




Lemma Eqfacl4:
 (s:SFSstate; o:OBJECT; y,z:AccessCtrlListData)
  (FuncPre4 s)
  ->(facl (acl s) o)=(Some AccessCtrlListData y)
  ->(facl (rmdir_acl s o) o)=(Some AccessCtrlListData z)
  ->False.
Unfold facl.
Intros until z.
Cut Cases (PARTFUNC OBJeq_dec (acl s) o) of
      (Some y) => (set_In (o,y) (acl s))
    | None => ~(set_In o (DOM OBJeq_dec (acl s)))
    end.
Unfold rmdir_acl.
Unfold facl.
Elim (PARTFUNC OBJeq_dec (acl s) o).
Intros.
Cut (PARTFUNC OBJeq_dec (set_remove ACLeq_dec (o,a) (acl s)) o)
     =(None AccessCtrlListData).
Rewrite H2.
Intro.
Discriminate H3.

Auto.

Intros.
Discriminate H1.

Apply DOMFuncRel4.
Qed.


Lemma Eqfacl5:
 (s:SFSstate; o:OBJECT; y,z:AccessCtrlListData)
  (FuncPre4 s)
  ->(facl (acl s) o)=(Some AccessCtrlListData y)
  ->(facl (unlink_acl s o) o)=(Some AccessCtrlListData z)
  ->False.
Unfold facl.
Intros until z.
Cut Cases (PARTFUNC OBJeq_dec (acl s) o) of
      (Some y) => (set_In (o,y) (acl s))
    | None => ~(set_In o (DOM OBJeq_dec (acl s)))
    end.
Unfold unlink_acl.
Unfold facl.
Elim (PARTFUNC OBJeq_dec (acl s) o).
Intros.
Cut (PARTFUNC OBJeq_dec (set_remove ACLeq_dec (o,a) (acl s)) o)
     =(None AccessCtrlListData).
Rewrite H2.
Intro.
Discriminate H3.

Auto.

Intros.
Discriminate H1.

Apply DOMFuncRel4.
Qed.




Lemma EqfOSC4:
 (s:SFSstate; o:OBJECT; y,z:SecClass)
  (FuncPre6 s)
  ->(fOSC (objectSC s) o)=(Some SecClass y)
  ->(fOSC (rmdir_oSC s o) o)=(Some SecClass z)
  ->False.
Unfold fOSC.
Intros until z.
Cut Cases (PARTFUNC OBJeq_dec (objectSC s) o) of
      (Some y) => (set_In (o,y) (objectSC s))
    | None => ~(set_In o (DOM OBJeq_dec (objectSC s)))
    end.
Unfold rmdir_oSC.
Unfold fOSC.
Elim (PARTFUNC OBJeq_dec (objectSC s) o).
Intros.
Cut (PARTFUNC OBJeq_dec (set_remove OSCeq_dec (o,a) (objectSC s)) o)
     =(None SecClass).
Rewrite H2.
Intro.
Discriminate H3.

Auto.

Intros.
Discriminate H1.

Apply DOMFuncRel4.
Qed.




Lemma EqfOSC7:
 (s:SFSstate; o:OBJECT; y,z:SecClass)
  (FuncPre6 s)
  ->(fOSC (objectSC s) o)=(Some SecClass y)
  ->(fOSC (unlink_oSC s o) o)=(Some SecClass z)
  ->False.
Unfold fOSC.
Intros until z.
Cut Cases (PARTFUNC OBJeq_dec (objectSC s) o) of
      (Some y) => (set_In (o,y) (objectSC s))
    | None => ~(set_In o (DOM OBJeq_dec (objectSC s)))
    end.
Unfold unlink_oSC.
Unfold fOSC.
Elim (PARTFUNC OBJeq_dec (objectSC s) o).
Intros.
Cut (PARTFUNC OBJeq_dec (set_remove OSCeq_dec (o,a) (objectSC s)) o)
     =(None SecClass).
Rewrite H2.
Intro.
Discriminate H3.

Auto.

Intros.
Discriminate H1.

Apply DOMFuncRel4.
Qed.




Lemma NoDACChange:
 (s:SFSstate; o:OBJECT; SSC:(set SUBJECT*SecClass);
  OSC:(set OBJECT*SecClass); FILES:(set OBJECT*FILECONT);
  DIRECTS:(set OBJECT*DIRCONT); SM:(set OBJECT*ReadersWriters))
  ~(DACCtrlAttrHaveChanged s
    (mkSFS (groups s) (primaryGrp s) SSC (AllGrp s)
    (RootGrp s) (SecAdmGrp s) OSC (acl s) SM FILES DIRECTS) o).
Intros.
Intro.
Inversion H; Simpl in H1; Cut y=z.
Intro EQ; Rewrite EQ in H2; Inversion H2; Auto.

Rewrite H0 in H1; Injection H1; Auto.

Intro EQ; Rewrite EQ in H2; Inversion H2; Auto.

Rewrite H0 in H1; Injection H1; Auto.

Qed.




Lemma NoDACChange2:
 (s:SFSstate; o:OBJECT)~(DACCtrlAttrHaveChanged s s o).
Intros; Intro;
  EApply (NoDACChange s o (subjectSC s) (objectSC s) (files s)
          (directories s) (secmat s)).
Generalize H; Elim s; Simpl; Auto.

Qed.




Lemma NoMACObjChange:
 (s:SFSstate; o:OBJECT; FILES:(set OBJECT*FILECONT);
  DIRECTS:(set OBJECT*DIRCONT); ACL:(set OBJECT*AccessCtrlListData);
  SSC:(set SUBJECT*SecClass); SM:(set OBJECT*ReadersWriters))
  ~(MACObjCtrlAttrHaveChanged s
    (mkSFS (groups s) (primaryGrp s) SSC (AllGrp s)
    (RootGrp s) (SecAdmGrp s) (objectSC s) ACL SM FILES DIRECTS) o).
Intros; Intro.
Inversion H; Simpl in H1.
Cut x=y.
Intro EQ; Rewrite EQ in H2; Inversion H2; Auto.

Rewrite H0 in H1; Injection H1; Auto.

Qed.




Lemma NoMACObjChange2:
 (s:SFSstate; o:OBJECT)~(MACObjCtrlAttrHaveChanged s s o).
Intros; Intro;
  EApply (NoMACObjChange s o (files s) (directories s) (acl s)
          (subjectSC s) (secmat s)).
Generalize H; Elim s; Simpl; Auto.

Qed.




Lemma NoMACSubChange:
 (s:SFSstate; u:SUBJECT; ACL: (set OBJECT*AccessCtrlListData);
  OSC:(set OBJECT*SecClass); FILES:(set OBJECT*FILECONT);
  DIRECTS:(set OBJECT*DIRCONT); SM:(set OBJECT*ReadersWriters))
  ~(MACSubCtrlAttrHaveChanged s
    (mkSFS (groups s) (primaryGrp s) (subjectSC s) (AllGrp s)
      (RootGrp s) (SecAdmGrp s) OSC ACL SM FILES DIRECTS) u).
Intros; Intro; Inversion H.
Simpl in H1.
Cut x=y.
Intro EQ; Rewrite EQ in H2; Inversion H2; Auto.

Rewrite H0 in H1; Injection H1; Auto.

Qed.




Lemma NoMACSubChange2:
 (s:SFSstate; u:SUBJECT)~(MACSubCtrlAttrHaveChanged s s u).
Intros; Intro;
  EApply (NoMACSubChange s u (acl s) (objectSC s) (files s) (directories s) (secmat s)).
Generalize H; Elim s; Simpl; Auto.

Qed.




Lemma eq_scSym: (a,b:SecClass)(eq_sc a b)->(eq_sc b a).
Unfold eq_sc; Intros.
Elim H; Intros.
Rewrite H0; Rewrite H1.
Auto.
Qed.




Lemma ChsubscPSS1:
 (s:SFSstate; u:SUBJECT; y:ReadersWriters)
  ((rw:ReadersWriters)
   ~(set_In u (ActReaders rw))/\~(set_In u (ActWriters rw)))
  ->~((set_In u (ActReaders y))\/(set_In u (ActWriters y))).
Intros.
Cut ~(set_In u (ActReaders y))/\~(set_In u (ActWriters y)).
Tauto.

Auto.

Qed.




Lemma EqfSSC1:
 (s:SFSstate; u,u0:SUBJECT; sc:SecClass)
 ~u=u0 -> (fSSC (subjectSC s) u0)=(fSSC (chsubsc_SC s u sc) u0).
Intros; Unfold chsubsc_SC.
Elim (fSSC (subjectSC s) u).
Intros; Unfold fSSC; Apply AddRemEq; Auto.

Auto.

Qed.




Lemma Close_smCorr:
 (s:SFSstate; Sub:SUBJECT; o:OBJECT)
  (FuncPre5 s)
  ->Cases (fsecmat (secmat s) o) of
     |(Some y) =>
        (set_In Sub
          (set_union SUBeq_dec (ActReaders y) (ActWriters y)))
     |None => False
 end
 ->Cases (fsecmat (close_sm s Sub o) o) of
    |None =>True
    |(Some y) =>~(set_In Sub (ActReaders y))/\~(set_In Sub (ActWriters y))
   end.
Intros until o.
Cut Cases (fsecmat (secmat s) o) of
      (Some y) => (set_In (o,y) (secmat s))
    | None => ~(set_In o (DOM OBJeq_dec (secmat s)))
    end.
Unfold close_sm.
Elim (fsecmat (secmat s) o); Intros.
Elim (set_remove SUBeq_dec Sub (ActReaders a));
  Elim (set_remove SUBeq_dec Sub (ActWriters a)).
Replace (fsecmat (set_remove SECMATeq_dec (o,a) (secmat s)) o)
 with (None ReadersWriters).
Auto.

Symmetry; Unfold fsecmat; Unfold FuncPre5 in H0; Auto.

Intros.
Replace (fsecmat
          (set_add SECMATeq_dec (o,(NEWRW Sub o a))
            (set_remove SECMATeq_dec (o,a) (secmat s))) o)
 with (Some ReadersWriters (NEWRW Sub o a)).
Unfold NEWRW; Simpl; Split; Apply Set_remove1.

Unfold fsecmat; Apply AddEq1.
Auto.

Intros;
  Replace (fsecmat
            (set_add SECMATeq_dec (o,(NEWRW Sub o a))
              (set_remove SECMATeq_dec (o,a) (secmat s))) o)
   with (Some ReadersWriters (NEWRW Sub o a)).
Unfold NEWRW; Simpl; Split; Apply Set_remove1.

Unfold fsecmat; Apply AddEq1.
Auto.

Intros;
  Replace (fsecmat
            (set_add SECMATeq_dec (o,(NEWRW Sub o a))
              (set_remove SECMATeq_dec (o,a) (secmat s))) o)
   with (Some ReadersWriters (NEWRW Sub o a)).
Unfold NEWRW; Simpl; Split; Apply Set_remove1.

Unfold fsecmat; Apply AddEq1.
Auto.

Tauto.

Unfold fsecmat; Apply DOMFuncRel4.

Qed.




Lemma Close_smCorr2:
 (s:SFSstate; Sub,u0:SUBJECT; o:OBJECT)
  (FuncPre5 s)
  ->Cases (fsecmat (secmat s) o) of
     |(Some y) =>
        (set_In Sub
          (set_union SUBeq_dec (ActReaders y) (ActWriters y)))
     |None => False
 end
 ->Cases (fsecmat (close_sm s Sub o) o) (fsecmat (secmat s) o) of
    | _ None => False
    | None (Some z) => True
    | (Some y) (Some z) =>
       ((set_In u0 (ActReaders y))->(set_In u0 (ActReaders z)))
       /\((set_In u0 (ActWriters y))->(set_In u0 (ActWriters z)))
    end.
Intros until o.
Cut Cases (fsecmat (secmat s) o) of
      (Some y) => (set_In (o,y) (secmat s))
    | None => ~(set_In o (DOM OBJeq_dec (secmat s)))
    end.
Unfold close_sm.
Elim (fsecmat (secmat s) o); Intros.
Elim (set_remove SUBeq_dec Sub (ActReaders a));
  Elim (set_remove SUBeq_dec Sub (ActWriters a)).
Replace (fsecmat (set_remove SECMATeq_dec (o,a) (secmat s)) o)
 with (None ReadersWriters).
Auto.

Symmetry; Unfold fsecmat; Unfold FuncPre5 in H; Auto.

Intros.
Replace (fsecmat
          (set_add SECMATeq_dec (o,(NEWRW Sub o a))
            (set_remove SECMATeq_dec (o,a) (secmat s))) o)
 with (Some ReadersWriters (NEWRW Sub o a)).
Unfold NEWRW; Simpl.
Split;
  [ Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActReaders a) 4!u0
               5!Sub); Auto
  | Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActWriters a) 4!u0
               5!Sub); Auto ].

Unfold fsecmat; Apply AddEq1.
Auto.

Intros.
Replace (fsecmat
          (set_add SECMATeq_dec (o,(NEWRW Sub o a))
            (set_remove SECMATeq_dec (o,a) (secmat s))) o)
 with (Some ReadersWriters (NEWRW Sub o a)).
Unfold NEWRW; Simpl.
Split;
  [ Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActReaders a) 4!u0
               5!Sub); Auto
  | Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActWriters a) 4!u0
               5!Sub); Auto ].


Unfold fsecmat; Apply AddEq1.
Auto.

Intros.
Replace (fsecmat
          (set_add SECMATeq_dec (o,(NEWRW Sub o a))
            (set_remove SECMATeq_dec (o,a) (secmat s))) o)
 with (Some ReadersWriters (NEWRW Sub o a)).
Unfold NEWRW; Simpl.
Split;
  [ Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActReaders a) 4!u0
               5!Sub); Auto
  | Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActWriters a) 4!u0
               5!Sub); Auto ].

Unfold fsecmat; Apply AddEq1.
Auto.

Tauto.

Unfold fsecmat; Apply DOMFuncRel4.

Qed.




Lemma Eqfsecmat1:
 (s:SFSstate; o1,o2:OBJECT; u:SUBJECT)
 ~o1=o2 -> (fsecmat (secmat s) o2)=(fsecmat (close_sm s u o1) o2).
Unfold close_sm fsecmat; Intros;
  Elim (PARTFUNC OBJeq_dec (secmat s) o1).
Intro; Elim (set_remove SUBeq_dec u (ActReaders a));
  Elim (set_remove SUBeq_dec u (ActWriters a)).
Auto.

Auto.

Auto.

Auto.

Auto.

Qed.




Lemma Close_smCorr3:
 (s:SFSstate; Sub:SUBJECT; o:OBJECT)
  (fsecmat (secmat s) o)=(None ReadersWriters)
  ->(fsecmat (close_sm s Sub o) o)=(None ReadersWriters).
Intros until o; Unfold close_sm.
Intro.
Generalize H.
Elim (fsecmat (secmat s) o).
Intros y H0; Discriminate H0.

Auto.

Qed.




Lemma OwnerClose_smCorr2:
 (s:SFSstate; Sub,u0:SUBJECT; o:OBJECT)
  (FuncPre5 s)
  ->Cases (fsecmat (secmat s) o) of
     |(Some y) =>
        (set_In Sub
          (set_union SUBeq_dec (ActReaders y) (ActWriters y)))
     |None => False
 end
 ->Cases (fsecmat (ownerclose_sm s Sub o) o) (fsecmat (secmat s) o) of
    | _ None => False
    | None (Some z) => True
    | (Some y) (Some z) =>
       ((set_In u0 (ActReaders y))->(set_In u0 (ActReaders z)))
       /\((set_In u0 (ActWriters y))->(set_In u0 (ActWriters z)))
    end.
Intros until o.
Cut Cases (fsecmat (secmat s) o) of
      (Some y) => (set_In (o,y) (secmat s))
    | None => ~(set_In o (DOM OBJeq_dec (secmat s)))
    end.
Unfold ownerclose_sm.
Elim (fsecmat (secmat s) o); Intros.
Elim (set_remove SUBeq_dec Sub (ActReaders a));
  Elim (set_remove SUBeq_dec Sub (ActWriters a)).
Replace (fsecmat (set_remove SECMATeq_dec (o,a) (secmat s)) o)
 with (None ReadersWriters).
Auto.

Symmetry; Unfold fsecmat; Unfold FuncPre5 in H0; Auto.

Intros.
Replace (fsecmat
          (set_add SECMATeq_dec (o,(NEWRWOC Sub o a))
            (set_remove SECMATeq_dec (o,a) (secmat s))) o)
 with (Some ReadersWriters (NEWRWOC Sub o a)).
Unfold NEWRWOC; Simpl.
Split;
  [ Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActReaders a) 4!u0
               5!Sub); Auto
  | Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActWriters a) 4!u0
               5!Sub); Auto ].

Unfold fsecmat; Apply AddEq1.
Auto.

Intros.
Replace (fsecmat
          (set_add SECMATeq_dec (o,(NEWRWOC Sub o a))
            (set_remove SECMATeq_dec (o,a) (secmat s))) o)
 with (Some ReadersWriters (NEWRWOC Sub o a)).
Unfold NEWRWOC; Simpl.
Split;
  [ Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActReaders a) 4!u0
               5!Sub); Auto
  | Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActWriters a) 4!u0
               5!Sub); Auto ].


Unfold fsecmat; Apply AddEq1.
Auto.

Intros.
Replace (fsecmat
          (set_add SECMATeq_dec (o,(NEWRWOC Sub o a))
            (set_remove SECMATeq_dec (o,a) (secmat s))) o)
 with (Some ReadersWriters (NEWRWOC Sub o a)).
Unfold NEWRWOC; Simpl.
Split;
  [ Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActReaders a) 4!u0
               5!Sub); Auto
  | Intro;
      EApply (Set_remove2 1!SUBJECT 2!SUBeq_dec 3!(ActWriters a) 4!u0
               5!Sub); Auto ].

Unfold fsecmat; Apply AddEq1.
Auto.

Tauto.

Unfold fsecmat; Apply DOMFuncRel4.

Qed.




Lemma Eqfsecmat2:
 (s:SFSstate; o1,o2:OBJECT; u:SUBJECT)
 ~o1=o2 -> (fsecmat (secmat s) o2)=(fsecmat (ownerclose_sm s u o1) o2).
Unfold ownerclose_sm fsecmat; Intros;
  Elim (PARTFUNC OBJeq_dec (secmat s) o1).
Intro; Elim (set_remove SUBeq_dec u (ActReaders a));
  Elim (set_remove SUBeq_dec u (ActWriters a)).
Auto.

Auto.

Auto.

Auto.

Auto.

Qed.




Lemma OwnerClose_smCorr3:
 (s:SFSstate; Sub:SUBJECT; o:OBJECT)
  (fsecmat (secmat s) o)=(None ReadersWriters)
  ->(fsecmat (ownerclose_sm s Sub o) o)=(None ReadersWriters).
Intros until o; Unfold ownerclose_sm.
Intro.
Generalize H.
Elim (fsecmat (secmat s) o).
Intros y H0; Discriminate H0.

Auto.

Qed.




Lemma Open_smCorr3:
 (s:SFSstate; Sub:SUBJECT; o:OBJECT; m:MODE)
  (FuncPre5 s)
  ->(fsecmat (open_sm s Sub o m) o)=(None ReadersWriters)
  ->(fsecmat (secmat s) o)=(None ReadersWriters).
Intros until m; Intro; Unfold open_sm.
Cut Cases (fsecmat (secmat s) o) of
      (Some y) => (set_In (o,y) (secmat s))
    | None => ~(set_In o (DOM OBJeq_dec (secmat s)))
    end.
Elim m; Elim (fsecmat (secmat s) o).
Intro; Intro;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (set_add SUBeq_dec Sub (ActReaders a))
                 (ActWriters a)))
              (set_remove SECMATeq_dec (o,a) (secmat s))) o)
   with (Some ReadersWriters
          (mkRW (set_add SUBeq_dec Sub (ActReaders a)) (ActWriters a))).
Intros H2; Discriminate H2.

Unfold fsecmat; Apply AddEq1; Auto.

Intro;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (set_add SUBeq_dec Sub (empty_set SUBJECT))
                 (empty_set SUBJECT))) (secmat s)) o)
   with (Some ReadersWriters
          (mkRW (set_add SUBeq_dec Sub (empty_set SUBJECT))
            (empty_set SUBJECT))).
Intro H2; Discriminate H2.

Unfold fsecmat; Apply AddEq1; Auto.

Intro; Intro;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (ActReaders a)
                 (set_add SUBeq_dec Sub (ActWriters a))))
              (set_remove SECMATeq_dec (o,a) (secmat s))) o)
   with (Some ReadersWriters
          (mkRW (ActReaders a) (set_add SUBeq_dec Sub (ActWriters a)))).
Intro H2; Discriminate H2.

Unfold fsecmat; Apply AddEq1; Auto.
Intro;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (empty_set SUBJECT)
                 (set_add SUBeq_dec Sub (empty_set SUBJECT))))
              (secmat s)) o)
   with (Some ReadersWriters
          (mkRW (empty_set SUBJECT)
            (set_add SUBeq_dec Sub (empty_set SUBJECT)))).
Intro H2; Discriminate H2.

Unfold fsecmat; Apply AddEq1; Auto.

Unfold fsecmat; Apply DOMFuncRel4.

Qed.




Lemma Open_smCorr21:
 (s:SFSstate; Sub,u0:SUBJECT; o:OBJECT; m:MODE)
  ~Sub=u0
  ->(FuncPre5 s)
  ->Cases (fsecmat (open_sm s Sub o READ) o) (fsecmat (secmat s) o) of
      (Some y) None =>
       (ActReaders y)=(set_add SUBeq_dec Sub (empty_set SUBJECT))
       /\(ActWriters y)=(empty_set SUBJECT)
    | None _ => False
    | (Some y) (Some z) =>
       ((set_In u0 (ActReaders y))->(set_In u0 (ActReaders z)))
       /\((set_In u0 (ActWriters y))->(set_In u0 (ActWriters z)))
    end.
Intros.
Cut Cases (fsecmat (secmat s) o) of
      (Some y) => (set_In (o,y) (secmat s))
    | None => ~(set_In o (DOM OBJeq_dec (secmat s)))
    end.
Unfold open_sm.
Elim (fsecmat (secmat s) o).
Intros;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (set_add SUBeq_dec Sub (ActReaders a))
                 (ActWriters a)))
              (set_remove SECMATeq_dec (o,a) (secmat s))) o)
   with (Some ReadersWriters
          (mkRW (set_add SUBeq_dec Sub (ActReaders a)) (ActWriters a))).
Simpl.
Split; (Intros; EAuto).

Unfold fsecmat; Apply AddEq1; Auto.

Intros;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (set_add SUBeq_dec Sub (empty_set SUBJECT))
                 (empty_set SUBJECT))) (secmat s)) o)
   with (Some ReadersWriters
          (mkRW (set_add SUBeq_dec Sub (empty_set SUBJECT))
            (empty_set SUBJECT))).
Auto.

Unfold fsecmat; Apply AddEq1; Auto.

Unfold fsecmat; Apply DOMFuncRel4.

Qed.




Lemma Open_smCorr22:
 (s:SFSstate; Sub,u0:SUBJECT; o:OBJECT; m:MODE)
  ~Sub=u0
  ->(FuncPre5 s)
  ->Cases (fsecmat (open_sm s Sub o WRITE) o) (fsecmat (secmat s) o) of
      (Some y) None =>
       (ActWriters y)=(set_add SUBeq_dec Sub (empty_set SUBJECT))
       /\(ActReaders y)=(empty_set SUBJECT)
    | None _ => False
    | (Some y) (Some z) =>
       ((set_In u0 (ActReaders y))->(set_In u0 (ActReaders z)))
       /\((set_In u0 (ActWriters y))->(set_In u0 (ActWriters z)))
    end.
Intros.
Cut Cases (fsecmat (secmat s) o) of
      (Some y) => (set_In (o,y) (secmat s))
    | None => ~(set_In o (DOM OBJeq_dec (secmat s)))
    end.
Unfold open_sm.
Elim (fsecmat (secmat s) o).
Intros;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (ActReaders a)
                 (set_add SUBeq_dec Sub (ActWriters a))))
              (set_remove SECMATeq_dec (o,a) (secmat s))) o)
   with (Some ReadersWriters
          (mkRW (ActReaders a) (set_add SUBeq_dec Sub (ActWriters a)))).
Simpl.
Split; (Intro; EAuto).

Unfold fsecmat; Apply AddEq1; Auto.

Intros;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (empty_set SUBJECT)
                 (set_add SUBeq_dec Sub (empty_set SUBJECT))))
              (secmat s)) o)
   with (Some ReadersWriters
          (mkRW (empty_set SUBJECT)
            (set_add SUBeq_dec Sub (empty_set SUBJECT)))).
Auto.

Unfold fsecmat; Apply AddEq1; Auto.

Unfold fsecmat; Apply DOMFuncRel4.

Qed.




Lemma Eqfsecmat3:
 (s:SFSstate; o1,o2:OBJECT; u:SUBJECT; m:MODE)
 ~o1=o2 -> (fsecmat (secmat s) o2)=(fsecmat (open_sm s u o1 m) o2).
Intros until m; Unfold fsecmat open_sm.
Elim m; Elim (fsecmat (secmat s) o1).
Intros; Apply AddRemEq; Auto.

Intros; Apply AddEq; Auto.

Intros; Apply AddRemEq; Auto.

Intros; Apply AddEq; Auto.

Qed.




Lemma Chobjsc_Corr:
 (s:SFSstate; o:OBJECT; sc:SecClass)
  (FuncPre6 s)
  ->((fOSC (objectSC s) o)=(None SecClass)
     <->(fOSC (chobjsc_SC s o sc) o)=(None SecClass)).
Intros; Unfold chobjsc_SC.
Cut Cases (fOSC (objectSC s) o) of
      (Some y) => (set_In (o,y) (objectSC s))
    | None => ~(set_In o (DOM OBJeq_dec (objectSC s)))
    end.
Split.
Intro H1; Rewrite H1; Auto.

Generalize H0; Elim (fOSC (objectSC s) o).
Intro; Intro;
  Replace (fOSC
            (set_add OSCeq_dec (o,sc)
              (set_remove OSCeq_dec (o,a) (objectSC s))) o)
   with (Some SecClass sc).
Intro H2; Discriminate H2.

Unfold fOSC; Apply AddEq1.
Auto.

Auto.

Unfold fOSC; Apply DOMFuncRel4.

Qed.




Lemma Aux1:
 (y:SecClass)
  ~((Some SecClass y)=(None SecClass)
    <->(None SecClass)=(None SecClass)).
Intro; Unfold iff; Intro H; Elim H; Intros.
Absurd (Some SecClass y)=(None SecClass); Auto.
Intro D; Discriminate D.

Qed.




Lemma Chsubsc_Corr:
 (s:SFSstate; u:SUBJECT; sc:SecClass)
  (FuncPre7 s)
  ->((fSSC (subjectSC s) u)=(None SecClass)
     <->(fSSC (chsubsc_SC s u sc) u)=(None SecClass)).
Intros; Unfold chsubsc_SC.
Cut Cases (fSSC (subjectSC s) u) of
      (Some y) => (set_In (u,y) (subjectSC s))
    | None => ~(set_In u (DOM SUBeq_dec (subjectSC s)))
    end.
Split.
Intro H1; Rewrite H1; Auto.

Generalize H0; Elim (fSSC (subjectSC s) u).
Intro; Intro;
  Replace (fSSC
            (set_add SSCeq_dec (u,sc)
              (set_remove SSCeq_dec (u,a) (subjectSC s))) u)
   with (Some SecClass sc).
Intro H2; Discriminate H2.

Unfold fSSC; Apply AddEq1; Auto.
Auto.

Auto.

Unfold fSSC; Apply DOMFuncRel4.

Qed.




Lemma Open_smCorr31:
 (s:SFSstate; Sub,u0:SUBJECT; o:OBJECT; m:MODE)
  (FuncPre5 s)
  ->Cases (fsecmat (open_sm s Sub o READ) o) (fsecmat (secmat s) o) of
      (Some y) None =>
       (ActReaders y)=(set_add SUBeq_dec Sub (empty_set SUBJECT))
       /\(ActWriters y)=(empty_set SUBJECT)
    | None _ => False
    | (Some y) (Some z) =>
       ((set_In u0 (ActWriters y))->(set_In u0 (ActWriters z)))
    end.
Intros.
Cut Cases (fsecmat (secmat s) o) of
      (Some y) => (set_In (o,y) (secmat s))
    | None => ~(set_In o (DOM OBJeq_dec (secmat s)))
    end.
Unfold open_sm.
Elim (fsecmat (secmat s) o).
Intros;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (set_add SUBeq_dec Sub (ActReaders a))
                 (ActWriters a)))
              (set_remove SECMATeq_dec (o,a) (secmat s))) o)
   with (Some ReadersWriters
          (mkRW (set_add SUBeq_dec Sub (ActReaders a)) (ActWriters a))).
Simpl; Auto.

Unfold fsecmat; Apply AddEq1; Auto.

Intros;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (set_add SUBeq_dec Sub (empty_set SUBJECT))
                 (empty_set SUBJECT))) (secmat s)) o)
   with (Some ReadersWriters
          (mkRW (set_add SUBeq_dec Sub (empty_set SUBJECT))
            (empty_set SUBJECT))).
Simpl; Auto.

Unfold fsecmat; Apply AddEq1; Auto.

Unfold fsecmat; Apply DOMFuncRel4.

Qed.




Lemma Open_smCorr32:
 (s:SFSstate; Sub,u0:SUBJECT; o:OBJECT; m:MODE)
  (FuncPre5 s)
  ->Cases (fsecmat (open_sm s Sub o WRITE) o) (fsecmat (secmat s) o) of
      (Some y) None =>
       (ActWriters y)=(set_add SUBeq_dec Sub (empty_set SUBJECT))
       /\(ActReaders y)=(empty_set SUBJECT)
    | None _ => False
    | (Some y) (Some z) =>
       ((set_In u0 (ActReaders y))->(set_In u0 (ActReaders z)))
    end.
Intros.
Cut Cases (fsecmat (secmat s) o) of
      (Some y) => (set_In (o,y) (secmat s))
    | None => ~(set_In o (DOM OBJeq_dec (secmat s)))
    end.
Unfold open_sm.
Elim (fsecmat (secmat s) o).
Intros;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (ActReaders a)
                 (set_add SUBeq_dec Sub (ActWriters a))))
              (set_remove SECMATeq_dec (o,a) (secmat s))) o)
   with (Some ReadersWriters
          (mkRW (ActReaders a) (set_add SUBeq_dec Sub (ActWriters a)))).
Simpl; Auto.

Unfold fsecmat; Apply AddEq1; Auto.

Intros;
  Replace (fsecmat
            (set_add SECMATeq_dec
              (o,
               (mkRW (empty_set SUBJECT)
                 (set_add SUBeq_dec Sub (empty_set SUBJECT))))
              (secmat s)) o)
   with (Some ReadersWriters
          (mkRW (empty_set SUBJECT)
            (set_add SUBeq_dec Sub (empty_set SUBJECT)))).
Simpl; Auto.

Unfold fsecmat; Apply AddEq1; Auto.

Unfold fsecmat; Apply DOMFuncRel4.

Qed.




Hints Resolve eq_scIMPLYle_sc eq_scSym Eqfsecmat1 Close_smCorr3
              TwoImpLeft TwoImpRight EqfOSC1 ChsubscPSS1 Eqfsecmat2
              NoMACObjChange NoDACChange NoMACSubChange EqfOSC6
              Eqfacl1 Eqfacl2 Eqfacl3 EqfOSC1 EqfOSC2 EqfOSC3 Aux1
              NotInDOMIsUndef2 Eqfacl4 EqfOSC4 EqfOSC5 EqfSSC1
              OwnerClose_smCorr3 Open_smCorr3 Eqfsecmat3 Chobjsc_Corr
              NoMACObjChange2 NoDACChange2 NoMACSubChange2
              Chsubsc_Corr NotInDOMIsUndef3 Eqfacl5 EqfOSC7.


Index
This page has been generated by coqdoc