Added IKE base models.
Modelers: Adrian Kyburz and Cas Cremers
This commit is contained in:
		
							parent
							
								
									5918bf1a3c
								
							
						
					
					
						commit
						34d7cba293
					
				
							
								
								
									
										11
									
								
								gui/Protocols/IKE/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								gui/Protocols/IKE/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
CPPSRC= $(wildcard *.cpp)
 | 
			
		||||
DEST= $(CPPSRC:.cpp=.spdl)
 | 
			
		||||
 | 
			
		||||
default:	$(DEST)
 | 
			
		||||
 | 
			
		||||
%.spdl:	%.cpp
 | 
			
		||||
	cpp $< >$@
 | 
			
		||||
 | 
			
		||||
mpa:	$(DEST) make-mpa.py
 | 
			
		||||
	./make-mpa.py
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										157
									
								
								gui/Protocols/IKE/common.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								gui/Protocols/IKE/common.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,157 @@
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * THIS FILE CONTAINS DEFINITIONS OF COMMON MACROS AND TYPES                *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
 hashfunction prf, KDF;
 | 
			
		||||
 | 
			
		||||
/**********************************
 | 
			
		||||
 * DIFFIE-HELLMAN ABSTRACTIONS    *
 | 
			
		||||
 * Zi = Gr^i = g^(ri)
 | 
			
		||||
 * Zr = Gi^r = g^(ir)
 | 
			
		||||
 **********************************/
 | 
			
		||||
const g, h: Function;
 | 
			
		||||
#define Zi h(Gr,i)
 | 
			
		||||
#define Zr h(Gi,r)
 | 
			
		||||
 | 
			
		||||
/**********************************
 | 
			
		||||
 * PROTOCOL DEPENDENT DEFINITIONS *
 | 
			
		||||
 **********************************/
 | 
			
		||||
#ifdef __IKEV1__
 | 
			
		||||
hashfunction H;
 | 
			
		||||
#define SKi KDF(Ni, Nr, Zi, Ci, Cr)
 | 
			
		||||
#define SKr KDF(Ni, Nr, Zr, Ci, Cr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __IKEV1_PSK__
 | 
			
		||||
#define SKi prf(k(I,R), Ni, Nr, Zi, Ci, Cr)
 | 
			
		||||
#define SKr prf(k(R,I), Ni, Nr, Zr, Ci, Cr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __IKEV1_QUICK__
 | 
			
		||||
/* k(.,.) equals Kd from the spec */
 | 
			
		||||
#define SKi KDF(k(I,R),Zi,Ni,Nr)
 | 
			
		||||
#define SKr KDF(k(R,I),Zr,Ni,Nr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __IKEV1_QUICK_NOPFS__
 | 
			
		||||
/* k(.,.) equals Kd from the spec */
 | 
			
		||||
#define SKi KDF(k(I,R),Ni,Nr)
 | 
			
		||||
#define SKr KDF(k(R,I),Ni,Nr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __IKEV2__
 | 
			
		||||
hashfunction MAC;
 | 
			
		||||
#define HDR (SPIi,SPIr)
 | 
			
		||||
#define SKi KDF(Ni,Nr,Zi,SPIi,SPIr)
 | 
			
		||||
#define SKr KDF(Ni,Nr,Zr,SPIi,SPIr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __IKEV2_CHILD__
 | 
			
		||||
#define SKi KDF(k(I,R),Zi,Ni,Nr)
 | 
			
		||||
#define SKr KDF(k(R,I),Zr,Ni,Nr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __IKEV2_CHILD_NOPFS__
 | 
			
		||||
#define SKi KDF(k(I,R),Ni,Nr)
 | 
			
		||||
#define SKr KDF(k(R,I),Ni,Nr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __JFK_CORE__
 | 
			
		||||
hashfunction H;
 | 
			
		||||
#define SKi KDF(Zi, Ni, Nr)
 | 
			
		||||
#define SKr KDF(Zr, Ni, Nr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __JFK__
 | 
			
		||||
hashfunction H;
 | 
			
		||||
#define SKi KDF(Zi, H(Ni), Nr)
 | 
			
		||||
#define SKr KDF(Zr, H(Ni), Nr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __OAKLEY__
 | 
			
		||||
#define SKi KDF(Ni, Nr, Zi, Ci, Cr)
 | 
			
		||||
#define SKr KDF(Ni, Nr, Zr, Ci, Cr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __OAKLEY_CONSERVATIVE__
 | 
			
		||||
#define SKi KDF(Ni, Nr, Zi, Ci, Cr)
 | 
			
		||||
#define SKr KDF(Ni, Nr, Zr, Ci, Cr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __SKEME__
 | 
			
		||||
#define SKi KDF(Zi)
 | 
			
		||||
#define SKr KDF(Zr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __SKEME_REKEY__
 | 
			
		||||
#define SKi KDF(k(I,R),prf(k(I,R), Ni, Nr, R, I))
 | 
			
		||||
#define SKr KDF(k(R,I),prf(k(R,I), Ni, Nr, R, I))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __STS__
 | 
			
		||||
#define SKi KDF(Zi)
 | 
			
		||||
#define SKr KDF(Zr)
 | 
			
		||||
hashfunction MAC;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
protocol @oracle (DH, SWAP) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
 | 
			
		||||
	/* Diffie-Hellman oracle: If the adversary is in possession of g^xy, he 
 | 
			
		||||
	 * can obtain g^yx.
 | 
			
		||||
	 * @obsolete	The adversary does not need DH as long as SWAP exists
 | 
			
		||||
	 */
 | 
			
		||||
	role DH {
 | 
			
		||||
		var i, r: Nonce;
 | 
			
		||||
 | 
			
		||||
		recv_!DH1( DH, DH, Zi );
 | 
			
		||||
		send_!DH2( DH, DH, Zr );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Session key swap oracle: If the adversary is in possession of eg the 
 | 
			
		||||
	 * initiators session key, he can obtain the responders session key.
 | 
			
		||||
	 */
 | 
			
		||||
	role SWAP {
 | 
			
		||||
		var i, r, Ni, Nr: Nonce;
 | 
			
		||||
 | 
			
		||||
#ifdef __IKEV1__
 | 
			
		||||
		var Ci, Cr: Nonce;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __IKEV1_PSK__
 | 
			
		||||
		var Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __IKEV1_QUICK__
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __IKEV1_QUICK_NOPFS__
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __IKEV2__
 | 
			
		||||
		var SPIi, SPIr: Nonce;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __IKEV2_CHILD__
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __IKEV2_CHILD_NOPFS__
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __OAKLEY__
 | 
			
		||||
		var Ci, Cr: Nonce;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __OAKLEY_CONSERVATIVE__
 | 
			
		||||
		var Ci, Cr: Nonce;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __SKEME_REKEY__
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		recv_!SWAP1( SWAP, SWAP, SKi );
 | 
			
		||||
		send_!SWAP2( SWAP, SWAP, SKr );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
#define __ORACLE__
 | 
			
		||||
							
								
								
									
										96
									
								
								gui/Protocols/IKE/ikev1-pk-a1.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								gui/Protocols/IKE/ikev1-pk-a1.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,96 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)
 | 
			
		||||
 * @reference	RFC 2409, 
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication 
 | 
			
		||||
 *				and Key Agreement
 | 
			
		||||
 * @variant		Public key authentication (aggressive mode), 
 | 
			
		||||
 *				last message not encrypted
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYID prf(H(Ni,Nr),Ci,Cr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
#define HASH1 H(CERT(R))
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, HASH_Rr );
 | 
			
		||||
		send_!O2( O, O, HASH_Ri );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, HASH_Ii );
 | 
			
		||||
		send_!O4( O, O, HASH_Ir );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-pk-a1(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list, g(i), {I}pk(R), {Ni}pk(R) );
 | 
			
		||||
		recv_!2( R, I, Ci, Cr, algo, Gr, {R}pk(I), {Nr}pk(I), HASH_Ri );
 | 
			
		||||
		claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!3( I, R, Ci, Cr, HASH_Ii );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list, Gi, {I}pk(R), {Ni}pk(R) );
 | 
			
		||||
		claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!2( R, I, Ci, Cr, algo, g(r), {R}pk(I), {Nr}pk(I), HASH_Rr );
 | 
			
		||||
		recv_!3( I, R, Ci, Cr, HASH_Ir );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										95
									
								
								gui/Protocols/IKE/ikev1-pk-a12.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								gui/Protocols/IKE/ikev1-pk-a12.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,95 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication
 | 
			
		||||
 *				and Key Agreement                                          
 | 
			
		||||
 * @variant		Public key authentication (aggressive mode),           
 | 
			
		||||
 *				last message encrypted                                 
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYID prf(H(Ni,Nr),Ci,Cr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
#define HASH1 H(CERT(R))
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, HASH_Rr );
 | 
			
		||||
		send_!O2( O, O, HASH_Ri );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, {HASH_Ii}SKi );
 | 
			
		||||
		send_!O4( O, O, {HASH_Ir}SKr );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
protocol ikev1-pk-a12(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list, g(i), {I}pk(R), {Ni}pk(R) );
 | 
			
		||||
		recv_!2( R, I, Ci, Cr, algo, Gr, {R}pk(I), {Nr}pk(I), HASH_Ri );
 | 
			
		||||
		claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!3( I, R, Ci, Cr, {HASH_Ii}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list, Gi, {I}pk(R), {Ni}pk(R) );
 | 
			
		||||
		claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!2( R, I, Ci, Cr, algo, g(r), {R}pk(I), {Nr}pk(I), HASH_Rr );
 | 
			
		||||
		recv_!3( I, R, Ci, Cr, {HASH_Ir}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										97
									
								
								gui/Protocols/IKE/ikev1-pk-a2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								gui/Protocols/IKE/ikev1-pk-a2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,97 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Public key authentication (aggressive mode),           
 | 
			
		||||
 *				last message not encrypted, nonce and id encrypted     
 | 
			
		||||
 *				together                                               
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYID prf(H(Ni,Nr),Ci,Cr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
#define HASH1 H(CERT(R))
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, HASH_Rr );
 | 
			
		||||
		send_!O2( O, O, HASH_Ri );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, HASH_Ii );
 | 
			
		||||
		send_!O4( O, O, HASH_Ir );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-pk-a2(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list, g(i), {I,Ni}pk(R) );
 | 
			
		||||
		recv_!2( R, I, Ci, Cr, algo, Gr, {R,Nr}pk(I), HASH_Ri );
 | 
			
		||||
		claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!3( I, R, Ci, Cr, HASH_Ii );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list, Gi, {I,Ni}pk(R) );
 | 
			
		||||
		claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!2( R, I, Ci, Cr, algo, g(r), {R,Nr}pk(I), HASH_Rr );
 | 
			
		||||
		recv_!3( I, R, Ci, Cr, HASH_Ir );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										95
									
								
								gui/Protocols/IKE/ikev1-pk-a22.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								gui/Protocols/IKE/ikev1-pk-a22.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,95 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Public key authentication (aggressive mode),           
 | 
			
		||||
 *				last message encrypted, nonce and id encrypted together
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYID prf(H(Ni,Nr),Ci,Cr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
#define HASH1 H(CERT(R))
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, HASH_Rr );
 | 
			
		||||
		send_!O2( O, O, HASH_Ri );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, {HASH_Ii}SKi );
 | 
			
		||||
		send_!O4( O, O, {HASH_Ir}SKr );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
