cpsa-3.6.8: tst/wd-goalssat.scm
(herald "Wrap-Decrypt example"
(bound 24)
(limit 2000)
(goals-sat)
)
;; In this version, the redirect URI is registered ahead of time
;; and is not carried in the auth or access messages
(defprotocol wrap-decrypt basic
(defrole create-key
(vars (k skey))
(trace
(recv (cat "CREATE"))
(send (cat "CREATED" (hash k)))
(init (cat "init" k)))
(uniq-gen k)
)
(defrole set-wrap
(vars (k skey) (type mesg))
(trace
(recv (cat "SET-WRAP" (hash k)))
(tran (cat type k) (cat "wrap" k))
(send (cat "SET-WRAP-DONE"))
))
(defrole set-decrypt
(vars (k skey) (type mesg))
(trace
(recv (cat "SET-DECRYPT" (hash k)))
(tran (cat type k) (cat "decrypt" k))
(send (cat "SET-DECRYPT-DONE"))
))
(defrole do-decrypt
(vars (k skey) (m mesg))
(trace
(recv (cat "DECRYPT" (hash k) (enc m k)))
(obsv (cat "decrypt" k))
(send m)))
(defrole do-wrap
(vars (wk ck skey) (cktype mesg))
(trace
(recv (cat "WRAP" (hash wk) (hash ck)))
(obsv (cat "wrap" wk))
(obsv (cat cktype ck))
(send (enc ck wk))
)
)
;; --------- RULES -------------
(defrule no-key-cycle
(forall ((z strd) (k skey))
(implies
(and
(p "do-wrap" z 4)
(p "do-wrap" "ck" z k)
(p "do-wrap" "wk" z k)
)
(fact falseFact))))
(defrule no-set-wrap-noops
(forall ((z strd))
(implies
(and
(p "set-wrap" z 2)
(p "set-wrap" "type" z "wrap")
)
(fact falseFact))))
(defrule no-set-decrypt-noops
(forall ((z strd))
(implies
(and
(p "set-decrypt" z 2)
(p "set-decrypt" "type" z "decrypt")
)
(fact falseFact))))
(defrule secure-mode
(forall ((z strd))
(implies
(and
(fact secureMode)
(p "set-decrypt" z 1)
(p "set-decrypt" "type" z "wrap")
)
(fact falseFact))))
(defrule conclusion-of-simple
(forall ((z0 z1 strd) (k skey))
(implies
(and
(p "create-key" z0 3)
(p "create-key" "k" z0 k)
(p "" z1 1)
(p "" "x" z1 k)
)
;; A key was used to decrypt after wrapping.
; (fact falseFact))))
(exists ((z2 z3 strd) (k2 skey))
(and
(p "do-decrypt" z2 1)
(p "do-decrypt" "k" z2 k2)
(p "do-wrap" z3 4)
(p "do-wrap" "wk" z3 k2)
(prec z3 3 z2 0)
(prec z2 0 z1 0)
)))))
)
(comment
(defskeleton wrap-decrypt
(vars (k skey))
(defstrand do-decrypt 3 (k k))
(defstrand do-wrap 3 (wk k))
(facts (secureMode))
(precedes ((1 2) (0 0))))
)
;;; Defgoals
;;; Secure mode
(defgoal wrap-decrypt
(forall ((z0 z1 strd) (k skey))
(implies
(and
(fact secureMode)
(p "do-decrypt" z0 3)
(p "do-decrypt" "k" z0 k)
(p "do-wrap" z1 4)
(p "do-wrap" "wk" z1 k)
(prec z1 3 z0 0))
;;; Infinite descent: implies there exists two copies of decrypt followed by wrap, one before the other.
(or
(fact falseFact)
(exists
((z2 z3 z4 z5 strd) (k0 k1 skey))
(and
(p "do-decrypt" z2 3)
(p "do-decrypt" "k" z2 k0)
(p "do-wrap" z3 4)
(p "do-wrap" "wk" z3 k0)
(prec z2 3 z3 0)
(p "do-decrypt" z4 3)
(p "do-decrypt" "k" z4 k1)
(p "do-wrap" z5 4)
(p "do-wrap" "wk" z5 k1)
(prec z4 3 z5 0)
(prec z2 3 z4 0))
)))))