fs2pvdir = .
fs2cvdir = fs2cv
pvdir = bin
cvdir = cryptoverif1.07

fsc = fsc --mlcompatibility -r FSharp.Powerpack.dll
fscx = $(fsc) --define fs --define concrete --define tlsonly -r System.Security.dll 
fscx-a = $(fsc) --define fs --define leak --define tlsonly
fs2pv = $(fs2pvdir)/bin/fs2pv.exe -maxopt --define tlsonly
fs2f = $(fs2pvdir)/bin/fs2f.exe --define tlsonly
fs2cv = $(fs2cvdir)/fs2cv.exe --define cv -datalib
proverif = $(pvdir)/analyzer.exe 
goal2gen = $(fs2pvdir)/bin/goal2gen.exe 
cv = $(cvdir)/prover.exe


libdir = lib
idir=$(libdir)/interfaces/
sdir=$(libdir)/symbolic/
cdir=$(libdir)/concrete-fs/

ilib = $(idir)db.mli $(idir)cell.mli $(idir)data.mli $(idir)crypto.mli $(idir)net.mli $(idir)prins.mli
slib = $(sdir)db.ml $(sdir)cell.ml $(sdir)data.ml $(sdir)crypto.ml $(sdir)net.ml $(sdir)prins.ml
clib = $(cdir)db.fs $(cdir)cell.fs $(cdir)data.fs $(cdir)crypto.fs $(cdir)net.fs $(cdir)prins.fs

lib-c = $(ilib) $(cdir)pi.fs $(clib)
lib-a = $(idir)pi.mli $(ilib) $(sdir)pi.ml $(slib) 
lib-pv = $(ilib) $(slib) 
lib-cv = $(sdir)data.ml $(idir)crypto.mli $(idir)db.mli $(sdir)net.ml $(idir)prins.mli

all: exec pv cv
exec: tls.exe tls-a.exe 
pv: tls.pv tls.res tls.html
cv: thm-record-auth-comp thm-record-secrecy-comp thm-handshake-secrecy-comp thm-handshake-auth-comp




### core, protocol, and application libraries 

itlslib = $(idir)formats_ciphersuites.mli formats.mli $(idir)conversions_lowlevel.mli
stlslib = $(sdir)formats_ciphersuites.ml formats.ml $(sdir)conversions_lowlevel.ml 
ctlslib = $(cdir)formats_ciphersuites.ml formats.ml $(cdir)conversions_lowlevel.ml 

tlslib = conversions.mli conversions.ml record.mli record.ml handshake.mli handshake.ml
tlsrolib = conversions.mli conversions.ml record.mli record.ml recordonly.mli recordonly.ml

tlslib-c = $(itlslib) $(ctlslib) $(tlslib)
tlslib-a = $(itlslib) $(stlslib) $(tlslib)
tlsrolib-a = $(itlslib) $(stlslib) $(tlsrolib)
tlslib-cv = $(stlslib) conversions.ml record.mli record.ml handshake.mli handshake.ml
tlsrolib-cv = $(stlslib) conversions.ml record.mli record.ml recordonly.ml

tlsapp = app-passwd.mli app-passwd.ml main.ml
tlsallapp = app-http.mli app-http.ml $(tlsapp)


### executables

tls.exe: $(lib-c) $(tlslib-c) $(tlsallapp)
	$(fscx) $^ -o $@

tls-a.exe: $(lib-a) $(tlslib-a) $(tlsapp)
	$(fscx-a) $^ -o $@

record-a.exe: $(lib-a) $(tlsrolib-a) $(tlsapp)
	$(fscx-a) --define recordonly $^ -o $@

locAll: 
	wc formats.mli formats.ml $(idir)conversions_lowlevel.mli $(cdir)conversions_lowlevel.ml $(sdir)conversions_lowlevel.ml $(tlslib) $(tlsallapp)


### ProVerif analysis
tls-pv = $(lib-pv) $(tlslib-a)

pvall: tls.res passwd.res
pvpartial: record.res hsauth.res resauth.res hssecr.res recauth.res recsecr.res pwd.res

res = --define res
hssecr = --define hssecr
rec = --define record
recsecr = --define recordsecr
defnosecr = $(res) $(rec)
defall = $(defnosecr) $(hssecr) $(recsecr)

tls.query: preambule.query hsauth.query resauth.query hssecr.query recauth.query recsecr.query
	cat $^ > $@

# full analysis
tls.pv: tls.query $(tls-pv)
	time ( $(fs2pv) $(defall) -o $@ -q $^ )
	time ( $(fs2f) $(defall) -o tmp $(tls-pv))
	wc -l tmp.fs
	rm tmp.fs

passwd.pv: passwd.query $(tls-pv) app-passwd.mli app-passwd.ml
	time ( $(fs2pv) --define passwd $(defnosecr) -o $@ -q $^ )


# partial analyses
record.pv: record.query $(lib-pv) $(itlslib) $(stlslib) $(tlsrolib-a)
	time ( $(fs2pv) --define record --define recordsecr -o $@ -q $^ ) 