protocol ikev1-pk-a22(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list, g(i), {I,Ni}pk(R) );
 | 
			
		||||
		recv_!2( R, I, Ci, Cr, algo, Gr, {R,Nr}pk(I), HASH_Ri );
 | 
			
		||||
		claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!3( I, R, Ci, Cr, {HASH_Ii}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list, Gi, {I,Ni}pk(R) );
 | 
			
		||||
		claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!2( R, I, Ci, Cr, algo, g(r), {R,Nr}pk(I), HASH_Rr );
 | 
			
		||||
		recv_!3( I, R, Ci, Cr, {HASH_Ir}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										103
									
								
								gui/Protocols/IKE/ikev1-pk-m.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								gui/Protocols/IKE/ikev1-pk-m.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,103 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Public key authentication (main mode)                  
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYID prf(H(Ni,Nr),Ci,Cr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
#define HASH1 H({R, pk(R)}sk(s))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!O1( O, O, {HASH_Ii}SKi );
 | 
			
		||||
		send_!O2( O, O, {HASH_Ir}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!O3( O, O, {HASH_Rr}SKr );
 | 
			
		||||
		send_!O4( O, O, {HASH_Ri}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-pk-m(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list );
 | 
			
		||||
		recv_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		send_3( I, R, Ci, Cr, g(i), {I}pk(R), {Ni}pk(R) );
 | 
			
		||||
		recv_4( R, I, Ci, Cr, Gr, {R}pk(I), {Nr}pk(I) );
 | 
			
		||||
		claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!5( I, R, Ci, Cr, {HASH_Ii}SKi );
 | 
			
		||||
		recv_!6( R, I, Ci, Cr, {HASH_Ri}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list );
 | 
			
		||||
		send_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		recv_3( I, R, Ci, Cr, Gi, {I}pk(R), {Ni}pk(R) );
 | 
			
		||||
		send_4( R, I, Ci, Cr, g(r), {R}pk(I), {Nr}pk(I) );
 | 
			
		||||
		recv_!5( I, R, Ci, Cr, {HASH_Ir}SKr );
 | 
			
		||||
		claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!6( R, I, Ci, Cr, {HASH_Rr}SKr );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										102
									
								
								gui/Protocols/IKE/ikev1-pk-m2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								gui/Protocols/IKE/ikev1-pk-m2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,102 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Public key authentication (main mode),                 
 | 
			
		||||
 *				Nonce and id encrypted together                        
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYID prf(H(Ni,Nr),Ci,Cr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!O1( O, O, {HASH_Ii}SKi );
 | 
			
		||||
		send_!O2( O, O, {HASH_Ir}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!O3( O, O, {HASH_Rr}SKr );
 | 
			
		||||
		send_!O4( O, O, {HASH_Ri}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
protocol ikev1-pk-m2(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list );
 | 
			
		||||
		recv_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		send_3( I, R, Ci, Cr, g(i), {I,Ni}pk(R) );
 | 
			
		||||
		recv_4( R, I, Ci, Cr, Gr, {R,Nr}pk(I) );
 | 
			
		||||
		claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!5( I, R, Ci, Cr, {HASH_Ii}SKi );
 | 
			
		||||
		recv_!6( R, I, Ci, Cr, {HASH_Ri}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list );
 | 
			
		||||
		send_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		recv_3( I, R, Ci, Cr, Gi, {I,Ni}pk(R) );
 | 
			
		||||
		send_4( R, I, Ci, Cr, g(r), {R,Nr}pk(I) );
 | 
			
		||||
		recv_!5( I, R, Ci, Cr, {HASH_Ir}SKr );
 | 
			
		||||
		claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!6( R, I, Ci, Cr, {HASH_Rr}SKr );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										97
									
								
								gui/Protocols/IKE/ikev1-pk2-a.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								gui/Protocols/IKE/ikev1-pk2-a.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,97 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
  *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Revised public key authentication (aggressive mode)    
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYID prf(H(Ni,Nr),Ci,Cr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
#define Nei prf(Ni, Ci)
 | 
			
		||||
#define Ner prf(Nr, Cr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, HASH_Rr );
 | 
			
		||||
		send_!O2( O, O, HASH_Ri );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, HASH_Ir );
 | 
			
		||||
		send_!O4( O, O, HASH_Ii );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-pk2-a(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list, {Ni}pk(R), {g(i)}Nei, {I}Nei );
 | 
			
		||||
		recv_!2( R, I, Ci, Cr, algo, {Nr}pk(I), {Gr}Ner, {R}Ner,  HASH_Ri );
 | 
			
		||||
		claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!3( I, R, Ci, Cr, HASH_Ii );
 | 
			
		||||
		
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list, {Ni}pk(R), {Gi}Nei, {I}Nei );
 | 
			
		||||
		claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!2( R, I, Ci, Cr, algo, {Nr}pk(I), {g(r)}Ner, {R}Ner,  HASH_Rr );
 | 
			
		||||
		recv_!3( I, R, Ci, Cr, HASH_Ir );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										97
									
								
								gui/Protocols/IKE/ikev1-pk2-a2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								gui/Protocols/IKE/ikev1-pk2-a2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,97 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Revised public key authentication (aggressive mode),   
 | 
			
		||||
 *				Diffie-Hellman token encrypted together with identity  
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYID prf(H(Ni,Nr),Ci,Cr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
#define Nei prf(Ni, Ci)
 | 
			
		||||
#define Ner prf(Nr, Cr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, HASH_Rr );
 | 
			
		||||
		send_!O2( O, O, HASH_Ri );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, HASH_Ir );
 | 
			
		||||
		send_!O4( O, O, HASH_Ii );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
protocol ikev1-pk2-a2(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list, {Ni}pk(R), {g(i),I}Nei );
 | 
			
		||||
		recv_!2( R, I, Ci, Cr, algo, {Nr}pk(I), {Gr,R}Ner,  HASH_Ri );
 | 
			
		||||
		claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!3( I, R, Ci, Cr, HASH_Ii );
 | 
			
		||||
		
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list, {Ni}pk(R), {Gi,I}Nei );
 | 
			
		||||
		claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!2( R, I, Ci, Cr, algo, {Nr}pk(I), {g(r),R}Ner,  HASH_Rr );
 | 
			
		||||
		recv_!3( I, R, Ci, Cr, HASH_Ir );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										104
									
								
								gui/Protocols/IKE/ikev1-pk2-m.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								gui/Protocols/IKE/ikev1-pk2-m.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication
 | 
			
		||||
 *				and Key Agreement
 | 
			
		||||
 * @variant		Revised public key authentication (main mode)          
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYID prf(H(Ni,Nr),Ci,Cr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
#define Nei prf(Ni, Ci)
 | 
			
		||||
#define Ner prf(Nr, Cr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!O1( O, O, {HASH_Ii}SKi );
 | 
			
		||||
		send_!O2( O, O, {HASH_Ir}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!O3( O, O, {HASH_Rr}SKr );
 | 
			
		||||
		send_!O4( O, O, {HASH_Ri}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-pk2-m(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list );
 | 
			
		||||
		recv_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		send_3( I, R, Ci, Cr, {Ni}pk(R), {g(i)}Nei, {I}Nei );
 | 
			
		||||
		recv_4( R, I, Ci, Cr, {Nr}pk(I), {Gr}Ner, {R}Ner );
 | 
			
		||||
		claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!5( I, R, Ci, Cr, {HASH_Ii}SKi );
 | 
			
		||||
		recv_!6( R, I, Ci, Cr, {HASH_Ri}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list );
 | 
			
		||||
		send_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		recv_3( I, R, Ci, Cr, {Ni}pk(R), {Gi}Nei, {I}Nei );
 | 
			
		||||
		send_4( R, I, Ci, Cr, {Nr}pk(I), {g(r)}Ner, {R}Ner );
 | 
			
		||||
		recv_!5( I, R, Ci, Cr, {HASH_Ir}SKr );
 | 
			
		||||
		claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!6( R, I, Ci, Cr, {HASH_Rr}SKr );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										106
									
								
								gui/Protocols/IKE/ikev1-pk2-m2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								gui/Protocols/IKE/ikev1-pk2-m2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,106 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication
 | 
			
		||||
 *				and Key Agreement
 | 
			
		||||
 * @variant		Revised public key authentication (aggressive mode),   
 | 
			
		||||
 *				Diffie-Hellman token encrypted together with identity  
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYID prf(H(Ni,Nr),Ci,Cr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
#define HASH1 H({R, pk(R)}sk(s))
 | 
			
		||||
#define Nei prf(Ni, Ci)
 | 
			
		||||
#define Ner prf(Nr, Cr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!O1( O, O, {HASH_Ii}SKi );
 | 
			
		||||
		send_!O2( O, O, {HASH_Ir}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!O3( O, O, {HASH_Rr}SKr );
 | 
			
		||||
		send_!O4( O, O, {HASH_Ri}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-pk2-m2(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list );
 | 
			
		||||
		recv_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		send_3( I, R, Ci, Cr, {Ni}pk(R), {g(i),I}Nei );
 | 
			
		||||
		recv_4( R, I, Ci, Cr, {Nr}pk(I), {Gr,R}Ner );
 | 
			
		||||
		claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!5( I, R, Ci, Cr, {HASH_Ii}SKi );
 | 
			
		||||
		recv_!6( R, I, Ci, Cr, {HASH_Ri}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, g(i),Gr,Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list );
 | 
			
		||||
		send_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		recv_3( I, R, Ci, Cr, {Ni}pk(R), {Gi,I}Nei );
 | 
			
		||||
		send_4( R, I, Ci, Cr, {Nr}pk(I), {g(r),R}Ner );
 | 
			
		||||
		recv_!5( I, R, Ci, Cr, {HASH_Ir}SKr );
 | 
			
		||||
		claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
		send_!6( R, I, Ci, Cr, {HASH_Rr}SKr );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										94
									
								
								gui/Protocols/IKE/ikev1-psk-a.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								gui/Protocols/IKE/ikev1-psk-a.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,94 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Pre-shared key authentication (aggressive mode)        
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1_PSK__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HASH_Ii prf(k(I,R), Ni, Nr, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(k(R,I), Ni, Nr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(k(I,R), Ni, Nr, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(k(R,I), Ni, Nr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, HASH_Rr );
 | 
			
		||||
		send_!O2( O, O, HASH_Ri );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, HASH_Ii );
 | 
			
		||||
		send_!O4( O, O, HASH_Ir );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-psk-a(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list, g(i), Ni, I );
 | 
			
		||||
		recv_!2( R, I, Ci, Cr, algo, Gr, Nr, R, HASH_Ri );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
		send_!3( I, R, Ci, Cr, HASH_Ii );
 | 
			
		||||
		
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list, Gi, Ni, I );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
		send_!2( R, I, Ci, Cr, algo, g(r), Nr, R, HASH_Rr );
 | 
			
		||||
		recv_!3( I, R, Ci, Cr, HASH_Ir );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										101
									
								
								gui/Protocols/IKE/ikev1-psk-m-perlman.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								gui/Protocols/IKE/ikev1-psk-m-perlman.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,101 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Pre-shared key authentication (main mode) incorporating
 | 
			
		||||
 *				a fix by Perlman et. al.                               
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1_PSK__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HASH_Ii prf(k(I,R), Ni, Nr, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(k(R,I), Ni, Nr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(k(I,R), Ni, Nr, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(k(R,I), Ni, Nr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!O1( O, O, {I, HASH_Ii}Zi );
 | 
			
		||||
		send_!O2( O, O, {I, HASH_Ir}Zr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!O3( O, O, {R, HASH_Rr}Zr );
 | 
			
		||||
		send_!O4( O, O, {R, HASH_Ri}Zi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-psk-m-perlman(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list );
 | 
			
		||||
		recv_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		send_3( I, R, Ci, Cr, g(i), Ni );
 | 
			
		||||
		recv_4( R, I, Ci, Cr, Gr, Nr );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
		send_!5( I, R, Ci, Cr, {I, HASH_Ii}Zi );
 | 
			
		||||
		recv_!6( R, I, Ci, Cr, {R, HASH_Ri}Zi );
 | 
			
		||||
		
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list );
 | 
			
		||||
		send_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		recv_3( I, R, Ci, Cr, Gi, Ni );
 | 
			
		||||
		send_4( R, I, Ci, Cr, g(r), Nr );
 | 
			
		||||
		recv_!5( I, R, Ci, Cr, {I, HASH_Ir}Zr );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
		send_!6( R, I, Ci, Cr, {R, HASH_Rr}Zr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										100
									
								
								gui/Protocols/IKE/ikev1-psk-m.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								gui/Protocols/IKE/ikev1-psk-m.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,100 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Pre-shared key authentication (main mode)              
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1_PSK__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYID prf(k(I,R),Ni,Nr)
 | 
			
		||||
#define HASH_Ii prf(k(I,R), Ni, Nr, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(k(R,I), Ni, Nr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(k(I,R), Ni, Nr, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(k(R,I), Ni, Nr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!O1( O, O, {I, HASH_Ii}SKi );
 | 
			
		||||
		send_!O2( O, O, {I, HASH_Ir}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!O3( O, O, {R, HASH_Rr}SKr );
 | 
			
		||||
		send_!O4( O, O, {R, HASH_Ri}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
protocol ikev1-psk-m(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list );
 | 
			
		||||
		recv_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		send_3( I, R, Ci, Cr, g(i), Ni );
 | 
			
		||||
		recv_4( R, I, Ci, Cr, Gr, Nr );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
		send_!5( I, R, Ci, Cr, {I, HASH_Ii}SKi );
 | 
			
		||||
		recv_!6( R, I, Ci, Cr, {R, HASH_Ri}SKi );
 | 
			
		||||
		
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list );
 | 
			
		||||
		send_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		recv_3( I, R, Ci, Cr, Gi, Ni );
 | 
			
		||||
		send_4( R, I, Ci, Cr, g(r), Nr );
 | 
			
		||||
		recv_!5( I, R, Ci, Cr, {I, HASH_Ir}SKr );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
		send_!6( R, I, Ci, Cr, {R, HASH_Rr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										102
									
								
								gui/Protocols/IKE/ikev1-quick-noid.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								gui/Protocols/IKE/ikev1-quick-noid.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,102 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Quick mode (pfs), without optional identities          
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1_QUICK__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* k(I,R)=k(R,I) equal Ka from the spec */
 | 
			
		||||
#define HASH1i prf(k(I,R), mid, list, Ni, g(i))
 | 
			
		||||
#define HASH1r prf(k(R,I), mid, list, Ni, Gi)
 | 
			
		||||
#define HASH2i prf(k(I,R), mid, Ni, algo, Nr, Gr)
 | 
			
		||||
#define HASH2r prf(k(R,I), mid, Ni, algo, Nr, g(r))
 | 
			
		||||
#define HASH3i prf(k(I,R), mid, Ni, Nr)
 | 
			
		||||
#define HASH3r prf(k(R,I), mid, Ni, Nr)
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling k(I,R) = k(R,I).
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var mid, i, r, Ni, Nr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 1
 | 
			
		||||
		recv_!O1( O, O, {HASH1i, list, Ni, g(i)}k(I,R) );
 | 
			
		||||
		send_!O2( O, O, {HASH1r, list, Ni, Gi}k(R,I) );
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O3( O, O, {HASH2r, algo, Nr, g(r)}k(R,I) );
 | 
			
		||||
		send_!O4( O, O, {HASH2i, algo, Nr, Gr}k(I,R) );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O5( O, O, {HASH3i}k(I,R) );
 | 
			
		||||
		send_!O6( O, O, {HASH3r}k(R,I) );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-quick-noid(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci, mid:	Nonce;
 | 
			
		||||
		var   Nr, Cr:			Nonce;
 | 
			
		||||
		var   Gr:				Ticket;
 | 
			
		||||
 | 
			
		||||
		send_!1( I, R, mid, {HASH1i, list, Ni, g(i)}k(I,R) );
 | 
			
		||||
		recv_!2( R, I, mid, {HASH2i, algo, Nr, Gr}k(I,R) );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr, g(i), Gr );
 | 
			
		||||
		send_!3( I, R, mid, {HASH3i}k(I,R) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr, g(i), Gr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci, mid:	Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_!1( I, R, mid, {HASH1r, list, Ni, Gi}k(R,I) );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr, Gi, g(r) );
 | 
			
		||||
		send_!2( R, I, mid, {HASH2r, algo, Nr, g(r)}k(R,I) );
 | 
			
		||||
		recv_!3( I, R, mid, {HASH3r}k(R,I) );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr, Gi, g(r) );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
// TODO: Incorporate into various phase 1 protocols (see spec for adaptions)
 | 
			
		||||
// NOTE: If incorporated in phase 1, make sure to model with and without optional identities in msg 2 & 3
 | 
			
		||||
							
								
								
									
										96
									
								
								gui/Protocols/IKE/ikev1-quick-nopfs.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								gui/Protocols/IKE/ikev1-quick-nopfs.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,96 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication
 | 
			
		||||
 *				and Key Agreement
 | 
			
		||||
 * @variant		Quick mode (no pfs), without optional identities       
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1_QUICK_NOPFS__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* k(I,R)=k(R,I) equal Ka from the spec */
 | 
			
		||||
#define HASH1i prf(k(I,R), mid, list, Ni)
 | 
			
		||||
#define HASH1r prf(k(R,I), mid, list, Ni)
 | 
			
		||||
#define HASH2i prf(k(I,R), mid, Ni, algo, Nr)
 | 
			
		||||
#define HASH2r prf(k(R,I), mid, Ni, algo, Nr)
 | 
			
		||||
#define HASH3i prf(k(I,R), mid, Ni, Nr)
 | 
			
		||||
#define HASH3r prf(k(R,I), mid, Ni, Nr)
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling k(I,R) = k(R,I).
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
	role O {
 | 
			
		||||
		var mid, Ni, Nr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 1
 | 
			
		||||
		recv_!O1( O, O, {HASH1i, list, Ni}k(I,R) );
 | 
			
		||||
		send_!O2( O, O, {HASH1r, list, Ni}k(R,I) );
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O3( O, O, {HASH2r, algo, Nr}k(R,I) );
 | 
			
		||||
		send_!O4( O, O, {HASH2i, algo, Nr}k(I,R) );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O5( O, O, {HASH3i}k(I,R) );
 | 
			
		||||
		send_!O6( O, O, {HASH3r}k(R,I) );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-quick-nopfs(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci, mid:	Nonce;
 | 
			
		||||
		var   Nr, Cr:			Nonce;
 | 
			
		||||
 | 
			
		||||
		send_!1( I, R, mid, {HASH1i, list, Ni}k(I,R) );
 | 
			
		||||
		recv_!2( R, I, mid, {HASH2i, algo, Nr}k(I,R) );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr );
 | 
			
		||||
		send_!3( I, R, mid, {HASH3i}k(I,R) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci, mid:	Nonce;
 | 
			
		||||
 | 
			
		||||
		recv_!1( I, R, mid, {HASH1r, list, Ni}k(R,I) );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr );
 | 
			
		||||
		send_!2( R, I, mid, {HASH2r, algo, Nr}k(R,I) );
 | 
			
		||||
		recv_!3( I, R, mid, {HASH3r}k(R,I) );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
// TODO: Incorporate into various phase 1 protocols (see spec for adaptions)
 | 
			
		||||
// NOTE: If incorporated in phase 1, make sure to model with and without optional identities in msg 2 & 3 
 | 
			
		||||
							
								
								
									
										70
									
								
								gui/Protocols/IKE/ikev1-quick.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								gui/Protocols/IKE/ikev1-quick.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,70 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication
 | 
			
		||||
 *				and Key Agreement
 | 
			
		||||
 * @variant		Quick mode (pfs), optional identities included         
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1_QUICK__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* k(I,R) equals Ka from the spec */
 | 
			
		||||
#define HASH1i prf(k(I,R), mid, list, Ni, g(i), I, R)
 | 
			
		||||
#define HASH1r prf(k(R,I), mid, list, Ni, Gi, I, R)
 | 
			
		||||
#define HASH2i prf(k(I,R), mid, Ni, algo, Nr, Gr, I, R)
 | 
			
		||||
#define HASH2r prf(k(R,I), mid, Ni, algo, Nr, g(r), I, R)
 | 
			
		||||
#define HASH3i prf(k(I,R), mid, Ni, Nr)
 | 
			
		||||
#define HASH3r prf(k(R,I), mid, Ni, Nr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-quick(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci, mid, list:	Nonce;
 | 
			
		||||
		var   Nr, Cr, algo:			Nonce;
 | 
			
		||||
		var   Gr:					Ticket;
 | 
			
		||||
 | 
			
		||||
		send_!1( I, R, mid, {HASH1i, list, Ni, g(i), I, R}k(I,R) );
 | 
			
		||||
		recv_!2( R, I, mid, {HASH2i, algo, Nr, Gr, I, R}k(I,R) );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr, g(i), Gr );
 | 
			
		||||
		send_!3( I, R, mid, {HASH3i}k(I,R) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr, g(i), Gr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr, algo:		Nonce;
 | 
			
		||||
		var    Ni, Ci, mid, list:	Nonce;
 | 
			
		||||
		var    Gi:					Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_!1( I, R, mid, {HASH1r, list, Ni, Gi, I, R}k(I,R) );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr, Gi, g(r) );
 | 
			
		||||
		send_!2( R, I, mid, {HASH2r, algo, Nr, g(r), I, R}k(I,R) );
 | 
			
		||||
		recv_!3( I, R, mid, {HASH3r}k(I,R) );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr, Gi, g(r) );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
// TODO: Incorporate into various phase 1 protocols (see spec for adaptions)
 | 
			
		||||
// NOTE: If incorporated in phase 1, make sure to model with and without optional identities in msg 2 & 3
 | 
			
		||||
							
								
								
									
										99
									
								
								gui/Protocols/IKE/ikev1-sig-a-perlman1.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								gui/Protocols/IKE/ikev1-sig-a-perlman1.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,99 @@
 | 
			
		||||
/***********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                  
 | 
			
		||||
 * @reference	RFC 2409,                                               
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication   
 | 
			
		||||
 *				and Key Agreement                                       
 | 
			
		||||
 * @variant		Digital signature authentication (aggressive mode) with 
 | 
			
		||||
 *				a modification suggested by Perlman et al. (last msg not
 | 
			
		||||
 *				encrypted)                                              
 | 
			
		||||
 ***********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HDR (Ci,Cr)
 | 
			
		||||
#define SKEYIDi prf(Ni,Nr,Zi)
 | 
			
		||||
#define SKEYIDr prf(Ni,Nr,Zr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, {R}SKr, {HASH_Rr}sk(R) );
 | 
			
		||||
		send_!O2( O, O, {R}SKi, {HASH_Ri}sk(R) );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, {I}SKi, {HASH_Ii}sk(I) );
 | 
			
		||||
		send_!O4( O, O, {I}SKr, {HASH_Ir}sk(I) );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-sig-a-perlman1(I, R)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list, g(i), Ni );
 | 
			
		||||
		recv_!2( R, I, HDR, algo, Gr, Nr, {R}SKi, {HASH_Ri}sk(R) );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
		send_!3( I, R, HDR, {I}SKi, {HASH_Ii}sk(I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list, Gi, Ni );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
		send_!2( R, I, HDR, algo, g(r), Nr, R, {R}SKr, {HASH_Rr}sk(R) );
 | 
			
		||||
		recv_!3( I, R, HDR, {I}SKr, {HASH_Ir}sk(I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										99
									
								
								gui/Protocols/IKE/ikev1-sig-a-perlman2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								gui/Protocols/IKE/ikev1-sig-a-perlman2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,99 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Digital signature authentication (aggressive mode) with
 | 
			
		||||
 *				a modification suggested by Perlman et al. (last msg   
 | 
			
		||||
 *				encrypted)                                             
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HDR (Ci,Cr)
 | 
			
		||||
#define SKEYIDi prf(Ni,Nr,Zi)
 | 
			
		||||
#define SKEYIDr prf(Ni,Nr,Zr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, {R}SKr, {HASH_Rr}sk(R) );
 | 
			
		||||
		send_!O2( O, O, {R}SKi, {HASH_Ri}sk(R) );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, {I, {HASH_Ii}sk(I)}SKi );
 | 
			
		||||
		send_!O4( O, O, {I, {HASH_Ir}sk(I)}SKr );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-sig-a-perlman2(I, R)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list, g(i), Ni );
 | 
			
		||||
		recv_!2( R, I, HDR, algo, Gr, Nr, {R}SKi, {HASH_Ri}sk(R) );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
		send_!3( I, R, HDR, {I, {HASH_Ii}sk(I)}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list, Gi, Ni );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
		send_!2( R, I, HDR, algo, g(r), Nr, R, {R}SKr, {HASH_Rr}sk(R) );
 | 
			
		||||
		recv_!3( I, R, HDR, {I, {HASH_Ir}sk(I)}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										98
									
								
								gui/Protocols/IKE/ikev1-sig-a1.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								gui/Protocols/IKE/ikev1-sig-a1.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,98 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Digital signature authentication (aggressive mode)
 | 
			
		||||
 *				where the last message is not encrypted                 
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HDR (Ci,Cr)
 | 
			
		||||
#define SKEYIDi prf(Ni,Nr,Zi)
 | 
			
		||||
#define SKEYIDr prf(Ni,Nr,Zr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, {HASH_Rr}sk(R) );
 | 
			
		||||
		send_!O2( O, O, {HASH_Ri}sk(R) );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, {HASH_Ii}sk(I) );
 | 
			
		||||
		send_!O4( O, O, {HASH_Ir}sk(I) );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-sig-a1(I, R)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list, g(i), Ni, I );
 | 
			
		||||
		recv_!2( R, I, HDR, algo, Gr, Nr, R, {HASH_Ri}sk(R) );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
		send_!3( I, R, HDR, {HASH_Ii}sk(I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list, Gi, Ni, I );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
		send_!2( R, I, HDR, algo, g(r), Nr, R, {HASH_Rr}sk(R) );
 | 
			
		||||
		recv_!3( I, R, HDR, {HASH_Ir}sk(I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										99
									
								
								gui/Protocols/IKE/ikev1-sig-a2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								gui/Protocols/IKE/ikev1-sig-a2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,99 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Digital signature authentication (aggressive mode)
 | 
			
		||||
 *				where thelast message is encrypted with the session key
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HDR (Ci,Cr)
 | 
			
		||||
#define SKEYIDi prf(Ni,Nr,Zi)
 | 
			
		||||
#define SKEYIDr prf(Ni,Nr,Zr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, {HASH_Rr}sk(R) );
 | 
			
		||||
		send_!O2( O, O, {HASH_Ri}sk(R) );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, {{HASH_Ii}sk(I)}SKi );
 | 
			
		||||
		send_!O4( O, O, {{HASH_Ir}sk(I)}SKr );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-sig-a2(I, R)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list, g(i), Ni, I );
 | 
			
		||||
		recv_!2( R, I, HDR, algo, Gr, Nr, R, {HASH_Ri}sk(R) );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
		send_!3( I, R, HDR, {{HASH_Ii}sk(I)}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list, Gi, Ni, I );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
		send_!2( R, I, HDR, algo, g(r), Nr, R, {HASH_Rr}sk(R) );
 | 
			
		||||
		recv_!3( I, R, HDR, {{HASH_Ir}sk(I)}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										100
									
								
								gui/Protocols/IKE/ikev1-sig-m-perlman.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								gui/Protocols/IKE/ikev1-sig-m-perlman.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,100 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Digital signature authentication (aggressive mode) with
 | 
			
		||||
 *				a modification suggested by Perlman et al.             
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SKEYIDi prf(Ni,Nr,Zi)
 | 
			
		||||
#define SKEYIDr prf(Ni,Nr,Zr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!O1( O, O, {R, {HASH_Rr}sk(R)}SKr );
 | 
			
		||||
		send_!O2( O, O, {R, {HASH_Ri}sk(R)}SKi );
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!O3( O, O, {I, {HASH_Ii}sk(I)}SKi );
 | 
			
		||||
		send_!O4( O, O, {I, {HASH_Ir}sk(I)}SKr );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev1-sig-m-perlman(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list );
 | 
			
		||||
		recv_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		send_3( I, R, Ci, Cr, g(i), Ni );
 | 
			
		||||
		recv_!4( R, I, Ci, Cr, Gr, Nr, {R, {HASH_Ri}sk(R)}SKi );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
		send_!5( I, R, Ci, Cr, {I, {HASH_Ii}sk(I)}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list );
 | 
			
		||||
		send_2( R, I, Ci, Cr, algo );
 | 
			
		||||
		recv_3( I, R, Ci, Cr, Gi, Ni );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
		send_!4( R, I, Ci, Cr, g(r), Nr, {R, {HASH_Rr}sk(R)}SKr );
 | 
			
		||||
		recv_!5( I, R, Ci, Cr, {I, {HASH_Ir}sk(I)}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										102
									
								
								gui/Protocols/IKE/ikev1-sig-m.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								gui/Protocols/IKE/ikev1-sig-m.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,102 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv1)                 
 | 
			
		||||
 * @reference	RFC 2409,                                              
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication  
 | 
			
		||||
 *				and Key Agreement                                      
 | 
			
		||||
 * @variant		Digital signature authentication (aggressive mode)     
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV1__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HDR (Ci,Cr)
 | 
			
		||||
#define SKEYIDi prf(Ni,Nr,Zi)
 | 
			
		||||
#define SKEYIDr prf(Ni,Nr,Zr)
 | 
			
		||||
#define HASH_Ii prf(Ni, Nr, Zi, g(i), Gr, Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ir prf(Ni, Nr, Zr, Gi, g(r), Ci, Cr, list, I)
 | 
			
		||||
#define HASH_Ri prf(Ni, Nr, Zi, Gr, g(i), Cr, Ci, list, R)
 | 
			
		||||
#define HASH_Rr prf(Ni, Nr, Zr, g(r), Gi, Cr, Ci, list, R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!O1( O, O, {I, {HASH_Ii}sk(I)}SKi );
 | 
			
		||||
		send_!O2( O, O, {I, {HASH_Ir}sk(I)}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!O3( O, O, {R, {HASH_Rr}sk(R)}SKr );
 | 
			
		||||
		send_!O4( O, O, {R, {HASH_Ri}sk(R)}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
protocol ikev1-sig-m(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, list );
 | 
			
		||||
		recv_2( R, I, HDR, algo );
 | 
			
		||||
		send_3( I, R, HDR, g(i), Ni );
 | 
			
		||||
		recv_4( R, I, HDR, Gr, Nr );
 | 
			
		||||
		claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
		send_!5( I, R, HDR, {I, {HASH_Ii}sk(I)}SKi );
 | 
			
		||||
		recv_!6( R, I, HDR, {R, {HASH_Ri}sk(R)}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni, Nr, g(i), Gr, Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, list );
 | 
			
		||||
		send_2( R, I, HDR, algo );
 | 
			
		||||
		recv_3( I, R, HDR, Gi, Ni );
 | 
			
		||||
		send_4( R, I, HDR, g(r), Nr );
 | 
			
		||||
		recv_!5( I, R, HDR, {I, {HASH_Ir}sk(I)}SKr );
 | 
			
		||||
		claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
		send_!6( R, I, HDR, {R, {HASH_Rr}sk(R)}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										78
									
								
								gui/Protocols/IKE/ikev2-child-nopfs.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								gui/Protocols/IKE/ikev2-child-nopfs.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,78 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @subprotocol IKE Create Child SA                                    
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		No perfect forward secrecy support                     
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2_CHILD_NOPFS__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
const SA3: Nonce;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling k(I,R) = k(R,I).
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
	role O {
 | 
			
		||||
		var Ni, Nr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 1
 | 
			
		||||
		recv_!O1( O, O, {SA3, Ni}k(I,R) );
 | 
			
		||||
		send_!O2( O, O, {SA3, Ni}k(R,I) );
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O3( O, O, {SA3, Nr}k(R,I) );
 | 
			
		||||
		send_!O4( O, O, {SA3, Nr}k(I,R) );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-child-nopfs(I, R)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh Ni:	Nonce;
 | 
			
		||||
		var   Nr:	Nonce;
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		claim( I, Running, R,Ni );
 | 
			
		||||
		send_!1( I, R, {SA3, Ni}k(I,R) );
 | 
			
		||||
		recv_!2( R, I, {SA3, Nr}k(I,R) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,Ni,Nr );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh Nr:	Nonce;
 | 
			
		||||
		var   Ni:	Nonce;
 | 
			
		||||
 | 
			
		||||
		recv_!1( I, R, {SA3, Ni}k(R,I) );
 | 
			
		||||
		claim( R, Running, I,Ni,Nr );
 | 
			
		||||
		send_!2( R, I, {SA3, Nr}k(R,I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I,Ni );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										87
									
								
								gui/Protocols/IKE/ikev2-child.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								gui/Protocols/IKE/ikev2-child.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,87 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @subprotocol IKE Create Child SA                                    
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Supports perfect forward secrecy                       
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2_CHILD__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype SecurityAssociation;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling k(I,R) = k(R,I).
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 1
 | 
			
		||||
		recv_!O1( O, O, {SA3, Ni, g(i)}k(I,R) );
 | 
			
		||||
		send_!O2( O, O, {SA3, Ni, g(i)}k(R,I) );
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O3( O, O, {SA3, Nr, Gr}k(R,I) );
 | 
			
		||||
		send_!O4( O, O, {SA3, Nr, Gr}k(I,R) );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Note: SPIs not modeled as they would lead to trivial attacks where the adversary 
 | 
			
		||||
// tampers with the SPIs (they are not subsequently authenticated)
 | 
			
		||||
protocol ikev2-child(I, R)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni:	Nonce;
 | 
			
		||||
		var   Nr:		Nonce;
 | 
			
		||||
		var   Gr:		Ticket;
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		claim( I, Running, R,Ni,g(i) );
 | 
			
		||||
		send_!1( I, R, {SA3, Ni, g(i)}k(I,R) );
 | 
			
		||||
		recv_!2( R, I, {SA3, Nr, Gr}k(I,R) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,Ni,g(i),Nr,Gr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, Nr:	Nonce;
 | 
			
		||||
		var   Ni:		Nonce;
 | 
			
		||||
		var   Gi:		Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_!1( I, R, {SA3, Ni, Gi}k(R,I) );
 | 
			
		||||
		claim( R, Running, I,Ni,Gi,Nr,g(r) );
 | 
			
		||||
		send_!2( R, I, {SA3, Nr, g(r)}k(R,I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I,Ni,Gi );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										131
									
								
								gui/Protocols/IKE/ikev2-eap.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								gui/Protocols/IKE/ikev2-eap.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,131 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @subprotocol IKE EAP                                                
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Includes optional payloads                             
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii {SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I)}sk(I)
 | 
			
		||||
#define AUTHir {SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I)}sk(I)
 | 
			
		||||
#define AUTHri {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R)}sk(R)
 | 
			
		||||
#define AUTHrr {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R)}sk(R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, r, Ni, Nr, SPIi, SPIr, EAP, EAPOK: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, R, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, R, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, EAP}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, EAP}SKi );
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!E5( E, E, {EAP}SKi );
 | 
			
		||||
		send_!E6( E, E, {EAP}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!E7( E, E, {EAPOK}SKr );
 | 
			
		||||
		send_!E8( E, E, {EAPOK}SKi );
 | 
			
		||||
 | 
			
		||||
		// msg 7
 | 
			
		||||
		recv_!E9( E, E, {AUTHii}SKi );
 | 
			
		||||
		send_!EA( E, E, {AUTHir}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 8
 | 
			
		||||
		send_!EB( E, E, {AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!EC( E, E, {AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-eap(I, R)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, SPIr:		Nonce;
 | 
			
		||||
		var   EAP, EAPOK:	Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, HDR, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		send_!3( I, R, HDR, {I, R, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, HDR, {R, AUTHri, EAP}SKi );
 | 
			
		||||
		send_!5( I, R, HDR, {EAP}SKi );
 | 
			
		||||
		recv_!6( R, I, HDR, {EAPOK}SKi );
 | 
			
		||||
		claim( I, Running, R, Ni,g(i),Nr,Gr,TSi,TSr,EAP,EAPOK );
 | 
			
		||||
		send_!7( I, R, HDR, {AUTHii}SKi );
 | 
			
		||||
		recv_!8( R, I, HDR, {AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni,g(i),Nr,Gr,TSi,TSr,EAP,EAPOK );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh EAP, EAPOK:	Nonce;
 | 
			
		||||
		fresh r, Nr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, SPIi:		Nonce;
 | 
			
		||||
		var   Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, HDR, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, HDR, {I, R, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!4( R, I, HDR, {R, AUTHrr, EAP}SKr );
 | 
			
		||||
		recv_!5( I, R, HDR, {EAP}SKr );
 | 
			
		||||
		send_!6( R, I, HDR, {EAPOK}SKr );
 | 
			
		||||
		recv_!7( I, R, HDR, {AUTHir}SKr );
 | 
			
		||||
		claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr,EAP,EAPOK );
 | 
			
		||||
		send_!8( R, I, HDR, {AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr,EAP,EAPOK );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										138
									
								
								gui/Protocols/IKE/ikev2-eap2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								gui/Protocols/IKE/ikev2-eap2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,138 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @subprotocol IKE EAP                                                
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Excludes optional payloads                             
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Modeling notes:
 | 
			
		||||
 * - It's not clear what to put in the EAP payloads; we now model them
 | 
			
		||||
 * as nonces, but maybe it is better to view them as a function of the
 | 
			
		||||
 * actor.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii {SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I)}sk(I)
 | 
			
		||||
#define AUTHir {SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I)}sk(I)
 | 
			
		||||
#define AUTHri {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R)}sk(R)
 | 
			
		||||
#define AUTHrr {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R)}sk(R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, r, Ni, Nr, SPIi, SPIr, EAP, EAPOK: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, EAP}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, EAP}SKi );
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!E5( E, E, {EAP}SKi );
 | 
			
		||||
		send_!E6( E, E, {EAP}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!E7( E, E, {EAPOK}SKr );
 | 
			
		||||
		send_!E8( E, E, {EAPOK}SKi );
 | 
			
		||||
 | 
			
		||||
		// msg 7
 | 
			
		||||
		recv_!E9( E, E, {AUTHii}SKi );
 | 
			
		||||
		send_!EA( E, E, {AUTHir}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 8
 | 
			
		||||
		send_!EB( E, E, {AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!EC( E, E, {AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-eap2(I, R)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, SPIr:		Nonce;
 | 
			
		||||
		var   EAP, EAPOK:	Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, HDR, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		send_!3( I, R, HDR, {I, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, HDR, {R, AUTHri, EAP}SKi );
 | 
			
		||||
		send_!5( I, R, HDR, {EAP}SKi );
 | 
			
		||||
		recv_!6( R, I, HDR, {EAPOK}SKi );
 | 
			
		||||
		claim( I, Running, R, Ni,g(i),Nr,Gr,TSi,TSr,EAP,EAPOK );
 | 
			
		||||
		send_!7( I, R, HDR, {AUTHii}SKi );
 | 
			
		||||
		recv_!8( R, I, HDR, {AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni,g(i),Nr,Gr,TSi,TSr,EAP,EAPOK );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh EAP, EAPOK:	Nonce;
 | 
			
		||||
		fresh r, Nr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, SPIi:		Nonce;
 | 
			
		||||
		var   Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, HDR, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, HDR, {I, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!4( R, I, HDR, {R, AUTHrr, EAP}SKr );
 | 
			
		||||
		recv_!5( I, R, HDR, {EAP}SKr );
 | 
			
		||||
		send_!6( R, I, HDR, {EAPOK}SKr );
 | 
			
		||||
		recv_!7( I, R, HDR, {AUTHir}SKr );
 | 
			
		||||
		claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr,EAP,EAPOK );
 | 
			
		||||
		send_!8( R, I, HDR, {AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr,EAP,EAPOK );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										104
									
								
								gui/Protocols/IKE/ikev2-mac.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								gui/Protocols/IKE/ikev2-mac.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @subprotocol MAC authenticated IKEv2                                
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Includes optional payloads                             
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I))
 | 
			
		||||
#define AUTHir MAC(k(R,I), SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I))
 | 
			
		||||
#define AUTHri MAC(k(I,R), SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R))
 | 
			
		||||
#define AUTHrr MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, r, Ni, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-mac(I, R)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, SPIr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, HDR, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		claim( I, Running, R, Ni,g(i),Nr,Gr,TSi,TSr);
 | 
			
		||||
		send_!3( I, R, HDR, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, HDR, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni,g(i),Nr,Gr,TSi,TSr);
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, Nr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, SPIi:		Nonce;
 | 
			
		||||
		var   Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, HDR, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, HDR, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr);
 | 
			
		||||
		send_!4( R, I, HDR, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										104
									
								
								gui/Protocols/IKE/ikev2-mac2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								gui/Protocols/IKE/ikev2-mac2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @subprotocol MAC authenticated IKEv2                                
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Excludes optional payloads                             
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I))
 | 
			
		||||
#define AUTHir MAC(k(R,I), SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I))
 | 
			
		||||
#define AUTHri MAC(k(I,R), SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R))
 | 
			
		||||
#define AUTHrr MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, r, Ni, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-mac2(I, R)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, SPIr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, HDR, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		claim( I, Running, R, Ni,g(i),Nr,Gr,TSi,TSr );
 | 
			
		||||
		send_!3( I, R, HDR, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, HDR, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R, Ni,g(i),Nr,Gr,TSi,TSr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, Nr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, SPIi:		Nonce;
 | 
			
		||||
		var   Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, HDR, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, HDR, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr );
 | 
			
		||||
		send_!4( R, I, HDR, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										104
									
								
								gui/Protocols/IKE/ikev2-mactosig.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								gui/Protocols/IKE/ikev2-mactosig.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Initiator authenticates itself using message           
 | 
			
		||||
 *				authentication codes while responder uses digital      
 | 
			
		||||
 *				signatures. Includes optional payloads                 
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I))
 | 
			
		||||
#define AUTHir MAC(k(R,I), SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I))
 | 
			
		||||
#define AUTHri {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R)}sk(R)
 | 
			
		||||
#define AUTHrr {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R)}sk(R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, r, Ni, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-mactosig(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, SPIr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, SPIi, SPIr, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		claim( I, Running, R,Ni,g(i),Nr,Gr,TSi,TSr );
 | 
			
		||||
		send_!3( I, R, SPIi, SPIr, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, SPIi, SPIr, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,Ni,g(i),Nr,Gr,TSi,TSr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, Nr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, SPIi:		Nonce;
 | 
			
		||||
		var   Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, SPIi, SPIr, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, SPIi, SPIr, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr );
 | 
			
		||||
		send_!4( R, I, SPIi, SPIr, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										103
									
								
								gui/Protocols/IKE/ikev2-mactosig2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								gui/Protocols/IKE/ikev2-mactosig2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,103 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Initiator authenticates itself using message           
 | 
			
		||||
 *				authentication codes while responder uses digital      
 | 
			
		||||
 *				signatures. Excludes optional payloads
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I))
 | 
			
		||||
#define AUTHir MAC(k(R,I), SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I))
 | 
			
		||||
#define AUTHri {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R)}sk(R)
 | 
			
		||||
#define AUTHrr {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R)}sk(R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, r, Ni, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
protocol ikev2-mactosig2(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, SPIr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, SPIi, SPIr, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		claim( I, Running, R,Ni,g(i),Nr,Gr,TSi,TSr );
 | 
			
		||||
		send_!3( I, R, SPIi, SPIr, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, SPIi, SPIr, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,Ni,g(i),Nr,Gr,TSi,TSr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, Nr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, SPIi:		Nonce;
 | 
			
		||||
		var   Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, SPIi, SPIr, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, SPIi, SPIr, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr );
 | 
			
		||||
		send_!4( R, I, SPIi, SPIr, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										138
									
								
								gui/Protocols/IKE/ikev2-sig-child-composed.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								gui/Protocols/IKE/ikev2-sig-child-composed.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,138 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Combination of signature authenticated IKEv2 and       
 | 
			
		||||
 *				CREATE_CHILD_SA, includes optional payloads            
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii {SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I)}sk(I)
 | 
			
		||||
#define AUTHir {SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I)}sk(I)
 | 
			
		||||
#define AUTHri {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R)}sk(R)
 | 
			
		||||
#define AUTHrr {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R)}sk(R)
 | 
			
		||||
#define KEYMATi KDF(Ni, Nr, Zi, h(Gt,j), Mi, Mr)
 | 
			
		||||
#define KEYMATr KDF(Ni, Nr, Zr, h(Gi,t), Mi, Mr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!E5( E, E, {SA3, Mi, g(j), TSi, TSr}SKi );
 | 
			
		||||
		send_!E6( E, E, {SA3, Mi, g(j), TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!E7( E, E, {SA3, Mr, g(t), TSi, TSr}SKr );
 | 
			
		||||
		send_!E8( E, E, {SA3, Mr, g(t), TSi, TSr}SKr );
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
protocol @ora(S) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gj g(j)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
#define Gt g(t)
 | 
			
		||||
	role S {
 | 
			
		||||
		var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
 | 
			
		||||
		recv_!S1( S, S, KDF(Ni, Nr, Zi, h(Gt,j), Mi, Mr) );
 | 
			
		||||
		send_!S2( S, S, KDF(Ni, Nr, Zr, h(Gj,t), Mi, Mr) );
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gj
 | 
			
		||||
#undef Gr
 | 
			
		||||
#undef Gt
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-sig-child(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, j, Ni, Mi, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, Mr, SPIr:			Nonce;
 | 
			
		||||
		var   Gr, Gt:				Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, HDR, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		send_!3( I, R, HDR, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, HDR, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* CREATE_CHILD_SA */
 | 
			
		||||
		claim( I, Running, R,g(i),g(j),Gr );
 | 
			
		||||
		send_!5( I, R, HDR, {SA3, Mi, g(j), TSi, TSr}SKi );
 | 
			
		||||
		recv_!6( R, I, HDR, {SA3, Mr, Gt,   TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
		claim( I, SKR, KEYMATi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,g(i),g(j),Gr,Gt );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, t, Nr, Mr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, Mi, SPIi:			Nonce;
 | 
			
		||||
		var   Gi, Gj:				Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, HDR, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, HDR, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!4( R, I, HDR, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* CREATE_CHILD_SA */
 | 
			
		||||
		recv_!5( I, R, HDR, {SA3, Mi, Gj,   TSi, TSr}SKr );
 | 
			
		||||
		claim( R, Running, I,Gi,Gj,g(r),g(t) );
 | 
			
		||||
		send_!6( R, I, HDR, {SA3, Mr, g(t), TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
		claim( R, SKR, KEYMATr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I,Gi,Gj,g(r) );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										138
									
								
								gui/Protocols/IKE/ikev2-sig-child.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								gui/Protocols/IKE/ikev2-sig-child.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,138 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Combination of signature authenticated IKEv2 and       
 | 
			
		||||
 *				CREATE_CHILD_SA, includes optional payloads            
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii {SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I)}sk(I)
 | 
			
		||||
#define AUTHir {SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I)}sk(I)
 | 
			
		||||
#define AUTHri {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R)}sk(R)
 | 
			
		||||
#define AUTHrr {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R)}sk(R)
 | 
			
		||||
#define KEYMATi KDF(Ni, Nr, Zi, h(Gt,j), Mi, Mr)
 | 
			
		||||
#define KEYMATr KDF(Ni, Nr, Zr, h(Gi,t), Mi, Mr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!E5( E, E, {SA3, Mi, g(j), TSi, TSr}SKi );
 | 
			
		||||
		send_!E6( E, E, {SA3, Mi, g(j), TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!E7( E, E, {SA3, Mr, g(t), TSi, TSr}SKr );
 | 
			
		||||
		send_!E8( E, E, {SA3, Mr, g(t), TSi, TSr}SKr );
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
protocol @ora(S) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gj g(j)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
#define Gt g(t)
 | 
			
		||||
	role S {
 | 
			
		||||
		var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
 | 
			
		||||
		recv_!S1( S, S, KDF(Ni, Nr, Zi, h(Gt,j), Mi, Mr) );
 | 
			
		||||
		send_!S2( S, S, KDF(Ni, Nr, Zr, h(Gj,t), Mi, Mr) );
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gj
 | 
			
		||||
#undef Gr
 | 
			
		||||
#undef Gt
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-sig-child(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, j, Ni, Mi, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, Mr, SPIr:			Nonce;
 | 
			
		||||
		var   Gr, Gt:				Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, HDR, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		send_!3( I, R, HDR, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, HDR, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* CREATE_CHILD_SA */
 | 
			
		||||
		claim( I, Running, R,g(i),g(j),Gr );
 | 
			
		||||
		send_!5( I, R, HDR, {SA3, Mi, g(j), TSi, TSr}SKi );
 | 
			
		||||
		recv_!6( R, I, HDR, {SA3, Mr, Gt,   TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
		claim( I, SKR, KEYMATi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,g(i),g(j),Gr,Gt );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, t, Nr, Mr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, Mi, SPIi:			Nonce;
 | 
			
		||||
		var   Gi, Gj:				Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, HDR, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, HDR, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!4( R, I, HDR, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* CREATE_CHILD_SA */
 | 
			
		||||
		recv_!5( I, R, HDR, {SA3, Mi, Gj,   TSi, TSr}SKr );
 | 
			
		||||
		claim( R, Running, I,Gi,Gj,g(r),g(t) );
 | 
			
		||||
		send_!6( R, I, HDR, {SA3, Mr, g(t), TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
		claim( R, SKR, KEYMATr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I,Gi,Gj,g(r) );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										138
									
								
								gui/Protocols/IKE/ikev2-sig-child2-composed.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								gui/Protocols/IKE/ikev2-sig-child2-composed.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,138 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Combination of signature authenticated IKEv2 and       
 | 
			
		||||
 *				CREATE_CHILD_SA, excludes optional payloads            
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii {SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I)}sk(I)
 | 
			
		||||
#define AUTHir {SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I)}sk(I)
 | 
			
		||||
#define AUTHri {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R)}sk(R)
 | 
			
		||||
#define AUTHrr {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R)}sk(R)
 | 
			
		||||
#define KEYMATi KDF(Ni, Nr, Zi, h(Gt,j), Mi, Mr)
 | 
			
		||||
#define KEYMATr KDF(Ni, Nr, Zr, h(Gi,t), Mi, Mr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!E5( E, E, {SA3, Mi, g(j)}SKi );
 | 
			
		||||
		send_!E6( E, E, {SA3, Mi, g(j)}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!E7( E, E, {SA3, Mr, g(t)}SKr );
 | 
			
		||||
		send_!E8( E, E, {SA3, Mr, g(t)}SKr );
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
protocol @ora(S) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gj g(j)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
#define Gt g(t)
 | 
			
		||||
	role S {
 | 
			
		||||
		var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
 | 
			
		||||
		recv_!S1( S, S, KDF(Ni, Nr, Zi, h(Gt,j), Mi, Mr) );
 | 
			
		||||
		send_!S2( S, S, KDF(Ni, Nr, Zr, h(Gj,t), Mi, Mr) );
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gj
 | 
			
		||||
#undef Gr
 | 
			
		||||
#undef Gt
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-sig-child2(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, j, Ni, Mi, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, Mr, SPIr:			Nonce;
 | 
			
		||||
		var   Gr, Gt:				Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, HDR, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		send_!3( I, R, HDR, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, HDR, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* CREATE_CHILD_SA */
 | 
			
		||||
		claim( I, Running, R,g(i),g(j),Gr );
 | 
			
		||||
		send_!5( I, R, HDR, {SA3, Mi, g(j)}SKi );
 | 
			
		||||
		recv_!6( R, I, HDR, {SA3, Mr, Gt}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
		claim( I, SKR, KEYMATi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,g(i),g(j),Gr,Gt );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, t, Nr, Mr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, Mi, SPIi:			Nonce;
 | 
			
		||||
		var   Gi, Gj:				Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, HDR, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, HDR, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!4( R, I, HDR, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* CREATE_CHILD_SA */
 | 
			
		||||
		recv_!5( I, R, HDR, {SA3, Mi, Gj}SKr );
 | 
			
		||||
		claim( R, Running, I,Gi,Gj,g(r),g(t) );
 | 
			
		||||
		send_!6( R, I, HDR, {SA3, Mr, g(t)}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
		claim( R, SKR, KEYMATr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I,Gi,Gj,g(r) );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										138
									
								
								gui/Protocols/IKE/ikev2-sig-child2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								gui/Protocols/IKE/ikev2-sig-child2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,138 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Combination of signature authenticated IKEv2 and       
 | 
			
		||||
 *				CREATE_CHILD_SA, excludes optional payloads            
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii {SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I)}sk(I)
 | 
			
		||||
#define AUTHir {SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I)}sk(I)
 | 
			
		||||
#define AUTHri {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R)}sk(R)
 | 
			
		||||
#define AUTHrr {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R)}sk(R)
 | 
			
		||||
#define KEYMATi KDF(Ni, Nr, Zi, h(Gt,j), Mi, Mr)
 | 
			
		||||
#define KEYMATr KDF(Ni, Nr, Zr, h(Gi,t), Mi, Mr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!E5( E, E, {SA3, Mi, g(j)}SKi );
 | 
			
		||||
		send_!E6( E, E, {SA3, Mi, g(j)}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!E7( E, E, {SA3, Mr, g(t)}SKr );
 | 
			
		||||
		send_!E8( E, E, {SA3, Mr, g(t)}SKr );
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
protocol @ora(S) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gj g(j)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
#define Gt g(t)
 | 
			
		||||
	role S {
 | 
			
		||||
		var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
 | 
			
		||||
		recv_!S1( S, S, KDF(Ni, Nr, Zi, h(Gt,j), Mi, Mr) );
 | 
			
		||||
		send_!S2( S, S, KDF(Ni, Nr, Zr, h(Gj,t), Mi, Mr) );
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gj
 | 
			
		||||
#undef Gr
 | 
			
		||||
#undef Gt
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-sig-child2(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, j, Ni, Mi, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, Mr, SPIr:			Nonce;
 | 
			
		||||
		var   Gr, Gt:				Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, HDR, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		send_!3( I, R, HDR, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, HDR, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* CREATE_CHILD_SA */
 | 
			
		||||
		claim( I, Running, R,g(i),g(j),Gr );
 | 
			
		||||
		send_!5( I, R, HDR, {SA3, Mi, g(j)}SKi );
 | 
			
		||||
		recv_!6( R, I, HDR, {SA3, Mr, Gt}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
		claim( I, SKR, KEYMATi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,g(i),g(j),Gr,Gt );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, t, Nr, Mr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, Mi, SPIi:			Nonce;
 | 
			
		||||
		var   Gi, Gj:				Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, HDR, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, HDR, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!4( R, I, HDR, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* CREATE_CHILD_SA */
 | 
			
		||||
		recv_!5( I, R, HDR, {SA3, Mi, Gj}SKr );
 | 
			
		||||
		claim( R, Running, I,Gi,Gj,g(r),g(t) );
 | 
			
		||||
		send_!6( R, I, HDR, {SA3, Mr, g(t)}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
		claim( R, SKR, KEYMATr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I,Gi,Gj,g(r) );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										103
									
								
								gui/Protocols/IKE/ikev2-sig.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								gui/Protocols/IKE/ikev2-sig.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,103 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @subprotocol Signature authenticated IKEv2                          
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Includes optional payloads                             
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii {SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I)}sk(I)
 | 
			
		||||
#define AUTHir {SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I)}sk(I)
 | 
			
		||||
#define AUTHri {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R)}sk(R)
 | 
			
		||||
#define AUTHrr {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R)}sk(R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, r, Ni, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-sig(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, SPIr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, HDR, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		claim( I, Running, R,g(i),Gr,Ni,Nr );
 | 
			
		||||
		send_!3( I, R, HDR, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, HDR, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,g(i),Gr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, Nr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, SPIi:		Nonce;
 | 
			
		||||
		var   Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, HDR, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, HDR, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		claim( R, Running, I,Gi,g(r),Ni,Nr );
 | 
			
		||||
		send_!4( R, I, HDR, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I,Gi,g(r),Ni,Nr );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										103
									
								
								gui/Protocols/IKE/ikev2-sig2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								gui/Protocols/IKE/ikev2-sig2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,103 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @subprotocol Signature authenticated IKEv2                          
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Excludes optional payloads                             
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii {SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I)}sk(I)
 | 
			
		||||
#define AUTHir {SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I)}sk(I)
 | 
			
		||||
#define AUTHri {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R)}sk(R)
 | 
			
		||||
#define AUTHrr {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R)}sk(R)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, r, Ni, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-sig2(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, SPIr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, HDR, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		claim( I, Running, R,Ni,g(i),Nr,Gr,TSi,TSr );
 | 
			
		||||
		send_!3( I, R, HDR, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, HDR, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,Ni,g(i),Nr,Gr,TSi,TSr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, Nr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, SPIi:		Nonce;
 | 
			
		||||
		var   Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, HDR, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, HDR, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr );
 | 
			
		||||
		send_!4( R, I, HDR, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										104
									
								
								gui/Protocols/IKE/ikev2-sigtomac.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								gui/Protocols/IKE/ikev2-sigtomac.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Initiator authenticates itself using digital signatures
 | 
			
		||||
 *				while responder uses message authentication codes.     
 | 
			
		||||
 *				Includes optional payloads                             
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii {SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I)}sk(I)
 | 
			
		||||
#define AUTHir {SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I)}sk(I)
 | 
			
		||||
#define AUTHri MAC(k(I,R), SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R))
 | 
			
		||||
#define AUTHrr MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, r, Ni, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-sigtomac(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, SPIr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, SPIi, SPIr, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		claim( I, Running, R,g(i),Gr,Ni,Nr );
 | 
			
		||||
		send_!3( I, R, SPIi, SPIr, {I, R, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, SPIi, SPIr, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,g(i),Gr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, Nr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, SPIi:		Nonce;
 | 
			
		||||
		var   Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, SPIi, SPIr, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, SPIi, SPIr, {I, R, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		claim( R, Running, I,Gi,g(r),Ni,Nr );
 | 
			
		||||
		send_!4( R, I, SPIi, SPIr, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I,Gi,g(r),Ni,Nr );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										104
									
								
								gui/Protocols/IKE/ikev2-sigtomac2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								gui/Protocols/IKE/ikev2-sigtomac2.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
			
		||||
/**********************************************************************
 | 
			
		||||
 * @protocol	Internet Key Exchange Protocol (IKEv2)                 
 | 
			
		||||
 * @reference	RFC 4306                                               
 | 
			
		||||
 * @variant		Initiator authenticates itself using digital signatures
 | 
			
		||||
 *				while responder uses message authentication codes.     
 | 
			
		||||
 *				Excludes optional payloads                             
 | 
			
		||||
 **********************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __IKEV2__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define AUTHii {SPIi, O, SA1, g(i), Ni, Nr, prf(SKi, I)}sk(I)
 | 
			
		||||
#define AUTHir {SPIi, O, SA1, Gi, Ni, Nr, prf(SKr, I)}sk(I)
 | 
			
		||||
#define AUTHri MAC(k(I,R), SPIi, SPIr, SA1, Gr, Nr, Ni, prf(SKi, R))
 | 
			
		||||
#define AUTHrr MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(SKr, R))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype Number, SecurityAssociation, TrafficSelector;
 | 
			
		||||
const O: Number;
 | 
			
		||||
const SA1 ,SA2, SA3: SecurityAssociation;
 | 
			
		||||
const TSi, TSr: TrafficSelector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(E) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role E {
 | 
			
		||||
		var i, r, Ni, Nr, SPIi, SPIr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!E1( E, E, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		send_!E2( E, E, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!E3( E, E, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
		send_!E4( E, E, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol ikev2-sigtomac2(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SPIi:	Nonce;
 | 
			
		||||
		var   Nr, SPIr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		send_1( I, R, SPIi, O, SA1, g(i), Ni );
 | 
			
		||||
		recv_2( R, I, SPIi, SPIr, SA1, Gr, Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		claim( I, Running, R,g(i),Gr,Ni,Nr );
 | 
			
		||||
		send_!3( I, R, SPIi, SPIr, {I, AUTHii, SA2, TSi, TSr}SKi );
 | 
			
		||||
		recv_!4( R, I, SPIi, SPIr, {R, AUTHri, SA2, TSi, TSr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
		claim( I, Commit, R,g(i),Gr,Ni,Nr );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, Nr, SPIr:	Nonce;
 | 
			
		||||
		var   Ni, SPIi:		Nonce;
 | 
			
		||||
		var   Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/* IKE_SA_INIT */
 | 
			
		||||
		recv_1( I, R, SPIi, O, SA1, Gi, Ni );
 | 
			
		||||
		send_2( R, I, SPIi, SPIr, SA1, g(r), Nr );
 | 
			
		||||
 | 
			
		||||
		/* IKE_AUTH */
 | 
			
		||||
		recv_!3( I, R, SPIi, SPIr, {I, AUTHir, SA2, TSi, TSr}SKr );
 | 
			
		||||
		claim( R, Running, I,Gi,g(r),Ni,Nr );
 | 
			
		||||
		send_!4( R, I, SPIi, SPIr, {R, AUTHrr, SA2, TSi, TSr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
		claim( R, Commit, I,Gi,g(r),Ni,Nr );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										54
									
								
								gui/Protocols/IKE/jfki-core.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								gui/Protocols/IKE/jfki-core.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,54 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	Just Fast Keying
 | 
			
		||||
 * @reference	Aiello et al., Just Fast Keying: Key Agreement In A Hostile
 | 
			
		||||
 *				Internet
 | 
			
		||||
 * @description	
 | 
			
		||||
 * @variant		Core cryptographic protocol of JFKi
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
**/
 | 
			
		||||
#define __JFK_CORE__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol jfki-core(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni:	Nonce;
 | 
			
		||||
		var   Nr:		Nonce;
 | 
			
		||||
		var   Gr:		Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ni, I, g(i) );
 | 
			
		||||
		recv_2( R, I, Nr, Ni, R, Gr, {Nr, Ni, Gr, g(i), I}sk(R) );
 | 
			
		||||
		send_3( I, R, Nr, Ni, {Nr, Ni, Gr, g(i), R}sk(I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh r, Nr:	Nonce;
 | 
			
		||||
		var   Ni:		Nonce;
 | 
			
		||||
		var   Gi:		Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ni, I, Gi );
 | 
			
		||||
		send_2( R, I, Nr, Ni, R, g(r), {Nr, Ni, g(r), Gi, I}sk(R) );
 | 
			
		||||
		recv_3( I, R, Nr, Ni, {Nr, Ni, g(r), Gi, R}sk(I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										84
									
								
								gui/Protocols/IKE/jfki.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								gui/Protocols/IKE/jfki.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,84 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	Just Fast Keying
 | 
			
		||||
 * @reference	Aiello et al., Just Fast Keying: Key Agreement In A Hostile
 | 
			
		||||
 *				Internet
 | 
			
		||||
 * @description	
 | 
			
		||||
 * @variant		Initiatior is identity protected
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
**/
 | 
			
		||||
#define __JFK__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, SAi, SAr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O1( O, O, {I, SAi, {H(Ni), Nr, g(i), Gr, R, SAi}sk(I)}SKi );
 | 
			
		||||
		send_!O2( O, O, {I, SAi, {H(Ni), Nr, g(i), Gr, R, SAi}sk(I)}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!O3( O, O, {{H(Ni), Nr, g(i), Gr, I, SAi, SAr}sk(R), SAr}SKr );
 | 
			
		||||
		send_!O4( O, O, {{H(Ni), Nr, g(i), Gr, I, SAi, SAr}sk(R), SAr}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Abstractions: no grpinfo, no MAC(ENC(M)), no ID_R', no IPi
 | 
			
		||||
protocol jfki(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SAi:	Nonce;
 | 
			
		||||
		var   Nr, SAr:		Nonce;
 | 
			
		||||
		var   Gr, TH:		Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, H(Ni), g(i) );
 | 
			
		||||
		recv_2( R, I, H(Ni), Nr, Gr, R, {Gr}sk(R), TH );
 | 
			
		||||
		send_!3( I, R, Ni, Nr, g(i), Gr, TH, {I, SAi, {H(Ni), Nr, g(i), Gr, R, SAi}sk(I)}SKi );
 | 
			
		||||
		recv_!4( R, I, {{H(Ni), Nr, g(i), Gr, I, SAi, SAr}sk(R), SAr}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, SAr, HKr:	Nonce;
 | 
			
		||||
		var    Ni, SAi:			Nonce;
 | 
			
		||||
		var    Gi, HNi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, HNi, Gi );
 | 
			
		||||
		send_2( R, I, HNi, Nr, g(r), R, {g(r)}sk(R), H(HKr, g(r), Nr, HNi) );
 | 
			
		||||
		// Note: if R can receive H(HKr, g(r), Nr, H(Ni)) then HNi=H(Ni)
 | 
			
		||||
		recv_!3( I, R, Ni, Nr, Gi, g(r), H(HKr, g(r), Nr, H(Ni)), {I, SAi, {H(Ni), Nr, Gi, g(r), R, SAi}sk(I)}SKr );
 | 
			
		||||
        send_!4( R, I, {{H(Ni), Nr, Gi, g(r), I, SAi, SAr}sk(R), SAr}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, Secret, HKr );
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										78
									
								
								gui/Protocols/IKE/jfkr-core.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								gui/Protocols/IKE/jfkr-core.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,78 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	Just Fast Keying
 | 
			
		||||
 * @reference	Aiello et al., Just Fast Keying: Key Agreement In A Hostile
 | 
			
		||||
 *				Internet
 | 
			
		||||
 * @description	
 | 
			
		||||
 * @variant		Core cryptographic protocol of JFKr
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
**/
 | 
			
		||||
#define __JFK_CORE__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O1( O, O, H(SKr, Nr, Ni, R) );
 | 
			
		||||
		send_!O2( O, O, H(SKi, Nr, Ni, R) );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!O3( O, O, H(SKi, Nr, Ni, I) );
 | 
			
		||||
		send_!O4( O, O, H(SKr, Nr, Ni, I) );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Abstractions: same key for ENC, MAC
 | 
			
		||||
protocol jfkr-core(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni:	Nonce;
 | 
			
		||||
		var   Nr, Gr:	Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ni, g(i) );
 | 
			
		||||
		recv_!2( R, I, Nr, Ni, R, Gr, {Nr, Ni, Gr, g(i)}sk(R), H(SKi, Nr, Ni, R) );
 | 
			
		||||
		send_!3( I, R, Nr, Ni, I, {Nr, Ni, Gr, g(i)}sk(I), H(SKi, Nr, Ni, I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr:	Nonce;
 | 
			
		||||
		var    Ni, Gi:	Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ni, Gi );
 | 
			
		||||
		send_!2( R, I, Nr, Ni, R, g(r), {Nr, Ni, g(r), Gi}sk(R), H(SKr, Nr, Ni, R) );
 | 
			
		||||
		recv_!3( I, R, Nr, Ni, I, {Nr, Ni, g(r), Gi}sk(I), H(SKr, Nr, Ni, I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										83
									
								
								gui/Protocols/IKE/jfkr.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								gui/Protocols/IKE/jfkr.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,83 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	Just Fast Keying
 | 
			
		||||
 * @reference	Aiello et al., Just Fast Keying: Key Agreement In A Hostile
 | 
			
		||||
 *				Internet
 | 
			
		||||
 * @description	
 | 
			
		||||
 * @variant		Responder is identity protected
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
**/
 | 
			
		||||
#define __JFK__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, SAi, SAr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O1( O, O, {I, SAi, {H(Ni), Nr, g(i), Gr}sk(I)}SKi );
 | 
			
		||||
		send_!O2( O, O, {I, SAi, {H(Ni), Nr, g(i), Gr}sk(I)}SKr );
 | 
			
		||||
 | 
			
		||||
		// msg 4
 | 
			
		||||
		recv_!O3( O, O, {R, SAr, {Gr, Nr, g(i), H(Ni)}sk(R)}SKr );
 | 
			
		||||
		send_!O4( O, O, {R, SAr, {Gr, Nr, g(i), H(Ni)}sk(R)}SKi );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Abstractions: no grpinfo, no MAC(ENC(M)), no ID_R', no IPi
 | 
			
		||||
protocol jfkr(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, SAi:	Nonce;
 | 
			
		||||
		var   Nr, SAr:		Nonce;
 | 
			
		||||
		var   Gr, TH:		Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, H(Ni), g(i) );
 | 
			
		||||
		recv_2( R, I, H(Ni), Nr, Gr, TH );
 | 
			
		||||
		send_!3( I, R, Ni, Nr, g(i), Gr, TH, {I, SAi, {H(Ni), Nr, g(i), Gr}sk(I)}SKi );
 | 
			
		||||
		recv_!4( R, I, {R, SAr, {Gr, Nr, g(i), H(Ni)}sk(R)}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, SAr, HKr:	Nonce;
 | 
			
		||||
		var    Ni, SAi:			Nonce;
 | 
			
		||||
		var    Gi, HNi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, HNi, Gi );
 | 
			
		||||
		send_2( R, I, HNi, Nr, g(r), H(HKr, g(r), Nr, HNi) );
 | 
			
		||||
		recv_!3( I, R, Ni, Nr, Gi, g(r), H(HKr, g(r), Nr, H(Ni)), {I, SAi, {H(Ni), Nr, Gi, g(r)}sk(I)}SKr );
 | 
			
		||||
        send_!4( R, I, {R, SAr, {g(r), Nr, Gi, H(Ni)}sk(R)}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, Secret, HKr );
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								gui/Protocols/IKE/make-mpa.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										63
									
								
								gui/Protocols/IKE/make-mpa.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,63 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
def getProtocolFiles(path=".",extension=""):
 | 
			
		||||
    allfiles = os.listdir(path)
 | 
			
		||||
    spfl = []
 | 
			
		||||
    for fn in allfiles:
 | 
			
		||||
        if fn.endswith(extension):
 | 
			
		||||
            spfl.append(fn)
 | 
			
		||||
    return spfl
 | 
			
		||||
 | 
			
		||||
def scanThis(fn,f,rewritelist,cnt):
 | 
			
		||||
 | 
			
		||||
    s = ""
 | 
			
		||||
    mapping = []
 | 
			
		||||
    for lhs in rewritelist:
 | 
			
		||||
        rhs = "%s%i" % (lhs,cnt)
 | 
			
		||||
        mapping.append((lhs,rhs))
 | 
			
		||||
 | 
			
		||||
    fp = open(fn,"r")
 | 
			
		||||
    for rl in fp.xreadlines():
 | 
			
		||||
        l = rl
 | 
			
		||||
        if f != None:
 | 
			
		||||
            l = f(l)
 | 
			
		||||
        for (lhs,rhs) in mapping:
 | 
			
		||||
            l = l.replace(lhs,rhs)
 | 
			
		||||
        s = s + l
 | 
			
		||||
    fp.close()
 | 
			
		||||
    return s
 | 
			
		||||
 | 
			
		||||
def convertEm(f=None,path=".",rewritelist=[],newdir=".",oldext="",newext=None):
 | 
			
		||||
    fl = getProtocolFiles(path=path,extension=oldext)
 | 
			
		||||
    cnt = 1
 | 
			
		||||
    for fn in fl:
 | 
			
		||||
        ffn = os.path.join(path,fn)
 | 
			
		||||
        print "Processing",ffn
 | 
			
		||||
        s = scanThis(ffn,f,rewritelist,cnt)
 | 
			
		||||
        if newext == None:
 | 
			
		||||
            fn2 = fn
 | 
			
		||||
        else:
 | 
			
		||||
            fn2 = fn.replace(oldext,newext)
 | 
			
		||||
        ffn2 = os.path.join(newdir,fn2)
 | 
			
		||||
        fp = open(ffn2,"w")
 | 
			
		||||
        fp.write(s)
 | 
			
		||||
        fp.close()
 | 
			
		||||
        print "Produced",ffn2
 | 
			
		||||
        cnt = cnt+1
 | 
			
		||||
 | 
			
		||||
def preprocess(s):
 | 
			
		||||
    s = s.replace("@oracle","@OracleA")
 | 
			
		||||
    s = s.replace("@ora ",  "@OracleB ")
 | 
			
		||||
    s = s.replace("@ora(",  "@OracleB(")
 | 
			
		||||
    return s
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    convertEm(f=preprocess,rewritelist=["@OracleA","@executability","@OracleB"],path=".",newdir="mpa",oldext=".spdl")
 | 
			
		||||
    print "Done."
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    main()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								gui/Protocols/IKE/mpa/README.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								gui/Protocols/IKE/mpa/README.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
This directory is filled by the script
 | 
			
		||||
 | 
			
		||||
`../make-mpa.py`
 | 
			
		||||
 | 
			
		||||
It takes the `.spdl` files from the `..` directory and prepares them for
 | 
			
		||||
multi-protocol analysis.
 | 
			
		||||
							
								
								
									
										60
									
								
								gui/Protocols/IKE/oakley-a.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								gui/Protocols/IKE/oakley-a.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,60 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @protocol	OAKLEY
 | 
			
		||||
 * @reference	RFC 2412, 
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication and 
 | 
			
		||||
 *				Key Agreement
 | 
			
		||||
 * @description	OAKLEY is related to STS and allows for shared key 
 | 
			
		||||
 *				determination via authenticated Diffie-Hellman exchanges and
 | 
			
		||||
 *				provides perfect forward secrecy for the shared key.
 | 
			
		||||
 * @variant		Aggressive mode
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
**/
 | 
			
		||||
#define __OAKLEY__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
protocol oakley-a(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ci, g(i), list, I, R, Ni, {I, R, Ni, g(i), list}sk(I) );
 | 
			
		||||
		recv_2( R, I, Cr, Ci, Gr, algo, R, I, Nr, Ni, {R, I, Nr, Ni, g(i), Gr, algo}sk(R) );
 | 
			
		||||
		send_3( I, R, Ci, Cr, g(i), algo, I, R, Ni, Nr, {I, R, Ni, Nr, g(i), Gr, algo}sk(I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, Gi, list, I, R, Ni, {I, R, Ni, Gi, list}sk(I) );
 | 
			
		||||
		send_2( R, I, Cr, Ci, g(r), algo, R, I, Nr, Ni, {R, I, Nr, Ni, Gi, g(r), algo}sk(R) );
 | 
			
		||||
		recv_3( I, R, Ci, Cr, Gi, algo, I, R, Ni, Nr, {I, R, Ni, Nr, Gi, g(r), algo}sk(I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								gui/Protocols/IKE/oakley-alt.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								gui/Protocols/IKE/oakley-alt.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,63 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	OAKLEY
 | 
			
		||||
 * @reference	RFC 2412, 
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication and 
 | 
			
		||||
 *				Key Agreement
 | 
			
		||||
 * @description	OAKLEY is related to STS and allows for shared key 
 | 
			
		||||
 *				determination via authenticated Diffie-Hellman exchanges and
 | 
			
		||||
 *				provides perfect forward secrecy for the shared key.
 | 
			
		||||
 * @variant		Alternative variant to prevent user identity disclosure
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
**/
 | 
			
		||||
#define __OAKLEY__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
#define AK prf(Ni,Nr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const list, algo: String;
 | 
			
		||||
 | 
			
		||||
protocol oakley-alt(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		// NOTE: pk(R) is sent in plain so that the recipient knows which decryption key to use
 | 
			
		||||
		// In the specification, there is a distinction between the R in pk(R) and the encrypted R
 | 
			
		||||
		send_1( I, R, Ci, g(i), list, pk(R), {I, R, Ni}pk(R) );
 | 
			
		||||
		recv_2( R, I, Cr, Ci, Gr, algo, {R, I, Nr}pk(I), prf(AK, R, I, Gr, g(i), algo) );
 | 
			
		||||
		send_3( I, R, Ci, Cr, prf(AK, I, R, g(i), Gr, algo) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ci, Gi, list, pk(R), {I, R, Ni}pk(R) );
 | 
			
		||||
		send_2( R, I, Cr, Ci, g(r), algo, {R, I, Nr}pk(I), prf(AK, R, I, g(r), Gi, algo) );
 | 
			
		||||
		recv_3( I, R, Ci, Cr, prf(AK, I, R, Gi, g(r), algo) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										105
									
								
								gui/Protocols/IKE/oakley-c.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								gui/Protocols/IKE/oakley-c.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,105 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	OAKLEY
 | 
			
		||||
 * @reference	RFC 2412, 
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication and 
 | 
			
		||||
 *				Key Agreement
 | 
			
		||||
 * @description	OAKLEY is related to STS and allows for shared key 
 | 
			
		||||
 *				determination via authenticated Diffie-Hellman exchanges and
 | 
			
		||||
 *				provides perfect forward secrecy for the shared key.
 | 
			
		||||
 * @variant		Conservative mode with identity hiding
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
**/
 | 
			
		||||
#define __OAKLEY_CONSERVATIVE__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define Kpi prf(Zi)
 | 
			
		||||
#define Kpr prf(Zr)
 | 
			
		||||
#define Kir prf(Ni,Nr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
usertype String;
 | 
			
		||||
const OK, list, algo: String;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r, Ni, Nr, Ci, Cr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 5
 | 
			
		||||
		recv_!O1( O, O, {I, R, {Ni}pk(R)}Kpi );
 | 
			
		||||
		send_!O2( O, O, {I, R, {Ni}pk(R)}Kpr );
 | 
			
		||||
 | 
			
		||||
		// msg 6
 | 
			
		||||
		recv_!O3( O, O, {{Nr, Ni}pk(I), R, I, prf(Kir, R, I, Gr, g(i), algo)}Kpr );
 | 
			
		||||
		send_!O4( O, O, {{Nr, Ni}pk(I), R, I, prf(Kir, R, I, Gr, g(i), algo)}Kpi );
 | 
			
		||||
 | 
			
		||||
		// msg 7
 | 
			
		||||
		recv_!O5( O, O, {prf(Kir, I, R, g(i), Gr, algo)}Kpi );
 | 
			
		||||
		send_!O6( O, O, {prf(Kir, I, R, g(i), Gr, algo)}Kpr );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol oakley-c(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni, Ci:	Nonce;
 | 
			
		||||
		var   Nr, Cr:		Nonce;
 | 
			
		||||
		var   Gr:			Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, OK );
 | 
			
		||||
		recv_2( R, I, Cr );
 | 
			
		||||
		send_3( I, R, Ci, Cr, g(i), list );
 | 
			
		||||
		recv_4( R, I, Cr, Ci, Gr, algo );
 | 
			
		||||
		send_!5( I, R, Ci, Cr, g(i), {I, R, {Ni}pk(R)}Kpi );
 | 
			
		||||
		recv_!6( R, I, Cr, Ci, {{Nr, Ni}pk(I), R, I, prf(Kir, R, I, Gr, g(i), algo)}Kpi );
 | 
			
		||||
		send_!7( I, R, Ci, Cr, {prf(Kir, I, R, g(i), Gr, algo)}Kpi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, Kpi );
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr, Cr:	Nonce;
 | 
			
		||||
		var    Ni, Ci:		Nonce;
 | 
			
		||||
		var    Gi:			Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, OK );
 | 
			
		||||
		send_2( R, I, Cr );
 | 
			
		||||
		recv_3( I, R, Ci, Cr, Gi, list );
 | 
			
		||||
		send_4( R, I, Cr, Ci, g(r), algo );
 | 
			
		||||
		recv_!5( I, R, Ci, Cr, Gi, {I, R, {Ni}pk(R)}Kpr );
 | 
			
		||||
		send_!6( R, I, Cr, Ci, {{Nr, Ni}pk(I), R, I, prf(Kir, R, I, g(r), Gi, algo)}Kpr );
 | 
			
		||||
		recv_!7( I, R, Ci, Cr, {prf(Kir, I, R, Gi, g(r), algo)}Kpr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, Kpr );
 | 
			
		||||
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								gui/Protocols/IKE/pp.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										21
									
								
								gui/Protocols/IKE/pp.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,21 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
FILES="$*"
 | 
			
		||||
EXT="pp"
 | 
			
		||||
#OUT=.
 | 
			
		||||
OUT=pp-results
 | 
			
		||||
 | 
			
		||||
if [ -n "$FILES" ]; then
 | 
			
		||||
	for file in $FILES;
 | 
			
		||||
	do
 | 
			
		||||
		if [ "$file" = "*.$EXT.*" ]; then
 | 
			
		||||
			echo "skipping $file"
 | 
			
		||||
		else
 | 
			
		||||
			echo "preprocessing $file"
 | 
			
		||||
			cpp $file | sed -e '/^(\#.*)*$/d' > $OUT/${file%%.*}.$EXT.spdl
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
else
 | 
			
		||||
	printf "Usage: %s: file...\n" $(basename $0) >&2 
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										800
									
								
								gui/Protocols/IKE/scanner.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										800
									
								
								gui/Protocols/IKE/scanner.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,800 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
ALLPROTS = set()
 | 
			
		||||
ALLCLAIMS = set()   # prot x role x claim
 | 
			
		||||
PREFIX = None       # Required prefix
 | 
			
		||||
FFUNC = (lambda p: True)        # Filter function
 | 
			
		||||
 | 
			
		||||
def reset():
 | 
			
		||||
 | 
			
		||||
    global ALLPROTS
 | 
			
		||||
    global ALLCLAIMS
 | 
			
		||||
    global PREFIX
 | 
			
		||||
    global FFUNC
 | 
			
		||||
 | 
			
		||||
    ALLPROTS = set()
 | 
			
		||||
    ALLCLAIMS = set()
 | 
			
		||||
    PREFIX = None
 | 
			
		||||
    FFUNC = (lambda p: True) 
 | 
			
		||||
 | 
			
		||||
def skipLine(l):
 | 
			
		||||
    if len(l) == 0:
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
    skippable = ["%","\\begin","\\end","Protocol"]
 | 
			
		||||
    for skstr in skippable:
 | 
			
		||||
        if l.startswith(skstr):
 | 
			
		||||
            return True
 | 
			
		||||
 | 
			
		||||
    return False
 | 
			
		||||
 | 
			
		||||
def stripRowEnd(l):
 | 
			
		||||
    # Assume ends with \\, split by dtl
 | 
			
		||||
    endstr = "\\\\"
 | 
			
		||||
    if not l.endswith(endstr):
 | 
			
		||||
        print "Error: some line does not end with \\\\"
 | 
			
		||||
        print ">>%s<<" % (l)
 | 
			
		||||
        sys.exit(-1)
 | 
			
		||||
 | 
			
		||||
    return l[:-len(endstr)]
 | 
			
		||||
 | 
			
		||||
def splitStrip(l,sp):
 | 
			
		||||
 | 
			
		||||
    dtl = l.split(sp)
 | 
			
		||||
    for i in range(0,len(dtl)):
 | 
			
		||||
        dtl[i] = dtl[i].strip()
 | 
			
		||||
    return dtl
 | 
			
		||||
 | 
			
		||||
def roleClaim(dtl):
 | 
			
		||||
    rcdt = dtl.split()
 | 
			
		||||
    assert(rcdt[0].endswith(":"))
 | 
			
		||||
    role = rcdt[0][:-1]
 | 
			
		||||
    claim = rcdt[1]
 | 
			
		||||
    return (role,claim[:20])
 | 
			
		||||
 | 
			
		||||
def scanAttackFile(fn):
 | 
			
		||||
 | 
			
		||||
    global ALLPROTS
 | 
			
		||||
 | 
			
		||||
    fp = open("gen-%s-mpaattacks.tex" % (fn),"r")
 | 
			
		||||
    attackmap = {}
 | 
			
		||||
    prot = None
 | 
			
		||||
    role = None
 | 
			
		||||
    claim = None
 | 
			
		||||
    for rawline in fp.xreadlines():
 | 
			
		||||
 | 
			
		||||
        l = rawline.strip()
 | 
			
		||||
 | 
			
		||||
        if skipLine(l):
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        l = stripRowEnd(l)
 | 
			
		||||
 | 
			
		||||
        dtl = splitStrip(l,"&")
 | 
			
		||||
 | 
			
		||||
        # New protocol
 | 
			
		||||
        if len(dtl[0]) > 0:
 | 
			
		||||
            prot = dtl[0]
 | 
			
		||||
 | 
			
		||||
        # New role
 | 
			
		||||
        if len(dtl[1]) > 0:
 | 
			
		||||
            (role,claim) = roleClaim(dtl[1])
 | 
			
		||||
 | 
			
		||||
        # Claims list
 | 
			
		||||
        # Assume starts with '[' and ends with ']'
 | 
			
		||||
        assert(dtl[2].startswith("["))
 | 
			
		||||
        assert(dtl[2].endswith("]"))
 | 
			
		||||
        attl = ((dtl[2])[1:-1]).split(",")
 | 
			
		||||
        for i in range(0,len(attl)):
 | 
			
		||||
            x = attl[i].strip()
 | 
			
		||||
            assert(x.startswith("'"))
 | 
			
		||||
            assert(x.endswith("'"))
 | 
			
		||||
            attl[i] = x[1:-1]
 | 
			
		||||
 | 
			
		||||
        ak = (prot,role,claim)
 | 
			
		||||
        if ak not in attackmap.keys():
 | 
			
		||||
            attackmap[ak] = set()
 | 
			
		||||
        attackmap[ak].add(tuple(attl))
 | 
			
		||||
 | 
			
		||||
        # Add to allprots set
 | 
			
		||||
        ALLPROTS.add(prot)
 | 
			
		||||
        for p in attl:
 | 
			
		||||
            ALLPROTS.add(prot)
 | 
			
		||||
 | 
			
		||||
    fp.close()
 | 
			
		||||
 | 
			
		||||
    return attackmap
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def shorten(prot):
 | 
			
		||||
    """
 | 
			
		||||
    Shorten protocol name
 | 
			
		||||
    """
 | 
			
		||||
    cutting = ["isoiec-","9798-"]
 | 
			
		||||
    for ct in cutting:
 | 
			
		||||
        if prot.startswith(ct):
 | 
			
		||||
            prot = prot[len(ct):]
 | 
			
		||||
    return prot.replace("-udkey","-ud")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def prettyclaim(cl):
 | 
			
		||||
    """
 | 
			
		||||
    Rewrite if needed
 | 
			
		||||
    """
 | 
			
		||||
    return cl.replace("Commit","Agreement")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def mpaTable(attackmap):
 | 
			
		||||
    """
 | 
			
		||||
    construct table for MPA attacks
 | 
			
		||||
    """
 | 
			
		||||
    counter = 1
 | 
			
		||||
    s = ""
 | 
			
		||||
 | 
			
		||||
    s += "\\begin{longtable}{|l|lll|l|}\n" 
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    for kk in sorted(ALLCLAIMS):
 | 
			
		||||
        if kk not in attackmap.keys():
 | 
			
		||||
            continue
 | 
			
		||||
        (prot,role,claim) = kk
 | 
			
		||||
 | 
			
		||||
        ats = str(attackmap[kk])
 | 
			
		||||
        sl = "%i & %s & %s & %s & %s \\\\ \n" % (counter,prot,role,claim,ats)
 | 
			
		||||
 | 
			
		||||
        s += sl
 | 
			
		||||
        counter = counter + 1
 | 
			
		||||
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    s += "\\end{longtable}\n"
 | 
			
		||||
 | 
			
		||||
    return s
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def rotated(headl):
 | 
			
		||||
    """
 | 
			
		||||
    Add rotated headers
 | 
			
		||||
    """
 | 
			
		||||
    for i in range(0,len(headl)):
 | 
			
		||||
        headl[i] = "\\begin{sideways} %s \\end{sideways}\n" % (headl[i])
 | 
			
		||||
    return " & ".join(headl)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def baseprot(prot):
 | 
			
		||||
    return shorten(prot)[:5]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def mpaTable2(attackmap,tabtype="tabular",options=""):
 | 
			
		||||
    """
 | 
			
		||||
    construct table for MPA attacks
 | 
			
		||||
 | 
			
		||||
    Second attempt
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    # To find the number of columns, we first need to find all protocols involved in two-protocol attacks
 | 
			
		||||
    involved = set()
 | 
			
		||||
    for kk in attackmap.keys():
 | 
			
		||||
        for atl in attackmap[kk]:
 | 
			
		||||
            # convert tuple back to list
 | 
			
		||||
            att = list(atl)
 | 
			
		||||
            if len(att) == 1:
 | 
			
		||||
                # This attack involves one *additional* protocol, so is a two-protocol attack
 | 
			
		||||
                involved.add(att[0])
 | 
			
		||||
    colheads = sorted(involved)
 | 
			
		||||
    attcols = ""
 | 
			
		||||
    last = None
 | 
			
		||||
    for hd in colheads:
 | 
			
		||||
        prm = baseprot(hd)
 | 
			
		||||
        if last == prm:
 | 
			
		||||
            attcols += "@{\hspace{2mm}}c"
 | 
			
		||||
        else:
 | 
			
		||||
            last = prm
 | 
			
		||||
            attcols += "|c"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    #attcols = "c" * len(involved)
 | 
			
		||||
 | 
			
		||||
    counter = 1
 | 
			
		||||
    s = ""
 | 
			
		||||
 | 
			
		||||
    #s += "\\clearpage \n"
 | 
			
		||||
 | 
			
		||||
    s += "\\begin{%s}%s{|l|ll|%s|}\n" % (tabtype,options,attcols)
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    s += rotated(["No","Prot","Claim"])
 | 
			
		||||
    for hd in colheads:
 | 
			
		||||
        s += "& \\begin{sideways}%s\\end{sideways} " % (shorten(hd))
 | 
			
		||||
    s += "\\\\ \n"
 | 
			
		||||
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    last = None
 | 
			
		||||
    for kk in sorted(ALLCLAIMS):
 | 
			
		||||
        if kk not in attackmap.keys():
 | 
			
		||||
            continue
 | 
			
		||||
        (prot,role,claim) = kk
 | 
			
		||||
        
 | 
			
		||||
        prm = baseprot(prot)
 | 
			
		||||
        if last != prm:
 | 
			
		||||
            last = prm
 | 
			
		||||
            s += "\\hline\n"
 | 
			
		||||
 | 
			
		||||
        sl = ""
 | 
			
		||||
        sl += "%i & %s & %s %s " % (counter,shorten(prot),role,claim)
 | 
			
		||||
        for ch in colheads:
 | 
			
		||||
            se = tuple([ch])
 | 
			
		||||
            if se in attackmap[kk]:
 | 
			
		||||
                sl += "& $\\bullet$ "
 | 
			
		||||
            else:
 | 
			
		||||
                sl += "& $\\circ$  "
 | 
			
		||||
 | 
			
		||||
        sl += "\\\\ \n"
 | 
			
		||||
 | 
			
		||||
        s += sl
 | 
			
		||||
        counter = counter + 1
 | 
			
		||||
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    s += "\\end{%s}\n" % (tabtype)
 | 
			
		||||
 | 
			
		||||
    return s
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def mpaTable3(attackmaps,tabtype="tabular",options=""):
 | 
			
		||||
    """
 | 
			
		||||
    construct table for MPA attacks
 | 
			
		||||
 | 
			
		||||
    attmaps = sequence of (attackmap, symbol)
 | 
			
		||||
 | 
			
		||||
    Symbol of the first matching is displayed
 | 
			
		||||
 | 
			
		||||
    Second attempt
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    global FFUNC
 | 
			
		||||
    # To find the number of columns, we first need to find all protocols involved in two-protocol attacks
 | 
			
		||||
    # Also populate "allkeys"
 | 
			
		||||
    involved = set()
 | 
			
		||||
    allkeys = set()
 | 
			
		||||
    for (attackmap,symbs) in attackmaps:
 | 
			
		||||
        for kk in attackmap.keys():
 | 
			
		||||
            allkeys.add(kk)
 | 
			
		||||
            for atl in attackmap[kk]:
 | 
			
		||||
                # convert tuple back to list
 | 
			
		||||
                att = list(atl)
 | 
			
		||||
                if len(att) == 1:
 | 
			
		||||
                    # This attack involves one *additional* protocol, so is a two-protocol attack
 | 
			
		||||
                    if FFUNC:
 | 
			
		||||
                        if not FFUNC(att[0]):
 | 
			
		||||
                            continue
 | 
			
		||||
 | 
			
		||||
                    involved.add(att[0])
 | 
			
		||||
 | 
			
		||||
    colheads = sorted(involved)
 | 
			
		||||
    attcols = ""
 | 
			
		||||
    last = None
 | 
			
		||||
    for hd in colheads:
 | 
			
		||||
        prm = baseprot(hd)
 | 
			
		||||
        if last == prm:
 | 
			
		||||
            attcols += "@{\hspace{2mm}}c"
 | 
			
		||||
        else:
 | 
			
		||||
            last = prm
 | 
			
		||||
            attcols += "|c"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    #attcols = "c" * len(involved)
 | 
			
		||||
 | 
			
		||||
    counter = 1
 | 
			
		||||
    s = ""
 | 
			
		||||
 | 
			
		||||
    #s += "\\clearpage \n"
 | 
			
		||||
 | 
			
		||||
    s += "\\begin{%s}%s{|l|ll|%s|}\n" % (tabtype,options,attcols)
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    s += rotated(["No","Prot","Claim"])
 | 
			
		||||
    for hd in colheads:
 | 
			
		||||
        s += "& \\begin{sideways}%s\\end{sideways} " % (shorten(hd))
 | 
			
		||||
    s += "\\\\ \n"
 | 
			
		||||
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    last = None
 | 
			
		||||
    for kk in sorted(ALLCLAIMS):
 | 
			
		||||
        if kk not in attackmap.keys():
 | 
			
		||||
            continue
 | 
			
		||||
        (prot,role,claim) = kk
 | 
			
		||||
        
 | 
			
		||||
        prm = baseprot(prot)
 | 
			
		||||
        if last != prm:
 | 
			
		||||
            last = prm
 | 
			
		||||
            s += "\\hline\n"
 | 
			
		||||
 | 
			
		||||
        sl = ""
 | 
			
		||||
        sl += "%i & %s & %s %s " % (counter,shorten(prot),role,prettyclaim(claim))
 | 
			
		||||
        for ch in colheads:
 | 
			
		||||
            se = tuple([ch])
 | 
			
		||||
            sl += "& "
 | 
			
		||||
            for (attackmap,symb) in attackmaps:
 | 
			
		||||
                if kk in attackmap.keys():
 | 
			
		||||
                    if se in attackmap[kk]:
 | 
			
		||||
                        sl += symb
 | 
			
		||||
                        break
 | 
			
		||||
 | 
			
		||||
        sl += "\\\\ \n"
 | 
			
		||||
 | 
			
		||||
        s += sl
 | 
			
		||||
        counter = counter + 1
 | 
			
		||||
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    s += "\\end{%s}\n" % (tabtype)
 | 
			
		||||
 | 
			
		||||
    return s
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def scanClaimList(fn):
 | 
			
		||||
    """
 | 
			
		||||
    Simply gather claims
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    global ALLPROTS
 | 
			
		||||
    global ALLCLAIMS
 | 
			
		||||
    global FFUNC
 | 
			
		||||
 | 
			
		||||
    fp = open("gen-%s-claims.txt" % (fn),"r")
 | 
			
		||||
 | 
			
		||||
    claimmap = {}
 | 
			
		||||
    for rawline in fp.xreadlines():
 | 
			
		||||
 | 
			
		||||
        l = rawline.strip()
 | 
			
		||||
 | 
			
		||||
        if skipLine(l):
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        dtl = splitStrip(l,"; ")
 | 
			
		||||
 | 
			
		||||
        filename = dtl[0]
 | 
			
		||||
        prot = dtl[1]
 | 
			
		||||
        if FFUNC:
 | 
			
		||||
            if not FFUNC(prot):
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
        label = dtl[2]
 | 
			
		||||
        (role,claim) = roleClaim(dtl[3])
 | 
			
		||||
 | 
			
		||||
        ALLCLAIMS.add((prot,role,claim))
 | 
			
		||||
        ALLPROTS.add(prot)
 | 
			
		||||
 | 
			
		||||
    fp.close()
 | 
			
		||||
 | 
			
		||||
    return claimmap
 | 
			
		||||
 | 
			
		||||
def scanClaimFile(fn):
 | 
			
		||||
    """
 | 
			
		||||
    Construct claimmap
 | 
			
		||||
 | 
			
		||||
    prot -> roles -> claims
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    global ALLPROTS
 | 
			
		||||
    global ALLCLAIMS
 | 
			
		||||
    global FFUNC
 | 
			
		||||
 | 
			
		||||
    fp = open("gen-%s-correctclaims.tex" % (fn),"r")
 | 
			
		||||
 | 
			
		||||
    claimmap = {}
 | 
			
		||||
    for rawline in fp.xreadlines():
 | 
			
		||||
 | 
			
		||||
        l = rawline.strip()
 | 
			
		||||
 | 
			
		||||
        if skipLine(l):
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        l = stripRowEnd(l)
 | 
			
		||||
 | 
			
		||||
        dtl = splitStrip(l,"&")
 | 
			
		||||
 | 
			
		||||
        prot = dtl[0]
 | 
			
		||||
        if FFUNC:
 | 
			
		||||
            if not FFUNC(prot):
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
        if prot not in claimmap.keys():
 | 
			
		||||
            claimmap[prot] = {}
 | 
			
		||||
 | 
			
		||||
        cll = splitStrip(dtl[1],";")
 | 
			
		||||
 | 
			
		||||
        for dt in cll:
 | 
			
		||||
            (role,claim) = roleClaim(dt)
 | 
			
		||||
 | 
			
		||||
            if role not in claimmap[prot].keys():
 | 
			
		||||
                claimmap[prot][role] = set()
 | 
			
		||||
 | 
			
		||||
            claimmap[prot][role].add(claim)
 | 
			
		||||
 | 
			
		||||
            ALLCLAIMS.add((prot,role,claim))
 | 
			
		||||
 | 
			
		||||
        ALLPROTS.add(prot)
 | 
			
		||||
 | 
			
		||||
    fp.close()
 | 
			
		||||
 | 
			
		||||
    return claimmap
 | 
			
		||||
 | 
			
		||||
def getRoleClaims(rcmap):
 | 
			
		||||
 | 
			
		||||
    rc = set()
 | 
			
		||||
    for role in rcmap.keys():
 | 
			
		||||
        for claim in rcmap[role]:
 | 
			
		||||
            rc.add((role,claim))
 | 
			
		||||
 | 
			
		||||
    return rc
 | 
			
		||||
 | 
			
		||||
def typeScanMatrix(cml,onlyChanged = False):
 | 
			
		||||
 | 
			
		||||
    global ALLPROTS
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    Scan for the influence of typing.
 | 
			
		||||
 | 
			
		||||
    Input:
 | 
			
		||||
 | 
			
		||||
    [(txt1,cm1),(txt2,cm2),...]
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    s = ""
 | 
			
		||||
 | 
			
		||||
    s += "\\begin{longtable}{|l|lll|%s|}\n" % ("c" * len(cml))
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
 | 
			
		||||
    s += "No & Prot & Role & Claim "
 | 
			
		||||
    for (txt,cm) in cml:
 | 
			
		||||
        s += "& %s " % (txt)
 | 
			
		||||
    s += "\\\\\n"
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
 | 
			
		||||
    goodverdict = "$\\circ$"
 | 
			
		||||
    badverdict = "$\\bullet$"
 | 
			
		||||
 | 
			
		||||
    counter = 1
 | 
			
		||||
    for (prot,role,claim) in sorted(ALLCLAIMS):
 | 
			
		||||
        # Header
 | 
			
		||||
        sl = "%i & %s & %s & %s " % (counter,prot,role,claim)
 | 
			
		||||
        alltrue = True
 | 
			
		||||
        for (txt,cm) in cml:
 | 
			
		||||
            verdict = badverdict
 | 
			
		||||
            if prot in cm.keys():
 | 
			
		||||
                if role in cm[prot].keys():
 | 
			
		||||
                    if claim in cm[prot][role]:
 | 
			
		||||
                        verdict = goodverdict
 | 
			
		||||
            if verdict == badverdict:
 | 
			
		||||
                alltrue = False
 | 
			
		||||
 | 
			
		||||
            sl += "& %s " % (verdict)
 | 
			
		||||
        sl += "\\\\\n"
 | 
			
		||||
 | 
			
		||||
        if alltrue == True:
 | 
			
		||||
            if onlyChanged == True:
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
        s += sl
 | 
			
		||||
        counter = counter + 1
 | 
			
		||||
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    s += "\\end{longtable}\n"
 | 
			
		||||
    return s
 | 
			
		||||
 | 
			
		||||
def typeScanMatrix2(cml,onlyChanged = False,additive = False):
 | 
			
		||||
 | 
			
		||||
    global ALLPROTS
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    Scan for the influence of typing.
 | 
			
		||||
 | 
			
		||||
    Input:
 | 
			
		||||
 | 
			
		||||
    [(txt1,cm1),(txt2,cm2),...]
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    s = ""
 | 
			
		||||
 | 
			
		||||
    s += "\\begin{longtable}{|l|lll||c|}\n" 
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
 | 
			
		||||
    s += "No & Prot & Claim & Attacks"
 | 
			
		||||
    s += "\\\\\n"
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
 | 
			
		||||
    goodverdict = "$\\circ$"
 | 
			
		||||
    badverdict = "$\\bullet$"
 | 
			
		||||
 | 
			
		||||
    last = None
 | 
			
		||||
    counter = 1
 | 
			
		||||
    for (prot,role,claim) in sorted(ALLCLAIMS):
 | 
			
		||||
        if baseprot(prot) != last:
 | 
			
		||||
            last = baseprot(prot)
 | 
			
		||||
            s += "\\hline\n"
 | 
			
		||||
 | 
			
		||||
        # Header
 | 
			
		||||
        sl = "%i & %s & %s %s " % (counter,prot,role,prettyclaim(claim))
 | 
			
		||||
        alltrue = True
 | 
			
		||||
        res = ""
 | 
			
		||||
        for (txt,cm) in cml:
 | 
			
		||||
            verdict = badverdict
 | 
			
		||||
            if prot in cm.keys():
 | 
			
		||||
                if role in cm[prot].keys():
 | 
			
		||||
                    if claim in cm[prot][role]:
 | 
			
		||||
                        verdict = goodverdict
 | 
			
		||||
            if verdict == badverdict:
 | 
			
		||||
                alltrue = False
 | 
			
		||||
                if additive:
 | 
			
		||||
                    res += txt
 | 
			
		||||
                else:
 | 
			
		||||
                    res = txt
 | 
			
		||||
 | 
			
		||||
        sl += "& %s " % (res)
 | 
			
		||||
        sl += "\\\\\n"
 | 
			
		||||
 | 
			
		||||
        if alltrue == True:
 | 
			
		||||
            if onlyChanged == True:
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
        s += sl
 | 
			
		||||
        counter = counter + 1
 | 
			
		||||
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    s += "\\end{longtable}\n"
 | 
			
		||||
    return s
 | 
			
		||||
 | 
			
		||||
def typeScanMatrix3(hd1,hd2,cml,f,onlyChanged = False,tabletype="longtable"):
 | 
			
		||||
 | 
			
		||||
    global ALLPROTS
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    Scan for the influence of typing.
 | 
			
		||||
 | 
			
		||||
    Input:
 | 
			
		||||
 | 
			
		||||
    f is given as input a sequence of Bool (attack = False) of length len(cml), should return string.
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    s = ""
 | 
			
		||||
 | 
			
		||||
    s += "\\begin{%s}{|l|ll||%s|}\n" % (tabletype,hd1)
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
 | 
			
		||||
    s += rotated(["No","Protocol","Claim"]) + " & " + rotated(hd2)
 | 
			
		||||
    s += "\\\\\n"
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
 | 
			
		||||
    goodverdict = "$\\circ$"
 | 
			
		||||
    badverdict = "$\\bullet$"
 | 
			
		||||
 | 
			
		||||
    last = None
 | 
			
		||||
    counter = 1
 | 
			
		||||
    for (prot,role,claim) in sorted(ALLCLAIMS):
 | 
			
		||||
        if baseprot(prot) != last:
 | 
			
		||||
            last = baseprot(prot)
 | 
			
		||||
            s += "\\hline\n"
 | 
			
		||||
 | 
			
		||||
        # Header
 | 
			
		||||
        sl = "%i & %s & %s %s " % (counter,prot,role,prettyclaim(claim))
 | 
			
		||||
        alltrue = True
 | 
			
		||||
        res = ""
 | 
			
		||||
        resl = []
 | 
			
		||||
        for cm in cml:
 | 
			
		||||
            verdict = badverdict
 | 
			
		||||
            if prot in cm.keys():
 | 
			
		||||
                if role in cm[prot].keys():
 | 
			
		||||
                    if claim in cm[prot][role]:
 | 
			
		||||
                        verdict = goodverdict
 | 
			
		||||
            if verdict == badverdict:
 | 
			
		||||
                alltrue = False
 | 
			
		||||
                resl.append(False)
 | 
			
		||||
            else:
 | 
			
		||||
                resl.append(True)
 | 
			
		||||
 | 
			
		||||
        sl += "& %s " % (f(resl))
 | 
			
		||||
        sl += "\\\\\n"
 | 
			
		||||
 | 
			
		||||
        if alltrue == True:
 | 
			
		||||
            if onlyChanged == True:
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
        s += sl
 | 
			
		||||
        counter = counter + 1
 | 
			
		||||
 | 
			
		||||
    s += "\\hline\n"
 | 
			
		||||
    s += "\\end{%s}\n" % (tabletype)
 | 
			
		||||
    return s
 | 
			
		||||
 | 
			
		||||
def docWrapper(s,title=None,author=None):
 | 
			
		||||
 | 
			
		||||
    pref = ""
 | 
			
		||||
    pref += "\\documentclass{article}\n"
 | 
			
		||||
    pref += "\\usepackage{a4}\n"
 | 
			
		||||
    pref += "\\usepackage{geometry}\n"
 | 
			
		||||
    pref += "\\usepackage{longtable}\n"
 | 
			
		||||
    pref += "\\usepackage{rotating}\n"
 | 
			
		||||
    pref += "\\begin{document}\n"
 | 
			
		||||
    if title or author:
 | 
			
		||||
        if title:
 | 
			
		||||
            pref += "\\title{%s}\n" % (title)
 | 
			
		||||
        if author:
 | 
			
		||||
            pref += "\\author{%s}\n" % (author)
 | 
			
		||||
        pref += "\\maketitle\n"
 | 
			
		||||
    post = ""
 | 
			
		||||
    post += "\\end{document}\n"
 | 
			
		||||
 | 
			
		||||
    return pref + s + post
 | 
			
		||||
 | 
			
		||||
def secWrapper(s,title,level=0):
 | 
			
		||||
    """
 | 
			
		||||
    level : 
 | 
			
		||||
 | 
			
		||||
    0 section
 | 
			
		||||
    1 subsection
 | 
			
		||||
    2 subsub...
 | 
			
		||||
    """
 | 
			
		||||
    pref = "\\" + "sub" * level + "section{" + title + "}\n\n"
 | 
			
		||||
    post = "\n"
 | 
			
		||||
    return pref + s + post
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def sizeWrapper(s, width="!", height="!"):
 | 
			
		||||
 | 
			
		||||
    if (width != "!") or (height != "!"):
 | 
			
		||||
        s = "\\resizebox{%s}{%s}{ \n%s}\n" % (width,height,s)
 | 
			
		||||
    return s
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def fileWrite(fn,s):
 | 
			
		||||
 | 
			
		||||
    fp = open("%s.tex" % (fn), "w")
 | 
			
		||||
    fp.write(s)
 | 
			
		||||
    fp.close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def docWrite(fn,tex,author=None,title=None):
 | 
			
		||||
 | 
			
		||||
    fileWrite(fn, docWrapper(tex,author=author,title=title))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def docMake(fn,tex,author=None,title=None):
 | 
			
		||||
 | 
			
		||||
    import commands
 | 
			
		||||
 | 
			
		||||
    docWrite(fn,tex,author,title)
 | 
			
		||||
    cmd = "pdflatex %s" % (fn)
 | 
			
		||||
    commands.getoutput(cmd)
 | 
			
		||||
 | 
			
		||||
def f1(resl):
 | 
			
		||||
    txtl = []
 | 
			
		||||
    for t in resl:
 | 
			
		||||
        if t == True:
 | 
			
		||||
            txtl.append(" ")
 | 
			
		||||
        else:
 | 
			
		||||
            txtl.append("$\\bullet$")
 | 
			
		||||
    return " & ".join(txtl)
 | 
			
		||||
 | 
			
		||||
def pb(tl,width):
 | 
			
		||||
    nl = []
 | 
			
		||||
    for t in tl:
 | 
			
		||||
        nl.append("\\parbox{%s}{%s}" % (width,t))
 | 
			
		||||
    return nl
 | 
			
		||||
 | 
			
		||||
def makeReport(fn,includefiles=False):
 | 
			
		||||
    scanClaimList(fn + "-aa-t")
 | 
			
		||||
 | 
			
		||||
    cISOaat = scanClaimFile(fn + "-aa-t")
 | 
			
		||||
    cISOaab = scanClaimFile(fn + "-aa-b")
 | 
			
		||||
    cISOaau = scanClaimFile(fn + "-aa-u")
 | 
			
		||||
    cISOiut = scanClaimFile(fn + "-iu-t")
 | 
			
		||||
    cISOiub = scanClaimFile(fn + "-iu-b")
 | 
			
		||||
    cISOiuu = scanClaimFile(fn + "-iu-u")
 | 
			
		||||
    cISOext = scanClaimFile(fn + "-ex-t")
 | 
			
		||||
    cISOexb = scanClaimFile(fn + "-ex-b")
 | 
			
		||||
    cISOexu = scanClaimFile(fn + "-ex-u")
 | 
			
		||||
 | 
			
		||||
    tex = ""
 | 
			
		||||
    #tex += secWrapper(typeScanMatrix([("typed",cISOaat),("basic",cISOaab),("untyped",cISOaau)],onlyChanged = False),title="Normal mode (Alice-Alice communication allowed)")
 | 
			
		||||
    #tex += secWrapper(typeScanMatrix([("typed",cISOiut),("basic",cISOiub),("untyped",cISOiuu)],onlyChanged = True),title="Disallow Alice-Alice initiators")
 | 
			
		||||
    #tex += secWrapper(typeScanMatrix([("typed",cISOext),("basic",cISOexb),("untyped",cISOexu)],onlyChanged = True),title="Disallow Alice-Alice communications")
 | 
			
		||||
 | 
			
		||||
    orders = [cISOaab,
 | 
			
		||||
              cISOaat,
 | 
			
		||||
              cISOiub,
 | 
			
		||||
              cISOiut]
 | 
			
		||||
 | 
			
		||||
    sectex = typeScanMatrix3("c|c|c|c",pb(["No type checks\\\\Alice-talks-to-Alice initators","Type checks\\\\Alice-talks-to-Alice initators","No type checks\\\\No Alice-talks-to-Alice initators","Type checks\\\\No Alice-talks-to-Alice initators"],"49mm"), orders,f1,onlyChanged = True)
 | 
			
		||||
 | 
			
		||||
    mpatex = sizeWrapper(mpaTable3([
 | 
			
		||||
        (scanAttackFile(fn + "-ex-t"),"$\\bullet$"),
 | 
			
		||||
        (scanAttackFile(fn + "-aa-b"),"$\\circ$")
 | 
			
		||||
        ]),width="\\textwidth")
 | 
			
		||||
 | 
			
		||||
    if includefiles == True:
 | 
			
		||||
        fileWrite("../gen-att-" + fn,sectex)
 | 
			
		||||
        fileWrite("../gen-mpa-" + fn,mpatex)
 | 
			
		||||
 | 
			
		||||
    tex += secWrapper(sectex,title="Attacks found")
 | 
			
		||||
    tex += secWrapper(mpatex,title="MPA attacks")
 | 
			
		||||
    docMake(fn,tex,author="Cas Cremers",title="test report %s" % (fn))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def filterPrefix(prot):
 | 
			
		||||
    """
 | 
			
		||||
    Returns true iff the protocol name is okay to be considered
 | 
			
		||||
    """
 | 
			
		||||
    if PREFIX:
 | 
			
		||||
        if not prot.startswith(PREFIX):
 | 
			
		||||
            return False
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
def filterPrefixBD(prot):
 | 
			
		||||
    """
 | 
			
		||||
    Returns true iff the protocol name is okay to be considered
 | 
			
		||||
    """
 | 
			
		||||
    if PREFIX:
 | 
			
		||||
        if not prot.startswith(PREFIX):
 | 
			
		||||
            return False
 | 
			
		||||
    if prot.endswith("-ud"):
 | 
			
		||||
        return False
 | 
			
		||||
    if prot.endswith("-udkey"):
 | 
			
		||||
        return False
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def filterCombo(prot):
 | 
			
		||||
    """
 | 
			
		||||
    Returns true iff the protocol name is okay to be considered
 | 
			
		||||
    """
 | 
			
		||||
    if prot.find("-sig-child") >= 0:
 | 
			
		||||
        return False
 | 
			
		||||
    
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def filterISOsymmBD(prot):
 | 
			
		||||
    """
 | 
			
		||||
    Returns true iff the protocol name is okay to be considered
 | 
			
		||||
    """
 | 
			
		||||
    if prot.endswith("-ud"):
 | 
			
		||||
        return False
 | 
			
		||||
    if prot.endswith("-udkey"):
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
    if prot.startswith("isoiec-9798-2"):
 | 
			
		||||
        return True
 | 
			
		||||
    if prot.startswith("isoiec-9798-4"):
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
    return False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    
 | 
			
		||||
    #reset()
 | 
			
		||||
    #PREFIX = "isoiec-9798-2"
 | 
			
		||||
    #makeReport(PREFIX)
 | 
			
		||||
 | 
			
		||||
    includefiles = True
 | 
			
		||||
 | 
			
		||||
    reset()
 | 
			
		||||
    FFUNC = filterCombo
 | 
			
		||||
    PREFIX = "ike1"
 | 
			
		||||
    makeReport(PREFIX,includefiles=includefiles)
 | 
			
		||||
 | 
			
		||||
    reset()
 | 
			
		||||
    FFUNC = filterCombo
 | 
			
		||||
    PREFIX = "ike2"
 | 
			
		||||
    makeReport(PREFIX,includefiles=includefiles)
 | 
			
		||||
 | 
			
		||||
    reset()
 | 
			
		||||
    FFUNC = filterCombo
 | 
			
		||||
    PREFIX = "ike0"
 | 
			
		||||
    makeReport(PREFIX,includefiles=includefiles)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										61
									
								
								gui/Protocols/IKE/skeme-basic.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								gui/Protocols/IKE/skeme-basic.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,61 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	SKEME
 | 
			
		||||
 * @reference	Krawczyk, H., SKEME: A Versatile Secure Key Exchange Mechanism
 | 
			
		||||
 *				for Internet,
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication and 
 | 
			
		||||
 *				Key Agreement
 | 
			
		||||
 * @description	SKEME is a set of protocols suitable for negotiation of 
 | 
			
		||||
 *				services in a general networked environment. The main 
 | 
			
		||||
 *				characteristics are forward secrecy, privacy and anonymity, 
 | 
			
		||||
 *				and DoS protection.
 | 
			
		||||
 * @variant		Basic mode
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
 * Note: May use the same oracles as sts
 | 
			
		||||
**/
 | 
			
		||||
#define __SKEME__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
#define Kir prf(Ni,Nr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol skeme-basic(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i, Ni:	Nonce;
 | 
			
		||||
		var   Nr:		Nonce;
 | 
			
		||||
		var   Gr:		Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, {I, Ni}pk(R), g(i) );
 | 
			
		||||
		recv_2( R, I, {Nr}pk(I), Gr, prf(Kir, g(i), Gr, R, I) );
 | 
			
		||||
		send_3( I, R, prf(Kir, Gr, g(i), I, R) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r, Nr:	Nonce;
 | 
			
		||||
		var    Ni:		Nonce;
 | 
			
		||||
		var    Gi:		Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, {I, Ni}pk(R), Gi );
 | 
			
		||||
		send_2( R, I, {Nr}pk(I), g(r), prf(Kir, Gi, g(r), R, I) );
 | 
			
		||||
		recv_3( I, R, prf(Kir, g(r), Gi, I, R) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										82
									
								
								gui/Protocols/IKE/skeme-psk.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								gui/Protocols/IKE/skeme-psk.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,82 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	SKEME
 | 
			
		||||
 * @reference	Krawczyk, H., SKEME: A Versatile Secure Key Exchange Mechanism
 | 
			
		||||
 *				for Internet,
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication and 
 | 
			
		||||
 *				Key Agreement
 | 
			
		||||
 * @description	SKEME is a set of protocols suitable for negotiation of 
 | 
			
		||||
 *				services in a general networked environment. The main 
 | 
			
		||||
 *				characteristics are forward secrecy, privacy and anonymity, 
 | 
			
		||||
 *				and DoS protection.
 | 
			
		||||
 * @variant		Basic mode with pre-shared keys and correct application of DH
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
**/
 | 
			
		||||
#define __SKEME__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling k(I,R) = k(R,I).
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, prf(k(R,I), Gi, g(r), R, I) );
 | 
			
		||||
		send_!O2( O, O, prf(k(I,R), Gi, g(r), R, I) );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, prf(k(I,R), Gr, g(i), I, R) );
 | 
			
		||||
		send_!O4( O, O, prf(k(R,I), Gr, g(i), I, R) );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
protocol skeme-psk(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i:	Nonce;
 | 
			
		||||
		var   Gr:	Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, g(i) );
 | 
			
		||||
		recv_!2( R, I, Gr, prf(k(I,R), g(i), Gr, R, I) );
 | 
			
		||||
		send_!3( I, R, prf(k(I,R), Gr, g(i), I, R) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r:	Nonce;
 | 
			
		||||
		var    Gi:	Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Gi );
 | 
			
		||||
		send_!2( R, I, g(r), prf(k(R,I), Gi, g(r), R, I) );
 | 
			
		||||
		recv_!3( I, R, prf(k(R,I), g(r), Gi, I, R) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										80
									
								
								gui/Protocols/IKE/skeme-rekey.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								gui/Protocols/IKE/skeme-rekey.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,80 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	SKEME
 | 
			
		||||
 * @reference	Krawczyk, H., SKEME: A Versatile Secure Key Exchange Mechanism
 | 
			
		||||
 *				for Internet,
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication and 
 | 
			
		||||
 *				Key Agreement
 | 
			
		||||
 * @description	SKEME is a set of protocols suitable for negotiation of 
 | 
			
		||||
 *				services in a general networked environment. The main 
 | 
			
		||||
 *				characteristics are forward secrecy, privacy and anonymity, 
 | 
			
		||||
 *				and DoS protection.
 | 
			
		||||
 * @variant		Fast rekeying protocol
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
/** MACRO DEFINITIONS
 | 
			
		||||
 * Needs preprocessing by cpp before fed to scyther
 | 
			
		||||
**/
 | 
			
		||||
#define __SKEME_REKEY__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling k(I,R) = k(R,I).
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var Ni, Nr: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, prf(k(R,I), Ni, Nr, R, I) );
 | 
			
		||||
		send_!O2( O, O, prf(k(I,R), Ni, Nr, R, I) );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O, prf(k(I,R), Nr, Ni, I, R) );
 | 
			
		||||
		send_!O4( O, O, prf(k(R,I), Nr, Ni, I, R) );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
protocol skeme-rekey(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh Ni:	Nonce;
 | 
			
		||||
		var   Nr:	Nonce;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, Ni );
 | 
			
		||||
		recv_!2( R, I, Nr, prf(k(I,R), Ni, Nr, R, I) );
 | 
			
		||||
		send_!3( I, R, prf(k(I,R), Nr, Ni, I, R) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  Nr:	Nonce;
 | 
			
		||||
		var    Ni:	Nonce;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Ni );
 | 
			
		||||
		send_!2( R, I, Nr, prf(k(I,R), Ni, Nr, R, I) );
 | 
			
		||||
		recv_!3( I, R, prf(k(I,R), Nr, Ni, I, R) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										78
									
								
								gui/Protocols/IKE/sts-mac.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								gui/Protocols/IKE/sts-mac.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,78 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	Station-to-Station Protocol (STS)
 | 
			
		||||
 * @reference	Diffie W., van Oorschot P. C., and Wiener M. J., 
 | 
			
		||||
 *				Authentication and authenticated key exchange,
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication and 
 | 
			
		||||
 *				Key Agreement
 | 
			
		||||
 * @description	STS adds a diGital signaure to the exchanged messages to 
 | 
			
		||||
 *				provide authentication for the Diffie-Hellman protocol. In 
 | 
			
		||||
 *				addition, the shared secret is used to provide further 
 | 
			
		||||
 *				assurances.
 | 
			
		||||
 * @variant		Variant using MACs
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
#define __STS__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r: Nonce;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, MAC(Zr, g(r), Gi) );
 | 
			
		||||
		send_!O2( O, O, MAC(Zi, g(r), Gi) );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O,  MAC(Zi, Gi, g(r)) );
 | 
			
		||||
		send_!O4( O, O,  MAC(Zr, Gi, g(r)) );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// It is not specified how the session key is derived from the ephemeral DH 
 | 
			
		||||
// secret Z; we use KDF(Z).
 | 
			
		||||
protocol sts-mac(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i:	Nonce;
 | 
			
		||||
		var   Gr:	Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, g(i) );
 | 
			
		||||
		recv_!2( R, I, Gr, {Gr, g(i)}sk(R), MAC(Zi, Gr, g(i)) );
 | 
			
		||||
		send_!3( I, R, {g(i), Gr}sk(I), MAC(Zi, g(i), Gr) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r:	Nonce;
 | 
			
		||||
		var    Gi:	Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Gi );
 | 
			
		||||
		send_!2( R, I, Gi, {g(r), Gi}sk(R), MAC(Zr, g(r), Gi) );
 | 
			
		||||
		recv_!3( I, R, {Gi, g(r)}sk(I), MAC(Zr, Gi, g(r)) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										79
									
								
								gui/Protocols/IKE/sts-main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								gui/Protocols/IKE/sts-main.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,79 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	Station-to-Station Protocol (STS)
 | 
			
		||||
 * @reference	Diffie W., van Oorschot P. C., and Wiener M. J., 
 | 
			
		||||
 *				Authentication and authenticated key exchange,
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication and 
 | 
			
		||||
 *				Key Agreement
 | 
			
		||||
 * @description	STS adds a digital signaure to the exchanged messages to 
 | 
			
		||||
 *				provide authentication for the Diffie-Hellman protocol. In 
 | 
			
		||||
 *				addition, the shared secret is used to provide further 
 | 
			
		||||
 *				assurances.
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
#define __STS__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This role serves as an "oracle" to ensure the executability of the 
 | 
			
		||||
 * protocol by taking care of the problems that arise from our way of 
 | 
			
		||||
 * modelling Diffie-Hellman keys.
 | 
			
		||||
 */
 | 
			
		||||
protocol @executability(O) {
 | 
			
		||||
#define Gi g(i)
 | 
			
		||||
#define Gr g(r)
 | 
			
		||||
	role O {
 | 
			
		||||
		var i, r: Nonce;
 | 
			
		||||
		var I, R: Agent;
 | 
			
		||||
 | 
			
		||||
		// msg 2
 | 
			
		||||
		recv_!O1( O, O, {{g(r), Gi}sk(R)}SKr );
 | 
			
		||||
		send_!O2( O, O, {{g(r), Gi}sk(R)}SKi );
 | 
			
		||||
 | 
			
		||||
		// msg 3
 | 
			
		||||
		recv_!O3( O, O,  {{g(i), Gr}sk(I)}SKi );
 | 
			
		||||
		send_!O4( O, O,  {{g(i), Gr}sk(I)}SKr );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
#undef Gi
 | 
			
		||||
#undef Gr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// It is not specified how the session key is derived from the ephemeral DH 
 | 
			
		||||
// secret Z; we use KDF(Z).
 | 
			
		||||
protocol sts-main(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i:	Nonce;
 | 
			
		||||
		var   Gr:	Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, g(i) );
 | 
			
		||||
		recv_!2( R, I, Gr, {{Gr, g(i)}sk(R)}SKi );
 | 
			
		||||
		send_!3( I, R, {{g(i), Gr}sk(I)}SKi );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r:	Nonce;
 | 
			
		||||
		var    Gi:	Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Gi );
 | 
			
		||||
		send_!2( R, I, g(r), {{g(r), Gi}sk(R)}SKr );
 | 
			
		||||
		recv_!3( I, R, {{Gi, g(r)}sk(I)}SKr );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								gui/Protocols/IKE/sts-modified.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								gui/Protocols/IKE/sts-modified.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
			
		||||
/** HEADDOC
 | 
			
		||||
 * @protocol	Station-to-Station Protocol (STS)
 | 
			
		||||
 * @reference	Diffie W., van Oorschot P. C., and Wiener M. J., 
 | 
			
		||||
 *				Authentication and authenticated key exchange,
 | 
			
		||||
 *				Boyd C. and Mathuria A., Protocols for Authentication and 
 | 
			
		||||
 *				Key Agreement
 | 
			
		||||
 * @description	STS adds a diGital signaure to the exchanged messages to 
 | 
			
		||||
 *				provide authentication for the Diffie-Hellman protocol. In 
 | 
			
		||||
 *				addition, the shared secret is used to provide further 
 | 
			
		||||
 *				assurances.
 | 
			
		||||
 * @variant		Variant proposed by Boyd et al to prevent unknown key-share
 | 
			
		||||
 *				attacks.
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
#define __STS__
 | 
			
		||||
#ifndef __ORACLE__
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// It is not specified how the session key is derived from the ephemeral DH 
 | 
			
		||||
// secret Z; we use KDF(Z).
 | 
			
		||||
protocol sts-modified(I, R)
 | 
			
		||||
{
 | 
			
		||||
	role I {
 | 
			
		||||
		fresh i:	Nonce;
 | 
			
		||||
		var   Gr:	Ticket;
 | 
			
		||||
 | 
			
		||||
		send_1( I, R, g(i) );
 | 
			
		||||
		recv_2( R, I, Gr, {Gr, g(i), I}sk(R) );
 | 
			
		||||
		send_3( I, R, {g(i), Gr, R}sk(I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( I, SKR, SKi );
 | 
			
		||||
 | 
			
		||||
		claim( I, Alive );
 | 
			
		||||
		claim( I, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	role R {
 | 
			
		||||
		fresh  r:	Nonce;
 | 
			
		||||
		var    Gi:	Ticket;
 | 
			
		||||
 | 
			
		||||
		recv_1( I, R, Gi );
 | 
			
		||||
		send_2( R, I, g(r), {g(r), Gi, I}sk(R) );
 | 
			
		||||
		recv_3( I, R, {Gi, g(r), R}sk(I) );
 | 
			
		||||
 | 
			
		||||
		/* SECURITY CLAIMS */
 | 
			
		||||
		claim( R, SKR, SKr );
 | 
			
		||||
 | 
			
		||||
		claim( R, Alive );
 | 
			
		||||
		claim( R, Weakagree );
 | 
			
		||||
				
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										149
									
								
								gui/Protocols/IKE/verify.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										149
									
								
								gui/Protocols/IKE/verify.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,149 @@
 | 
			
		||||
#############################################################################
 | 
			
		||||
#
 | 
			
		||||
# NAME
 | 
			
		||||
#	verify - batch protocol verifier script for scyther
 | 
			
		||||
#
 | 
			
		||||
# SYNOPSIS
 | 
			
		||||
#	./verify.sh [option]... [file]...
 | 
			
		||||
#
 | 
			
		||||
# DESCRIPTION
 | 
			
		||||
#	Verify protocol specifications using scyther.
 | 
			
		||||
#
 | 
			
		||||
# OPTIONS
 | 
			
		||||
#
 | 
			
		||||
#	-d	Debug mode [false]
 | 
			
		||||
#	-e	Execution environment [cluster]
 | 
			
		||||
#	-h	Help
 | 
			
		||||
#	-i	Skip attack patterns of the form Alice talking to Alice
 | 
			
		||||
#	-l	lower bound of claims to check [1]
 | 
			
		||||
#	-m	Adversary-compromise model [ext]
 | 
			
		||||
#	-o	Output directory (attack graphs) [./graphs/]
 | 
			
		||||
#	-r	number of runs [6]
 | 
			
		||||
#	-t	timeout in s
 | 
			
		||||
#	-u	upper bound of claims to check [1]
 | 
			
		||||
#
 | 
			
		||||
# EXAMPLE
 | 
			
		||||
#	./verify.sh -m br -o . *.spdl
 | 
			
		||||
#
 | 
			
		||||
#############################################################################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
# Default values
 | 
			
		||||
CLAIM[0]=1
 | 
			
		||||
CLAIM[1]=1
 | 
			
		||||
DEBUG=false
 | 
			
		||||
ENV='cluster'
 | 
			
		||||
FILES="*.spdl"
 | 
			
		||||
INITUNIQUE=
 | 
			
		||||
MODEL='ext'
 | 
			
		||||
OUTDIR='./graphs'
 | 
			
		||||
RUNS='-r 6'
 | 
			
		||||
SCYTHER='../scyther/Scyther/scyther-linux'
 | 
			
		||||
TIMEOUT=
 | 
			
		||||
 | 
			
		||||
# Adversary-compromise models
 | 
			
		||||
# EXT
 | 
			
		||||
MODELS[0]=
 | 
			
		||||
# INT
 | 
			
		||||
MODELS[1]='--LKRothers 1'
 | 
			
		||||
# CA
 | 
			
		||||
MODELS[2]='--LKRactor 1'
 | 
			
		||||
# AF
 | 
			
		||||
MODELS[3]='--LKRafter 1'
 | 
			
		||||
# AFC
 | 
			
		||||
MODELS[4]='--LKRaftercorrect 1'
 | 
			
		||||
# BR
 | 
			
		||||
MODELS[5]='--LKRothers 1 --SKR 1 --SKRinfer' # (inferred session keys)
 | 
			
		||||
MODELS[6]='--LKRothers 1 --SKR 1'
 | 
			
		||||
# CKw
 | 
			
		||||
MODELS[7]='--LKRothers 1 --LKRactor 1 --LKRaftercorrect 1 --SKR 1 --SKRinfer --SSR 1'
 | 
			
		||||
MODELS[8]='--LKRothers 1 --LKRactor 1 --LKRaftercorrect 1 --SKR 1 --SSR 1'
 | 
			
		||||
# CK
 | 
			
		||||
MODELS[9]='--LKRothers 1 --LKRafter 1 --LKRaftercorrect 1 --SKR 1 --SKRinfer --SSR 1'
 | 
			
		||||
MODELS[10]='--LKRothers 1 --LKRafter 1 --LKRaftercorrect 1 --SKR 1 --SSR 1'
 | 
			
		||||
# eCK-1
 | 
			
		||||
MODELS[11]='--LKRothers 1 --SKR 1 --SKRinfer --RNR 1'
 | 
			
		||||
MODELS[12]='--LKRothers 1 --SKR 1 --RNR 1'
 | 
			
		||||
# eCK-2
 | 
			
		||||
MODELS[13]='--LKRothers 1 --LKRactor 1 --LKRaftercorrect 1 --SKR 1 --SKRinfer'
 | 
			
		||||
MODELS[14]='--LKRothers 1 --LKRactor 1 --LKRaftercorrect 1 --SKR 1'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Parse command line arguments
 | 
			
		||||
while getopts “de:hil:m:o:r:t:u:” FLAG;
 | 
			
		||||
do
 | 
			
		||||
	case $FLAG in
 | 
			
		||||
		d) DEBUG=true;;
 | 
			
		||||
		e) ENV=$OPTARG;;
 | 
			
		||||
		i) INITUNIQUE='--init-unique';;
 | 
			
		||||
		l) CLAIM[0]=$OPTARG;;
 | 
			
		||||
		m) MODEL=$OPTARG;;
 | 
			
		||||
		o) OUTDIR=$OPTARG;;
 | 
			
		||||
		r) RUNS="-r $OPTARG";;
 | 
			
		||||
		t) TIMEOUT="-T $OPTARG";;
 | 
			
		||||
		u) CLAIM[1]=$OPTARG;;
 | 
			
		||||
		h|?)
 | 
			
		||||
			printf "Usage: %s: [-l num][-u num][-d][-e [cluster|remote|local]][-h][-m model][-o value][-r num][-t sec]file[...]\n" $(basename $0) >&2 
 | 
			
		||||
			exit 1;;
 | 
			
		||||
	esac
 | 
			
		||||
done
 | 
			
		||||
shift $(($OPTIND - 1))
 | 
			
		||||
 | 
			
		||||
# Remaining arguments treated as specification files
 | 
			
		||||
if [ -n "$*" ]; then
 | 
			
		||||
	FILES="$*"
 | 
			
		||||
	# mkdir -p "$OUTDIR$TSTAMP"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Parse model identifiers
 | 
			
		||||
mflags=
 | 
			
		||||
case $MODEL in
 | 
			
		||||
	int)	mflags=${MODELS[1]};;
 | 
			
		||||
	ca) 	mflags=${MODELS[2]};;
 | 
			
		||||
	af) 	mflags=${MODELS[3]};;
 | 
			
		||||
	afc)	mflags=${MODELS[4]};;
 | 
			
		||||
	bri)	mflags=${MODELS[5]};;
 | 
			
		||||
	br) 	mflags=${MODELS[6]};;
 | 
			
		||||
	ckwi)	mflags=${MODELS[7]};;
 | 
			
		||||
	ckw)	mflags=${MODELS[8]};;
 | 
			
		||||
	cki)	mflags=${MODELS[9]};;
 | 
			
		||||
	ck)		mflags=${MODELS[10]};;
 | 
			
		||||
	eck1i)	mflags=${MODELS[11]};;
 | 
			
		||||
	eck1)	mflags=${MODELS[12]};;
 | 
			
		||||
	eck2i)	mflags=${MODELS[13]};;
 | 
			
		||||
	eck2)	mflags=${MODELS[14]};;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Verify
 | 
			
		||||
for file in $FILES;
 | 
			
		||||
do
 | 
			
		||||
	EXT=`echo "$file" | sed 's/^.*\.//'`
 | 
			
		||||
	if [ "$EXT" == 'spdl' ]; then
 | 
			
		||||
		# Extract protocol name
 | 
			
		||||
		tmp=`basename $file .spdl`
 | 
			
		||||
		p=`basename $tmp .pp`
 | 
			
		||||
 | 
			
		||||
		# Execute scyther for selected models and claim
 | 
			
		||||
		for (( c=${CLAIM[0]}; c<=${CLAIM[1]}; c++ ));
 | 
			
		||||
		do
 | 
			
		||||
			init="$SCYTHER $TIMEOUT --force-regular $INITUNIQUE $RUNS $mflags $file -d -o $OUTDIR/${p}_adv-${MODEL}_I$c.dot --filter=$p,I$c"
 | 
			
		||||
			resp="$SCYTHER $TIMEOUT --force-regular $INITUNIQUE $RUNS $mflags $file -d -o $OUTDIR/${p}_adv-${MODEL}_R$c.dot --filter=$p,R$c"
 | 
			
		||||
			if $DEBUG; then
 | 
			
		||||
				echo $init
 | 
			
		||||
				echo $resp
 | 
			
		||||
			elif [ $ENV = "cluster" ]; then
 | 
			
		||||
				bsub -W 08:00 -R "rusage[mem=4096]" $init
 | 
			
		||||
				bsub -W 08:00 -R "rusage[mem=4096]" $resp
 | 
			
		||||
			else # $ENV = local
 | 
			
		||||
				time $init
 | 
			
		||||
				time $resp
 | 
			
		||||
			fi
 | 
			
		||||
		done
 | 
			
		||||
	else
 | 
			
		||||
		printf "WARNING: %s could not be processed." $file
 | 
			
		||||
	fi
 | 
			
		||||
done
 | 
			
		||||
							
								
								
									
										20
									
								
								gui/Protocols/IKE/verify_all.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								gui/Protocols/IKE/verify_all.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
if [ -n "$*" ]; then
 | 
			
		||||
	FILES="$*"
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m int $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m ca $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m afc $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m af $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m br $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m bri $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m ckw $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m ckwi $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m ck $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m cki $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m eck1 $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m eck1i $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m eck2 $FILES
 | 
			
		||||
	./verify.sh -i -r 4 -l 1 -u 3 -e remote -m eck2i $FILES
 | 
			
		||||
fi
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user