packages feed

tamarin-prover-0.1.0.0: data/examples/csf12/SignedDH_eCK.spthy

theory SignedDH_eCK
begin

builtin: diffie-hellman, signing

section{* The Signed Diffie-Hellman Protocol in the eCK model *}

/*
 * Protocol:	Signed Diffie-Hellman
 * Modeler: 	Simon Meier, Benedikt Schmidt
 * Date: 	January 2012
 * Property:	eCK model
 * 		"Stronger Security of Authenticated Key Exchange"
 * 		LaMacchia, Lauter, Mityagin, 2007
 *
 * Status: 	working
 */

// Public key infrastructure
rule Register_pk:
    [ Fr(~ltk) ] 
  --> 
    [ !Ltk($A, ~ltk), !Pk($A, pk(~ltk)), Out(pk(~ltk)) ]

// Protocol
/* Initiator */
rule Init_1:
    [ Fr(~ekI), !Ltk($I, ltkI) ]
  --[ SidI_1(~ekI, $I, $R, 'g'^~ekI) ]->
    [ Init_1( ~ekI, $I, $R, ~ekI, 'g' ^ ~ekI )
    , !Ephk(~ekI)
    , Out( <$I, $R, 'g' ^ ~ekI, sign{'1', $I, $R,'g' ^ ~ekI }ltkI> ) ]

rule Init_2:
    [ Init_1( ~ekI, $I, $R, ~ekI, hkI )
    , !Pk($R, pk(ltkR))
    , In( <$R, $I, Y, sign{'2', $R, $I, Y }ltkR> ) 
    ]
  --[ SidI_2(~ekI, $I, $R, hkI, Y, Y ^ ~ekI ) ]->
    [ !Sessk(~ekI, Y ^ ~ekI) ]

/* Responder */
rule Resp:
    [ !Pk($I, pk(ltkI))
    , !Ltk($R, ltkR)
    , Fr(~ekR)
    , In( <$I, $R, X, sign{'1', $I, $R, X }ltkI> ) 
    ]
  --[ SidR_1(~ekR, $I, $R, X, 'g' ^ ~ekR, X ^ ~ekR) ]->
    [ !Ephk(~ekR)
    , !Sessk(~ekR, X ^ ~ekR)
    , Out( <$R, $I, 'g' ^ ~ekR, sign{'2', $R, $I, 'g' ^ ~ekR }ltkR> ) 
    ]

/* Key Reveals for the eCK model */
rule Sessk_reveal: 
   [ !Sessk(~tid, k) ]
   --[ SesskRev(~tid) ]->
   [ Out(k) ]

rule Ltk_reveal:
   [ !Ltk($A, lkA) ]
   --[ LtkRev($A) ]->
   [ Out(lkA) ]

rule Ephk_reveal:
   [ !Ephk(~ekA) ]
   --[ EphkRev(~ekA) ]->
   [ Out(~ekA) ]

/* An attack is valid in eCK if the session key of the test session is deduced and
   the test session is clean.
*/
lemma eCK_initiator_key:
  "not (Ex #i1 #i2 ttest I R k hkI hkR.
            SidI_2(ttest, I, R, hkI, hkR, k) @ i1 & K( k ) @ i2

            /* Not both longterm-key-reveal _and_ ephemeral-key-reveal
	     * for test thread. */
            & not(Ex #i3 #i4. LtkRev( I ) @ i3 & EphkRev( ttest ) @ i4)

            /* No session-key-reveal of test thread. */
            & not(Ex #i3. SesskRev( ttest ) @ i3 )

            /* No session-key-reveal for matching session. */
            & not(Ex #i3 #i4 tpartner kpartner.
                   SidR_1( tpartner,I,R,hkI,hkR,kpartner ) @i3
		   & SesskRev( tpartner ) @ i4 )

            /* Not both long-term-key-reveal and ephemeral-key-reveal
	     * for matching session */
            & not(Ex #i3 #i4 #i5 tpartner kpartner.
                  SidR_1( tpartner,I,R,hkI,hkR,kpartner ) @i3
		  & LtkRev( R ) @ i4
		  & EphkRev( tpartner ) @ i5 )

	    /* Longterm-key-reveal of partner only if there is a
	     * matching session. */
	    /* (We model eCK-wpfs, for eCK-pfs, add i1 < i3 to conclusion) */
            & (All #i3. LtkRev( R ) @ i3 ==>
	          (Ex #i4 tpartner kpartner.
                      (* (i1 < i3) | *)
                      SidR_1( tpartner,I,R,hkI,hkR,kpartner ) @i4)))"

/* An attack is valid in eCK if the session key of the test session is deduced and
   the test session is clean.
*/
lemma eCK_responder_key:
  "not (Ex #i1 #i2 ttest I R k hkI hkR.
            SidR_1(ttest, I, R, hkI, hkR, k) @ i1 & K( k ) @ i2

            /* Not longterm-key-reveal _and_ ephemeral-key-reveal of actor . */
            & not(Ex #i3 #i4. LtkRev( R ) @ i3 & EphkRev( ttest ) @ i4)

            /* Not session-key-reveal of test thread. */
            & not(Ex #i3. SesskRev( ttest ) @ i3 )

            /* Not session-key-reveal of partner thread. Note that we use SidI_2 here.
	       A session key reveal can only happen after SidI_2 is logged anyways.
	    */
            & not(Ex #i3 #i4 tpartner kpartner.
                   SidI_2( tpartner,I,R,hkI,hkR,kpartner ) @i3
		   & SesskRev( tpartner ) @ i4 )

            /* If there is a partner thread, then not long-term-key-reveal and ephemeral-key-reveal. */
            & not(Ex #i3 #i4 #i5 tpartner.
                  SidI_1( tpartner,I,R,hkI ) @i3
		  & LtkRev( I ) @ i4
		  & EphkRev( tpartner ) @ i5 )

	    /* If there is no partner thread, then there is no longterm-key-reveal for
	       the intended partner.
	       (We model eCK-wpfs, for eCK-pfs, add i1 < i3 to conclusion)
	       */
            & (All #i3. LtkRev( I ) @ i3 ==>
	          (Ex #i4 tpartner.
                       (* (i1 < i3) | *)
                       SidI_1( tpartner,I,R,hkI ) @i4)))"

end