hsauth.pv: hsauth.query preambule.query $(tls-pv)
	cat preambule.query hsauth.query > query
	time ( $(fs2pv) -o $@ -q query $(tls-pv) )

resauth.pv: resauth.query preambule.query $(tls-pv)
	cat preambule.query resauth.query > query
	time ( $(fs2pv) --define res -o $@ -q query $(tls-pv) )

hssecr.pv: hssecr.query $(tls-pv)
	time ( $(fs2pv) --define hssecr -o $@ -q $^ )

recauth.pv: recauth.query preambule.query $(tls-pv)
	cat preambule.query recauth.query > query
	time ( $(fs2pv) --define record --define res -o $@ -q query $(tls-pv) )

recsecr.pv: recsecr.query preambule.query $(tls-pv)
	cat preambule.query recsecr.query > query
	time ( $(fs2pv) --define recordsecr -o $@ -q query $(tls-pv) )

pwd.pv: passwd.query $(tls-pv) app-passwd.mli app-passwd.ml
	time ( $(fs2pv) --define passwd -o $@ -q $^ )



%.res: %.pv
	{ time $(proverif) -in pi $< 2> proverif.err; } > $@ 2> $*.time
	grep '^RESULT' $@ > $*.results
	@cat $*.time $*.results

%.html: %.res
	grep ^goal $< > .tmp
	$(goal2gen) .tmp > $@
	rm -f .tmp



### CryptoVerif analysis 

orecauth.cv: $(lib-cv) $(tlsrolib-cv)
	$(fs2cv) --define thm_record_auth_comp -u decl.txt -o $@ $^

orecauth-decl.cv: $(lib-cv) $(tlsrolib-cv)
	$(fs2cv) --define thm_record_auth_comp -u decl.txt -o orecauth.cv $^

record_auth.cv: types.cv orecauth-decl.cv crypto-record_auth.cv record_auth.cvquery orecauth.cv 
	cat $^ > $@

record_auth: record_auth.cv tls.cvl
	$(cv) -lib tls record_auth.cv

thm-record-auth-comp : record_auth



orecsecr.cv: $(lib-cv) $(tlsrolib-cv)
	$(fs2cv) --define thm_record_secr_comp -u decl.txt -o $@ $^

orecsecr-decl.cv: $(lib-cv) $(tlsrolib-cv)
	$(fs2cv) --define thm_record_secr_comp -u decl.txt -o orecsecr.cv $^

record_secrecy.cv: types.cv orecsecr-decl.cv crypto-record_secr.cv orecsecr.cv 
	cat $^ > $@

record_secrecy: record_secrecy.cv
	$(cv) -lib tls record_secrecy.cv

thm-record-secrecy-comp : record_secrecy



ohs.cv: $(lib-cv) $(tlslib-cv)
	time ( $(fs2cv) -u decl.txt -o $@ $^ )

ohs-decl.cv: $(lib-cv) $(tlslib-cv)
	time ( $(fs2cv) -u decl.txt -o ohs.cv $^ )

hs.cv: types.cv ohs-decl.cv crypto-hs.cv ohs.cv 
	cat $^ > $@

hs: hs.cv
	$(cv) -lib tls hs.cv

thm-handshake-secrecy-comp: hs



oha.cv: $(lib-cv) $(tlslib-cv)
	time ( $(fs2cv) --define thm_handshake_auth_comp -u decl.txt -o $@ $^ )

oha-decl.cv: $(lib-cv) $(tlslib-cv)
	time ( $(fs2cv) --define thm_handshake_auth_comp -u decl.txt -o oha.cv $^ )

ha.cv: types.cv oha-decl.cv crypto-ha.cv ha.cvquery oha.cv 
	cat $^ > $@

ha: ha.cv
	$(cv) -lib tls ha.cv

thm-handshake-auth-comp: ha





genlib = $(ilib) $(slib) $(clib) $(idir)pi.mli $(cdir)pi.fs $(sdir)pi.ml
alltls = $(itlslib) $(stlslib) $(ctlslib) $(tlslib) recordonly.mli recordonly.ml $(tlsallapp)
pvqueries = preambule.query hsauth.query resauth.query hssecr.query recauth.query recsecr.query passwd.query
cvfiles = tls.cvl crypto-record_auth.cv crypto-record_secr.cv crypto-hs.cv crypto-ha.cv record_auth.cvquery ha.cvquery types.cv decl.txt
binaries = $(fs2cvdir)/fs2cv.exe $(fs2pvdir)/bin/fs2pv.exe $(fs2pvdir)/bin/goal2gen.exe 
ssl1 = ssl1/ssl1.pv ssl1/ssl1.attack

tls.tgz: Makefile README version $(genlib) $(alltls) $(pvqueries) $(cvfiles) $(binaries) $(ssl1)
	tar -zcf tls.tgz $^ 



clean:
	@rm -f .tmp *.exe *.pdb *.dll *.obj *.cm* tls.pv passwd.pv *.res *~ *.html query \
        o.cv record_auth.cv record_secrecy.cv handshake.cv orecauth.cv orecsecr.cv ohs.cv \
        orecauth-decl.cv orecsecr-decl.cv oha-decl.cv ohs-decl.cv


