From 8ff8e87c3e22df9738df4271236598b7ad52829c Mon Sep 17 00:00:00 2001 From: Matthew Hutchings <mwh1g17@soton.ac.uk> Date: Mon, 11 May 2020 23:44:06 +0100 Subject: [PATCH] Updated VagrantFiles to include install instructions --- Vagrant Files/.gitkeep | 0 Vagrant Files/InstallationInstructions.txt | 17 + Vagrant Files/files/guide.txt | 10 + .../scyther => files}/scyther-manual.pdf | Bin Vagrant Files/files/test folder/guide.txt | 1 - .../shared/GitLink/sessionkey.sdpl.txt | 42 + Vagrant Files/shared/scyther/.gitignore | 4 - Vagrant Files/shared/scyther/Changelog.txt | 159 ---- .../scyther/GNU-General-Public-License.txt | 339 ------- Vagrant Files/shared/scyther/Gui/About.py | 137 --- .../shared/scyther/Gui/Attackwindow.py | 330 ------- Vagrant Files/shared/scyther/Gui/Editor.py | 195 ---- Vagrant Files/shared/scyther/Gui/Error.py | 51 - Vagrant Files/shared/scyther/Gui/Icon.py | 52 - .../shared/scyther/Gui/Mainwindow.py | 322 ------- Vagrant Files/shared/scyther/Gui/Makeimage.py | 180 ---- Vagrant Files/shared/scyther/Gui/Misc.py | 90 -- .../shared/scyther/Gui/Preference.py | 240 ----- .../shared/scyther/Gui/Scytherthread.py | 543 ----------- .../shared/scyther/Gui/Settingswindow.py | 196 ---- Vagrant Files/shared/scyther/Gui/Temporary.py | 64 -- Vagrant Files/shared/scyther/Gui/Version.py | 1 - Vagrant Files/shared/scyther/Gui/__init__.py | 19 - Vagrant Files/shared/scyther/INSTALL.md | 96 -- Vagrant Files/shared/scyther/INSTALL.txt | 85 -- .../shared/scyther/Images/scyther-gui-16.ico | Bin 1150 -> 0 bytes .../shared/scyther/Images/scyther-gui-32.ico | Bin 4286 -> 0 bytes .../shared/scyther/Images/scyther-gui-64.ico | Bin 16958 -> 0 bytes .../shared/scyther/Images/scyther-icon.svg | 222 ----- .../shared/scyther/Images/scyther-splash.png | Bin 119951 -> 0 bytes .../shared/scyther/Protocols/Demo/ns3.spdl | 41 - .../scyther/Protocols/Demo/nsl3-broken.spdl | 40 - .../Protocols/Demo/nsl3-updated-both.spdl | 78 -- .../shared/scyther/Protocols/Demo/nsl3.spdl | 38 - .../Protocols/IEEE-WIMAX/pkmv2rsa.spdl | 46 - .../IEEE-WIMAX/pkmv2rsacorrected.spdl | 46 - .../Protocols/IEEE-WIMAX/pkmv2satek.spdl | 63 -- .../scyther/Protocols/IEEE-WIMAX/pqr.spdl | 84 -- .../Protocols/IEEE-WIMAX/rsaplussatek.spdl | 74 -- .../IEEE-WIMAX/rsaplussatekcorrected.spdl | 73 -- .../shared/scyther/Protocols/IKE/Makefile | 11 - .../shared/scyther/Protocols/IKE/common.h | 157 --- .../scyther/Protocols/IKE/ikev1-pk-a1.cpp | 96 -- .../scyther/Protocols/IKE/ikev1-pk-a1.spdl | 129 --- .../scyther/Protocols/IKE/ikev1-pk-a12.cpp | 95 -- .../scyther/Protocols/IKE/ikev1-pk-a12.spdl | 128 --- .../scyther/Protocols/IKE/ikev1-pk-a2.cpp | 97 -- .../scyther/Protocols/IKE/ikev1-pk-a2.spdl | 129 --- .../scyther/Protocols/IKE/ikev1-pk-a22.cpp | 95 -- .../scyther/Protocols/IKE/ikev1-pk-a22.spdl | 128 --- .../scyther/Protocols/IKE/ikev1-pk-m.cpp | 103 -- .../scyther/Protocols/IKE/ikev1-pk-m.spdl | 136 --- .../scyther/Protocols/IKE/ikev1-pk-m2.cpp | 102 -- .../scyther/Protocols/IKE/ikev1-pk-m2.spdl | 135 --- .../scyther/Protocols/IKE/ikev1-pk2-a.cpp | 97 -- .../scyther/Protocols/IKE/ikev1-pk2-a.spdl | 129 --- .../scyther/Protocols/IKE/ikev1-pk2-a2.cpp | 97 -- .../scyther/Protocols/IKE/ikev1-pk2-a2.spdl | 128 --- .../scyther/Protocols/IKE/ikev1-pk2-m.cpp | 104 -- .../scyther/Protocols/IKE/ikev1-pk2-m.spdl | 136 --- .../scyther/Protocols/IKE/ikev1-pk2-m2.cpp | 106 --- .../scyther/Protocols/IKE/ikev1-pk2-m2.spdl | 136 --- .../scyther/Protocols/IKE/ikev1-psk-a.cpp | 94 -- .../scyther/Protocols/IKE/ikev1-psk-a.spdl | 125 --- .../Protocols/IKE/ikev1-psk-m-perlman.cpp | 101 -- .../Protocols/IKE/ikev1-psk-m-perlman.spdl | 131 --- .../scyther/Protocols/IKE/ikev1-psk-m.cpp | 100 -- .../scyther/Protocols/IKE/ikev1-psk-m.spdl | 130 --- .../Protocols/IKE/ikev1-quick-noid.cpp | 102 -- .../Protocols/IKE/ikev1-quick-noid.spdl | 124 --- .../Protocols/IKE/ikev1-quick-nopfs.cpp | 96 -- .../Protocols/IKE/ikev1-quick-nopfs.spdl | 118 --- .../scyther/Protocols/IKE/ikev1-quick.cpp | 70 -- .../scyther/Protocols/IKE/ikev1-quick.spdl | 91 -- .../Protocols/IKE/ikev1-sig-a-perlman1.cpp | 99 -- .../Protocols/IKE/ikev1-sig-a-perlman1.spdl | 130 --- .../Protocols/IKE/ikev1-sig-a-perlman2.cpp | 99 -- .../Protocols/IKE/ikev1-sig-a-perlman2.spdl | 130 --- .../scyther/Protocols/IKE/ikev1-sig-a1.cpp | 98 -- .../scyther/Protocols/IKE/ikev1-sig-a1.spdl | 130 --- .../scyther/Protocols/IKE/ikev1-sig-a2.cpp | 99 -- .../scyther/Protocols/IKE/ikev1-sig-a2.spdl | 130 --- .../Protocols/IKE/ikev1-sig-m-perlman.cpp | 100 -- .../Protocols/IKE/ikev1-sig-m-perlman.spdl | 133 --- .../scyther/Protocols/IKE/ikev1-sig-m.cpp | 102 -- .../scyther/Protocols/IKE/ikev1-sig-m.spdl | 134 --- .../Protocols/IKE/ikev2-child-nopfs.cpp | 78 -- .../Protocols/IKE/ikev2-child-nopfs.spdl | 112 --- .../scyther/Protocols/IKE/ikev2-child.cpp | 87 -- .../scyther/Protocols/IKE/ikev2-child.spdl | 121 --- .../scyther/Protocols/IKE/ikev2-eap.cpp | 131 --- .../scyther/Protocols/IKE/ikev2-eap.spdl | 160 ---- .../scyther/Protocols/IKE/ikev2-eap2.cpp | 138 --- .../scyther/Protocols/IKE/ikev2-eap2.spdl | 160 ---- .../scyther/Protocols/IKE/ikev2-mac.cpp | 104 -- .../scyther/Protocols/IKE/ikev2-mac.spdl | 133 --- .../scyther/Protocols/IKE/ikev2-mac2.cpp | 104 -- .../scyther/Protocols/IKE/ikev2-mac2.spdl | 133 --- .../scyther/Protocols/IKE/ikev2-mactosig.cpp | 104 -- .../scyther/Protocols/IKE/ikev2-mactosig.spdl | 132 --- .../scyther/Protocols/IKE/ikev2-mactosig2.cpp | 103 -- .../Protocols/IKE/ikev2-mactosig2.spdl | 131 --- .../IKE/ikev2-sig-child-composed.cpp | 138 --- .../IKE/ikev2-sig-child-composed.spdl | 165 ---- .../scyther/Protocols/IKE/ikev2-sig-child.cpp | 138 --- .../Protocols/IKE/ikev2-sig-child.spdl | 165 ---- .../IKE/ikev2-sig-child2-composed.cpp | 138 --- .../IKE/ikev2-sig-child2-composed.spdl | 165 ---- .../Protocols/IKE/ikev2-sig-child2.cpp | 138 --- .../Protocols/IKE/ikev2-sig-child2.spdl | 165 ---- .../scyther/Protocols/IKE/ikev2-sig.cpp | 103 -- .../scyther/Protocols/IKE/ikev2-sig.spdl | 132 --- .../scyther/Protocols/IKE/ikev2-sig2.cpp | 103 -- .../scyther/Protocols/IKE/ikev2-sig2.spdl | 132 --- .../scyther/Protocols/IKE/ikev2-sigtomac.cpp | 104 -- .../scyther/Protocols/IKE/ikev2-sigtomac.spdl | 132 --- .../scyther/Protocols/IKE/ikev2-sigtomac2.cpp | 104 -- .../Protocols/IKE/ikev2-sigtomac2.spdl | 132 --- .../scyther/Protocols/IKE/jfki-core.cpp | 54 -- .../scyther/Protocols/IKE/jfki-core.spdl | 88 -- .../shared/scyther/Protocols/IKE/jfki.cpp | 84 -- .../shared/scyther/Protocols/IKE/jfki.spdl | 118 --- .../scyther/Protocols/IKE/jfkr-core.cpp | 78 -- .../scyther/Protocols/IKE/jfkr-core.spdl | 112 --- .../shared/scyther/Protocols/IKE/jfkr.cpp | 83 -- .../shared/scyther/Protocols/IKE/jfkr.spdl | 117 --- .../shared/scyther/Protocols/IKE/make-mpa.py | 63 -- .../scyther/Protocols/IKE/mpa/README.txt | 6 - .../shared/scyther/Protocols/IKE/oakley-a.cpp | 60 -- .../scyther/Protocols/IKE/oakley-a.spdl | 91 -- .../scyther/Protocols/IKE/oakley-alt.cpp | 63 -- .../scyther/Protocols/IKE/oakley-alt.spdl | 94 -- .../shared/scyther/Protocols/IKE/oakley-c.cpp | 105 -- .../scyther/Protocols/IKE/oakley-c.spdl | 140 --- .../shared/scyther/Protocols/IKE/pp.sh | 21 - .../shared/scyther/Protocols/IKE/scanner.py | 800 ---------------- .../scyther/Protocols/IKE/skeme-basic.cpp | 61 -- .../scyther/Protocols/IKE/skeme-basic.spdl | 87 -- .../scyther/Protocols/IKE/skeme-psk.cpp | 82 -- .../scyther/Protocols/IKE/skeme-psk.spdl | 109 --- .../scyther/Protocols/IKE/skeme-rekey.cpp | 80 -- .../scyther/Protocols/IKE/skeme-rekey.spdl | 111 --- .../shared/scyther/Protocols/IKE/sts-mac.cpp | 78 -- .../shared/scyther/Protocols/IKE/sts-mac.spdl | 112 --- .../shared/scyther/Protocols/IKE/sts-main.cpp | 79 -- .../scyther/Protocols/IKE/sts-main.spdl | 114 --- .../scyther/Protocols/IKE/sts-modified.cpp | 55 -- .../scyther/Protocols/IKE/sts-modified.spdl | 88 -- .../shared/scyther/Protocols/IKE/verify.sh | 149 --- .../scyther/Protocols/IKE/verify_all.sh | 20 - .../scyther/Protocols/ISO-9798/Makefile | 16 - .../scyther/Protocols/ISO-9798/iso25-tag.spdl | 78 -- .../scyther/Protocols/ISO-9798/iso26-tag.spdl | 95 -- .../ISO-9798/isoiec-9798-2-1-udkey.spdl | 35 - .../Protocols/ISO-9798/isoiec-9798-2-1.spdl | 55 -- .../ISO-9798/isoiec-9798-2-2-udkey.spdl | 40 - .../Protocols/ISO-9798/isoiec-9798-2-2.spdl | 59 -- .../ISO-9798/isoiec-9798-2-3-udkey.spdl | 49 - .../Protocols/ISO-9798/isoiec-9798-2-3.spdl | 67 -- .../ISO-9798/isoiec-9798-2-4-udkey.spdl | 50 - .../Protocols/ISO-9798/isoiec-9798-2-4.spdl | 88 -- .../Protocols/ISO-9798/isoiec-9798-2-5.spdl | 93 -- .../Protocols/ISO-9798/isoiec-9798-2-6.spdl | 90 -- .../Protocols/ISO-9798/isoiec-9798-3-1.spdl | 33 - .../Protocols/ISO-9798/isoiec-9798-3-2.spdl | 39 - .../Protocols/ISO-9798/isoiec-9798-3-3.spdl | 44 - .../Protocols/ISO-9798/isoiec-9798-3-4.spdl | 46 - .../Protocols/ISO-9798/isoiec-9798-3-5.spdl | 49 - .../Protocols/ISO-9798/isoiec-9798-3-6-1.cpp | 12 - .../Protocols/ISO-9798/isoiec-9798-3-6-1.spdl | 69 -- .../Protocols/ISO-9798/isoiec-9798-3-6-2.cpp | 12 - .../Protocols/ISO-9798/isoiec-9798-3-6-2.spdl | 69 -- .../ISO-9798/isoiec-9798-3-6.template | 68 -- .../Protocols/ISO-9798/isoiec-9798-3-7-1.cpp | 12 - .../Protocols/ISO-9798/isoiec-9798-3-7-1.spdl | 66 -- .../Protocols/ISO-9798/isoiec-9798-3-7-2.cpp | 12 - .../Protocols/ISO-9798/isoiec-9798-3-7-2.spdl | 68 -- .../ISO-9798/isoiec-9798-3-7.template | 67 -- .../ISO-9798/isoiec-9798-4-1-udkey.spdl | 39 - .../Protocols/ISO-9798/isoiec-9798-4-1.spdl | 58 -- .../ISO-9798/isoiec-9798-4-2-udkey.spdl | 43 - .../Protocols/ISO-9798/isoiec-9798-4-2.spdl | 62 -- .../ISO-9798/isoiec-9798-4-3-udkey.spdl | 50 - .../Protocols/ISO-9798/isoiec-9798-4-3.spdl | 69 -- .../ISO-9798/isoiec-9798-4-4-udkey.spdl | 52 - .../Protocols/ISO-9798/isoiec-9798-4-4.spdl | 75 -- .../Protocols/MultiProtocolAttacks/BKE.spdl | 40 - .../andrew-ban-concrete.spdl | 67 -- .../MultiProtocolAttacks/andrew-ban.spdl | 52 - .../MultiProtocolAttacks/andrew-lowe-ban.spdl | 57 -- .../Protocols/MultiProtocolAttacks/boyd.spdl | 56 -- .../MultiProtocolAttacks/ccitt509-ban3.spdl | 39 - .../denning-sacco-lowe.spdl | 66 -- .../MultiProtocolAttacks/denning-sacco.spdl | 55 -- .../MultiProtocolAttacks/gong-nonce-b.spdl | 60 -- .../MultiProtocolAttacks/gong-nonce.spdl | 57 -- .../isoiec11770-2-13.spdl | 42 - .../MultiProtocolAttacks/kaochow-v2.spdl | 55 -- .../MultiProtocolAttacks/kaochow-v3.spdl | 59 -- .../MultiProtocolAttacks/kaochow.spdl | 55 -- .../Protocols/MultiProtocolAttacks/ksl.spdl | 75 -- .../needham-schroeder-sk-amend.spdl | 66 -- .../needham-schroeder-sk.spdl | 56 -- .../Protocols/MultiProtocolAttacks/new.txt | 5 - .../Protocols/MultiProtocolAttacks/ns3.spdl | 41 - .../Protocols/MultiProtocolAttacks/nsl3.spdl | 39 - .../MultiProtocolAttacks/otwayrees.spdl | 56 -- .../Protocols/MultiProtocolAttacks/soph.spdl | 21 - .../MultiProtocolAttacks/splice-as-cj.spdl | 66 -- .../MultiProtocolAttacks/splice-as-hc.spdl | 61 -- .../MultiProtocolAttacks/splice-as.spdl | 66 -- .../Protocols/MultiProtocolAttacks/tmn.spdl | 51 - .../MultiProtocolAttacks/wmf-brutus.spdl | 32 - .../MultiProtocolAttacks/wmf-lowe.spdl | 63 -- .../Protocols/MultiProtocolAttacks/wmf.spdl | 54 -- .../MultiProtocolAttacks/woo-lam-pi-1.spdl | 41 - .../MultiProtocolAttacks/woo-lam-pi-2.spdl | 41 - .../MultiProtocolAttacks/woo-lam-pi-3.spdl | 41 - .../MultiProtocolAttacks/woo-lam-pi-f.spdl | 41 - .../MultiProtocolAttacks/woo-lam.spdl | 64 -- .../yahalom-ban-paulson-modified.spdl | 49 - .../yahalom-ban-paulson.spdl | 47 - .../MultiProtocolAttacks/yahalom-ban.spdl | 55 -- .../MultiProtocolAttacks/yahalom-lowe.spdl | 53 -- .../MultiProtocolAttacks/yahalom.spdl | 52 - .../shared/scyther/Protocols/NotModelled.txt | 23 - .../Protocols/andrew-ban-concrete.spdl | 67 -- .../shared/scyther/Protocols/andrew-ban.spdl | 54 -- .../scyther/Protocols/andrew-lowe-ban.spdl | 57 -- .../shared/scyther/Protocols/andrew.spdl | 50 - .../shared/scyther/Protocols/ccitt509-1.spdl | 35 - .../shared/scyther/Protocols/ccitt509-1c.spdl | 34 - .../shared/scyther/Protocols/ccitt509-3.spdl | 45 - .../scyther/Protocols/ccitt509-ban3.spdl | 39 - .../scyther/Protocols/denning-sacco-lowe.spdl | 67 -- .../scyther/Protocols/denning-sacco.spdl | 53 -- .../shared/scyther/Protocols/kaochow-v2.spdl | 55 -- .../shared/scyther/Protocols/kaochow-v3.spdl | 59 -- .../shared/scyther/Protocols/kaochow.spdl | 55 -- .../shared/scyther/Protocols/ksl-lowe.spdl | 73 -- .../shared/scyther/Protocols/ksl.spdl | 72 -- .../multi-NSL/heuristics-results.txt | 776 --------------- .../Protocols/multi-NSL/mnsl-results.txt | 33 - .../Protocols/multi-NSL/multinsl-generator.py | 345 ------- .../Protocols/multi-NSL/test-heuristics.py | 69 -- .../Protocols/multi-NSL/test-variants.py | 79 -- .../Protocols/needham-schroeder-lowe.spdl | 53 -- .../Protocols/needham-schroeder-sk-amend.spdl | 66 -- .../Protocols/needham-schroeder-sk.spdl | 56 -- .../scyther/Protocols/needham-schroeder.spdl | 53 -- .../Protocols/neumannstub-guttman-hwang.spdl | 105 -- .../Protocols/neumannstub-guttman.spdl | 105 -- .../scyther/Protocols/neumannstub-hwang.spdl | 71 -- .../Protocols/neumannstub-keycompromise.spdl | 105 -- .../shared/scyther/Protocols/neumannstub.spdl | 98 -- .../shared/scyther/Protocols/otwayrees.spdl | 56 -- .../shared/scyther/Protocols/smartright.spdl | 46 - .../scyther/Protocols/splice-as-cj.spdl | 66 -- .../scyther/Protocols/splice-as-hc.spdl | 61 -- .../shared/scyther/Protocols/splice-as.spdl | 66 -- .../shared/scyther/Protocols/tmn.spdl | 51 - .../shared/scyther/Protocols/wmf-lowe.spdl | 63 -- .../shared/scyther/Protocols/wmf.spdl | 54 -- .../scyther/Protocols/woo-lam-pi-1.spdl | 41 - .../scyther/Protocols/woo-lam-pi-2.spdl | 41 - .../scyther/Protocols/woo-lam-pi-3.spdl | 41 - .../scyther/Protocols/woo-lam-pi-f.spdl | 41 - .../shared/scyther/Protocols/woo-lam-pi.spdl | 45 - .../shared/scyther/Protocols/woo-lam.spdl | 64 -- .../shared/scyther/Protocols/yahalom-ban.spdl | 54 -- .../scyther/Protocols/yahalom-lowe.spdl | 52 - .../scyther/Protocols/yahalom-paulson.spdl | 56 -- .../shared/scyther/Protocols/yahalom.spdl | 52 - Vagrant Files/shared/scyther/README.md | 66 -- .../shared/scyther/Scripts/regression-test.py | 91 -- .../scyther/Scripts/regression-test.txt | 64 -- .../shared/scyther/Scripts/scytherview.py | 113 --- .../shared/scyther/Scyther/.gitignore | 3 - .../shared/scyther/Scyther/Attack.py | 71 -- Vagrant Files/shared/scyther/Scyther/Claim.py | 197 ---- Vagrant Files/shared/scyther/Scyther/Error.py | 121 --- .../shared/scyther/Scyther/FindDot.py | 129 --- Vagrant Files/shared/scyther/Scyther/Misc.py | 158 --- .../shared/scyther/Scyther/Scyther.py | 648 ------------- Vagrant Files/shared/scyther/Scyther/Term.py | 223 ----- Vagrant Files/shared/scyther/Scyther/Trace.py | 358 ------- .../shared/scyther/Scyther/XMLReader.py | 357 ------- .../shared/scyther/Scyther/__init__.py | 29 - Vagrant Files/shared/scyther/Time/test.py | 63 -- Vagrant Files/shared/scyther/batcher.sh | 46 - Vagrant Files/shared/scyther/combos-book.sh | 11 - Vagrant Files/shared/scyther/combos-ike.sh | 8 - Vagrant Files/shared/scyther/combos-ikev0.sh | 12 - Vagrant Files/shared/scyther/combos-ikev1.sh | 12 - Vagrant Files/shared/scyther/combos-ikev2.sh | 13 - Vagrant Files/shared/scyther/combos-iso.sh | 11 - .../shared/scyther/generate-attack-graphs.py | 131 --- Vagrant Files/shared/scyther/json-scyther.py | 66 -- Vagrant Files/shared/scyther/make-bsub.py | 69 -- Vagrant Files/shared/scyther/mpa.spdl | 79 -- .../shared/scyther/notes-brutus-mpa.txt | 181 ---- Vagrant Files/shared/scyther/ns3.spdl | 47 - Vagrant Files/shared/scyther/nsl3-broken.spdl | 40 - Vagrant Files/shared/scyther/nsl3.spdl | 47 - .../shared/scyther/precompute-ike.sh | 5 - .../shared/scyther/progressbarDummy.py | 60 -- Vagrant Files/shared/scyther/scyther-gui.py | 245 ----- Vagrant Files/shared/scyther/scyther-gui.rc | 4 - Vagrant Files/shared/scyther/scyther.py | 57 -- Vagrant Files/shared/scyther/test-delta.py | 181 ---- Vagrant Files/shared/scyther/test-mpa.py | 896 ------------------ Vagrant Files/shared/scyther/todo.txt | 29 - Vagrant Files/shared/scyther/wiper.sh | 9 - .../shared/{ => test folder}/example.txt.txt | 0 314 files changed, 69 insertions(+), 29213 deletions(-) delete mode 100644 Vagrant Files/.gitkeep create mode 100644 Vagrant Files/InstallationInstructions.txt create mode 100644 Vagrant Files/files/guide.txt rename Vagrant Files/{shared/scyther => files}/scyther-manual.pdf (100%) delete mode 100644 Vagrant Files/files/test folder/guide.txt create mode 100644 Vagrant Files/shared/GitLink/sessionkey.sdpl.txt delete mode 100644 Vagrant Files/shared/scyther/.gitignore delete mode 100644 Vagrant Files/shared/scyther/Changelog.txt delete mode 100644 Vagrant Files/shared/scyther/GNU-General-Public-License.txt delete mode 100644 Vagrant Files/shared/scyther/Gui/About.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Attackwindow.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Editor.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Error.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Icon.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Mainwindow.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Makeimage.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Misc.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Preference.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Scytherthread.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Settingswindow.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Temporary.py delete mode 100644 Vagrant Files/shared/scyther/Gui/Version.py delete mode 100644 Vagrant Files/shared/scyther/Gui/__init__.py delete mode 100644 Vagrant Files/shared/scyther/INSTALL.md delete mode 100644 Vagrant Files/shared/scyther/INSTALL.txt delete mode 100644 Vagrant Files/shared/scyther/Images/scyther-gui-16.ico delete mode 100644 Vagrant Files/shared/scyther/Images/scyther-gui-32.ico delete mode 100644 Vagrant Files/shared/scyther/Images/scyther-gui-64.ico delete mode 100644 Vagrant Files/shared/scyther/Images/scyther-icon.svg delete mode 100644 Vagrant Files/shared/scyther/Images/scyther-splash.png delete mode 100644 Vagrant Files/shared/scyther/Protocols/Demo/ns3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/Demo/nsl3-broken.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/Demo/nsl3-updated-both.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/Demo/nsl3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2rsa.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2rsacorrected.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2satek.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pqr.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/rsaplussatek.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/rsaplussatekcorrected.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/Makefile delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/common.h delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a1.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a1.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a12.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a12.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a22.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a22.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-a.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-a.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m-perlman.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m-perlman.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-noid.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-noid.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-nopfs.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-nopfs.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman1.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman1.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a1.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a1.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m-perlman.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m-perlman.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child-nopfs.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child-nopfs.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child-composed.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child-composed.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2-composed.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2-composed.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/jfki-core.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/jfki-core.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/jfki.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/jfki.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/jfkr-core.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/jfkr-core.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/jfkr.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/jfkr.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/make-mpa.py delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/mpa/README.txt delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/oakley-a.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/oakley-a.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/oakley-alt.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/oakley-alt.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/oakley-c.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/oakley-c.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/pp.sh delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/scanner.py delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/skeme-basic.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/skeme-basic.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/skeme-psk.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/skeme-psk.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/skeme-rekey.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/skeme-rekey.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/sts-mac.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/sts-mac.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/sts-main.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/sts-main.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/sts-modified.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/sts-modified.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/verify.sh delete mode 100644 Vagrant Files/shared/scyther/Protocols/IKE/verify_all.sh delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/Makefile delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/iso25-tag.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/iso26-tag.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-1-udkey.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-1.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-2-udkey.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-3-udkey.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-4-udkey.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-4.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-5.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-6.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-1.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-4.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-5.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-1.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-1.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6.template delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-1.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-1.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-2.cpp delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7.template delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-1-udkey.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-1.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-2-udkey.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-3-udkey.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-4-udkey.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-4.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/BKE.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-ban-concrete.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-ban.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-lowe-ban.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/boyd.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ccitt509-ban3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/denning-sacco-lowe.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/denning-sacco.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/gong-nonce-b.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/gong-nonce.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/isoiec11770-2-13.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow-v2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow-v3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ksl.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/needham-schroeder-sk-amend.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/needham-schroeder-sk.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/new.txt delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ns3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/nsl3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/otwayrees.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/soph.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as-cj.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as-hc.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/tmn.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf-brutus.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf-lowe.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-1.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-f.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban-paulson-modified.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban-paulson.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-lowe.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/NotModelled.txt delete mode 100644 Vagrant Files/shared/scyther/Protocols/andrew-ban-concrete.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/andrew-ban.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/andrew-lowe-ban.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/andrew.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ccitt509-1.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ccitt509-1c.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ccitt509-3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ccitt509-ban3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/denning-sacco-lowe.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/denning-sacco.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/kaochow-v2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/kaochow-v3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/kaochow.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ksl-lowe.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/ksl.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/multi-NSL/heuristics-results.txt delete mode 100644 Vagrant Files/shared/scyther/Protocols/multi-NSL/mnsl-results.txt delete mode 100644 Vagrant Files/shared/scyther/Protocols/multi-NSL/multinsl-generator.py delete mode 100644 Vagrant Files/shared/scyther/Protocols/multi-NSL/test-heuristics.py delete mode 100644 Vagrant Files/shared/scyther/Protocols/multi-NSL/test-variants.py delete mode 100644 Vagrant Files/shared/scyther/Protocols/needham-schroeder-lowe.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/needham-schroeder-sk-amend.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/needham-schroeder-sk.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/needham-schroeder.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/neumannstub-guttman-hwang.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/neumannstub-guttman.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/neumannstub-hwang.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/neumannstub-keycompromise.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/neumannstub.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/otwayrees.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/smartright.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/splice-as-cj.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/splice-as-hc.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/splice-as.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/tmn.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/wmf-lowe.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/wmf.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/woo-lam-pi-1.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/woo-lam-pi-2.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/woo-lam-pi-3.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/woo-lam-pi-f.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/woo-lam-pi.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/woo-lam.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/yahalom-ban.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/yahalom-lowe.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/yahalom-paulson.spdl delete mode 100644 Vagrant Files/shared/scyther/Protocols/yahalom.spdl delete mode 100644 Vagrant Files/shared/scyther/README.md delete mode 100644 Vagrant Files/shared/scyther/Scripts/regression-test.py delete mode 100644 Vagrant Files/shared/scyther/Scripts/regression-test.txt delete mode 100644 Vagrant Files/shared/scyther/Scripts/scytherview.py delete mode 100644 Vagrant Files/shared/scyther/Scyther/.gitignore delete mode 100644 Vagrant Files/shared/scyther/Scyther/Attack.py delete mode 100644 Vagrant Files/shared/scyther/Scyther/Claim.py delete mode 100644 Vagrant Files/shared/scyther/Scyther/Error.py delete mode 100644 Vagrant Files/shared/scyther/Scyther/FindDot.py delete mode 100644 Vagrant Files/shared/scyther/Scyther/Misc.py delete mode 100644 Vagrant Files/shared/scyther/Scyther/Scyther.py delete mode 100644 Vagrant Files/shared/scyther/Scyther/Term.py delete mode 100644 Vagrant Files/shared/scyther/Scyther/Trace.py delete mode 100644 Vagrant Files/shared/scyther/Scyther/XMLReader.py delete mode 100644 Vagrant Files/shared/scyther/Scyther/__init__.py delete mode 100644 Vagrant Files/shared/scyther/Time/test.py delete mode 100644 Vagrant Files/shared/scyther/batcher.sh delete mode 100644 Vagrant Files/shared/scyther/combos-book.sh delete mode 100644 Vagrant Files/shared/scyther/combos-ike.sh delete mode 100644 Vagrant Files/shared/scyther/combos-ikev0.sh delete mode 100644 Vagrant Files/shared/scyther/combos-ikev1.sh delete mode 100644 Vagrant Files/shared/scyther/combos-ikev2.sh delete mode 100644 Vagrant Files/shared/scyther/combos-iso.sh delete mode 100644 Vagrant Files/shared/scyther/generate-attack-graphs.py delete mode 100644 Vagrant Files/shared/scyther/json-scyther.py delete mode 100644 Vagrant Files/shared/scyther/make-bsub.py delete mode 100644 Vagrant Files/shared/scyther/mpa.spdl delete mode 100644 Vagrant Files/shared/scyther/notes-brutus-mpa.txt delete mode 100644 Vagrant Files/shared/scyther/ns3.spdl delete mode 100644 Vagrant Files/shared/scyther/nsl3-broken.spdl delete mode 100644 Vagrant Files/shared/scyther/nsl3.spdl delete mode 100644 Vagrant Files/shared/scyther/precompute-ike.sh delete mode 100644 Vagrant Files/shared/scyther/progressbarDummy.py delete mode 100644 Vagrant Files/shared/scyther/scyther-gui.py delete mode 100644 Vagrant Files/shared/scyther/scyther-gui.rc delete mode 100644 Vagrant Files/shared/scyther/scyther.py delete mode 100644 Vagrant Files/shared/scyther/test-delta.py delete mode 100644 Vagrant Files/shared/scyther/test-mpa.py delete mode 100644 Vagrant Files/shared/scyther/todo.txt delete mode 100644 Vagrant Files/shared/scyther/wiper.sh rename Vagrant Files/shared/{ => test folder}/example.txt.txt (100%) diff --git a/Vagrant Files/.gitkeep b/Vagrant Files/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Vagrant Files/InstallationInstructions.txt b/Vagrant Files/InstallationInstructions.txt new file mode 100644 index 0000000..0e203ff --- /dev/null +++ b/Vagrant Files/InstallationInstructions.txt @@ -0,0 +1,17 @@ + +Please ensure that you have installed Vagrant and have a virtual machine hypervisor installed on your host machine. +Virtualbox is the reccomended hypervisor for this software + + +Scytherbox Installation instructions: + +1. Create a new folder on your host machine + +2. Copy and paste or extract the contents of this folder into the newly created folder + +3. Open Powershell or your text terminal of choice and navigate to the newly created folder. + +4. type 'vagrant up' inside the folder. + +5. Allow time for Vagrant to download the base box and apply the provisioners to the box, this may take several minutes. + diff --git a/Vagrant Files/files/guide.txt b/Vagrant Files/files/guide.txt new file mode 100644 index 0000000..390795e --- /dev/null +++ b/Vagrant Files/files/guide.txt @@ -0,0 +1,10 @@ + +To run Scyther, the scyther-gui.py file is recomeded, this can be launched through terminal by typing: + +./scyther/scyther-gui.py + +From here, protocols can be loaded using the file -> open menu or crtl+o. By going Desktop->SyncedFiles->GitLink +Any protocols in your configured git repo can be opened. + +More information on how to use Scyther is availible in the Scyther manual which can be accessed from the desktop + diff --git a/Vagrant Files/shared/scyther/scyther-manual.pdf b/Vagrant Files/files/scyther-manual.pdf similarity index 100% rename from Vagrant Files/shared/scyther/scyther-manual.pdf rename to Vagrant Files/files/scyther-manual.pdf diff --git a/Vagrant Files/files/test folder/guide.txt b/Vagrant Files/files/test folder/guide.txt deleted file mode 100644 index e740c7a..0000000 --- a/Vagrant Files/files/test folder/guide.txt +++ /dev/null @@ -1 +0,0 @@ -These are where the scyther install instructions and user guide parts are going to go \ No newline at end of file diff --git a/Vagrant Files/shared/GitLink/sessionkey.sdpl.txt b/Vagrant Files/shared/GitLink/sessionkey.sdpl.txt new file mode 100644 index 0000000..0df74a2 --- /dev/null +++ b/Vagrant Files/shared/GitLink/sessionkey.sdpl.txt @@ -0,0 +1,42 @@ +usertype SessionKey; +usertype Message; + +protocol EncrpytedExchange(Meter,Monitor) + + { + + role Meter { + + fresh M: Message; + fresh TokenA: SessionKey; + var TokenB; + + send_1(Meter,Monitor,{TokenA}k(k)); + recv_2(Monitor,Meter,{TokenB}k(k)); + claim(Meter,Running,Monitor,M); + send_3(Meter,Monitor,{M}k(k)); + + claim_Meter1(Meter, Secret, (k)); + claim_Meter2(Meter, Secret, M); + claim_Meter3(Meter,Niagree); + claim_Meter4(Meter,Nisynch); + + } + + role Monitor { + + var M; + var TokenA; + fresh TokenB: SessionKey; + + recv_1(Meter,Monitor,{TokenA}k(k)); + send_2(Monitor,Meter,{TokenB}k(k)); + recv_3(Meter,Monitor,{M}k(k)); + + claim_Monitor1(Monitor, Secret, (k)); + claim_Monitor2(Monitor, Secret, M); + claim_Meter3(Monitor,Niagree); + claim_Meter4(Monitor,Nisynch); + + } +} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/.gitignore b/Vagrant Files/shared/scyther/.gitignore deleted file mode 100644 index e62e34e..0000000 --- a/Vagrant Files/shared/scyther/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.pyc -progressbar.py -Cache -Cache-OLD diff --git a/Vagrant Files/shared/scyther/Changelog.txt b/Vagrant Files/shared/scyther/Changelog.txt deleted file mode 100644 index b2af59b..0000000 --- a/Vagrant Files/shared/scyther/Changelog.txt +++ /dev/null @@ -1,159 +0,0 @@ -Scyther changelog -=============================== - -Scyther 1.1.2 -------------------------------- - -Minor: - - * Updated installation instructions. - * Updated 'ffgg' protocol generator for new conventions. - * Windows users recently had to manually set the Graphviz path. Added a - hack to avoid this inconvenience in most (but not all) cases. - * Minor manual update. - -Bug fixes: - - * [Bugfix] Reverted use of shlex. This breaks the "abort backend - thread" functionality again, but it was causing too much trouble on - Windows. - -Scyther 1.1.1 -------------------------------- - -This is mostly a bugfix release. - -New features: - - * [Language] Weakagree and Alive claims now also allow for an optional role - parameter, which can be useful for protocols with more than two roles. - * [Misc] Added Python script to dump attack outputs for large sets of files. - * [Gui] Canceling verification now also kills back-end thread. - -Regression fixes: - - * [Regression-fix] Reintroduced option for specifying alternative PKI. - -Bug fixes: - - * [Bugfix] Fixed rare bug in some cases where hashes were used as symmetric keys. - * [Bugfix] Invoking Scyther scripts from non-standard directories or using symlinks should work consistently now. - * [Bugfix] Improving compatibility with recent versions of Graphviz (>2.26) - -Scyther 1.1 -------------------------------- - -Major new features: - - * [Language] Added support for `macro Term1 = Term2;` definitions, which greatly - simplifies many specifications. - * [Language] Added support for `match(T1,T2);` events in roles, which - can be used for e.g. a straightforward modeling of delayed decryption. - * [Language] Added support for `not match(T1,T2);` events in roles. - This can be useful for, e.g., modeling protocol restrictions (such as - `A != B`). - * [Language] Added support for `option "COMMANDLINE_OPTIONS";` in - specifications. This provides full access to the command-line options - of the Scyther backend to the protocol specifications. An example of - its use is `option "--one-role-per-agent";`. - * [Mac OS X] Dropped support for PPC in Scyther distributions, only - supporting Intel for now. Note that installing from source may still - work fine with a minor tweak to the build script. - -Additional protocol models: - -See <http://www.cs.ox.ac.uk/people/cas.cremers/tools/protocols.html> for a -more high-level overview of selected protocol models. - - * IEEE 802.16e/WIMAX: PKMv2rsa and variants - * IKEv1 and IKEv2 protocol suites - -Other new features: - - * `SCYTHERCACHEDIR` environment variable can be set to override the - internal cache path. - * [Backend] The command-line tool now supports the option - `--one-role-per-agent`. This disallows agents from performing more than - one role in a single trace. This effectively partitions the agents into - role sets, i.e., each role can only be performed by agents from one of - these sets. - * [Documentation] Added the first incomplete version of the new manual. - -There are also various minor bugfixes and installation improvements. - -Scyther 1.0 -------------------------------- - -Major new features: - - * [Language] Support for weak agreement - * [Language] Support for non-injective data agreement through `Commit` - and `Running` signals. - -Bugfixes: - - * Python 2.5 has integrated (c)elementtree into the core. - Unfortunaly, this broke our previous import attempts. This has now - been fixed. - -Scyther 1.0-beta7.1 -------------------------------- - -Bugfixes: - - * Windows Vista fix broke Windows XP support. - -Scyther 1.0-beta7 -------------------------------- - -Bugfixes: - - * Windows Vista causes a number of problems. The biggest problem - is now fixed, which is the bad implementation of the tmpfile() C - function, causing no attack output, for which there is a - workaround now. - -Scyther 1.0-beta6 -------------------------------- - -Major new features: - - * [Gui] Added Mac support (added universal binary) - * [Gui] Switched to Scintilla editor component, providing undo - and line numbering, and highlighting of error lines. - -Other new features: - - * [Backend] Scyther now detects when a recv event cannot match - with a send event. This significantly helps in reducing errors - in the protocol descriptions. - * [Language] Added claim parameter for Reachable claim; - Reachable,R means that role R should be trusted (as well as the - actor), but not any other role. This can be useful for showing - stronger authentication properties of protocols with more than - two parties. - * [Backend] Added '--max-of-role=N' switch (to narrow scenarios) - * [Backend] Added '--scan-claims' switch (allows for retrieving - a list of claims) - * [Scripting] Added 'verifyOne' and 'scanClaims' methods to - Scyther object, to help with singular claim testing. - - Bugfixes: - - * [Scripting] Fixed bug in python interface backend (e.g. with mpa.py) - -Scyther 1.0-beta5 -------------------------------- - - * Change of switch semantics. '--max-attacks=N' now defines the - maximum number of attacks per claim. Previously this was a - global maximum for all claims combined. - * Improved attack graph output. - * added switch '--errors=FILE' to redirect standard error output - to a file. - * Rewrote parts of the gui code for improved stability. - -Scyther 1.0-beta4 -------------------------------- - - * (Changelog starts after the release of Scyther 1.0-beta4) diff --git a/Vagrant Files/shared/scyther/GNU-General-Public-License.txt b/Vagrant Files/shared/scyther/GNU-General-Public-License.txt deleted file mode 100644 index d511905..0000000 --- a/Vagrant Files/shared/scyther/GNU-General-Public-License.txt +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/Vagrant Files/shared/scyther/Gui/About.py b/Vagrant Files/shared/scyther/Gui/About.py deleted file mode 100644 index b415c55..0000000 --- a/Vagrant Files/shared/scyther/Gui/About.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -#--------------------------------------------------------------------------- - -""" Import externals """ -import wx -import wx.html -import os.path - -#--------------------------------------------------------------------------- - -""" Import scyther-gui components """ - -import Scyther - -#--------------------------------------------------------------------------- - -""" Globals """ - -basedir = "" - -#--------------------------------------------------------------------------- - -def setBaseDir(mybasedir): - global basedir - - basedir = mybasedir - -#--------------------------------------------------------------------------- - -class AboutScyther(wx.Dialog): - def __init__(self,parent,mybasedir=None): - - from Version import SCYTHER_GUI_VERSION - global basedir - - self.text = ''' -<html> -<body bgcolor="#ffffff"> -<img src="$SPLASH"> -<h5 align="right">Scyther : $VERSION</h5> -<small> - <p> - <b>Scyther</b> is an automatic tool for the verification and - falsification of security protocols. - </p> - <p> - For news and updates visit the Scyther pages at - <a target="_blank" href="http://www.cs.ox.ac.uk/people/cas.cremers/scyther/index.html"> - http://www.cs.ox.ac.uk/people/cas.cremers/scyther/index.html</a> - </p> - <h5>License</h5> - <p> - Scyther : An automatic verifier for security protocols.<br> - Copyright (C) 2007-2013 Cas Cremers - </p> - <p> - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - </p> - <p> - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - </p> - <p> - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - </p> - <h5>Backend version</h5> - <p> - $DETAILS - </p> - <h5>Credits</h5> - <p> - Cas Cremers (Scyther theory, backend, and main GUI - code), Gijs Hollestelle (Python parser for Scyther XML output). - </p> -</small> - ''' - - if mybasedir: - basedir = mybasedir - - # Debugging output of some parameters - - splashdir = os.path.join(basedir,"Images") - splashimage = os.path.join(splashdir,"scyther-splash.png") - details_html = "Base directory: %s<br>\n" % (basedir) - details_html += Scyther.Scyther.GetInfo(html=True) - - self.text = self.text.replace("$SPLASH",splashimage) - self.text = self.text.replace("$DETAILS",details_html) - - # version information - self.text = self.text.replace("$VERSION", SCYTHER_GUI_VERSION) - - wx.Dialog.__init__(self, parent, -1, 'About Scyther', - size=(660,620)) - html = wx.html.HtmlWindow(self) - #if "gtk2" in wx.PlatformInfo: - # html.SetStandardFonts() - html.SetBorders(10) - html.SetPage(self.text) - button = wx.Button(self, wx.ID_OK, "Close window") - - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(html, 1, wx.EXPAND|wx.ALL,0) - sizer.Add(button,0,wx.ALIGN_CENTER|wx.ALL,5) - - self.SetSizer(sizer) - self.Layout() - -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Gui/Attackwindow.py b/Vagrant Files/shared/scyther/Gui/Attackwindow.py deleted file mode 100644 index 39b9f06..0000000 --- a/Vagrant Files/shared/scyther/Gui/Attackwindow.py +++ /dev/null @@ -1,330 +0,0 @@ -#!/usr/bin/python -from __future__ import division # 2.2+-only -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -#--------------------------------------------------------------------------- - -""" Import externals """ -import wx -import os -from Misc import * - -#--------------------------------------------------------------------------- - -""" Import scyther-gui components """ -import Icon -import Preference -import Error - -#--------------------------------------------------------------------------- -try: - import Image -except ImportError: - pass - -#--------------------------------------------------------------------------- - -class AttackDisplay(wx.ScrolledWindow): - """ - Display an attack (inside a tab or not) - """ - def __init__(self, daddy, parent, attack): - - self.win = daddy - self.attack = attack - - wx.ScrolledWindow.__init__(self,parent,id=-1) - - self.Bind(wx.EVT_SIZE, self.OnSize) - self.Image = wx.StaticBitmap(self, -1, wx.EmptyBitmap(1,1)) - self.box = wx.BoxSizer(wx.VERTICAL) - self.box.Add(self.Image,1,wx.ALIGN_CENTER) - self.hbox = wx.BoxSizer(wx.HORIZONTAL) - self.hbox.Add(self.box,1,wx.ALIGN_CENTER) - self.SetSizer(self.hbox) - - self.original = None - - filename = attack.file - if attack.filetype == "png": - self.original = wx.Image(filename,wx.BITMAP_TYPE_PNG) - elif attack.filetype == "ps": - # depends on PIL lib - try: - self.original = Image.open(filename) - except: - Preference.doNotUsePIL() - raise Error.PILError - else: - print "Unknown file type %s." % (self.filetype) - - # TODO self.Bind(wxSizeEvent - self.update(True) - self.Fit() - - def OnSize(self,event): - self.update(False) - event.Skip() - - def update(self,force=True): - - if not force: - if not self.win.fit: - return - - # This is needed, don't ask me why. - self.SetScrollbars(0,0,0,0,0,0) - - (framewidth,frameheight) = self.GetClientSizeTuple() - (virtualwidth,virtualheight) = (framewidth,frameheight) - - def makefit(width,height): - if self.win.fit: - # determine scaling factors for fitting - wfactor = float(framewidth) / width - hfactor = float(frameheight) / height - - # select smallest factor (so it will fit) - if hfactor < wfactor: - factor = hfactor - else: - factor = wfactor - - # apply scaling factor - width = width * factor - height = height * factor - else: - factor = 1.0 - - return (factor, int(width), int(height)) - - if self.attack.filetype == "png": - bmp = self.original - if not bmp.Ok(): - bmp = wx.EmptyImage(1,1) - else: - (originalwidth,originalheight) = (bmp.GetWidth(), bmp.GetHeight()) - if self.win.fit: - (factor, virtualwidth, virtualheight) = makefit(originalwidth,originalheight) - bmp = self.original.Scale(virtualwidth,virtualheight) - self.Image.SetBitmap(wx.BitmapFromImage(bmp)) - - elif self.attack.filetype == "ps": - pil = self.original.copy() - (originalwidth,originalheight) = pil.size - (factor, virtualwidth, virtualheight) = makefit(originalwidth,originalheight) - # we really only want antialias when it's smaller - if factor < 1.0: - pil.thumbnail((virtualwidth,virtualheight),Image.ANTIALIAS) - else: - pil.thumbnail((virtualwidth,virtualheight)) - - image = wx.EmptyImage(pil.size[0],pil.size[1]) - image.SetData(pil.convert('RGB').tostring()) - self.Image.SetBitmap(image.ConvertToBitmap()) - - else: - print "Unknown file type %s." % (self.attack.filetype) - - self.SetVirtualSize((virtualwidth,virtualheight)) - - #self.box.SetItemMinSize(self.Image.GetContainingSizer()) - self.box.Layout() - - step = 20 - xn = int(virtualwidth // step) + 1 - yn = int(virtualheight // step) + 1 - self.SetScrollbars(step,step,xn,yn,0,0) - - """ - Pop up menu - """ - self.popupmenu = wx.Menu() - item = self.popupmenu.Append(-1,"Export image (.png)") - self.Bind(wx.EVT_MENU, self.OnExportPng, item) - item = self.popupmenu.Append(-1,"Export image (.ps)") - self.Bind(wx.EVT_MENU, self.OnExportPs, item) - item = self.popupmenu.Append(-1,"Export image (.pdf)") - self.Bind(wx.EVT_MENU, self.OnExportPdf, item) - item = self.popupmenu.Append(-1,"Export image (.svg)") - self.Bind(wx.EVT_MENU, self.OnExportSvg, item) - item = self.popupmenu.Append(-1,"Export image (.fig)") - self.Bind(wx.EVT_MENU, self.OnExportFig, item) - item = self.popupmenu.Append(-1,"Export graphviz data (.dot)") - self.Bind(wx.EVT_MENU, self.OnExportDot, item) - - self.Bind(wx.EVT_CONTEXT_MENU, self.OnShowPopup) - - self.Refresh() - - def OnShowPopup(self, event): - pos = event.GetPosition() - pos = self.Image.ScreenToClient(pos) - self.PopupMenu(self.popupmenu, pos) - - def OnPopupItemSelected(self, event): - item = self.popupmenu.FindItemById(event.GetId()) - text = item.GetText() - wx.MessageBox("You selected item %s" % text) - - def askUserForFilename(self, **dialogOptions): - dialog = wx.FileDialog(self, **dialogOptions) - if dialog.ShowModal() == wx.ID_OK: - res = "%s/%s" % (dialog.GetDirectory(), dialog.GetFilename()) - else: - res = None - dialog.Destroy() - return res - - def saveFileName(self, ext): - (p,r,l) = self.win.claim.triplet() - prefix = "pattern-%s_%s_%s-%s" % (p,r,l,self.attack.id) - suggested = "%s.%s" % (prefix,ext) - res = self.askUserForFilename(style=wx.SAVE, wildcard="*.%s" % (ext), defaultFile = "%s" % (suggested)) - return res - - def exportImage(self, type,ext=None): - if ext == None: - ext = type - res = self.saveFileName(ext) - if res != None: - cmd = "dot -T%s" % (type) - cmdpushwrite(cmd,self.attack.scytherDot,res) - - def OnExportPng(self, event): - self.exportImage("png") - - def OnExportPs(self, event): - self.exportImage("ps") - - def OnExportPdf(self, event): - self.exportImage("pdf") - - def OnExportSvg(self, event): - self.exportImage("svg") - - def OnExportFig(self, event): - self.exportImage("fig") - - def OnExportDot(self, event): - res = self.saveFileName("dot") - if res != None: - fp = open(res,'w') - fp.write(self.attack.scytherDot) - fp.close() - - - - - -#--------------------------------------------------------------------------- - -class AttackWindow(wx.Frame): - def __init__(self,cl): - super(AttackWindow, self).__init__(None, size=(800,800)) - - self.claim = cl - - # TODO maybe fitting defaults should come from Preferences. - # Now, it is default no even if we have PIL, for performance - # reasons. - self.fit = False - - self.CreateInteriorWindowComponents() - - Icon.ScytherIcon(self) - self.SetTitle() - - def SetTitle(self): - - tstr = self.claim.stateName(len(self.claim.attacks),True) - tstr += " for claim %s" % self.claim.id - super(AttackWindow, self).SetTitle(tstr) - - def CreateInteriorWindowComponents(self): - ''' Create "interior" window components. In this case it is the - attack picture. ''' - - sizer = wx.BoxSizer(wx.VERTICAL) - - # Make zoom buttons - if Preference.usePIL(): - buttons = wx.BoxSizer(wx.HORIZONTAL) - bt = wx.ToggleButton(self,-1,"Fit to window") - bt.SetValue(self.fit) - buttons.Add(bt,0) - self.Bind(wx.EVT_TOGGLEBUTTON, self.OnFit, bt) - sizer.Add(buttons, 0, wx.ALIGN_LEFT) - - # Add attacks (possible with tabs) - self.displays=[] - attacks = self.claim.attacks - - n = len(attacks) - if n <= 1: - # Just a single window - dp = AttackDisplay(self, self, attacks[0]) - self.displays.append(dp) - else: - # Multiple tabs - dp = wx.Notebook(self,-1) - for i in range(0,n): - disp = AttackDisplay(self,dp,attacks[i]) - classname = "%s %i" % (self.claim.stateName(1,True),(i+1)) - dp.AddPage(disp, classname) - self.displays.append(disp) - - sizer.Add(dp, 1, wx.EXPAND,1) - - self.SetSizer(sizer) - - def update(self,force=False): - for t in self.displays: - t.update(force) - - def OnFit(self,event): - - if self.fit: - self.fit = False - else: - self.fit = True - self.update(True) - - def OnRealSize(self): - - self.fit = False - self.update(True) - - def OnSize(self): - self.Refresh() - - def OnZoom100(self,evt): - self.fit = False - self.update(True) - self.Refresh() - - def OnZoomFit(self,evt): - self.fit = True - self.update(True) - self.Refresh() - -#--------------------------------------------------------------------------- -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Gui/Editor.py b/Vagrant Files/shared/scyther/Gui/Editor.py deleted file mode 100644 index b3e093f..0000000 --- a/Vagrant Files/shared/scyther/Gui/Editor.py +++ /dev/null @@ -1,195 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -#--------------------------------------------------------------------------- - -""" Import externals """ -import wx -import string - -# Use Scintilla editor? -useStc = True # It looks nicer! -#useStc = False # It is sometimes buggy, claims the internet - -# Test Scintilla and if it fails, get rid of it -if useStc: - try: - from wx.stc import * - except: - useStc = False - -#--------------------------------------------------------------------------- - -""" Import scyther-gui components """ - -#--------------------------------------------------------------------------- - -""" Some constants """ - -#--------------------------------------------------------------------------- - -def justNumbers(txt): - for x in txt: - if not x in string.digits: - return False - return True - -def lineInError(txt): - # First option: square braces - x1 = txt.find("[") - if x1 >= 0: - x2 = txt.find("]") - if x2 > x1: - nrstring = txt[(x1+1):x2] - if justNumbers(nrstring): - return int(nrstring) - # Alternative: ...line x - pref = " line " - i = txt.find(pref) - if i >= 0: - i = i + len(pref) - j = i - while txt[j] in string.digits: - j = j+1 - if j > i: - return int(txt[i:j]) - - return None - -def selectEditor(parent): - """ - Pick an editor (Scintilla or default) and return the object. - """ - if useStc: - return EditorStc(parent) - else: - return EditorNormal(parent) - -#--------------------------------------------------------------------------- - -class Editor(object): - - def __init__(self, parent): - # Empty start - self.SetText("") - self.SetChanged(False) - - def SetText(self): - pass - - def SetErrors(self,errors): - pass - - def GetChanged(self): - """ - Return true if file was changed - """ - return self.savedtext != self.GetText() - - def SetChanged(self,nowchanged=False): - """ - Set changed status - """ - if nowchanged: - self.savedtext = "" - else: - self.SetSaved() - - def SetSaved(self): - self.savedtext = self.GetText() - - def SetOpened(self): - self.SetSaved() - -#--------------------------------------------------------------------------- - -class EditorNormal(Editor): - - def __init__(self, parent): - self.control = wx.TextCtrl(parent, style=wx.TE_MULTILINE) - - # Call parent - Editor.__init__(self,parent) - - def GetText(self): - return self.control.GetValue() - - def SetText(self, txt): - self.control.SetValue(txt) - -#--------------------------------------------------------------------------- - -class EditorStc(Editor): - - def __init__(self, parent): - # Scintilla layout with line numbers - self.control = StyledTextCtrl(parent) - self.control.SetMarginType(1, STC_MARGIN_NUMBER) - self.control.SetMarginWidth(1, 30) - - # Call parent - Editor.__init__(self,parent) - - # Set variable for error style - self.errorstyle = 5 - self.control.StyleSetSpec(self.errorstyle, "fore:#FFFF0000,back:#FF0000") - - def GetText(self): - return self.control.GetText() - - def SetText(self, txt): - self.control.SetText(txt) - - def GetLineCount(self): - """ Currently rather stupid, can probably be done more - efficiently through some Scintilla function. """ - txt = self.GetText().splitlines() - return len(txt) - - def SetErrorLine(self,line): - """ - Currently this is BROKEN for include commands, as no file names - are propagated. To minize the damage, we at least don't try to - highlight non-existing names. In the long run of course - propagation is the only way to handle this. - """ - if line <= self.GetLineCount(): - if line > 0: - line = line - 1 # Start at 0 in stc, but on screen count is 1 - pos = self.control.GetLineIndentPosition(line) - last = self.control.GetLineEndPosition(line) - self.control.StartStyling(pos,31) - self.control.SetStyling(last-pos,self.errorstyle) - - def ClearErrors(self): - self.control.ClearDocumentStyle() - - def SetErrors(self,errors): - if errors: - for el in errors: - nr = lineInError(el) - if nr: - self.SetErrorLine(nr) - else: - self.ClearErrors() - -#--------------------------------------------------------------------------- - diff --git a/Vagrant Files/shared/scyther/Gui/Error.py b/Vagrant Files/shared/scyther/Gui/Error.py deleted file mode 100644 index 6433cf2..0000000 --- a/Vagrant Files/shared/scyther/Gui/Error.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -#--------------------------------------------------------------------------- - -""" Import externals """ -import wx -import sys - -#--------------------------------------------------------------------------- - -""" Import scyther-gui components """ - -#--------------------------------------------------------------------------- - -class PILError (Exception): - pass - -class NoAttackError(Exception): - pass - -#--------------------------------------------------------------------------- - -def ShowAndReturn(text): - title = "Error" - dlg = wx.MessageDialog(None, text, title, wx.ID_OK | wx.ICON_ERROR) - result = dlg.ShowModal() - dlg.Destroy() - -def ShowAndExit(text): - ShowAndReturn(text) - sys.exit() - diff --git a/Vagrant Files/shared/scyther/Gui/Icon.py b/Vagrant Files/shared/scyther/Gui/Icon.py deleted file mode 100644 index 2f4f26f..0000000 --- a/Vagrant Files/shared/scyther/Gui/Icon.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -#--------------------------------------------------------------------------- - -""" Import externals """ -import wx -import os.path -import sys - -#--------------------------------------------------------------------------- - -""" Import scyther-gui components """ -import Misc - -#--------------------------------------------------------------------------- - -def ScytherIcon(window): - """ Set a nice Scyther icon """ - import os,inspect - - # Determine base directory (taking symbolic links into account) - cmd_file = os.path.realpath(os.path.abspath(inspect.getfile( inspect.currentframe() ))) - basedir = os.path.split(cmd_file)[0] - - path = os.path.join(basedir,"Images") - iconfile = Misc.mypath(os.path.join(path,"scyther-gui-32.ico")) - if os.path.isfile(iconfile): - icon = wx.Icon(iconfile,wx.BITMAP_TYPE_ICO) - window.SetIcon(icon) - - -#--------------------------------------------------------------------------- -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Gui/Mainwindow.py b/Vagrant Files/shared/scyther/Gui/Mainwindow.py deleted file mode 100644 index 70ce112..0000000 --- a/Vagrant Files/shared/scyther/Gui/Mainwindow.py +++ /dev/null @@ -1,322 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -#--------------------------------------------------------------------------- - -""" Import externals """ -import wx -import os.path - -#--------------------------------------------------------------------------- - -""" Import scyther-gui components """ -import Settingswindow -import Scytherthread -import Icon -import About -import Editor -import Preference - -#--------------------------------------------------------------------------- - -""" Some constants """ -ID_VERIFY = 100 -ID_AUTOVERIFY = 101 -ID_CHARACTERIZE = 102 -ID_CHECK = 103 - -#--------------------------------------------------------------------------- - -def MainInitOnce(): - result = Preference.usePIL() # Makes sure PIL is tested. - -class MainWindow(wx.Frame): - - def __init__(self, opts, args): - super(MainWindow, self).__init__(None, size=(600,800)) - - self.opts = opts - self.args = args - - self.dirname = os.path.abspath('.') - - MainInitOnce() - - self.filename = 'noname.spdl' - self.filepath = "" - - self.load = False - - # test - if opts.test: - self.filename = 'scythergui-default.spdl' - self.load = True - - # if there is an argument (file), we load it - if len(args) > 0: - filename = args[0] - if filename != '' and os.path.isfile(filename): - (self.dirname,self.filename) = os.path.split(filename) - self.load = True - - Icon.ScytherIcon(self) - - self.CreateInteriorWindowComponents() - self.CreateExteriorWindowComponents() - - aTable = wx.AcceleratorTable([ - (wx.ACCEL_CTRL, ord('Q'), wx.ID_EXIT), - (wx.ACCEL_NORMAL, wx.WXK_F1, - ID_VERIFY), - (wx.ACCEL_NORMAL, wx.WXK_F2, - ID_CHARACTERIZE), - (wx.ACCEL_NORMAL, wx.WXK_F5, - ID_CHECK), - (wx.ACCEL_NORMAL, wx.WXK_F6, - ID_AUTOVERIFY), - ]) - self.SetAcceleratorTable(aTable) - - self.claimlist = [] - self.pnglist = [] - - #self.SetTitle(self.title) - - self.firstCommand() - - def CreateInteriorWindowComponents(self): - ''' Create "interior" window components. In this case it is just a - simple multiline text control. ''' - - ## Make zoom buttons - #sizer = wx.BoxSizer(wx.VERTICAL) - #buttons = wx.BoxSizer(wx.HORIZONTAL) - #bt = wx.Button(self,ID_VERIFY) - #buttons.Add(bt,0) - #self.Bind(wx.EVT_BUTTON, self.OnVerify, bt) - #bt = wx.Button(self,ID_CHARACTERIZE) - #buttons.Add(bt,0) - #self.Bind(wx.EVT_BUTTON, self.OnCharacterize, bt) - #sizer.Add(buttons, 0, wx.ALIGN_LEFT) - - # Top: input - self.top = wx.Notebook(self,-1) - # Editor there - self.editor = Editor.selectEditor(self.top) - - if self.load: - textfile = open(os.path.join(self.dirname, self.filename), 'r') - self.editor.SetText(textfile.read()) - if self.dirname != "": - os.chdir(self.dirname) - textfile.close() - self.editor.SetOpened() - - self.top.AddPage(self.editor.control,"Protocol description") - self.settings = Settingswindow.SettingsWindow(self.top,self) - self.top.AddPage(self.settings,"Settings") - - #sizer.Add(self.top,1,wx.EXPAND,1) - #self.SetSizer(sizer) - - def CreateExteriorWindowComponents(self): - ''' Create "exterior" window components, such as menu and status - bar. ''' - self.CreateMenus() - self.SetTitle() - - def CreateMenu(self, bar, name, list): - - fileMenu = wx.Menu() - for id, label, helpText, handler in list: - if id == None: - fileMenu.AppendSeparator() - else: - item = fileMenu.Append(id, label, helpText) - self.Bind(wx.EVT_MENU, handler, item) - bar.Append(fileMenu, name) # Add the fileMenu to the MenuBar - - - def CreateMenus(self): - menuBar = wx.MenuBar() - self.CreateMenu(menuBar, '&File', [ - (wx.ID_OPEN, '&Open', 'Open a new file', self.OnOpen), - (wx.ID_SAVE, '&Save', 'Save the current file', self.OnSave), - (wx.ID_SAVEAS, 'Save &As', 'Save the file under a different name', - self.OnSaveAs), - (None, None, None, None), - (wx.ID_EXIT, 'E&xit\tCTRL-Q', 'Terminate the program', - self.OnExit)]) - self.CreateMenu(menuBar, '&Verify', - [(ID_VERIFY, '&Verify protocol\tF1','Verify the protocol in the buffer using Scyther', - self.OnVerify) , - (ID_CHARACTERIZE, '&Characterize roles\tF2','TODO' , - self.OnCharacterize) , - (None, None, None, None), - ### Disabled for now (given that it is not reliable enough yet) - #(ID_CHECK, '&Check protocol\tF5','TODO', - # self.OnCheck) , - (ID_AUTOVERIFY, 'Verify &automatic claims\tF6','TODO', - self.OnAutoVerify) - ]) - self.CreateMenu(menuBar, '&Help', - [(wx.ID_ABOUT, '&About', 'Information about this program', - self.OnAbout) ]) - self.SetMenuBar(menuBar) # Add the menuBar to the Frame - - - def SetTitle(self): - # MainWindow.SetTitle overrides wx.Frame.SetTitle, so we have to - # call it using super: - super(MainWindow, self).SetTitle('Scyther: %s'%self.filename) - - # Helper methods: - - def defaultFileDialogOptions(self): - ''' Return a dictionary with file dialog options that can be - used in both the save file dialog as well as in the open - file dialog. ''' - return dict(message='Choose a file', defaultDir=self.dirname, - wildcard='*.spdl') - - def askUserForFilename(self, **dialogOptions): - dialog = wx.FileDialog(self, **dialogOptions) - if dialog.ShowModal() == wx.ID_OK: - userProvidedFilename = True - self.filepath = dialog.GetPath() - (p1,p2) = os.path.split(self.filepath) - self.dirname = p1 - self.filename = p2 - self.SetTitle() # Update the window title with the new filename - else: - userProvidedFilename = False - dialog.Destroy() - return userProvidedFilename - - # Are we dropping a changed file? - - def ConfirmLoss(self,text=None): - """ - Try to drop the current file. If it was changed, try to save - (as) - - Returns true after the user seems to be happy either way, false - if we need to cancel this. - """ - if self.editor.GetChanged(): - # File changed, we need to confirm this - title = "Unsaved changes" - if text: - title = "%s - " + title - txt = "The protocol file '%s' has been modified.\n\n" % (self.filename) - txt = txt + "Do you want to" - txt = txt + " save your changes (Yes)" - txt = txt + " or" - txt = txt + " discard them (No)" - txt = txt + "?" - dialog = wx.MessageDialog(self,txt,title,wx.YES_NO | wx.CANCEL | wx.ICON_EXCLAMATION) - result = dialog.ShowModal() - dialog.Destroy() - if result == wx.ID_NO: - # Drop changes - return True - elif result == wx.ID_YES: - # First save(as)! - if self.OnSaveAs(None): - # Succeeded, we can continue with the operation - return True - else: - # Save did not succeed - return False - else: - # Assume cancel (wx.ID_CANCEL) otherwise - return False - else: - # File was not changed, so we can just proceed - return True - - # Event handlers - - def OnAbout(self, event): - dlg = About.AboutScyther(self) - dlg.ShowModal() - dlg.Destroy() - - def OnExit(self, event): - if self.ConfirmLoss("Exit"): - self.Close() # Close the main window. - return True - return False - - def OnSave(self, event): - textfile = open(os.path.join(self.dirname, self.filename), 'w') - textfile.write(self.editor.GetText()) - textfile.close() - self.editor.SetSaved() - return True - - def OnOpen(self, event): - if self.ConfirmLoss("Open"): - if self.askUserForFilename(style=wx.OPEN, - **self.defaultFileDialogOptions()): - textfile = open(os.path.join(self.dirname, self.filename), 'r') - self.editor.SetText(textfile.read()) - textfile.close() - self.editor.SetOpened() - return True - return False - - def OnSaveAs(self, event): - if self.askUserForFilename(defaultFile=self.filename, style=wx.SAVE, - **self.defaultFileDialogOptions()): - self.OnSave(event) - os.chdir(self.dirname) - return True - return False - - def RunScyther(self, mode): - # Clear errors before verification - self.editor.SetErrors(None) - # Verify spdl - spdl = self.editor.GetText() - s = Scytherthread.ScytherRun(self,mode,spdl,self.editor.SetErrors) - - def OnVerify(self, event): - self.RunScyther("verify") - - def OnAutoVerify(self, event): - self.RunScyther("autoverify") - - def OnCharacterize(self, event): - self.RunScyther("characterize") - - def OnCheck(self, event): - self.RunScyther("check") - - def firstCommand(self): - if self.opts.command: - # Trigger a command automatically - self.Show(True) - self.RunScyther(self.opts.command) - - -#--------------------------------------------------------------------------- -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Gui/Makeimage.py b/Vagrant Files/shared/scyther/Gui/Makeimage.py deleted file mode 100644 index 220996f..0000000 --- a/Vagrant Files/shared/scyther/Gui/Makeimage.py +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -#--------------------------------------------------------------------------- - -""" Import externals """ -import wx -import os -import sys -from subprocess import Popen, PIPE - -#--------------------------------------------------------------------------- - -""" Import scyther components """ -from Scyther import Misc as MiscScyther -from Scyther import FindDot - -""" Import scyther-gui components """ -import Temporary -import Preference - -#--------------------------------------------------------------------------- -try: - import Image -except ImportError: - pass -#--------------------------------------------------------------------------- - - -def writeGraph(attackthread,txt,fp): - - EDGE = 0 - NODE = 1 - DEFAULT = 2 - ALL = 3 - - def graphLine(txt): - fp.write("\t%s;\n" % (txt)) - - def setAttr(atxt,EdgeNodeDefAll=ALL): - if EdgeNodeDefAll == ALL: - setAttr(atxt,EDGE) - setAttr(atxt,NODE) - setAttr(atxt,DEFAULT) - else: - if EdgeNodeDefAll == EDGE: - edge = "edge" - elif EdgeNodeDefAll == NODE: - edge = "node" - else: - graphLine("%s" % atxt) - return - graphLine("%s [%s]" % (edge,atxt)) - - if sys.platform.startswith("darwin"): - attackthread.fontname = "Helvetica" - elif sys.platform.startswith("win"): - attackthread.fontname = "Courier" - else: - #font = wx.Font(9,wx.SWISS,wx.NORMAL,wx.NORMAL) - #attackthread.fontname = font.GetFaceName() - attackthread.fontname = "\"Helvetica\"" - - # write all graph lines but add layout modifiers - for l in txt.splitlines(): - fp.write(l) - if l.startswith("digraph"): - # Write additional stuff for this graph - # - # [CC][x] This dpi setting messed up quite a bit - #graphLine("dpi=96") - graphLine("rankdir=TB") - #graphLine("nodesep=0.1") - #graphLine("ranksep=0.001") - #graphLine("mindist=0.1") - - # Set fontname - if attackthread.fontname: - fontstring = "fontname=%s" % (attackthread.fontname) - setAttr(fontstring) - - # Stupid Mac <> Graphviz bug fix - if (sys.platform.startswith("mac")) or (sys.platform.startswith("darwin")): - # Note that dot on Mac cannot find the fonts by default, - # and we have to set them accordingly. - os.environ["DOTFONTPATH"]="~/Library/Fonts:/Library/Fonts:/System/Library/Fonts" - - # Select font size - if attackthread.parent and attackthread.parent.mainwin: - fontsize = attackthread.parent.mainwin.settings.fontsize - setAttr("fontsize=%s" % fontsize) - #setAttr("height=\"0.1\"",NODE) - #setAttr("width=\"1.0\"",NODE) - #setAttr("margin=\"0.3,0.03\"",NODE) - - -def makeImageDot(dotdata,attackthread=None): - """ create image for this particular dot data """ - - if Preference.usePIL(): - # If we have the PIL library, we can do postscript! great - # stuff. - type = "ps" - ext = ".ps" - else: - # Ye olde pnge file - type = "png" - ext = ".png" - - # Retrieve dot command path - dotcommand = FindDot.findDot() - - # command to write to temporary file - (fd2,fpname2) = Temporary.tempcleaned(ext) - f = os.fdopen(fd2,'w') - - # Set up command - cmd = "%s -T%s" % (dotcommand,type) - - # execute command - p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE) - - - if attackthread: - writeGraph(attackthread,dotdata,p.stdin) - else: - p.stdin.write(dotdata) - - p.stdin.close() - - for l in p.stdout.read(): - f.write(l) - - p.stdout.close() - f.flush() - f.close() - - return (fpname2, type) - - -def makeImage(attack,attackthread=None): - """ create image for this particular attack """ - - """ This should clearly be a method of 'attack' """ - - (name,type) = makeImageDot(attack.scytherDot,attackthread) - # if this is done, store and report - attack.file = name - attack.filetype = type - - -def testImage(): - """ - We generate a postscript file from a dot file, and see what happens. - """ - - dotdata = "digraph X {\nA->B;\n}\n" - (filename,filetype) = makeImageDot(dotdata) - testimage = Image.open(filename) - -#--------------------------------------------------------------------------- -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Gui/Misc.py b/Vagrant Files/shared/scyther/Gui/Misc.py deleted file mode 100644 index f255124..0000000 --- a/Vagrant Files/shared/scyther/Gui/Misc.py +++ /dev/null @@ -1,90 +0,0 @@ -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# Misc.py -# Various helper functions - -#--------------------------------------------------------------------------- - -""" Import externals """ -import os.path -from subprocess import Popen,PIPE - -#--------------------------------------------------------------------------- - -def confirm(question): - answer = '' - while answer not in ('y','n'): - print question, - answer = raw_input().lower() - return answer == 'y' - -def exists(func,list): - return len(filter(func,list)) > 0 - -def forall(func,list): - return len(filter(func,list)) == len(list) - -def uniq(li): - result = [] - for elem in li: - if (not elem in result): - result.append(elem) - return result - -# Return a sorted copy of a list -def sorted(li): - result = li[:] - result.sort() - return result - - -# path -def mypath(file): - """ Construct a file path relative to the scyther-gui main directory - """ - import os, inspect - - # Determine base directory (taking symbolic links into account) - cmd_file = os.path.realpath(os.path.abspath(inspect.getfile( inspect.currentframe() ))) - basedir = os.path.split(cmd_file)[0] - return os.path.join(basedir,file) - -# commands: push data in, get fp.write out -def cmdpushwrite(cmd,data,fname): - """ - Feed stdin data to cmd, write the output to a freshly created file - 'fname'. The file is flushed and closed at the end. - """ - fp = open(fname,'w') - # execute command - p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE) - (cin,cout) = (p.stdin, p.stdout) - - cin.write(data) - cin.close() - for l in cout.read(): - fp.write(l) - cout.close() - fp.flush() - fp.close() - -#--------------------------------------------------------------------------- -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Gui/Preference.py b/Vagrant Files/shared/scyther/Gui/Preference.py deleted file mode 100644 index 90db531..0000000 --- a/Vagrant Files/shared/scyther/Gui/Preference.py +++ /dev/null @@ -1,240 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -""" - Preferences window and logic for saving and loading such things. - Thus, some default things can be set here. - - init loads stuff - save save the settings after some changes - set(k,v) - get(k) - - Currently used: - - match - maxruns - scytheroptions - bindir where the scyther executables reside - splashscreen 0/1 -""" - -#--------------------------------------------------------------------------- - -""" Import externals """ - -import wx -import os.path -import sys -from time import localtime,strftime - -#--------------------------------------------------------------------------- - -""" Import scyther-gui components """ -import Makeimage - -#--------------------------------------------------------------------------- - -""" Globals """ -# Do we have the Python Imaging library? -havePIL = True -testPILOkay = None -try: - import Image -except ImportError: - havePIL = False - -""" Locations of preferences. The last one is supposedly writable. """ -prefname = "scythergui-config" -preflocs = [] - -#--------------------------------------------------------------------------- - -def usePIL(): - """ - Determine whether or not we should use the PIL library - """ - global havePIL, testPILOkay - - if not havePIL: - return False - - # Only if we have it, and it is windows. - if not sys.platform.startswith("lin"): - return False - - # Seems fine. But did we already test it? - if testPILOkay != None: - return testPILOkay - - # Test the usage - testPILOkay = True - testPILOkay = testPIL() - return testPILOkay - -def doNotUsePIL(): - """ - Disable - """ - global havePIL - - havePIL = False - - -def testPIL(): - """ - Test whether PIL works as we want it. - - We generate a postscript file from a dot file, and see what happens. - """ - - # depends on PIL lib - okay = True - try: - Makeimage.testImage() - # PIL seems fine - except: - # PIL broke - doNotUsePIL() - okay = False - - return okay - - -#--------------------------------------------------------------------------- - -class Preferences(dict): - - def setDict(self,d): - """ - Copy dict into self. - """ - for x in d.keys(): - self[x] = d[x] - - def parse(self,line): - line = line.strip() - - """ Skip comments """ - if not line.startswith("#"): - split = line.find("=") - if split != -1: - key = line[:split].strip() - data = line[(split+1):] - self[key] = data.decode("string_escape") - #print "Read %s=%s" % (key,self[key]) - - def load(self,file=""): - if file == None: - self["test1"] = "Dit is met een ' en een \", en dan\nde eerste dinges" - self["test2"] = "En dit de tweede" - elif file == "": - """ - Test default locations - """ - for f in preflocs: - self.load(os.path.join(f,prefname)) - - else: - """ - Read this file - """ - if os.path.isfile(file): - fp = open(file,"r") - for l in fp.readlines(): - self.parse(l) - fp.close() - - def show(self): - print "Preferences:" - for k in self.keys(): - print "%s=%s" % (k, self[k]) - - def save(self): - - print "Saving preferences" - prefpath = preflocs[-1] - if not os.access(prefpath,os.W_OK): - os.makedirs(prefpath) - savename = os.path.join(prefpath,prefname) - fp = open(savename,"w") - - fp.write("# Scyther-gui configuration file.\n#\n") - date = strftime("%c",localtime()) - fp.write("# Last written on %s\n" % (date)) - fp.write("# Do not edit - any changes will be overwritten by Scyther-gui\n\n") - - l = list(self.keys()) - l.sort() - for k in l: - fp.write("%s=%s\n" % (k, self[k].encode("string_escape"))) - - fp.close() - -def init(): - """ - Load the preferences from a file, if possible - """ - global prefs,preflocs - - sp = wx.StandardPaths.Get() - confdir = sp.GetConfigDir() - confdir += "/scyther" - #print confdir - userconfdir = sp.GetUserConfigDir() - userconfdir += "/" - if sys.platform.startswith("lin"): - userconfdir += "." - userconfdir += "scyther" - #print userconfdir - - preflocs = [confdir,userconfdir] - - prefs = Preferences() - prefs.load("") - - -def get(key,alt=None): - global prefs - - if key in prefs.keys(): - return prefs[key] - else: - return alt - -def getkeys(): - global prefs - - return prefs.keys() - -def set(key,value): - global prefs - - prefs[key]=value - return - -def save(): - global prefs - - prefs.save() - -#--------------------------------------------------------------------------- -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Gui/Scytherthread.py b/Vagrant Files/shared/scyther/Gui/Scytherthread.py deleted file mode 100644 index 2cd5d1a..0000000 --- a/Vagrant Files/shared/scyther/Gui/Scytherthread.py +++ /dev/null @@ -1,543 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -#--------------------------------------------------------------------------- - -""" Import externals """ -import wx -import threading - -#--------------------------------------------------------------------------- - -""" Import scyther components """ -import Scyther.Scyther -import Scyther.Error -from Scyther.Misc import * - -""" Import scyther-gui components """ -import Preference -import Attackwindow -import Icon -import Error -import Makeimage - -#--------------------------------------------------------------------------- -if Preference.havePIL: - import Image -#--------------------------------------------------------------------------- - -class ScytherThread(threading.Thread): - """ - Apply Scyther algorithm to input and retrieve results - """ - - # Override Thread's __init__ method to accept the parameters needed: - def __init__ ( self, spdl, options="", callback=None, mode=None ): - - self.spdl = spdl - self.options = options - self.callback = callback - self.mode = mode - self.popenList = [] - threading.Thread.__init__ ( self ) - - def storePopen(self,p): - self.popenList.append(p) - - def cleanExit(self): - # Cleanup of spawned processes - for index,p in enumerate(self.popenList): - try: - p.kill() - except: - pass - self.popenList = [] - - def run(self): - - (scyther, claims, summary) = self.claimResults() - - # Results are done (claimstatus can be reported) - if self.callback: - wx.CallAfter(self.callback, scyther, claims, summary) - - def claimFixViewOne(self,claims): - """ - This is a stupid hack as long as switches.useAttackBuffer in - Scyther C code is false. It is currently false because Windows - VISTA screwed up the standard C function tmpfile() (It's in a - directory to which normal users cannot write...) - """ - # TODO Notice the stupid default setting too ('2') which is - # needed here. This really needs cleanup. - if int(Preference.get('prune','2')) != 0: - if claims: - for cl in claims: - if len(cl.attacks) > 1: - # Fix it such that by default, only the best attack is - # shown, unless we are in characterize or check mode - # TODO [X] [CC] make switch-dependant. - if not self.mode in ["characterize","check"]: - cl.attacks = [cl.attacks[-1]] - """ Cutting invalidates exactness of attack/behaviour counts """ - cl.complete = False - - return claims - - def claimResults(self): - """ Convert spdl to result (using Scyther) - """ - - scyther = Scyther.Scyther.Scyther() - - scyther.options = self.options - scyther.setInput(self.spdl) - - # verification start - try: - claims = scyther.verify(storePopen=self.storePopen) - except Scyther.Error.ScytherError, el: - claims = None - pass - - summary = str(scyther) - - claims = self.claimFixViewOne(claims) - - return (scyther, claims, summary) - -#--------------------------------------------------------------------------- - -class AttackThread(threading.Thread): - - """ This is a thread because it computes images from stuff in the - background """ - - # Override Thread's __init__ method to accept the parameters needed: - def __init__ ( self, parent, resultwin, callbackclaim=None,callbackattack=None,callbackdone=None ): - - self.parent = parent - self.resultwin = resultwin - self.callbackclaim = callbackclaim - self.callbackattack = callbackattack - self.callbackdone = callbackdone - self.totalattacks = 0 - for cl in self.parent.claims: - for attack in cl.attacks: - self.totalattacks += 1 - - threading.Thread.__init__ ( self ) - - def run(self): - - # create the images in the background - # when the images of a claim are done, callback is called with - # the claim - self.makeImages() - - def makeImages(self): - """ create images """ - - done = 0 - for cl in self.parent.claims: - for attack in cl.attacks: - Makeimage.makeImage(attack,self) - done += 1 - if self.callbackattack: - wx.CallAfter(self.callbackattack,attack,self.totalattacks,done) - if self.callbackclaim: - wx.CallAfter(self.callbackclaim,cl) - if self.callbackdone: - wx.CallAfter(self.callbackdone) - - -#--------------------------------------------------------------------------- - -class VerificationWindow(wx.Dialog): - def __init__( - self, parent, title, pos=wx.DefaultPosition, size=wx.DefaultSize, - style=wx.DEFAULT_DIALOG_STYLE - ): - - wx.Dialog.__init__(self,parent,-1,title,pos,size,style) - - sizer = wx.BoxSizer(wx.VERTICAL) - - label = wx.StaticText(self, -1, "Verifying protocol description") - sizer.Add(label, 0, wx.ALIGN_CENTRE|wx.ALL, 5) - - line = wx.StaticLine(self, -1, size=(20,-1), style=wx.LI_HORIZONTAL) - sizer.Add(line, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.RIGHT|wx.TOP, 5) - - btnsizer = wx.StdDialogButtonSizer() - - btn = wx.Button(self, wx.ID_CANCEL) - btnsizer.AddButton(btn) - btnsizer.Realize() - - sizer.Add(btnsizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.ALIGN_CENTER, 5) - - self.SetSizer(sizer) - sizer.Fit(self) - - self.Center() - self.Show(True) - -#--------------------------------------------------------------------------- - -class ErrorWindow(wx.Dialog): - def __init__( - self, parent, title, pos=wx.DefaultPosition, size=wx.DefaultSize, - style=wx.DEFAULT_DIALOG_STYLE,errors=[] - ): - - wx.Dialog.__init__(self,parent,-1,title,pos,size,style) - - sizer = wx.BoxSizer(wx.VERTICAL) - - label = wx.StaticText(self, -1, "Errors") - sizer.Add(label, 0, wx.ALIGN_LEFT|wx.ALL, 5) - - line = wx.StaticLine(self, -1, size=(20,-1), style=wx.LI_HORIZONTAL) - sizer.Add(line, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.RIGHT|wx.TOP, 5) - - etxt = "" - prefix = "error: " - for er in errors: - if er.startswith(prefix): - er = er[len(prefix):] - etxt = etxt + "%s\n" % (er) - - label = wx.StaticText(self, -1, etxt) - sizer.Add(label, 0, wx.ALIGN_LEFT|wx.ALL, 5) - - line = wx.StaticLine(self, -1, size=(20,-1), style=wx.LI_HORIZONTAL) - sizer.Add(line, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.RIGHT|wx.TOP, 5) - - btnsizer = wx.StdDialogButtonSizer() - - btn = wx.Button(self, wx.ID_OK) - btnsizer.AddButton(btn) - btnsizer.Realize() - - sizer.Add(btnsizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.ALIGN_CENTER, 5) - - self.SetSizer(sizer) - sizer.Fit(self) - -#--------------------------------------------------------------------------- - -class ResultWindow(wx.Frame): - - """ - Displays the claims status and contains buttons to show the actual - attack graphs - """ - - def __init__( - self, parent, parentwindow, title, pos=wx.DefaultPosition, size=wx.DefaultSize, - style=wx.DEFAULT_DIALOG_STYLE - ): - - wx.Frame.__init__(self,parentwindow,-1,title,pos,size,style) - - Icon.ScytherIcon(self) - - self.parent = parent - self.thread = None - self.Bind(wx.EVT_CLOSE, self.onCloseWindow) - - self.CreateStatusBar() - self.BuildTable() - - def onViewButton(self,evt): - btn = evt.GetEventObject() - try: - w = Attackwindow.AttackWindow(btn.claim) - w.Show(True) - except Error.PILError: - Error.ShowAndReturn("Problem with PIL imaging library: disabled zooming. Please retry to verify the protocol again.") - self.onCloseWindow(None) - - def onCloseWindow(self,evt): - """ TODO we should kill self.thread """ - - # Clean up - self.parent.claims = None - - self.Destroy() - - def BuildTable(self): - # Now continue with the normal construction of the dialog - # contents - - # For these claims... - claims = self.parent.claims - - # set up grid - self.grid = grid = wx.GridBagSizer(0,0) - #self.grid = grid = wx.GridBagSizer(7,1+len(claims)) - - def titlebar(x,title,width=1): - txt = wx.StaticText(self,-1,title) - font = wx.Font(14,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD) - txt.SetFont(font) - grid.Add(txt,(0,x),(1,width),wx.ALL,10) - - titlebar(0,"Claim",4) - titlebar(4,"Status",2) - titlebar(6,"Comments",1) - - self.lastprot = None - self.lastrole = None - views = 0 - for index in range(0,len(claims)): - views += self.BuildClaim(grid,claims[index],index+1) - - if views > 0: - titlebar(7,"Patterns",1) - - self.SetSizer(grid) - self.Fit() - - def BuildClaim(self,grid,cl,ypos): - # a support function - def addtxt(txt,column): - txt = txt.replace("-","_") # Strange fix for wx.StaticText as it cuts off the display. - grid.Add(wx.StaticText(self,-1,txt),(ypos,column),(1,1),wx.ALIGN_CENTER_VERTICAL|wx.ALL,10) - - n = len(cl.attacks) - xpos = 0 - - # protocol, role, label - prot = str(cl.protocol) - showP = False - showR = False - if prot != self.lastprot: - self.lastprot = prot - showP = True - showR = True - role = str(cl.role) - if role != self.lastrole: - self.lastrole = role - showR = True - if showP: - addtxt(prot,xpos) - if showR: - addtxt(role,xpos+1) - xpos += 2 - - # claim id - addtxt(str(cl.id),xpos) - xpos += 1 - - # claim parameters - claimdetails = str(cl.claimtype) - if cl.parameter: - claimdetails += " %s" % (cl.parameter) - # Cut off if very very long - if len(claimdetails) > 50: - claimdetails = claimdetails[:50] + "..." - addtxt(claimdetails + " ",xpos) - xpos += 1 - - # button for ok/fail - if None: - # old style buttons (but they looked ugly on windows) - tsize = (16,16) - if cl.okay: - bmp = wx.ArtProvider_GetBitmap(wx.ART_TICK_MARK,wx.ART_CMN_DIALOG,tsize) - else: - bmp = wx.ArtProvider_GetBitmap(wx.ART_CROSS_MARK,wx.ART_CMN_DIALOG,tsize) - if not bmp.Ok(): - bmp = wx.EmptyBitmap(tsize) - bmpfield = wx.StaticBitmap(self,-1,bmp) - grid.Add(bmpfield,(ypos,xpos),(1,1),wx.ALIGN_CENTER_VERTICAL|wx.ALL,10) - else: - # new style text control Ok/Fail - rankc = cl.getColour() - rankt = cl.getOkay() - txt = wx.StaticText(self,-1,rankt) - font = wx.Font(11,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD) - txt.SetFont(font) - txt.SetForegroundColour(rankc) - grid.Add(txt,(ypos,xpos),(1,1),wx.ALL,10) - xpos += 1 - - # verified? - vt = cl.getVerified() - if vt: - addtxt(vt,xpos) - xpos += 1 - - # remark something - addtxt(cl.getComment(),xpos) - xpos += 1 - - # add view button (enabled later if needed) - if n > 0: - cl.button = wx.Button(self,-1,"%i %s" % (n,cl.stateName(n))) - cl.button.claim = cl - grid.Add(cl.button,(ypos,xpos),(1,1),wx.ALIGN_CENTER_VERTICAL|wx.ALL,5) - cl.button.Disable() - if n > 0: - # Aha, something to show - self.Bind(wx.EVT_BUTTON, self.onViewButton,cl.button) - else: - cl.button = None - xpos += 1 - - # Return 1 if there is a view possible - if n > 0: - return 1 - else: - return 0 - - -#--------------------------------------------------------------------------- - -class ScytherRun(object): - - def __init__(self,mainwin,mode,spdl,errorcallback=None): - - self.mainwin = mainwin - self.mode = mode - self.spdl = spdl - self.verified = False - self.options = mainwin.settings.ScytherArguments(mode) - self.errorcallback=errorcallback - self.SThread = None - - self.main() - - def closer(self,ev): - # Triggered when the window is closed/verification cancelled - t = self.SThread - if t != None: - self.SThread = None - t.cleanExit() - try: - self.verifywin.Destroy() - except: - pass - self.verifywin = None - ev.Skip() - - def main(self): - """ - Start process - """ - - title = "Running Scyther %s process" % self.mode - # start the window and show until something happens - # if it terminates, this is a cancel, and should also kill the thread. (what happens to a spawned Scyther in that case?) - # if the thread terminames, it should close the window normally, and we end up here as well. - #val = self.verifywin.ShowModal() - self.verifywin = VerificationWindow(self.mainwin,title) - - # Check sanity of Scyther thing here (as opposed to the thread) - # which makes error reporting somewhat easier - try: - Scyther.Scyther.Check() - except Scyther.Error.BinaryError, e: - # e.file is the supposed location of the binary - text = "Could not find Scyther binary at\n%s" % (e.file) - Error.ShowAndExit(text) - - # start the thread - self.verifywin.SetCursor(wx.StockCursor(wx.CURSOR_WAIT)) - self.verifywin.Bind(wx.EVT_CLOSE, self.closer) - self.verifywin.Bind(wx.EVT_WINDOW_DESTROY, self.closer) - self.verifywin.Bind(wx.EVT_BUTTON, self.closer, id=wx.ID_CANCEL) - - self.SThread = ScytherThread(self.spdl, self.options, self.verificationDone, self.mode) - self.SThread.start() - - # after verification, we proceed to the callback below... - - def verificationDone(self, scyther, claims, summary): - """ - This is where we end up after a callback from the thread, stating that verification succeeded. - """ - - if self.verifywin == None: - return - - self.scyther = scyther - self.claims = claims - self.summary = summary - - self.verified = True - self.verifywin.Close() - - # Process the claims - if self.scyther.errorcount == 0: - self.verificationOkay() - else: - self.verificationErrors() - - def verificationOkay(self): - - # Great, we verified stuff, progress to the claim report - title = "Scyther results : %s" % self.mode - self.resultwin = resultwin = ResultWindow(self,self.mainwin,title) - - def attackDone(attack,total,done): - if resultwin: - txt = "Generating attack graphs (%i of %i done)." % (done,total) - resultwin.SetStatusText(txt) - #resultwin.Refresh() - - def claimDone(claim): - if resultwin: - if claim.button and len(claim.attacks) > 0: - claim.button.Enable() - - def allDone(): - if resultwin: - resultwin.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) - resultwin.SetStatusText("Done.") - - resultwin.Center() - resultwin.Show(True) - resultwin.SetCursor(wx.StockCursor(wx.CURSOR_ARROWWAIT)) - - wx.Yield() - - t = AttackThread(self,resultwin,claimDone,attackDone,allDone) - t.start() - - resultwin.thread = t - - def verificationErrors(self): - """ - Verification process generated errors. Show them. - """ - - if self.errorcallback: - self.errorcallback(self.scyther.errors) - title = "Scyther errors : %s" % self.mode - errorwin = ErrorWindow(self.mainwin,title,errors=self.scyther.errors) - errorwin.Center() - val = errorwin.ShowModal() - -#--------------------------------------------------------------------------- -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Gui/Settingswindow.py b/Vagrant Files/shared/scyther/Gui/Settingswindow.py deleted file mode 100644 index 5bc5fa9..0000000 --- a/Vagrant Files/shared/scyther/Gui/Settingswindow.py +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -#--------------------------------------------------------------------------- - -""" Import externals """ -import wx -import sys - -#--------------------------------------------------------------------------- - -""" Import scyther-gui components """ -import Preference -import Scyther.Claim as Claim - -#--------------------------------------------------------------------------- - -class MyGrid(wx.GridBagSizer): - - def __init__(self,parent): - wx.GridBagSizer.__init__(self,hgap=5, vgap=5) - self.ypos = 0 - self.parent = parent - - def stepAdd(self,ctrl,txt): - self.Add(txt,(self.ypos,0),flag=wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL) - self.Add(ctrl,(self.ypos,1),flag=wx.ALIGN_LEFT) - self.ypos += 1 - - def lineAdd(self): - return - line = wx.StaticLine(self.parent,-1) - # Currently it is not expanded, and thus invisible. - self.Add(line,pos=(self.ypos,0),span=(1,2),flag=wx.TOP|wx.BOTTOM) - self.ypos += 1 - - def titleAdd(self,title,firstLine=True): - if firstLine: - self.lineAdd() - self.ypos += 1 - txt = wx.StaticText(self.parent,-1,title) - font = wx.Font(12,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD) - txt.SetFont(font) - self.Add(txt,pos=(self.ypos,0),span=(1,2),flag=wx.ALIGN_LEFT) - self.ypos += 1 - self.lineAdd() - -#--------------------------------------------------------------------------- - -class SettingsWindow(wx.Panel): - - def __init__(self,parent,daddy): - wx.Panel.__init__(self,parent,-1) - self.win = daddy - - # layout the stuff - grid = MyGrid(self) - - ### Parameters - grid.titleAdd("Verification parameters",False) - - # Bound on the number of runs - self.maxruns = int(Preference.get('maxruns','5')) - txt = wx.StaticText(self,-1,"Maximum number of runs\n(0 disables bound)") - ctrl = wx.SpinCtrl(self, -1, "",style=wx.RIGHT) - ctrl.SetRange(0,100) - ctrl.SetValue(self.maxruns) - self.Bind(wx.EVT_SPINCTRL,self.EvtRuns,ctrl) - grid.stepAdd(ctrl,txt) - - # Matchin options - self.match = int(Preference.get('match','0')) - claimoptions = ['typed matching','find basic type flaws','find all type flaws'] - r2 = wx.StaticText(self,-1,"Matching type") - l2 = self.ch = wx.Choice(self,-1,choices=claimoptions) - l2.SetSelection(self.match) - self.Bind(wx.EVT_CHOICE,self.EvtMatch,l2) - grid.stepAdd(l2,r2) - - ### MISC expert stuff - grid.titleAdd("Advanced parameters") - - # Continue after finding the first attack - self.prune = int(Preference.get('prune','2')) - claimoptions = ['Find all attacks','Find first attack','Find best attack'] - r8 = wx.StaticText(self,-1,"Search pruning") - l8 = self.ch = wx.Choice(self,-1,choices=claimoptions) - l8.SetSelection(self.prune) - self.Bind(wx.EVT_CHOICE,self.EvtPrune,l8) - grid.stepAdd(l8,r8) - - # Bound on the number of patterns - self.maxattacks = int(Preference.get('maxattacks','10')) - r9 = wx.StaticText(self,-1,"Maximum number of patterns\nper claim") - l9 = wx.SpinCtrl(self, -1, "",style=wx.RIGHT) - l9.SetRange(0,100) - l9.SetValue(self.maxattacks) - self.Bind(wx.EVT_SPINCTRL,self.EvtMaxAttacks,l9) - grid.stepAdd(l9,r9) - - self.misc = Preference.get('scytheroptions','') - r10 = wx.StaticText(self,-1,"Additional backend parameters") - l10 = wx.TextCtrl(self,-1,self.misc,size=(200,-1)) - self.Bind(wx.EVT_TEXT,self.EvtMisc,l10) - grid.stepAdd(l10,r10) - - ### Graph output stuff - grid.titleAdd("Graph output parameters") - - # Bound on the number of classes/attacks - if sys.platform.startswith("lin"): - defsize = 14 - else: - defsize = 11 - self.fontsize = int(Preference.get('fontsize',defsize)) - txt = wx.StaticText(self,-1,"Attack graph font size\n(in points)") - ctrl = wx.SpinCtrl(self, -1, "",style=wx.RIGHT) - ctrl.SetRange(6,32) - ctrl.SetValue(self.fontsize) - self.Bind(wx.EVT_SPINCTRL,self.EvtFontsize,ctrl) - grid.stepAdd(ctrl,txt) - - ### Combine - grid.lineAdd() - self.SetSizer(grid) - self.SetAutoLayout(True) - - def EvtMatch(self,evt): - self.match = evt.GetInt() - - def EvtRuns(self,evt): - self.maxruns = evt.GetInt() - - def EvtFontsize(self,evt): - self.fontsize = evt.GetInt() - - def EvtPrune(self,evt): - self.prune = evt.GetInt() - Preference.set('prune',self.prune) - - def EvtMaxAttacks(self,evt): - self.maxattacks = evt.GetInt() - - def EvtMisc(self,evt): - self.misc = evt.GetString() - - def ScytherArguments(self,mode): - """ Note: constructed strings should have a space at the end to - correctly separate the options. - """ - - tstr = "" - - # Number of runs - tstr += "--max-runs=%s " % (str(self.maxruns)) - # Matching type - tstr += "--match=%s " % (str(self.match)) - # Prune (has to go BEFORE max attacks) - tstr += "--prune=%s" % (str(self.prune)) - # Max attacks/classes - if self.maxattacks != 0: - tstr += "--max-attacks=%s " % (str(self.maxattacks)) - - # Verification type - if mode == "check": - tstr += "--check " - elif mode == "autoverify": - tstr += "--auto-claims " - elif mode == "characterize": - tstr += "--state-space " - - # Anything else? - if self.misc != "": - tstr += " " + self.misc + " " - - return str(tstr) # turn it into a str (might have been unicode weirdness) - -#--------------------------------------------------------------------------- diff --git a/Vagrant Files/shared/scyther/Gui/Temporary.py b/Vagrant Files/shared/scyther/Gui/Temporary.py deleted file mode 100644 index 61c2466..0000000 --- a/Vagrant Files/shared/scyther/Gui/Temporary.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -#--------------------------------------------------------------------------- - -""" Import externals """ -import os -import tempfile -import atexit - -#--------------------------------------------------------------------------- - -""" Local thing (can be done in numerous nicer ways) """ -tempfiles = [] - -#--------------------------------------------------------------------------- - -def tempremove(tuple): - (fd,fpname) = tuple - #os.close(fd) - os.remove(fpname) - -def cleanupshop(): - global tempfiles - - for tuple in tempfiles: - tempremove(tuple) - -def tempcleaned(post=""): - global tempfiles - - tuple = tempfile.mkstemp(post,"scyther_") - tempfiles.append(tuple) - return tuple - -def tempcleanearly(tuple): - global tempfiles - - tempfiles.remove(tuple) - tempremove(tuple) - -atexit.register(cleanupshop) - - -#--------------------------------------------------------------------------- -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Gui/Version.py b/Vagrant Files/shared/scyther/Gui/Version.py deleted file mode 100644 index d941e4b..0000000 --- a/Vagrant Files/shared/scyther/Gui/Version.py +++ /dev/null @@ -1 +0,0 @@ -SCYTHER_GUI_VERSION = "v1.1.3" diff --git a/Vagrant Files/shared/scyther/Gui/__init__.py b/Vagrant Files/shared/scyther/Gui/__init__.py deleted file mode 100644 index 6995b43..0000000 --- a/Vagrant Files/shared/scyther/Gui/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - diff --git a/Vagrant Files/shared/scyther/INSTALL.md b/Vagrant Files/shared/scyther/INSTALL.md deleted file mode 100644 index 67f772c..0000000 --- a/Vagrant Files/shared/scyther/INSTALL.md +++ /dev/null @@ -1,96 +0,0 @@ -Installation and usage of the Scyther tool -========================================== - -Download --------- - -Downloads of binary archives of Scyther for all main platforms can be -found at http://users.ox.ac.uk/~coml0529/scyther/index.html - -Requirements ------------- - -To be able to use all of Scyther's features, the following three -dependencies are needed. If you only require the back-end tool (used -from the command line) then you need only the first. - -1. ### The GraphViz library ### - - This library is used by the Scyther tool to draw graphs. It can be - freely downloaded from: - - http://www.graphviz.org/ - - Download the latest stable release and install it. - - -2. ### Python ### - - Stable releases of the Python interpreter are available from: - - http://www.python.org/download/ - - Scyther does not support Python 3. You are therefore recommended to - choose the latest production release of Python 2, e.g., Python 2.7. - - * **Mac OS X** - - If the package yields an error when you try to install it, - please use the following, in the directory where you downloaded - it: - - ``` - $ sudo installer -pkg graphviz-2.34.0.pkg -target / - ``` - - -3. ### wxPython libraries ### - - The GUI user interface uses the wxPython libraries. - - http://www.wxpython.org/download.php - - There are many different wxPython packages. You should choose a 32-bit - package that matches your Python version (e.g., 2.7). It is - recommended to select the unicode version from the stable releases. - - As of writing (May 2013) the following links lead to the appropriate - wxPython packages for Python 2.7: - - * **Windows** - - http://downloads.sourceforge.net/wxpython/wxPython2.8-win32-unicode-2.8.12.1-py27.exe - - * **Mac OS X** - - http://downloads.sourceforge.net/wxpython/wxPython2.8-osx-unicode-2.8.12.1-universal-py2.7.dmg - - Note that this package is in an old format and you will probably - get a warning "Package is damaged". This can be resolved by: - - ``` - $ sudo installer -pkg /Volume/.../wxPython2.8-osx-unicode-universal-py2.7.pkg/ -target / - ``` - - * **Ubuntu/Debian Linux** - - http://wiki.wxpython.org/InstallingOnUbuntuOrDebian - - -Running Scyther ---------------- - -Extract the Scyther archive and navigate to the extracted directory. - -Start Scyther by executing the file - - scyther-gui.py - -in the main directory of the extracted archive. - - * **Mac OS X** - - Right-click the file 'scyther-gui.py' and select "Open with" and - then "Python Launcher". - - diff --git a/Vagrant Files/shared/scyther/INSTALL.txt b/Vagrant Files/shared/scyther/INSTALL.txt deleted file mode 100644 index 3662306..0000000 --- a/Vagrant Files/shared/scyther/INSTALL.txt +++ /dev/null @@ -1,85 +0,0 @@ -Installation and usage of the Scyther tool -========================================== - -Requirements ------------- - -To be able to use Scyther, you need the following three things: - - -1. The GraphViz library. - - This library is used by the Scyther tool to draw graphs. It can be - freely downloaded from: - - http://www.graphviz.org/ - - Download the latest stable release and install it. - - - -The graphical user interface of Scyther is written in the Python -language. Therefore, the GUI requires the following two items: - - -2. Python - - Stable releases of the Python interpreter are available from: - - <a href="http://www.python.org/download/"> - - Scyther does not support Python 3. You are therefore recommended to - choose the latest production release of Python 2, e.g., Python 2.7. - - Mac OS X: - If the package yields an error when you try to install it, - please use the following, in the directory where you downloaded - it: - - $ sudo installer -pkg graphviz-2.34.0.pkg -target / - - -3. wxPython libraries. - - The GUI user interface uses the wxPython libraries. - - <a href="http://www.wxpython.org/download.php"> - - There are many different wxPython packages. You should choose a 32-bit - package that matches your Python version (e.g., 2.7). It is - recommended to select the unicode version from the stable releases. - - As of writing (May 2013) the following links lead to the appropriate - wxPython packages for Python 2.7: - - Windows: - <a href="http://downloads.sourceforge.net/wxpython/wxPython2.8-win32-unicode-2.8.12.1-py27.exe"> - - Mac OS X: - <a href="http://downloads.sourceforge.net/wxpython/wxPython2.8-osx-unicode-2.8.12.1-universal-py2.7.dmg"> - - Note that this package is in an old format and you will probably - get a warning "Package is damaged". This can be resolved by: - - $ sudo installer -pkg /Volume/.../wxPython2.8-osx-unicode-universal-py2.7.pkg/ -target / - - Ubuntu/Debian Linux: - <a href="http://wiki.wxpython.org/InstallingOnUbuntuOrDebian"> - - -Running Scyther ---------------- - - -Start Scyther by executing the file - - scyther-gui.py - -in the directory where you found this file. - - Mac OS X: - - Right-click the file 'scyther-gui.py' and select "Open with" and - then "Python Launcher". - - diff --git a/Vagrant Files/shared/scyther/Images/scyther-gui-16.ico b/Vagrant Files/shared/scyther/Images/scyther-gui-16.ico deleted file mode 100644 index a92d8228d89417af4cfb8dfc4081c8df0e3a8e73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZQzU}Ruq5D);-3Je)63=Con3=A3!3=9Gc3=9ek5OD_F;2#46!+#j&kl^{xqb~Yi z$W->fguU{ADKGW^vcWq46=MwltEQO!S4~4;S${2%zJEeOLjNr-E&rREn*KMoF#WG% zY4BgjQ0l*gtLlIG5WWA(@y7qvvn>B>mfHW<sdR#4#aLso{;;sH|LEZB*RTJN9zFU$ zF(>)ItdHh@#VCXS%E_kx)iW&rt7k&6Y@iNUe|UH}x^_7K@87@wr_Y)Wc8hF))_?gh zz5nvz24F1VtV&Qn$e@4!{{7F$&-yQFqxfIKNf~Sw$ZtZ%vP9_znX!BK?*BZhLjU<S zMgQ~bNPsbqq7c#gj~_q&pNF5}Kfe$H^YDP<?H@k>gX{+33BBF_4W$_VTgWo}w^3yH zZ>Pxc-#~(}evsc+uUzrpPM+hxk1E6e5KV^vF**$Y6ZIJWdnrToM@B}1tiZspUcLHX zUYPgaNuJ?<usXy4I30%nS%wV%OU)Sm*H|+AkJrJjA7tmLQ>Xr$X{r9VlVbSquL@C{ zXUOos+JfPKryaxpDb5W4i;YqBfBW|Be_>(ae@#tIP`LhA<Y)MA4bra+(VuV3@W0NI z;eWS1!~Yqs4F4<4Q1yd60J3}6u3i5@X<CSb;lGv;!+#qohW~Ez4FCO&)&HmJG5jwy zWcXiY!SFvBhx<Y1T)%$(e?>*be<vI3|M^)N|BoCw3{KA=a{^Tv{zqyu{P$9X*ze@z w1kyqj2Kh-xh~dAXD8qkEA&7nk1_n?bCK_`vF#H2ykiG^61_pBR|NjgO0F|{~0RR91 diff --git a/Vagrant Files/shared/scyther/Images/scyther-gui-32.ico b/Vagrant Files/shared/scyther/Images/scyther-gui-32.ico deleted file mode 100644 index b87d7f95499453981808d80573fadbe935c143f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 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 diff --git a/Vagrant Files/shared/scyther/Images/scyther-gui-64.ico b/Vagrant Files/shared/scyther/Images/scyther-gui-64.ico deleted file mode 100644 index 2fb682f62d1421d03c3963a78039c7c9519fb730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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%0A?LP@>52AA~{e1gJYH@;@jY zT)A@Pe|&uWe*pmj3_nBdfQy65KTv-bmIef%<)Anl!+%gdz!nCeIuMi>O!*o9BbNoB zx*t^kf&Ahl%J3hQrh~;9{=?D(C{KXO!W5*kFh`EzKL~@$P^jA|_CF{LK={j-FaJT~ z6@r3-aQ{N>fb*Fc82*FWxv(_A$HMR*ln+GMAZ=ez7=X$`SY4pb&F~*o9>B^&SXuzJ z|6pYzJRCsjL6qUYzZk=RP`L;y8zLkb{)6j7XxRv=7eE-4m!NK=n*Tvz0Kz9uocOP$ zr3Lph)E+P&mIq*IfQOmkKd3GQ<pWSz0BZk(!T^*GK;;3rJpio}L2V*XSpjM*f!OBI zdJ!HDpnQSUE`Ya*plJeBKZ3#ngh6=;>MpAL9~1_levO%#8Q9NId*EzP9)P6*P#X}` z7Qz+=puRt-O$18|pmYH<3lxr^dJ<GV!rBL*G7{AP1C<Y;dJ>d3JVY4&gUU)+Sb)+6 zsH_0#gPKJX|AWHd_3PLFt*x!${)XE3ACw0`<sdi>K+8hpFaYNTXuA*;*B}haCm=s7 zC@B12ym;|{Ha52ZpfUqgHh|iQu<`*pO@Qi5P<sg!7OqI?0u&ygwiVPpH1j_w3_xW< zN=gd2e+#t_-1dj10Z@AYR2G8j1C%geW%v&Y2T=Y1wVOcx1+^jHzkd%h_P>RN#eYsF zNIwBoK7i^=ke|SPL_UW9pt2Gc7NB$isy9G+9+oyhdZ6y1ssF)_{r~^}_U+sMgVsJn z?SzK`C=GzhLRc7p{0qtxpmqW%zFAmUz<tGQ*RH{g0@H16ZD2D%`2*Bn0+o}XG6Cc- zP*{M|1+?!3Dl<{SLxABwNDtI4bn!pP(V%_+XdW9>R|*LU!Se;kpD+w{6L>7BxVZTL z&6_ttS~2j&ix<IZ3e<N7g#oCH0JR@M{RcHJhX0`O(1g|<u<!t<4``nPRJKCxqMQGb zJpt+)Y}~l<e?>*b|LExG|KZ``|Fg2P{!f}T>HnECXa0l23Ryim8`PgvQBnC1N;{zX z0#rtT>I_gB2@enGSOPdqK;x#MaWrU{NV8Mc{zrGuK=4830Vv&wK>N|4@=yX=Zi2%E z)URe|_zw#g1rCP);B>+X>30ug{8J;mK;!cuKY+?kP&*RTjsmqKKzRZbCLj!IQ-J!| z$YBF&Lx9wS^x~WU2K8HedV2oDFlY|CzrX)KHaua%g#VK#PsWL-O`G-~8wRcGnK^Uj ze{6WxtXco(&Yg=D&zm>zKS(dA?*XbyL16$YJ3$y!kAN_!&IGk9Kp5m-5C(-22!qrU z@;_7_UQP{GJ}3{cF*5uI)uqT7R5rjcsICNKW`_Tu`UO<)K>dTW{DaC58vld*i4TL? xRit33|AvhJq3)%2e2jGe|6yQY_&ZWD=zIXs(Ey_~C=?*)C4gANJv?CT4*(jc@O=OP diff --git a/Vagrant Files/shared/scyther/Images/scyther-icon.svg b/Vagrant Files/shared/scyther/Images/scyther-icon.svg deleted file mode 100644 index 7586c82..0000000 --- a/Vagrant Files/shared/scyther/Images/scyther-icon.svg +++ /dev/null @@ -1,222 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="841.88977pt" - height="595.27557pt" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.43" - version="1.0" - sodipodi:docbase="/home/cas/bzr/scyther-gui/images" - sodipodi:docname="scyther-icon.svg" - inkscape:export-filename="/home/cas/svn/scyther/Design download page Scyther/scyther-icon16.png" - inkscape:export-xdpi="1.6494846" - inkscape:export-ydpi="1.6494846"> - <defs - id="defs4"> - <linearGradient - id="linearGradient11078"> - <stop - id="stop11080" - offset="0" - style="stop-color:#000000;stop-opacity:0.57731956;" /> - <stop - style="stop-color:#000000;stop-opacity:0;" - offset="0.209216" - id="stop11084" /> - <stop - id="stop11086" - offset="0.65205503" - style="stop-color:#000000;stop-opacity:0.2371134;" /> - <stop - id="stop11082" - offset="1" - style="stop-color:#000000;stop-opacity:0.67010307;" /> - </linearGradient> - <linearGradient - id="linearGradient11052"> - <stop - id="stop11054" - offset="0" - style="stop-color:#000000;stop-opacity:1;" /> - <stop - style="stop-color:#276816;stop-opacity:1;" - offset="0.25145975" - id="stop11060" /> - <stop - id="stop11066" - offset="0.57149941" - style="stop-color:#000000;stop-opacity:1;" /> - <stop - id="stop11062" - offset="0.57149941" - style="stop-color:#010400;stop-opacity:1;" /> - <stop - style="stop-color:#002583;stop-opacity:1;" - offset="0.8028897" - id="stop11064" /> - <stop - id="stop11056" - offset="1" - style="stop-color:#000000;stop-opacity:1;" /> - </linearGradient> - <linearGradient - id="linearGradient11044"> - <stop - style="stop-color:#000000;stop-opacity:1;" - offset="0" - id="stop11046" /> - <stop - style="stop-color:#000000;stop-opacity:0;" - offset="1" - id="stop11048" /> - </linearGradient> - <linearGradient - id="linearGradient7532"> - <stop - id="stop7534" - offset="0" - style="stop-color:#9e9e9e;stop-opacity:1;" /> - <stop - id="stop7536" - offset="1" - style="stop-color:#9e9e9e;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11052" - id="linearGradient5737" - x1="521.7384" - y1="589.8822" - x2="521.7384" - y2="174.88217" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11044" - id="linearGradient8364" - gradientUnits="userSpaceOnUse" - x1="323.7384" - y1="278.88214" - x2="477.7384" - y2="322.88214" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1" - inkscape:cx="526.18109" - inkscape:cy="372.04724" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showguides="true" - inkscape:guide-bbox="true" - inkscape:window-width="1280" - inkscape:window-height="953" - inkscape:window-x="0" - inkscape:window-y="0"> - <sodipodi:guide - orientation="horizontal" - position="296.88141" - id="guide1366" /> - <sodipodi:guide - orientation="horizontal" - position="571.88122" - id="guide8421" /> - <sodipodi:guide - orientation="vertical" - position="206.87725" - id="guide8423" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Black base" - inkscape:groupmode="layer" - id="layer1" - style="display:inline" - sodipodi:insensitive="true"> - <rect - style="opacity:1;fill:url(#linearGradient5737);fill-opacity:1;stroke:#000000;stroke-width:6.73799992;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect7546" - width="323.44028" - height="320.51846" - x="194.92915" - y="162.62292" /> - </g> - <g - inkscape:groupmode="layer" - id="layer9" - inkscape:label="inner fade" - sodipodi:insensitive="true" - style="display:inline"> - <rect - style="opacity:1;fill:url(#linearGradient8364);fill-opacity:1;stroke:#000000;stroke-width:6.73799992;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" - id="rect7489" - width="323.44028" - height="320.51846" - x="194.92915" - y="162.62292" /> - </g> - <g - inkscape:groupmode="layer" - id="layer7" - inkscape:label="blacker fades" - style="display:inline" - sodipodi:insensitive="true" /> - <g - inkscape:groupmode="layer" - id="layer4" - inkscape:label="white inner" - style="display:inline"> - <path - style="font-size:48px;font-style:oblique;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:15.39999962;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8.60000038;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Luxi Serif" - d="M 439.625,186.5625 L 228.875,186.96875 L 229,447.625 L 298.46875,447.0625 C 330.87282,446.92031 358.52897,437.28122 380.09375,420.40625 C 401.65809,403.53126 412.43728,382.80494 412.4375,358.21875 C 412.43728,345.47874 408.75517,334.539 401.375,325.375 C 394.57101,316.65817 381.16868,305.92772 361.21875,293.1875 L 346,283.46875 C 335.8349,277.00229 328.44922,270.61422 323.78125,264.34375 C 307.04223,258.53812 294.42062,259.0563 268.875,259.90625 C 278.05518,239.8488 296.11407,242.38722 300.21875,237.3125 C 304.95019,231.46292 305.43096,234.13065 309.84375,229.25 C 321.81701,216.0073 334.34348,209.33336 346.96875,206.0625 C 353.47544,203.07236 360.58299,201.56871 368.3125,201.65625 C 397.62337,201.98826 427.75001,225.34375 427.75,225.34375 L 439.625,186.5625 z " - id="path7544" - sodipodi:nodetypes="ccccsscccccsscscc" /> - </g> - <g - inkscape:groupmode="layer" - id="layer8" - inkscape:label="upper white" - style="display:inline"> - <path - style="font-size:48px;font-style:oblique;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:8.89999962;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8.60000038;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Luxi Serif" - d="M 439.625,186.5625 L 228.875,186.96875 L 229,447.625 L 298.46875,447.0625 C 330.87282,446.92031 358.52897,437.28122 380.09375,420.40625 C 401.65809,403.53126 412.43728,382.80494 412.4375,358.21875 C 412.43728,345.47874 408.75517,334.539 401.375,325.375 C 394.57101,316.65817 381.16868,305.92772 361.21875,293.1875 L 346,283.46875 C 335.8349,277.00229 328.44922,270.61422 323.78125,264.34375 C 307.04223,258.53812 294.42062,259.0563 268.875,259.90625 C 278.05518,239.8488 296.11407,242.38722 300.21875,237.3125 C 304.95019,231.46292 305.43096,234.13065 309.84375,229.25 C 321.81701,216.0073 334.34348,209.33336 346.96875,206.0625 C 353.47544,203.07236 360.58299,201.56871 368.3125,201.65625 C 397.62337,201.98826 427.75001,225.34375 427.75,225.34375 L 439.625,186.5625 z " - id="path6613" - sodipodi:nodetypes="ccccsscccccsscscc" /> - </g> - <g - inkscape:groupmode="layer" - id="layer5" - inkscape:label="beak" - style="display:inline" - sodipodi:insensitive="true" /> - <g - inkscape:groupmode="layer" - id="layer3" - inkscape:label="cyther" - style="display:inline" - sodipodi:insensitive="true" /> -</svg> diff --git a/Vagrant Files/shared/scyther/Images/scyther-splash.png b/Vagrant Files/shared/scyther/Images/scyther-splash.png deleted file mode 100644 index 818997cab57b178f6dd05bd9cf694486ab5f7ada..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119951 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	kJg3VvvU3*vN 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 Sq!<_&7(8A5T-G@yGywpksKk5# diff --git a/Vagrant Files/shared/scyther/Protocols/Demo/ns3.spdl b/Vagrant Files/shared/scyther/Protocols/Demo/ns3.spdl deleted file mode 100644 index c9235c5..0000000 --- a/Vagrant Files/shared/scyther/Protocols/Demo/ns3.spdl +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Needham-Schroeder protocol - */ - -// The protocol description - -protocol ns3(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {I,ni}pk(R) ); - recv_2(R,I, {ni,nr}pk(I) ); - send_3(I,R, {nr}pk(R) ); - - claim_i1(I,Secret,ni); - claim_i2(I,Secret,nr); - claim_i3(I,Niagree); - claim_i4(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {I,ni}pk(R) ); - send_2(R,I, {ni,nr}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim_r1(R,Secret,ni); - claim_r2(R,Secret,nr); - claim_r3(R,Niagree); - claim_r4(R,Nisynch); - } -} - - - diff --git a/Vagrant Files/shared/scyther/Protocols/Demo/nsl3-broken.spdl b/Vagrant Files/shared/scyther/Protocols/Demo/nsl3-broken.spdl deleted file mode 100644 index c635f91..0000000 --- a/Vagrant Files/shared/scyther/Protocols/Demo/nsl3-broken.spdl +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Needham-Schroeder-Lowe protocol, - * broken version (wrong role name in first message) - */ - -// The protocol description - -protocol nsl3-broken(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {R,ni}pk(R) ); - recv_2(R,I, {ni,nr,R}pk(I) ); - send_3(I,R, {nr}pk(R) ); - - claim_i1(I,Secret,ni); - claim_i2(I,Secret,nr); - claim_i3(I,Niagree); - claim_i4(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {R,ni}pk(R) ); - send_2(R,I, {ni,nr,R}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim_r1(R,Secret,ni); - claim_r2(R,Secret,nr); - claim_r3(R,Niagree); - claim_r4(R,Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/Demo/nsl3-updated-both.spdl b/Vagrant Files/shared/scyther/Protocols/Demo/nsl3-updated-both.spdl deleted file mode 100644 index 076166e..0000000 --- a/Vagrant Files/shared/scyther/Protocols/Demo/nsl3-updated-both.spdl +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Needham-Schroeder-Lowe protocol, - * broken version (wrong role name in first message) - */ - -// The protocol description - -protocol nsl3-broken(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {R,ni}pk(R) ); - recv_2(R,I, {ni,nr,R}pk(I) ); - send_3(I,R, {nr}pk(R) ); - - claim_i1(I,Secret,ni); - claim_i2(I,Secret,nr); - claim_i3(I,Niagree); - claim_i4(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {R,ni}pk(R) ); - send_2(R,I, {ni,nr,R}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim_r1(R,Secret,ni); - claim_r2(R,Secret,nr); - claim_r3(R,Niagree); - claim_r4(R,Nisynch); - } -} - -/* - * Needham-Schroeder-Lowe protocol - */ - -// The protocol description - -protocol nsl3(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {I,ni}pk(R) ); - recv_2(R,I, {ni,nr,R}pk(I) ); - send_3(I,R, {nr}pk(R) ); - - claim_i1(I,Secret,ni); - claim_i2(I,Secret,nr); - claim_i3(I,Niagree); - claim_i4(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {I,ni}pk(R) ); - send_2(R,I, {ni,nr,R}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim_r1(R,Secret,ni); - claim_r2(R,Secret,nr); - claim_r3(R,Niagree); - claim_r4(R,Nisynch); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/Demo/nsl3.spdl b/Vagrant Files/shared/scyther/Protocols/Demo/nsl3.spdl deleted file mode 100644 index ebf9031..0000000 --- a/Vagrant Files/shared/scyther/Protocols/Demo/nsl3.spdl +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Needham-Schroeder-Lowe protocol - */ - -// The protocol description - -protocol nsl3(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {I,ni}pk(R) ); - recv_2(R,I, {ni,nr,R}pk(I) ); - send_3(I,R, {nr}pk(R) ); - - claim_i1(I,Secret,ni); - claim_i2(I,Secret,nr); - claim_i3(I,Niagree); - claim_i4(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {I,ni}pk(R) ); - send_2(R,I, {ni,nr,R}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim_r1(R,Secret,ni); - claim_r2(R,Secret,nr); - claim_r3(R,Niagree); - claim_r4(R,Nisynch); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2rsa.spdl b/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2rsa.spdl deleted file mode 100644 index 73133a7..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2rsa.spdl +++ /dev/null @@ -1,46 +0,0 @@ -/* - * PKMv2-RSA - * - * Initial model by: Sjouke Mauw, Sasa Radomirovic (2007) - * Model changes: Cas Cremers (Nov 2012) - * - * Analysed in: "A framework for compositional verification of security protocols" - * With S. Andova, K. Gjosteen, S. Mauw, S. Mjolsnes, and S. Radomirovic. - * Information and Computation, Special issue on Computer Security: - * Foundations and Automated Reasoning, Volume 206, Issues 2-4, pp. 425-459, - * Elsevier, 2008. - */ - -// The protocol description - -protocol pkmv2rsa(MS,BS) -{ - role MS - { - fresh msrand, said: Nonce; - var prepak, bsrand: Nonce; - - send_rsa1(MS,BS, {msrand, said, MS}sk(MS) ); - recv_rsa2(BS,MS, {msrand, bsrand,{prepak,MS}pk(MS),BS}sk(BS) ); - send_rsa3(MS,BS, {bsrand}sk(MS) ); - - claim_rsai3(MS,Niagree); - claim_rsai4(MS,Nisynch); - claim_rsai5(MS,SKR,prepak); - } - - role BS - { - var msrand, said: Nonce; - fresh prepak, bsrand: Nonce; - - recv_rsa1(MS,BS, {msrand, said, MS}sk(MS) ); - send_rsa2(BS,MS, {msrand, bsrand,{prepak,MS}pk(MS),BS}sk(BS) ); - recv_rsa3(MS,BS, {bsrand}sk(MS) ); - - claim_rsar3(BS,Niagree); - claim_rsar4(BS,Nisynch); - claim_rsar5(BS,SKR,prepak); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2rsacorrected.spdl b/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2rsacorrected.spdl deleted file mode 100644 index 4bd5205..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2rsacorrected.spdl +++ /dev/null @@ -1,46 +0,0 @@ -/* - * PKMv2-RSA - * - * Initial model by: Sjouke Mauw, Sasa Radomirovic (2007) - * Model changes: Cas Cremers (Nov 2012) - * - * Analysed in: "A framework for compositional verification of security protocols" - * With S. Andova, K. Gjosteen, S. Mauw, S. Mjolsnes, and S. Radomirovic. - * Information and Computation, Special issue on Computer Security: - * Foundations and Automated Reasoning, Volume 206, Issues 2-4, pp. 425-459, - * Elsevier, 2008. - */ - -// The protocol description - -protocol pkmv2rsa(MS,BS) -{ - role MS - { - fresh msrand, said: Nonce; - var prepak, bsrand: Nonce; - - send_rsa1(MS,BS, {msrand, said, MS}sk(MS) ); - recv_rsa2(BS,MS, {msrand, bsrand,{prepak,MS}pk(MS),BS}sk(BS) ); - send_rsa3(MS,BS, {bsrand,BS}sk(MS) ); - - claim_rsai3(MS,Niagree); - claim_rsai4(MS,Nisynch); - claim_rsai5(MS,SKR,prepak); - } - - role BS - { - var msrand, said: Nonce; - fresh prepak, bsrand: Nonce; - - recv_rsa1(MS,BS, {msrand, said, MS}sk(MS) ); - send_rsa2(BS,MS, {msrand, bsrand,{prepak,MS}pk(MS),BS}sk(BS) ); - recv_rsa3(MS,BS, {bsrand,BS}sk(MS) ); - - claim_rsar3(BS,Niagree); - claim_rsar4(BS,Nisynch); - claim_rsar5(BS,SKR,prepak); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2satek.spdl b/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2satek.spdl deleted file mode 100644 index b166a1b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pkmv2satek.spdl +++ /dev/null @@ -1,63 +0,0 @@ -/* - * PKMv2-SA-TEK - * - * Initial model by: Sjouke Mauw, Sasa Radomirovic (2007) - * Model changes: Cas Cremers (Nov 2012) - * - * Analysed in: "A framework for compositional verification of security protocols" - * With S. Andova, K. Gjosteen, S. Mauw, S. Mjolsnes, and S. Radomirovic. - * Information and Computation, Special issue on Computer Security: - * Foundations and Automated Reasoning, Volume 206, Issues 2-4, pp. 425-459, - * Elsevier, 2008. - */ - -// Setup - -hashfunction hash; -hashfunction prepak; -const akid; -const u,d; - -// The protocol description - -protocol pkmv2satek(MS,BS) -{ - role MS - { - fresh msrand': Nonce; - var bsrand', tek0, tek1: Nonce; - - recv_satek1(BS,MS, bsrand',akid, - hash(d,prepak(MS,BS),BS,MS,bsrand',akid) ); - send_satek2(MS,BS, msrand',bsrand',akid, - hash(u,prepak(MS,BS),BS,MS,msrand',bsrand',akid) ); - recv_satek3(BS,MS, - msrand',bsrand',akid,{tek0,tek1}hash(prepak(MS,BS)), - hash(d,prepak(MS,BS),msrand',bsrand',akid,{tek0,tek1}hash(prepak(MS,BS)))); - - claim_rsai3(MS,Niagree); - claim_rsai4(MS,Nisynch); - claim_rsai6(MS,SKR,tek0); - claim_rsai7(MS,SKR,tek1); - } - - role BS - { - var msrand': Nonce; - fresh bsrand', tek0, tek1: Nonce; - - send_satek1(BS,MS, bsrand',akid, - hash(d,prepak(MS,BS),BS,MS,bsrand',akid) ); - recv_satek2(MS,BS, msrand',bsrand',akid, - hash(u,prepak(MS,BS),BS,MS,msrand',bsrand',akid) ); - send_satek3(BS,MS, - msrand',bsrand',akid,{tek0,tek1}hash(prepak(MS,BS)), - hash(d,prepak(MS,BS),msrand',bsrand',akid,{tek0,tek1}hash(prepak(MS,BS)))); - - claim_rsar3(BS,Niagree); - claim_rsar4(BS,Nisynch); - claim_rsar6(BS,SKR,tek0); - claim_rsar7(BS,SKR,tek1); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pqr.spdl b/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pqr.spdl deleted file mode 100644 index 731d369..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/pqr.spdl +++ /dev/null @@ -1,84 +0,0 @@ -/* - * PKMv2-RSA - * - * Initial model by: Sjouke Mauw, Sasa Radomirovic (2007) - * Model changes: Cas Cremers (Nov 2012) - * - * Analysed in: "A framework for compositional verification of security protocols" - * With S. Andova, K. Gjosteen, S. Mauw, S. Mjolsnes, and S. Radomirovic. - * Information and Computation, Special issue on Computer Security: - * Foundations and Automated Reasoning, Volume 206, Issues 2-4, pp. 425-459, - * Elsevier, 2008. - */ - -// Setup - -hashfunction hash; -hashfunction prepak; -const akid; -const u,d; - -// The protocol description - -protocol rsaplussatek(MS,BS) - -{ - role MS - { - fresh msrand, msrand', said, c: Nonce; - var prepak, bsrand, bsrand', tek0, tek1, tek2, tek3: Nonce; - - send_rsa1(MS,BS, {msrand, said, MS}sk(MS) ); - recv_rsa2(BS,MS, {msrand, bsrand,{prepak,MS}pk(MS),BS}sk(BS) ); - send_rsa3(MS,BS, {bsrand, BS}sk(MS) ); - - recv_satek1(BS,MS, bsrand',akid, - hash(d,prepak,BS,MS,bsrand',akid) ); - send_satek2(MS,BS, msrand',bsrand',akid, - hash(u,prepak,BS,MS,msrand',bsrand',akid) ); - recv_satek3(BS,MS, - msrand',bsrand',akid,{tek0,tek1}hash(prepak), - hash(d,prepak,msrand',bsrand',akid,{tek0,tek1}hash(prepak))); - - send_tekup1(MS,BS,{c}hash(prepak)); - recv_tekup2(BS,MS,{c,tek2,tek3}hash(prepak)); - - claim_rsai3(MS,Niagree); - claim_rsai4(MS,Nisynch); - claim_rsai5(MS,SKR,prepak); - claim_rsai6(MS,SKR,tek0); - claim_rsai7(MS,SKR,tek1); - claim_rsar8(MS,SKR,tek2); - claim_rsar9(MS,SKR,tek3); - } - - role BS - { - var msrand, msrand', said, c: Nonce; - fresh prepak, bsrand, bsrand', tek0, tek1, tek2, tek3: Nonce; - - recv_rsa1(MS,BS, {msrand, said, MS}sk(MS) ); - send_rsa2(BS,MS, {msrand, bsrand,{prepak,MS}pk(MS),BS}sk(BS) ); - recv_rsa3(MS,BS, {bsrand, BS}sk(MS) ); - - send_satek1(BS,MS, bsrand',akid, - hash(d,prepak,BS,MS,bsrand',akid) ); - recv_satek2(MS,BS, msrand',bsrand',akid, - hash(u,prepak,BS,MS,msrand',bsrand',akid) ); - send_satek3(BS,MS, - msrand',bsrand',akid,{tek0,tek1}hash(prepak), - hash(d,prepak,msrand',bsrand',akid,{tek0,tek1}hash(prepak))); - - recv_tekup1(MS,BS,{c}hash(prepak)); - send_tekup2(BS,MS,{c,tek2,tek3}hash(prepak)); - - claim_rsar3(BS,Niagree); - claim_rsar4(BS,Nisynch); - claim_rsar5(BS,SKR,prepak); - claim_rsar6(BS,SKR,tek0); - claim_rsar7(BS,SKR,tek1); - claim_rsar8(BS,SKR,tek2); - claim_rsar9(BS,SKR,tek3); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/rsaplussatek.spdl b/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/rsaplussatek.spdl deleted file mode 100644 index eb15dde..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/rsaplussatek.spdl +++ /dev/null @@ -1,74 +0,0 @@ -/* - * PKMv2-RSA - * - * Initial model by: Sjouke Mauw, Sasa Radomirovic (2007) - * Model changes: Cas Cremers (Nov 2012) - * - * Analysed in: "A framework for compositional verification of security protocols" - * With S. Andova, K. Gjosteen, S. Mauw, S. Mjolsnes, and S. Radomirovic. - * Information and Computation, Special issue on Computer Security: - * Foundations and Automated Reasoning, Volume 206, Issues 2-4, pp. 425-459, - * Elsevier, 2008. - */ - -// Setup - -hashfunction hash; -hashfunction prepak; -const akid; -const u,d; - -// The protocol description - -protocol rsaplussatek(MS,BS) - -{ - role MS - { - fresh msrand, msrand', said: Nonce; - var prepak, bsrand, bsrand', tek0, tek1: Nonce; - - send_rsa1(MS,BS, {msrand, said, MS}sk(MS) ); - recv_rsa2(BS,MS, {msrand, bsrand,{prepak,MS}pk(MS),BS}sk(BS) ); - send_rsa3(MS,BS, {bsrand}sk(MS) ); - - recv_satek1(BS,MS, bsrand',akid, - hash(d,prepak,BS,MS,bsrand',akid) ); - send_satek2(MS,BS, msrand',bsrand',akid, - hash(u,prepak,BS,MS,msrand',bsrand',akid) ); - recv_satek3(BS,MS, - msrand',bsrand',akid,{tek0,tek1}hash(prepak), - hash(d,prepak,msrand',bsrand',akid,{tek0,tek1}hash(prepak))); - - claim_rsai3(MS,Niagree); - claim_rsai4(MS,Nisynch); -// claim_rsai5(MS,SKR,prepak); -// claim_rsai6(MS,SKR,tek0); -// claim_rsai7(MS,SKR,tek1); - } - - role BS - { - var msrand, msrand', said: Nonce; - fresh prepak, bsrand, bsrand', tek0, tek1: Nonce; - - recv_rsa1(MS,BS, {msrand, said, MS}sk(MS) ); - send_rsa2(BS,MS, {msrand, bsrand,{prepak,MS}pk(MS),BS}sk(BS) ); - recv_rsa3(MS,BS, {bsrand}sk(MS) ); - - send_satek1(BS,MS, bsrand',akid, - hash(d,prepak,BS,MS,bsrand',akid) ); - recv_satek2(MS,BS, msrand',bsrand',akid, - hash(u,prepak,BS,MS,msrand',bsrand',akid) ); - send_satek3(BS,MS, - msrand',bsrand',akid,{tek0,tek1}hash(prepak), - hash(d,prepak,msrand',bsrand',akid,{tek0,tek1}hash(prepak))); - - claim_rsar3(BS,Niagree); - claim_rsar4(BS,Nisynch); -// claim_rsar5(BS,SKR,prepak); -// claim_rsar6(BS,SKR,tek0); -// claim_rsar7(BS,SKR,tek1); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/rsaplussatekcorrected.spdl b/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/rsaplussatekcorrected.spdl deleted file mode 100644 index b8051d8..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IEEE-WIMAX/rsaplussatekcorrected.spdl +++ /dev/null @@ -1,73 +0,0 @@ -/* - * PKMv2-RSA - * - * Initial model by: Sjouke Mauw, Sasa Radomirovic (2007) - * Model changes: Cas Cremers (Nov 2012) - * - * Analysed in: "A framework for compositional verification of security protocols" - * With S. Andova, K. Gjosteen, S. Mauw, S. Mjolsnes, and S. Radomirovic. - * Information and Computation, Special issue on Computer Security: - * Foundations and Automated Reasoning, Volume 206, Issues 2-4, pp. 425-459, - * Elsevier, 2008. - */ - -// Setup - -hashfunction hash; -hashfunction prepak; -const akid; -const u,d; - -// The protocol description - -protocol rsaplussatek(MS,BS) - -{ - role MS - { - fresh msrand, msrand', said: Nonce; - var prepak, bsrand, bsrand', tek0, tek1: Nonce; - - send_rsa1(MS,BS, {msrand, said, MS}sk(MS) ); - recv_rsa2(BS,MS, {msrand, bsrand,{prepak,MS}pk(MS),BS}sk(BS) ); - send_rsa3(MS,BS, {bsrand, BS}sk(MS) ); - - recv_satek1(BS,MS, bsrand',akid, - hash(d,prepak,BS,MS,bsrand',akid) ); - send_satek2(MS,BS, msrand',bsrand',akid, - hash(u,prepak,BS,MS,msrand',bsrand',akid) ); - recv_satek3(BS,MS, - msrand',bsrand',akid,{tek0,tek1}hash(prepak), - hash(d,prepak,msrand',bsrand',akid,{tek0,tek1}hash(prepak))); - - claim_rsai3(MS,Niagree); - claim_rsai4(MS,Nisynch); - claim_rsai5(MS,SKR,prepak); - claim_rsai6(MS,SKR,tek0); - claim_rsai7(MS,SKR,tek1); - } - - role BS - { - var msrand, msrand', said: Nonce; - fresh prepak, bsrand, bsrand', tek0, tek1: Nonce; - - recv_rsa1(MS,BS, {msrand, said, MS}sk(MS) ); - send_rsa2(BS,MS, {msrand, bsrand,{prepak,MS}pk(MS),BS}sk(BS) ); - recv_rsa3(MS,BS, {bsrand, BS}sk(MS) ); - - send_satek1(BS,MS, bsrand',akid, - hash(d,prepak,BS,MS,bsrand',akid) ); - recv_satek2(MS,BS, msrand',bsrand',akid, - hash(u,prepak,BS,MS,msrand',bsrand',akid) ); - send_satek3(BS,MS, - msrand',bsrand',akid,{tek0,tek1}hash(prepak), - hash(d,prepak,msrand',bsrand',akid,{tek0,tek1}hash(prepak))); - - claim_rsar3(BS,Niagree); - claim_rsar4(BS,Nisynch); - claim_rsar5(BS,SKR,prepak); - claim_rsar6(BS,SKR,tek0); - claim_rsar7(BS,SKR,tek1); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/Makefile b/Vagrant Files/shared/scyther/Protocols/IKE/Makefile deleted file mode 100644 index 7234a64..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -CPPSRC= $(wildcard *.cpp) -DEST= $(CPPSRC:.cpp=.spdl) - -default: $(DEST) - -%.spdl: %.cpp - cpp $< >$@ - -mpa: $(DEST) make-mpa.py - ./make-mpa.py - diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/common.h b/Vagrant Files/shared/scyther/Protocols/IKE/common.h deleted file mode 100644 index 6dcb5d2..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/common.h +++ /dev/null @@ -1,157 +0,0 @@ -/**************************************************************************** - * 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__ \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a1.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a1.cpp deleted file mode 100644 index 86947a8..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a1.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a1.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a1.spdl deleted file mode 100644 index b9b8f00..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a1.spdl +++ /dev/null @@ -1,129 +0,0 @@ -# 1 "ikev1-pk-a1.cpp" -# 1 "<command-line>" -# 1 "ikev1-pk-a1.cpp" -# 17 "ikev1-pk-a1.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 18 "ikev1-pk-a1.cpp" 2 -# 27 "ikev1-pk-a1.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R) ); - send_!O2( O, O, prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R) ); - - - recv_!O3( O, O, prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I) ); - send_!O4( O, O, prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I) ); - - } - - -} - - -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), prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R) ); - claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr ); - send_!3( I, R, Ci, Cr, prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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), prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R) ); - recv_!3( I, R, Ci, Cr, prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a12.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a12.cpp deleted file mode 100644 index 435479a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a12.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a12.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a12.spdl deleted file mode 100644 index 473ffc7..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a12.spdl +++ /dev/null @@ -1,128 +0,0 @@ -# 1 "ikev1-pk-a12.cpp" -# 1 "<command-line>" -# 1 "ikev1-pk-a12.cpp" -# 17 "ikev1-pk-a12.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 18 "ikev1-pk-a12.cpp" 2 -# 27 "ikev1-pk-a12.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R) ); - send_!O2( O, O, prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R) ); - - - recv_!O3( O, O, {prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!O4( O, O, {prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} - -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), prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R) ); - claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr ); - send_!3( I, R, Ci, Cr, {prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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), prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R) ); - recv_!3( I, R, Ci, Cr, {prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a2.cpp deleted file mode 100644 index b149cfe..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a2.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a2.spdl deleted file mode 100644 index 60b9fb4..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a2.spdl +++ /dev/null @@ -1,129 +0,0 @@ -# 1 "ikev1-pk-a2.cpp" -# 1 "<command-line>" -# 1 "ikev1-pk-a2.cpp" -# 18 "ikev1-pk-a2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 19 "ikev1-pk-a2.cpp" 2 -# 28 "ikev1-pk-a2.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R) ); - send_!O2( O, O, prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R) ); - - - recv_!O3( O, O, prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I) ); - send_!O4( O, O, prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I) ); - - } - - -} - - -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), prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R) ); - claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr ); - send_!3( I, R, Ci, Cr, prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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), prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R) ); - recv_!3( I, R, Ci, Cr, prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a22.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a22.cpp deleted file mode 100644 index a71e20a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a22.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a22.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a22.spdl deleted file mode 100644 index 1c59323..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-a22.spdl +++ /dev/null @@ -1,128 +0,0 @@ -# 1 "ikev1-pk-a22.cpp" -# 1 "<command-line>" -# 1 "ikev1-pk-a22.cpp" -# 17 "ikev1-pk-a22.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 18 "ikev1-pk-a22.cpp" 2 -# 27 "ikev1-pk-a22.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R) ); - send_!O2( O, O, prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R) ); - - - recv_!O3( O, O, {prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!O4( O, O, {prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} - -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), prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R) ); - claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr ); - send_!3( I, R, Ci, Cr, {prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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), prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R) ); - recv_!3( I, R, Ci, Cr, {prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m.cpp deleted file mode 100644 index 1b27c5f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m.spdl deleted file mode 100644 index 8436133..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m.spdl +++ /dev/null @@ -1,136 +0,0 @@ -# 1 "ikev1-pk-m.cpp" -# 1 "<command-line>" -# 1 "ikev1-pk-m.cpp" -# 16 "ikev1-pk-m.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 17 "ikev1-pk-m.cpp" 2 -# 27 "ikev1-pk-m.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!O2( O, O, {prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - - recv_!O3( O, O, {prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - send_!O4( O, O, {prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - - } - - -} - - -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, {prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - recv_!6( R, I, Ci, Cr, {prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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, {prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr ); - send_!6( R, I, Ci, Cr, {prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m2.cpp deleted file mode 100644 index fc08ea0..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m2.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m2.spdl deleted file mode 100644 index b625de5..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk-m2.spdl +++ /dev/null @@ -1,135 +0,0 @@ -# 1 "ikev1-pk-m2.cpp" -# 1 "<command-line>" -# 1 "ikev1-pk-m2.cpp" -# 17 "ikev1-pk-m2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 18 "ikev1-pk-m2.cpp" 2 -# 27 "ikev1-pk-m2.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!O2( O, O, {prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - - recv_!O3( O, O, {prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - send_!O4( O, O, {prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - - } - - -} - -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, {prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - recv_!6( R, I, Ci, Cr, {prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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, {prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr ); - send_!6( R, I, Ci, Cr, {prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a.cpp deleted file mode 100644 index 9549e44..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a.spdl deleted file mode 100644 index 971122a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a.spdl +++ /dev/null @@ -1,129 +0,0 @@ -# 1 "ikev1-pk2-a.cpp" -# 1 "<command-line>" -# 1 "ikev1-pk2-a.cpp" -# 16 "ikev1-pk2-a.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 17 "ikev1-pk2-a.cpp" 2 -# 28 "ikev1-pk2-a.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R) ); - send_!O2( O, O, prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R) ); - - - recv_!O3( O, O, prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I) ); - send_!O4( O, O, prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I) ); - - } - - -} - - -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)}prf(Ni, Ci), {I}prf(Ni, Ci) ); - recv_!2( R, I, Ci, Cr, algo, {Nr}pk(I), {Gr}prf(Nr, Cr), {R}prf(Nr, Cr), prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R) ); - claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr ); - send_!3( I, R, Ci, Cr, prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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}prf(Ni, Ci), {I}prf(Ni, Ci) ); - claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr ); - send_!2( R, I, Ci, Cr, algo, {Nr}pk(I), {g(r)}prf(Nr, Cr), {R}prf(Nr, Cr), prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R) ); - recv_!3( I, R, Ci, Cr, prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a2.cpp deleted file mode 100644 index a8536fb..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a2.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a2.spdl deleted file mode 100644 index 51e0d17..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-a2.spdl +++ /dev/null @@ -1,128 +0,0 @@ -# 1 "ikev1-pk2-a2.cpp" -# 1 "<command-line>" -# 1 "ikev1-pk2-a2.cpp" -# 17 "ikev1-pk2-a2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 18 "ikev1-pk2-a2.cpp" 2 -# 29 "ikev1-pk2-a2.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R) ); - send_!O2( O, O, prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R) ); - - - recv_!O3( O, O, prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I) ); - send_!O4( O, O, prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I) ); - - } - - -} - -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}prf(Ni, Ci) ); - recv_!2( R, I, Ci, Cr, algo, {Nr}pk(I), {Gr,R}prf(Nr, Cr), prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R) ); - claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr ); - send_!3( I, R, Ci, Cr, prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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}prf(Ni, Ci) ); - claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr ); - send_!2( R, I, Ci, Cr, algo, {Nr}pk(I), {g(r),R}prf(Nr, Cr), prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R) ); - recv_!3( I, R, Ci, Cr, prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m.cpp deleted file mode 100644 index 42f2d9d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m.spdl deleted file mode 100644 index e32dd5b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m.spdl +++ /dev/null @@ -1,136 +0,0 @@ -# 1 "ikev1-pk2-m.cpp" -# 1 "<command-line>" -# 1 "ikev1-pk2-m.cpp" -# 16 "ikev1-pk2-m.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 17 "ikev1-pk2-m.cpp" 2 -# 28 "ikev1-pk2-m.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!O2( O, O, {prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - - recv_!O3( O, O, {prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - send_!O4( O, O, {prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - - } - - -} - - -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)}prf(Ni, Ci), {I}prf(Ni, Ci) ); - recv_4( R, I, Ci, Cr, {Nr}pk(I), {Gr}prf(Nr, Cr), {R}prf(Nr, Cr) ); - claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr ); - send_!5( I, R, Ci, Cr, {prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - recv_!6( R, I, Ci, Cr, {prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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}prf(Ni, Ci), {I}prf(Ni, Ci) ); - send_4( R, I, Ci, Cr, {Nr}pk(I), {g(r)}prf(Nr, Cr), {R}prf(Nr, Cr) ); - recv_!5( I, R, Ci, Cr, {prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr ); - send_!6( R, I, Ci, Cr, {prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m2.cpp deleted file mode 100644 index 653a839..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m2.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m2.spdl deleted file mode 100644 index 62e5b74..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-pk2-m2.spdl +++ /dev/null @@ -1,136 +0,0 @@ -# 1 "ikev1-pk2-m2.cpp" -# 1 "<command-line>" -# 1 "ikev1-pk2-m2.cpp" -# 17 "ikev1-pk2-m2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 18 "ikev1-pk2-m2.cpp" 2 -# 30 "ikev1-pk2-m2.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!O2( O, O, {prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - - recv_!O3( O, O, {prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - send_!O4( O, O, {prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - - } - - -} - - -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}prf(Ni, Ci) ); - recv_4( R, I, Ci, Cr, {Nr}pk(I), {Gr,R}prf(Nr, Cr) ); - claim( I, Running, R, g(i),Gr,Ci,Cr,Ni,Nr ); - send_!5( I, R, Ci, Cr, {prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - recv_!6( R, I, Ci, Cr, {prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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}prf(Ni, Ci) ); - send_4( R, I, Ci, Cr, {Nr}pk(I), {g(r),R}prf(Nr, Cr) ); - recv_!5( I, R, Ci, Cr, {prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - claim( R, Running, I, Gi,g(r),Ci,Cr,Ni,Nr ); - send_!6( R, I, Ci, Cr, {prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Gi,g(r),Ci,Cr,Ni,Nr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-a.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-a.cpp deleted file mode 100644 index bdd5b4c..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-a.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-a.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-a.spdl deleted file mode 100644 index 788dde0..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-a.spdl +++ /dev/null @@ -1,125 +0,0 @@ -# 1 "ikev1-psk-a.cpp" -# 1 "<command-line>" -# 1 "ikev1-psk-a.cpp" -# 16 "ikev1-psk-a.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - - - - var Ci, Cr: Nonce; - var I, R: Agent; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, prf(k(I,R), Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, prf(k(R,I), Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 17 "ikev1-psk-a.cpp" 2 -# 25 "ikev1-psk-a.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, prf(k(R,I), Ni, Nr, g(r), g(i), Cr, Ci, list, R) ); - send_!O2( O, O, prf(k(I,R), Ni, Nr, g(r), g(i), Cr, Ci, list, R) ); - - - recv_!O3( O, O, prf(k(I,R), Ni, Nr, g(i), g(r), Ci, Cr, list, I) ); - send_!O4( O, O, prf(k(R,I), Ni, Nr, g(i), g(r), Ci, Cr, list, I) ); - - } - - -} - - -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, prf(k(I,R), Ni, Nr, Gr, g(i), Cr, Ci, list, R) ); - claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr ); - send_!3( I, R, Ci, Cr, prf(k(I,R), Ni, Nr, g(i), Gr, Ci, Cr, list, I) ); - - - claim( I, SKR, prf(k(I,R), Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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, prf(k(R,I), Ni, Nr, g(r), Gi, Cr, Ci, list, R) ); - recv_!3( I, R, Ci, Cr, prf(k(R,I), Ni, Nr, Gi, g(r), Ci, Cr, list, I) ); - - - claim( R, SKR, prf(k(R,I), Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m-perlman.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m-perlman.cpp deleted file mode 100644 index 01640ad..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m-perlman.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m-perlman.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m-perlman.spdl deleted file mode 100644 index fa9436a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m-perlman.spdl +++ /dev/null @@ -1,131 +0,0 @@ -# 1 "ikev1-psk-m-perlman.cpp" -# 1 "<command-line>" -# 1 "ikev1-psk-m-perlman.cpp" -# 17 "ikev1-psk-m-perlman.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - - - - var Ci, Cr: Nonce; - var I, R: Agent; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, prf(k(I,R), Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, prf(k(R,I), Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 18 "ikev1-psk-m-perlman.cpp" 2 -# 26 "ikev1-psk-m-perlman.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {I, prf(k(I,R), Ni, Nr, g(i), g(r), Ci, Cr, list, I)}h(g(r),i) ); - send_!O2( O, O, {I, prf(k(R,I), Ni, Nr, g(i), g(r), Ci, Cr, list, I)}h(g(i),r) ); - - - recv_!O3( O, O, {R, prf(k(R,I), Ni, Nr, g(r), g(i), Cr, Ci, list, R)}h(g(i),r) ); - send_!O4( O, O, {R, prf(k(I,R), Ni, Nr, g(r), g(i), Cr, Ci, list, R)}h(g(r),i) ); - - } - - -} - - -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, prf(k(I,R), Ni, Nr, g(i), Gr, Ci, Cr, list, I)}h(Gr,i) ); - recv_!6( R, I, Ci, Cr, {R, prf(k(I,R), Ni, Nr, Gr, g(i), Cr, Ci, list, R)}h(Gr,i) ); - - - claim( I, SKR, prf(k(I,R), Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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, prf(k(R,I), Ni, Nr, Gi, g(r), Ci, Cr, list, I)}h(Gi,r) ); - claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr ); - send_!6( R, I, Ci, Cr, {R, prf(k(R,I), Ni, Nr, g(r), Gi, Cr, Ci, list, R)}h(Gi,r) ); - - - claim( R, SKR, prf(k(R,I), Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m.cpp deleted file mode 100644 index f203018..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m.spdl deleted file mode 100644 index ca7a688..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-psk-m.spdl +++ /dev/null @@ -1,130 +0,0 @@ -# 1 "ikev1-psk-m.cpp" -# 1 "<command-line>" -# 1 "ikev1-psk-m.cpp" -# 16 "ikev1-psk-m.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - - - - var Ci, Cr: Nonce; - var I, R: Agent; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, prf(k(I,R), Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, prf(k(R,I), Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 17 "ikev1-psk-m.cpp" 2 -# 26 "ikev1-psk-m.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {I, prf(k(I,R), Ni, Nr, g(i), g(r), Ci, Cr, list, I)}prf(k(I,R), Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!O2( O, O, {I, prf(k(R,I), Ni, Nr, g(i), g(r), Ci, Cr, list, I)}prf(k(R,I), Ni, Nr, h(g(i),r), Ci, Cr) ); - - - recv_!O3( O, O, {R, prf(k(R,I), Ni, Nr, g(r), g(i), Cr, Ci, list, R)}prf(k(R,I), Ni, Nr, h(g(i),r), Ci, Cr) ); - send_!O4( O, O, {R, prf(k(I,R), Ni, Nr, g(r), g(i), Cr, Ci, list, R)}prf(k(I,R), Ni, Nr, h(g(r),i), Ci, Cr) ); - - } - - -} - -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, prf(k(I,R), Ni, Nr, g(i), Gr, Ci, Cr, list, I)}prf(k(I,R), Ni, Nr, h(Gr,i), Ci, Cr) ); - recv_!6( R, I, Ci, Cr, {R, prf(k(I,R), Ni, Nr, Gr, g(i), Cr, Ci, list, R)}prf(k(I,R), Ni, Nr, h(Gr,i), Ci, Cr) ); - - - claim( I, SKR, prf(k(I,R), Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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, prf(k(R,I), Ni, Nr, Gi, g(r), Ci, Cr, list, I)}prf(k(R,I), Ni, Nr, h(Gi,r), Ci, Cr) ); - claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr ); - send_!6( R, I, Ci, Cr, {R, prf(k(R,I), Ni, Nr, g(r), Gi, Cr, Ci, list, R)}prf(k(R,I), Ni, Nr, h(Gi,r), Ci, Cr) ); - - - claim( R, SKR, prf(k(R,I), Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-noid.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-noid.cpp deleted file mode 100644 index f6f5712..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-noid.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/********************************************************************** - * @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 diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-noid.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-noid.spdl deleted file mode 100644 index 03e9c05..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-noid.spdl +++ /dev/null @@ -1,124 +0,0 @@ -# 1 "ikev1-quick-noid.cpp" -# 1 "<command-line>" -# 1 "ikev1-quick-noid.cpp" -# 16 "ikev1-quick-noid.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 126 "common.h" - var I, R: Agent; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(k(I,R),h(g(r),i),Ni,Nr) ); - send_!SWAP2( SWAP, SWAP, KDF(k(R,I),h(g(i),r),Ni,Nr) ); - - } - - -} -# 17 "ikev1-quick-noid.cpp" 2 -# 27 "ikev1-quick-noid.cpp" -usertype String; -const list, algo: String; - - - - - - -protocol @executability(O) { - - - role O { - var mid, i, r, Ni, Nr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {prf(k(I,R), mid, list, Ni, g(i)), list, Ni, g(i)}k(I,R) ); - send_!O2( O, O, {prf(k(R,I), mid, list, Ni, g(i)), list, Ni, g(i)}k(R,I) ); - - - recv_!O3( O, O, {prf(k(R,I), mid, Ni, algo, Nr, g(r)), algo, Nr, g(r)}k(R,I) ); - send_!O4( O, O, {prf(k(I,R), mid, Ni, algo, Nr, g(r)), algo, Nr, g(r)}k(I,R) ); - - - recv_!O5( O, O, {prf(k(I,R), mid, Ni, Nr)}k(I,R) ); - send_!O6( O, O, {prf(k(R,I), mid, Ni, Nr)}k(R,I) ); - - } - - -} - - -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, {prf(k(I,R), mid, list, Ni, g(i)), list, Ni, g(i)}k(I,R) ); - recv_!2( R, I, mid, {prf(k(I,R), mid, Ni, algo, Nr, Gr), algo, Nr, Gr}k(I,R) ); - claim( I, Running, R, Ni, Nr, g(i), Gr ); - send_!3( I, R, mid, {prf(k(I,R), mid, Ni, Nr)}k(I,R) ); - - - claim( I, SKR, KDF(k(I,R),h(Gr,i),Ni,Nr) ); - - 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, {prf(k(R,I), mid, list, Ni, Gi), list, Ni, Gi}k(R,I) ); - claim( R, Running, I, Ni, Nr, Gi, g(r) ); - send_!2( R, I, mid, {prf(k(R,I), mid, Ni, algo, Nr, g(r)), algo, Nr, g(r)}k(R,I) ); - recv_!3( I, R, mid, {prf(k(R,I), mid, Ni, Nr)}k(R,I) ); - - - - claim( R, SKR, KDF(k(R,I),h(Gi,r),Ni,Nr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr, Gi, g(r) ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-nopfs.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-nopfs.cpp deleted file mode 100644 index 38a1fc4..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-nopfs.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/********************************************************************** - * @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 diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-nopfs.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-nopfs.spdl deleted file mode 100644 index c7d2f99..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick-nopfs.spdl +++ /dev/null @@ -1,118 +0,0 @@ -# 1 "ikev1-quick-nopfs.cpp" -# 1 "<command-line>" -# 1 "ikev1-quick-nopfs.cpp" -# 16 "ikev1-quick-nopfs.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 129 "common.h" - var I, R: Agent; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(k(I,R),Ni,Nr) ); - send_!SWAP2( SWAP, SWAP, KDF(k(R,I),Ni,Nr) ); - - } - - -} -# 17 "ikev1-quick-nopfs.cpp" 2 -# 27 "ikev1-quick-nopfs.cpp" -usertype String; -const list, algo: String; - - - - - - -protocol @executability(O) { - role O { - var mid, Ni, Nr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {prf(k(I,R), mid, list, Ni), list, Ni}k(I,R) ); - send_!O2( O, O, {prf(k(R,I), mid, list, Ni), list, Ni}k(R,I) ); - - - recv_!O3( O, O, {prf(k(R,I), mid, Ni, algo, Nr), algo, Nr}k(R,I) ); - send_!O4( O, O, {prf(k(I,R), mid, Ni, algo, Nr), algo, Nr}k(I,R) ); - - - recv_!O5( O, O, {prf(k(I,R), mid, Ni, Nr)}k(I,R) ); - send_!O6( O, O, {prf(k(R,I), mid, Ni, Nr)}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, {prf(k(I,R), mid, list, Ni), list, Ni}k(I,R) ); - recv_!2( R, I, mid, {prf(k(I,R), mid, Ni, algo, Nr), algo, Nr}k(I,R) ); - claim( I, Running, R, Ni, Nr ); - send_!3( I, R, mid, {prf(k(I,R), mid, Ni, Nr)}k(I,R) ); - - - claim( I, SKR, KDF(k(I,R),Ni,Nr) ); - - 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, {prf(k(R,I), mid, list, Ni), list, Ni}k(R,I) ); - claim( R, Running, I, Ni, Nr ); - send_!2( R, I, mid, {prf(k(R,I), mid, Ni, algo, Nr), algo, Nr}k(R,I) ); - recv_!3( I, R, mid, {prf(k(R,I), mid, Ni, Nr)}k(R,I) ); - - - - claim( R, SKR, KDF(k(R,I),Ni,Nr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick.cpp deleted file mode 100644 index 60e9fcc..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/********************************************************************** - * @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 diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick.spdl deleted file mode 100644 index 6a723c7..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-quick.spdl +++ /dev/null @@ -1,91 +0,0 @@ -# 1 "ikev1-quick.cpp" -# 1 "<command-line>" -# 1 "ikev1-quick.cpp" -# 16 "ikev1-quick.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 126 "common.h" - var I, R: Agent; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(k(I,R),h(g(r),i),Ni,Nr) ); - send_!SWAP2( SWAP, SWAP, KDF(k(R,I),h(g(i),r),Ni,Nr) ); - - } - - -} -# 17 "ikev1-quick.cpp" 2 -# 28 "ikev1-quick.cpp" -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, {prf(k(I,R), mid, list, Ni, g(i), I, R), list, Ni, g(i), I, R}k(I,R) ); - recv_!2( R, I, mid, {prf(k(I,R), mid, Ni, algo, Nr, Gr, I, R), algo, Nr, Gr, I, R}k(I,R) ); - claim( I, Running, R, Ni, Nr, g(i), Gr ); - send_!3( I, R, mid, {prf(k(I,R), mid, Ni, Nr)}k(I,R) ); - - - claim( I, SKR, KDF(k(I,R),h(Gr,i),Ni,Nr) ); - - 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, {prf(k(R,I), mid, list, Ni, Gi, I, R), list, Ni, Gi, I, R}k(I,R) ); - claim( R, Running, I, Ni, Nr, Gi, g(r) ); - send_!2( R, I, mid, {prf(k(R,I), mid, Ni, algo, Nr, g(r), I, R), algo, Nr, g(r), I, R}k(I,R) ); - recv_!3( I, R, mid, {prf(k(R,I), mid, Ni, Nr)}k(I,R) ); - - - - claim( R, SKR, KDF(k(R,I),h(Gi,r),Ni,Nr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr, Gi, g(r) ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman1.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman1.cpp deleted file mode 100644 index ddebfcb..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman1.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/*********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman1.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman1.spdl deleted file mode 100644 index f758a99..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman1.spdl +++ /dev/null @@ -1,130 +0,0 @@ -# 1 "ikev1-sig-a-perlman1.cpp" -# 1 "<command-line>" -# 1 "ikev1-sig-a-perlman1.cpp" -# 18 "ikev1-sig-a-perlman1.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 19 "ikev1-sig-a-perlman1.cpp" 2 -# 29 "ikev1-sig-a-perlman1.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {R}KDF(Ni, Nr, h(g(i),r), Ci, Cr), {prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R)}sk(R) ); - send_!O2( O, O, {R}KDF(Ni, Nr, h(g(r),i), Ci, Cr), {prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R)}sk(R) ); - - - recv_!O3( O, O, {I}KDF(Ni, Nr, h(g(r),i), Ci, Cr), {prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}sk(I) ); - send_!O4( O, O, {I}KDF(Ni, Nr, h(g(i),r), Ci, Cr), {prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}sk(I) ); - - } - - -} - - -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, (Ci,Cr), algo, Gr, Nr, {R}KDF(Ni, Nr, h(Gr,i), Ci, Cr), {prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R)}sk(R) ); - claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr ); - send_!3( I, R, (Ci,Cr), {I}KDF(Ni, Nr, h(Gr,i), Ci, Cr), {prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}sk(I) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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, (Ci,Cr), algo, g(r), Nr, R, {R}KDF(Ni, Nr, h(Gi,r), Ci, Cr), {prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R)}sk(R) ); - recv_!3( I, R, (Ci,Cr), {I}KDF(Ni, Nr, h(Gi,r), Ci, Cr), {prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}sk(I) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman2.cpp deleted file mode 100644 index e39a7b9..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman2.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman2.spdl deleted file mode 100644 index c2edf7d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a-perlman2.spdl +++ /dev/null @@ -1,130 +0,0 @@ -# 1 "ikev1-sig-a-perlman2.cpp" -# 1 "<command-line>" -# 1 "ikev1-sig-a-perlman2.cpp" -# 18 "ikev1-sig-a-perlman2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 19 "ikev1-sig-a-perlman2.cpp" 2 -# 29 "ikev1-sig-a-perlman2.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {R}KDF(Ni, Nr, h(g(i),r), Ci, Cr), {prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R)}sk(R) ); - send_!O2( O, O, {R}KDF(Ni, Nr, h(g(r),i), Ci, Cr), {prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R)}sk(R) ); - - - recv_!O3( O, O, {I, {prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!O4( O, O, {I, {prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} - - -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, (Ci,Cr), algo, Gr, Nr, {R}KDF(Ni, Nr, h(Gr,i), Ci, Cr), {prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R)}sk(R) ); - claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr ); - send_!3( I, R, (Ci,Cr), {I, {prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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, (Ci,Cr), algo, g(r), Nr, R, {R}KDF(Ni, Nr, h(Gi,r), Ci, Cr), {prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R)}sk(R) ); - recv_!3( I, R, (Ci,Cr), {I, {prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a1.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a1.cpp deleted file mode 100644 index 418492e..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a1.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a1.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a1.spdl deleted file mode 100644 index 327c4fe..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a1.spdl +++ /dev/null @@ -1,130 +0,0 @@ -# 1 "ikev1-sig-a1.cpp" -# 1 "<command-line>" -# 1 "ikev1-sig-a1.cpp" -# 17 "ikev1-sig-a1.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 18 "ikev1-sig-a1.cpp" 2 -# 28 "ikev1-sig-a1.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R)}sk(R) ); - send_!O2( O, O, {prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R)}sk(R) ); - - - recv_!O3( O, O, {prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}sk(I) ); - send_!O4( O, O, {prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}sk(I) ); - - } - - -} - - -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, (Ci,Cr), algo, Gr, Nr, R, {prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R)}sk(R) ); - claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr ); - send_!3( I, R, (Ci,Cr), {prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}sk(I) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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, {prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R)}sk(R) ); - recv_!3( I, R, (Ci,Cr), {prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}sk(I) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a2.cpp deleted file mode 100644 index 1c81dab..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a2.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a2.spdl deleted file mode 100644 index b0e6e07..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-a2.spdl +++ /dev/null @@ -1,130 +0,0 @@ -# 1 "ikev1-sig-a2.cpp" -# 1 "<command-line>" -# 1 "ikev1-sig-a2.cpp" -# 17 "ikev1-sig-a2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 18 "ikev1-sig-a2.cpp" 2 -# 29 "ikev1-sig-a2.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R)}sk(R) ); - send_!O2( O, O, {prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R)}sk(R) ); - - - recv_!O3( O, O, {{prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!O4( O, O, {{prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} - - -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, (Ci,Cr), algo, Gr, Nr, R, {prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R)}sk(R) ); - claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr ); - send_!3( I, R, (Ci,Cr), {{prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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, {prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R)}sk(R) ); - recv_!3( I, R, (Ci,Cr), {{prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m-perlman.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m-perlman.cpp deleted file mode 100644 index 4129ae2..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m-perlman.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m-perlman.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m-perlman.spdl deleted file mode 100644 index 321fc1b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m-perlman.spdl +++ /dev/null @@ -1,133 +0,0 @@ -# 1 "ikev1-sig-m-perlman.cpp" -# 1 "<command-line>" -# 1 "ikev1-sig-m-perlman.cpp" -# 17 "ikev1-sig-m-perlman.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 18 "ikev1-sig-m-perlman.cpp" 2 -# 27 "ikev1-sig-m-perlman.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {R, {prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R)}sk(R)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - send_!O2( O, O, {R, {prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R)}sk(R)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - - - recv_!O3( O, O, {I, {prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!O4( O, O, {I, {prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} - - -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, {prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R)}sk(R)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - claim( I, Running, R, Ni, Nr, g(i), Gr, Ci, Cr ); - send_!5( I, R, Ci, Cr, {I, {prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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, {prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R)}sk(R)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - recv_!5( I, R, Ci, Cr, {I, {prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m.cpp deleted file mode 100644 index f24b78f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m.spdl deleted file mode 100644 index 28150b0..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev1-sig-m.spdl +++ /dev/null @@ -1,134 +0,0 @@ -# 1 "ikev1-sig-m.cpp" -# 1 "<command-line>" -# 1 "ikev1-sig-m.cpp" -# 16 "ikev1-sig-m.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; - - - - - - - -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; - - - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 17 "ikev1-sig-m.cpp" 2 -# 28 "ikev1-sig-m.cpp" -usertype String; -const list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {I, {prf(Ni, Nr, h(g(r),i), g(i), g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!O2( O, O, {I, {prf(Ni, Nr, h(g(i),r), g(i), g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - - recv_!O3( O, O, {R, {prf(Ni, Nr, h(g(i),r), g(r), g(i), Cr, Ci, list, R)}sk(R)}KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - send_!O4( O, O, {R, {prf(Ni, Nr, h(g(r),i), g(r), g(i), Cr, Ci, list, R)}sk(R)}KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - - } - - -} - -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, (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, {prf(Ni, Nr, h(Gr,i), g(i), Gr, Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - recv_!6( R, I, (Ci,Cr), {R, {prf(Ni, Nr, h(Gr,i), Gr, g(i), Cr, Ci, list, R)}sk(R)}KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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, {prf(Ni, Nr, h(Gi,r), Gi, g(r), Ci, Cr, list, I)}sk(I)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - claim( R, Running, I, Ni, Nr, Gi, g(r), Ci, Cr ); - send_!6( R, I, (Ci,Cr), {R, {prf(Ni, Nr, h(Gi,r), g(r), Gi, Cr, Ci, list, R)}sk(R)}KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni, Nr, Gi, g(r), Ci, Cr ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child-nopfs.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child-nopfs.cpp deleted file mode 100644 index 9607308..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child-nopfs.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/********************************************************************** - * @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 ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child-nopfs.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child-nopfs.spdl deleted file mode 100644 index d163151..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child-nopfs.spdl +++ /dev/null @@ -1,112 +0,0 @@ -# 1 "ikev2-child-nopfs.cpp" -# 1 "<command-line>" -# 1 "ikev2-child-nopfs.cpp" -# 15 "ikev2-child-nopfs.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 138 "common.h" - var I, R: Agent; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(k(I,R),Ni,Nr) ); - send_!SWAP2( SWAP, SWAP, KDF(k(R,I),Ni,Nr) ); - - } - - -} -# 16 "ikev2-child-nopfs.cpp" 2 - - -const SA3: Nonce; - - - - - - -protocol @executability(O) { - role O { - var Ni, Nr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {SA3, Ni}k(I,R) ); - send_!O2( O, O, {SA3, Ni}k(R,I) ); - - - 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; - - - claim( I, Running, R,Ni ); - send_!1( I, R, {SA3, Ni}k(I,R) ); - recv_!2( R, I, {SA3, Nr}k(I,R) ); - - - claim( I, SKR, KDF(k(I,R),Ni,Nr) ); - - 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) ); - - - claim( R, SKR, KDF(k(R,I),Ni,Nr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I,Ni ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child.cpp deleted file mode 100644 index 2378231..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/********************************************************************** - * @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 ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child.spdl deleted file mode 100644 index 7c58959..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-child.spdl +++ /dev/null @@ -1,121 +0,0 @@ -# 1 "ikev2-child.cpp" -# 1 "<command-line>" -# 1 "ikev2-child.cpp" -# 15 "ikev2-child.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 135 "common.h" - var I, R: Agent; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(k(I,R),h(g(r),i),Ni,Nr) ); - send_!SWAP2( SWAP, SWAP, KDF(k(R,I),h(g(i),r),Ni,Nr) ); - - } - - -} -# 16 "ikev2-child.cpp" 2 - - - -usertype SecurityAssociation; -const SA1 ,SA2, SA3: SecurityAssociation; - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {SA3, Ni, g(i)}k(I,R) ); - send_!O2( O, O, {SA3, Ni, g(i)}k(R,I) ); - - - recv_!O3( O, O, {SA3, Nr, g(r)}k(R,I) ); - send_!O4( O, O, {SA3, Nr, g(r)}k(I,R) ); - - } - - -} - - - -protocol ikev2-child(I, R) -{ - - role I { - fresh i, Ni: Nonce; - var Nr: Nonce; - var Gr: Ticket; - - - 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) ); - - - claim( I, SKR, KDF(k(I,R),h(Gr,i),Ni,Nr) ); - - 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) ); - - - claim( R, SKR, KDF(k(R,I),h(Gi,r),Ni,Nr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I,Ni,Gi ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap.cpp deleted file mode 100644 index 7d8310b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap.spdl deleted file mode 100644 index 43ec49a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap.spdl +++ /dev/null @@ -1,160 +0,0 @@ -# 1 "ikev2-eap.cpp" -# 1 "<command-line>" -# 1 "ikev2-eap.cpp" -# 15 "ikev2-eap.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 16 "ikev2-eap.cpp" 2 -# 24 "ikev2-eap.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, r, Ni, Nr, SPIi, SPIr, EAP, EAPOK: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, R, SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, R, SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), EAP}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), EAP}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - - recv_!E5( E, E, {EAP}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E6( E, E, {EAP}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E7( E, E, {EAPOK}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E8( E, E, {EAPOK}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - - recv_!E9( E, E, {{SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)}sk(I)}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!EA( E, E, {{SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)}sk(I)}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - send_!EB( E, E, {{SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!EC( E, E, {{SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - } - - -} - - -protocol ikev2-eap(I, R) -{ - - role I { - fresh i, Ni, SPIi: Nonce; - var Nr, SPIr: Nonce; - var EAP, EAPOK: Nonce; - var Gr: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, (SPIi,SPIr), SA1, Gr, Nr ); - - - send_!3( I, R, (SPIi,SPIr), {I, R, SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), EAP}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - send_!5( I, R, (SPIi,SPIr), {EAP}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!6( R, I, (SPIi,SPIr), {EAPOK}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - claim( I, Running, R, Ni,g(i),Nr,Gr,TSi,TSr,EAP,EAPOK ); - send_!7( I, R, (SPIi,SPIr), {{SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)}sk(I)}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!8( R, I, (SPIi,SPIr), {{SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, (SPIi,SPIr), SA1, g(r), Nr ); - - - recv_!3( I, R, (SPIi,SPIr), {I, R, SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - send_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), EAP}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - recv_!5( I, R, (SPIi,SPIr), {EAP}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - send_!6( R, I, (SPIi,SPIr), {EAPOK}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - recv_!7( I, R, (SPIi,SPIr), {{SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)}sk(I)}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr,EAP,EAPOK ); - send_!8( R, I, (SPIi,SPIr), {{SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr,EAP,EAPOK ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap2.cpp deleted file mode 100644 index c56855a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap2.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/********************************************************************** - * @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 ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap2.spdl deleted file mode 100644 index 1fbb580..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-eap2.spdl +++ /dev/null @@ -1,160 +0,0 @@ -# 1 "ikev2-eap2.cpp" -# 1 "<command-line>" -# 1 "ikev2-eap2.cpp" -# 22 "ikev2-eap2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 23 "ikev2-eap2.cpp" 2 -# 31 "ikev2-eap2.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, r, Ni, Nr, SPIi, SPIr, EAP, EAPOK: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), EAP}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), EAP}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - - recv_!E5( E, E, {EAP}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E6( E, E, {EAP}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E7( E, E, {EAPOK}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E8( E, E, {EAPOK}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - - recv_!E9( E, E, {{SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)}sk(I)}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!EA( E, E, {{SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)}sk(I)}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - send_!EB( E, E, {{SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!EC( E, E, {{SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - } - - -} - - -protocol ikev2-eap2(I, R) -{ - - role I { - fresh i, Ni, SPIi: Nonce; - var Nr, SPIr: Nonce; - var EAP, EAPOK: Nonce; - var Gr: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, (SPIi,SPIr), SA1, Gr, Nr ); - - - send_!3( I, R, (SPIi,SPIr), {I, SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), EAP}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - send_!5( I, R, (SPIi,SPIr), {EAP}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!6( R, I, (SPIi,SPIr), {EAPOK}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - claim( I, Running, R, Ni,g(i),Nr,Gr,TSi,TSr,EAP,EAPOK ); - send_!7( I, R, (SPIi,SPIr), {{SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)}sk(I)}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!8( R, I, (SPIi,SPIr), {{SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, (SPIi,SPIr), SA1, g(r), Nr ); - - - recv_!3( I, R, (SPIi,SPIr), {I, SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - send_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), EAP}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - recv_!5( I, R, (SPIi,SPIr), {EAP}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - send_!6( R, I, (SPIi,SPIr), {EAPOK}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - recv_!7( I, R, (SPIi,SPIr), {{SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)}sk(I)}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr,EAP,EAPOK ); - send_!8( R, I, (SPIi,SPIr), {{SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr,EAP,EAPOK ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac.cpp deleted file mode 100644 index 832afae..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/********************************************************************** - * @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); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac.spdl deleted file mode 100644 index 608d314..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac.spdl +++ /dev/null @@ -1,133 +0,0 @@ -# 1 "ikev2-mac.cpp" -# 1 "<command-line>" -# 1 "ikev2-mac.cpp" -# 15 "ikev2-mac.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 16 "ikev2-mac.cpp" 2 -# 24 "ikev2-mac.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, r, Ni, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, R, MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, R, MAC(k(R,I), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, MAC(k(I,R), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - } - - -} - - -protocol ikev2-mac(I, R) -{ - - role I { - fresh i, Ni, SPIi: Nonce; - var Nr, SPIr: Nonce; - var Gr: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, (SPIi,SPIr), SA1, Gr, Nr ); - - - claim( I, Running, R, Ni,g(i),Nr,Gr,TSi,TSr); - send_!3( I, R, (SPIi,SPIr), {I, R, MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, (SPIi,SPIr), {R, MAC(k(I,R), SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, (SPIi,SPIr), SA1, g(r), Nr ); - - - recv_!3( I, R, (SPIi,SPIr), {I, R, MAC(k(R,I), SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr); - send_!4( R, I, (SPIi,SPIr), {R, MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac2.cpp deleted file mode 100644 index cb09faa..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac2.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/********************************************************************** - * @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 ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac2.spdl deleted file mode 100644 index f6d3385..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mac2.spdl +++ /dev/null @@ -1,133 +0,0 @@ -# 1 "ikev2-mac2.cpp" -# 1 "<command-line>" -# 1 "ikev2-mac2.cpp" -# 15 "ikev2-mac2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 16 "ikev2-mac2.cpp" 2 -# 24 "ikev2-mac2.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, r, Ni, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, MAC(k(R,I), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, MAC(k(I,R), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - } - - -} - - -protocol ikev2-mac2(I, R) -{ - - role I { - fresh i, Ni, SPIi: Nonce; - var Nr, SPIr: Nonce; - var Gr: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, (SPIi,SPIr), SA1, Gr, Nr ); - - - claim( I, Running, R, Ni,g(i),Nr,Gr,TSi,TSr ); - send_!3( I, R, (SPIi,SPIr), {I, MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, (SPIi,SPIr), {R, MAC(k(I,R), SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, (SPIi,SPIr), SA1, g(r), Nr ); - - - recv_!3( I, R, (SPIi,SPIr), {I, MAC(k(R,I), SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr ); - send_!4( R, I, (SPIi,SPIr), {R, MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig.cpp deleted file mode 100644 index 519f93a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/********************************************************************** - * @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 ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig.spdl deleted file mode 100644 index 388562e..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig.spdl +++ /dev/null @@ -1,132 +0,0 @@ -# 1 "ikev2-mactosig.cpp" -# 1 "<command-line>" -# 1 "ikev2-mactosig.cpp" -# 16 "ikev2-mactosig.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 17 "ikev2-mactosig.cpp" 2 -# 25 "ikev2-mactosig.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, r, Ni, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, R, MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, R, MAC(k(R,I), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - } - - -} - - -protocol ikev2-mactosig(I, R) -{ - role I { - fresh i, Ni, SPIi: Nonce; - var Nr, SPIr: Nonce; - var Gr: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, SPIi, SPIr, SA1, Gr, Nr ); - - - claim( I, Running, R,Ni,g(i),Nr,Gr,TSi,TSr ); - send_!3( I, R, SPIi, SPIr, {I, R, MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, SPIi, SPIr, {R, {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, SPIi, SPIr, SA1, g(r), Nr ); - - - recv_!3( I, R, SPIi, SPIr, {I, R, MAC(k(R,I), SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr ); - send_!4( R, I, SPIi, SPIr, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig2.cpp deleted file mode 100644 index 73b20f5..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig2.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/********************************************************************** - * @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 ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig2.spdl deleted file mode 100644 index 92864ab..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-mactosig2.spdl +++ /dev/null @@ -1,131 +0,0 @@ -# 1 "ikev2-mactosig2.cpp" -# 1 "<command-line>" -# 1 "ikev2-mactosig2.cpp" -# 16 "ikev2-mactosig2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 17 "ikev2-mactosig2.cpp" 2 -# 25 "ikev2-mactosig2.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, r, Ni, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, MAC(k(R,I), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - } - - -} - -protocol ikev2-mactosig2(I, R) -{ - role I { - fresh i, Ni, SPIi: Nonce; - var Nr, SPIr: Nonce; - var Gr: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, SPIi, SPIr, SA1, Gr, Nr ); - - - claim( I, Running, R,Ni,g(i),Nr,Gr,TSi,TSr ); - send_!3( I, R, SPIi, SPIr, {I, MAC(k(I,R), SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, SPIi, SPIr, {R, {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, SPIi, SPIr, SA1, g(r), Nr ); - - - recv_!3( I, R, SPIi, SPIr, {I, MAC(k(R,I), SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr ); - send_!4( R, I, SPIi, SPIr, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child-composed.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child-composed.cpp deleted file mode 100644 index 62ddf6f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child-composed.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/********************************************************************** - * @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) ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child-composed.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child-composed.spdl deleted file mode 100644 index 392c995..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child-composed.spdl +++ /dev/null @@ -1,165 +0,0 @@ -# 1 "ikev2-sig-child-composed.cpp" -# 1 "<command-line>" -# 1 "ikev2-sig-child-composed.cpp" -# 15 "ikev2-sig-child-composed.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 16 "ikev2-sig-child-composed.cpp" 2 -# 26 "ikev2-sig-child-composed.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - - recv_!E5( E, E, {SA3, Mi, g(j), TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E6( E, E, {SA3, Mi, g(j), TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E7( E, E, {SA3, Mr, g(t), TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E8( E, E, {SA3, Mr, g(t), TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - } - - -} -protocol @ora(S) { - - - - - role S { - var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce; - - recv_!S1( S, S, KDF(Ni, Nr, h(g(r),i), h(g(t),j), Mi, Mr) ); - send_!S2( S, S, KDF(Ni, Nr, h(g(i),r), h(g(j),t), Mi, Mr) ); - } - - - - -} - - -protocol ikev2-sig-child(I, R) -{ - role I { - fresh i, j, Ni, Mi, SPIi: Nonce; - var Nr, Mr, SPIr: Nonce; - var Gr, Gt: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, (SPIi,SPIr), SA1, Gr, Nr ); - - - send_!3( I, R, (SPIi,SPIr), {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, Running, R,g(i),g(j),Gr ); - send_!5( I, R, (SPIi,SPIr), {SA3, Mi, g(j), TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!6( R, I, (SPIi,SPIr), {SA3, Mr, Gt, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), h(Gt,j), Mi, Mr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, (SPIi,SPIr), SA1, g(r), Nr ); - - - recv_!3( I, R, (SPIi,SPIr), {I, R, {SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - send_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - recv_!5( I, R, (SPIi,SPIr), {SA3, Mi, Gj, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I,Gi,Gj,g(r),g(t) ); - send_!6( R, I, (SPIi,SPIr), {SA3, Mr, g(t), TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), h(Gi,t), Mi, Mr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I,Gi,Gj,g(r) ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child.cpp deleted file mode 100644 index 62ddf6f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/********************************************************************** - * @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) ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child.spdl deleted file mode 100644 index f9db4cf..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child.spdl +++ /dev/null @@ -1,165 +0,0 @@ -# 1 "ikev2-sig-child.cpp" -# 1 "<command-line>" -# 1 "ikev2-sig-child.cpp" -# 15 "ikev2-sig-child.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 16 "ikev2-sig-child.cpp" 2 -# 26 "ikev2-sig-child.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - - recv_!E5( E, E, {SA3, Mi, g(j), TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E6( E, E, {SA3, Mi, g(j), TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E7( E, E, {SA3, Mr, g(t), TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E8( E, E, {SA3, Mr, g(t), TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - } - - -} -protocol @ora(S) { - - - - - role S { - var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce; - - recv_!S1( S, S, KDF(Ni, Nr, h(g(r),i), h(g(t),j), Mi, Mr) ); - send_!S2( S, S, KDF(Ni, Nr, h(g(i),r), h(g(j),t), Mi, Mr) ); - } - - - - -} - - -protocol ikev2-sig-child(I, R) -{ - role I { - fresh i, j, Ni, Mi, SPIi: Nonce; - var Nr, Mr, SPIr: Nonce; - var Gr, Gt: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, (SPIi,SPIr), SA1, Gr, Nr ); - - - send_!3( I, R, (SPIi,SPIr), {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, Running, R,g(i),g(j),Gr ); - send_!5( I, R, (SPIi,SPIr), {SA3, Mi, g(j), TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!6( R, I, (SPIi,SPIr), {SA3, Mr, Gt, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), h(Gt,j), Mi, Mr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, (SPIi,SPIr), SA1, g(r), Nr ); - - - recv_!3( I, R, (SPIi,SPIr), {I, R, {SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - send_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - recv_!5( I, R, (SPIi,SPIr), {SA3, Mi, Gj, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I,Gi,Gj,g(r),g(t) ); - send_!6( R, I, (SPIi,SPIr), {SA3, Mr, g(t), TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), h(Gi,t), Mi, Mr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I,Gi,Gj,g(r) ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2-composed.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2-composed.cpp deleted file mode 100644 index 621e7f6..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2-composed.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/********************************************************************** - * @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) ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2-composed.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2-composed.spdl deleted file mode 100644 index 49df999..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2-composed.spdl +++ /dev/null @@ -1,165 +0,0 @@ -# 1 "ikev2-sig-child2-composed.cpp" -# 1 "<command-line>" -# 1 "ikev2-sig-child2-composed.cpp" -# 15 "ikev2-sig-child2-composed.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 16 "ikev2-sig-child2-composed.cpp" 2 -# 26 "ikev2-sig-child2-composed.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - - recv_!E5( E, E, {SA3, Mi, g(j)}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E6( E, E, {SA3, Mi, g(j)}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E7( E, E, {SA3, Mr, g(t)}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E8( E, E, {SA3, Mr, g(t)}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - } - - -} -protocol @ora(S) { - - - - - role S { - var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce; - - recv_!S1( S, S, KDF(Ni, Nr, h(g(r),i), h(g(t),j), Mi, Mr) ); - send_!S2( S, S, KDF(Ni, Nr, h(g(i),r), h(g(j),t), Mi, Mr) ); - } - - - - -} - - -protocol ikev2-sig-child2(I, R) -{ - role I { - fresh i, j, Ni, Mi, SPIi: Nonce; - var Nr, Mr, SPIr: Nonce; - var Gr, Gt: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, (SPIi,SPIr), SA1, Gr, Nr ); - - - send_!3( I, R, (SPIi,SPIr), {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, Running, R,g(i),g(j),Gr ); - send_!5( I, R, (SPIi,SPIr), {SA3, Mi, g(j)}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!6( R, I, (SPIi,SPIr), {SA3, Mr, Gt}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), h(Gt,j), Mi, Mr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, (SPIi,SPIr), SA1, g(r), Nr ); - - - recv_!3( I, R, (SPIi,SPIr), {I, {SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - send_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - recv_!5( I, R, (SPIi,SPIr), {SA3, Mi, Gj}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I,Gi,Gj,g(r),g(t) ); - send_!6( R, I, (SPIi,SPIr), {SA3, Mr, g(t)}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), h(Gi,t), Mi, Mr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I,Gi,Gj,g(r) ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2.cpp deleted file mode 100644 index 621e7f6..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/********************************************************************** - * @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) ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2.spdl deleted file mode 100644 index aa8642f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig-child2.spdl +++ /dev/null @@ -1,165 +0,0 @@ -# 1 "ikev2-sig-child2.cpp" -# 1 "<command-line>" -# 1 "ikev2-sig-child2.cpp" -# 15 "ikev2-sig-child2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 16 "ikev2-sig-child2.cpp" 2 -# 26 "ikev2-sig-child2.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - - recv_!E5( E, E, {SA3, Mi, g(j)}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E6( E, E, {SA3, Mi, g(j)}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E7( E, E, {SA3, Mr, g(t)}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E8( E, E, {SA3, Mr, g(t)}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - } - - -} -protocol @ora(S) { - - - - - role S { - var i, j, r, t, Mi, Ni, Mr, Nr, SPIi, SPIr: Nonce; - - recv_!S1( S, S, KDF(Ni, Nr, h(g(r),i), h(g(t),j), Mi, Mr) ); - send_!S2( S, S, KDF(Ni, Nr, h(g(i),r), h(g(j),t), Mi, Mr) ); - } - - - - -} - - -protocol ikev2-sig-child2(I, R) -{ - role I { - fresh i, j, Ni, Mi, SPIi: Nonce; - var Nr, Mr, SPIr: Nonce; - var Gr, Gt: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, (SPIi,SPIr), SA1, Gr, Nr ); - - - send_!3( I, R, (SPIi,SPIr), {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, Running, R,g(i),g(j),Gr ); - send_!5( I, R, (SPIi,SPIr), {SA3, Mi, g(j)}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!6( R, I, (SPIi,SPIr), {SA3, Mr, Gt}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), h(Gt,j), Mi, Mr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, (SPIi,SPIr), SA1, g(r), Nr ); - - - recv_!3( I, R, (SPIi,SPIr), {I, {SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - send_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - recv_!5( I, R, (SPIi,SPIr), {SA3, Mi, Gj}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I,Gi,Gj,g(r),g(t) ); - send_!6( R, I, (SPIi,SPIr), {SA3, Mr, g(t)}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), h(Gi,t), Mi, Mr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I,Gi,Gj,g(r) ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig.cpp deleted file mode 100644 index 68e7326..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/********************************************************************** - * @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 ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig.spdl deleted file mode 100644 index baaba1a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig.spdl +++ /dev/null @@ -1,132 +0,0 @@ -# 1 "ikev2-sig.cpp" -# 1 "<command-line>" -# 1 "ikev2-sig.cpp" -# 15 "ikev2-sig.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 16 "ikev2-sig.cpp" 2 -# 24 "ikev2-sig.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, r, Ni, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - } - - -} - - -protocol ikev2-sig(I, R) -{ - role I { - fresh i, Ni, SPIi: Nonce; - var Nr, SPIr: Nonce; - var Gr: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, (SPIi,SPIr), SA1, Gr, Nr ); - - - claim( I, Running, R,g(i),Gr,Ni,Nr ); - send_!3( I, R, (SPIi,SPIr), {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, (SPIi,SPIr), SA1, g(r), Nr ); - - - recv_!3( I, R, (SPIi,SPIr), {I, R, {SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I,Gi,g(r),Ni,Nr ); - send_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I,Gi,g(r),Ni,Nr ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig2.cpp deleted file mode 100644 index e2e02b7..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig2.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/********************************************************************** - * @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 ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig2.spdl deleted file mode 100644 index 0825976..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sig2.spdl +++ /dev/null @@ -1,132 +0,0 @@ -# 1 "ikev2-sig2.cpp" -# 1 "<command-line>" -# 1 "ikev2-sig2.cpp" -# 15 "ikev2-sig2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 16 "ikev2-sig2.cpp" 2 -# 24 "ikev2-sig2.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, r, Ni, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - } - - -} - - -protocol ikev2-sig2(I, R) -{ - role I { - fresh i, Ni, SPIi: Nonce; - var Nr, SPIr: Nonce; - var Gr: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, (SPIi,SPIr), SA1, Gr, Nr ); - - - claim( I, Running, R,Ni,g(i),Nr,Gr,TSi,TSr ); - send_!3( I, R, (SPIi,SPIr), {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, (SPIi,SPIr), SA1, g(r), Nr ); - - - recv_!3( I, R, (SPIi,SPIr), {I, {SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I, Ni,Gi,Nr,g(r),TSi,TSr ); - send_!4( R, I, (SPIi,SPIr), {R, {SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)}sk(R), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I, Ni,Gi,Nr,g(r),TSi,TSr ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac.cpp deleted file mode 100644 index dc7a059..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/********************************************************************** - * @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 ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac.spdl deleted file mode 100644 index 9d40a3a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac.spdl +++ /dev/null @@ -1,132 +0,0 @@ -# 1 "ikev2-sigtomac.cpp" -# 1 "<command-line>" -# 1 "ikev2-sigtomac.cpp" -# 16 "ikev2-sigtomac.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 17 "ikev2-sigtomac.cpp" 2 -# 25 "ikev2-sigtomac.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, r, Ni, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, MAC(k(I,R), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - } - - -} - - -protocol ikev2-sigtomac(I, R) -{ - role I { - fresh i, Ni, SPIi: Nonce; - var Nr, SPIr: Nonce; - var Gr: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, SPIi, SPIr, SA1, Gr, Nr ); - - - claim( I, Running, R,g(i),Gr,Ni,Nr ); - send_!3( I, R, SPIi, SPIr, {I, R, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, SPIi, SPIr, {R, MAC(k(I,R), SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, SPIi, SPIr, SA1, g(r), Nr ); - - - recv_!3( I, R, SPIi, SPIr, {I, R, {SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I,Gi,g(r),Ni,Nr ); - send_!4( R, I, SPIi, SPIr, {R, MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I,Gi,g(r),Ni,Nr ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac2.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac2.cpp deleted file mode 100644 index bccbab3..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac2.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/********************************************************************** - * @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 ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac2.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac2.spdl deleted file mode 100644 index 99ad18c..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/ikev2-sigtomac2.spdl +++ /dev/null @@ -1,132 +0,0 @@ -# 1 "ikev2-sigtomac2.cpp" -# 1 "<command-line>" -# 1 "ikev2-sigtomac2.cpp" -# 16 "ikev2-sigtomac2.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 43 "common.h" -hashfunction MAC; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 132 "common.h" - var SPIi, SPIr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - } - - -} -# 17 "ikev2-sigtomac2.cpp" 2 -# 25 "ikev2-sigtomac2.cpp" -usertype Number, SecurityAssociation, TrafficSelector; -const O: Number; -const SA1 ,SA2, SA3: SecurityAssociation; -const TSi, TSr: TrafficSelector; - - - - - - -protocol @executability(E) { - - - role E { - var i, r, Ni, Nr, SPIi, SPIr: Nonce; - var I, R: Agent; - - - recv_!E1( E, E, {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - send_!E2( E, E, {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - - - recv_!E3( E, E, {R, MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(i),r),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(i),r),SPIi,SPIr) ); - send_!E4( E, E, {R, MAC(k(I,R), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(g(r),i),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(g(r),i),SPIi,SPIr) ); - - } - - -} - - -protocol ikev2-sigtomac2(I, R) -{ - role I { - fresh i, Ni, SPIi: Nonce; - var Nr, SPIr: Nonce; - var Gr: Ticket; - - - - send_1( I, R, SPIi, O, SA1, g(i), Ni ); - recv_2( R, I, SPIi, SPIr, SA1, Gr, Nr ); - - - claim( I, Running, R,g(i),Gr,Ni,Nr ); - send_!3( I, R, SPIi, SPIr, {I, {SPIi, O, SA1, g(i), Ni, Nr, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - recv_!4( R, I, SPIi, SPIr, {R, MAC(k(I,R), SPIi, SPIr, SA1, Gr, Nr, Ni, prf(KDF(Ni,Nr,h(Gr,i),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - - claim( I, SKR, KDF(Ni,Nr,h(Gr,i),SPIi,SPIr) ); - - 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; - - - - recv_1( I, R, SPIi, O, SA1, Gi, Ni ); - send_2( R, I, SPIi, SPIr, SA1, g(r), Nr ); - - - recv_!3( I, R, SPIi, SPIr, {I, {SPIi, O, SA1, Gi, Ni, Nr, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), I)}sk(I), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - claim( R, Running, I,Gi,g(r),Ni,Nr ); - send_!4( R, I, SPIi, SPIr, {R, MAC(k(R,I), SPIi, SPIr, SA1, g(r), Nr, Ni, prf(KDF(Ni,Nr,h(Gi,r),SPIi,SPIr), R)), SA2, TSi, TSr}KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - - claim( R, SKR, KDF(Ni,Nr,h(Gi,r),SPIi,SPIr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - claim( R, Commit, I,Gi,g(r),Ni,Nr ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/jfki-core.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/jfki-core.cpp deleted file mode 100644 index d6c2abf..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/jfki-core.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/jfki-core.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/jfki-core.spdl deleted file mode 100644 index 2517cbf..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/jfki-core.spdl +++ /dev/null @@ -1,88 +0,0 @@ -# 1 "jfki-core.cpp" -# 1 "<command-line>" -# 1 "jfki-core.cpp" -# 15 "jfki-core.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 60 "common.h" -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(h(g(r),i), Ni, Nr) ); - send_!SWAP2( SWAP, SWAP, KDF(h(g(i),r), Ni, Nr) ); - - } - - -} -# 16 "jfki-core.cpp" 2 - - - -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) ); - - - claim( I, SKR, KDF(h(Gr,i), Ni, Nr) ); - - 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) ); - - - claim( R, SKR, KDF(h(Gi,r), Ni, Nr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/jfki.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/jfki.cpp deleted file mode 100644 index 5b000f9..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/jfki.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/jfki.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/jfki.spdl deleted file mode 100644 index d385543..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/jfki.spdl +++ /dev/null @@ -1,118 +0,0 @@ -# 1 "jfki.cpp" -# 1 "<command-line>" -# 1 "jfki.cpp" -# 15 "jfki.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 66 "common.h" -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(h(g(r),i), H(Ni), Nr) ); - send_!SWAP2( SWAP, SWAP, KDF(h(g(i),r), H(Ni), Nr) ); - - } - - -} -# 16 "jfki.cpp" 2 - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, SAi, SAr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {I, SAi, {H(Ni), Nr, g(i), g(r), R, SAi}sk(I)}KDF(h(g(r),i), H(Ni), Nr) ); - send_!O2( O, O, {I, SAi, {H(Ni), Nr, g(i), g(r), R, SAi}sk(I)}KDF(h(g(i),r), H(Ni), Nr) ); - - - recv_!O3( O, O, {{H(Ni), Nr, g(i), g(r), I, SAi, SAr}sk(R), SAr}KDF(h(g(i),r), H(Ni), Nr) ); - send_!O4( O, O, {{H(Ni), Nr, g(i), g(r), I, SAi, SAr}sk(R), SAr}KDF(h(g(r),i), H(Ni), Nr) ); - - } - - -} - - - -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)}KDF(h(Gr,i), H(Ni), Nr) ); - recv_!4( R, I, {{H(Ni), Nr, g(i), Gr, I, SAi, SAr}sk(R), SAr}KDF(h(Gr,i), H(Ni), Nr) ); - - - claim( I, SKR, KDF(h(Gr,i), H(Ni), Nr) ); - - 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) ); - - 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)}KDF(h(Gi,r), H(Ni), Nr) ); - send_!4( R, I, {{H(Ni), Nr, Gi, g(r), I, SAi, SAr}sk(R), SAr}KDF(h(Gi,r), H(Ni), Nr) ); - - - claim( R, Secret, HKr ); - claim( R, SKR, KDF(h(Gi,r), H(Ni), Nr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/jfkr-core.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/jfkr-core.cpp deleted file mode 100644 index 500a8bb..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/jfkr-core.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/jfkr-core.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/jfkr-core.spdl deleted file mode 100644 index adce573..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/jfkr-core.spdl +++ /dev/null @@ -1,112 +0,0 @@ -# 1 "jfkr-core.cpp" -# 1 "<command-line>" -# 1 "jfkr-core.cpp" -# 15 "jfkr-core.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 60 "common.h" -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(h(g(r),i), Ni, Nr) ); - send_!SWAP2( SWAP, SWAP, KDF(h(g(i),r), Ni, Nr) ); - - } - - -} -# 16 "jfkr-core.cpp" 2 - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, H(KDF(h(g(i),r), Ni, Nr), Nr, Ni, R) ); - send_!O2( O, O, H(KDF(h(g(r),i), Ni, Nr), Nr, Ni, R) ); - - - recv_!O3( O, O, H(KDF(h(g(r),i), Ni, Nr), Nr, Ni, I) ); - send_!O4( O, O, H(KDF(h(g(i),r), Ni, Nr), Nr, Ni, I) ); - - } - - -} - - - -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(KDF(h(Gr,i), Ni, Nr), Nr, Ni, R) ); - send_!3( I, R, Nr, Ni, I, {Nr, Ni, Gr, g(i)}sk(I), H(KDF(h(Gr,i), Ni, Nr), Nr, Ni, I) ); - - - claim( I, SKR, KDF(h(Gr,i), Ni, Nr) ); - - 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(KDF(h(Gi,r), Ni, Nr), Nr, Ni, R) ); - recv_!3( I, R, Nr, Ni, I, {Nr, Ni, g(r), Gi}sk(I), H(KDF(h(Gi,r), Ni, Nr), Nr, Ni, I) ); - - - claim( R, SKR, KDF(h(Gi,r), Ni, Nr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/jfkr.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/jfkr.cpp deleted file mode 100644 index fbe85d3..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/jfkr.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/jfkr.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/jfkr.spdl deleted file mode 100644 index 6e5e3e2..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/jfkr.spdl +++ /dev/null @@ -1,117 +0,0 @@ -# 1 "jfkr.cpp" -# 1 "<command-line>" -# 1 "jfkr.cpp" -# 15 "jfkr.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 66 "common.h" -hashfunction H; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(h(g(r),i), H(Ni), Nr) ); - send_!SWAP2( SWAP, SWAP, KDF(h(g(i),r), H(Ni), Nr) ); - - } - - -} -# 16 "jfkr.cpp" 2 - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, SAi, SAr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {I, SAi, {H(Ni), Nr, g(i), g(r)}sk(I)}KDF(h(g(r),i), H(Ni), Nr) ); - send_!O2( O, O, {I, SAi, {H(Ni), Nr, g(i), g(r)}sk(I)}KDF(h(g(i),r), H(Ni), Nr) ); - - - recv_!O3( O, O, {R, SAr, {g(r), Nr, g(i), H(Ni)}sk(R)}KDF(h(g(i),r), H(Ni), Nr) ); - send_!O4( O, O, {R, SAr, {g(r), Nr, g(i), H(Ni)}sk(R)}KDF(h(g(r),i), H(Ni), Nr) ); - - } - - -} - - - -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)}KDF(h(Gr,i), H(Ni), Nr) ); - recv_!4( R, I, {R, SAr, {Gr, Nr, g(i), H(Ni)}sk(R)}KDF(h(Gr,i), H(Ni), Nr) ); - - - claim( I, SKR, KDF(h(Gr,i), H(Ni), Nr) ); - - 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)}KDF(h(Gi,r), H(Ni), Nr) ); - send_!4( R, I, {R, SAr, {g(r), Nr, Gi, H(Ni)}sk(R)}KDF(h(Gi,r), H(Ni), Nr) ); - - - claim( R, Secret, HKr ); - claim( R, SKR, KDF(h(Gi,r), H(Ni), Nr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/make-mpa.py b/Vagrant Files/shared/scyther/Protocols/IKE/make-mpa.py deleted file mode 100644 index c75984d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/make-mpa.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/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() - - diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/mpa/README.txt b/Vagrant Files/shared/scyther/Protocols/IKE/mpa/README.txt deleted file mode 100644 index 91e5266..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/mpa/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -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. diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-a.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/oakley-a.cpp deleted file mode 100644 index 84db6b0..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-a.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-a.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/oakley-a.spdl deleted file mode 100644 index aa04c2e..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-a.spdl +++ /dev/null @@ -1,91 +0,0 @@ -# 1 "oakley-a.cpp" -# 1 "<command-line>" -# 1 "oakley-a.cpp" -# 18 "oakley-a.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 141 "common.h" - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 19 "oakley-a.cpp" 2 - - - -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) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-alt.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/oakley-alt.cpp deleted file mode 100644 index 5c4654f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-alt.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-alt.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/oakley-alt.spdl deleted file mode 100644 index f94b355..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-alt.spdl +++ /dev/null @@ -1,94 +0,0 @@ -# 1 "oakley-alt.cpp" -# 1 "<command-line>" -# 1 "oakley-alt.cpp" -# 18 "oakley-alt.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 141 "common.h" - var Ci, Cr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 19 "oakley-alt.cpp" 2 - - - - -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; - - - - 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(prf(Ni,Nr), R, I, Gr, g(i), algo) ); - send_3( I, R, Ci, Cr, prf(prf(Ni,Nr), I, R, g(i), Gr, algo) ); - - - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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(prf(Ni,Nr), R, I, g(r), Gi, algo) ); - recv_3( I, R, Ci, Cr, prf(prf(Ni,Nr), I, R, Gi, g(r), algo) ); - - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-c.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/oakley-c.cpp deleted file mode 100644 index 32e6a80..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-c.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-c.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/oakley-c.spdl deleted file mode 100644 index 2585ef9..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/oakley-c.spdl +++ /dev/null @@ -1,140 +0,0 @@ -# 1 "oakley-c.cpp" -# 1 "<command-line>" -# 1 "oakley-c.cpp" -# 18 "oakley-c.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 144 "common.h" - var Ci, Cr: Nonce; - - - - - - recv_!SWAP1( SWAP, SWAP, KDF(Ni, Nr, h(g(r),i), Ci, Cr) ); - send_!SWAP2( SWAP, SWAP, KDF(Ni, Nr, h(g(i),r), Ci, Cr) ); - - } - - -} -# 19 "oakley-c.cpp" 2 - - - - - - - -usertype String; -const OK, list, algo: String; - - - - - - - -protocol @executability(O) { - - - role O { - var i, r, Ni, Nr, Ci, Cr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {I, R, {Ni}pk(R)}prf(h(g(r),i)) ); - send_!O2( O, O, {I, R, {Ni}pk(R)}prf(h(g(i),r)) ); - - - recv_!O3( O, O, {{Nr, Ni}pk(I), R, I, prf(prf(Ni,Nr), R, I, g(r), g(i), algo)}prf(h(g(i),r)) ); - send_!O4( O, O, {{Nr, Ni}pk(I), R, I, prf(prf(Ni,Nr), R, I, g(r), g(i), algo)}prf(h(g(r),i)) ); - - - recv_!O5( O, O, {prf(prf(Ni,Nr), I, R, g(i), g(r), algo)}prf(h(g(r),i)) ); - send_!O6( O, O, {prf(prf(Ni,Nr), I, R, g(i), g(r), algo)}prf(h(g(i),r)) ); - - } - - -} - - -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)}prf(h(Gr,i)) ); - recv_!6( R, I, Cr, Ci, {{Nr, Ni}pk(I), R, I, prf(prf(Ni,Nr), R, I, Gr, g(i), algo)}prf(h(Gr,i)) ); - send_!7( I, R, Ci, Cr, {prf(prf(Ni,Nr), I, R, g(i), Gr, algo)}prf(h(Gr,i)) ); - - - claim( I, SKR, prf(h(Gr,i)) ); - claim( I, SKR, KDF(Ni, Nr, h(Gr,i), Ci, Cr) ); - - 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)}prf(h(Gi,r)) ); - send_!6( R, I, Cr, Ci, {{Nr, Ni}pk(I), R, I, prf(prf(Ni,Nr), R, I, g(r), Gi, algo)}prf(h(Gi,r)) ); - recv_!7( I, R, Ci, Cr, {prf(prf(Ni,Nr), I, R, Gi, g(r), algo)}prf(h(Gi,r)) ); - - - claim( R, SKR, prf(h(Gi,r)) ); - - claim( R, SKR, KDF(Ni, Nr, h(Gi,r), Ci, Cr) ); - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/pp.sh b/Vagrant Files/shared/scyther/Protocols/IKE/pp.sh deleted file mode 100644 index 1ee7b6e..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/pp.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/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 diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/scanner.py b/Vagrant Files/shared/scyther/Protocols/IKE/scanner.py deleted file mode 100644 index bc529ac..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/scanner.py +++ /dev/null @@ -1,800 +0,0 @@ -#!/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) - - - - - diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-basic.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/skeme-basic.cpp deleted file mode 100644 index d9f58ab..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-basic.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-basic.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/skeme-basic.spdl deleted file mode 100644 index 8c53deb..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-basic.spdl +++ /dev/null @@ -1,87 +0,0 @@ -# 1 "skeme-basic.cpp" -# 1 "<command-line>" -# 1 "skeme-basic.cpp" -# 21 "skeme-basic.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(h(g(r),i)) ); - send_!SWAP2( SWAP, SWAP, KDF(h(g(i),r)) ); - - } - - -} -# 22 "skeme-basic.cpp" 2 - - - - -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(prf(Ni,Nr), g(i), Gr, R, I) ); - send_3( I, R, prf(prf(Ni,Nr), Gr, g(i), I, R) ); - - - claim( I, SKR, KDF(h(Gr,i)) ); - - 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(prf(Ni,Nr), Gi, g(r), R, I) ); - recv_3( I, R, prf(prf(Ni,Nr), g(r), Gi, I, R) ); - - - claim( R, SKR, KDF(h(Gi,r)) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-psk.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/skeme-psk.cpp deleted file mode 100644 index 355edc2..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-psk.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-psk.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/skeme-psk.spdl deleted file mode 100644 index e3e8796..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-psk.spdl +++ /dev/null @@ -1,109 +0,0 @@ -# 1 "skeme-psk.cpp" -# 1 "<command-line>" -# 1 "skeme-psk.cpp" -# 20 "skeme-psk.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(h(g(r),i)) ); - send_!SWAP2( SWAP, SWAP, KDF(h(g(i),r)) ); - - } - - -} -# 21 "skeme-psk.cpp" 2 - - - - - - - -protocol @executability(O) { - - - role O { - var i, r: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, prf(k(R,I), g(i), g(r), R, I) ); - send_!O2( O, O, prf(k(I,R), g(i), g(r), R, I) ); - - - recv_!O3( O, O, prf(k(I,R), g(r), g(i), I, R) ); - send_!O4( O, O, prf(k(R,I), g(r), g(i), I, R) ); - - } - - -} - - -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) ); - - - claim( I, SKR, KDF(h(Gr,i)) ); - - 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) ); - - - claim( R, SKR, KDF(h(Gi,r)) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-rekey.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/skeme-rekey.cpp deleted file mode 100644 index a1915a2..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-rekey.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-rekey.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/skeme-rekey.spdl deleted file mode 100644 index acd0c50..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/skeme-rekey.spdl +++ /dev/null @@ -1,111 +0,0 @@ -# 1 "skeme-rekey.cpp" -# 1 "<command-line>" -# 1 "skeme-rekey.cpp" -# 19 "skeme-rekey.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 97 "common.h" -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 147 "common.h" - var I, R: Agent; - - - recv_!SWAP1( SWAP, SWAP, KDF(k(I,R),prf(k(I,R), Ni, Nr, R, I)) ); - send_!SWAP2( SWAP, SWAP, KDF(k(R,I),prf(k(R,I), Ni, Nr, R, I)) ); - - } - - -} -# 20 "skeme-rekey.cpp" 2 - - - - - - - -protocol @executability(O) { - - - role O { - var Ni, Nr: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, prf(k(R,I), Ni, Nr, R, I) ); - send_!O2( O, O, prf(k(I,R), Ni, Nr, R, I) ); - - - recv_!O3( O, O, prf(k(I,R), Nr, Ni, I, R) ); - send_!O4( O, O, prf(k(R,I), Nr, Ni, I, R) ); - - } - - -} - -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) ); - - - claim( I, SKR, KDF(k(I,R),prf(k(I,R), Ni, Nr, R, I)) ); - - 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) ); - - - claim( R, SKR, KDF(k(R,I),prf(k(R,I), Ni, Nr, R, I)) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/sts-mac.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/sts-mac.cpp deleted file mode 100644 index 9faaf4f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/sts-mac.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/sts-mac.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/sts-mac.spdl deleted file mode 100644 index 09c583b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/sts-mac.spdl +++ /dev/null @@ -1,112 +0,0 @@ -# 1 "sts-mac.cpp" -# 1 "<command-line>" -# 1 "sts-mac.cpp" -# 16 "sts-mac.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 94 "common.h" -hashfunction MAC; - - -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(h(g(r),i)) ); - send_!SWAP2( SWAP, SWAP, KDF(h(g(i),r)) ); - - } - - -} -# 17 "sts-mac.cpp" 2 - - - - - - - -protocol @executability(O) { - - - role O { - var i, r: Nonce; - - - recv_!O1( O, O, MAC(h(g(i),r), g(r), g(i)) ); - send_!O2( O, O, MAC(h(g(r),i), g(r), g(i)) ); - - - recv_!O3( O, O, MAC(h(g(r),i), g(i), g(r)) ); - send_!O4( O, O, MAC(h(g(i),r), g(i), g(r)) ); - - } - - -} - - - -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(h(Gr,i), Gr, g(i)) ); - send_!3( I, R, {g(i), Gr}sk(I), MAC(h(Gr,i), g(i), Gr) ); - - - claim( I, SKR, KDF(h(Gr,i)) ); - - 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(h(Gi,r), g(r), Gi) ); - recv_!3( I, R, {Gi, g(r)}sk(I), MAC(h(Gi,r), Gi, g(r)) ); - - - claim( R, SKR, KDF(h(Gi,r)) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/sts-main.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/sts-main.cpp deleted file mode 100644 index b95d306..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/sts-main.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/sts-main.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/sts-main.spdl deleted file mode 100644 index 4cfb76c..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/sts-main.spdl +++ /dev/null @@ -1,114 +0,0 @@ -# 1 "sts-main.cpp" -# 1 "<command-line>" -# 1 "sts-main.cpp" -# 15 "sts-main.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 94 "common.h" -hashfunction MAC; - - -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(h(g(r),i)) ); - send_!SWAP2( SWAP, SWAP, KDF(h(g(i),r)) ); - - } - - -} -# 16 "sts-main.cpp" 2 - - - - - - - -protocol @executability(O) { - - - role O { - var i, r: Nonce; - var I, R: Agent; - - - recv_!O1( O, O, {{g(r), g(i)}sk(R)}KDF(h(g(i),r)) ); - send_!O2( O, O, {{g(r), g(i)}sk(R)}KDF(h(g(r),i)) ); - - - recv_!O3( O, O, {{g(i), g(r)}sk(I)}KDF(h(g(r),i)) ); - send_!O4( O, O, {{g(i), g(r)}sk(I)}KDF(h(g(i),r)) ); - - } - - -} - - - - -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)}KDF(h(Gr,i)) ); - send_!3( I, R, {{g(i), Gr}sk(I)}KDF(h(Gr,i)) ); - - - claim( I, SKR, KDF(h(Gr,i)) ); - - 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)}KDF(h(Gi,r)) ); - recv_!3( I, R, {{Gi, g(r)}sk(I)}KDF(h(Gi,r)) ); - - - claim( R, SKR, KDF(h(Gi,r)) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/sts-modified.cpp b/Vagrant Files/shared/scyther/Protocols/IKE/sts-modified.cpp deleted file mode 100644 index 458a042..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/sts-modified.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/** 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 ); - - } -} \ No newline at end of file diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/sts-modified.spdl b/Vagrant Files/shared/scyther/Protocols/IKE/sts-modified.spdl deleted file mode 100644 index 660d068..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/sts-modified.spdl +++ /dev/null @@ -1,88 +0,0 @@ -# 1 "sts-modified.cpp" -# 1 "<command-line>" -# 1 "sts-modified.cpp" -# 17 "sts-modified.cpp" -# 1 "common.h" 1 - - - - - hashfunction prf, KDF; - - - - - - -hashfunction g, h; -# 94 "common.h" -hashfunction MAC; - - -protocol @oracle (DH, SWAP) { - - - - - - - - role DH { - var i, r: Nonce; - - recv_!DH1( DH, DH, h(g(r),i) ); - send_!DH2( DH, DH, h(g(i),r) ); - } - - - - - role SWAP { - var i, r, Ni, Nr: Nonce; -# 150 "common.h" - recv_!SWAP1( SWAP, SWAP, KDF(h(g(r),i)) ); - send_!SWAP2( SWAP, SWAP, KDF(h(g(i),r)) ); - - } - - -} -# 18 "sts-modified.cpp" 2 - - - - -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) ); - - - claim( I, SKR, KDF(h(Gr,i)) ); - - 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) ); - - - claim( R, SKR, KDF(h(Gi,r)) ); - - claim( R, Alive ); - claim( R, Weakagree ); - - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/verify.sh b/Vagrant Files/shared/scyther/Protocols/IKE/verify.sh deleted file mode 100644 index 44f2b61..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/verify.sh +++ /dev/null @@ -1,149 +0,0 @@ -############################################################################# -# -# 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 diff --git a/Vagrant Files/shared/scyther/Protocols/IKE/verify_all.sh b/Vagrant Files/shared/scyther/Protocols/IKE/verify_all.sh deleted file mode 100644 index 0cad2f6..0000000 --- a/Vagrant Files/shared/scyther/Protocols/IKE/verify_all.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/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 diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/Makefile b/Vagrant Files/shared/scyther/Protocols/ISO-9798/Makefile deleted file mode 100644 index e0a1179..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/Makefile +++ /dev/null @@ -1,16 +0,0 @@ - -outputs= isoiec-9798-3-6-1.spdl isoiec-9798-3-6-2.spdl \ - isoiec-9798-3-7-1.spdl isoiec-9798-3-7-2.spdl - -all: $(outputs) - -isoiec-9798-3-6-%.spdl: isoiec-9798-3-6-%.cpp isoiec-9798-3-6.template - cpp -C -P $< >$@ - -isoiec-9798-3-7-%.spdl: isoiec-9798-3-7-%.cpp isoiec-9798-3-7.template - cpp -C -P $< >$@ - -clean: - \rm -f $(outputs) - - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/iso25-tag.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/iso25-tag.spdl deleted file mode 100644 index a97164b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/iso25-tag.spdl +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * ttp - * four-pass - * mutual - * - * Modeling notes: - * - The use of TNb in message 4, as specified by the ISO standard, is - * different from other models, in which it was TNa. - */ -usertype SessionKey; -usertype Tag; - -const t1,t2a,t2b,t3,t4,t5: Tag; - -protocol isoiec-9798-2-5(A,B,P) -{ - role A - { - fresh TVPa: Nonce; - var T: Ticket; - fresh TNa: Nonce; - var TNb: Nonce; - var Kab: SessionKey; - fresh Text1,Text5,Text6: Ticket; - var Text3,Text4,Text7,Text8: Ticket; - - send_1(A,P, TVPa, B, Text1); - recv_2(P,A, Text4, { t2a, TVPa, Kab, B, Text3 }k(A,P), T ); - claim(A,Running,B,Kab,Text5); - send_3(A,B, Text6, T, { t3, TNa, B, Text5 }Kab ); - recv_4(B,A, Text8, { t4, TNb, A, Text7 }Kab ); - - claim(A,Commit,B,Kab,Text5,Text7); - claim(A,Secret,Kab); - claim(A,Secret,Text5); - claim(A,Secret,Text7); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - var TNp: Nonce; - var TNa: Nonce; - fresh TNb: Nonce; - var Kab: SessionKey; - fresh Text7,Text8: Ticket; - var Text2,Text5,Text6: Ticket; - - recv_3(A,B, Text6, { t2b, TNp, Kab, A, Text2 }k(B,P), { - t3, TNa, B, Text5 }Kab ); - claim(B,Running,A,Kab,Text5,Text7); - send_4(B,A, Text8, { t4, TNb, A, Text7 }Kab ); - - claim(B,Commit,A,Kab,Text5); - claim(B,Secret,Kab); - claim(B,Secret,Text5); - claim(B,Secret,Text7); - claim(B,Alive); - claim(B,Weakagree); - } - role P - { - var TVPa: Nonce; - fresh TNp: Nonce; - fresh Kab: SessionKey; - fresh Text2,Text3,Text4: Ticket; - var Text1: Ticket; - - recv_1(A,P, TVPa, B, Text1); - send_2(P,A, Text4, { t2a, TVPa, Kab, B, Text3 }k(A,P), - { t2b, TNp, Kab, A, Text2 }k(B,P) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/iso26-tag.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/iso26-tag.spdl deleted file mode 100644 index ced5d02..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/iso26-tag.spdl +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * ttp - * five-pass - * mutual - * - * MPA Attack reported by Mathuria: - * - Type flaw MPA when in parallel with Abadi-Needham protocol. - * - */ -usertype Tag; - -const t1,t2,t3,t4,t5: Tag; - -protocol isoiec-9798-2-6-tag(A,B,P) -{ - role A - { - var Rb: Nonce; - fresh Ra,Rpa: Nonce; - var Kab: SessionKey; - var T: Ticket; - fresh Text2,Text6,Text7: Ticket; - var Text1,Text4,Text5,Text8,Text9: Ticket; - - recv_1(B,A, Rb, Text1); - send_2(A,P, Ra, Rb, B, Text2); - recv_3(P,A, Text5, {t1, Ra,Kab,B,Text4}k(A,P), T ); - claim(A,Running,B,Kab,Text6); - send_4(A,B, Text7, T, {t3,Rpa,Rb,Text6}Kab ); - recv_5(B,A, Text9, {t4,Rb,Rpa,Text8}Kab ); - - claim(A,Commit,B,Kab,Text6,Text8); - claim(A,Secret,Kab); - claim(A,Secret,Text6); - claim(A,Secret,Text8); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - fresh Rb: Nonce; - var Rpa: Nonce; - var Kab: SessionKey; - fresh Text1,Text8,Text9: Ticket; - var Text3,Text6,Text7: Ticket; - - send_1(B,A, Rb, Text1); - recv_4(A,B, Text7, {t2,Rb,Kab,A,Text3}k(B,P), {t3,Rpa,Rb,Text6}Kab ); - claim(B,Running,A,Kab,Text6,Text8); - send_5(B,A, Text9, {t4,Rb,Rpa,Text8}Kab ); - - claim(B,Commit,A,Kab,Text6); - claim(B,Secret,Kab); - claim(B,Secret,Text6); - claim(B,Secret,Text8); - claim(B,Alive); - claim(B,Weakagree); - } - role P - { - var Ra, Rb: Nonce; - fresh Kab: SessionKey; - fresh Text3,Text4,Text5: Ticket; - var Text2: Ticket; - - recv_2(A,P, Ra, Rb, B, Text2); - send_3(P,A, Text5, {t1,Ra,Kab,B,Text4}k(A,P), - {t2,Rb,Kab,A,Text3}k(B,P) ); - } -} - -protocol @keysymm26(A,B,P) -{ - role A - { - var TVPN: Nonce; - var Kab: SessionKey; - var Text: Ticket; - var Tag: Ticket; - - recv_!1(B,A, { Tag,TVPN, Kab, B, Text }k(P,A) ); - send_!2(A,B, { Tag,TVPN, Kab, B, Text }k(A,P) ); - } - role B - { - } - role P - { - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-1-udkey.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-1-udkey.spdl deleted file mode 100644 index e1f8be6..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-1-udkey.spdl +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * one-pass - * unilateral - * - * Note: the identity B may be ommitted, if - * (a) the environment disallows such attacks, or - * (b) a unidirectional key is used - */ -protocol isoiec-9798-2-1-udkey(A,B) -{ - role A - { - fresh TNA: Nonce; - fresh Text1,Text2: Ticket; - - claim(A,Running,B,TNA,Text1); - send_1(A,B, Text2, { TNA, Text1 }k(A,B) ); - } - role B - { - var TNA: Nonce; - var Text1,Text2: Ticket; - - recv_1(A,B, Text2, { TNA, Text1 }k(A,B) ); - - claim(B,Commit,A,TNA,Text1); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-1.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-1.spdl deleted file mode 100644 index 0d47be3..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-1.spdl +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * one-pass - * unilateral - * - * Note: the identity B may be ommitted, if - * (a) the environment disallows such attacks, or - * (b) a unidirectional key is used - */ -protocol @keysymm-21(A,B) -{ - role A - { - var T: Nonce; - var Text: Ticket; - - recv_!1(B,A, { T, A, Text }k(A,B) ); - send_!2(A,B, { T, A, Text }k(B,A) ); - } - role B - { - var T: Nonce; - var Text: Ticket; - - recv_!3(A,B, { T, B, Text }k(A,B) ); - send_!4(B,A, { T, B, Text }k(B,A) ); - } -} - -protocol isoiec-9798-2-1(A,B) -{ - role A - { - fresh TNA: Nonce; - fresh Text1,Text2: Ticket; - - claim(A,Running,B,TNA,Text1); - send_1(A,B, Text2, { TNA, B, Text1 }k(A,B) ); - } - role B - { - var TNA: Nonce; - var Text1,Text2: Ticket; - - recv_1(A,B, Text2, { TNA, B, Text1 }k(A,B) ); - - claim(B,Commit,A,TNA,Text1); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-2-udkey.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-2-udkey.spdl deleted file mode 100644 index 314aa8e..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-2-udkey.spdl +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * two-pass - * unilateral - * - * Note: the identity A may be ommitted, if - * (a) the environment disallows such attacks, or - * (b) a unidirectional key is used - * - */ -protocol isoiec-9798-2-2-udkey(A,B) -{ - role A - { - var RB: Nonce; - var Text1: Ticket; - fresh Text2,Text3: Ticket; - - recv_1(B,A, RB,Text1 ); - claim(A,Running,B,RB,Text2); - send_2(A,B, Text3, { RB, Text2 }k(B,A) ); - } - role B - { - fresh RB: Nonce; - fresh Text1: Ticket; - var Text2,Text3: Ticket; - - send_1(B,A, RB,Text1 ); - recv_2(A,B, Text3, { RB, Text2 }k(B,A) ); - - claim(B,Commit,A,RB,Text2); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-2.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-2.spdl deleted file mode 100644 index fc1ae68..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-2.spdl +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * two-pass - * unilateral - * - * Note: the identity A may be ommitted, if - * (a) the environment disallows such attacks, or - * (b) a unidirectional key is used - */ -protocol @keysymm-22(A,B) -{ - role A - { - var T: Nonce; - var Text: Ticket; - - recv_!1(B,A, { T, A, Text }k(A,B) ); - send_!2(A,B, { T, A, Text }k(B,A) ); - } - role B - { - var T: Nonce; - var Text: Ticket; - - recv_!3(A,B, { T, B, Text }k(A,B) ); - send_!4(B,A, { T, B, Text }k(B,A) ); - } -} - -protocol isoiec-9798-2-2(A,B) -{ - role A - { - var RB: Nonce; - var Text1: Ticket; - fresh Text2,Text3: Ticket; - - recv_1(B,A, RB,Text1 ); - claim(A,Running,B,RB,Text2); - send_2(A,B, Text3, { RB, B, Text2 }k(B,A) ); - } - role B - { - fresh RB: Nonce; - fresh Text1: Ticket; - var Text2,Text3: Ticket; - - send_1(B,A, RB,Text1 ); - recv_2(A,B, Text3, { RB, B, Text2 }k(B,A) ); - - claim(B,Commit,A,RB,Text2); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-3-udkey.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-3-udkey.spdl deleted file mode 100644 index 9fddf69..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-3-udkey.spdl +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * two-pass - * mutual - * - * Note: the identity inside the encryption may be ommitted, if - * (a) the environment disallows such attacks, or - * (b) a unidirectional key is used - * - * In case (b), modeled here, the second key is reversed. - * - */ -protocol isoiec-9798-2-3-udkey(A,B) -{ - role A - { - fresh TNA: Nonce; - var TNB: Nonce; - fresh Text1,Text2: Ticket; - var Text3,Text4: Ticket; - - claim(A,Running,B,TNA,Text1); - send_1(A,B, Text2, { TNA, Text1 }k(A,B) ); - recv_2(B,A, Text4, { TNB, Text3 }k(B,A) ); - - claim(A,Commit,B,TNB,Text3); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - var TNA: Nonce; - fresh TNB: Nonce; - var Text1,Text2: Ticket; - fresh Text3,Text4: Ticket; - - recv_1(A,B, Text2, { TNA, Text1 }k(A,B) ); - claim(B,Running,A,TNB,Text3); - send_2(B,A, Text4, { TNB, Text3 }k(B,A) ); - - claim(B,Commit,A,TNA,Text1); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-3.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-3.spdl deleted file mode 100644 index 6f2f86b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-3.spdl +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * two-pass - * mutual - * - * Note: the identity inside the encryption may be ommitted, if - * (a) the environment disallows such attacks, or - * (b) a unidirectional key is used - * - */ -protocol @keysymm-23(A,B) -{ - role A - { - var T: Nonce; - var Text: Ticket; - - recv_!1(B,A, { T, A, Text }k(A,B) ); - send_!2(A,B, { T, A, Text }k(B,A) ); - } - role B - { - var T: Nonce; - var Text: Ticket; - - recv_!3(A,B, { T, B, Text }k(A,B) ); - send_!4(B,A, { T, B, Text }k(B,A) ); - } -} - -protocol isoiec-9798-2-3(A,B) -{ - role A - { - fresh TNA: Nonce; - var TNB: Nonce; - fresh Text1,Text2: Ticket; - var Text3,Text4: Ticket; - - claim(A,Running,B,TNA,Text1); - send_1(A,B, Text2, { TNA, B, Text1 }k(A,B) ); - recv_2(B,A, Text4, { TNB, A, Text3 }k(A,B) ); - - claim(A,Commit,B,TNB,Text3); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - var TNA: Nonce; - fresh TNB: Nonce; - var Text1,Text2: Ticket; - fresh Text3,Text4: Ticket; - - recv_1(A,B, Text2, { TNA, B, Text1 }k(A,B) ); - claim(B,Running,A,TNB,Text3); - send_2(B,A, Text4, { TNB, A, Text3 }k(A,B) ); - - claim(B,Commit,A,TNA,Text1); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-4-udkey.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-4-udkey.spdl deleted file mode 100644 index 28694de..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-4-udkey.spdl +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * three-pass - * mutual - * - * Note: the identity inside the encryption may be ommitted, if - * (a) the environment disallows such attacks, or - * (b) a unidirectional key is used - * - * In case (b), modeled here, the second key is reversed. - */ -protocol isoiec-9798-2-4-udkey(A,B) -{ - role A - { - var RB: Nonce; - fresh RA: Nonce; - var Text1,Text4,Text5: Ticket; - fresh Text2,Text3: Ticket; - - recv_1(B,A, RB,Text1 ); - claim(A,Running,B,RA,RB,Text2); - send_2(A,B, Text3, { RA, RB, Text2 }k(A,B) ); - recv_3(B,A, Text5, { RB, RA, Text4 }k(B,A) ); - - claim(A,Commit,B,RA,RB,Text2,Text4); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - fresh RB: Nonce; - var RA: Nonce; - fresh Text1,Text4,Text5: Ticket; - var Text2,Text3: Ticket; - - send_1(B,A, RB,Text1 ); - recv_2(A,B, Text3, { RA, RB, Text2 }k(A,B) ); - claim(B,Running,A,RA,RB,Text2,Text4); - send_3(B,A, Text5, { RB, RA, Text4 }k(B,A) ); - - claim(B,Commit,A,RA,RB,Text2); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-4.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-4.spdl deleted file mode 100644 index 5d709c0..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-4.spdl +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * three-pass - * mutual - * - * Note: the identity inside the encryption may be ommitted, if - * (a) the environment disallows such attacks, or - * (b) a unidirectional key is used - */ -protocol @keysymm-24a(A,B) -{ - role A - { - var T1,T2: Nonce; - var Text: Ticket; - - recv_!1(B,A, { T1, T2, A, Text }k(A,B) ); - send_!2(A,B, { T1, T2, A, Text }k(B,A) ); - } - role B - { - var T1,T2: Nonce; - var Text: Ticket; - - recv_!3(A,B, { T1, T2, B, Text }k(A,B) ); - send_!4(B,A, { T1, T2, B, Text }k(B,A) ); - } -} - -protocol @keysymm-24b(A,B) -{ - role A - { - var T1,T2: Nonce; - var Text: Ticket; - - recv_!1(B,A, { T1, T2, Text }k(A,B) ); - send_!2(A,B, { T1, T2, Text }k(B,A) ); - } - role B - { - var T1,T2: Nonce; - var Text: Ticket; - - recv_!3(A,B, { T1, T2, Text }k(A,B) ); - send_!4(B,A, { T1, T2, Text }k(B,A) ); - } -} - -protocol isoiec-9798-2-4(A,B) -{ - role A - { - var RB: Nonce; - fresh RA: Nonce; - var Text1,Text4,Text5: Ticket; - fresh Text2,Text3: Ticket; - - recv_1(B,A, RB,Text1 ); - claim(A,Running,B,RA,RB,Text2); - send_2(A,B, Text3, { RA, RB, B, Text2 }k(A,B) ); - recv_3(B,A, Text5, { RB, RA, Text4 }k(A,B) ); - - claim(A,Commit,B,RA,RB,Text2,Text4); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - fresh RB: Nonce; - var RA: Nonce; - fresh Text1,Text4,Text5: Ticket; - var Text2,Text3: Ticket; - - send_1(B,A, RB,Text1 ); - recv_2(A,B, Text3, { RA, RB, B, Text2 }k(A,B) ); - claim(B,Running,A,RA,RB,Text2,Text4); - send_3(B,A, Text5, { RB, RA, Text4 }k(A,B) ); - - claim(B,Commit,A,RA,RB,Text2); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-5.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-5.spdl deleted file mode 100644 index 7a98c0d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-5.spdl +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * ttp - * four-pass - * mutual - * - * Modeling notes: - * - The use of TNb in message 4, as specified by the ISO standard, is - * different from other models, in which it was TNa. - */ -usertype SessionKey; - -protocol isoiec-9798-2-5(A,B,P) -{ - role A - { - fresh TVPa: Nonce; - var T: Ticket; - fresh TNa: Nonce; - var TNb: Nonce; - var Kab: SessionKey; - fresh Text1,Text5,Text6: Ticket; - var Text3,Text4,Text7,Text8: Ticket; - - send_1(A,P, TVPa, B, Text1); - recv_2(P,A, Text4, { TVPa, Kab, B, Text3 }k(A,P), T ); - claim(A,Running,B,Kab,Text5); - send_3(A,B, Text6, T, { TNa, B, Text5 }Kab ); - recv_4(B,A, Text8, { TNb, A, Text7 }Kab ); - - claim(A,Commit,B,Kab,Text5,Text7); - claim(A,Secret,Kab); - claim(A,Secret,Text5); - claim(A,Secret,Text7); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - var TNp: Nonce; - var TNa: Nonce; - fresh TNb: Nonce; - var Kab: SessionKey; - fresh Text7,Text8: Ticket; - var Text2,Text5,Text6: Ticket; - - recv_3(A,B, Text6, { TNp, Kab, A, Text2 }k(B,P), { TNa, B, Text5 }Kab ); - claim(B,Running,A,Kab,Text5,Text7); - send_4(B,A, Text8, { TNb, A, Text7 }Kab ); - - claim(B,Commit,A,Kab,Text5); - claim(B,Secret,Kab); - claim(B,Secret,Text5); - claim(B,Secret,Text7); - claim(B,Alive); - claim(B,Weakagree); - } - role P - { - var TVPa: Nonce; - fresh TNp: Nonce; - fresh Kab: SessionKey; - fresh Text2,Text3,Text4: Ticket; - var Text1: Ticket; - - recv_1(A,P, TVPa, B, Text1); - send_2(P,A, Text4, { TVPa, Kab, B, Text3 }k(A,P), - { TNp, Kab, A, Text2 }k(B,P) ); - } -} - -protocol @keysymm25(A,B,P) -{ - role A - { - var TVPN: Nonce; - var Kab: SessionKey; - var Text: Ticket; - - recv_!1(B,A, { TVPN, Kab, B, Text }k(P,A) ); - send_!2(A,B, { TVPN, Kab, B, Text }k(A,P) ); - } - role B - { - } - role P - { - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-6.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-6.spdl deleted file mode 100644 index 703885b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-2-6.spdl +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * symmetric - * ttp - * five-pass - * mutual - * - * MPA Attack reported by Mathuria: - * - Type flaw MPA when in parallel with Abadi-Needham protocol. - * - */ -protocol isoiec-9798-2-6(A,B,P) -{ - role A - { - var Rb: Nonce; - fresh Ra,Rpa: Nonce; - var Kab: SessionKey; - var T: Ticket; - fresh Text2,Text6,Text7: Ticket; - var Text1,Text4,Text5,Text8,Text9: Ticket; - - recv_1(B,A, Rb, Text1); - send_2(A,P, Ra, Rb, B, Text2); - recv_3(P,A, Text5, {Ra,Kab,B,Text4}k(A,P), T ); - claim(A,Running,B,Kab,Text6); - send_4(A,B, Text7, T, {Rpa,Rb,Text6}Kab ); - recv_5(B,A, Text9, {Rb,Rpa,Text8}Kab ); - - claim(A,Commit,B,Kab,Text6,Text8); - claim(A,Secret,Kab); - claim(A,Secret,Text6); - claim(A,Secret,Text8); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - fresh Rb: Nonce; - var Rpa: Nonce; - var Kab: SessionKey; - fresh Text1,Text8,Text9: Ticket; - var Text3,Text6,Text7: Ticket; - - send_1(B,A, Rb, Text1); - recv_4(A,B, Text7, {Rb,Kab,A,Text3}k(B,P), {Rpa,Rb,Text6}Kab ); - claim(B,Running,A,Kab,Text6,Text8); - send_5(B,A, Text9, {Rb,Rpa,Text8}Kab ); - - claim(B,Commit,A,Kab,Text6); - claim(B,Secret,Kab); - claim(B,Secret,Text6); - claim(B,Secret,Text8); - claim(B,Alive); - claim(B,Weakagree); - } - role P - { - var Ra, Rb: Nonce; - fresh Kab: SessionKey; - fresh Text3,Text4,Text5: Ticket; - var Text2: Ticket; - - recv_2(A,P, Ra, Rb, B, Text2); - send_3(P,A, Text5, {Ra,Kab,B,Text4}k(A,P), - {Rb,Kab,A,Text3}k(B,P) ); - } -} - -protocol @keysymm26(A,B,P) -{ - role A - { - var TVPN: Nonce; - var Kab: SessionKey; - var Text: Ticket; - - recv_!1(B,A, { TVPN, Kab, B, Text }k(P,A) ); - send_!2(A,B, { TVPN, Kab, B, Text }k(A,P) ); - } - role B - { - } - role P - { - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-1.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-1.spdl deleted file mode 100644 index 42b5667..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-1.spdl +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * signature - * one-pass - * unilateral - */ -const Cert: Function; - -protocol isoiec-9798-3-1(A,B) -{ - role A - { - fresh TNA: Nonce; - fresh Text1,Text2: Ticket; - - claim(A,Running,B,TNA,Text1); - send_1(A,B, Cert(A),TNA,B,Text2, { TNA, B, Text1 }sk(A) ); - } - role B - { - var TNA: Nonce; - var Text1,Text2: Ticket; - - recv_1(A,B, Cert(A),TNA,B,Text2, { TNA, B, Text1 }sk(A) ); - - claim(B,Commit,A,TNA,Text1); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-2.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-2.spdl deleted file mode 100644 index 97f5c68..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-2.spdl +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * signature - * two-pass - * unilateral - */ -const Cert: Function; - -protocol isoiec-9798-3-2(A,B) -{ - role A - { - var Rb: Nonce; - fresh Ra: Nonce; - var Text1: Ticket; - fresh Text2,Text3: Ticket; - - recv_1(B,A, Rb,Text1 ); - claim(A,Running,B,Ra,Rb,Text2); - send_2(A,B, Cert(A),Ra,Rb,B,Text3, { Ra, Rb, B, Text2 }sk(A) ); - } - role B - { - fresh Rb: Nonce; - var Ra: Nonce; - fresh Text1: Ticket; - var Text2,Text3: Ticket; - - send_1(B,A, Rb,Text1 ); - recv_2(A,B, Cert(A),Ra,Rb,B,Text3, { Ra, Rb, B, Text2 }sk(A) ); - - claim(B,Commit,A,Ra,Rb,Text2); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-3.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-3.spdl deleted file mode 100644 index ca1d944..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-3.spdl +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * signature - * two-pass - * mutual - */ -const Cert: Function; - -protocol isoiec-9798-3-3(A,B) -{ - role A - { - fresh TNA: Nonce; - var TNB: Nonce; - fresh Text1,Text2: Ticket; - var Text3,Text4: Ticket; - - claim(A,Running,B,TNA,Text1); - send_1(A,B, Cert(A), TNA, B,Text2, { TNA, B, Text1 }sk(A) ); - recv_2(B,A, Cert(B), TNB, A,Text4, { TNB, A, Text3 }sk(B) ); - - claim(A,Commit,B,TNB,Text3); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - var TNA: Nonce; - fresh TNB: Nonce; - var Text1,Text2: Ticket; - fresh Text3,Text4: Ticket; - - recv_1(A,B, Cert(A), TNA, B,Text2, { TNA, B, Text1 }sk(A) ); - claim(B,Running,A,TNB,Text3); - send_2(B,A, Cert(B), TNB, A,Text4, { TNB, A, Text3 }sk(B) ); - - claim(B,Commit,A,TNA,Text1); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-4.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-4.spdl deleted file mode 100644 index f8bfbbc..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-4.spdl +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * signature - * three-pass - * mutual - */ -const Cert: Function; - -protocol isoiec-9798-3-4(A,B) -{ - role A - { - var RB: Nonce; - fresh RA: Nonce; - var Text1,Text4,Text5: Ticket; - fresh Text2,Text3: Ticket; - - recv_1(B,A, RB,Text1 ); - claim(A,Running,B,RA,RB,Text2); - send_2(A,B, Cert(B), RA,RB,B,Text3, { RA, RB, B, Text2 }sk(A) ); - recv_3(B,A, Cert(A), RB,RA,A,Text5, { RB, RA, A, Text4 }sk(B) ); - - claim(A,Commit,B,RA,RB,Text2,Text4); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - fresh RB: Nonce; - var RA: Nonce; - fresh Text1,Text4,Text5: Ticket; - var Text2,Text3: Ticket; - - send_1(B,A, RB,Text1 ); - recv_2(A,B, Cert(B), RA,RB,B,Text3, { RA, RB, B, Text2 }sk(A) ); - claim(B,Running,A,RA,RB,Text2,Text4); - send_3(B,A, Cert(A), RB,RA,A,Text5, { RB, RA, A, Text4 }sk(B) ); - - claim(B,Commit,A,RA,RB,Text2); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-5.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-5.spdl deleted file mode 100644 index 237e56f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-5.spdl +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * signature - * two-pass - * mutual - * parallel - */ -const Cert: Function; - -protocol isoiec-9798-3-5(A,B) -{ - role A - { - fresh RA: Nonce; - var RB: Nonce; - fresh Text1,Text3,Text4: Ticket; - var Text2,Text5,Text6: Ticket; - - send_1(A,B, Cert(A), RA,Text1 ); - recv_2(B,A, Cert(B), RB,Text2 ); - recv_3(B,A, RB,RA,A,Text6, { RB, RA, A, Text5 }sk(B) ); - claim(A,Running,B,RA,RB,Text3,Text5); - send_4(A,B, RA,RB,B,Text4, { RA, RB, B, Text3 }sk(A) ); - - claim(A,Commit,B,RA,RB,Text5); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - var RA: Nonce; - fresh RB: Nonce; - var Text1,Text3,Text4: Ticket; - fresh Text2,Text5,Text6: Ticket; - - recv_1(A,B, Cert(A), RA,Text1 ); - send_2(B,A, Cert(B), RB,Text2 ); - claim(B,Running,A,RA,RB,Text5); - send_3(B,A, RB,RA,A,Text6, { RB, RA, A, Text5 }sk(B) ); - recv_4(A,B, RA,RB,B,Text4, { RA, RB, B, Text3 }sk(A) ); - - claim(B,Commit,A,RA,RB,Text3,Text5); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-1.cpp b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-1.cpp deleted file mode 100644 index fb5b93b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-1.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#define NAME isoiec-9798-3-6-1 -#define IA A -#define IB B -#define ResA A,pk(A) -#define ResB B,pk(B) -#define TokenAB Text9,ResA,{Rb,ResA,Text5}sk(T),{Rb,Ra,B,A,Text8}sk(A) -#define TokenBA Ra,Rb,Text3,{B,Ra,Rb,A,Text2}sk(B) -#define TokenTA ResA,ResB,{Rpa,ResB,Text6}sk(T),{Rb,ResA,Text5}sk(T) - -#include "isoiec-9798-3-6.template" - - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-1.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-1.spdl deleted file mode 100644 index 51545a6..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-1.spdl +++ /dev/null @@ -1,69 +0,0 @@ - - -/* - * Modeled from ISO standard - * - * signature - * ttp - * five-pass - * mutual - * - * A initiates and also communicates with T - * - * parameters: - * - * NAME - * IA - * IB - * ResA - * ResB - * TokenAB - * TokenBA (although identical in both cases) - * TokenTA - * - */ -protocol isoiec-9798-3-6-1(A,B,T) -{ - role A - { - fresh Ra,Rpa: Nonce; - fresh Text1,Text4,Text8,Text9: Ticket; - var Rb: Nonce; - var Text2,Text3; - var Text5,Text6,Text7: Ticket; - - send_1(A,B, Ra,A,Text1); - recv_2(B,A, B,Ra,Rb,Text3,{B,Ra,Rb,A,Text2}sk(B)); - send_3(A,T, Rpa,Rb,A,B,Text4); - recv_4(T,A, Text7,A,pk(A),B,pk(B),{Rpa,B,pk(B),Text6}sk(T),{Rb,A,pk(A),Text5}sk(T)); - claim(A,Running,B,Ra,Rb,Text8); - send_5(A,B, Text9,A,pk(A),{Rb,A,pk(A),Text5}sk(T),{Rb,Ra,B,A,Text8}sk(A)); - - claim(A,Commit,B,Ra,Rb,Text2); - claim(A,Alive); - } - role B - { - var Ra,Rpa: Nonce; - var Text1,Text5,Text8,Text9: Ticket; - fresh Text2,Text3,Text4: Ticket; - fresh Rb: Nonce; - - recv_1(A,B, Ra,A,Text1); - claim(B,Running,A,Ra,Rb,Text2); - send_2(B,A, B,Ra,Rb,Text3,{B,Ra,Rb,A,Text2}sk(B)); - recv_5(A,B, Text9,A,pk(A),{Rb,A,pk(A),Text5}sk(T),{Rb,Ra,B,A,Text8}sk(A)); - - claim(B,Commit,A,Ra,Rb,Text8); - claim(B,Alive); - } - role T - { - var Rpa, Rb: Nonce; - var Text4: Ticket; - fresh Text5,Text6,Text7: Ticket; - - recv_3(A,T, Rpa,Rb,A,B,Text4); - send_4(T,A, Text7,A,pk(A),B,pk(B),{Rpa,B,pk(B),Text6}sk(T),{Rb,A,pk(A),Text5}sk(T)); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-2.cpp b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-2.cpp deleted file mode 100644 index d40ca51..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-2.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#define NAME isoiec-9798-3-6-2 -#define IA A -#define IB B -#define ResA A,pk(A) -#define ResB B,pk(B) -#define TokenAB Rpa,Text9,TokenTA,{Rb,Ra,B,A,Text8}sk(A) -#define TokenBA Ra,Rb,Text3,{B,Ra,Rb,A,Text2}sk(B) -#define TokenTA ResA,ResB,{Rpa,Rb,ResA,ResB,Text5}sk(T) - -#include "isoiec-9798-3-6.template" - - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-2.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-2.spdl deleted file mode 100644 index 3debbc7..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6-2.spdl +++ /dev/null @@ -1,69 +0,0 @@ - - -/* - * Modeled from ISO standard - * - * signature - * ttp - * five-pass - * mutual - * - * A initiates and also communicates with T - * - * parameters: - * - * NAME - * IA - * IB - * ResA - * ResB - * TokenAB - * TokenBA (although identical in both cases) - * TokenTA - * - */ -protocol isoiec-9798-3-6-2(A,B,T) -{ - role A - { - fresh Ra,Rpa: Nonce; - fresh Text1,Text4,Text8,Text9: Ticket; - var Rb: Nonce; - var Text2,Text3; - var Text5,Text6,Text7: Ticket; - - send_1(A,B, Ra,A,Text1); - recv_2(B,A, B,Ra,Rb,Text3,{B,Ra,Rb,A,Text2}sk(B)); - send_3(A,T, Rpa,Rb,A,B,Text4); - recv_4(T,A, Text7,A,pk(A),B,pk(B),{Rpa,Rb,A,pk(A),B,pk(B),Text5}sk(T)); - claim(A,Running,B,Ra,Rb,Text8); - send_5(A,B, Rpa,Text9,A,pk(A),B,pk(B),{Rpa,Rb,A,pk(A),B,pk(B),Text5}sk(T),{Rb,Ra,B,A,Text8}sk(A)); - - claim(A,Commit,B,Ra,Rb,Text2); - claim(A,Alive); - } - role B - { - var Ra,Rpa: Nonce; - var Text1,Text5,Text8,Text9: Ticket; - fresh Text2,Text3,Text4: Ticket; - fresh Rb: Nonce; - - recv_1(A,B, Ra,A,Text1); - claim(B,Running,A,Ra,Rb,Text2); - send_2(B,A, B,Ra,Rb,Text3,{B,Ra,Rb,A,Text2}sk(B)); - recv_5(A,B, Rpa,Text9,A,pk(A),B,pk(B),{Rpa,Rb,A,pk(A),B,pk(B),Text5}sk(T),{Rb,Ra,B,A,Text8}sk(A)); - - claim(B,Commit,A,Ra,Rb,Text8); - claim(B,Alive); - } - role T - { - var Rpa, Rb: Nonce; - var Text4: Ticket; - fresh Text5,Text6,Text7: Ticket; - - recv_3(A,T, Rpa,Rb,A,B,Text4); - send_4(T,A, Text7,A,pk(A),B,pk(B),{Rpa,Rb,A,pk(A),B,pk(B),Text5}sk(T)); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6.template b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6.template deleted file mode 100644 index e8b6a80..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-6.template +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Modeled from ISO standard - * - * signature - * ttp - * five-pass - * mutual - * - * A initiates and also communicates with T - * - * parameters: - * - * NAME - * IA - * IB - * ResA - * ResB - * TokenAB - * TokenBA (although identical in both cases) - * TokenTA - * - */ -protocol NAME(A,B,T) -{ - role A - { - fresh Ra,Rpa: Nonce; - fresh Text1,Text4,Text8,Text9: Ticket; - var Rb: Nonce; - var Text2,Text3; - var Text5,Text6,Text7: Ticket; - - send_1(A,B, Ra,IA,Text1); - recv_2(B,A, IB,TokenBA); - send_3(A,T, Rpa,Rb,IA,IB,Text4); - recv_4(T,A, Text7,TokenTA); - claim(A,Running,B,Ra,Rb,Text8); - send_5(A,B, TokenAB); - - claim(A,Commit,B,Ra,Rb,Text2); - claim(A,Alive); - } - role B - { - var Ra,Rpa: Nonce; - var Text1,Text5,Text8,Text9: Ticket; - fresh Text2,Text3,Text4: Ticket; - fresh Rb: Nonce; - - recv_1(A,B, Ra,IA,Text1); - claim(B,Running,A,Ra,Rb,Text2); - send_2(B,A, IB,TokenBA); - recv_5(A,B, TokenAB); - - claim(B,Commit,A,Ra,Rb,Text8); - claim(B,Alive); - } - role T - { - var Rpa, Rb: Nonce; - var Text4: Ticket; - fresh Text5,Text6,Text7: Ticket; - - recv_3(A,T, Rpa,Rb,IA,IB,Text4); - send_4(T,A, Text7,TokenTA); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-1.cpp b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-1.cpp deleted file mode 100644 index fd97211..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-1.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#define NAME isoiec-9798-3-7-1 -#define IA A -#define IB B -#define ResA A,pk(A) -#define ResB B,pk(B) -#define TokenAB Text7,Ra,ResA,{Rb,ResA,Text3}sk(T),{Rb,Ra,B,A,Text6}sk(A) -#define TokenBA Ra,Rb,Text9,{A,Ra,Rb,B,Text8}sk(B) -#define TokenTA ResA,ResB,{Rpa,ResB,Text4}sk(T),{Rb,ResA,Text3}sk(T) - -#include "isoiec-9798-3-7.template" - - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-1.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-1.spdl deleted file mode 100644 index 516ceb0..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-1.spdl +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Modeled from ISO standard - * - * signature - * ttp - * five-pass - * mutual - * - * B initiates and A communicates with T - * - * parameters: - * - * NAME - * IA - * IB - * ResA - * ResB - * TokenAB - * TokenBA (although identical in both cases) - * TokenTA - * - */ -protocol isoiec-9798-3-7-1(A,B,T) -{ - role A - { - fresh Ra,Rpa: Nonce; - var Rb: Nonce; - var Text1,Text3,Text4,Text5,Text8,Text9: Ticket; - fresh Text2,Text6,Text7: Ticket; - - recv_1(B,A, Rb,B,Text1 ); - send_2(A,T, Rpa,Rb,A,Text2 ); - recv_3(T,A, Text5, A,pk(A),B,pk(B),{Rpa,B,pk(B),Text4}sk(T),{Rb,A,pk(A),Text3}sk(T) ); - claim(A,Running,B,Ra,Rb,Text6); - send_4(A,B, A, Text7,Ra,A,pk(A),{Rb,A,pk(A),Text3}sk(T),{Rb,Ra,B,A,Text6}sk(A) ); - recv_5(B,A, Ra,Rb,Text9,{A,Ra,Rb,B,Text8}sk(B) ); - - claim(A,Commit,B,Ra,Rb,Text8); - claim(A,Alive); - } - role B - { - fresh Text1,Text8,Text9: Ticket; - fresh Rb: Nonce; - var Text3,Text4,Text6,Text7: Ticket; - var Ra,Rpa: Nonce; - - send_1(B,A, Rb,B,Text1 ); - recv_4(A,B, A, Text7,Ra,A,pk(A),{Rb,A,pk(A),Text3}sk(T),{Rb,Ra,B,A,Text6}sk(A) ); - claim(B,Running,A,Ra,Rb,Text8); - send_5(B,A, Ra,Rb,Text9,{A,Ra,Rb,B,Text8}sk(B) ); - - claim(B,Commit,A,Ra,Rb,Text6); - claim(B,Alive); - } - role T - { - var Rpa,Rb: Nonce; - var Text2: Ticket; - fresh Text3,Text4,Text5: Ticket; - - recv_2(A,T, Rpa,Rb,A,Text2 ); - send_3(T,A, Text5, A,pk(A),B,pk(B),{Rpa,B,pk(B),Text4}sk(T),{Rb,A,pk(A),Text3}sk(T) ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-2.cpp b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-2.cpp deleted file mode 100644 index 6ca070b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-2.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#define NAME isoiec-9798-3-7-2 -#define IA A -#define IB B -#define ResA A,pk(A) -#define ResB B,pk(B) -#define TokenAB Rpa,Text7,TokenTA,{Rb,Ra,B,A,Text6}sk(A) -#define TokenBA Ra,Rb,Text9,{Ra,Rb,A,B,Text8}sk(B) -#define TokenTA ResA,ResB,{Rpa,Rb,ResA,ResB,Text3}sk(T) - -#include "isoiec-9798-3-7.template" - - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-2.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-2.spdl deleted file mode 100644 index 98ce424..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7-2.spdl +++ /dev/null @@ -1,68 +0,0 @@ - - -/* - * Modeled from ISO standard - * - * signature - * ttp - * five-pass - * mutual - * - * B initiates and A communicates with T - * - * parameters: - * - * NAME - * IA - * IB - * ResA - * ResB - * TokenAB - * TokenBA (although identical in both cases) - * TokenTA - * - */ -protocol isoiec-9798-3-7-2(A,B,T) -{ - role A - { - fresh Ra,Rpa: Nonce; - var Rb: Nonce; - var Text1,Text3,Text4,Text5,Text8,Text9: Ticket; - fresh Text2,Text6,Text7: Ticket; - - recv_1(B,A, Rb,B,Text1 ); - send_2(A,T, Rpa,Rb,A,Text2 ); - recv_3(T,A, Text5, A,pk(A),B,pk(B),{Rpa,Rb,A,pk(A),B,pk(B),Text3}sk(T) ); - claim(A,Running,B,Ra,Rb,Text6); - send_4(A,B, A, Rpa,Text7,A,pk(A),B,pk(B),{Rpa,Rb,A,pk(A),B,pk(B),Text3}sk(T),{Rb,Ra,B,A,Text6}sk(A) ); - recv_5(B,A, Ra,Rb,Text9,{Ra,Rb,A,B,Text8}sk(B) ); - - claim(A,Commit,B,Ra,Rb,Text8); - claim(A,Alive); - } - role B - { - fresh Text1,Text8,Text9: Ticket; - fresh Rb: Nonce; - var Text3,Text4,Text6,Text7: Ticket; - var Ra,Rpa: Nonce; - - send_1(B,A, Rb,B,Text1 ); - recv_4(A,B, A, Rpa,Text7,A,pk(A),B,pk(B),{Rpa,Rb,A,pk(A),B,pk(B),Text3}sk(T),{Rb,Ra,B,A,Text6}sk(A) ); - claim(B,Running,A,Ra,Rb,Text8); - send_5(B,A, Ra,Rb,Text9,{Ra,Rb,A,B,Text8}sk(B) ); - - claim(B,Commit,A,Ra,Rb,Text6); - claim(B,Alive); - } - role T - { - var Rpa,Rb: Nonce; - var Text2: Ticket; - fresh Text3,Text4,Text5: Ticket; - - recv_2(A,T, Rpa,Rb,A,Text2 ); - send_3(T,A, Text5, A,pk(A),B,pk(B),{Rpa,Rb,A,pk(A),B,pk(B),Text3}sk(T) ); - } -} diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7.template b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7.template deleted file mode 100644 index 8d9491a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-3-7.template +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Modeled from ISO standard - * - * signature - * ttp - * five-pass - * mutual - * - * B initiates and A communicates with T - * - * parameters: - * - * NAME - * IA - * IB - * ResA - * ResB - * TokenAB - * TokenBA (although identical in both cases) - * TokenTA - * - */ -protocol NAME(A,B,T) -{ - role A - { - fresh Ra,Rpa: Nonce; - var Rb: Nonce; - var Text1,Text3,Text4,Text5,Text8,Text9: Ticket; - fresh Text2,Text6,Text7: Ticket; - - recv_1(B,A, Rb,IB,Text1 ); - send_2(A,T, Rpa,Rb,IA,Text2 ); - recv_3(T,A, Text5, TokenTA ); - claim(A,Running,B,Ra,Rb,Text6); - send_4(A,B, IA, TokenAB ); - recv_5(B,A, TokenBA ); - - claim(A,Commit,B,Ra,Rb,Text8); - claim(A,Alive); - } - role B - { - fresh Text1,Text8,Text9: Ticket; - fresh Rb: Nonce; - var Text3,Text4,Text6,Text7: Ticket; - var Ra,Rpa: Nonce; - - send_1(B,A, Rb,IB,Text1 ); - recv_4(A,B, IA, TokenAB ); - claim(B,Running,A,Ra,Rb,Text8); - send_5(B,A, TokenBA ); - - claim(B,Commit,A,Ra,Rb,Text6); - claim(B,Alive); - } - role T - { - var Rpa,Rb: Nonce; - var Text2: Ticket; - fresh Text3,Text4,Text5: Ticket; - - recv_2(A,T, Rpa,Rb,IA,Text2 ); - send_3(T,A, Text5, TokenTA ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-1-udkey.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-1-udkey.spdl deleted file mode 100644 index 6a955d0..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-1-udkey.spdl +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * ccf - * one-pass - * unilateral - * - * Unidirectional key version. - * - * Modeling notes: - * - * - The keyed CCF (f_kab(x)) is modeled as f(x,kab) - */ -hashfunction f; - -protocol isoiec-9798-4-1-udkey(A,B) -{ - role A - { - fresh Text1,Text2: Ticket; - fresh TNA: Nonce; - - claim(A,Running,B,TNA,Text1); - send_1(A,B, TNA, Text2, f( TNA, Text1 ,k(A,B) ) ); - } - role B - { - var TNA: Nonce; - var Text1,Text2: Ticket; - - recv_1(A,B, TNA, Text2, f( TNA, Text1 ,k(A,B) ) ); - - claim(B,Commit,A,TNA,Text1); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-1.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-1.spdl deleted file mode 100644 index f3a5b95..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-1.spdl +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010, Feb. 2011. - * - * History: - * - * - v2.0, Feb. 2011: - * Added key symmetry emulation protocol. - * - * ccf - * one-pass - * unilateral - * - * The identifier B is optional and may be omitted if the key is unidirectional. - * - * Modeling notes: - * - * - The keyed CCF (f_kab(x)) is modeled as f(x,kab) - */ -hashfunction f; - -protocol @keysymm-41(A,B) -{ - role A - { - var X,Y,Z: Ticket; - - recv_!1(B,A, f(X,Y,Z, k(A,B) ) ); - send_!2(A,B, f(X,Y,Z, k(B,A) ) ); - } - role B - { - } -} - -protocol isoiec-9798-4-1(A,B) -{ - role A - { - fresh Text1,Text2: Ticket; - fresh TNA: Nonce; - - claim(A,Running,B,TNA,Text1); - send_1(A,B, TNA, Text2, f( TNA, B, Text1 ,k(A,B) ) ); - } - role B - { - var TNA: Nonce; - var Text1,Text2: Ticket; - - recv_1(A,B, TNA, Text2, f( TNA, B, Text1 ,k(A,B) ) ); - - claim(B,Commit,A,TNA,Text1); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-2-udkey.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-2-udkey.spdl deleted file mode 100644 index c1e292f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-2-udkey.spdl +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * ccf - * unilateral - * two-pass - * - * Unidirectional key version. - * - * Modeling notes: - * - * - The keyed CCF (f_kab(x)) is modeled as f(x,kab) - */ -hashfunction f; - -protocol isoiec-9798-4-2-udkey(A,B) -{ - role A - { - var Rb: Nonce; - var Text1: Ticket; - fresh Text2,Text3: Ticket; - - recv_1(B,A, Rb,Text1 ); - claim(A,Running,B,Rb,Text2); - send_2(A,B, Text3, f( Rb, Text2, k(A,B)) ); - } - role B - { - fresh Rb: Nonce; - fresh Text1: Ticket; - var Text2,Text3: Ticket; - - send_1(B,A, Rb,Text1 ); - recv_2(A,B, Text3, f( Rb, Text2, k(A,B)) ); - - claim(B,Commit,A,Rb,Text2); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-2.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-2.spdl deleted file mode 100644 index d2bd4a9..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-2.spdl +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010, Feb. 2011. - * - * History: - * - * - v2.0, Feb. 2011: - * Added key symmetry emulation protocol. - * - * ccf - * unilateral - * two-pass - * - * The identifier B is optional and may be omitted if the key is unidirectional. - * - * Modeling notes: - * - * - The keyed CCF (f_kab(x)) is modeled as f(x,kab) - */ -hashfunction f; - -protocol @keysymm-42(A,B) -{ - role A - { - var X,Y,Z: Ticket; - - recv_!1(B,A, f(X,Y,Z, k(A,B) ) ); - send_!2(A,B, f(X,Y,Z, k(B,A) ) ); - } - role B - { - } -} - -protocol isoiec-9798-4-2(A,B) -{ - role A - { - var Rb: Nonce; - var Text1: Ticket; - fresh Text2,Text3: Ticket; - - recv_1(B,A, Rb,Text1 ); - claim(A,Running,B,Rb,Text2); - send_2(A,B, Text3, f( Rb, B, Text2, k(A,B)) ); - } - role B - { - fresh Rb: Nonce; - fresh Text1: Ticket; - var Text2,Text3: Ticket; - - send_1(B,A, Rb,Text1 ); - recv_2(A,B, Text3, f( Rb, B, Text2, k(A,B)) ); - - claim(B,Commit,A,Rb,Text2); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-3-udkey.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-3-udkey.spdl deleted file mode 100644 index 4371591..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-3-udkey.spdl +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * ccf - * two-pass - * mutual - * - * Unidirectional key version. - * - * Modeling notes: - * - * - The keyed CCF (f_kab(x)) is modeled as f(x,kab) - */ -hashfunction f; - -protocol isoiec-9798-4-3-udkey(A,B) -{ - role A - { - fresh Text1,Text2: Ticket; - var Text3,Text4: Ticket; - fresh TNa: Nonce; - var TNb: Nonce; - - claim(A,Running,B,TNa,Text1); - send_1(A,B, TNa, Text2, f(TNa,Text1, k(A,B) ) ); - recv_2(B,A, TNb, Text4, f(TNb,Text3, k(B,A) ) ); - - claim(A,Commit,B,TNb,Text3); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - var TNa: Nonce; - fresh TNb: Nonce; - var Text1,Text2: Ticket; - fresh Text3,Text4: Ticket; - - recv_1(A,B, TNa, Text2, f(TNa,Text1, k(A,B) ) ); - claim(B,Running,A,TNb,Text3); - send_2(B,A, TNb, Text4, f(TNb,Text3, k(B,A) ) ); - - claim(B,Commit,A,TNa,Text1); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-3.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-3.spdl deleted file mode 100644 index a5902e2..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-3.spdl +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010, Feb. 2011. - * - * History: - * - * - v2.0, Feb. 2011: - * Added key symmetry emulation protocol. - * - * ccf - * two-pass - * mutual - * - * The identifiers B,A are optional and may be (independently) be omitted if the key is unidirectional. - * - * Modeling notes: - * - * - The keyed CCF (f_kab(x)) is modeled as f(x,kab) - */ -hashfunction f; - -protocol @keysymm-43(A,B) -{ - role A - { - var X,Y,Z: Ticket; - - recv_!1(B,A, f(X,Y,Z, k(A,B) ) ); - send_!2(A,B, f(X,Y,Z, k(B,A) ) ); - } - role B - { - } -} - -protocol isoiec-9798-4-3(A,B) -{ - role A - { - fresh Text1,Text2: Ticket; - var Text3,Text4: Ticket; - fresh TNa: Nonce; - var TNb: Nonce; - - claim(A,Running,B,TNa,Text1); - send_1(A,B, TNa, Text2, f(TNa,B,Text1, k(A,B) ) ); - recv_2(B,A, TNb, Text4, f(TNb,A,Text3, k(A,B) ) ); - - claim(A,Commit,B,TNb,Text3); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - var TNa: Nonce; - fresh TNb: Nonce; - var Text1,Text2: Ticket; - fresh Text3,Text4: Ticket; - - recv_1(A,B, TNa, Text2, f(TNa,B,Text1, k(A,B) ) ); - claim(B,Running,A,TNb,Text3); - send_2(B,A, TNb, Text4, f(TNb,A,Text3, k(A,B) ) ); - - claim(B,Commit,A,TNa,Text1); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-4-udkey.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-4-udkey.spdl deleted file mode 100644 index 27e5466..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-4-udkey.spdl +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010 - * - * ccf - * mutual - * three-pass - * - * Unidirectional key version. - * - * Modeling notes: - * - * - The keyed CCF (f_kab(x)) is modeled as f(x,kab) - */ -hashfunction f; - -protocol isoiec-9798-4-4-udkey(A,B) -{ - role A - { - fresh Ra: Nonce; - var Rb: Nonce; - var Text1,Text4,Text5: Ticket; - fresh Text2,Text3: Ticket; - - recv_1(B,A, Rb, Text1 ); - claim(A,Running,B,Ra,Rb,Text2); - send_2(A,B, Ra, Text3, f(Ra,Rb,Text2, k(A,B) ) ); - recv_3(B,A, Text5, f(Rb,Ra,Text4, k(B,A) ) ); - - claim(A,Commit,B,Ra,Rb,Text2,Text4); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - var Ra: Nonce; - fresh Rb: Nonce; - fresh Text1,Text4,Text5: Ticket; - var Text2,Text3: Ticket; - - send_1(B,A, Rb, Text1 ); - recv_2(A,B, Ra, Text3, f(Ra,Rb,Text2, k(A,B) ) ); - claim(B,Running,A,Ra,Rb,Text2,Text4); - send_3(B,A, Text5, f(Rb,Ra,Text4, k(B,A) ) ); - - claim(B,Commit,A,Ra,Rb,Text2); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-4.spdl b/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-4.spdl deleted file mode 100644 index f796369..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ISO-9798/isoiec-9798-4-4.spdl +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Modeled from ISO/IEC 9798 - * Modeler: Cas Cremers, Dec. 2010, Feb. 2011. - * - * History: - * - * - v2.0, Feb. 2011: - * Added key symmetry emulation protocol. - * - * ccf - * mutual - * three-pass - * - * The identifier B is optional and may be omitted if the key is unidirectional. - * - * Modeling notes: - * - * - The keyed CCF (f_kab(x)) is modeled as f(x,kab) - */ -hashfunction f; - -protocol @keysymm-44(A,B) -{ - role A - { - var X,Y,Z: Ticket; - - recv_!1(B,A, f(X,Y,Z, k(A,B) ) ); - send_!2(A,B, f(X,Y,Z, k(B,A) ) ); - } - role B - { - var X,Y,Z,ZZ: Ticket; - - recv_!3(A,B, f(X,Y,Z,ZZ, k(A,B) ) ); - send_!4(B,A, f(X,Y,Z,ZZ, k(B,A) ) ); - } -} - -protocol isoiec-9798-4-4(A,B) -{ - role A - { - fresh Ra: Nonce; - var Rb: Nonce; - var Text1,Text4,Text5: Ticket; - fresh Text2,Text3: Ticket; - - recv_1(B,A, Rb, Text1 ); - claim(A,Running,B,Ra,Rb,Text2); - send_2(A,B, Ra, Text3, f(Ra,Rb,B,Text2, k(A,B) ) ); - recv_3(B,A, Text5, f(Rb,Ra,Text4, k(A,B) ) ); - - claim(A,Commit,B,Ra,Rb,Text2,Text4); - claim(A,Alive); - claim(A,Weakagree); - } - role B - { - var Ra: Nonce; - fresh Rb: Nonce; - fresh Text1,Text4,Text5: Ticket; - var Text2,Text3: Ticket; - - send_1(B,A, Rb, Text1 ); - recv_2(A,B, Ra, Text3, f(Ra,Rb,B,Text2, k(A,B) ) ); - claim(B,Running,A,Ra,Rb,Text2,Text4); - send_3(B,A, Text5, f(Rb,Ra,Text4, k(A,B) ) ); - - claim(B,Commit,A,Ra,Rb,Text2); - claim(B,Alive); - claim(B,Weakagree); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/BKE.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/BKE.spdl deleted file mode 100644 index 8342bd6..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/BKE.spdl +++ /dev/null @@ -1,40 +0,0 @@ -/* - Bilateral Key Exchange with Public Key protocol (BKEPK) -*/ - -usertype SessionKey; - -hashfunction hash; - -protocol bke(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir: SessionKey; - - send_1 (I,R, { ni,I }pk(R) ); - recv_2 (R,I, { hash(ni),nr,R,kir }pk(I) ); - send_3 (I,R, { hash(nr) }kir ); - claim_4 (I, Secret, kir ); - //claim_5 (I, Niagree ); - //claim_6 (I, Nisynch ); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - fresh kir: SessionKey; - - recv_1 (I,R, { ni,I }pk(R) ); - send_2 (R,I, { hash(ni),nr,R,kir }pk(I) ); - recv_3 (I,R, { hash(nr) }kir ); - claim_7 (R, Secret, kir ); - //claim_8 (R, Niagree ); - //claim_9 (R, Nisynch ); - } -} - - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-ban-concrete.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-ban-concrete.spdl deleted file mode 100644 index 48f52d8..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-ban-concrete.spdl +++ /dev/null @@ -1,67 +0,0 @@ -# BAN concrete Andrew Secure RPC -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/andrewBAN2.html -# -# Note: -# The shared key between I and R is modelled as k(I,R) currently -# there is no way to express that this key is equal to k(R,I) -# In order to overcome this a 'dummy' role X has been hadded that recrypts -# a given term crypted with k(I,R) with k(R,I) -# -# Note: -# Recv 4 by the Initatior has been placed after the synchronisation claim -# as it allows trivial synchronisation attacks otherwise (the message is -# completely fresh and can therefore always be replaced by an arbitrary value -# created by the intruder) which are not considered in SPORE -# - -usertype SessionKey; -const Fresh: Function; - -protocol @swapkey(X) -{ - # Protocol added to work around the symmetry problems where k(I,R) != k(R,I) - role X - { - var I,R: Agent; - var T:Ticket; - recv_!X1(X,X,I,R,{T}k(I,R)); - send_!X2(X,X,{T}k(R,I)); - } -} - -protocol andrew-Concrete(I,R) -{ - - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir: SessionKey; - - send_1(I,R, I,ni ); - recv_2(R,I, {ni,kir}k(I,R) ); - send_3(I,R, {ni}kir); - claim_I1(I,Secret,kir); - claim_I2(I,Nisynch); - claim_I3(I,Empty,(Fresh,kir)); - recv_6(R,I, nr); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - fresh kir: SessionKey; - - recv_1(I,R, I,ni ); - send_2(R,I, {ni,kir}k(I,R) ); - recv_3(I,R, {ni}kir); - send_6(R,I, nr); - claim_R1(R,Secret,kir); - claim_R2(R,Nisynch); - claim_R3(R,Empty,(Fresh,kir)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-ban.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-ban.spdl deleted file mode 100644 index 5118604..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-ban.spdl +++ /dev/null @@ -1,52 +0,0 @@ -# BAN modified Andrew Secure RPC -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/andrewBAN.html -# -# Note: -# The shared key between I and R is modelled as k(I,R) currently -# there is no way to express that this key is equal to k(R,I) -# So it is possile that certain attacks that use this property are not found -# -# Note: -# According to SPORE there are no known attacks on this protocol -# -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol andrew-Ban(I,R) -{ - role I - { - fresh ni: Nonce; - var nr,nr2: Nonce; - var kir: SessionKey; - - send_1(I,R, I,{ni}k(I,R) ); - recv_2(R,I, {ni,nr}k(I,R) ); - send_3(I,R, {nr}k(I,R) ); - recv_4(R,I, {kir,nr2,ni}k(I,R) ); - claim_I1(I,Nisynch); - claim_I2(I,Niagree); - claim_I3(I,Secret, kir); - claim_I5(I,Empty, (Fresh,kir)); - } - - role R - { - var ni: Nonce; - fresh nr,nr2: Nonce; - fresh kir: SessionKey; - - recv_1(I,R, I,{ni}k(I,R) ); - send_2(R,I, {ni,nr}k(I,R) ); - recv_3(I,R, {nr}k(I,R) ); - send_4(R,I, {kir,nr2,ni}k(I,R) ); - claim_R1(R,Nisynch); - claim_R2(R,Niagree); - claim_R3(R,Secret, kir); - claim_R5(R,Empty, (Fresh,kir)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-lowe-ban.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-lowe-ban.spdl deleted file mode 100644 index 04e15f2..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/andrew-lowe-ban.spdl +++ /dev/null @@ -1,57 +0,0 @@ -# Lowe modified BAN concrete Andrew Secure RPC -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/andrewLowe.html -# -# Note: -# The shared key between I and R is modelled as k(I,R) currently -# there is no way to express that this key is equal to k(R,I) -# So it is possile that certain attacks that use this property are not found -# -# Note: -# Recv 4 by the Initatior has been placed after the synchronisation claim -# as it allows trivial synchronisation attacks otherwise (the message is -# completely fresh and can therefore always be replaced by an arbitrary value -# created by the intruder) which are not considered in SPORE -# -# Note: -# According to SPORE there are no known attacks on this protocol -# - -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol andrew-LoweBan(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir: SessionKey; - - send_1(I,R, I,ni ); - recv_2(R,I, {ni,kir,R}k(I,R) ); - send_3(I,R, {ni}kir ); - claim_I1(I,Nisynch); - claim_I2(I,Secret, kir); - claim_I3(I,Empty, (Fresh,kir)); - recv_4(R,I, nr ); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - fresh kir: SessionKey; - - recv_1(I,R, I,ni ); - send_2(R,I, {ni,kir,R}k(I,R) ); - recv_3(I,R, {ni}kir ); - send_4(R,I, nr ); - claim_R1(R,Nisynch); - claim_R2(R,Secret, kir); - claim_R3(R,Empty, (Fresh,kir)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/boyd.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/boyd.spdl deleted file mode 100644 index 0a9c755..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/boyd.spdl +++ /dev/null @@ -1,56 +0,0 @@ -usertype Sessionkey; -usertype Macseed; -const m: Function; -secret unm: Function; -const f: Function; - -inversekeys (m, unm); - -/* - * Boyd key agreement - * - * Boyd & Mathuria: Protocols for authentication and key establishment - * (2003) p. 101 - * - * Note that MAC_ks(x) has been interpreted as MAC(x,ks); this - * assumption causes some possible false attacks. - */ - -protocol boyd(I,R,S) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - var ks: Macseed; - - send_1 (I,S, I,R, ni ); - recv_3 (R,I, { I,R, ks }k(I,S), m(ni, m(ks,ni,nr)), nr ); - send_4 (I,R, m(nr, m(ks,ni,nr)) ); - - claim_6 (I, Secret, m(ks,ni,nr) ); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - var ks: Macseed; - - recv_2 (S,R, { I,R, ks }k(I,S), { I,R, ks }k(R,S), ni ); - send_3 (R,I, { I,R, ks }k(I,S), m(ni, m(ks,ni,nr)), nr ); - recv_4 (I,R, m(nr, m(ks,ni,nr)) ); - - claim_10 (R, Secret, m(ks,ni,nr)); - } - - role S - { - var ni,nr: Nonce; - fresh ks: Macseed; - - recv_1 (I,S, I,R, ni ); - send_2 (S,R, { I,R, ks }k(I,S), { I,R, ks }k(R,S), ni ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ccitt509-ban3.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ccitt509-ban3.spdl deleted file mode 100644 index bdf146d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ccitt509-ban3.spdl +++ /dev/null @@ -1,39 +0,0 @@ -# BAN modified version of CCITT X.509 (3) -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/ccittx509_3BAN.html -# -# Note: -# The protocol description also states that Xa and Ya should be fresh -# this can not be verified using scyther -# -# Note: -# According to SPORE there are no known attacks on this protocol -# - -protocol ccitt509-ban3(I,R) -{ - role I - { - fresh Na,Xa,Ya: Nonce; - var Xb,Nb,Yb: Nonce; - - send_1(I,R, I,{Na, R, Xa,{Ya}pk(R)}sk(I)); - recv_2(R,I, R,{Nb, I, Na, Xb,{Yb}pk(I)}sk(R)); - send_3(I,R, I,{R, Nb}sk(I)); - claim_4(I,Nisynch); - } - - role R - { - var Na,Xa,Ya: Nonce; - fresh Xb,Yb,Nb: Nonce; - - recv_1(I,R, I,{Na, R, Xa,{Ya}pk(R)}sk(I)); - send_2(R,I, R,{Nb, I, Na, Xb,{Yb}pk(I)}sk(R)); - recv_3(I,R, I,{R, Nb}sk(I)); - claim_5(R,Nisynch); - # There should also be Fresh Xa and Fresh Ya claims here - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/denning-sacco-lowe.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/denning-sacco-lowe.spdl deleted file mode 100644 index d5c3182..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/denning-sacco-lowe.spdl +++ /dev/null @@ -1,66 +0,0 @@ -# Lowe modified Denning-Sacco shared key -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/denningSaccoLowe.html -# -# Note: -# According to SPORE there are no attacks on this protocol, scyther -# finds one however. This has to be investigated further. - -usertype Key; -usertype SessionKey; -usertype TimeStamp; -usertype ExpiredTimeStamp; -usertype PseudoFunction; -const dec: PseudoFunction; -const Fresh: Function; -const Compromised: Function; - -protocol denningSacco-Lowe(I,R,S) -{ - role I - { - var W: Ticket; - var Kir: SessionKey; - var T: TimeStamp; - var Nr: Nonce; - - send_1(I,S, I,R ); - recv_2(S,I, {R, Kir, T, W}k(I,S) ); - send_3(I,R, W); - recv_4(R,I, {Nr}Kir); - send_5(I,R, {{Nr}dec}Kir); - claim_I1(I,Niagree); - claim_I2(I,Nisynch); - claim_I3(I,Secret,Kir); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - var Kir: SessionKey; - var T: TimeStamp; - fresh Nr: Nonce; - - recv_3(I,R, {Kir,I,T}k(R,S)); - send_4(R,I, {Nr}Kir); - recv_5(I,R, {{Nr}dec}Kir); - claim_R1(R,Niagree); - claim_R2(R,Nisynch); - claim_R3(R,Secret,Kir); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var W: Ticket; - fresh Kir: SessionKey; - fresh T: TimeStamp; - - recv_1(I,S, I,R ); - send_2(S,I, {R, Kir, T, {Kir, I,T}k(R,S)}k(I,S)); - claim_x(S, Secret, Kir); - } -} - - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/denning-sacco.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/denning-sacco.spdl deleted file mode 100644 index 00167e9..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/denning-sacco.spdl +++ /dev/null @@ -1,55 +0,0 @@ -# Denning-Sacco shared key -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/denningSacco.html -# - -usertype Key; -usertype SessionKey; -usertype TimeStamp; -usertype ExpiredTimeStamp; -const Fresh: Function; -const Compromised: Function; - -protocol denningSacco(I,R,S) -{ - role I - { - var W: Ticket; - var Kir: SessionKey; - var T: TimeStamp; - - send_1(I,S, I,R ); - recv_2(S,I, {R, Kir, T, W}k(I,S) ); - send_3(I,R, W); - claim_I1(I,Niagree); - claim_I2(I,Nisynch); - claim_I3(I,Secret,Kir); - claim_I4(I,Empty, (Fresh,Kir)); - } - - role R - { - var Kir: SessionKey; - var T: TimeStamp; - - recv_3(I,R, {Kir,I,T}k(R,S)); - claim_R1(R,Niagree); - claim_R2(R,Nisynch); - claim_R3(R,Secret,Kir); - claim_R4(R,Empty, (Fresh,Kir)); - } - - role S - { - var W: Ticket; - fresh Kir: SessionKey; - fresh T: TimeStamp; - - recv_1(I,S, I,R ); - send_2(S,I, {R, Kir, T, {Kir, I,T}k(R,S)}k(I,S)); - } -} - - - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/gong-nonce-b.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/gong-nonce-b.spdl deleted file mode 100644 index 09bde6d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/gong-nonce-b.spdl +++ /dev/null @@ -1,60 +0,0 @@ -usertype Sessionkey; -usertype Keypart; -hashfunction f; - -/* - * Gong nonce based alternative - * - * Boyd & Mathuria: Protocols for authentication and key establishment - * (2003) p. 101 - */ - -protocol gongnonceb(I,R,S) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - fresh ki: Keypart; - var kr: Keypart; - - send_1 (I,S, I,R, { I,S,I, ki, R }k(I,S), ni ); - recv_4 (S,I, { S,I,R,kr,I }k(I,S), { R,I,ni }f(ki,kr), nr ); - send_5 (I,R, { I,R,nr }f(ki,kr) ); - - claim_6 (I, Secret, ki); - claim_7 (I, Secret, kr); - claim_8 (I, Nisynch); - claim_9 (I, Niagree); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - fresh kr: Keypart; - var ki: Keypart; - - recv_2 (S,R, I,R, { S,R,I, ki, R }k(R,S), ni ); - send_3 (R,S, { R,S,R,kr,I }k(R,S), { R,I, ni }f(ki,kr), nr ); - recv_5 (I,R, { I,R,nr }f(ki,kr) ); - - claim_10 (R, Secret, ki); - claim_11 (R, Secret, kr); - claim_12 (R, Nisynch); - claim_13 (R, Niagree); - } - - role S - { - var ni,nr: Nonce; - var ki,kr: Keypart; - var T; - - recv_1 (I,S, I,R, { I,S,I, ki, R }k(I,S), ni ); - send_2 (S,R, I,R, { S,R,I, ki, R }k(R,S), ni ); - recv_3 (R,S, { R,S,R,kr,I }k(R,S), T, nr ); - send_4 (S,I, { S,I,R,kr,I }k(I,S), T, nr ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/gong-nonce.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/gong-nonce.spdl deleted file mode 100644 index 594e1b9..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/gong-nonce.spdl +++ /dev/null @@ -1,57 +0,0 @@ -/* - * From Boyd Mathuria - * - * To check: 3.38 or other? - * - */ -usertype Sessionkey; -usertype Keypart; - -protocol gongnonce(I,R,S) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - fresh ki: Keypart; - var kr: Keypart; - - send_1 (I,R, I,R,ni ); - recv_3 (S,I, { S,I,R, kr, I, ni }k(I,S), nr); - send_4 (I,S, { I,S,I, ki, R, nr }k(I,S) ); - - claim_6 (I, Secret, ki); - claim_7 (I, Secret, kr); - claim_8 (I, Nisynch); - claim_9 (I, Niagree); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - fresh kr: Keypart; - var ki: Keypart; - - recv_1 (I,R, I,R,ni ); - send_2 (R,S, I,R, nr, { R,S,R, kr, I,ni }k(R,S)); - recv_5 (S,R, { S,R,I, ki, R, nr }k(R,S) ); - - claim_10 (R, Secret, ki); - claim_11 (R, Secret, kr); - claim_12 (R, Nisynch); - claim_13 (R, Niagree); - } - - role S - { - var ni,nr: Nonce; - var ki,kr: Keypart; - - recv_2 (R,S, I,R, nr, { R,S,R, kr, I,ni }k(R,S)); - send_3 (S,I, { S,I,R, kr, I, ni }k(I,S), nr); - recv_4 (I,S, { I,S,I, ki, R, nr }k(I,S) ); - send_5 (S,R, { S,R,I, ki, R, nr }k(R,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/isoiec11770-2-13.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/isoiec11770-2-13.spdl deleted file mode 100644 index 5db1533..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/isoiec11770-2-13.spdl +++ /dev/null @@ -1,42 +0,0 @@ -usertype Sessionkey; -usertype Ticket; - -protocol isoiec11770213(I,R,S) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir: Sessionkey; - - send_1 (I,R, ni); - recv_4 (R,I, { ni,kir,R }k(I,S) ); - - claim_5 (I, Secret, kir); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - fresh kir: Sessionkey; - var T; - - recv_1 (I,R, ni); - send_2 (R,S, { nr,ni,I,kir }k(R,S) ); - recv_3 (S,R, { nr, I }k(R,S), T ); - send_4 (R,I, T ); - - claim_6 (R, Secret, kir); - } - - role S - { - var ni,nr: Nonce; - var kir: Sessionkey; - - recv_2 (R,S, { nr,ni,I,kir }k(R,S) ); - send_3 (S,R, { nr, I }k(R,S), { ni,kir,R }k(I,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow-v2.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow-v2.spdl deleted file mode 100644 index 638a54b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow-v2.spdl +++ /dev/null @@ -1,55 +0,0 @@ -# Kao Chow Authentication v.2 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/kaoChow2.html -# - -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol kaochow-2(I,R,S) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir,kt: SessionKey; - - send_1 (I,S, I,R,ni); - recv_3 (R,I, R, {I,R,ni,kir,kt}k(I,S), {ni, kir}kt, nr ); - send_4 (I,R, {nr,kir}kt ); - - claim_I1 (I, Nisynch); - claim_I2 (I, Niagree); - claim_I3 (I, Secret, kir); - claim_I4 (I, Empty, (Fresh,kir)); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - var kir,kt: SessionKey; - var T: Ticket; - - recv_2 (S,R, T, { I,R,ni,kir,kt }k(R,S) ); - send_3 (R,I, R, T, {ni, kir}kt, nr ); - recv_4 (I,R, {nr,kir}kt ); - - claim_R1 (R, Nisynch); - claim_R2 (R, Niagree); - claim_R3 (R, Secret, kir); - claim_R4 (R, Empty, (Fresh,kir)); - } - - role S - { - var ni: Nonce; - fresh kir, kt: SessionKey; - - recv_1 (I,S, I,R,ni); - send_2 (S,R, {I,R,ni,kir,kt}k(I,S), { I,R,ni,kir,kt }k(R,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow-v3.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow-v3.spdl deleted file mode 100644 index 88cef24..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow-v3.spdl +++ /dev/null @@ -1,59 +0,0 @@ -# Kao Chow Authentication v.3 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/kaoChow3.html -# - -usertype SessionKey; -usertype ExpiredTimeStamp; -usertype TimeStamp; -const Fresh: Function; -const Compromised: Function; - -protocol kaochow-3(I,R,S) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir,kt: SessionKey; - var T2: Ticket; - - send_1 (I,S, I,R,ni); - recv_3 (R,I, {I,R,ni,kir,kt}k(I,S), {ni, kir}kt, nr, T2 ); - send_4 (I,R, {nr,kir}kt, T2 ); - - claim_I1 (I, Nisynch); - claim_I2 (I, Niagree); - claim_I3 (I, Secret, kir); - claim_I4 (I, Empty, (Fresh,kir)); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - var kir,kt: SessionKey; - var T: Ticket; - fresh tr: TimeStamp; - - recv_2 (S,R, T, { I,R,ni,kir,kt }k(R,S) ); - send_3 (R,I, T, {ni, kir}kt, nr, {I,R,tr,kir}k(R,S) ); - recv_4 (I,R, {nr,kir}kt, {I,R,tr,kir}k(R,S) ); - - claim_R1 (R, Nisynch); - claim_R2 (R, Niagree); - claim_R3 (R, Secret, kir); - claim_R4 (R, Empty, (Fresh,kir)); - } - - role S - { - var ni: Nonce; - fresh kir, kt: SessionKey; - - recv_1 (I,S, I,R,ni); - send_2 (S,R, {I,R,ni,kir,kt}k(I,S), { I,R,ni,kir,kt }k(R,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow.spdl deleted file mode 100644 index 1c6c827..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/kaochow.spdl +++ /dev/null @@ -1,55 +0,0 @@ -# Kao Chow Authentication v.1 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/kaoChow1.html -# - -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol kaochow(I,R,S) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir: SessionKey; - - send_1 (I,S, I,R,ni); - recv_3 (R,I, {I,R,ni,kir}k(I,S), {ni}kir, nr ); - send_4 (I,R, {nr}kir ); - - claim_I1 (I, Nisynch); - claim_I2 (I, Niagree); - claim_I3 (I, Secret, kir); - claim_I4 (I, Empty, (Fresh,kir)); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - var kir: SessionKey; - var T; - - recv_2 (S,R, T, { I,R,ni,kir }k(R,S) ); - send_3 (R,I, T, {ni}kir, nr ); - recv_4 (I,R, {nr}kir ); - - claim_R1 (R, Nisynch); - claim_R2 (R, Niagree); - claim_R3 (R, Secret, kir); - claim_R4 (R, Empty, (Fresh,kir)); - } - - role S - { - var ni: Nonce; - fresh kir: SessionKey; - - recv_1 (I,S, I,R,ni); - send_2 (S,R, {I,R,ni,kir}k(I,S), { I,R,ni,kir }k(R,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ksl.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ksl.spdl deleted file mode 100644 index 3595cf2..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ksl.spdl +++ /dev/null @@ -1,75 +0,0 @@ -# KSL -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/ksl.html -# -# - - -usertype Server, SessionKey, TimeStamp, TicketKey; -usertype ExpiredTimeStamp; - -const Fresh: Function; -const Compromised: Function; - - - -protocol ksl(I,R,S) -{ - role I - { - fresh Ni, Mi: Nonce; - var Nc, Mr: Nonce; - var T: Ticket; - var Kir: SessionKey; - - send_1(I,R, Ni, I); - recv_4(R,I, { Ni,R,Kir }k(I,S), T, Nc, {Ni}Kir ); - send_5(I,R, { Nc }Kir ); - - send_6(I,R, Mi,T ); - recv_7(R,I, Mr,{Mi}Kir ); - send_8(I,R, {Mr}Kir ); - - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - claim_I4(I,Empty, (Fresh, Kir)); - } - - role R - { - var Ni,Mi: Nonce; - fresh Nr,Nc,Mr: Nonce; - var Kir: SessionKey; - fresh Kbb: TicketKey; - fresh Tr: TimeStamp; - var T: Ticket; - - recv_1(I,R, Ni, I); - send_2(R,S, Ni, I, Nr, R ); - recv_3(S,R, { Nr, I, Kir }k(R,S), T ); - send_4(R,I, T, { Tr, I, Kir }Kbb, Nc, {Ni}Kir ); - recv_5(I,R, { Nc }Kir ); - - recv_6(I,R, Mi,{ Tr, I, Kir }Kbb ); - send_7(R,I, Mr,{Mi}Kir ); - recv_8(I,R, {Mr}Kir ); - - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var Ni, Nr: Nonce; - fresh Kir: SessionKey; - - recv_2(R,S, Ni, I, Nr, R ); - send_3(S,R, { Nr, I, Kir }k(R,S), { Ni,R,Kir }k(I,S) ); - } -} - - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/needham-schroeder-sk-amend.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/needham-schroeder-sk-amend.spdl deleted file mode 100644 index 189093d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/needham-schroeder-sk-amend.spdl +++ /dev/null @@ -1,66 +0,0 @@ -# Amended Needham Schroeder Symmetric Key -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/nssk_amended.html -# -# -# Note: -# According to SPORE there are no attacks on this protocol, scyther -# finds one however. This has to be investigated further. - - - -# Model dec that is invertible by inc -const dec,inc: Function; -inversekeys(dec,inc); -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol needhamschroedersk-amend(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var Kir: SessionKey; - var T,T2: Ticket; - - send_1(I,R,I); - recv_2(R,I,T); - send_3(I,S,(I,R,Ni,T)); - recv_4(S,I, {Ni,R,Kir,T2}k(I,S)); - send_5(I,R,T2); - recv_6(R,I,{Nr}Kir); - send_7(I,R,{{Nr}dec}Kir); - - claim_I2(I,Secret,Kir); - claim_I3(I,Nisynch); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - fresh Nr: Nonce; - var Kir: SessionKey; - - recv_1(I,R,I); - send_2(R,I,{I,Nr}k(R,S)); - recv_5(I,R,{Kir,Nr,I}k(R,S)); - send_6(R,I,{Nr}Kir); - recv_7(I,R,{{Nr}dec}Kir); - claim_R1(R,Secret,Nr); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var Ni,Nr: Nonce; - fresh Kir: SessionKey; - recv_3(I,S,(I,R,Ni,{I,Nr}k(R,S))); - send_4(S,I,{Ni,R,Kir,{Kir,Nr,I}k(R,S)}k(I,S)); - } - -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/needham-schroeder-sk.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/needham-schroeder-sk.spdl deleted file mode 100644 index 71a7e6c..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/needham-schroeder-sk.spdl +++ /dev/null @@ -1,56 +0,0 @@ -# Needham Schroeder Symmetric Key -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/nssk.html -# -# - - -# Model dec that is invertible by inc -const dec,inc: Function; -inversekeys(dec,inc); -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol needhamschroedersk(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var Kir: SessionKey; - var T: Ticket; - - send_1(I,S,(I,R,Ni)); - recv_2(S,I, {Ni,R,Kir,T}k(I,S)); - send_3(I,R,T); - recv_4(R,I,{Nr}Kir); - send_5(I,R,{{Nr}dec}Kir); - claim_I2(I,Secret,Kir); - claim_I3(I,Nisynch); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - fresh Nr: Nonce; - var Kir: SessionKey; - - recv_3(I,R,{Kir,I}k(R,S)); - send_4(R,I,{Nr}Kir); - recv_5(I,R,{{Nr}dec}Kir); - claim_R1(R,Secret,Kir); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var Ni: Nonce; - fresh Kir: SessionKey; - recv_1(I,S,(I,R,Ni)); - send_2(S,I,{Ni,R,Kir,{Kir,I}k(R,S)}k(I,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/new.txt b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/new.txt deleted file mode 100644 index dbba198..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/new.txt +++ /dev/null @@ -1,5 +0,0 @@ -denning-sacco-lowe.spdl -wmf.spdl -wmf-lowe.spdl -andrew-ban-concrete.spdl -yahalom-ban-paulson.spdl diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ns3.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ns3.spdl deleted file mode 100644 index b83afa7..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/ns3.spdl +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Needham-Schroeder protocol - */ - -// The protocol description - -protocol ns3(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {ni,I}pk(R) ); - recv_2(R,I, {ni,nr}pk(I) ); - send_3(I,R, {nr}pk(R) ); - - claim_i1(I,Secret,ni); - claim_i2(I,Secret,nr); - //claim_i3(I,Alive); - claim_i4(I,Niagree); - claim_i5(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {ni,I}pk(R) ); - send_2(R,I, {ni,nr}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim_r1(R,Secret,ni); - claim_r2(R,Secret,nr); - //claim_r3(R,Alive); - claim_r4(R,Niagree); - claim_r5(R,Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/nsl3.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/nsl3.spdl deleted file mode 100644 index a4bfef5..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/nsl3.spdl +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Needham-Schroeder-Lowe protocol - */ - -// The protocol description - -protocol nsl3(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {ni,I}pk(R) ); - recv_2(R,I, {ni,nr,R}pk(I) ); - send_3(I,R, {nr}pk(R) ); - - claim_i1(I,Secret,ni); - claim_i2(I,Secret,nr); - claim_i3(I,Niagree); - claim_i4(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {ni,I}pk(R) ); - send_2(R,I, {ni,nr,R}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim_r1(R,Secret,ni); - claim_r2(R,Secret,nr); - claim_r3(R,Niagree); - claim_r4(R,Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/otwayrees.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/otwayrees.spdl deleted file mode 100644 index bed12ad..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/otwayrees.spdl +++ /dev/null @@ -1,56 +0,0 @@ -# Otway Rees -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/otwayRees.html -# - - -const Fresh: Function; -const Compromised: Function; - -usertype String,SessionKey; - -protocol otwayrees(I,R,S) -{ - role I - { - fresh Ni : Nonce; - fresh M : String; - var Kir : SessionKey; - - send_1(I,R, M,I,R,{Ni,M,I,R}k(I,S) ); - recv_4(R,I, M,{Ni,Kir}k(I,S) ); - - claim_I1(I, Secret,Kir); - claim_I2(I, Nisynch); - claim_I3(I, Empty, (Fresh,Kir)); - } - - role R - { - var M : String; - fresh Nr : Nonce; - var Kir : SessionKey; - var T1,T2: Ticket; - - recv_1(I,R, M,I,R, T1 ); - send_2(R,S, M,I,R, T1, { Nr,M,I,R }k(R,S) ); - recv_3(S,R, M, T2, { Nr,Kir }k(R,S) ); - send_4(R,I, M, T2 ); - - claim_R1(R, Secret,Kir); - claim_R2(R, Nisynch); - claim_R3(R, Empty, (Fresh,Kir)); - } - - role S - { - var Ni,Nr : Nonce; - var M : String; - fresh Kir : SessionKey; - - recv_2(R,S, M,I,R, { Ni,M,I,R}k(I,S), { Nr,M,I,R }k(R,S) ); - send_3(S,R, M, { Ni,Kir }k(I,S) , { Nr,Kir }k(R,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/soph.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/soph.spdl deleted file mode 100644 index 3b10851..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/soph.spdl +++ /dev/null @@ -1,21 +0,0 @@ - -protocol soph(I,R) -{ - role I - { - fresh ni: Nonce; - - send_1(I,R, {I,ni}pk(R) ); - recv_2(R,I, ni ); - claim_3(I,Niagree); - } - - role R - { - var ni: Nonce; - - recv_1(I,R, {I,ni}pk(R) ); - send_2(R,I, ni ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as-cj.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as-cj.spdl deleted file mode 100644 index b393294..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as-cj.spdl +++ /dev/null @@ -1,66 +0,0 @@ -# Clark and Jacob modified Hwang and Chen modified SPLICE/AS -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/spliceas3.html -# -# Note: -# The assumptions made here do not comply with those in SPORE -# SPORE assumes that the agents do not know the pk function, but only -# their own public key values. -# This can currently not be modelled. - - -usertype TimeStamp, LifeTime; - -const inc,dec: Function; -inversekeys (inc,dec); - -protocol spliceAS-CJ(I,R,S) -{ - role I - { - fresh N1,N2: Nonce; - fresh T: TimeStamp; - fresh L: LifeTime; - - send_1(I,S, I, R, N1 ); - recv_2(S,I, S, {S, I, N1, R, pk(R)}sk(S) ); - send_3(I,R, I, R, {T, L, {I, N2}pk(R)}sk(I) ); - recv_6(R,I, R, I, {{N2}inc}pk(I) ); - - claim_7(I, Secret, N2); - claim_9(I, Niagree); - claim_10(I, Nisynch); - } - - role S - { - var N1,N3: Nonce; - - recv_1(I,S, I, R, N1 ); - send_2(S,I, S, {S, I, N1, R, pk(R)}sk(S) ); - recv_4(R,S, R, I, N3 ); - send_5(S,R, S, {S, R, N3, pk(I)}sk(S) ); - } - - role R - { - fresh N3: Nonce; - var N2: Nonce; - var T: TimeStamp; - var L: LifeTime; - - var ni: Nonce; - fresh nr: Nonce; - - recv_3(I,R, I, R, {T, L, {I, N2}pk(R)}sk(I) ); - send_4(R,S, R, I, N3 ); - recv_5(S,R, S, {S, R, N3, pk(I)}sk(S) ); - send_6(R,I, R, I, {{N2}inc}pk(I) ); - - claim_8(R, Secret, N2); - claim_11(R, Niagree); - claim_12(R, Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as-hc.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as-hc.spdl deleted file mode 100644 index 2f975ad..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as-hc.spdl +++ /dev/null @@ -1,61 +0,0 @@ -# Hwang and Chen Modified SPLICE/AS -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/spliceas2.html -# - - -usertype TimeStamp, LifeTime; - -const inc,dec: Function; -inversekeys (inc,dec); - -protocol spliceAS-HC(I,R,S) -{ - role I - { - fresh N1,N2: Nonce; - fresh T: TimeStamp; - fresh L: LifeTime; - - send_1(I,S, I, R, N1 ); - recv_2(S,I, S, {S, I, N1, R, pk(R)}sk(S) ); - send_3(I,R, I, R, {I, T, L, {N2}pk(R)}sk(I) ); - recv_6(R,I, R, I, {R, {N2}inc}pk(I) ); - - claim_7(I, Secret, N2); - claim_9(I, Niagree); - claim_10(I, Nisynch); - } - - role S - { - var N1,N3: Nonce; - - recv_1(I,S, I, R, N1 ); - send_2(S,I, S, {S, I, N1, R, pk(R)}sk(S) ); - recv_4(R,S, R, I, N3 ); - send_5(S,R, S, {S, R, N3, I, pk(I)}sk(S) ); - } - - role R - { - fresh N3: Nonce; - var N2: Nonce; - var T: TimeStamp; - var L: LifeTime; - - var ni: Nonce; - fresh nr: Nonce; - - recv_3(I,R, I, R, {I, T, L, {N2}pk(R)}sk(I) ); - send_4(R,S, R, I, N3 ); - recv_5(S,R, S, {S, R, N3, I, pk(I)}sk(S) ); - send_6(R,I, R, I, {R, {N2}inc}pk(I) ); - - claim_8(R, Secret, N2); - claim_11(R, Niagree); - claim_12(R, Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as.spdl deleted file mode 100644 index b1d8e18..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/splice-as.spdl +++ /dev/null @@ -1,66 +0,0 @@ -# SPLICE/AS -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/spliceas.html -# -# Note: -# The assumptions made here do not comply with those in SPORE -# SPORE assumes that the agents do not know the pk function, but only -# their own public key values. -# This can currently not be modelled. - - -usertype TimeStamp, LifeTime; - -const inc,dec: Function; -inversekeys (inc,dec); - -protocol spliceAS(I,R,S) -{ - role I - { - fresh N1,N2: Nonce; - fresh T: TimeStamp; - fresh L: LifeTime; - - send_1(I,S, I, R, N1 ); - recv_2(S,I, S, {S, I, N1, pk(R)}sk(S) ); - send_3(I,R, I, R, {I, T, L, {N2}pk(R)}sk(I) ); - recv_6(R,I, R, I, {R, {N2}inc}pk(I) ); - - claim_7(I, Secret, N2); - claim_9(I, Niagree); - claim_10(I, Nisynch); - } - - role S - { - var N1,N3: Nonce; - - recv_1(I,S, I, R, N1 ); - send_2(S,I, S, {S, I, N1, pk(R)}sk(S) ); - recv_4(R,S, R, I, N3 ); - send_5(S,R, S, {S, R, N3, pk(I)}sk(S) ); - } - - role R - { - fresh N3: Nonce; - var N2: Nonce; - var T: TimeStamp; - var L: LifeTime; - - var ni: Nonce; - fresh nr: Nonce; - - recv_3(I,R, I, R, {I, T, L, {N2}pk(R)}sk(I) ); - send_4(R,S, R, I, N3 ); - recv_5(S,R, S, {S, R, N3, pk(I)}sk(S) ); - send_6(R,I, R, I, {R, {N2}inc}pk(I) ); - - claim_8(R, Secret, N2); - claim_11(R, Niagree); - claim_12(R, Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/tmn.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/tmn.spdl deleted file mode 100644 index c6fb55f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/tmn.spdl +++ /dev/null @@ -1,51 +0,0 @@ -# TMN -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/tmn.html -# -# Note: -# According to Boyd and Mathuria Kb is the session key this is not clear -# from the description in SPORE -usertype SessionKey; - -const Fresh: Function; -const Compromised: Function; - -protocol tmn(I,R,S) -{ - role I - { - fresh Ki: SessionKey; - var Kr: SessionKey; - - send_1(I,S, R,{Ki}pk(S) ); - recv_4(S,I, R,{Kr}Ki ); - - claim_I1(I,Secret,Kr); - claim_I2(I,Nisynch); - claim_I3(I,Empty,(Fresh,Kr)); - } - - role R - { - fresh Kr: SessionKey; - - recv_2(S,R, I ); - send_3(R,S, I, { Kr }pk(S) ); - - claim_R1(R,Secret,Kr); - claim_R2(R,Nisynch); - claim_R3(R,Empty,(Fresh,Kr)); - } - - role S - { - var Ki,Kr: SessionKey; - - recv_1(I,S, R,{Ki}pk(S) ); - send_2(S,R, I ); - recv_3(R,S, I, { Kr }pk(S) ); - send_4(S,I, R,{Kr}Ki ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf-brutus.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf-brutus.spdl deleted file mode 100644 index c22bdcc..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf-brutus.spdl +++ /dev/null @@ -1,32 +0,0 @@ -usertype SesKey, Server; - -/* Version from the Brutus reports -*/ - -protocol wmfbrutus(A,B,S) -{ - role A - { - fresh kab : SesKey; - - send_1(A,S, A, { B,kab }k(A,S) ); - } - - role B - { - var kab : SesKey; - - recv_2(S,B, { A, kab }k(B,S) ); - - claim_3(B, Secret,kab); - } - - role S - { - var kab : SesKey; - - recv_1(A,S, A, { B,kab }k(A,S) ); - send_2(S,B, { A, kab }k(B,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf-lowe.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf-lowe.spdl deleted file mode 100644 index 0e0de87..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf-lowe.spdl +++ /dev/null @@ -1,63 +0,0 @@ -# Lowe modified Wide Mouthed Frog -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wideMouthedFrogLowe.html -# -# Note: -# According to SPORE there are no known attacks on this protocol, scyther -# finds one however this has to do with the unusual assumption that every -# agent can recognise and will reject to recv messages that it has created -# itself. - -usertype SessionKey; -usertype TimeStamp; -usertype ExpiredTimeStamp; -const succ,pred: Function; -inversekeys (succ,pred); -const Fresh: Function; -const Compromised: Function; - -protocol wmf-Lowe(I,R,S) -{ - role I - { - fresh Kir: SessionKey; - fresh Ti: TimeStamp; - var Kr: SessionKey; - var Nr: Nonce; - - send_1(I,S, I, {Ti, R, Kir}k(I,S)); - recv_3(R,I,{Nr}Kir); - send_4(I,R,{{Nr}succ}Kir); - - claim_I1(I,Secret,Kir); - claim_I2(I,Nisynch); - claim_I3(I,Empty,(Fresh,Kir)); - } - - role R - { - var Ts: TimeStamp; - var Kir: SessionKey; - fresh Nr: Nonce; - - recv_2(S,R, {Ts, I, Kir}k(R,S) ); - send_3(R,I, {Nr}Kir); - recv_4(I,R, {{Nr}succ}Kir); - - claim_R1(R,Secret,Kir); - claim_R2(R,Nisynch); - claim_R3(R,Empty,(Fresh,Kir)); - } - - role S - { - var Kir: SessionKey; - fresh Ts: TimeStamp; - var Ti: TimeStamp; - - recv_1(I,S, I,{Ti, R, Kir}k(I,S) ); - send_2(S,R, {Ts, I, Kir}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf.spdl deleted file mode 100644 index 758843a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/wmf.spdl +++ /dev/null @@ -1,54 +0,0 @@ -# Wide Mouthed Frog -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wideMouthedFrog.html -# -# Note -# The name of the party that has generated a message was added in order -# to model the property described in SPORE that an agent can identify -# its own messages and will reject them. - -usertype SessionKey; -usertype TimeStamp; -usertype ExpiredTimeStamp; - -const Fresh: Function; -const Compromised: Function; - -protocol wmf(I,R,S) -{ - role I - { - fresh Kir: SessionKey; - fresh Ti: TimeStamp; - var Kr: SessionKey; - - send_1(I,S, I, {I, Ti, R, Kir}k(I,S)); - - claim_I1(I,Secret,Kir); - claim_I2(I,Empty,(Fresh,Kir)); - } - - role R - { - var Ts: TimeStamp; - var Kir: SessionKey; - - recv_2(S,R, {S, Ts, I, Kir}k(R,S) ); - - claim_R1(R,Secret,Kir); - claim_R2(R,Nisynch); - claim_R3(R,Empty,(Fresh,Kir)); - } - - role S - { - var Kir: SessionKey; - fresh Ts: TimeStamp; - var Ti: TimeStamp; - - recv_1(I,S, I,{I, Ti, R, Kir}k(I,S) ); - send_2(S,R, {S, Ts, I, Kir}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-1.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-1.spdl deleted file mode 100644 index 7e4e09d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-1.spdl +++ /dev/null @@ -1,41 +0,0 @@ -# Woo and Lam Pi 1 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wooLamPi1.html -# - -protocol woolamPi-1(I,R,S) -{ - role I - { - var Nr: Nonce; - - send_1(I,R, I); - recv_2(R,I, Nr); - send_3(I,R, {I,R,Nr}k(I,S)); - - } - - role R - { - fresh Nr: Nonce; - var T: Ticket; - - recv_1(I,R, I); - send_2(R,I, Nr); - recv_3(I,R, T); - send_4(R,S, {I,R, T}k(R,S)); - recv_5(S,R, {I,R, Nr}k(R,S)); - - claim_R1(R,Nisynch); - } - - role S - { - var Nr: Nonce; - - recv_4(R,S, {I,R, {I,R,Nr}k(I,S)}k(R,S)); - send_5(S,R, {I,R,Nr}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-2.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-2.spdl deleted file mode 100644 index 5d767d6..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-2.spdl +++ /dev/null @@ -1,41 +0,0 @@ -# Woo and Lam Pi 2 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wooLamPi2.html -# - -protocol woolamPi-2(I,R,S) -{ - role I - { - var Nr: Nonce; - - send_1(I,R, I); - recv_2(R,I, Nr); - send_3(I,R, {I,Nr}k(I,S)); - - } - - role R - { - fresh Nr: Nonce; - var T: Ticket; - - recv_1(I,R, I); - send_2(R,I, Nr); - recv_3(I,R, T); - send_4(R,S, {I, T}k(R,S)); - recv_5(S,R, {I, Nr}k(R,S)); - - claim_R1(R,Nisynch); - } - - role S - { - var Nr: Nonce; - - recv_4(R,S, {I, {I,Nr}k(I,S)}k(R,S)); - send_5(S,R, {I,Nr}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-3.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-3.spdl deleted file mode 100644 index 1db544e..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-3.spdl +++ /dev/null @@ -1,41 +0,0 @@ -# Woo and Lam Pi 2 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wooLamPi3.html -# - -protocol woolamPi-3(I,R,S) -{ - role I - { - var Nr: Nonce; - - send_1(I,R, I); - recv_2(R,I, Nr); - send_3(I,R, {Nr}k(I,S)); - - } - - role R - { - fresh Nr: Nonce; - var T: Ticket; - - recv_1(I,R, I); - send_2(R,I, Nr); - recv_3(I,R, T); - send_4(R,S, {I, T}k(R,S)); - recv_5(S,R, {I, Nr}k(R,S)); - - claim_R1(R,Nisynch); - } - - role S - { - var Nr: Nonce; - - recv_4(R,S, {I, {Nr}k(I,S)}k(R,S)); - send_5(S,R, {I,Nr}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-f.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-f.spdl deleted file mode 100644 index 22f028c..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam-pi-f.spdl +++ /dev/null @@ -1,41 +0,0 @@ -# Woo and Lam Pi f -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wooLamPif.html -# - -protocol woolamPi-f(I,R,S) -{ - role I - { - var Nr: Nonce; - - send_1(I,R, I); - recv_2(R,I, Nr); - send_3(I,R, {I,R,Nr}k(I,S)); - - } - - role R - { - fresh Nr: Nonce; - var T: Ticket; - - recv_1(I,R, I); - send_2(R,I, Nr); - recv_3(I,R, T); - send_4(R,S, {I, R, Nr, T}k(R,S)); - recv_5(S,R, {I, R, Nr}k(R,S)); - - claim_R1(R,Nisynch); - } - - role S - { - var Nr: Nonce; - - recv_4(R,S, {I, R, Nr,{I,R,Nr}k(I,S)}k(R,S)); - send_5(S,R, {I, R, Nr}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam.spdl deleted file mode 100644 index 7e28057..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/woo-lam.spdl +++ /dev/null @@ -1,64 +0,0 @@ -# Woo and Lam Mutual Authentication -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wooLamMutual.html -# - - -usertype SessionKey; - -const Fresh: Function; -const Compromised: Function; - -protocol woolam(I,R,S) -{ - role I - { - fresh N1: Nonce; - var Kir: SessionKey; - var N2: Nonce; - - send_1(I,R, I, N1); - recv_2(R,I, R, N2); - send_3(I,R, {I, R, N1, N2}k(I,S)); - recv_6(R,I, {R, N1, N2, Kir}k(I,S), {N1,N2}Kir); - send_7(I,R, {N2}Kir); - - - claim_I1(I,Secret,Kir); - claim_I2(I,Nisynch); - claim_I3(I,Empty,(Fresh,Kir)); - } - - role R - { - fresh N2: Nonce; - var N1: Nonce; - var Kir: SessionKey; - var T1,T2: Ticket; - - recv_1(I,R, I, N1); - send_2(R,I, R, N2); - recv_3(I,R, T1); - send_4(R,S, T1, {I, R, N1, N2}k(R,S)); - recv_5(S,R, T2, {I, N1, N2, Kir}k(R,S)); - send_6(R,I, T2, {N1,N2}Kir); - recv_7(I,R, {N2}Kir); - - claim_R1(R,Secret,Kir); - claim_R2(R,Nisynch); - claim_R3(R,Empty,(Fresh,Kir)); - } - - role S - { - fresh Kir: SessionKey; - var N1,N2: Nonce; - - recv_4(R,S, {I, R, N1, N2}k(I,S), {I, R, N1, N2}k(R,S)); - send_5(S,R, {R, N1, N2, Kir}k(I,S), {I, N1, N2, Kir}k(R,S)); - } -} - - - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban-paulson-modified.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban-paulson-modified.spdl deleted file mode 100644 index 13d62a6..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban-paulson-modified.spdl +++ /dev/null @@ -1,49 +0,0 @@ -// BAN modified version of the yahalom protocol -// -// Modeled as version in Paulson's paper: -// "Relations Between Secrets: Two Formal Analyses of the Yahalom -// Protocol" -// -// Modified (improved) version from page 16. - -usertype Server; -usertype SessionKey; - -protocol yahalom-BAN-Paulson-modified(A,B,S) -{ - role A - { - fresh na: Nonce; - var nb: Nonce; - var ticket: Ticket; - var kab: SessionKey; - - send_1(A,B, A,na); - recv_3(S,A, nb, {B,kab,na}k(A,S), ticket ); - send_4(A,B, ticket, {nb}kab ); - claim_5(A, Secret,kab); - } - - role B - { - fresh nb: Nonce; - var na: Nonce; - var ticket: Ticket; - var kab: SessionKey; - - recv_1(A,B, A,na); - send_2(B,S, B, nb, {A,na}k(B,S) ); - recv_4(A,B, {A,B,kab,nb}k(B,S) , {nb}kab ); - claim_6(B, Secret,kab); - } - - role S - { - fresh kab: SessionKey; - var na,nb: Nonce; - - recv_2(B,S, B, nb, {A,na}k(B,S) ); - send_3(S,A, nb, {B,kab,na}k(A,S), {A,B,kab,nb}k(B,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban-paulson.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban-paulson.spdl deleted file mode 100644 index 7d312ec..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban-paulson.spdl +++ /dev/null @@ -1,47 +0,0 @@ -// BAN modified version of the yahalom protocol -// -// Modeled as version in Paulson's paper: -// "Relations Between Secrets: Two Formal Analyses of the Yahalom -// Protocol" - -usertype Server; -usertype SessionKey; - -protocol yahalom-BAN-Paulson(A,B,S) -{ - role A - { - fresh na: Nonce; - var nb: Nonce; - var ticket: Ticket; - var kab: SessionKey; - - send_1(A,B, A,na); - recv_3(S,A, {B,kab,na,nb}k(A,S), ticket ); - send_4(A,B, ticket, {nb}kab ); - claim_5(A, Secret,kab); - } - - role B - { - fresh nb: Nonce; - var na: Nonce; - var ticket: Ticket; - var kab: SessionKey; - - recv_1(A,B, A,na); - send_2(B,S, B, {A,na,nb}k(B,S) ); - recv_4(A,B, {A,kab}k(B,S) , {nb}kab ); - claim_6(B, Secret,kab); - } - - role S - { - fresh kab: SessionKey; - var na,nb: Nonce; - - recv_2(B,S, B, {A,na,nb}k(B,S) ); - send_3(S,A, {B,kab,na,nb}k(A,S), {A,kab}k(B,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban.spdl deleted file mode 100644 index 3fa5f84..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-ban.spdl +++ /dev/null @@ -1,55 +0,0 @@ -# BAN simplified version of Yahalom -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/yahalomBAN.html -# - -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol yahalom-BAN(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var T: Ticket; - var Kir: SessionKey; - - send_1(I,R, I,Ni); - recv_3(S,I, Nr, {R,Kir,Ni}k(I,S), T ); - send_4(I,R, T, {Nr}Kir ); - - claim_I1(I, Secret,Kir); - claim_I2(I, Nisynch); - claim_I3(I, Empty, (Fresh,Kir)); - } - - role R - { - fresh Nr: Nonce; - var Ni: Nonce; - var T: Ticket; - var Kir: SessionKey; - - recv_1(I,R, I,Ni); - send_2(R,S, R, Nr, {I,Ni}k(R,S) ); - recv_4(I,R, {I,Kir,Nr}k(R,S) , {Nr}Kir ); - - claim_R1(R, Secret,Kir); - claim_R2(R, Nisynch); - claim_R3(R, Empty, (Fresh,Kir)); - } - - role S - { - fresh Kir: SessionKey; - var Ni,Nr: Nonce; - - recv_2(R,S, R, Nr, {I,Ni}k(R,S) ); - send_3(S,I, Nr, {R,Kir,Ni}k(I,S), {I,Kir,Nr}k(R,S) ); - } -} - - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-lowe.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-lowe.spdl deleted file mode 100644 index 651389d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom-lowe.spdl +++ /dev/null @@ -1,53 +0,0 @@ -# Lowe's modified version of Yahalom -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/yahalomLowe.html -# -# - -usertype SessionKey; - - -protocol yahalom-Lowe(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var Kir: SessionKey; - - send_1(I,R, I,Ni); - recv_3(S,I, {R,Kir,Ni,Nr}k(I,S) ); - send_5(I,R, {I, R, S, Nr}Kir ); - - claim_I1(I, Secret,Kir); - claim_I2(I, Nisynch); - } - - role R - { - fresh Nr: Nonce; - var Ni: Nonce; - var Kir: SessionKey; - - recv_1(I,R, I,Ni); - send_2(R,S, {I,Ni,Nr}k(R,S) ); - recv_4(S,R, {I,Kir}k(R,S)); - recv_5(I,R, {I, R, S, Nr}Kir); - - claim_R1(R, Secret,Kir); - claim_R2(R, Nisynch); - } - - role S - { - fresh Kir: SessionKey; - var Ni,Nr: Nonce; - - recv_2(R,S, {I,Ni,Nr}k(R,S) ); - send_3(S,I, {R,Kir,Ni,Nr}k(I,S)); - send_4(S,R, {I,Kir}k(R,S)); - } -} - - diff --git a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom.spdl b/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom.spdl deleted file mode 100644 index 063817f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/MultiProtocolAttacks/yahalom.spdl +++ /dev/null @@ -1,52 +0,0 @@ -# Yahalom -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/yahalom.html -# -# - -usertype SessionKey; - -protocol yahalom(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var T: Ticket; - var Kir: SessionKey; - - send_1(I,R, I,Ni); - recv_3(S,I, {R,Kir,Ni,Nr}k(I,S), T ); - send_4(I,R, T, {Nr}Kir ); - - claim_I1(I, Secret,Kir); - } - - role R - { - fresh Nr: Nonce; - var Ni: Nonce; - var T: Ticket; - var Kir: SessionKey; - - recv_1(I,R, I,Ni); - send_2(R,S, R, {I,Ni,Nr}k(R,S) ); - recv_4(I,R, {I,Kir}k(R,S) , {Nr}Kir ); - - claim_R1(R, Secret,Kir); - } - - role S - { - fresh Kir: SessionKey; - var Ni,Nr: Nonce; - - recv_2(R,S, R, {I,Ni,Nr}k(R,S) ); - send_3(S,I, {R,Kir,Ni,Nr}k(I,S), {I,Kir}k(R,S) ); - - claim(S, Secret, Ni); - claim(S, Secret, Nr); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/NotModelled.txt b/Vagrant Files/shared/scyther/Protocols/NotModelled.txt deleted file mode 100644 index 120e55f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/NotModelled.txt +++ /dev/null @@ -1,23 +0,0 @@ -The following protocols have not been modelled for use in Scyther: - -- CAM http://www.lsv.ens-cachan.fr/spore/cam.html -This protocol only consists of one message and corresponding database actions. -The description given in SPORE is unsuitable for formalisation. - -- Diffie Helman http://www.lsv.ens-cachan.fr/spore/diffieHelman.html -This protocol relies on algebraic properties that can not be modelled in -scyther. - -- GJM http://www.lsv.ens-cachan.fr/spore/gjm.html -This protocol contains complicated if-then-else constructions that can -not be modelled in scyther. - -- Gong http://www.lsv.ens-cachan.fr/spore/gong.html -This protocol relies on algebraic properties that can not be modelled in -scyther. - -- SK3 -This protocol relies on algebraic properties that can not be modelled in -scyther. It also has the notion of channels that can not be attacked, -which can not be modelled in scyther either. - diff --git a/Vagrant Files/shared/scyther/Protocols/andrew-ban-concrete.spdl b/Vagrant Files/shared/scyther/Protocols/andrew-ban-concrete.spdl deleted file mode 100644 index 48f52d8..0000000 --- a/Vagrant Files/shared/scyther/Protocols/andrew-ban-concrete.spdl +++ /dev/null @@ -1,67 +0,0 @@ -# BAN concrete Andrew Secure RPC -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/andrewBAN2.html -# -# Note: -# The shared key between I and R is modelled as k(I,R) currently -# there is no way to express that this key is equal to k(R,I) -# In order to overcome this a 'dummy' role X has been hadded that recrypts -# a given term crypted with k(I,R) with k(R,I) -# -# Note: -# Recv 4 by the Initatior has been placed after the synchronisation claim -# as it allows trivial synchronisation attacks otherwise (the message is -# completely fresh and can therefore always be replaced by an arbitrary value -# created by the intruder) which are not considered in SPORE -# - -usertype SessionKey; -const Fresh: Function; - -protocol @swapkey(X) -{ - # Protocol added to work around the symmetry problems where k(I,R) != k(R,I) - role X - { - var I,R: Agent; - var T:Ticket; - recv_!X1(X,X,I,R,{T}k(I,R)); - send_!X2(X,X,{T}k(R,I)); - } -} - -protocol andrew-Concrete(I,R) -{ - - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir: SessionKey; - - send_1(I,R, I,ni ); - recv_2(R,I, {ni,kir}k(I,R) ); - send_3(I,R, {ni}kir); - claim_I1(I,Secret,kir); - claim_I2(I,Nisynch); - claim_I3(I,Empty,(Fresh,kir)); - recv_6(R,I, nr); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - fresh kir: SessionKey; - - recv_1(I,R, I,ni ); - send_2(R,I, {ni,kir}k(I,R) ); - recv_3(I,R, {ni}kir); - send_6(R,I, nr); - claim_R1(R,Secret,kir); - claim_R2(R,Nisynch); - claim_R3(R,Empty,(Fresh,kir)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/andrew-ban.spdl b/Vagrant Files/shared/scyther/Protocols/andrew-ban.spdl deleted file mode 100644 index 9ebd566..0000000 --- a/Vagrant Files/shared/scyther/Protocols/andrew-ban.spdl +++ /dev/null @@ -1,54 +0,0 @@ -# BAN modified Andrew Secure RPC -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/andrewBAN.html -# -# Note: -# The shared key between I and R is modelled as k(I,R) currently -# there is no way to express that this key is equal to k(R,I) -# So it is possile that certain attacks that use this property are not found -# -# Note: -# According to SPORE there are no known attacks on this protocol -# -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol andrew-Ban(I,R) -{ - role I - { - fresh ni: Nonce; - var nr,nr2: Nonce; - var kir: SessionKey; - - send_1(I,R, I,{ni}k(I,R) ); - recv_2(R,I, {ni,nr}k(I,R) ); - send_3(I,R, {nr}k(I,R) ); - recv_4(R,I, {kir,nr2,ni}k(I,R) ); - claim_I1(I,Nisynch); - claim_I2(I,Niagree); - claim_I3(I,Secret, kir); - claim_I4(I,Secret, k(I,R)); - claim_I5(I,Empty, (Fresh,kir)); - } - - role R - { - var ni: Nonce; - fresh nr,nr2: Nonce; - fresh kir: SessionKey; - - recv_1(I,R, I,{ni}k(I,R) ); - send_2(R,I, {ni,nr}k(I,R) ); - recv_3(I,R, {nr}k(I,R) ); - send_4(R,I, {kir,nr2,ni}k(I,R) ); - claim_R1(R,Nisynch); - claim_R2(R,Niagree); - claim_R3(R,Secret, kir); - claim_R4(R,Secret, k(I,R)); - claim_R5(R,Empty, (Fresh,kir)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/andrew-lowe-ban.spdl b/Vagrant Files/shared/scyther/Protocols/andrew-lowe-ban.spdl deleted file mode 100644 index 04e15f2..0000000 --- a/Vagrant Files/shared/scyther/Protocols/andrew-lowe-ban.spdl +++ /dev/null @@ -1,57 +0,0 @@ -# Lowe modified BAN concrete Andrew Secure RPC -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/andrewLowe.html -# -# Note: -# The shared key between I and R is modelled as k(I,R) currently -# there is no way to express that this key is equal to k(R,I) -# So it is possile that certain attacks that use this property are not found -# -# Note: -# Recv 4 by the Initatior has been placed after the synchronisation claim -# as it allows trivial synchronisation attacks otherwise (the message is -# completely fresh and can therefore always be replaced by an arbitrary value -# created by the intruder) which are not considered in SPORE -# -# Note: -# According to SPORE there are no known attacks on this protocol -# - -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol andrew-LoweBan(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir: SessionKey; - - send_1(I,R, I,ni ); - recv_2(R,I, {ni,kir,R}k(I,R) ); - send_3(I,R, {ni}kir ); - claim_I1(I,Nisynch); - claim_I2(I,Secret, kir); - claim_I3(I,Empty, (Fresh,kir)); - recv_4(R,I, nr ); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - fresh kir: SessionKey; - - recv_1(I,R, I,ni ); - send_2(R,I, {ni,kir,R}k(I,R) ); - recv_3(I,R, {ni}kir ); - send_4(R,I, nr ); - claim_R1(R,Nisynch); - claim_R2(R,Secret, kir); - claim_R3(R,Empty, (Fresh,kir)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/andrew.spdl b/Vagrant Files/shared/scyther/Protocols/andrew.spdl deleted file mode 100644 index b2e663c..0000000 --- a/Vagrant Files/shared/scyther/Protocols/andrew.spdl +++ /dev/null @@ -1,50 +0,0 @@ -# Andrew Secure RPC -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/andrew.html -# -# Note: -# The shared key between I and R is modelled as k(I,R) currently -# there is no way to express that this key is equal to k(R,I) -# So it is possile that certain attacks that use this property are not found -# - -usertype SessionKey; -const succ: Function; -const Fresh: Function; - -protocol andrew(I,R) -{ - role I - { - fresh ni: Nonce; - var nr,nr2: Nonce; - var kir: SessionKey; - - send_1(I,R, I,{ni}k(I,R) ); - recv_2(R,I, {succ(ni),nr}k(I,R) ); - send_3(I,R, {succ(nr)}k(I,R) ); - recv_4(R,I, {kir,nr2}k(I,R) ); - claim_I1(I,Secret,kir); - claim_I2(I,Nisynch); - claim_I3(I,Niagree); - claim_I4(I,Empty,(Fresh,kir)); - } - - role R - { - var ni: Nonce; - fresh nr,nr2: Nonce; - fresh kir: SessionKey; - - recv_1(I,R, I,{ni}k(I,R) ); - send_2(R,I, {succ(ni),nr}k(I,R) ); - recv_3(I,R, {succ(nr)}k(I,R) ); - send_4(R,I, {kir,nr2}k(I,R) ); - claim_R1(R,Secret,kir); - claim_R2(R,Nisynch); - claim_R3(R,Niagree); - claim_R4(R,Empty,(Fresh,kir)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ccitt509-1.spdl b/Vagrant Files/shared/scyther/Protocols/ccitt509-1.spdl deleted file mode 100644 index 29c665a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ccitt509-1.spdl +++ /dev/null @@ -1,35 +0,0 @@ -# CCITT X.509 (1) -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/ccittx509_1.html -# -# Note: -# The attack in SPORE is not found as this is not an attack against -# synchronisation, but an attack against the freshness of Xa and Ya -# which can currently not be modelled in scyther -# - -usertype Timestamp; - -protocol ccitt509-1(I,R) -{ - role I - { - fresh Ta: Timestamp; - fresh Na,Xa,Ya: Nonce; - send_1(I,R, I,{Ta, Na, R, Xa,{Ya}pk(R)}sk(I)); - # claim_2(I,Nisynch); - # This claim is useless as there are no preceding recv events - } - - role R - { - var Ta: Timestamp; - var Na,Xa,Ya: Nonce; - - recv_1(I,R, I,{Ta, Na, R, Xa,{Ya}pk(R)}sk(I)); - claim_3(R,Nisynch); - # There should also be Fresh Xa and Fresh Ya claims here - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ccitt509-1c.spdl b/Vagrant Files/shared/scyther/Protocols/ccitt509-1c.spdl deleted file mode 100644 index b75e069..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ccitt509-1c.spdl +++ /dev/null @@ -1,34 +0,0 @@ -# CCITT X.509 (1c) -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/ccittx509_1c.html -# -# Note: -# According to SPORE there are no known attacks on this protocol -# - -hashfunction hash; -usertype Timestamp; - -protocol ccitt509-1c(I,R) -{ - role I - { - fresh Ta: Timestamp; - fresh Na,Xa,Ya: Nonce; - send_1(I,R, I,{Ta, Na, R, Xa,{Ya,{hash(Ya)}sk(I)}pk(R)}sk(I)); - # claim_2(I,Nisynch); - # This claim is useless as there are no preceding receive events - } - - role R - { - var Ta: Timestamp; - var Na,Xa,Ya: Nonce; - - recv_1(I,R, I,{Ta, Na, R, Xa,{Ya,{hash(Ya)}sk(I)}pk(R)}sk(I)); - claim_3(R,Nisynch); - # There should also be Fresh Xa and Fresh Ya claims here - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ccitt509-3.spdl b/Vagrant Files/shared/scyther/Protocols/ccitt509-3.spdl deleted file mode 100644 index 9ad1d3f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ccitt509-3.spdl +++ /dev/null @@ -1,45 +0,0 @@ -# CCITT X.509 (3) -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/ccittx509_3.html -# -# Note: -# The protocol description also states that Xa and Ya should be fresh -# this can not be verified using scyther -# - -usertype Timestamp; - -protocol ccitt509-3(I,R) -{ - role I - { - fresh Ta: Timestamp; - var Tb: Timestamp; - fresh Na,Xa,Ya: Nonce; - var Xb,Nb,Yb: Nonce; - send_1(I,R, I,{Ta, Na, R, Xa,{Ya}pk(R)}sk(I)); - recv_2(R,I, R,{Tb, Nb, I, Na, Xb,{Yb}pk(I)}sk(R)); - send_3(I,R, I, {Nb}sk(I)); - claim_I1(I,Nisynch); - claim_I2(I,Secret,Ya); - claim_I3(I,Secret,Yb); - } - - role R - { - var Ta: Timestamp; - fresh Tb: Timestamp; - var Na,Xa,Ya: Nonce; - fresh Xb,Yb,Nb: Nonce; - - recv_1(I,R, I,{Ta, Na, R, Xa,{Ya}pk(R)}sk(I)); - send_2(R,I, R,{Tb, Nb, I, Na, Xb,{Yb}pk(I)}sk(R)); - recv_3(I,R, I, {Nb}sk(I)); - claim_R1(R,Nisynch); - claim_R2(R,Secret,Ya); - claim_R3(R,Secret,Yb); - # There should also be Fresh Xa and Fresh Ya claims here - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ccitt509-ban3.spdl b/Vagrant Files/shared/scyther/Protocols/ccitt509-ban3.spdl deleted file mode 100644 index bdf146d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ccitt509-ban3.spdl +++ /dev/null @@ -1,39 +0,0 @@ -# BAN modified version of CCITT X.509 (3) -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/ccittx509_3BAN.html -# -# Note: -# The protocol description also states that Xa and Ya should be fresh -# this can not be verified using scyther -# -# Note: -# According to SPORE there are no known attacks on this protocol -# - -protocol ccitt509-ban3(I,R) -{ - role I - { - fresh Na,Xa,Ya: Nonce; - var Xb,Nb,Yb: Nonce; - - send_1(I,R, I,{Na, R, Xa,{Ya}pk(R)}sk(I)); - recv_2(R,I, R,{Nb, I, Na, Xb,{Yb}pk(I)}sk(R)); - send_3(I,R, I,{R, Nb}sk(I)); - claim_4(I,Nisynch); - } - - role R - { - var Na,Xa,Ya: Nonce; - fresh Xb,Yb,Nb: Nonce; - - recv_1(I,R, I,{Na, R, Xa,{Ya}pk(R)}sk(I)); - send_2(R,I, R,{Nb, I, Na, Xb,{Yb}pk(I)}sk(R)); - recv_3(I,R, I,{R, Nb}sk(I)); - claim_5(R,Nisynch); - # There should also be Fresh Xa and Fresh Ya claims here - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/denning-sacco-lowe.spdl b/Vagrant Files/shared/scyther/Protocols/denning-sacco-lowe.spdl deleted file mode 100644 index 761c22b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/denning-sacco-lowe.spdl +++ /dev/null @@ -1,67 +0,0 @@ -# Lowe modified Denning-Sacco shared key -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/denningSaccoLowe.html -# -# Note: -# According to SPORE there are no attacks on this protocol. Scyther -# finds a straightforward pre-play attack on the first message, which -# violates synchronisation. However, this does not seem to be a -# practical attack unless consistency is required, e.g., for logging or -# auditing. - -usertype Key; -usertype SessionKey; -usertype TimeStamp; -usertype ExpiredTimeStamp; -usertype PseudoFunction; -const dec: PseudoFunction; -const Fresh: Function; -const Compromised: Function; - -protocol denningSacco-Lowe(I,R,S) -{ - role I - { - var W: Ticket; - var Kir: SessionKey; - var T: TimeStamp; - var Nr: Nonce; - - send_1(I,S, I,R ); - recv_2(S,I, {R, Kir, T, W}k(I,S) ); - send_3(I,R, W); - recv_4(R,I, {Nr}Kir); - send_5(I,R, {{Nr}dec}Kir); - claim_I1(I,Niagree); - claim_I2(I,Nisynch); - claim_I3(I,SKR,Kir); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - var Kir: SessionKey; - var T: TimeStamp; - fresh Nr: Nonce; - - recv_3(I,R, {Kir,I,T}k(R,S)); - send_4(R,I, {Nr}Kir); - recv_5(I,R, {{Nr}dec}Kir); - claim_R1(R,Niagree); - claim_R2(R,Nisynch); - claim_R3(R,Secret,Kir); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var W: Ticket; - fresh Kir: SessionKey; - fresh T: TimeStamp; - - recv_1(I,S, I,R ); - send_2(S,I, {R, Kir, T, {Kir, I,T}k(R,S)}k(I,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/denning-sacco.spdl b/Vagrant Files/shared/scyther/Protocols/denning-sacco.spdl deleted file mode 100644 index d77402f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/denning-sacco.spdl +++ /dev/null @@ -1,53 +0,0 @@ -# Denning-Sacco shared key -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/denningSacco.html -# - -usertype Key; -usertype SessionKey; -usertype TimeStamp; -usertype ExpiredTimeStamp; -const Fresh: Function; -const Compromised: Function; - -protocol denningSacco(I,R,S) -{ - role I - { - var W: Ticket; - var Kir: SessionKey; - var T: TimeStamp; - - send_1(I,S, I,R ); - recv_2(S,I, {R, Kir, T, W}k(I,S) ); - send_3(I,R, W); - claim_I1(I,Niagree); - claim_I2(I,Nisynch); - claim_I3(I,Secret,Kir); - claim_I4(I,Empty, (Fresh,Kir)); - } - - role R - { - var Kir: SessionKey; - var T: TimeStamp; - - recv_3(I,R, {Kir,I,T}k(R,S)); - claim_R1(R,Niagree); - claim_R2(R,Nisynch); - claim_R3(R,Secret,Kir); - claim_R4(R,Empty, (Fresh,Kir)); - } - - role S - { - var W: Ticket; - fresh Kir: SessionKey; - fresh T: TimeStamp; - - recv_1(I,S, I,R ); - send_2(S,I, {R, Kir, T, {Kir, I,T}k(R,S)}k(I,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/kaochow-v2.spdl b/Vagrant Files/shared/scyther/Protocols/kaochow-v2.spdl deleted file mode 100644 index 638a54b..0000000 --- a/Vagrant Files/shared/scyther/Protocols/kaochow-v2.spdl +++ /dev/null @@ -1,55 +0,0 @@ -# Kao Chow Authentication v.2 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/kaoChow2.html -# - -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol kaochow-2(I,R,S) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir,kt: SessionKey; - - send_1 (I,S, I,R,ni); - recv_3 (R,I, R, {I,R,ni,kir,kt}k(I,S), {ni, kir}kt, nr ); - send_4 (I,R, {nr,kir}kt ); - - claim_I1 (I, Nisynch); - claim_I2 (I, Niagree); - claim_I3 (I, Secret, kir); - claim_I4 (I, Empty, (Fresh,kir)); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - var kir,kt: SessionKey; - var T: Ticket; - - recv_2 (S,R, T, { I,R,ni,kir,kt }k(R,S) ); - send_3 (R,I, R, T, {ni, kir}kt, nr ); - recv_4 (I,R, {nr,kir}kt ); - - claim_R1 (R, Nisynch); - claim_R2 (R, Niagree); - claim_R3 (R, Secret, kir); - claim_R4 (R, Empty, (Fresh,kir)); - } - - role S - { - var ni: Nonce; - fresh kir, kt: SessionKey; - - recv_1 (I,S, I,R,ni); - send_2 (S,R, {I,R,ni,kir,kt}k(I,S), { I,R,ni,kir,kt }k(R,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/kaochow-v3.spdl b/Vagrant Files/shared/scyther/Protocols/kaochow-v3.spdl deleted file mode 100644 index 88cef24..0000000 --- a/Vagrant Files/shared/scyther/Protocols/kaochow-v3.spdl +++ /dev/null @@ -1,59 +0,0 @@ -# Kao Chow Authentication v.3 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/kaoChow3.html -# - -usertype SessionKey; -usertype ExpiredTimeStamp; -usertype TimeStamp; -const Fresh: Function; -const Compromised: Function; - -protocol kaochow-3(I,R,S) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir,kt: SessionKey; - var T2: Ticket; - - send_1 (I,S, I,R,ni); - recv_3 (R,I, {I,R,ni,kir,kt}k(I,S), {ni, kir}kt, nr, T2 ); - send_4 (I,R, {nr,kir}kt, T2 ); - - claim_I1 (I, Nisynch); - claim_I2 (I, Niagree); - claim_I3 (I, Secret, kir); - claim_I4 (I, Empty, (Fresh,kir)); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - var kir,kt: SessionKey; - var T: Ticket; - fresh tr: TimeStamp; - - recv_2 (S,R, T, { I,R,ni,kir,kt }k(R,S) ); - send_3 (R,I, T, {ni, kir}kt, nr, {I,R,tr,kir}k(R,S) ); - recv_4 (I,R, {nr,kir}kt, {I,R,tr,kir}k(R,S) ); - - claim_R1 (R, Nisynch); - claim_R2 (R, Niagree); - claim_R3 (R, Secret, kir); - claim_R4 (R, Empty, (Fresh,kir)); - } - - role S - { - var ni: Nonce; - fresh kir, kt: SessionKey; - - recv_1 (I,S, I,R,ni); - send_2 (S,R, {I,R,ni,kir,kt}k(I,S), { I,R,ni,kir,kt }k(R,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/kaochow.spdl b/Vagrant Files/shared/scyther/Protocols/kaochow.spdl deleted file mode 100644 index 1c6c827..0000000 --- a/Vagrant Files/shared/scyther/Protocols/kaochow.spdl +++ /dev/null @@ -1,55 +0,0 @@ -# Kao Chow Authentication v.1 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/kaoChow1.html -# - -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol kaochow(I,R,S) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - var kir: SessionKey; - - send_1 (I,S, I,R,ni); - recv_3 (R,I, {I,R,ni,kir}k(I,S), {ni}kir, nr ); - send_4 (I,R, {nr}kir ); - - claim_I1 (I, Nisynch); - claim_I2 (I, Niagree); - claim_I3 (I, Secret, kir); - claim_I4 (I, Empty, (Fresh,kir)); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - var kir: SessionKey; - var T; - - recv_2 (S,R, T, { I,R,ni,kir }k(R,S) ); - send_3 (R,I, T, {ni}kir, nr ); - recv_4 (I,R, {nr}kir ); - - claim_R1 (R, Nisynch); - claim_R2 (R, Niagree); - claim_R3 (R, Secret, kir); - claim_R4 (R, Empty, (Fresh,kir)); - } - - role S - { - var ni: Nonce; - fresh kir: SessionKey; - - recv_1 (I,S, I,R,ni); - send_2 (S,R, {I,R,ni,kir}k(I,S), { I,R,ni,kir }k(R,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ksl-lowe.spdl b/Vagrant Files/shared/scyther/Protocols/ksl-lowe.spdl deleted file mode 100644 index 29996d8..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ksl-lowe.spdl +++ /dev/null @@ -1,73 +0,0 @@ -# Lowe modified KSL -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/kslLowe.html -# -# Note: -# According to SPORE there are no attacks on this protocol, scyther -# finds one however. This has to be investigated further. - -usertype Server, SessionKey, TimeStamp, TicketKey; -usertype ExpiredTimeStamp; - -const Fresh: Function; -const Compromised: Function; - -protocol ksl-Lowe(I,R,S) -{ - role I - { - fresh Ni, Mi: Nonce; - var Nc, Mr: Nonce; - var T: Ticket; - var Kir: SessionKey; - - send_1(I,R, Ni, I); - recv_4(R,I, { Ni,R,Kir }k(I,S), T, Nc, {R,Ni}Kir ); - send_5(I,R, { Nc }Kir ); - - send_6(I,R, Mi,T ); - recv_7(R,I, Mr,{Mi, R}Kir ); - send_8(I,R, {I,Mr}Kir ); - - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - claim_I4(I,Empty, (Fresh,Kir)); - } - - role R - { - var Ni,Mi: Nonce; - fresh Nr,Nc,Mr: Nonce; - var Kir: SessionKey; - fresh Kbb: TicketKey; - fresh Tr: TimeStamp; - var T: Ticket; - - recv_1(I,R, Ni, I); - send_2(R,S, Ni, I, Nr, R ); - recv_3(S,R, { I, Nr, Kir }k(R,S), T ); - send_4(R,I, T, { Tr, I, Kir }Kbb, Nc, {R, Ni}Kir ); - recv_5(I,R, { Nc }Kir ); - - recv_6(I,R, Mi,{ Tr, I, Kir }Kbb ); - send_7(R,I, Mr,{Mi,R}Kir ); - recv_8(I,R, {I,Mr}Kir ); - - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - claim_R4(R,Empty, (Fresh,Kir)); - } - - role S - { - var Ni, Nr: Nonce; - fresh Kir: SessionKey; - - recv_2(R,S, Ni, I, Nr, R ); - send_3(S,R, { I, Nr, Kir }k(R,S), { Ni,R,Kir }k(I,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/ksl.spdl b/Vagrant Files/shared/scyther/Protocols/ksl.spdl deleted file mode 100644 index 7cfca44..0000000 --- a/Vagrant Files/shared/scyther/Protocols/ksl.spdl +++ /dev/null @@ -1,72 +0,0 @@ -# KSL -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/ksl.html -# -# - - -usertype Server, SessionKey, TimeStamp, TicketKey; -usertype ExpiredTimeStamp; - -const Fresh: Function; -const Compromised: Function; - -protocol ksl(I,R,S) -{ - role I - { - fresh Ni, Mi: Nonce; - var Nc, Mr: Nonce; - var T: Ticket; - var Kir: SessionKey; - - send_1(I,R, Ni, I); - recv_4(R,I, { Ni,R,Kir }k(I,S), T, Nc, {Ni}Kir ); - send_5(I,R, { Nc }Kir ); - - send_6(I,R, Mi,T ); - recv_7(R,I, Mr,{Mi}Kir ); - send_8(I,R, {Mr}Kir ); - - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - claim_I4(I,Empty, (Fresh, Kir)); - } - - role R - { - var Ni,Mi: Nonce; - fresh Nr,Nc,Mr: Nonce; - var Kir: SessionKey; - fresh Kbb: TicketKey; - fresh Tr: TimeStamp; - var T: Ticket; - - recv_1(I,R, Ni, I); - send_2(R,S, Ni, I, Nr, R ); - recv_3(S,R, { Nr, I, Kir }k(R,S), T ); - send_4(R,I, T, { Tr, I, Kir }Kbb, Nc, {Ni}Kir ); - recv_5(I,R, { Nc }Kir ); - - recv_6(I,R, Mi,{ Tr, I, Kir }Kbb ); - send_7(R,I, Mr,{Mi}Kir ); - recv_8(I,R, {Mr}Kir ); - - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var Ni, Nr: Nonce; - fresh Kir: SessionKey; - - recv_2(R,S, Ni, I, Nr, R ); - send_3(S,R, { Nr, I, Kir }k(R,S), { Ni,R,Kir }k(I,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/multi-NSL/heuristics-results.txt b/Vagrant Files/shared/scyther/Protocols/multi-NSL/heuristics-results.txt deleted file mode 100644 index cc55c31..0000000 --- a/Vagrant Files/shared/scyther/Protocols/multi-NSL/heuristics-results.txt +++ /dev/null @@ -1,776 +0,0 @@ -Slave1:multiparty% ./test-heuristics.py -Starting with [11, 15] -Testing using P 3 and 5 runs. -Testing protocol 11. -Heuristic 0: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=0 --timer=20 -states 7488 -attack NoClaim -time 2.007e+01 -st/sec 3.731e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 1: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=1 --timer=20 -states 3869 -attack NoClaim -time 2.004e+01 -st/sec 1.931e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 2: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=2 --timer=20 -states 6543 -attack NoClaim -time 2.006e+01 -st/sec 3.262e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 3: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=3 --timer=20 -states 9003 -attack NoClaim -time 2.005e+01 -st/sec 4.490e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 1 correct: bounded_proof -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 4: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=4 --timer=20 -states 6375 -attack NoClaim -time 2.008e+01 -st/sec 3.175e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 5: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=5 --timer=20 -states 4282 -attack NoClaim -time 2.007e+01 -st/sec 2.134e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 4 correct: bounded_proof time=20 -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 6: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=6 --timer=20 -states 6791 -attack NoClaim -time 2.002e+01 -st/sec 3.392e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 7: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=7 --timer=20 -states 8115 -attack NoClaim -time 2.004e+01 -st/sec 4.049e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 14 correct: bounded_proof time=20 -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 8: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=8 --timer=20 -states 9649 -attack NoClaim -time 2.003e+01 -st/sec 4.817e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 9: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=9 --timer=20 -states 3873 -attack NoClaim -time 2.005e+01 -st/sec 1.932e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 10: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=10 --timer=20 -states 11954 -attack NoClaim -time 2.007e+01 -st/sec 5.956e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 11: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=11 --timer=20 -states 7367 -attack NoClaim -time 2.003e+01 -st/sec 3.678e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 12: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=12 --timer=20 -states 6271 -attack NoClaim -time 2.005e+01 -st/sec 3.128e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 13: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=13 --timer=20 -states 4729 -attack NoClaim -time 2.006e+01 -st/sec 2.357e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 14: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=14 --timer=20 -states 7566 -attack NoClaim -time 2.002e+01 -st/sec 3.779e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 15: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=15 --timer=20 -states 8496 -attack NoClaim -time 2.005e+01 -st/sec 4.237e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 16: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=16 --timer=20 -states 7453 -attack NoClaim -time 2.003e+01 -st/sec 3.721e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 17: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=17 --timer=20 -states 3888 -attack NoClaim -time 2.004e+01 -st/sec 1.940e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 18: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=18 --timer=20 -states 6582 -attack NoClaim -time 2.003e+01 -st/sec 3.286e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 19: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=19 --timer=20 -states 9022 -attack NoClaim -time 2.001e+01 -st/sec 4.509e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 1 correct: bounded_proof -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 20: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=20 --timer=20 -states 6393 -attack NoClaim -time 2.003e+01 -st/sec 3.192e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 21: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=21 --timer=20 -states 4284 -attack NoClaim -time 2.002e+01 -st/sec 2.140e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 4 correct: bounded_proof time=20 -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 22: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=22 --timer=20 -states 6769 -attack NoClaim -time 2.001e+01 -st/sec 3.383e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 23: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=23 --timer=20 -states 8175 -attack NoClaim -time 2.002e+01 -st/sec 4.083e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 14 correct: bounded_proof time=20 -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 24: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=24 --timer=20 -states 9625 -attack NoClaim -time 2.003e+01 -st/sec 4.805e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 25: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=25 --timer=20 -states 3883 -attack NoClaim -time 2.002e+01 -st/sec 1.940e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 26: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=26 --timer=20 -states 11992 -attack NoClaim -time 2.004e+01 -st/sec 5.984e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 27: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=27 --timer=20 -states 7361 -attack NoClaim -time 2.004e+01 -st/sec 3.673e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 28: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=28 --timer=20 -states 6277 -attack NoClaim -time 2.004e+01 -st/sec 3.132e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 29: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=29 --timer=20 -states 4728 -attack NoClaim -time 2.005e+01 -st/sec 2.358e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 30: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=30 --timer=20 -states 7610 -attack NoClaim -time 2.004e+01 -st/sec 3.797e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 31: -./multinsl-generator.py 3 11 | scyther -a -r5 -m2 --summary --goal-select=31 --timer=20 -states 8506 -attack NoClaim -time 2.003e+01 -st/sec 4.247e+02 -claim mnsl3v11 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v11 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v11 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v11 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v11 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Testing protocol 15. -Heuristic 0: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=0 --timer=20 -states 7499 -attack NoClaim -time 2.003e+01 -st/sec 3.744e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 1: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=1 --timer=20 -states 3866 -attack NoClaim -time 2.004e+01 -st/sec 1.929e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 2: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=2 --timer=20 -states 6558 -attack NoClaim -time 2.003e+01 -st/sec 3.274e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 3: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=3 --timer=20 -states 8933 -attack NoClaim -time 2.002e+01 -st/sec 4.462e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 1 correct: bounded_proof -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 4: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=4 --timer=20 -states 6354 -attack NoClaim -time 2.002e+01 -st/sec 3.174e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 5: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=5 --timer=20 -states 4278 -attack NoClaim -time 2.004e+01 -st/sec 2.135e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 4 correct: bounded_proof time=20 -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 6: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=6 --timer=20 -states 6749 -attack NoClaim -time 2.002e+01 -st/sec 3.371e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 7: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=7 --timer=20 -states 8166 -attack NoClaim -time 2.003e+01 -st/sec 4.077e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 14 correct: bounded_proof time=20 -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 8: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=8 --timer=20 -states 9805 -attack NoClaim -time 2.006e+01 -st/sec 4.888e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 9: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=9 --timer=20 -states 3873 -attack NoClaim -time 2.004e+01 -st/sec 1.933e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 10: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=10 --timer=20 -states 10729 -attack NoClaim -time 2.006e+01 -st/sec 5.348e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 11: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=11 --timer=20 -states 6679 -attack NoClaim -time 2.005e+01 -st/sec 3.331e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 12: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=12 --timer=20 -states 6119 -attack NoClaim -time 2.005e+01 -st/sec 3.052e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 13: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=13 --timer=20 -states 3513 -attack NoClaim -time 2.009e+01 -st/sec 1.749e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 14: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=14 --timer=20 -states 7548 -attack NoClaim -time 2.004e+01 -st/sec 3.766e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 15: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=15 --timer=20 -states 8461 -attack NoClaim -time 2.002e+01 -st/sec 4.226e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 16: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=16 --timer=20 -states 7503 -attack NoClaim -time 2.003e+01 -st/sec 3.746e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 17: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=17 --timer=20 -states 3837 -attack NoClaim -time 2.003e+01 -st/sec 1.916e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 18: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=18 --timer=20 -states 6537 -attack NoClaim -time 2.005e+01 -st/sec 3.260e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 19: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=19 --timer=20 -states 8893 -attack NoClaim -time 2.004e+01 -st/sec 4.438e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 1 correct: bounded_proof -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 20: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=20 --timer=20 -states 6325 -attack NoClaim -time 2.003e+01 -st/sec 3.158e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 21: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=21 --timer=20 -states 4253 -attack NoClaim -time 2.005e+01 -st/sec 2.121e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 4 correct: bounded_proof time=20 -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 22: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=22 --timer=20 -states 6756 -attack NoClaim -time 2.004e+01 -st/sec 3.371e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 23: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=23 --timer=20 -states 8149 -attack NoClaim -time 2.003e+01 -st/sec 4.068e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 14 correct: bounded_proof time=20 -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 24: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=24 --timer=20 -states 9785 -attack NoClaim -time 2.004e+01 -st/sec 4.883e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 25: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=25 --timer=20 -states 3832 -attack NoClaim -time 2.006e+01 -st/sec 1.910e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 26: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=26 --timer=20 -states 10699 -attack NoClaim -time 2.009e+01 -st/sec 5.326e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 27: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=27 --timer=20 -states 6672 -attack NoClaim -time 2.006e+01 -st/sec 3.326e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 28: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=28 --timer=20 -states 6136 -attack NoClaim -time 2.010e+01 -st/sec 3.053e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 29: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=29 --timer=20 -states 3521 -attack NoClaim -time 2.009e+01 -st/sec 1.753e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 30: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=30 --timer=20 -states 7584 -attack NoClaim -time 2.006e+01 -st/sec 3.781e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 -Heuristic 31: -./multinsl-generator.py 3 15 | scyther -a -r5 -m2 --summary --goal-select=31 --timer=20 -states 8369 -attack NoClaim -time 2.004e+01 -st/sec 4.176e+02 -claim mnsl3v15 R2V Nisynch_R2b found: 0 correct: does_not_occur -claim mnsl3v15 R2V Secret_R2a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R1V Nisynch_R1b found: 0 correct: does_not_occur -claim mnsl3v15 R1V Secret_R1a found: 1 correct: bounded_proof time=20 -claim mnsl3v15 R0V Nisynch_R0b found: 0 correct: does_not_occur -claim mnsl3v15 R0V Secret_R0a found: 1 correct: bounded_proof time=20 - - -13,25 work well. diff --git a/Vagrant Files/shared/scyther/Protocols/multi-NSL/mnsl-results.txt b/Vagrant Files/shared/scyther/Protocols/multi-NSL/mnsl-results.txt deleted file mode 100644 index a04a56f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/multi-NSL/mnsl-results.txt +++ /dev/null @@ -1,33 +0,0 @@ -Report: -------- - -Using P 3 and 2 runs, we find attacks on [1, 5, 9, 13, 18, 22, 26, 30] -Using P 3 and 3 runs, we find attacks on [0, 3, 4, 7, 16, 19, 20, 23] -Using P 3 and 4 runs, we find attacks on [2, 6, 10, 14, 17, 21, 27, 31] -Using P 3 and 5 runs, we find attacks on [25, 29] -Using P 4 and 3 runs, we find attacks on [8, 24] -Using P 4 and 5 runs, we find attacks on [12, 28] - -Log: ----- -Slave1:multiparty% ./test-variants.py -Testing using P 3 and 2 runs. -Using P 3 and 2 runs, we find attacks on [1, 5, 9, 13, 18, 22, 26, 30] -Therefore, we are left with 24 candidates: [0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 14, 15, 16, 17, 19, 20, 21, 23, 24, 25, 27, 28, 29, 31] -Testing using P 3 and 3 runs. -Using P 3 and 3 runs, we find attacks on [0, 3, 4, 7, 16, 19, 20, 23] -Therefore, we are left with 16 candidates: [2, 6, 8, 10, 11, 12, 14, 15, 17, 21, 24, 25, 27, 28, 29, 31] -Testing using P 3 and 4 runs. -Using P 3 and 4 runs, we find attacks on [2, 6, 10, 14, 17, 21, 27, 31] -Therefore, we are left with 8 candidates: [8, 11, 12, 15, 24, 25, 28, 29] -Testing using P 3 and 5 runs. -Using P 3 and 5 runs, we find attacks on [25, 29] -Therefore, we are left with 6 candidates: [8, 11, 12, 15, 24, 28] -Testing using P 4 and 3 runs. -Using P 4 and 3 runs, we find attacks on [8, 24] -Therefore, we are left with 4 candidates: [11, 12, 15, 28] -Testing using P 4 and 4 runs. -Testing using P 4 and 5 runs. -Using P 4 and 5 runs, we find attacks on [12, 28] -Therefore, we are left with 2 candidates: [11, 15] -Testing using P 4 and 6 runs. diff --git a/Vagrant Files/shared/scyther/Protocols/multi-NSL/multinsl-generator.py b/Vagrant Files/shared/scyther/Protocols/multi-NSL/multinsl-generator.py deleted file mode 100644 index ad44870..0000000 --- a/Vagrant Files/shared/scyther/Protocols/multi-NSL/multinsl-generator.py +++ /dev/null @@ -1,345 +0,0 @@ -#!/usr/bin/python -# -# Generate Multi-party NSL protocol description for n parties -# -# Input: P variant -# -# variant uses some bits: -# bit mask meaning if set to '1' -# (message type 1) -# 0 1 nonces in reverse -# 1 2 nonces after agents -# 2 4 agents in reverse -# 3 8 interleaved variant -# (message type 2) -# 4 16 nonces in reverse in message 2 -# -# Convention similar to e.g. Prolog: capitals indicate open variables; -# in particular, they can be bound by _any_ value during the run, -# assuming full type flaws. -# -import sys -from optparse import OptionParser - -def parseArgs(): - usage = "usage: %s [opts] Parties Variant" % sys.argv[0] - parser = OptionParser(usage=usage) - parser.add_option('-p','--protocol', dest='protocol', - help='Generate another protocol [nsl,bke]', default="nsl", - action='store') - (opts, args) = parser.parse_args() - if len(args) != 2: - parser.print_help() - sys.exit(0) - if opts.protocol not in ["nsl","bke","nsl-priv-noprop","nsl-pub-nap","bke-nap"]: - print "I don't know the %s protocol." % (opts.protocol) - sys.exit(0) - return (opts,args) - - -def variablerole (r, inrole): - if r == inrole or inrole == 0: - return False - else: - return True - -def role (r,inrole): - global P - - return "r%i" % (r % P) - -def zeroconst (): - - """ This is 0 or some other stupid constant """ - - return "zeroconst" - -def nonce (r,inrole): - global P - - if r == inrole: - # nonce of our own - return "n%i" % (r % P) - else: - # a variable: we want to see this in the notation - return "N%i" % (r % P) - -def extend (s1, s2): - if s1 == "": - return s2 - else: - return s1 + "," + s2 - -def weavel (l1,l2,reverse1,swap,reverse2,interleave): - """ l1 is typically a list of nonces, l2 might be empty (names) """ - global variant - - if reverse1: - l1.reverse() - if l2 == []: - return l1 - else: - if reverse2: - l2.reverse() - if swap: - # swap - l3 = l1 - l1 = l2 - l2 = l3 - if interleave: - rl = [] - largest = max(len(l1),len(l2)) - for i in range (0,largest): - if i < len(l1): - rl.append(l1[i]) - if i < len(l2): - rl.append(l2[i]) - return rl - else: - return l1 + l2 - -def message1 (label,inrole): - global P,variant,opts - - if opts.protocol in ['bke','nsl']: - noncelist = [] - for i in range(0,label+1): - noncelist.append(nonce(i,inrole)) - rolelist = [] - for i in range(0,P): - if i != (label+1) % P: - rolelist.append(role(i,inrole)) - - return ",".join(weavel(noncelist,rolelist, - (variant & 1 != 0), - (variant & 2 != 0), - (variant & 4 != 0), - (variant & 8 != 0) - )) - elif opts.protocol == 'nsl-priv-noprop': - - list = [] - for i in range(0,P): - list.append(role(i,inrole)) - list.append(nonce(0,inrole)) - msg = ",".join(list) - - for i in range(1,label+1): - msg = "{ %s,%s }sk(%s)" % (msg,nonce(i,inrole),role(i,inrole)) - - return msg - - elif opts.protocol == 'nsl-pub-nap': - - list = [] - for i in range(0,P): - list.append(role(i,inrole)) - list.append(nonce(0,inrole)) - msg = ",".join(list) - - for i in range(1,label+1): - msg = "{ %s }sk(%s), %s" % (msg,role(i,inrole),nonce(i,inrole)) - - msg = "{ %s }pk(%s)" % (msg,role(label+1,inrole)) - - return msg - elif opts.protocol == 'bke-nap': - - list = [] - for i in range(0,P): - list.append(role(i,inrole)) - list.append(nonce(0,inrole)) - msg = ",".join(list) - - for i in range(1,label+1): - msg = "{ %s }sk(%s), %s" % (msg,role(i,inrole),nonce(i,inrole)) - - msg = "{ %s }pk(%s)" % (msg,role(label+1,inrole)) - - return msg - else: - print "Hmm, I don't know how to create the first message for protocol %s" % (opts.protocol) - -def message2 (label,inrole): - global P,variant,opts - - if opts.protocol == "nsl": - noncelist = [] - for i in range (((label + 1) % P),P): - noncelist.append(nonce(i,inrole)) - - return ",".join(weavel(noncelist,[], - (variant & 16 != 0), - False, - False, - False - )) - elif opts.protocol == "bke": - noncelist = [] - for i in range (((label + 1) % P) + 1,P): - noncelist.append(nonce(i,inrole)) - if len(noncelist) == 0: - noncelist.append(zeroconst()) - - return ",".join(weavel(noncelist,[], - (variant & 16 != 0), - False, - False, - False - )) - elif opts.protocol in ['nsl-priv-noprop','nsl-pub-nap']: - msg = message1(P-1,inrole) - for i in range(0,label-P+1): - msg = "{ %s }sk(%s)" % (msg,role(i,inrole)) - - if opts.protocol == 'nsl-pub-nap': - msg = "{ %s }pk(%s)" % (msg,role(label+1,inrole)) - - return msg - elif opts.protocol == 'bke-nap': - msg = message1(P-1,inrole) - for i in range(0,label-P+1): - msg = "{ %s }sk(%s)" % (msg,role(i,inrole)) - - msg = "{ %s }%s" % (msg,nonce((label+1) % P,inrole)) - - return msg - else: - print "Hmm, I don't know how to create the final message for protocol %s" % (opts.protocol) - -def message (label,inrole): - global P,opts - - if opts.protocol in ['bke','nsl']: - s = "{ " - if label < P: - s = s + message1 (label,inrole) - else: - s = s + message2 (label,inrole) - - if opts.protocol == "bke" and not (label < P): - s = s + " }" + nonce((label+1) % P, inrole) - else: - s = s + " }pk(%s)" % role(label+1,inrole) - return s - else: - if label < P: - return message1 (label,inrole) - else: - return message2 (label,inrole) - - -def action (event,label,inrole): - s = "\t\t%s_%i(%s,%s, " % (event,label, role(label,inrole), - role(label+1,inrole)) - s += message (label,inrole) - s += " );\n" - return s - -def recv (label,inrole): - return action ("recv", label,inrole) - - -def send (label,inrole): - return action ("send", label,inrole) - -def roledef (r): - global P,opts - - s = "" - s += "\trole " + role(r,r) + "\n\t{\n" - - # constants for this role - - s += "\t\tconst " + nonce (r,r) + ": Nonce;\n" - - # variables - - s += "\t\tvar " - nr = 0 - for i in range (0,P): - if r != i: - if nr > 0: - s += "," - s += nonce(i,r) - nr += 1 - - s += ": Nonce;\n" - - # implicit role variables - - rolevars = [] - for i in range (0,P): - if variablerole(i,r): - rolevars.append(role(i,r)) - - if rolevars != []: - s += "\t\t// Implicit role variables: " - s += ",".join(rolevars) - s += ": Role;\n" - - # actions - - s += "\n" - if r > 0: - # Initial recv - s += recv(r-1,r) - s += send(r,r) - s += recv(P+r-1,r) - if r < (P-1): - # Final send - s += send(P+r,r) - - # claims - - if opts.protocol in ['bke','nsl','nsl-pub-nap','bke-nap']: - s += "\t\tclaim_%sa( %s, Secret, %s );\n" % (role(r,r), role(r,r), - nonce(r,r)) - s += "\t\tclaim_%sb( %s, Nisynch );\n" % (role(r,r), role(r,r)) - - # close - s += "\t}\n\n" - return s - - -def protocol (args): - global P,variant,opts - - P = int(args[0]) - variant = int(args[1]) - - s = "" - s += "// Generalized %s protocol for %i parties\n\n" % (opts.protocol,P) - s += "// " + str(opts) + "\n\n" - s += "// Variant %i\n" % variant - - if opts.protocol == "bke": - s += "usertype Globalconstant;\n" - s += "const %s: Globalconstant;\n" % (zeroconst()) - - s += "\n" - - s += "protocol mnsl%iv%i(" % (P,variant) - for i in range (0,P): - if i > 0: - s += "," - s += role(i,i) - s += ")\n{\n" - - for i in range (0,P): - s += roledef(i) - - s += "}\n\n" - - s += "\n" - return s - -def main(): - global opts - - (opts,args) = parseArgs() - print protocol(args) - -# Only if main stuff -if __name__ == '__main__': - main() diff --git a/Vagrant Files/shared/scyther/Protocols/multi-NSL/test-heuristics.py b/Vagrant Files/shared/scyther/Protocols/multi-NSL/test-heuristics.py deleted file mode 100644 index 34c03fc..0000000 --- a/Vagrant Files/shared/scyther/Protocols/multi-NSL/test-heuristics.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/python -# -# -# Idea: -# -# We test all options for the heuristics [0..31] to compare, -# and sincerely hope on gives a complete proof. -# we slowly refine the tests. -# -import commands - -def startset(): - mainlist = [11, 15] - print "Starting with", mainlist - return mainlist - -def tuplingchoice(heur,variant,P,runs,latupling): - # variant is in range [0..64>, - # where we use the highest bid to signify the - # associativity of the tupling. - - extraflags = "" - if latupling: - extraflags += " --la-tupling" - - # Choose heuristics - extraflags += " --goal-select=%i" % (heur) - - # Time limit - extraflags += " --timer=20" - - s = "./multinsl-generator.py" - s += " %i %i" % (P,variant) - s += " | scyther -a -r%i -m2 --summary %s" % (runs, extraflags) - - ## Old stuff - #s += " | scyther -a -r%i --summary" % runs - - # Show what we're doing - print s - - #s += " | grep \"complete\"" - out = commands.getoutput(s) - if out == "": - #print "Okay" - return False - else: - print out - return True - -def testvariant(h,v,p,r): - if tuplingchoice (h,v,p,r, False): - return True - else: - return tuplingchoice (h,v,p,r, True) - -def scan(testlist, P, runs): - print "Testing using P %i and %i runs." % (P,runs) - for i in testlist: - print "Testing protocol %i." % (i) - for h in range (0,32): - print "Heuristic %i:" % (h) - testvariant (h,i,P,runs) - -def main(): - candidates = startset() - scan(candidates,3,5) - -main() diff --git a/Vagrant Files/shared/scyther/Protocols/multi-NSL/test-variants.py b/Vagrant Files/shared/scyther/Protocols/multi-NSL/test-variants.py deleted file mode 100644 index ae00ce7..0000000 --- a/Vagrant Files/shared/scyther/Protocols/multi-NSL/test-variants.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/python -# -# -# Idea: -# -# We test all variants [0..31] until we are sure they work. Thus, -# we slowly refine the tests. -# -import commands - -def startset(): - return range(0,32) - - mainlist = [11, 15] - print "Starting with", mainlist - return mainlist - -def tuplingchoice(variant,P,runs,latupling): - # variant is in range [0..64>, - # where we use the highest bid to signify the - # associativity of the tupling. - - extraflags = "" - if latupling: - extraflags += " --la-tupling" - - s = "./multinsl-generator.py" - s += " %i %s" % (P,variant) - s += " | scyther -r%i --untyped %s" % (runs, extraflags) - #s += " | scyther -a -r%i --summary" % runs - #print s - s += " | grep \"Fail\"" - out = commands.getoutput(s) - if out == "": - #print "Okay" - return True - else: - #print out - # Thus, MultiNSL P variant has the first attack for n runs - return False - -def testvariant(v,p,r): - if not tuplingchoice (v,p,r, False): - return False - else: - return tuplingchoice (v,p,r, True) - -def removeattacks (testlist, P, runs): - okaylist = [] - for v in testlist: - if testvariant (v, P, runs): - okaylist.append(v) - return okaylist - -def scan(testlist, P, runs): - print "Testing using P %i and %i runs." % (P,runs) - results = removeattacks (testlist, P, runs) - if len(results) < len(testlist): - attacked = [] - for i in range(0,len(testlist)): - if testlist[i] not in results: - attacked.append(testlist[i]) - print "Using P %i and %i runs, we find attacks on %s" % (P,runs, str(attacked)) - print "Therefore, we are left with %i candidates: " % (len(results)), results - - return results - -def main(): - candidates = startset() - for P in range(3,7): - for rundiff in range(0,5): - candidates = scan(candidates,P,P+rundiff) - - print - print "Good variants:" - print candidates - - -main() diff --git a/Vagrant Files/shared/scyther/Protocols/needham-schroeder-lowe.spdl b/Vagrant Files/shared/scyther/Protocols/needham-schroeder-lowe.spdl deleted file mode 100644 index fabb522..0000000 --- a/Vagrant Files/shared/scyther/Protocols/needham-schroeder-lowe.spdl +++ /dev/null @@ -1,53 +0,0 @@ -# Lowe's fixed version of Needham Schroeder Public Key -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/nspkLowe.html -# -# -# Note: -# The modelling in SPORE includes a server to distribute the public keys -# of the agents, this is not necessary and it allows for attacks against -# synchronisation and agreement, because the keys that the server sends -# out can be replayed. - -protocol needhamschroederpk-Lowe(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - - send_1(I,S, (I,R)); - recv_2(S,I, {pk(R), R}sk(S)); - send_3(I,R,{Ni,I}pk(R)); - recv_6(R,I, {Ni,Nr,R}pk(I)); - send_7(I,R, {Nr}pk(R)); - claim_I1(I,Secret,Ni); - claim_I2(I,Secret,Nr); - claim_I3(I,Nisynch); - } - - role R - { - fresh Nr: Nonce; - var Ni: Nonce; - - recv_3(I,R,{Ni,I}pk(R)); - send_4(R,S,(R,I)); - recv_5(S,R,{pk(I),I}sk(S)); - send_6(R,I,{Ni,Nr,R}pk(I)); - recv_7(I,R,{Nr}pk(R)); - claim_R1(R,Secret,Nr); - claim_R2(R,Secret,Ni); - claim_R3(R,Nisynch); - } - - role S - { - recv_1(I,S,(I,R)); - send_2(S,I,{pk(R),R}sk(S)); - recv_4(R,S,(R,I)); - send_5(S,R,{pk(I),I}sk(S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/needham-schroeder-sk-amend.spdl b/Vagrant Files/shared/scyther/Protocols/needham-schroeder-sk-amend.spdl deleted file mode 100644 index 189093d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/needham-schroeder-sk-amend.spdl +++ /dev/null @@ -1,66 +0,0 @@ -# Amended Needham Schroeder Symmetric Key -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/nssk_amended.html -# -# -# Note: -# According to SPORE there are no attacks on this protocol, scyther -# finds one however. This has to be investigated further. - - - -# Model dec that is invertible by inc -const dec,inc: Function; -inversekeys(dec,inc); -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol needhamschroedersk-amend(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var Kir: SessionKey; - var T,T2: Ticket; - - send_1(I,R,I); - recv_2(R,I,T); - send_3(I,S,(I,R,Ni,T)); - recv_4(S,I, {Ni,R,Kir,T2}k(I,S)); - send_5(I,R,T2); - recv_6(R,I,{Nr}Kir); - send_7(I,R,{{Nr}dec}Kir); - - claim_I2(I,Secret,Kir); - claim_I3(I,Nisynch); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - fresh Nr: Nonce; - var Kir: SessionKey; - - recv_1(I,R,I); - send_2(R,I,{I,Nr}k(R,S)); - recv_5(I,R,{Kir,Nr,I}k(R,S)); - send_6(R,I,{Nr}Kir); - recv_7(I,R,{{Nr}dec}Kir); - claim_R1(R,Secret,Nr); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var Ni,Nr: Nonce; - fresh Kir: SessionKey; - recv_3(I,S,(I,R,Ni,{I,Nr}k(R,S))); - send_4(S,I,{Ni,R,Kir,{Kir,Nr,I}k(R,S)}k(I,S)); - } - -} - diff --git a/Vagrant Files/shared/scyther/Protocols/needham-schroeder-sk.spdl b/Vagrant Files/shared/scyther/Protocols/needham-schroeder-sk.spdl deleted file mode 100644 index 71a7e6c..0000000 --- a/Vagrant Files/shared/scyther/Protocols/needham-schroeder-sk.spdl +++ /dev/null @@ -1,56 +0,0 @@ -# Needham Schroeder Symmetric Key -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/nssk.html -# -# - - -# Model dec that is invertible by inc -const dec,inc: Function; -inversekeys(dec,inc); -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol needhamschroedersk(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var Kir: SessionKey; - var T: Ticket; - - send_1(I,S,(I,R,Ni)); - recv_2(S,I, {Ni,R,Kir,T}k(I,S)); - send_3(I,R,T); - recv_4(R,I,{Nr}Kir); - send_5(I,R,{{Nr}dec}Kir); - claim_I2(I,Secret,Kir); - claim_I3(I,Nisynch); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - fresh Nr: Nonce; - var Kir: SessionKey; - - recv_3(I,R,{Kir,I}k(R,S)); - send_4(R,I,{Nr}Kir); - recv_5(I,R,{{Nr}dec}Kir); - claim_R1(R,Secret,Kir); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var Ni: Nonce; - fresh Kir: SessionKey; - recv_1(I,S,(I,R,Ni)); - send_2(S,I,{Ni,R,Kir,{Kir,I}k(R,S)}k(I,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/needham-schroeder.spdl b/Vagrant Files/shared/scyther/Protocols/needham-schroeder.spdl deleted file mode 100644 index ea14854..0000000 --- a/Vagrant Files/shared/scyther/Protocols/needham-schroeder.spdl +++ /dev/null @@ -1,53 +0,0 @@ -# Needham Schroeder Public Key -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/nspk.html -# -# -# Note: -# The modelling in SPORE includes a server to distribute the public keys -# of the agents, this is not necessary and it allows for attacks against -# synchronisation and agreement, because the keys that the server sends -# out can be replayed. - -protocol needhamschroederpk(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - - send_1(I,S,(I,R)); - recv_2(S,I, {pk(R), R}sk(S)); - send_3(I,R,{Ni,I}pk(R)); - recv_6(R,I, {Ni, Nr}pk(I)); - send_7(I,R, {Nr}pk(R)); - claim_I1(I,Secret,Ni); - claim_I2(I,Secret,Nr); - claim_I3(I,Nisynch); - } - - role R - { - fresh Nr: Nonce; - var Ni: Nonce; - - recv_3(I,R,{Ni,I}pk(R)); - send_4(R,S,(R,I)); - recv_5(S,R,{pk(I),I}sk(S)); - send_6(R,I,{Ni,Nr}pk(I)); - recv_7(I,R,{Nr}pk(R)); - claim_R1(R,Secret,Nr); - claim_R2(R,Secret,Ni); - claim_R3(R,Nisynch); - } - - role S - { - recv_1(I,S,(I,R)); - send_2(S,I,{pk(R),R}sk(S)); - recv_4(R,S,(R,I)); - send_5(S,R,{pk(I),I}sk(S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/neumannstub-guttman-hwang.spdl b/Vagrant Files/shared/scyther/Protocols/neumannstub-guttman-hwang.spdl deleted file mode 100644 index bcb48d2..0000000 --- a/Vagrant Files/shared/scyther/Protocols/neumannstub-guttman-hwang.spdl +++ /dev/null @@ -1,105 +0,0 @@ -# Neumann Stubblebine -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/neumannStubblebine.html -# -# Note: -# In SPORE this protocol is not described correctly, there are in fact 2 -# different protocols (the key establishment protocol and the repeated -# authentication protocol) - -usertype Server, SessionKey, TimeStamp, TicketKey; -usertype ExpiredTimeStamp; - -const Fresh: Function; -const Compromised: Function; - -protocol neustub-GuttmanHwang^Repeat(I,R,S) -{ - fresh Kir: SessionKey; - - role I - { - fresh Mi: Nonce; - var Mr: Nonce; - fresh Kir: SessionKey; - fresh Tr: TimeStamp; - - send_5(I,R,Mi,{I,Kir,Tr}k(R,S)); - recv_6(R,I,{Mi,Mr}Kir); - send_7(I,R,{I,Mr}Kir); - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - fresh Mr: Nonce; - var Tr: TimeStamp; - var Kir: SessionKey; - var Mi: Nonce; - - recv_5(I,R,Mi,{I,Kir,Tr}k(R,S)); - send_6(R,I,{Mi,Mr}Kir); - recv_7(I,R,{I,Mr}Kir); - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - } -} -protocol neustub-GuttmanHwang(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var T: Ticket; - var Tb: TimeStamp; - var Kir: SessionKey; - - send_1(I,R, I, Ni); - recv_!3(S,I, { R,Ni,Kir,Tb}k(I,S), T, Nr); - send_!4(I,R,T,{Nr}Kir); - - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - var Ni,Mi: Nonce; - fresh Nr,Mr: Nonce; - var Kir: SessionKey; - fresh Tb: TimeStamp; - var T: Ticket; - - recv_1(I,R, I, Ni); - send_!2(R,S, R, {I, Ni, Tb ,Nr}k(R,S)); - recv_!4(I,R,{I,Kir,Tb}k(R,S),{Nr}Kir); - - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var Ni, Nr: Nonce; - fresh Kir: SessionKey; - var Tb: TimeStamp; - - recv_!2(R,S, R, {I,Ni,Tb,Nr}k(R,S)); - send_!3(S,I, { R, Ni, Kir, Tb}k(I,S), { I,Kir,Tb}k(R,S),Nr ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/neumannstub-guttman.spdl b/Vagrant Files/shared/scyther/Protocols/neumannstub-guttman.spdl deleted file mode 100644 index 09e7f6e..0000000 --- a/Vagrant Files/shared/scyther/Protocols/neumannstub-guttman.spdl +++ /dev/null @@ -1,105 +0,0 @@ -# Neumann Stubblebine -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/neumannStubblebine.html -# -# Note: -# In SPORE this protocol is not described correctly, there are in fact 2 -# different protocols (the key establishment protocol and the repeated -# authentication protocol) - -usertype Server, SessionKey, TimeStamp, TicketKey; -usertype ExpiredTimeStamp; - -const Fresh: Function; -const Compromised: Function; - -protocol neustub^Repeat(I,R,S) -{ - fresh Kir: SessionKey; - - role I - { - fresh Mi: Nonce; - var Mr: Nonce; - fresh Kir: SessionKey; - fresh Tr: TimeStamp; - - send_5(I,R,Mi,{I,Kir,Tr}k(R,S)); - recv_6(R,I,{Mi,Mr}Kir); - send_7(I,R,{I,Mr}Kir); - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - fresh Mr: Nonce; - var Tr: TimeStamp; - var Kir: SessionKey; - var Mi: Nonce; - - recv_5(I,R,Mi,{I,Kir,Tr}k(R,S)); - send_6(R,I,{Mi,Mr}Kir); - recv_7(I,R,{I,Mr}Kir); - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - } -} -protocol neustub(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var T: Ticket; - var Tb: TimeStamp; - var Kir: SessionKey; - - send_1(I,R, I, Ni); - recv_!3(S,I, { R,Ni,Kir,Tb}k(I,S), T, Nr); - send_4(I,R,T,{Nr}Kir); - - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - var Ni,Mi: Nonce; - fresh Nr,Mr: Nonce; - var Kir: SessionKey; - fresh Tb: TimeStamp; - var T: Ticket; - - recv_1(I,R, I, Ni); - send_!2(R,S, R, {I, Ni, Tb}k(R,S),Nr); - recv_4(I,R,{I,Kir,Tb}k(R,S),{Nr}Kir); - - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var Ni, Nr: Nonce; - fresh Kir: SessionKey; - var Tb: TimeStamp; - - recv_!2(R,S, R, {I,Ni,Tb}k(R,S), Nr); - send_!3(S,I, { R, Ni, Kir, Tb}k(I,S), { I,Kir,Tb}k(R,S),Nr ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/neumannstub-hwang.spdl b/Vagrant Files/shared/scyther/Protocols/neumannstub-hwang.spdl deleted file mode 100644 index 1546b40..0000000 --- a/Vagrant Files/shared/scyther/Protocols/neumannstub-hwang.spdl +++ /dev/null @@ -1,71 +0,0 @@ -# Hwang modified Neumann Stubblebine -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/neumannStubblebineHwang.html -# -# Note: -# According to SPORE there are no attacks on this protocol, scyther -# finds one however. This has to be investigated further. - - -usertype Server, SessionKey, TimeStamp, TicketKey; -usertype ExpiredTimeStamp; - -const Fresh: Function; -const Compromised: Function; - -protocol neustub-Hwang(I,R,S) -{ - role I - { - fresh Ni,Mi: Nonce; - var Nr,Mr: Nonce; - var T: Ticket; - var Tb: TimeStamp; - var Kir: SessionKey; - - send_1(I,R, I, Ni); - recv_!3(S,I, { R,Ni,Kir,Tb}k(I,S), T, Nr); - send_4(I,R,T,{Nr}Kir); - send_5(I,R,Mi,T); - recv_6(R,I,Mr,{Mi}Kir); - send_7(I,R,{Mr}Kir); - - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - var Ni,Mi: Nonce; - fresh Nr,Mr: Nonce; - var Kir: SessionKey; - fresh Tb: TimeStamp; - var T: Ticket; - - recv_1(I,R, I, Ni); - send_!2(R,S, R, {I, Ni, Tb, Nr}k(R,S)); - recv_4(I,R,{I,Kir,Tb}k(R,S),{Nr}Kir); - recv_5(I,R,Mi,T); - send_6(R,I,Mr,{Mi}Kir); - recv_7(I,R,{Mr}Kir); - - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var Ni, Nr: Nonce; - fresh Kir: SessionKey; - var Tb: TimeStamp; - - recv_!2(R,S, R, {I,Ni,Tb,Nr}k(R,S)); - send_!3(S,I, { R, Ni, Kir, Tb}k(I,S), { I,Kir,Tb}k(R,S),Nr ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/neumannstub-keycompromise.spdl b/Vagrant Files/shared/scyther/Protocols/neumannstub-keycompromise.spdl deleted file mode 100644 index d803150..0000000 --- a/Vagrant Files/shared/scyther/Protocols/neumannstub-keycompromise.spdl +++ /dev/null @@ -1,105 +0,0 @@ -# Neumann Stubblebine -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/neumannStubblebine.html -# -# Note: -# In SPORE this protocol is not described correctly, there are in fact 2 -# different protocols (the key establishment protocol and the repeated -# authentication protocol) - -usertype Server, SessionKey, TimeStamp, TicketKey; -usertype ExpiredTimeStamp; - -const Fresh: Function; -const Compromised: Function; - -protocol neustub^Repeat(I,R,S) -{ - fresh Kir: SessionKey; - - role I - { - fresh Mi: Nonce; - var Mr: Nonce; - fresh Kir: SessionKey; - fresh Tr: TimeStamp; - - send_5(I,R,Mi,{I,Kir,Tr}k(R,S)); - recv_6(R,I,Mr,{Mi}Kir); - send_7(I,R,{Mr}Kir); - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - fresh Mr: Nonce; - var Tr: TimeStamp; - var Kir: SessionKey; - var Mi: Nonce; - - recv_5(I,R,Mi,{I,Kir,Tr}k(R,S)); - send_6(R,I,Mr,{Mi}Kir); - recv_7(I,R,{Mr}Kir); - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - } -} -protocol neustub(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var T: Ticket; - var Tb: TimeStamp; - var Kir: SessionKey; - - send_1(I,R, I, Ni); - recv_3(S,I, { R,Ni,Kir,Tb}k(I,S), T, Nr); - send_4(I,R,T,{Nr}Kir); - - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - claim_I4(I,Empty,(Fresh,Kir)); - } - - role R - { - var Ni,Mi: Nonce; - fresh Nr,Mr: Nonce; - var Kir: SessionKey; - fresh Tb: TimeStamp; - var T: Ticket; - - recv_1(I,R, I, Ni); - send_2(R,S, R, {I, Ni, Tb}k(R,S),Nr); - recv_4(I,R,{I,Kir,Tb}k(R,S),{Nr}Kir); - - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - claim_R4(R,Empty,(Fresh,Kir)); - } - - role S - { - var Ni, Nr: Nonce; - fresh Kir: SessionKey; - var Tb: TimeStamp; - - recv_2(R,S, R, {I,Ni,Tb}k(R,S), Nr); - send_3(S,I, { R, Ni, Kir, Tb}k(I,S), { I,Kir,Tb}k(R,S),Nr ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/neumannstub.spdl b/Vagrant Files/shared/scyther/Protocols/neumannstub.spdl deleted file mode 100644 index d1d0ee1..0000000 --- a/Vagrant Files/shared/scyther/Protocols/neumannstub.spdl +++ /dev/null @@ -1,98 +0,0 @@ -# Neumann Stubblebine -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/neumannStubblebine.html -# -# Note: -# In SPORE this protocol is not described correctly, there are in fact 2 -# different protocols (the key establishment protocol and the repeated -# authentication protocol) - -usertype Server, SessionKey, TimeStamp, TicketKey; -usertype ExpiredTimeStamp; - -protocol neustub^Repeat(I,R,S) -{ - fresh Kir: SessionKey; - - role I - { - fresh Mi: Nonce; - var Mr: Nonce; - fresh Kir: SessionKey; - fresh Tr: TimeStamp; - - send_5(I,R,Mi,{I,Kir,Tr}k(R,S)); - recv_6(R,I,Mr,{Mi}Kir); - send_7(I,R,{Mr}Kir); - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - } - - role R - { - fresh Mr: Nonce; - var Tr: TimeStamp; - var Kir: SessionKey; - var Mi: Nonce; - - recv_5(I,R,Mi,{I,Kir,Tr}k(R,S)); - send_6(R,I,Mr,{Mi}Kir); - recv_7(I,R,{Mr}Kir); - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - } - - role S - { - } -} -protocol neustub(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var T: Ticket; - var Tb: TimeStamp; - var Kir: SessionKey; - - send_1(I,R, I, Ni); - recv_!3(S,I, { R,Ni,Kir,Tb}k(I,S), T, Nr); - send_4(I,R,T,{Nr}Kir); - - claim_I1(I,Secret, Kir); - claim_I2(I,Niagree); - claim_I3(I,Nisynch); - } - - role R - { - var Ni,Mi: Nonce; - fresh Nr,Mr: Nonce; - var Kir: SessionKey; - fresh Tb: TimeStamp; - var T: Ticket; - - recv_1(I,R, I, Ni); - send_!2(R,S, R, {I, Ni, Tb}k(R,S),Nr); - recv_4(I,R,{I,Kir,Tb}k(R,S),{Nr}Kir); - - claim_R1(R,Secret, Kir); - claim_R2(R,Niagree); - claim_R3(R,Nisynch); - } - - role S - { - var Ni, Nr: Nonce; - fresh Kir: SessionKey; - var Tb: TimeStamp; - - recv_!2(R,S, R, {I,Ni,Tb}k(R,S), Nr); - send_!3(S,I, { R, Ni, Kir, Tb}k(I,S), { I,Kir,Tb}k(R,S),Nr ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/otwayrees.spdl b/Vagrant Files/shared/scyther/Protocols/otwayrees.spdl deleted file mode 100644 index bed12ad..0000000 --- a/Vagrant Files/shared/scyther/Protocols/otwayrees.spdl +++ /dev/null @@ -1,56 +0,0 @@ -# Otway Rees -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/otwayRees.html -# - - -const Fresh: Function; -const Compromised: Function; - -usertype String,SessionKey; - -protocol otwayrees(I,R,S) -{ - role I - { - fresh Ni : Nonce; - fresh M : String; - var Kir : SessionKey; - - send_1(I,R, M,I,R,{Ni,M,I,R}k(I,S) ); - recv_4(R,I, M,{Ni,Kir}k(I,S) ); - - claim_I1(I, Secret,Kir); - claim_I2(I, Nisynch); - claim_I3(I, Empty, (Fresh,Kir)); - } - - role R - { - var M : String; - fresh Nr : Nonce; - var Kir : SessionKey; - var T1,T2: Ticket; - - recv_1(I,R, M,I,R, T1 ); - send_2(R,S, M,I,R, T1, { Nr,M,I,R }k(R,S) ); - recv_3(S,R, M, T2, { Nr,Kir }k(R,S) ); - send_4(R,I, M, T2 ); - - claim_R1(R, Secret,Kir); - claim_R2(R, Nisynch); - claim_R3(R, Empty, (Fresh,Kir)); - } - - role S - { - var Ni,Nr : Nonce; - var M : String; - fresh Kir : SessionKey; - - recv_2(R,S, M,I,R, { Ni,M,I,R}k(I,S), { Nr,M,I,R }k(R,S) ); - send_3(S,R, M, { Ni,Kir }k(I,S) , { Nr,Kir }k(R,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/smartright.spdl b/Vagrant Files/shared/scyther/Protocols/smartright.spdl deleted file mode 100644 index e3a9719..0000000 --- a/Vagrant Files/shared/scyther/Protocols/smartright.spdl +++ /dev/null @@ -1,46 +0,0 @@ -# SmartRight view-only -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/smartright_viewonly.html -# -# Note: -# According to SPORE there are no known attacks on this protocol -# -# Note: -# Scyther finds an attack because the value of VoR in te last message can -# be replaced with an arbitrary value - -hashfunction hash; -usertype SessionKey; -usertype XorKey; -const Vor: XorKey; - -protocol smartright(I,R) -{ - role I - { - fresh VoKey: SessionKey; - fresh VoR: XorKey; - fresh CW; - var VoRi: Nonce; - - send_1(I,R, {VoKey,{CW}VoR}k(I,R)); - recv_2(R,I, VoRi); - send_3(I,R, VoR, {{VoRi}hash}VoKey); - } - - role R - { - var T: Ticket; - var VoR: XorKey; - var VoKey: SessionKey; - fresh VoRi: Nonce; - - recv_1(I,R, {VoKey,T}k(I,R)); - send_2(R,I, VoRi); - recv_3(I,R, VoR,{{VoRi}hash}VoKey); - - claim_R1(R,Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/splice-as-cj.spdl b/Vagrant Files/shared/scyther/Protocols/splice-as-cj.spdl deleted file mode 100644 index b393294..0000000 --- a/Vagrant Files/shared/scyther/Protocols/splice-as-cj.spdl +++ /dev/null @@ -1,66 +0,0 @@ -# Clark and Jacob modified Hwang and Chen modified SPLICE/AS -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/spliceas3.html -# -# Note: -# The assumptions made here do not comply with those in SPORE -# SPORE assumes that the agents do not know the pk function, but only -# their own public key values. -# This can currently not be modelled. - - -usertype TimeStamp, LifeTime; - -const inc,dec: Function; -inversekeys (inc,dec); - -protocol spliceAS-CJ(I,R,S) -{ - role I - { - fresh N1,N2: Nonce; - fresh T: TimeStamp; - fresh L: LifeTime; - - send_1(I,S, I, R, N1 ); - recv_2(S,I, S, {S, I, N1, R, pk(R)}sk(S) ); - send_3(I,R, I, R, {T, L, {I, N2}pk(R)}sk(I) ); - recv_6(R,I, R, I, {{N2}inc}pk(I) ); - - claim_7(I, Secret, N2); - claim_9(I, Niagree); - claim_10(I, Nisynch); - } - - role S - { - var N1,N3: Nonce; - - recv_1(I,S, I, R, N1 ); - send_2(S,I, S, {S, I, N1, R, pk(R)}sk(S) ); - recv_4(R,S, R, I, N3 ); - send_5(S,R, S, {S, R, N3, pk(I)}sk(S) ); - } - - role R - { - fresh N3: Nonce; - var N2: Nonce; - var T: TimeStamp; - var L: LifeTime; - - var ni: Nonce; - fresh nr: Nonce; - - recv_3(I,R, I, R, {T, L, {I, N2}pk(R)}sk(I) ); - send_4(R,S, R, I, N3 ); - recv_5(S,R, S, {S, R, N3, pk(I)}sk(S) ); - send_6(R,I, R, I, {{N2}inc}pk(I) ); - - claim_8(R, Secret, N2); - claim_11(R, Niagree); - claim_12(R, Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/splice-as-hc.spdl b/Vagrant Files/shared/scyther/Protocols/splice-as-hc.spdl deleted file mode 100644 index 2f975ad..0000000 --- a/Vagrant Files/shared/scyther/Protocols/splice-as-hc.spdl +++ /dev/null @@ -1,61 +0,0 @@ -# Hwang and Chen Modified SPLICE/AS -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/spliceas2.html -# - - -usertype TimeStamp, LifeTime; - -const inc,dec: Function; -inversekeys (inc,dec); - -protocol spliceAS-HC(I,R,S) -{ - role I - { - fresh N1,N2: Nonce; - fresh T: TimeStamp; - fresh L: LifeTime; - - send_1(I,S, I, R, N1 ); - recv_2(S,I, S, {S, I, N1, R, pk(R)}sk(S) ); - send_3(I,R, I, R, {I, T, L, {N2}pk(R)}sk(I) ); - recv_6(R,I, R, I, {R, {N2}inc}pk(I) ); - - claim_7(I, Secret, N2); - claim_9(I, Niagree); - claim_10(I, Nisynch); - } - - role S - { - var N1,N3: Nonce; - - recv_1(I,S, I, R, N1 ); - send_2(S,I, S, {S, I, N1, R, pk(R)}sk(S) ); - recv_4(R,S, R, I, N3 ); - send_5(S,R, S, {S, R, N3, I, pk(I)}sk(S) ); - } - - role R - { - fresh N3: Nonce; - var N2: Nonce; - var T: TimeStamp; - var L: LifeTime; - - var ni: Nonce; - fresh nr: Nonce; - - recv_3(I,R, I, R, {I, T, L, {N2}pk(R)}sk(I) ); - send_4(R,S, R, I, N3 ); - recv_5(S,R, S, {S, R, N3, I, pk(I)}sk(S) ); - send_6(R,I, R, I, {R, {N2}inc}pk(I) ); - - claim_8(R, Secret, N2); - claim_11(R, Niagree); - claim_12(R, Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/splice-as.spdl b/Vagrant Files/shared/scyther/Protocols/splice-as.spdl deleted file mode 100644 index b1d8e18..0000000 --- a/Vagrant Files/shared/scyther/Protocols/splice-as.spdl +++ /dev/null @@ -1,66 +0,0 @@ -# SPLICE/AS -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/spliceas.html -# -# Note: -# The assumptions made here do not comply with those in SPORE -# SPORE assumes that the agents do not know the pk function, but only -# their own public key values. -# This can currently not be modelled. - - -usertype TimeStamp, LifeTime; - -const inc,dec: Function; -inversekeys (inc,dec); - -protocol spliceAS(I,R,S) -{ - role I - { - fresh N1,N2: Nonce; - fresh T: TimeStamp; - fresh L: LifeTime; - - send_1(I,S, I, R, N1 ); - recv_2(S,I, S, {S, I, N1, pk(R)}sk(S) ); - send_3(I,R, I, R, {I, T, L, {N2}pk(R)}sk(I) ); - recv_6(R,I, R, I, {R, {N2}inc}pk(I) ); - - claim_7(I, Secret, N2); - claim_9(I, Niagree); - claim_10(I, Nisynch); - } - - role S - { - var N1,N3: Nonce; - - recv_1(I,S, I, R, N1 ); - send_2(S,I, S, {S, I, N1, pk(R)}sk(S) ); - recv_4(R,S, R, I, N3 ); - send_5(S,R, S, {S, R, N3, pk(I)}sk(S) ); - } - - role R - { - fresh N3: Nonce; - var N2: Nonce; - var T: TimeStamp; - var L: LifeTime; - - var ni: Nonce; - fresh nr: Nonce; - - recv_3(I,R, I, R, {I, T, L, {N2}pk(R)}sk(I) ); - send_4(R,S, R, I, N3 ); - recv_5(S,R, S, {S, R, N3, pk(I)}sk(S) ); - send_6(R,I, R, I, {R, {N2}inc}pk(I) ); - - claim_8(R, Secret, N2); - claim_11(R, Niagree); - claim_12(R, Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/tmn.spdl b/Vagrant Files/shared/scyther/Protocols/tmn.spdl deleted file mode 100644 index c6fb55f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/tmn.spdl +++ /dev/null @@ -1,51 +0,0 @@ -# TMN -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/tmn.html -# -# Note: -# According to Boyd and Mathuria Kb is the session key this is not clear -# from the description in SPORE -usertype SessionKey; - -const Fresh: Function; -const Compromised: Function; - -protocol tmn(I,R,S) -{ - role I - { - fresh Ki: SessionKey; - var Kr: SessionKey; - - send_1(I,S, R,{Ki}pk(S) ); - recv_4(S,I, R,{Kr}Ki ); - - claim_I1(I,Secret,Kr); - claim_I2(I,Nisynch); - claim_I3(I,Empty,(Fresh,Kr)); - } - - role R - { - fresh Kr: SessionKey; - - recv_2(S,R, I ); - send_3(R,S, I, { Kr }pk(S) ); - - claim_R1(R,Secret,Kr); - claim_R2(R,Nisynch); - claim_R3(R,Empty,(Fresh,Kr)); - } - - role S - { - var Ki,Kr: SessionKey; - - recv_1(I,S, R,{Ki}pk(S) ); - send_2(S,R, I ); - recv_3(R,S, I, { Kr }pk(S) ); - send_4(S,I, R,{Kr}Ki ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/wmf-lowe.spdl b/Vagrant Files/shared/scyther/Protocols/wmf-lowe.spdl deleted file mode 100644 index 86b34e3..0000000 --- a/Vagrant Files/shared/scyther/Protocols/wmf-lowe.spdl +++ /dev/null @@ -1,63 +0,0 @@ -# Lowe modified Wide Mouthed Frog -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wideMouthedFrogLowe.html -# -# Note: -# According to SPORE there are no known attacks on this protocol, scyther -# finds one however this has to do with the unusual assumption that every -# agent can recognise and will reject to messages that it has created -# itself. - -usertype SessionKey; -usertype TimeStamp; -usertype ExpiredTimeStamp; -const succ,pred: Function; -inversekeys (succ,pred); -const Fresh: Function; -const Compromised: Function; - -protocol wmf-Lowe(I,R,S) -{ - role I - { - fresh Kir: SessionKey; - fresh Ti: TimeStamp; - var Kr: SessionKey; - var Nr: Nonce; - - send_1(I,S, I, {Ti, R, Kir}k(I,S)); - recv_3(R,I,{Nr}Kir); - send_4(I,R,{{Nr}succ}Kir); - - claim_I1(I,Secret,Kir); - claim_I2(I,Nisynch); - claim_I3(I,Empty,(Fresh,Kir)); - } - - role R - { - var Ts: TimeStamp; - var Kir: SessionKey; - fresh Nr: Nonce; - - recv_2(S,R, {Ts, I, Kir}k(R,S) ); - send_3(R,I, {Nr}Kir); - recv_4(I,R, {{Nr}succ}Kir); - - claim_R1(R,Secret,Kir); - claim_R2(R,Nisynch); - claim_R3(R,Empty,(Fresh,Kir)); - } - - role S - { - var Kir: SessionKey; - fresh Ts: TimeStamp; - var Ti: TimeStamp; - - recv_1(I,S, I,{Ti, R, Kir}k(I,S) ); - send_2(S,R, {Ts, I, Kir}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/wmf.spdl b/Vagrant Files/shared/scyther/Protocols/wmf.spdl deleted file mode 100644 index 758843a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/wmf.spdl +++ /dev/null @@ -1,54 +0,0 @@ -# Wide Mouthed Frog -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wideMouthedFrog.html -# -# Note -# The name of the party that has generated a message was added in order -# to model the property described in SPORE that an agent can identify -# its own messages and will reject them. - -usertype SessionKey; -usertype TimeStamp; -usertype ExpiredTimeStamp; - -const Fresh: Function; -const Compromised: Function; - -protocol wmf(I,R,S) -{ - role I - { - fresh Kir: SessionKey; - fresh Ti: TimeStamp; - var Kr: SessionKey; - - send_1(I,S, I, {I, Ti, R, Kir}k(I,S)); - - claim_I1(I,Secret,Kir); - claim_I2(I,Empty,(Fresh,Kir)); - } - - role R - { - var Ts: TimeStamp; - var Kir: SessionKey; - - recv_2(S,R, {S, Ts, I, Kir}k(R,S) ); - - claim_R1(R,Secret,Kir); - claim_R2(R,Nisynch); - claim_R3(R,Empty,(Fresh,Kir)); - } - - role S - { - var Kir: SessionKey; - fresh Ts: TimeStamp; - var Ti: TimeStamp; - - recv_1(I,S, I,{I, Ti, R, Kir}k(I,S) ); - send_2(S,R, {S, Ts, I, Kir}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-1.spdl b/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-1.spdl deleted file mode 100644 index 7e4e09d..0000000 --- a/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-1.spdl +++ /dev/null @@ -1,41 +0,0 @@ -# Woo and Lam Pi 1 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wooLamPi1.html -# - -protocol woolamPi-1(I,R,S) -{ - role I - { - var Nr: Nonce; - - send_1(I,R, I); - recv_2(R,I, Nr); - send_3(I,R, {I,R,Nr}k(I,S)); - - } - - role R - { - fresh Nr: Nonce; - var T: Ticket; - - recv_1(I,R, I); - send_2(R,I, Nr); - recv_3(I,R, T); - send_4(R,S, {I,R, T}k(R,S)); - recv_5(S,R, {I,R, Nr}k(R,S)); - - claim_R1(R,Nisynch); - } - - role S - { - var Nr: Nonce; - - recv_4(R,S, {I,R, {I,R,Nr}k(I,S)}k(R,S)); - send_5(S,R, {I,R,Nr}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-2.spdl b/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-2.spdl deleted file mode 100644 index 5d767d6..0000000 --- a/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-2.spdl +++ /dev/null @@ -1,41 +0,0 @@ -# Woo and Lam Pi 2 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wooLamPi2.html -# - -protocol woolamPi-2(I,R,S) -{ - role I - { - var Nr: Nonce; - - send_1(I,R, I); - recv_2(R,I, Nr); - send_3(I,R, {I,Nr}k(I,S)); - - } - - role R - { - fresh Nr: Nonce; - var T: Ticket; - - recv_1(I,R, I); - send_2(R,I, Nr); - recv_3(I,R, T); - send_4(R,S, {I, T}k(R,S)); - recv_5(S,R, {I, Nr}k(R,S)); - - claim_R1(R,Nisynch); - } - - role S - { - var Nr: Nonce; - - recv_4(R,S, {I, {I,Nr}k(I,S)}k(R,S)); - send_5(S,R, {I,Nr}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-3.spdl b/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-3.spdl deleted file mode 100644 index 1db544e..0000000 --- a/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-3.spdl +++ /dev/null @@ -1,41 +0,0 @@ -# Woo and Lam Pi 2 -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wooLamPi3.html -# - -protocol woolamPi-3(I,R,S) -{ - role I - { - var Nr: Nonce; - - send_1(I,R, I); - recv_2(R,I, Nr); - send_3(I,R, {Nr}k(I,S)); - - } - - role R - { - fresh Nr: Nonce; - var T: Ticket; - - recv_1(I,R, I); - send_2(R,I, Nr); - recv_3(I,R, T); - send_4(R,S, {I, T}k(R,S)); - recv_5(S,R, {I, Nr}k(R,S)); - - claim_R1(R,Nisynch); - } - - role S - { - var Nr: Nonce; - - recv_4(R,S, {I, {Nr}k(I,S)}k(R,S)); - send_5(S,R, {I,Nr}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-f.spdl b/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-f.spdl deleted file mode 100644 index 22f028c..0000000 --- a/Vagrant Files/shared/scyther/Protocols/woo-lam-pi-f.spdl +++ /dev/null @@ -1,41 +0,0 @@ -# Woo and Lam Pi f -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wooLamPif.html -# - -protocol woolamPi-f(I,R,S) -{ - role I - { - var Nr: Nonce; - - send_1(I,R, I); - recv_2(R,I, Nr); - send_3(I,R, {I,R,Nr}k(I,S)); - - } - - role R - { - fresh Nr: Nonce; - var T: Ticket; - - recv_1(I,R, I); - send_2(R,I, Nr); - recv_3(I,R, T); - send_4(R,S, {I, R, Nr, T}k(R,S)); - recv_5(S,R, {I, R, Nr}k(R,S)); - - claim_R1(R,Nisynch); - } - - role S - { - var Nr: Nonce; - - recv_4(R,S, {I, R, Nr,{I,R,Nr}k(I,S)}k(R,S)); - send_5(S,R, {I, R, Nr}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/woo-lam-pi.spdl b/Vagrant Files/shared/scyther/Protocols/woo-lam-pi.spdl deleted file mode 100644 index 0c01c27..0000000 --- a/Vagrant Files/shared/scyther/Protocols/woo-lam-pi.spdl +++ /dev/null @@ -1,45 +0,0 @@ -# Woo and Lam Pi -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wooLamPi.html -# -# Note: -# Scyther finds an attack that appears to be legit, but is not present in -# SPORE. -# - -protocol woolamPi(I,R,S) -{ - role I - { - var Nr: Nonce; - - send_1(I,R, I); - recv_2(R,I, Nr); - send_3(I,R, {Nr}k(I,S)); - - } - - role R - { - fresh Nr: Nonce; - var T: Ticket; - - recv_1(I,R, I); - send_2(R,I, Nr); - recv_3(I,R, T); - send_4(R,S, {I, T}k(R,S)); - recv_5(S,R, {Nr}k(R,S)); - - claim_R1(R,Nisynch); - } - - role S - { - var Nr: Nonce; - - recv_4(R,S, {I,{Nr}k(I,S)}k(R,S)); - send_5(S,R, {Nr}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/woo-lam.spdl b/Vagrant Files/shared/scyther/Protocols/woo-lam.spdl deleted file mode 100644 index 7e28057..0000000 --- a/Vagrant Files/shared/scyther/Protocols/woo-lam.spdl +++ /dev/null @@ -1,64 +0,0 @@ -# Woo and Lam Mutual Authentication -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/wooLamMutual.html -# - - -usertype SessionKey; - -const Fresh: Function; -const Compromised: Function; - -protocol woolam(I,R,S) -{ - role I - { - fresh N1: Nonce; - var Kir: SessionKey; - var N2: Nonce; - - send_1(I,R, I, N1); - recv_2(R,I, R, N2); - send_3(I,R, {I, R, N1, N2}k(I,S)); - recv_6(R,I, {R, N1, N2, Kir}k(I,S), {N1,N2}Kir); - send_7(I,R, {N2}Kir); - - - claim_I1(I,Secret,Kir); - claim_I2(I,Nisynch); - claim_I3(I,Empty,(Fresh,Kir)); - } - - role R - { - fresh N2: Nonce; - var N1: Nonce; - var Kir: SessionKey; - var T1,T2: Ticket; - - recv_1(I,R, I, N1); - send_2(R,I, R, N2); - recv_3(I,R, T1); - send_4(R,S, T1, {I, R, N1, N2}k(R,S)); - recv_5(S,R, T2, {I, N1, N2, Kir}k(R,S)); - send_6(R,I, T2, {N1,N2}Kir); - recv_7(I,R, {N2}Kir); - - claim_R1(R,Secret,Kir); - claim_R2(R,Nisynch); - claim_R3(R,Empty,(Fresh,Kir)); - } - - role S - { - fresh Kir: SessionKey; - var N1,N2: Nonce; - - recv_4(R,S, {I, R, N1, N2}k(I,S), {I, R, N1, N2}k(R,S)); - send_5(S,R, {R, N1, N2, Kir}k(I,S), {I, N1, N2, Kir}k(R,S)); - } -} - - - diff --git a/Vagrant Files/shared/scyther/Protocols/yahalom-ban.spdl b/Vagrant Files/shared/scyther/Protocols/yahalom-ban.spdl deleted file mode 100644 index b865362..0000000 --- a/Vagrant Files/shared/scyther/Protocols/yahalom-ban.spdl +++ /dev/null @@ -1,54 +0,0 @@ -# BAN simplified version of Yahalom -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/yahalomBAN.html -# - -usertype SessionKey; -const Fresh: Function; -const Compromised: Function; - -protocol yahalom-BAN(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var T: Ticket; - var Kir: SessionKey; - - send_1(I,R, I,Ni); - recv_3(S,I, Nr, {R,Kir,Ni}k(I,S), T ); - send_4(I,R, T, {Nr}Kir ); - - claim_I1(I, Secret,Kir); - claim_I2(I, Nisynch); - claim_I3(I, Empty, (Fresh,Kir)); - } - - role R - { - fresh Nr: Nonce; - var Ni: Nonce; - var T: Ticket; - var Kir: SessionKey; - - recv_1(I,R, I,Ni); - send_2(R,S, R, Nr, {I,Ni}k(R,S) ); - recv_4(I,R, {I,Kir,Nr}k(R,S) , {Nr}Kir ); - - claim_R1(R, Secret,Kir); - claim_R2(R, Nisynch); - claim_R3(R, Empty, (Fresh,Kir)); - } - - role S - { - fresh Kir: SessionKey; - var Ni,Nr: Nonce; - - recv_2(R,S, R, Nr, {I,Ni}k(R,S) ); - send_3(S,I, Nr, {R,Kir,Ni}k(I,S), {I,Kir,Nr}k(R,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/yahalom-lowe.spdl b/Vagrant Files/shared/scyther/Protocols/yahalom-lowe.spdl deleted file mode 100644 index 308a62a..0000000 --- a/Vagrant Files/shared/scyther/Protocols/yahalom-lowe.spdl +++ /dev/null @@ -1,52 +0,0 @@ -# Lowe's modified version of Yahalom -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/yahalomLowe.html -# -# - -usertype SessionKey; - - -protocol yahalom-Lowe(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var Kir: SessionKey; - - send_1(I,R, I,Ni); - recv_3(S,I, {R,Kir,Ni,Nr}k(I,S) ); - send_5(I,R, {I, R, S, Nr}Kir ); - - claim_I1(I, Secret,Kir); - claim_I2(I, Nisynch); - } - - role R - { - fresh Nr: Nonce; - var Ni: Nonce; - var Kir: SessionKey; - - recv_1(I,R, I,Ni); - send_2(R,S, {I,Ni,Nr}k(R,S) ); - recv_4(S,R, {I,Kir}k(R,S)); - recv_5(I,R, {I, R, S, Nr}Kir); - - claim_R1(R, Secret,Kir); - claim_R2(R, Nisynch); - } - - role S - { - fresh Kir: SessionKey; - var Ni,Nr: Nonce; - - recv_2(R,S, {I,Ni,Nr}k(R,S) ); - send_3(S,I, {R,Kir,Ni,Nr}k(I,S)); - send_4(S,R, {I,Kir}k(R,S)); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/yahalom-paulson.spdl b/Vagrant Files/shared/scyther/Protocols/yahalom-paulson.spdl deleted file mode 100644 index a8dfe1e..0000000 --- a/Vagrant Files/shared/scyther/Protocols/yahalom-paulson.spdl +++ /dev/null @@ -1,56 +0,0 @@ -# Paulson's strengthened version of Yahalom -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/yahalomPaulson.html -# -# - -const Fresh: Function; -const Compromised: Function; - -usertype SessionKey; - -protocol yahalom-Paulson(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var T: Ticket; - var Kir: SessionKey; - - send_1(I,R, I,Ni); - recv_3(S,I, Nr, {R,Kir,Ni}k(I,S), T ); - send_4(I,R, T, {Nr}Kir ); - - claim_I1(I, Secret,Kir); - claim_I2(I, Nisynch); - claim_I3(I, Empty, (Fresh,Kir)); - } - - role R - { - fresh Nr: Nonce; - var Ni: Nonce; - var T: Ticket; - var Kir: SessionKey; - - recv_1(I,R, I,Ni); - send_2(R,S, R, Nr, {I,Ni}k(R,S) ); - recv_4(I,R, {I,R, Kir, Nr}k(R,S) , {Nr}Kir ); - - claim_R1(R, Secret,Kir); - claim_R2(R, Nisynch); - claim_R3(R, Empty, (Fresh,Kir)); - } - - role S - { - fresh Kir: SessionKey; - var Ni,Nr: Nonce; - - recv_2(R,S, R, Nr, {I,Ni}k(R,S) ); - send_3(S,I, Nr, {R,Kir,Ni}k(I,S), {I,R,Kir,Nr}k(R,S) ); - } -} - diff --git a/Vagrant Files/shared/scyther/Protocols/yahalom.spdl b/Vagrant Files/shared/scyther/Protocols/yahalom.spdl deleted file mode 100644 index 063817f..0000000 --- a/Vagrant Files/shared/scyther/Protocols/yahalom.spdl +++ /dev/null @@ -1,52 +0,0 @@ -# Yahalom -# -# Modelled after the description in the SPORE library -# http://www.lsv.ens-cachan.fr/spore/yahalom.html -# -# - -usertype SessionKey; - -protocol yahalom(I,R,S) -{ - role I - { - fresh Ni: Nonce; - var Nr: Nonce; - var T: Ticket; - var Kir: SessionKey; - - send_1(I,R, I,Ni); - recv_3(S,I, {R,Kir,Ni,Nr}k(I,S), T ); - send_4(I,R, T, {Nr}Kir ); - - claim_I1(I, Secret,Kir); - } - - role R - { - fresh Nr: Nonce; - var Ni: Nonce; - var T: Ticket; - var Kir: SessionKey; - - recv_1(I,R, I,Ni); - send_2(R,S, R, {I,Ni,Nr}k(R,S) ); - recv_4(I,R, {I,Kir}k(R,S) , {Nr}Kir ); - - claim_R1(R, Secret,Kir); - } - - role S - { - fresh Kir: SessionKey; - var Ni,Nr: Nonce; - - recv_2(R,S, R, {I,Ni,Nr}k(R,S) ); - send_3(S,I, {R,Kir,Ni,Nr}k(I,S), {I,Kir}k(R,S) ); - - claim(S, Secret, Ni); - claim(S, Secret, Nr); - } -} - diff --git a/Vagrant Files/shared/scyther/README.md b/Vagrant Files/shared/scyther/README.md deleted file mode 100644 index 706df8d..0000000 --- a/Vagrant Files/shared/scyther/README.md +++ /dev/null @@ -1,66 +0,0 @@ -The Scyther tool -================ - -Scyther is a tool for the symbolic analysis of security protocols. It is -developed by Cas Cremers, and is available from -<http://www.cs.ox.ac.uk/people/cas.cremers/scyther/index.html>. - -The below instructions apply only to the *distribution version* of -the Scyther tool. If you are working from the source files, some paths may be -slightly different, and it is recommended to follow the instructions in [../README.md](../README.md). - -Running the scyther tool ------------------------- - -### Graphical user interface ### - -The graphical user interface can be started by running `scyther-gui.py`, -e.g., enter the following in a terminal and press return - - python ./scyther-gui.py - -### Command-line usage ### - -In the directory `./Scyther` there should be an executable for the -Scyther backend. Its name depends on the platform: - - * `scyther-linux` (Linux) - * `scyther-w32` (Windows) - * `scyther-mac` (Mac OS X) - -If this executable does not exist, you probably downloaded the source -files, and will need to compile it first. See `../README.md` for further -details. - -There are also various test scripts (for usage in Linux) in this -directory. - -Obtaining the sources ----------------------- - -Scyther is being developed on *Github*, and its complete source files are -availabe from -<https://github.com/cascremers/scyther>. - -Manual ------- - -We are currently rewriting the manual. The current (incomplete) -distribution version of the manual can be found here: - - * [./scyther-manual.pdf](scyther-manual.pdf) - - -Protocol Models ---------------- - -The protocol models have the extension `.spdl` and can be found in the following directories: - - * [./Protocols](Protocols) and its subdirectories. - -License -------- - -Currently the Scyther tool is licensed under the GPL 2, as indicated in -the source code. Contact Cas Cremers if you have any questions. - diff --git a/Vagrant Files/shared/scyther/Scripts/regression-test.py b/Vagrant Files/shared/scyther/Scripts/regression-test.py deleted file mode 100644 index beabc74..0000000 --- a/Vagrant Files/shared/scyther/Scripts/regression-test.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python - -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -def testSet(blacklist=[]): - import os - - prefix = "../Protocols/" - dl = os.listdir(prefix) - fl = [] - for fn in dl: - if fn.endswith(".spdl"): - okay = True - for fb in blacklist: - if fn.startswith(fb): - okay = False - break - if okay: - fl.append((prefix,fn)) - return fl - -def evaluate(fn,prefix=""): - import subprocess - import tempfile - - cmd = "../Scyther/scyther-linux" - args = [cmd,"--max-runs=4","--plain",fn] - - fstdout = tempfile.TemporaryFile() - fstderr = tempfile.TemporaryFile() - - subprocess.call(args,stdout=fstdout,stderr=fstderr) - - fstdout.seek(0) - fstderr.seek(0) - - res = "" - for l in fstdout.xreadlines(): - res += prefix + l.strip() + "\n" - #for l in fstderr.xreadlines(): - # print l - - fstdout.close() - fstderr.close() - return res - - -def main(): - dest = "regression-test.txt" - output = "regression-test.txt.tmp" - - fp = open(output, 'w') - - fl = testSet(blacklist=['ksl']) - cnt = 1 - tres = "" - for (prefix,fn) in sorted(fl): - print "Evaluating %s (%i/%i)" % (fn,cnt,len(fl)) - res = evaluate(prefix+fn, "%s\t" % (fn)) - fp.write(res) - tres += res - cnt += 1 - fp.close() - - fp = open(dest, 'w') - fp.write(tres) - fp.close() - - print res - - - -if __name__ == '__main__': - main() diff --git a/Vagrant Files/shared/scyther/Scripts/regression-test.txt b/Vagrant Files/shared/scyther/Scripts/regression-test.txt deleted file mode 100644 index 3fa247f..0000000 --- a/Vagrant Files/shared/scyther/Scripts/regression-test.txt +++ /dev/null @@ -1,64 +0,0 @@ -BKE.spdl claim bke,I SKR_4 kir Ok [no attack within bounds] -BKE.spdl claim bke,R SKR_7 kir Ok [no attack within bounds] -TLS-Paulson.spdl claim tlspaulson,a SKR_9a hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,true) Ok [no attack within bounds] -TLS-Paulson.spdl claim tlspaulson,a SKR_9b hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,false) Ok [no attack within bounds] -TLS-Paulson.spdl claim tlspaulson,b SKR_10a hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,true) Ok [no attack within bounds] -TLS-Paulson.spdl claim tlspaulson,b SKR_10b hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,false) Ok [no attack within bounds] -ccitt509-1.spdl claim ccitt509-1,R Nisynch_3 - Ok [proof of correctness] -ccitt509-1c.spdl claim ccitt509-1c,R Nisynch_3 - Ok [proof of correctness] -ccitt509-3.spdl claim ccitt509-3,I Nisynch_I1 - Ok [proof of correctness] -ccitt509-3.spdl claim ccitt509-3,I Secret_I2 Ya Ok [proof of correctness] -ccitt509-3.spdl claim ccitt509-3,I Secret_I3 Yb Ok [proof of correctness] -ccitt509-3.spdl claim ccitt509-3,R Nisynch_R1 - Fail [at least 3 attacks] -ccitt509-3.spdl claim ccitt509-3,R Secret_R2 Ya Ok [no attack within bounds] -ccitt509-3.spdl claim ccitt509-3,R Secret_R3 Yb Ok [no attack within bounds] -ccitt509-ban3.spdl claim ccitt509-ban3,I Nisynch_4 - Ok [proof of correctness] -ccitt509-ban3.spdl claim ccitt509-ban3,R Nisynch_5 - Ok [no attack within bounds] -needham-schroeder-lowe.spdl claim needhamschroederpk-Lowe,I Secret_I1 Ni Ok [no attack within bounds] -needham-schroeder-lowe.spdl claim needhamschroederpk-Lowe,I Secret_I2 Nr Ok [no attack within bounds] -needham-schroeder-lowe.spdl claim needhamschroederpk-Lowe,I Nisynch_I3 - Fail [at least 3 attacks] -needham-schroeder-lowe.spdl claim needhamschroederpk-Lowe,R Secret_R1 Nr Ok [no attack within bounds] -needham-schroeder-lowe.spdl claim needhamschroederpk-Lowe,R Secret_R2 Ni Ok [no attack within bounds] -needham-schroeder-lowe.spdl claim needhamschroederpk-Lowe,R Nisynch_R3 - Fail [at least 3 attacks] -needham-schroeder.spdl claim needhamschroederpk,I Secret_I1 Ni Ok [no attack within bounds] -needham-schroeder.spdl claim needhamschroederpk,I Secret_I2 Nr Ok [no attack within bounds] -needham-schroeder.spdl claim needhamschroederpk,I Nisynch_I3 - Fail [at least 3 attacks] -needham-schroeder.spdl claim needhamschroederpk,R Secret_R1 Nr Fail [at least 5 attacks] -needham-schroeder.spdl claim needhamschroederpk,R Secret_R2 Ni Fail [at least 5 attacks] -needham-schroeder.spdl claim needhamschroederpk,R Nisynch_R3 - Fail [at least 3 attacks] -smartright.spdl claim smartright,R Nisynch_R1 - Fail [at least 1 attack] -splice-as-cj.spdl claim spliceAS-CJ,I Secret_7 N2 Ok [no attack within bounds] -splice-as-cj.spdl claim spliceAS-CJ,I Niagree_9 - Fail [at least 1 attack] -splice-as-cj.spdl claim spliceAS-CJ,I Nisynch_10 - Fail [at least 1 attack] -splice-as-cj.spdl claim spliceAS-CJ,R Secret_8 N2 Ok [no attack within bounds] -splice-as-cj.spdl claim spliceAS-CJ,R Niagree_11 - Fail [at least 1 attack] -splice-as-cj.spdl claim spliceAS-CJ,R Nisynch_12 - Fail [at least 1 attack] -splice-as-hc.spdl claim spliceAS-HC,I Secret_7 N2 Ok [no attack within bounds] -splice-as-hc.spdl claim spliceAS-HC,I Niagree_9 - Fail [at least 1 attack] -splice-as-hc.spdl claim spliceAS-HC,I Nisynch_10 - Fail [at least 1 attack] -splice-as-hc.spdl claim spliceAS-HC,R Secret_8 N2 Ok [no attack within bounds] -splice-as-hc.spdl claim spliceAS-HC,R Niagree_11 - Fail [at least 1 attack] -splice-as-hc.spdl claim spliceAS-HC,R Nisynch_12 - Fail [at least 1 attack] -splice-as.spdl claim spliceAS,I Secret_7 N2 Ok [no attack within bounds] -splice-as.spdl claim spliceAS,I Niagree_9 - Fail [at least 1 attack] -splice-as.spdl claim spliceAS,I Nisynch_10 - Fail [at least 1 attack] -splice-as.spdl claim spliceAS,R Secret_8 N2 Ok [no attack within bounds] -splice-as.spdl claim spliceAS,R Niagree_11 - Fail [at least 1 attack] -splice-as.spdl claim spliceAS,R Nisynch_12 - Fail [at least 1 attack] -woo-lam-pi-1.spdl claim woolamPi-1,R Nisynch_R1 - Fail [at least 2 attacks] -woo-lam-pi-2.spdl claim woolamPi-2,R Nisynch_R1 - Fail [at least 3 attacks] -woo-lam-pi-3.spdl claim woolamPi-3,R Nisynch_R1 - Fail [at least 2 attacks] -woo-lam-pi-f.spdl claim woolamPi-f,R Nisynch_R1 - Fail [at least 1 attack] -woo-lam-pi.spdl claim woolamPi,R Nisynch_R1 - Fail [at least 2 attacks] -yahalom-ban-paulson-modified.spdl claim yahalom-BAN-Paulson-modified,A Secret_5 kab Ok [no attack within bounds] -yahalom-ban-paulson-modified.spdl claim yahalom-BAN-Paulson-modified,B Secret_6 kab Ok [no attack within bounds] -yahalom-ban-paulson.spdl claim yahalom-BAN-Paulson,A SKR_5 kab Ok [no attack within bounds] -yahalom-ban-paulson.spdl claim yahalom-BAN-Paulson,B SKR_6 kab Ok [no attack within bounds] -yahalom-lowe.spdl claim yahalom-Lowe,I Secret_I1 Kir Ok [proof of correctness] -yahalom-lowe.spdl claim yahalom-Lowe,I Nisynch_I2 - Ok [proof of correctness] -yahalom-lowe.spdl claim yahalom-Lowe,R Secret_R1 Kir Ok [proof of correctness] -yahalom-lowe.spdl claim yahalom-Lowe,R Nisynch_R2 - Ok [no attack within bounds] -yahalom.spdl claim yahalom,I Secret_I1 Kir Ok [no attack within bounds] -yahalom.spdl claim yahalom,R Secret_R1 Kir Ok [no attack within bounds] -yahalom.spdl claim yahalom,S Secret_S1 Ni Fail [at least 1 attack] -yahalom.spdl claim yahalom,S Secret_S2 Nr Ok [no attack within bounds] diff --git a/Vagrant Files/shared/scyther/Scripts/scytherview.py b/Vagrant Files/shared/scyther/Scripts/scytherview.py deleted file mode 100644 index 9973867..0000000 --- a/Vagrant Files/shared/scyther/Scripts/scytherview.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# Convert scyther dot output to a printable PDF and display it -# -# This is a simple hack to be able to quickly use the graphical output -# of Scyther if one only has graphviz, but not elementtree and wxPython. -# -# Note 1: only works under Linux currently, because of silly assumptions -# on temporary directories and pdf viewers. -# -# Note 2: this code assumes that both scyther-linux and dot can be found in the -# environment (i.e. PATH variable) -# -import os,sys,commands -import os.path - -tempcount = 0 - -def generateTemp(extension='tmp'): - # We need a temporary file to hold the generated postscript stuff before - # it is converted to pdf - global tempcount - - tempcount = tempcount + 1 - tmp = '/tmp/output_dot_%s_%i.%s' % (os.getpid(),tempcount,extension) - - try: - os.unlink(tmp) - except: - pass - return tmp - -def scyther_to_dotfile(): - """ Run Scyther, return dotfile name """ - - mydir = os.path.dirname(__file__) - scythername = os.path.join(mydir, "../Scyther/scyther-linux") - - args = " ".join(sys.argv[1:]) - tmpdotfile = generateTemp('dot') - - command = "%s --plain --dot-output %s > %s" % (scythername, args, tmpdotfile) - output = commands.getoutput(command) - return (output,tmpdotfile) - -def dotfile_to_pdffile(dotfile,outfile=None): - """ Generate a PDF file (name is returned) from an input dotfile - name """ - - tmp = generateTemp('ps') - - # First split the input per digraph and call dot with -Gsize arguments to make - # it fit to a landscape page - dotdata = open(dotfile, "r") - f = None - for line in dotdata.xreadlines(): - if (line.find('digraph') == 0): - f = os.popen("dot -Gsize='11.0,8.0' -Gratio=fill -Tps >>%s" % (tmp),'w') - print >>f, line - dotdata.close() - - if not f: - return None - f.close() - - if not outfile: - outfile = generateTemp('pdf') - - # Now convert the resulting stuff to a pdf - os.system('ps2pdf -sPAPERSIZE=a4 -g7014x5300 -r600 %s %s' % (tmp,outfile)) - #os.system('ps2pdf -g8300x6250 -r600 %s %s' % (tmp,outf)) - - # And remove the temp file - os.unlink(tmp) - - return outfile - -def main(): - (output,dotfile) = scyther_to_dotfile() - print output - pdffile = dotfile_to_pdffile(dotfile) - os.unlink(dotfile) - if pdffile: - commands.getoutput("kpdf %s" % pdffile) - os.unlink(pdffile) - else: - print "No graphs generated." - -if __name__ == '__main__': - if len(sys.argv) > 1: - main() - else: - print "Please provide the name of an input file." - diff --git a/Vagrant Files/shared/scyther/Scyther/.gitignore b/Vagrant Files/shared/scyther/Scyther/.gitignore deleted file mode 100644 index c7e14a4..0000000 --- a/Vagrant Files/shared/scyther/Scyther/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -scyther-mac -scyther-linux -scyther-w32.exe diff --git a/Vagrant Files/shared/scyther/Scyther/Attack.py b/Vagrant Files/shared/scyther/Scyther/Attack.py deleted file mode 100644 index d07ee6e..0000000 --- a/Vagrant Files/shared/scyther/Scyther/Attack.py +++ /dev/null @@ -1,71 +0,0 @@ -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# Attack -# - -import Trace -import Term -#import Classification -from Misc import * - -class Attack(object): - def __init__(self): - self.broken = [] - self.match = None - self.initialKnowledge = [] - self.inverseKeys = [] - self.protocol = None - self.semiTrace = Trace.SemiTrace() - self.variables = [] - self.protocoldescr = {} - self.id = None - self.knowledge = None - self.untrusted = [] - self.typeflaws = False - self.commandline = '' - self.scytherDot = None - self.claim = None # refers to parent claim - - def getInvolvedAgents(self): - result = [] - for run in self.semiTrace.runs: - for agent in run.roleAgents.values(): - result.append(agent) - return uniq(result) - - def buildKnowledge(self): - if not self.knowledge: - self.knowledge = Term.Knowledge(self) - self.knowledge.buildKnowledge() - - def getPrecedingLabelSet(self,event): - return self.protocoldescr[str(event.label[0])].getPrecedingLabelSet(event.label) - - def getPrecedingRoleSet(self,event): - return self.protocoldescr[str(event.label[0])].getPrecedingRoleSet(event.label) - - #def classify(self): - # classification = Classification.Classification(self) - # classification.classifyClaims() - # classification.classifyInitiations() - # classification.classifyComplexity() - # classification.classifyTypeflaws() - # return classification diff --git a/Vagrant Files/shared/scyther/Scyther/Claim.py b/Vagrant Files/shared/scyther/Scyther/Claim.py deleted file mode 100644 index c048789..0000000 --- a/Vagrant Files/shared/scyther/Scyther/Claim.py +++ /dev/null @@ -1,197 +0,0 @@ -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# Claim -# - -import Term - -def stateDescription(okay,n=1,caps=False): - if okay: - s = "trace pattern" - if n != 1: - s += "s" - else: - s = "attack" - if n != 1: - s += "s" - if caps: - s = s[0].upper() + s[1:] - return s - - -class Claim(object): - def __init__(self): - self.id = None # a unique id string, consisting of 'protocol,label' - self.claimtype = None - self.label = None - self.shortlabel = None - self.protocol = None - self.role = None - self.parameter = None - self.failed = 0 - self.count = 0 - self.states = 0 - self.complete = False - self.timebound = False - self.attacks = [] - self.state = False # if true, it is a state, not an attack - self.okay = None # true if good, false if bad - - # derived info - self.foundstates = False - self.foundproof = False - - def analyze(self): - - # determine short label - # We need the rightmost thingy here - label = self.label - while isinstance(label,Term.TermTuple): - label = label[1] - self.shortlabel = label - - # determine id - self.id = "%s,%s" % (self.protocol,self.shortlabel) - - # some additional properties - if str(self.claimtype) == 'Reachable': - self.state = True - if self.failed > 0: - self.foundstates = True - if self.complete: - self.foundproof = True - - # status - # normally, with attacks, okay means none - self.okay = (self.failed == 0) - if self.state: - # but the logic reverses when it is states and not - # attacks... - self.okay = (not self.okay) - - def stateName(self,count=1,caps=False): - return stateDescription(self.state,count,caps) - - def getRank(self): - """ - Return claim rank - 0 - really failed - 1 - probably failed - 2 - probably okay - 3 - really okay - """ - n = len(self.attacks) - if not self.okay: - # not okay - if (self.state and self.complete) or ((not self.state) and (n > 0)): - return 0 - else: - return 1 - else: - # okay! - if not ((self.state and (n > 0)) or ((not self.state) and self.complete)): - return 2 - else: - return 3 - - def getVerified(self): - """ - returns an element of [None,'Verified','Falsified'] - """ - opts = ['Falsified',None,None,'Verified'] - return opts[self.getRank()] - - - def getColour(self): - """ - Returns a colour that expresses the state - """ - colours = ['#FF0000', - '#800000', - '#005800', - '#00B000'] - return colours[self.getRank()] - - def getOkay(self): - """ - Returns a very brief statement about the claim. - - Originally the two mid options had a question mark appended, but - from a users' point of view this might only be more confusing, - so I took them out again. - """ - colours = ['Fail', - 'Fail', - 'Ok', - 'Ok'] - return colours[self.getRank()] - - def getComment(self): - """ - returns a sentence describing the results for this claim - """ - n = len(self.attacks) - atxt = self.stateName(n) - remark = "" - if not self.complete: - if n == 0: - # no attacks, no states within bounds - remark = "No %s within bounds" % (atxt) - else: - # some attacks/states within bounds - remark = "At least %i %s" % (n,atxt) - else: - if n == 0: - # no attacks, no states - remark = "No %s" % (atxt) - else: - # there exist n states/attacks (within any number of runs) - remark = "Exactly %i %s" % (n,atxt) - return remark + "." - - def triplet(self): - """ - Return protocol,role,label triplet - """ - return (self.protocol, self.role, self.shortlabel) - - def describe(self): - s = str(self.claimtype) - if self.parameter: - s+= "(%s)" % self.parameter - - return s - - def roledescribe(self): - return "%s: %s" % (self.role,self.describe()) - - def __str__(self): - """ - Resulting string - """ - s = "claim id [%s], %s" % (self.id,self.describe()) - - # determine status - s+= "\t: %s" % self.getComment() - - return s - - diff --git a/Vagrant Files/shared/scyther/Scyther/Error.py b/Vagrant Files/shared/scyther/Scyther/Error.py deleted file mode 100644 index 88f5db8..0000000 --- a/Vagrant Files/shared/scyther/Scyther/Error.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# Scyther interface error classes -# - -#--------------------------------------------------------------------------- - -class Error(Exception): - """Base class for exceptions in this module.""" - pass - -class ScytherError(Error): - """Exception raised for errors generated by the backend - - Attributes: - errorlist -- list of error lines are retrieved from the - backend - """ - - def __init__(self, errorlist,filenames=None,options=None): - self.errorlist = errorlist - self.filenames = filenames - self.options = options - - def __str__(self): - s = "Scyther backend reported errors" - if len(self.filenames) == 0: - s = s + " for unknown files." - if len(self.filenames) == 1: - s = s + " for file %s" % (self.filenames) - if len(self.filenames) > 1: - s = s + " for files %s" % (self.filenames) - s = s + "\n" - s = s + "Options: '%s'\n\n" % (self.options) - S = s + "Error details:\n" - s = s + "\n".join(self.errorlist) - return s - -class InputError(Error): - """Exception raised for errors in the input. - - Attributes: - expression -- input expression in which the error occurred - message -- explanation of the error - """ - - def __init__(self, expression, message): - self.expression = expression - self.message = message - -class BinaryError(Error): - """Raised when the Scyther executable is not found. - - Attributes: - file -- file location at which we should have been able to find it. - """ - - def __init__(self, file): - self.file = file - - def __str__(self): - return "Could not find Scyther executable at '%s'" % (self.file) - - -class NoBinaryError(Error): - """Raised when the Scyther executable is not defined. - - Attributes: - None. - """ - - def __str__(self): - return "Scyther class attribute 'program' was not defined." - - -class UnknownPlatformError(Error): - """Raised when the platform is not supported yet. - - Attributes: - platform -- string describing the platform. - """ - - def __init__(self, platform): - self.platform = platform - - def __str__(self): - return "The %s platform is currently unsupported." % self.platform - -class StringListError(Error): - """Raised when the a string should be a list of strings or a string - - Attributes: - obj -- object that did not fit - """ - - def __init__(self, obj): - self.obj = obj - - def __str__(self): - return "Got '%s', which is type '%s' instead of a (list of) string." % (self.obj, type(self.obj)) - -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Scyther/FindDot.py b/Vagrant Files/shared/scyther/Scyther/FindDot.py deleted file mode 100644 index c70c3ff..0000000 --- a/Vagrant Files/shared/scyther/Scyther/FindDot.py +++ /dev/null @@ -1,129 +0,0 @@ -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# FindDot.py -# -# Since version 2.31, GraphViz no longer sets the PATH environment variable on Windows. -# The sole reason of existence for this file is to solve this issue automatically if possible. - -#--------------------------------------------------------------------------- -""" Import externals """ -import sys -import os -#--------------------------------------------------------------------------- -""" Import internals """ -import Misc -#--------------------------------------------------------------------------- - -DOTLOCATION = None - -#--------------------------------------------------------------------------- - -def testDot(fpath): - - try: - cmd = "%s -V" % (fpath) - (sts,sout,serr) = Misc.safeCommandOutput(cmd) - if sts != -1: - if "version" in sout + serr: - return True - except: - pass - - return False - -#--------------------------------------------------------------------------- - -def scanPrefix(pf,name): - - if pf.endswith("*"): - import glob - - gl = glob.glob(pf) - for pf in gl: - for root,dirs,files in os.walk(pf): - for d in dirs: - npf = os.path.join(root,d) - res = scanPrefix(npf,name) - if res != None: - return res - - return None - - fpath = os.path.join(pf,name) - if len(pf) > 0: - fpath = "\"%s\"" % (fpath) - if testDot(fpath) == True: - return fpath - - return None - - -def scanLocations(): - if sys.platform.startswith("win"): - prefixes = ["", \ - "C:\Program Files\Graphviz*", \ - "C:\Program Files (x86)\Graphviz*" ] - name = "dot.exe" - else: - prefixes = [""] - name = "dot" - - for pf in prefixes: - path = scanPrefix(pf,name) - if path != None: - return path - - return None - -#--------------------------------------------------------------------------- - -def findDot(): - global DOTLOCATION - - # Cache the results - if DOTLOCATION != None: - return DOTLOCATION - - DOTLOCATION = scanLocations() - if DOTLOCATION == None: - Misc.panic(""" -Could not find the required 'dot' program, which is part of the Graphviz suite. -Please install it from http://www.graphviz.org/ - -Ubuntu users: install the 'graphviz' package. - -Windows users: make sure that Graphviz is installed and - that the location of the 'dot' program is in - the PATH environment variable. - -Restarting your system may be needed for Scyther to locate any newly installed -programs. - """) - return DOTLOCATION - -#--------------------------------------------------------------------------- - -if __name__ == '__main__': - Misc.panic(findDot()) - -#--------------------------------------------------------------------------- - -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Scyther/Misc.py b/Vagrant Files/shared/scyther/Scyther/Misc.py deleted file mode 100644 index e41abd8..0000000 --- a/Vagrant Files/shared/scyther/Scyther/Misc.py +++ /dev/null @@ -1,158 +0,0 @@ -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# Misc.py -# Various helper functions - -#--------------------------------------------------------------------------- - -""" Import externals """ -import sys -import os.path -try: - from subprocess import Popen,PIPE -except: - panic(""" -Cannot import 'subprocess.Popen' module. - -You need at least Python 2.4 to use this program. -""") - -#--------------------------------------------------------------------------- - -def confirm(question): - answer = '' - while answer not in ('y','n'): - print question, - answer = raw_input().lower() - return answer == 'y' - -def exists(func,list): - return len(filter(func,list)) > 0 - -def forall(func,list): - return len(filter(func,list)) == len(list) - -def uniq(li): - result = [] - for elem in li: - if (not elem in result): - result.append(elem) - return result - -# Return a sorted copy of a list -def sorted(li): - result = li[:] - result.sort() - return result - - -# ensurePath: wraps os.makedirs -def ensurePath(pt): - """ - Make sure the path exists: if not, create the directories one by one - - By example: - - Call with "dog/cat/bone" ensures that afterwards, this subdirectory structure (dog/cat/bone) exists, with 'bone' a directory. - It ensures this by doing the procedure for "dog", then "dog/cat", etc... - """ - - if not os.path.isdir(pt): - # Note that os.path.exists(pt) may still hold. In this case the next command will cause an error. - os.makedirs(pt) - - -# path -def mypath(file): - """ Construct a file path relative to the scyther-gui main directory - """ - # Determine base directory (taking symbolic links into account) - cmd_file = os.path.realpath(os.path.abspath(inspect.getfile( inspect.currentframe() ))) - basedir = os.path.split(cmd_file)[0] - return os.path.join(basedir,file) - -def getShell(): - """ - Determine if we want a shell for Popen - """ - if sys.platform.startswith("win"): - shell=False - else: - # Needed to handle the string input correctly (as opposed to a sequence where the first element is the executable) - # This is not needed on Windows, where it has a different effect altogether. - # See http://docs.python.org/library/subprocess.html?highlight=subprocess#module-subprocess - shell=True - return shell - -def safeCommandOutput(cmd, storePopen=None): - """ Execute a command and return (sts,sout,serr). - Meant for short outputs, as output is stored in memory and - not written to a file. - """ - p = Popen(cmd, shell=getShell(), stdout=PIPE, stderr=PIPE) - if storePopen != None: - storePopen(p) - (sout,serr) = p.communicate() - - return (p.returncode,sout,serr) - -def safeCommand(cmd, storePopen=None): - """ Execute a command with some arguments. Safe cross-platform - version, I hope. """ - - try: - p = Popen(cmd, shell=getShell()) - if storePopen != None: - storePopen(p) - sts = p.wait() - except KeyboardInterrupt, EnvironmentError: - raise - except: - print "Wile processing [%s] we had an" % (cmd) - print "unexpected error:", sys.exc_info()[0] - print - sts = -1 - raise # For now still raise - - return sts - - -def panic(text): - """ - Errors that occur before we even are sure about wxPython etc. are dumped - on the command line and reported using Tkinter. - """ - - try: - import Tkinter - except: - print text - sys.exit(-1) - - print text - - root = Tkinter.Tk() - w = Tkinter.Label(root, justify=Tkinter.LEFT, padx = 10, text=text) - w.pack() - root.mainloop() - - sys.exit(-1) - diff --git a/Vagrant Files/shared/scyther/Scyther/Scyther.py b/Vagrant Files/shared/scyther/Scyther/Scyther.py deleted file mode 100644 index 0de9bb6..0000000 --- a/Vagrant Files/shared/scyther/Scyther/Scyther.py +++ /dev/null @@ -1,648 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# Scyther interface -# - -#--------------------------------------------------------------------------- - -""" Import externals """ -import os -import os.path -import sys -import StringIO -import tempfile -try: - import hashlib - HASHLIB = True -except ImportError: - HASHLIB = False - pass - -#--------------------------------------------------------------------------- - -""" Import scyther components """ -import XMLReader -import Error -import Claim -from Misc import * - -#--------------------------------------------------------------------------- - -""" -Globals -""" - -FirstCheck = True - -#--------------------------------------------------------------------------- - -""" -Get current directory (for this file) -""" -def getMyDir(): - return os.path.dirname( os.path.realpath( __file__ ) ) - -""" -The default path for the binaries is the current one. -""" -def getBinDir(): - return getMyDir() - -""" -Return Cache prefix path -Returns None if not existent -""" -def getCacheDir(): - - tmpdir = None - - # Check if user chose the path - cachedirkey = "SCYTHERCACHEDIR" - if cachedirkey in os.environ.keys(): - tmpdir = os.environ[cachedirkey] - if tmpdir == "": - # Special value: if the variable is present, but equals the empty string, we disable caching. - return None - else: - # Otherwise take from path - tmpdir = tempfile.gettempdir() - - # If not none, append special name - if tmpdir != None: - tmpdir = os.path.join(tmpdir,"Scyther-cache") - - return tmpdir - - - -#--------------------------------------------------------------------------- - -def Check(): - """ - Various dynamic checks that can be performed before starting the - backend. - """ - - global FirstCheck - - # First time - if FirstCheck: - """ - Perform any checks that only need to be done the first time. - """ - FirstCheck = False - - # Every time - - # Check Scyther backend program availability - program = getScytherBackend() - CheckSanity(program) - - -#--------------------------------------------------------------------------- - -def CheckSanity(program): - """ - This is where the existence is checked of the Scyther backend. - """ - - if not os.path.isfile(program): - raise Error.BinaryError, program - -#--------------------------------------------------------------------------- - -def EnsureString(x,sep=" "): - """ - Takes a thing that is either a list or a string. - Turns it into a string. If it was a list, <sep> is inserted, and the - process iterats. - - TODO does not accept unicode yet, that is something that must be - handled to or we run into wxPython problems eventually. - """ - if type(x) is str: - return x - - elif type(x) is list: - newlist = [] - for el in x: - newlist.append(EnsureString(el,sep)) - return sep.join(newlist) - - else: - raise Error.StringListError, x - - -#--------------------------------------------------------------------------- - -def getScytherBackend(): - # Where is my executable? - # - # Auto-detect platform and infer executable name from that - # - if "linux" in sys.platform: - - """ linux """ - scythername = "scyther-linux" - - elif "darwin" in sys.platform: - - """ OS X """ - scythername = "scyther-mac" - - elif sys.platform.startswith('win'): - - """ Windows """ - scythername = "scyther-w32.exe" - - else: - - """ Unsupported""" - raise Error.UnknownPlatformError, sys.platform - - program = os.path.join(getBinDir(),scythername) - return program - - -#--------------------------------------------------------------------------- - -class Scyther(object): - def __init__ ( self): - - # Init - self.program = getScytherBackend() - self.spdl = None - self.inputfile = None - self.filenames = [] - self.options = "" - self.claims = None - self.errors = None - self.errorcount = 0 - self.warnings = None - self.run = False - self.output = None - self.cmd = None - - # defaults - self.xml = True # this results in a claim end, otherwise we simply get the output - - def setInput(self,spdl): - self.spdl = spdl - self.inputfile = None - self.guessFileNames() - - def setFile(self,filename): - self.inputfile = filename - self.filenames = [self.inputfile] - self.spdl = "" - fp = open(filename,"r") - for l in fp.readlines(): - self.spdl += l - fp.close() - - def addFile(self,filename): - self.inputfile = None - if not self.spdl: - self.spdl = "" - fp = open(filename,"r") - for l in fp.readlines(): - self.spdl += l - fp.close() - self.guessFileNames() - - def guessFileNames(self,spdl=None): - """ - Try to extract filenames (well, actually, protocol names) sloppily from some spdl script. - - There are two modes: - - [init] : If the spdl parameter is empty or None, we reset the filenames and extract from self.spdl - [add] : If the spdl parameter is non-empty, add the extracted filenames to an existing list - - """ - - if (spdl == None) or (len(spdl) == 0): - spdl = self.spdl - if spdl == None: - spdl = "" - self.filenames = [] - - for sl in spdl.splitlines(): - l = sl.strip() - prefix = "protocol " - postfix = "(" - x = l.find(prefix) - if x >= 0: - # The prefix occurs - y = l.find(postfix,x+len(prefix)) - if y >= 0: - gn = l[x+len(prefix):y] - # check for helper protocols - if not gn.startswith("@"): - if gn not in self.filenames: - self.filenames.append(gn) - - def addArglist(self,arglist): - for arg in arglist: - self.options += " %s" % (arg) - - def doScytherCommand(self, spdl, args, checkKnown=False, storePopen=None): - """ - Cached version of the 'real' below - - TODO: CC: One possible problem with the caching is the side-effect, e.g., scyther writing to specific named output files. These are not - captured in the cache. I don't have a good solution for that yet. - """ - global HASHLIB - - # Can we use the cache? - canCache = False - if HASHLIB: - cacheDir = getCacheDir() - if cacheDir != None: - canCache = True - else: - cacheDir = None - - # If we cannot use the cache, we either need to compute or, if checking for cache presense,... - if not canCache: - if checkKnown == True: - # not using the cache, so we don't have it already - return False - else: - # Need to compute - return self.doScytherCommandReal(spdl,args, storePopen=storePopen) - - # Apparently we are supporsed to be able to use the cache - m = hashlib.sha256() - if spdl == None: - m.update("[spdl:None]") - else: - m.update(spdl) - if args == None: - m.update("[args:None]") - else: - m.update(args) - - uid = m.hexdigest() - - # Split the uid to make 256 subdirectories with 256 subdirectories... - prefixlen = 2 - uid1 = uid[:prefixlen] - uid2 = uid[prefixlen:prefixlen+2] - uid3 = uid[prefixlen+2:] - - # Possibly we could also decide to store input and arguments in the cache to analyze things later - - # Construct: cachePath/uid1/uid2/... - path = os.path.join(cacheDir,uid1,uid2) - name1 = "%s.out" % (uid3) - name2 = "%s.err" % (uid3) - - fname1 = os.path.join(path, name1) - fname2 = os.path.join(path, name2) - - try: - """ - Try to retrieve the result from the cache - """ - fh1 = open(fname1,"r") - out = fh1.read() - fh1.close() - fh2 = open(fname2,"r") - err = fh2.read() - fh2.close() - if checkKnown == True: - # We got to here, so we have it - return True - else: - # Not checking cache, we need the result - return (out,err) - except: - pass - - """ - Something went wrong, do the real thing and cache afterwards - """ - if checkKnown == True: - # We were only checking, abort - return False - - (out,err) = self.doScytherCommandReal(spdl,args, storePopen=storePopen) - - try: - # Try to store result in cache - ensurePath(path) - - fh1 = open(fname1,"w") - fh1.write(out) - fh1.close() - - fh2 = open(fname2,"w") - fh2.write(err) - fh2.close() - except: - pass - - return (out,err) - - - def doScytherCommandReal(self, spdl, args, storePopen=None): - """ - Run Scyther backend on the input - - Arguments: - spdl -- string describing the spdl text - args -- arguments for the command-line - storePopen -- callback function to register Popen objects (used for process kill by other threads) - Returns: - (output,errors) - output -- string which is the real output - errors -- string which captures the errors - """ - - if self.program == None: - raise Error.NoBinaryError - - # Sanitize input somewhat - if spdl == "": - # Scyther hickups on completely empty input - spdl = "\n" - - # Extract filenames for error reporting later - self.guessFileNames(spdl=spdl) - - # Generate temporary files for the output. - # Requires Python 2.3 though. - (fde,fne) = tempfile.mkstemp() # errors - (fdo,fno) = tempfile.mkstemp() # output - if spdl: - (fdi,fni) = tempfile.mkstemp() # input - - # Write (input) file - fhi = os.fdopen(fdi,'w+b') - fhi.write(spdl) - fhi.close() - - # Generate command line for the Scyther process - self.cmd = "" - self.cmd += "\"%s\"" % self.program - self.cmd += " --append-errors=%s" % fne - self.cmd += " --append-output=%s" % fno - self.cmd += " %s" % args - if spdl: - self.cmd += " %s" % fni - - # Only for debugging, really - ##print self.cmd - - # Start the process - safeCommand(self.cmd, storePopen=storePopen) - - # reseek - fhe = os.fdopen(fde) - fho = os.fdopen(fdo) - errors = fhe.read() - output = fho.read() - - # clean up files - fhe.close() - fho.close() - os.remove(fne) - os.remove(fno) - if spdl: - os.remove(fni) - - return (output,errors) - - def sanitize(self): - """ Sanitize some of the input """ - self.options = EnsureString(self.options) - - def verify(self,extraoptions=None,checkKnown=False,storePopen=None): - """ Should return a list of results """ - """ If checkKnown == True, we do not call Scyther, but just check the cache, and return True iff the result is in the cache """ - - # Cleanup first - self.sanitize() - - # prepare arguments - args = "" - if self.xml: - args += " --dot-output --xml-output --plain" - args += " %s" % self.options - if extraoptions: - # extraoptions might need sanitizing - args += " %s" % EnsureString(extraoptions) - - # Are we only checking the cache? - if checkKnown == True: - return self.doScytherCommand(self.spdl, args, checkKnown=checkKnown, storePopen=storePopen) - - # execute - (output,errors) = self.doScytherCommand(self.spdl, args, storePopen=storePopen) - self.run = True - - # process errors - self.errors = [] - self.warnings = [] - for l in errors.splitlines(): - line = l.strip() - if len(line) > 0: - # filter out any non-errors (say maybe only claim etc) and count - # them. - if line.startswith("claim\t"): - # Claims are lost, reconstructed from the XML output - pass - elif line.startswith("warning"): - # Warnings are stored seperately - self.warnings.append(line) - else: - # otherwise it is an error - self.errors.append(line) - - self.errorcount = len(self.errors) - if self.errorcount > 0: - raise Error.ScytherError(self.errors,filenames=self.filenames,options=self.options) - - # process output - self.output = output - self.validxml = False - self.claims = [] - if self.xml: - if len(output) > 0: - if output.startswith("<scyther>"): - - # whoohee, xml - self.validxml = True - - xmlfile = StringIO.StringIO(output) - reader = XMLReader.XMLReader() - self.claims = reader.readXML(xmlfile) - - # Determine what should be the result - if self.xml: - return self.claims - else: - return self.output - - def verifyOne(self,cl=None,checkKnown=False,storePopen=None): - """ - Verify just a single claim with an ID retrieved from the - procedure below, 'scanClaims', or a full claim object - - If checkKnown is True, return if the result is already known (but never recompute). - """ - if cl: - # We accept either a claim or a claim id - if isinstance(cl,Claim.Claim): - cl = cl.id - return self.verify("--filter=%s" % cl, checkKnown=checkKnown,storePopen=storePopen) - else: - # If no claim, then its just normal verification - return self.verify(checkKnown=checkKnown,storePopen=storePopen) - - def scanClaims(self): - """ - Retrieve the list of claims. Of each element (a claim), claim.id - can be passed to --filter=X or 'verifyOne' later. - A result of 'None' means that some errors occurred. - """ - self.verify("--scan-claims") - if self.errorcount > 0: - return None - else: - self.validxml = False # Signal that we should not interpret the output as XML - return self.claims - - def getClaim(self,claimid): - if self.claims: - for cl in self.claims: - if cl.id == claimid: - return cl - return None - - def __str__(self): - if self.run: - if self.errorcount > 0: - return "%i errors:\n%s" % (self.errorcount, "\n".join(self.errors)) - else: - if self.xml and self.validxml: - s = "Verification results:\n" - for cl in self.claims: - s += str(cl) + "\n" - return s - else: - return self.output - else: - return "Scyther has not been run yet." - -#--------------------------------------------------------------------------- - -def GetClaims(filelist, filterlist=None): - """ - Given a list of file names in filelist, - returns a dictionary of filenames to lists claim names. - Filenames which yielded no claims are filtered out. - - Filterlist may be None or a list of claim names (Secret, SKR, Niagree etc). - """ - - dict = {} - for fname in filelist: - try: - sc = Scyther() - sc.setFile(fname) - l = sc.scanClaims() - if l != None: - cl = [] - for claim in l: - if filterlist == None: - cl.append(claim.id) - else: - if claim.claimtype in filterlist: - cl.append(claim.id) - dict[fname] = cl - except: - pass - return dict - -#--------------------------------------------------------------------------- - -def FindProtocols(path="",filterProtocol=None): - """ - Find a list of protocol names - - Note: Unix only! Will not work under windows. - """ - - import commands - - cmd = "find %s -iname '*.spdl'" % (path) - plist = commands.getoutput(cmd).splitlines() - nlist = [] - for prot in plist: - if filterProtocol != None: - if filterProtocol(prot): - nlist.append(prot) - else: - nlist.append(prot) - return nlist - -#--------------------------------------------------------------------------- - -def GetInfo(html=False): - """ - Retrieve a tuple (location,string) with information about the tool, - retrieved from the --expert --version data - """ - - program = getScytherBackend() - arg = "--expert --version" - sc = Scyther() - (output,errors) = sc.doScytherCommand(spdl=None, args=arg) - if not html: - return (program,output) - else: - sep = "<br>\n" - html = "Backend: %s%s" % (program,sep) - for l in output.splitlines(): - l.strip() - html += "%s%s" % (l,sep) - return html - - -def GetLicense(): - """ - Retrieve license information. - """ - - program = getScytherBackend() - arg = "--license" - sc = Scyther() - (output,errors) = sc.doScytherCommand(spdl=None, args=arg) - return output - - -#--------------------------------------------------------------------------- - -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/Scyther/Term.py b/Vagrant Files/shared/scyther/Scyther/Term.py deleted file mode 100644 index 9369aa2..0000000 --- a/Vagrant Files/shared/scyther/Scyther/Term.py +++ /dev/null @@ -1,223 +0,0 @@ -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# Term -# -import Trace -from Misc import * - -class InvalidTerm(TypeError): - "Exception used to indicate that a given term is invalid" - - -class Knowledge(object): - def __init__(self,attack): - self.attack = attack - self.knowledge = [] - - def getInverse(self,term): - for pair in self.attack.inverseKeys: - if term == pair[0]: - return pair[1] - if term == pair[1]: - return pair[0] - - # Get the inverse key - def getInverseKey(self,term): - # First try to see if the entire term has an inverse - result = self.getInverse(term) - if result != None: - return result - - # If it is an apply term, try to see if the function has an inverse - if isinstance(term,TermApply): - result = self.getInverse(term.function) - if result != None: - return TermApply(result,term.argument) - - # No inverse found, so term is its own inverse - return term - - # Add a term to the knowledge - def add(self,term): - if term == None: - return - added = False - for x in term.deriveTerms(self): - if not x in self.knowledge: - added = True - self.knowledge.append(x) - - # Something new was added, maybe this can help us to decrypt a term - # that we could not decrypt before - if added: - for x in self.knowledge: - if isinstance(x,TermEncrypt): - self.add(x) - - def canDerive(self,term): - # We can derive free variables, because we can even choose them - if isinstance(term,TermVariable) and term.isFree(): - return True - # We can derive a term if it is in the knowledge - # or all terms required to construct it are in the knowledge - if exists(lambda x: x == term,self.knowledge): - return True - constructors = term.constructorTerms() - - if len(constructors) == 1 and constructors[0] == term: - # This is a single term, there is no need to look at constructor - # terms as we have already looked at the complete term - return False - - return forall(lambda x: self.canDerive(x),constructors) - - - # Knowledge is the initial knowledge and all messages in sends - def buildKnowledge(self): - self.knowledge = self.attack.initialKnowledge[:] - for run in self.attack.semiTrace.runs: - # Intruder actions do not add knowledge processing them - # is a waste of time - if run.intruder: - continue - for event in run: - if isinstance(event,Trace.EventSend): - self.add(event.message) - self.add(event.fr) - self.add(event.to) - -class Term(object): - def __init__(self): - self.types = None - - def __str__(self): - raise InvalidTerm - - def constructorTerms(self): - raise InvalidTerm - - def deriveTerms(self,knowledge): - raise InvalidTerm - - # Two terms are equal when their string rep is equal - def __cmp__(self,other): - return cmp(str(self),str(other)) - - -class TermConstant(Term): - def __init__(self, constant): - Term.__init__(self) - self.value = str(constant) - - def deriveTerms(self,knowledge): - return [self] - - def constructorTerms(self): - return [self] - - def __str__(self): - return self.value - -class TermEncrypt(Term): - def __init__(self, value, key): - Term.__init__(self) - self.value = value - self.key = key - - def deriveTerms(self,knowledge): - # In order to unpack an encrypted term we have to have the inverse key - inverse = knowledge.getInverseKey(self.key) - if knowledge.canDerive(inverse): - return [self] + [self.value] + self.value.deriveTerms(knowledge) - else: - return [self] - - def constructorTerms(self): - return [self.value,self.key] - - def __str__(self): - return "{%s}%s" % (self.value, self.key) - -class TermApply(Term): - def __init__(self, function, argument): - Term.__init__(self) - self.function = function - self.argument = argument - - def constructorTerms(self): - return [self.function,self.argument] - - def deriveTerms(self,knowledge): - return [self] - - def __str__(self): - return "%s(%s)" % (self.function, self.argument) - -class TermVariable(Term): - def __init__(self, name, value): - Term.__init__(self) - self.name = name - self.value = value - - def isFree(self): - return self.value == None - - def constructorTerms(self): - if self.value != None: - return [self.value] - else: - return [self.name] - - def deriveTerms(self,knowledge): - if self.value != None: - return [self,self.value] + self.value.deriveTerms(knowledge) - else: - return [self,self.name] - - def __str__(self): - if (self.value != None): - return str(self.value) - else: - return str(self.name) - -class TermTuple(Term): - def __init__(self, op1, op2): - Term.__init__(self) - self.op1 = op1 - self.op2 = op2 - - def __str__(self): - return "%s,%s" % (self.op1,self.op2) - - def constructorTerms(self): - return [self.op1,self.op2] - - def deriveTerms(self,knowledge): - return [self,self.op1,self.op2]+self.op1.deriveTerms(knowledge)+self.op2.deriveTerms(knowledge) - - def __getitem__(self,index): - if index == 0: - return self.op1 - elif index == 1: - return self.op2 - else: - return self.op2.__getitem__(index-1) - diff --git a/Vagrant Files/shared/scyther/Scyther/Trace.py b/Vagrant Files/shared/scyther/Scyther/Trace.py deleted file mode 100644 index 31e31cc..0000000 --- a/Vagrant Files/shared/scyther/Scyther/Trace.py +++ /dev/null @@ -1,358 +0,0 @@ -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# Trace -# -from Misc import * - -class InvalidAction(TypeError): - "Exception used to indicate that a given action is invalid" - -class InvalidEvent(TypeError): - "Exception used to indicate that a given event is invalid" - -class SemiTrace(object): - def __init__(self): - self.runs = [] - - def totalCount(self): - count = 0 - for run in self.runs: - count += len(run.eventList) - return count - - def sortActions(self,actionlist): - newlist = actionlist[:] - newlist.sort(lambda x,y: self.getOrder(x,y)) - return newlist - - def getEnabled(self,previous): - enabled = [] - for run in self.runs: - for event in run: - if event in previous or event in enabled: - continue - prec = self.getPrecedingEvents(event,previous) - if len(prec) == 0: - enabled.append(event) - return enabled - - # Returns run,index tuples for all connections - def getConnections(self,event,removeIntruder=False): - if not removeIntruder: - return event.follows - result = [] - if event.run.intruder: - for before in event.getBefore(): - result.extend(self.getConnections(before,removeIntruder)) - - for x in event.follows: - fol = self.getEvent(x) - # If this is an intruder action descend into it - if fol.run.intruder: - result.extend(self.getConnections(fol,removeIntruder)) - else: - result.append(x) - return uniq(result) - - # Return the minimum set of preceding events for a given event - # that is the events before this event in the same run and all - # actions required by the partional ordering - # If previous is non empty remove all events already in previous - def getPrecedingEvents(self,event,previous=[]): - # If it is cached return cached version - if event.preceding != None: - return filter(lambda x: x not in previous,event.preceding) - preceding = [] - for prec in event.getBefore(): - preceding.append(prec) - preceding.extend(self.getPrecedingEvents(prec)) - for x in event.follows: - fol = self.getEvent(x) - preceding.append(fol) - preceding.extend(self.getPrecedingEvents(fol)) - preceding = uniq(preceding) - event.preceding = preceding - preceding = filter(lambda x: x not in previous,preceding) - return preceding - - # Returns -1 if the first event has to be before the second one - # +1 if the second event has to be before the first one - # 0 if there is no order defined on the two events - def getOrder(self,event1,event2): - if (event1 in self.getPrecedingEvents(event2)): - return -1 - if (event2 in self.getPrecedingEvents(event1)): - return 1 - return 0 - - # Get event by run id and index - def getEvent(self,idx): - (rid,index) = idx - for run in self.runs: - if run.id != rid: - continue - for event in run: - if event.index == index: - return event - raise InvalidEvent - - # Get all claim events in the trace - def getClaims(self): - claims = [] - for run in self.runs: - for event in run: - if isinstance(event,EventClaim): - claims.append(event) - return claims - - # Returns a list of all initiation events in the semitrace - def getInitiations(self): - initiations = [] - for run in self.runs: - # Initiations are runs of honest agents - if (run.intruder): - continue - # Which contain no recvs before the first send - for action in run: - if (isinstance(action,EventRead)): - break - elif (isinstance(action,EventSend)): - initiations.append(action) - break - return initiations - - # Get all runs performed by a specific agent - def getAgentRuns(self,agent): - result = [] - for run in self.runs: - if run.getAgent() == agent: - result.append(run) - return result - - # Return a list of all runs that are parallel with this run - def getParallelRuns(self,run): - parallel = [] - first = run.getFirstAction() - # Process all events that are before the end of the run - for event in self.getPrecedingEvents(run.getLastAction()): - # Only count those we haven't found yet - if event.run in parallel or event.run == run: - continue - # If the event is also after the beginning of the run it is - # parallel - if self.getOrder(event,first) == 1: - parallel.append(event.run) - return parallel - - def getRun(self,runid): - for run in self.runs: - if run.id == runid: - return run - return None - -class ProtocolDescription(object): - def __init__(self,protocol): - self.protocol = protocol - self.roledescr = {} - - # Find event by label - def findEvent(self,eventlabel,eventType=None): - for (role,descr) in self.roledescr.items(): - for event in descr: - if event.label == eventlabel: - if eventType == None or isinstance(event,eventType): - return event - - # Return all events that should have occured before the given event - # if the protocol is executed exactly as specified - # (i.e. all previous events in the same run and the preceding events - # of the matching sends of all reads) - def getPrecedingEvents(self,eventlabel,eventType=None): - event = self.findEvent(eventlabel,eventType) - if event.preceding != None: - return event.preceding - preceding = event.getBefore()+[event] - for prev in preceding: - # For this event and all events that are before it in the run - # description see if it is a read and if it is also add the - # precedinglabelset of the matching send - if (isinstance(prev,EventRead)): - match = self.findEvent(prev.label,EventSend) - if match: - preceding.extend(self.getPrecedingEvents(match.label,EventSend)) - preceding = uniq(preceding) - event.preceding = preceding - return preceding - - # Calculate the preceding labelset that is all read events - # that are in the precedingEvents of a certain event - def getPrecedingLabelSet(self,eventlabel): - events = self.getPrecedingEvents(eventlabel) - events = filter(lambda x: isinstance(x,EventRead),events) - return [x.label for x in events] - - # Calculate the roles in preceding labelset that is all roles that - # that are in the precedingEvents of a certain event - def getPrecedingRoleSet(self,eventlabel): - events = self.getPrecedingEvents(eventlabel) - roles = uniq([x.run.role for x in events]) - return roles - - - def __str__(self): - s = '' - for x in self.roledescr.values(): - for e in x: - s += str(e) + "\n" - return s - -class Run(object): - def __init__(self): - self.id = None - self.protocol = None - self.role = None - self.roleAgents = {} - self.eventList = [] - self.intruder = False - self.attack = None - self.variables = [] - - def __iter__(self): - return iter(self.eventList) - - def getAgent(self): - if self.intruder: - return None - return self.roleAgents[self.role] - - def getFirstAction(self): - return self.eventList[0] - - def getLastAction(self): - return self.eventList[-1] - - def collapseIntruder(self): - """ TODO still working on this. """ - if self.intruder: - shouldcollapse = False - for ev in self: - return - -class Event(object): - def __init__(self,index,label,follows): - self.index = index - self.label = label - self.follows = follows - self.run = None - self.preceding = None - self.rank = None - - def shortLabel(self): - try: - return self.label[len(self.label)-1] - except: - return str(self.label) - - def getBefore(self): - result = [] - for event in self.run: - if (event == self): - return result - result.append(event) - # This should never happen - assert(False) - -class EventSend(Event): - def __init__(self,index,label,follows,fr,to,message): - Event.__init__(self,index,label,follows) - self.fr = fr - self.to = to - self.message = message - - def __str__(self): - if self.run.intruder: - return "SEND(%s)" % self.message - else: - return "SEND_%s(%s,%s)" % (self.shortLabel(),self.to,self.message) - -class EventRead(Event): - def __init__(self,index,label,follows,fr,to,message): - Event.__init__(self,index,label,follows) - self.fr = fr - self.to = to - self.message = message - - def __str__(self): - if self.run.intruder: - return "READ(%s)" % self.message - else: - return "READ_%s(%s,%s)" % (self.shortLabel(),self.fr, self.message) - -class EventClaim(Event): - def __init__(self,index,label,follows,role,type,argument): - Event.__init__(self,index,label,follows) - self.role = role - self.type = type - self.argument = argument - self.broken = None - - # A Claim should be ignored if there is an untrusted agent in the role - # agents - def ignore(self): - for untrusted in self.run.attack.untrusted: - if untrusted in self.run.roleAgents.values(): - return True - return False - - # Return (protocol,role) - def protocolRole(self): - return "(%s,%s)" % (self.run.protocol,self.run.role) - - def argstr(self): - if self.argument == None: - return '*' - else: - return str(self.argument) - - def __str__(self): - return "CLAIM_%s(%s, %s)" % (self.shortLabel(),self.type,self.argstr()) - -class EventIntruder(Event): - """ - Intruder event extensions (allows for collapsing attacks later) - """ - def __init__(self,follows,message,key,result): - Event.__init__(self,0,None,follows) - self.follows = follows - self.message = message - self.key = key - self.result = result - self.intruder = True - -class EventDecr(EventIntruder): - def __str__(self): - return "DECR(%s, %s, %s)" % (self.message, self.key, self.result) - -class EventEncr(EventIntruder): - def __str__(self): - return "ENCR(%s, %s, %s)" % (self.message, self.key, self.result) - - diff --git a/Vagrant Files/shared/scyther/Scyther/XMLReader.py b/Vagrant Files/shared/scyther/Scyther/XMLReader.py deleted file mode 100644 index ebafc47..0000000 --- a/Vagrant Files/shared/scyther/Scyther/XMLReader.py +++ /dev/null @@ -1,357 +0,0 @@ -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# XMLReader -# -# Note: -# This requires python elementtree to work -# See: http://effbot.org/zone/element-index.htm -# -# On Fedora Core you can install this by installing the python-elementtree rpm -# Things will be a lot faster and consume less memory if you install the -# cElementTree module -# -# In python 2.5 cElementTree is in the core, so you don't need to install -# extra packages -# - -import sys - -# Check for cElementTree presence. Otherwise use ElementTree. -useiter = True -try: - # python 2.5 has cElementTree in the core - import xml.etree.cElementTree as cElementTree -except: - # try the old way - try: - import cElementTree - except ImportError: - useiter = False - try: - from elementtree import ElementTree - except ImportError: - print """ -ERROR: - -Could not locate either the [elementtree] or the [cElementTree] package. -Please install one of them in order to work with the Scyther python interface. -The [cElementTree] packages can be found at http://effbot.org/zone/celementtree.htm - -Note that you can still use the Scyther binaries in the 'Bin' directory. - """ - sys.exit(1) - -## Simply pick cElementTree -#import cElementTree -## Simply pick ElementTree -#useiter = False -#from elementtree import ElementTree - -import Term -import Attack -import Trace -import Claim - -class XMLReader(object): - - def __init__ (self): - self.varlist = [] - pass - - def readXML(self, input): - # Use iter parse when possble so we can clear the attack after reading - # it in order to preserve memory (this requires cElementTree) - - attackbuffer = [] - claims = [] - - if useiter: - parser = cElementTree.iterparse(input) - else: - parser = ElementTree.parse(input).findall('*') - - for elem in parser: - # The iter parser receives the input in tuples (event and element) - # we only need the event - if useiter: - elem = elem[1] - - if elem.tag == 'state': - attack = self.readAttack(elem) - attackbuffer.append(attack) - if useiter: - elem.clear() - - if elem.tag == 'claimstatus': - claim = self.readClaim(elem) - claim.attacks = attackbuffer - claims.append(claim) - - # link to parent - for attack in claim.attacks: - attack.claim = claim - - attackbuffer = [] - if useiter: - elem.clear() - - return claims - - # Read a term from XML - def readTerm(self,xml): - # If xml is None the term should also be none - if xml == None: - return None - # If this is a term variable read it directly - if (xml.tag in ('tuple','const','apply','encrypt','var')): - return self.readSubTerm(xml) - # Otherwise read from it's first child - children = xml.getchildren() - assert(len(children) == 1) - return self.readSubTerm(children[0]) - - def readSubTerm(self, tag): - if tag.tag == 'tuple': - return Term.TermTuple(self.readTerm(tag.find('op1')),self.readTerm(tag.find('op2'))) - elif tag.tag == 'const': - return Term.TermConstant(tag.text) - elif tag.tag == 'apply': - return Term.TermApply(self.readTerm(tag.find('function')),self.readTerm(tag.find('arg'))) - elif tag.tag == 'encrypt': - return Term.TermEncrypt(self.readTerm(tag.find('op')),self.readTerm(tag.find('key'))) - elif tag.tag == 'var': - name = Term.TermConstant(tag.get('name')) - # Instantiate this variable if possible (note this list is empty while reading - # the variables section of the XML file) - for inst in self.varlist: - if inst.name == name: - return inst - # If it is not instantiated in varlist, just return a variable with this name and no - # value - return Term.TermVariable(name,None) - else: - raise Term.InvalidTerm, "Invalid term type in XML: %s" % tag.tag - - def readEvent(self,xml): - label = self.readTerm(xml.find('label')) - follows = xml.findall('follows') - followlist = [] - for follow in follows: - follow = follow.find('after') - if follow == None: - # Ignore follow definitions that do not contain after - continue - follow = (int(follow.get('run')),int(follow.get('index'))) - followlist.append(follow) - - (etype,index) = (xml.get('type'),int(xml.get('index'))) - if etype in ('send','read','recv'): - fr = self.readTerm(xml.find('from')) - to = self.readTerm(xml.find('to')) - message = self.readTerm(xml.find('message')) - if (etype == 'send'): - return Trace.EventSend(index,label,followlist,fr,to,message) - else: - return Trace.EventRead(index,label,followlist,fr,to,message) - elif xml.get('type') == 'claim': - role = self.readTerm(xml.find('role')) - etype = self.readTerm(xml.find('type')) - argument = self.readTerm(xml.find('argument')) - # Freshness claims are implemented as Empty claims with - # (Fresh,Value) as arguments - try: - if etype == 'Empty' and argument[0] == 'Fresh': - etype = Term.TermConstant('Fresh') - argument = argument[1] - elif etype == 'Empty' and argument[0] == 'Compromised': - etype = Term.TermConstant('Compromised') - argument = argument[1] - except: - pass - return Trace.EventClaim(index,label,followlist,role,etype,argument) - else: - raise Trace.InvalidAction, "Invalid action in XML: %s" % (xml.get('type')) - - def readRun(self,xml): - assert(xml.tag == 'run') - run = Trace.Run() - run.id = int(xml.find('runid').text) - # TODO why is protocol name a term?? - run.protocol = str(self.readTerm(xml.find('protocol'))) - run.intruder = xml.find('protocol').get('intruder') == 'true' - run.role = xml.find('rolename').text - for role in xml.find('roleagents'): - name = role.find('rolename').text - agent = self.readTerm(role.find('agent')) - run.roleAgents[name] = agent - for eventxml in xml.find('eventlist'): - action = self.readEvent(eventxml) - action.run = run - run.eventList.append(action) - for variable in xml.find('variables'): - # Read the variables one by one - assert(variable.tag == 'variable') - var = self.readTerm(variable.find('name').find('term')) - var.types = self.readTypeList(variable.find('name')) - - substxml = variable.find('substitution') - # Read substitution if present - if substxml != None: - subst = self.readTerm(substxml.find('term')) - subst.types = self.readTypeList(substxml) - newvar = Term.TermVariable(var.name,subst) - newvar.types = var.types - var = newvar - - run.variables.append(var) - return run - - # Read protocol description for a certain role - def readRoleDescr(self,xml): - assert(xml.tag == 'role') - run = Trace.Run() - # We will need the last label later on to see if a - # run is complete - run.lastLabel = None - run.role = xml.find('rolename').text - for eventxml in xml.find('eventlist'): - action = self.readEvent(eventxml) - action.run = run - run.eventList.append(action) - run.lastLabel = action.label - return run - - def readTypeList(self,xml): - result = [] - vartypes = xml.find('type').find('termlist') - for vartype in vartypes: - # We will assume that types are simple strings - result.append(str(self.readTerm(vartype))) - return result - - def readClaim(self, xml): - claim = Claim.Claim() - for event in xml.getchildren(): - if event.tag == 'claimtype': - claim.claimtype = self.readTerm(event) - elif event.tag == 'label': - # We store the full protocol,label construct for - # consistency with the technical parts, so it is left to - # the __str__ of claim to select the right element - claim.label = self.readTerm(event) - elif event.tag == 'protocol': - claim.protocol = self.readTerm(event) - elif event.tag == 'role': - claim.role = self.readTerm(event) - elif event.tag == 'parameter': - claim.parameter = self.readTerm(event) - - elif event.tag == 'failed': - claim.failed = int(event.text) - elif event.tag == 'count': - claim.count = int(event.text) - elif event.tag == 'states': - claim.states = int(event.text) - - elif event.tag == 'complete': - claim.complete = True - elif event.tag == 'timebound': - claim.timebound = True - else: - print >>sys.stderr,"Warning unknown tag in claim: %s" % claim.tag - - claim.analyze() - return claim - - def readAttack(self, xml): - self.varlist = [] - attack = Attack.Attack() - attack.id = int(xml.get('id')) - # A state contains 4 direct child nodes: - # broken, system, variables and semitrace - # optionally a fifth: dot - for event in xml.getchildren(): - if event.tag == 'broken': - attack.broken.append((self.readTerm(event.find('claim')), - self.readTerm(event.find('label')))) - elif event.tag == 'system': - attack.match = int(event.find('match').text) - for term in event.find('commandline'): - if attack.commandline != '': - attack.commandline += ' ' - attack.commandline += term.text - for term in event.find('untrusted').find('termlist'): - attack.untrusted.append(str(self.readTerm(term))) - for term in event.find('initialknowledge').find('termlist'): - attack.initialKnowledge.append(self.readTerm(term)) - for keypair in event.find('inversekeys'): - inverse = [] - for term in keypair: - inverse.append(self.readTerm(term)) - assert(len(inverse) == 0 or len(inverse) == 2) - attack.inverseKeys.append(inverse) - # TODO why is protocol name a term?? - for protocolxml in event.findall('protocol'): - protocol = str(self.readTerm(protocolxml.find('name'))) - descr = Trace.ProtocolDescription(protocol) - attack.protocoldescr[protocol] = descr - for rolexml in protocolxml.findall('role'): - roledescr = self.readRoleDescr(rolexml) - descr.roledescr[roledescr.role] = roledescr - - elif event.tag == 'semitrace': - for runxml in event: - run = self.readRun(runxml) - run.attack = attack - attack.semiTrace.runs.append(run) - - elif event.tag == 'dot': - # Apparently Scyther already generated dot output, - # store - attack.scytherDot = event.text - - elif event.tag == 'variables': - # Read the variables one by one - for varxml in event: - if varxml.get('typeflaw') == 'true': - attack.typeflaws = True - var = self.readTerm(varxml.find('name').find('term')) - var.types = self.readTypeList(varxml.find('name')) - - substxml = varxml.find('substitution') - # Read substitution if present - if substxml != None: - subst = self.readTerm(substxml.find('term')) - subst.types = self.readTypeList(substxml) - newvar = Term.TermVariable(var.name,subst) - newvar.types = var.types - var = newvar - - attack.variables.append(var) - - # When all have been read set self.varlist so that when - # we read terms in the attacks they can be filled in using - # this list - self.varlist = attack.variables - else: - print >>sys.stderr,"Warning unknown tag in attack: %s" % event.tag - return attack - diff --git a/Vagrant Files/shared/scyther/Scyther/__init__.py b/Vagrant Files/shared/scyther/Scyther/__init__.py deleted file mode 100644 index 1fa659c..0000000 --- a/Vagrant Files/shared/scyther/Scyther/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# Init this module -# -# Set prefix for __all__ -# -import Scyther - -# Provide scope -__all__ = ["Scyther"] - diff --git a/Vagrant Files/shared/scyther/Time/test.py b/Vagrant Files/shared/scyther/Time/test.py deleted file mode 100644 index 50ea49e..0000000 --- a/Vagrant Files/shared/scyther/Time/test.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2008 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# test.py -# experimenting with the constraint solver -# -# Ubuntu package: python-constraint -# -# http://labix.org/python-constraint -# - -#--------------------------------------------------------------------------- - -""" Import externals """ -import sys -try: - from constraint import * -except: - print "Could not import constraint solver module." - print "For more information, visit" - print " http://labix.org/python-constraint" - sys.exit() - -#--------------------------------------------------------------------------- - -def test(): - problem = Problem() - problem.addVariables(range(0, 16), range(1, 16+1)) - problem.addConstraint(AllDifferentConstraint(), range(0, 16)) - problem.addConstraint(ExactSumConstraint(34), [0,5,10,15]) - problem.addConstraint(ExactSumConstraint(34), [3,6,9,12]) - for row in range(4): - problem.addConstraint(ExactSumConstraint(34), - [row*4+i for i in range(4)]) - for col in range(4): - problem.addConstraint(ExactSumConstraint(34), - [col+4*i for i in range(4)]) - solutions = problem.getSolutions() - print solutions - -#--------------------------------------------------------------------------- - -if __name__ == '__main__': - test() - diff --git a/Vagrant Files/shared/scyther/batcher.sh b/Vagrant Files/shared/scyther/batcher.sh deleted file mode 100644 index 6b430d3..0000000 --- a/Vagrant Files/shared/scyther/batcher.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -# -# batcher.sh -# -# usage: ./batcher.sh TEST_MPA_ARGUMENTS -# -# Tries to parallellize the jobs, and sends a mail afterwards - -echo "=================================" -echo " Phase 0: Setup" -echo "=================================" -AWKSCRIPT=" { srand(); print int(1000000 * rand()) } " -RND=`echo | awk "$AWKSCRIPT"` - -JOBNAME="test$RND" -JSONFILE="$PWD/$JOBNAME.json" -BATCHFILE="$PWD/$JOBNAME.sh" - -echo $JOBNAME -echo $JSONFILE -echo $BATCHFILE - -echo "=================================" -echo " Phase 1: generate jobs list" -echo "=================================" -bsub -I -N -W 8:00 -J $JOBNAME ./test-mpa.py --pickle $JSONFILE $* - -echo "=================================" -echo " Phase 2a: precompute job outputs" -echo "=================================" -# Each verification has a time limit of 600 seconds = 10 minutes -# To fit in the one hour queue, that means 5 jobs maximum. -bsub -I -N -W 8:00 -J $JOBNAME -oo $BATCHFILE ./make-bsub.py $JSONFILE 5 -W 1:00 -J $JOBNAME -# Due to pending etc. the below may take a while. -sleep 10 -bash $BATCHFILE -echo "=================================" -echo " Phase 2b: perfom actual job" -echo " (after precomputation is done" -echo "=================================" -bsub -I -N -W 8:00 -J after$JOBNAME -w "ended($JOBNAME)" ./test-mpa.py $* - - -echo "=================================" -echo " Done." -echo "=================================" diff --git a/Vagrant Files/shared/scyther/combos-book.sh b/Vagrant Files/shared/scyther/combos-book.sh deleted file mode 100644 index 888db45..0000000 --- a/Vagrant Files/shared/scyther/combos-book.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -bsub -W 8:00 -Jd "book-aa-t" -N ./test-mpa.py -m 2 --plain --latex book-aa-t Protocols/MultiProtocolAttacks/*.spdl -bsub -W 8:00 -Jd "book-aa-b" -N ./test-mpa.py -m 2 --plain -b --latex book-aa-b Protocols/MultiProtocolAttacks/*.spdl -bsub -W 8:00 -Jd "book-aa-u" -N ./test-mpa.py -m 2 --plain -u --latex book-aa-u Protocols/MultiProtocolAttacks/*.spdl -bsub -W 8:00 -Jd "book-ex-t" -N ./test-mpa.py -m 2 --plain --extravert --latex book-ex-t Protocols/MultiProtocolAttacks/*.spdl -bsub -W 8:00 -Jd "book-ex-b" -N ./test-mpa.py -m 2 --plain -b --extravert --latex book-ex-b Protocols/MultiProtocolAttacks/*.spdl -bsub -W 8:00 -Jd "book-ex-u" -N ./test-mpa.py -m 2 --plain -u --extravert --latex book-ex-u Protocols/MultiProtocolAttacks/*.spdl -bsub -W 8:00 -Jd "book-iu-t" -N ./test-mpa.py -m 2 --plain --init-unique --latex book-iu-t Protocols/MultiProtocolAttacks/*.spdl -bsub -W 8:00 -Jd "book-iu-b" -N ./test-mpa.py -m 2 --plain -b --init-unique --latex book-iu-b Protocols/MultiProtocolAttacks/*.spdl -bsub -W 8:00 -Jd "book-iu-u" -N ./test-mpa.py -m 2 --plain -u --init-unique --latex book-iu-u Protocols/MultiProtocolAttacks/*.spdl diff --git a/Vagrant Files/shared/scyther/combos-ike.sh b/Vagrant Files/shared/scyther/combos-ike.sh deleted file mode 100644 index 515b20e..0000000 --- a/Vagrant Files/shared/scyther/combos-ike.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -# Individual data -./combos-ikev1.sh -./combos-ikev2.sh - -# And combine -./combos-ikev0.sh diff --git a/Vagrant Files/shared/scyther/combos-ikev0.sh b/Vagrant Files/shared/scyther/combos-ikev0.sh deleted file mode 100644 index 389835b..0000000 --- a/Vagrant Files/shared/scyther/combos-ikev0.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -bsub -W 8:00 -Jd "ike0-aa-t" -N ./test-mpa.py -m 2 --plain --latex ike0-aa-t ~/src/ikev2/pp-results/mpa/ikev*.spdl -bsub -W 8:00 -Jd "ike0-aa-b" -N ./test-mpa.py -m 2 --plain -b --latex ike0-aa-b ~/src/ikev2/pp-results/mpa/ikev*.spdl -bsub -W 8:00 -Jd "ike0-aa-u" -N ./test-mpa.py -m 2 --plain -u --latex ike0-aa-u ~/src/ikev2/pp-results/mpa/ikev*.spdl -bsub -W 8:00 -Jd "ike0-ex-t" -N ./test-mpa.py -m 2 --plain --extravert --latex ike0-ex-t ~/src/ikev2/pp-results/mpa/ikev*.spdl -bsub -W 8:00 -Jd "ike0-ex-b" -N ./test-mpa.py -m 2 --plain -b --extravert --latex ike0-ex-b ~/src/ikev2/pp-results/mpa/ikev*.spdl -bsub -W 8:00 -Jd "ike0-ex-u" -N ./test-mpa.py -m 2 --plain -u --extravert --latex ike0-ex-u ~/src/ikev2/pp-results/mpa/ikev*.spdl -bsub -W 8:00 -Jd "ike0-iu-t" -N ./test-mpa.py -m 2 --plain --init-unique --latex ike0-iu-t ~/src/ikev2/pp-results/mpa/ikev*.spdl -bsub -W 8:00 -Jd "ike0-iu-b" -N ./test-mpa.py -m 2 --plain -b --init-unique --latex ike0-iu-b ~/src/ikev2/pp-results/mpa/ikev*.spdl -bsub -W 8:00 -Jd "ike0-iu-u" -N ./test-mpa.py -m 2 --plain -u --init-unique --latex ike0-iu-u ~/src/ikev2/pp-results/mpa/ikev*.spdl - diff --git a/Vagrant Files/shared/scyther/combos-ikev1.sh b/Vagrant Files/shared/scyther/combos-ikev1.sh deleted file mode 100644 index a5743b9..0000000 --- a/Vagrant Files/shared/scyther/combos-ikev1.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -bsub -W 8:00 -Jd "ike1-aa-t" -N ./test-mpa.py -m 2 --plain --latex ike1-aa-t ~/src/ikev2/pp-results/mpa/ikev1*.spdl -bsub -W 8:00 -Jd "ike1-aa-b" -N ./test-mpa.py -m 2 --plain -b --latex ike1-aa-b ~/src/ikev2/pp-results/mpa/ikev1*.spdl -bsub -W 8:00 -Jd "ike1-aa-u" -N ./test-mpa.py -m 2 --plain -u --latex ike1-aa-u ~/src/ikev2/pp-results/mpa/ikev1*.spdl -bsub -W 8:00 -Jd "ike1-ex-t" -N ./test-mpa.py -m 2 --plain --extravert --latex ike1-ex-t ~/src/ikev2/pp-results/mpa/ikev1*.spdl -bsub -W 8:00 -Jd "ike1-ex-b" -N ./test-mpa.py -m 2 --plain -b --extravert --latex ike1-ex-b ~/src/ikev2/pp-results/mpa/ikev1*.spdl -bsub -W 8:00 -Jd "ike1-ex-u" -N ./test-mpa.py -m 2 --plain -u --extravert --latex ike1-ex-u ~/src/ikev2/pp-results/mpa/ikev1*.spdl -bsub -W 8:00 -Jd "ike1-iu-t" -N ./test-mpa.py -m 2 --plain --init-unique --latex ike1-iu-t ~/src/ikev2/pp-results/mpa/ikev1*.spdl -bsub -W 8:00 -Jd "ike1-iu-b" -N ./test-mpa.py -m 2 --plain -b --init-unique --latex ike1-iu-b ~/src/ikev2/pp-results/mpa/ikev1*.spdl -bsub -W 8:00 -Jd "ike1-iu-u" -N ./test-mpa.py -m 2 --plain -u --init-unique --latex ike1-iu-u ~/src/ikev2/pp-results/mpa/ikev1*.spdl - diff --git a/Vagrant Files/shared/scyther/combos-ikev2.sh b/Vagrant Files/shared/scyther/combos-ikev2.sh deleted file mode 100644 index 1da0bb1..0000000 --- a/Vagrant Files/shared/scyther/combos-ikev2.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -bsub -W 8:00 -Jd "ike2-aa-t" -N ./test-mpa.py -m 2 --plain --latex ike2-aa-t ~/src/ikev2/pp-results/mpa/ikev2*.spdl -bsub -W 8:00 -Jd "ike2-aa-b" -N ./test-mpa.py -m 2 --plain -b --latex ike2-aa-b ~/src/ikev2/pp-results/mpa/ikev2*.spdl -bsub -W 8:00 -Jd "ike2-aa-u" -N ./test-mpa.py -m 2 --plain -u --latex ike2-aa-u ~/src/ikev2/pp-results/mpa/ikev2*.spdl -bsub -W 8:00 -Jd "ike2-ex-t" -N ./test-mpa.py -m 2 --plain --extravert --latex ike2-ex-t ~/src/ikev2/pp-results/mpa/ikev2*.spdl -bsub -W 8:00 -Jd "ike2-ex-b" -N ./test-mpa.py -m 2 --plain -b --extravert --latex ike2-ex-b ~/src/ikev2/pp-results/mpa/ikev2*.spdl -bsub -W 8:00 -Jd "ike2-ex-u" -N ./test-mpa.py -m 2 --plain -u --extravert --latex ike2-ex-u ~/src/ikev2/pp-results/mpa/ikev2*.spdl -bsub -W 8:00 -Jd "ike2-iu-t" -N ./test-mpa.py -m 2 --plain --init-unique --latex ike2-iu-t ~/src/ikev2/pp-results/mpa/ikev2*.spdl -bsub -W 8:00 -Jd "ike2-iu-b" -N ./test-mpa.py -m 2 --plain -b --init-unique --latex ike2-iu-b ~/src/ikev2/pp-results/mpa/ikev2*.spdl -bsub -W 8:00 -Jd "ike2-iu-u" -N ./test-mpa.py -m 2 --plain -u --init-unique --latex ike2-iu-u ~/src/ikev2/pp-results/mpa/ikev2*.spdl - - diff --git a/Vagrant Files/shared/scyther/combos-iso.sh b/Vagrant Files/shared/scyther/combos-iso.sh deleted file mode 100644 index b9fb250..0000000 --- a/Vagrant Files/shared/scyther/combos-iso.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -bsub -W 8:00 -Jd "iso-aa-t" -N ./test-mpa.py -m 2 --plain --latex iso-aa-t ~/papers/iso9798/scyther-models/*.spdl -bsub -W 8:00 -Jd "iso-aa-b" -N ./test-mpa.py -m 2 --plain -b --latex iso-aa-b ~/papers/iso9798/scyther-models/*.spdl -bsub -W 8:00 -Jd "iso-aa-u" -N ./test-mpa.py -m 2 --plain -u --latex iso-aa-u ~/papers/iso9798/scyther-models/*.spdl -bsub -W 8:00 -Jd "iso-ex-t" -N ./test-mpa.py -m 2 --plain --extravert --latex iso-ex-t ~/papers/iso9798/scyther-models/*.spdl -bsub -W 8:00 -Jd "iso-ex-b" -N ./test-mpa.py -m 2 --plain -b --extravert --latex iso-ex-b ~/papers/iso9798/scyther-models/*.spdl -bsub -W 8:00 -Jd "iso-ex-u" -N ./test-mpa.py -m 2 --plain -u --extravert --latex iso-ex-u ~/papers/iso9798/scyther-models/*.spdl -bsub -W 8:00 -Jd "iso-iu-t" -N ./test-mpa.py -m 2 --plain --init-unique --latex iso-iu-t ~/papers/iso9798/scyther-models/*.spdl -bsub -W 8:00 -Jd "iso-iu-b" -N ./test-mpa.py -m 2 --plain -b --init-unique --latex iso-iu-b ~/papers/iso9798/scyther-models/*.spdl -bsub -W 8:00 -Jd "iso-iu-u" -N ./test-mpa.py -m 2 --plain -u --init-unique --latex iso-iu-u ~/papers/iso9798/scyther-models/*.spdl diff --git a/Vagrant Files/shared/scyther/generate-attack-graphs.py b/Vagrant Files/shared/scyther/generate-attack-graphs.py deleted file mode 100644 index bad12b1..0000000 --- a/Vagrant Files/shared/scyther/generate-attack-graphs.py +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bin/env python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -""" -Generate attacks for each claim - -To also generate resource usage details on linux, use something like: - - xargs -a protocols.txt -n 1 -I {} /usr/bin/time -v -o {}.times ./generate-attack-graphs.py {} - -where 'protocols.txt' contains a protocol file per line. -""" - -#--------------------------------------------------------------------------- - -""" Import externals """ -import sys - -#--------------------------------------------------------------------------- - -""" Import scyther components """ -import Scyther.Scyther as Scyther - -#--------------------------------------------------------------------------- - -def create_file_prefix(fn,cid): - """ - Create a filename prefix for fn,cid without extension - """ - - tcid = cid - i = tcid.rfind(",") - if i > 0: - if fn.find(tcid[:i]) >= 0: - tcid = tcid[i+1:] - - tfn = fn.replace(".spdl","") - i = tfn.rfind("/") - if i >= 0: - tfn = tfn[i+1:] - - pref = "%s-%s" % (tfn,tcid) - pref = pref.replace(",","_") - - return pref - - -def render_dot(fn,gtype): - """ - Render .dot file called fn into gtype file - """ - from subprocess import call - - if len(gtype) > 5: - # Something is fishy, abort - return - - base_name = fn - i = base_name.rfind(".") - if i > 0: - base_name = base_name[:i] - - cmd = ["dot","-T" + gtype,"-o%s.%s" % (base_name,gtype),fn] - #print cmd - - call(cmd) - - -def render_best_attack(fn,cid): - """ - Extract the best attack for this claim and file name - """ - x = Scyther.Scyther() - x.setFile(fn) - - x.options = "-r4 -T60" - x.verifyOne(cid) - - pref = create_file_prefix(fn,cid) - - for cl in x.claims: - cln = cl.claimtype - if cln == "Commit": - cln = "Data_agree" - - if len(cl.attacks) > 0: - dotfile = "attack-%s-%s.dot" % (pref,cln) - fp = open(dotfile,'w') - fp.write(cl.attacks[-1].scytherDot) - fp.close() - - render_dot(dotfile,"png") - render_dot(dotfile,"pdf") - - print "%s; %s" % (fn,cl) - -def main(): - - filelist = sys.argv[1:] - # Compute dict of filenames to claim id's - cl = Scyther.GetClaims(filelist) - - for fn in set(cl): - for cid in cl[fn]: - - render_best_attack(fn,cid) - - - -if __name__ == '__main__': - main() - -#--------------------------------------------------------------------------- -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/json-scyther.py b/Vagrant Files/shared/scyther/json-scyther.py deleted file mode 100644 index b8e23bd..0000000 --- a/Vagrant Files/shared/scyther/json-scyther.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -""" - -Author: Cas Cremers - -""" - -import sys -import json -from Scyther import Scyther - - -def scyther_json(jsondata): - """ - Decode json data into (protocollist,options,filter) and run scyther - """ - s = Scyther.Scyther() - - (protocollist,options,filter) = json.loads(jsondata) - - s.options = str(options) - for protocol in sorted(protocollist): - s.addFile(protocol) - s.verifyOne(str(filter)) - -def fileandline(fn,linenos): - fp = open(fn,"r") - ln = 1 - done = 0 - sz = len(linenos) - for l in fp.xreadlines(): - if str(ln) in linenos: - print l - scyther_json(l) - done = done + 1 - if done >= sz: - fp.close() - return - ln = ln + 1 - fp.close() - return - -if __name__ == '__main__': - fileandline(sys.argv[1],set(sys.argv[2:])) - - diff --git a/Vagrant Files/shared/scyther/make-bsub.py b/Vagrant Files/shared/scyther/make-bsub.py deleted file mode 100644 index 0897da1..0000000 --- a/Vagrant Files/shared/scyther/make-bsub.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python -# -import sys -import json -import math - -""" -Given a file of Scyther verification tests to do (json file), create a shell file to run them all using bsub. - -Arguments: - - [1] Filename of json stuff - [2] Step count: how many verification tasks go into one job - [3] Additional commands to send to bsub (e.g. "-W 1:00") - -""" - -def countlines(fn): - count = 0 - fh = open(fn,'r') - for l in fh.xreadlines(): - count = count + 1 - fh.close() - return count - -def marker(jobcount,todo): - left = todo - jobcount - dperc = int((100 * jobcount) / todo) - print "echo \"Sent %i out of %i jobs, hence %i left. %i%% done.\"" % (jobcount,todo,left,dperc) - -def main(fn,step,optlist): - - todo = math.ceil(countlines(fn) / int(step)) - - fh = open(fn,'r') - ln = 1 - buf = 0 - s = "" - jobcount = 0 - done = 0 - - for l in fh.xreadlines(): - if buf == 0: - s = "bsub %s ./json-scyther.py %s" % (" ".join(optlist),fn) - s += " %i" % (ln) - buf = buf + 1 - done = done + 1 - if buf >= int(step): - print (s) - s = "" - buf = 0 - jobcount = jobcount + 1 - if jobcount % 10 == 0: - """ - After ten jobs, display progress info - """ - marker(jobcount,todo) - - ln = ln + 1 - print (s) - marker(jobcount,todo) - fh.close() - - -if __name__ == '__main__': - """ Usage: filename, step, options to send to bsub - """ - main(sys.argv[1],sys.argv[2],sys.argv[3:]) - diff --git a/Vagrant Files/shared/scyther/mpa.spdl b/Vagrant Files/shared/scyther/mpa.spdl deleted file mode 100644 index 4913029..0000000 --- a/Vagrant Files/shared/scyther/mpa.spdl +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Needham-Schroeder-Lowe protocol - */ - -// The protocol description - -protocol nsl3(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {ni,I}pk(R) ); - recv_2(R,I, {ni,nr,R}pk(I) ); - send_3(I,R, {nr}pk(R) ); - - claim_i1(I,Secret,ni); - claim_i2(I,Secret,nr); - claim_i3(I,Niagree); - claim_i4(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {ni,I}pk(R) ); - send_2(R,I, {ni,nr,R}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim_r1(R,Secret,ni); - claim_r2(R,Secret,nr); - claim_r3(R,Niagree); - claim_r4(R,Nisynch); - } -} - -/* - * Needham-Schroeder-Lowe protocol, - * broken version (wrong role name in first message) - */ - -// The protocol description - -protocol nsl3-broken(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {ni,R}pk(R) ); - recv_2(R,I, {ni,nr,R}pk(I) ); - send_3(I,R, {nr}pk(R) ); - - claim_i1(I,Secret,ni); - claim_i2(I,Secret,nr); - claim_i3(I,Niagree); - claim_i4(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {ni,R}pk(R) ); - send_2(R,I, {ni,nr,R}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim_r1(R,Secret,ni); - claim_r2(R,Secret,nr); - claim_r3(R,Niagree); - claim_r4(R,Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/notes-brutus-mpa.txt b/Vagrant Files/shared/scyther/notes-brutus-mpa.txt deleted file mode 100644 index b89e393..0000000 --- a/Vagrant Files/shared/scyther/notes-brutus-mpa.txt +++ /dev/null @@ -1,181 +0,0 @@ -run test-MPA with --pickle to some file FILE. - -Choose a STEP integer: how many verifications are batched into a single job. - -Then: - -./make-bsub.py FILE STEP -W 1:00 [OTHER BSUB OPTIONS] > tests.sh - -Then - -bash tests.sh - - -When all is done, rerun the original thing without pickle. - - - -This invokes then: -json-scyther.py -in different batches - - - - - -Test run for real - - -Fri Dec 31 16:33:20 CET 2010 - -Login & screen on brutus3 node. - -bsub -W 2:00 ./test-mpa.py --pickle mpa-tests.json -A Protocols/MultiProtocolAttacks/*.spdl - -Fri Dec 31 18:48:29 CET 2010 - -Given the 6 minutes timeout, decided to batch into the 1h queues. Thus 9 -verifications can safely go in a batch. - -./make-bsub.py mpa-tests.json 9 -W 1:00 >mpa-tests.sh - -bash mpa-tests.sh - - -Hmm. For the 1h queue on Brutus, there is a 10.000 pending jobs limit. Thus my -40.000+ jobs get stuck here. - -So I could have done the division such that the jobs can be pended at onces -but it would have meant putting the jobs in the 8h or more queues. - -For the batching thing, it would be nice to print a counter every 10 bsubs so -if it gets stuck, you can see where it is (or better: how much is left). - -The lsf.o* output files clog up the directory. Find a way to disable them! - -Woops, we get mail once in a while. Not good. Unclear under which conditions -this occurs, it seems to be errors only. (Probably stale file pointers from -the old watch & rm solution.) - -Sun Jan 2 10:54:23 CET 2011 - -All jobs have been submitted, now only 3000 pending. - -There may be a limit for me of about 128 active jobs at the same time. - -Sun Jan 2 11:30:30 CET 2011 - -2200 pending. - -Sun Jan 2 12:38:48 CET 2011 - -1155 pending. -(bjobs -p | grep PEND | wc -l) - -Sun Jan 2 13:59:04 CET 2011 - -0 jobs pending, 32 jobs active. - -Sun Jan 2 14:18:11 CET 2011 - -Done. Recomp started (without --pickle FILE above) -Takes too long on login node. Killed at 14:40. - -Instead, rerunning with: - -bsub -I -N ./test-mpa.py -A Protocols/MultiProtocolAttacks/*.spdl - --I for interactive, -N for mail at end. - -Sun Jan 2 14:45:04 CET 2011 - -Above job is running. It also seems faster. - -Sun Jan 2 20:07:58 CET 2011 - -Sigh. It got killed after one hour because no time limit was set. -Rerunning with -W 6:00 - - - - - - -Sun Jan 2 14:30:19 CET 2011 - -In parallel, starting new huge job; biggest possible using current script options. - -bsub -W 7:00 ./test-mpa.py --pickle test-full-mpa.json --self-communication -A Protocols/MultiProtocolAttacks/*.spdl - -Actually, these big jobs should be started with finishing e-mail notification -or the switch that makes the bsub command only return after the jobs has -finished, otherwise we end up watching bjobs all the time, which is boring. - -Sun Jan 2 14:40:08 CET 2011 - -The above test generation is now running. - -Sun Jan 2 20:09:42 CET 2011 - -The test generation seems to have finished at 15:31. - -./make-bsub.py test-full-mpa.json 10 -W 1:00 >test-full-mpa.sh - -This finished at 20:11. -So now running - -nice bash test-full-mpa.sh - -G - - - -Sun Jan 2 15:07:13 CET 2011 - -A third parallel test: - -batcher.sh OPTIONS_AND_FILES_FOR_TEST_MPA_SCRIPT - -Running with -L5. This should automate all of the previous stuff. - - - - -Wed Jan 5 15:37:11 CET 2011 - -Running for cryptrec (with new Scyther version and new batches of 5 things) -./batcher.sh ~/papers/iso/*.spdl - - - -Tue Jan 18 17:10:49 CET 2011 - -./batcher.sh -m 1 --all-types --self-communication ~/papers/iso/*.spdl -The batcher has jobid 930582 - -(error, reverting to os.makedirs(path)) - -Tue Jan 18 23:45:15 CET 2011 - -./test-iso-combo.sh - -Tue Jan 18 23:49:15 CET 2011 - -./batcher.sh -m 2 --all-types --self-communication ~/papers/iso/*.spdl - -Solved: do "watch -n 10 ./WIPER.sh 11" -(wiper.sh finds lsf files accessed longer ago than 11 minutes and wipes them) - -./test-mpa-alltypes.sh - - - -Mon Jan 24 14:55:23 CET 2011 - -./batcher.sh -m 2 --all-types Protocols/MultiProtocolAttacks/*.spdl - - - -Sat Jan 29 13:35:22 CET 2011 - -./batcher.sh -m 2 -A --self-communication Protocols/MultiProtocolAttacks/*.spdl diff --git a/Vagrant Files/shared/scyther/ns3.spdl b/Vagrant Files/shared/scyther/ns3.spdl deleted file mode 100644 index edde4ab..0000000 --- a/Vagrant Files/shared/scyther/ns3.spdl +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Needham-Schroeder protocol - */ - -// The protocol description - -protocol ns3(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {ni,I}pk(R) ); - recv_2(R,I, {ni,nr}pk(I) ); - claim(I,Running,R,ni,nr); - send_3(I,R, {nr}pk(R) ); - - claim(I,Secret,ni); - claim(I,Secret,nr); - claim(I,Alive); - claim(I,Weakagree); - claim(I,Commit,R,ni,nr); - claim(I,Niagree); - claim(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {ni,I}pk(R) ); - claim(R,Running,I,ni,nr); - send_2(R,I, {ni,nr}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim(R,Secret,ni); - claim(R,Secret,nr); - claim(R,Alive); - claim(R,Weakagree); - claim(R,Commit,I,ni,nr); - claim(R,Niagree); - claim(R,Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/nsl3-broken.spdl b/Vagrant Files/shared/scyther/nsl3-broken.spdl deleted file mode 100644 index 3681cd9..0000000 --- a/Vagrant Files/shared/scyther/nsl3-broken.spdl +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Needham-Schroeder-Lowe protocol, - * broken version (wrong role name in first message) - */ - -// The protocol description - -protocol nsl3-broken(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {ni,R}pk(R) ); - recv_2(R,I, {ni,nr,R}pk(I) ); - send_3(I,R, {nr}pk(R) ); - - claim_i1(I,Secret,ni); - claim_i2(I,Secret,nr); - claim_i3(I,Niagree); - claim_i4(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {ni,R}pk(R) ); - send_2(R,I, {ni,nr,R}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim_r1(R,Secret,ni); - claim_r2(R,Secret,nr); - claim_r3(R,Niagree); - claim_r4(R,Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/nsl3.spdl b/Vagrant Files/shared/scyther/nsl3.spdl deleted file mode 100644 index c393e73..0000000 --- a/Vagrant Files/shared/scyther/nsl3.spdl +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Needham-Schroeder-Lowe protocol - */ - -// The protocol description - -protocol nsl3(I,R) -{ - role I - { - fresh ni: Nonce; - var nr: Nonce; - - send_1(I,R, {ni,I}pk(R) ); - recv_2(R,I, {ni,nr,R}pk(I) ); - claim(I,Running,R,ni,nr); - send_3(I,R, {nr}pk(R) ); - - claim(I,Secret,ni); - claim(I,Secret,nr); - claim(I,Alive); - claim(I,Weakagree); - claim(I,Commit,R,ni,nr); - claim(I,Niagree); - claim(I,Nisynch); - } - - role R - { - var ni: Nonce; - fresh nr: Nonce; - - recv_1(I,R, {ni,I}pk(R) ); - claim(R,Running,I,ni,nr); - send_2(R,I, {ni,nr,R}pk(I) ); - recv_3(I,R, {nr}pk(R) ); - - claim(R,Secret,ni); - claim(R,Secret,nr); - claim(R,Alive); - claim(R,Weakagree); - claim(R,Commit,I,ni,nr); - claim(R,Niagree); - claim(R,Nisynch); - } -} - diff --git a/Vagrant Files/shared/scyther/precompute-ike.sh b/Vagrant Files/shared/scyther/precompute-ike.sh deleted file mode 100644 index 7b7652f..0000000 --- a/Vagrant Files/shared/scyther/precompute-ike.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -./batcher.sh -m 2 --all-types --self-communication ~/src/ikev2/pp-results/mpa/ikev1*.spdl -./batcher.sh -m 2 --all-types --self-communication ~/src/ikev2/pp-results/mpa/ikev2*.spdl - diff --git a/Vagrant Files/shared/scyther/progressbarDummy.py b/Vagrant Files/shared/scyther/progressbarDummy.py deleted file mode 100644 index 9ddd7e9..0000000 --- a/Vagrant Files/shared/scyther/progressbarDummy.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -""" - -Dummy. - -Author: Cas Cremers - -""" - -class ProgressBar(object): - - def __init__(self,widgets=[],maxval=100): - self.widgets = widgets - self.maxval = maxval - - def start(self): - if self.widgets: - if len(self.widgets) > 0: - print self.widgets[0], - - def update(self,count): - pass - - def finish(self): - print " Done." - - -def SimpleProgress(): - return - -def ETA(): - return - -def Percentage(): - return - -def Bar(marker,left,right): - return - -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/scyther-gui.py b/Vagrant Files/shared/scyther/scyther-gui.py deleted file mode 100644 index d20be43..0000000 --- a/Vagrant Files/shared/scyther/scyther-gui.py +++ /dev/null @@ -1,245 +0,0 @@ -#!/usr/bin/env python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -#--------------------------------------------------------------------------- -# Try to get wxPython -try: - import wx -except ImportError,err: - from Scyther import Misc - - errmsg = "Problem with importing the required [wxPython] package." - - if 'No module' in str(err): - errmsg = """Could not find the required [wxPython] package. -Please install this package in order to use the graphical user -interface of Scyther. -The [wxPython] packages can be found at http://www.wxpython.org/ - -Ubuntu users: the wxPython packages are called 'python-wxgtk' followed by the -version number.""" - elif ('32-bit mode' in str(err)) or ('no matching architecture' in str(err)): - import os - - key = "VERSIONER_PYTHON_PREFER_32_BIT" - data = "yes" - - keyfound = False - try: - if sys.environment[key] == data: - keyfound = True - except: - pass - - if keyfound: - """ - We already tried to set the environment variable, but it is still not working. - """ - import sys - #print "Key found. good job. no success." - - errmsg = """Problem with importing the required [wxPython] package. - - Possibly the problem is caused by wxPython only working in 32-bit mode currently. - You can try the following on the command line: - - $ export VERSIONER_PYTHON_PREFER_32_BIT=yes - $ ./scyther-gui.py""" - - else: - """ - Key not found. Try if that works. - """ - import sys - from subprocess import call - - #print "Key not found. Trying to set it now." - # TODO: check for MAC's if we need something like 'pythonw' - call(sys.argv, shell=True, env={key: data}) - sys.exit(0) - - - Misc.panic(""" -ERROR: - -%s - -Note that you can still use the Scyther binaries in the 'Scyther' directory. - -The exact error was: --------------------------------------------------------------------------------- -%s --------------------------------------------------------------------------------- - """ % (errmsg,err)) - - - -#--------------------------------------------------------------------------- -""" import externals """ -import sys -import os -from optparse import OptionParser, SUPPRESS_HELP -from subprocess import * - -#--------------------------------------------------------------------------- - -""" Import scyther-gui components """ -from Scyther import Scyther,Misc -from Gui import About,Preference,Mainwindow - -#--------------------------------------------------------------------------- - -def parseArgs(): - usage = "usage: %s [options] [inputfile]" % sys.argv[0] - description = "scyther-gui is a graphical user interface for the scyther protocol verification tool." - parser = OptionParser(usage=usage,description=description) - - # command - parser.add_option("-V","--verify",dest="command",default=None,action="store_const",const="verify", - help="Immediately verify the claims of the protocol (requires input file)") - parser.add_option("-s","--state-space",dest="command",default=None,action="store_const",const="statespace", - help="Immediately generate the complete characterization of the protocol (requires input file)") - parser.add_option("-a","--auto-claims",dest="command",default=None,action="store_const",const="autoverify", - help="Immediately verified protocol using default claims (requires input file)") - #parser.add_option("-c","--check",dest="command",default=None,action="store_const",const="check", - # help="Immediately check protocol (requires input file)") - - # License - parser.add_option("-l","--license",dest="license",default=False,action="store_const",const=True, - help="Show license") - - # no-splash - parser.add_option("-N","--no-splash",dest="splashscreen",default=True,action="store_const",const=False, - help="Do not show the splash screen") - - # misc debug etc (not shown in the --help output) - parser.add_option("","--test",dest="test",default=False,action="store_true", - help=SUPPRESS_HELP) - - return parser.parse_args() - -#--------------------------------------------------------------------------- - -class MySplashScreen(wx.SplashScreen): - def __init__(self,basedir): - path = os.path.join(basedir,"Images") - image = os.path.join(path,"scyther-splash.png") - bmp = wx.Image(image).ConvertToBitmap() - wx.SplashScreen.__init__(self, bmp, - wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT, - 5000, None, -1) - self.Bind(wx.EVT_CLOSE, self.OnClose) - self.fc = wx.FutureCall(2000, self.ShowMain) - - def OnClose(self, evt): - # Make sure the default handler runs too so this window gets - # destroyed - evt.Skip() - self.Hide() - - # if the timer is still running then go ahead and show the - # main frame now - if self.fc.IsRunning(): - self.fc.Stop() - self.ShowMain() - - - def ShowMain(self): - if self.fc.IsRunning(): - self.Raise() - - -#--------------------------------------------------------------------------- - -def isSplashNeeded(opts): - if not opts.command: - if opts.splashscreen and not (Preference.get('splashscreen') in ['false','off','disable','0']): - return True - return False - -#--------------------------------------------------------------------------- - -class ScytherApp(wx.App): - def OnInit(self): - import os, inspect - - wx.GetApp().SetAppName("Scyther-gui") - - # Determine base directory (taking symbolic links into account) - cmd_file = os.path.realpath(os.path.abspath(inspect.getfile( inspect.currentframe() ))) - basedir = os.path.split(cmd_file)[0] - - # Parse arguments - (opts,args) = parseArgs() - - # License option may abort here - if opts.license: - print Scyther.GetLicense() - sys.exit(0) - - # Load preferences file - Preference.init() - - #""" - #Create and show the splash screen. It will then create and show - #the main frame when it is time to do so. - # - #The splash screen is disabled for automatic commands, and also - #by a setting in the preferences file. - #""" - #if isSplashNeeded(opts): - # splash = MySplashScreen(basedir) - # splash.Show() - - self.mainWindow = Mainwindow.MainWindow(opts,args) - self.SetTopWindow(self.mainWindow) - self.mainWindow.Show() - - if isSplashNeeded(opts): - dlg = About.AboutScyther(self.mainWindow,basedir) - dlg.ShowModal() - dlg.Destroy() - - return True - - def OnExit(self): - """ Tear down """ - - -#--------------------------------------------------------------------------- - -def CheckRequirements(): - """ Check for any required programs """ - - """ We need 'dot', in the graphviz package """ - from Scyther import FindDot - - FindDot.findDot() # If Graphviz is not found, this function will call panic to complain. - -#--------------------------------------------------------------------------- - - -if __name__ == '__main__': - CheckRequirements() - scythergui = ScytherApp() - scythergui.MainLoop() - -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/scyther-gui.rc b/Vagrant Files/shared/scyther/scyther-gui.rc deleted file mode 100644 index cd3a913..0000000 --- a/Vagrant Files/shared/scyther/scyther-gui.rc +++ /dev/null @@ -1,4 +0,0 @@ -wxicon icon Images/scyther-gui-64.ico -wxicon icon Images/scyther-gui-32.ico -wxicon icon Images/scyther-gui-16.ico -#include "wx/msw/wx.rc" diff --git a/Vagrant Files/shared/scyther/scyther.py b/Vagrant Files/shared/scyther/scyther.py deleted file mode 100644 index ef99d75..0000000 --- a/Vagrant Files/shared/scyther/scyther.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - -# -# python wrapper for the Scyther command-line tool -# - -#--------------------------------------------------------------------------- - -""" Import externals """ -import sys - -#--------------------------------------------------------------------------- - -""" Import scyther components """ -import Scyther.Scyther as Scyther - -#--------------------------------------------------------------------------- - -def usage(): - x = Scyther.Scyther() - x.xml = False - x.options = "--help" - x.verify() - return x - -def simpleRun(args): - x = Scyther.Scyther() - x.options = args - x.verify() - return x - -if __name__ == '__main__': - pars = sys.argv[1:] - if len(pars) == 0: - print usage() - else: - print simpleRun(" ".join(pars)) - - diff --git a/Vagrant Files/shared/scyther/test-delta.py b/Vagrant Files/shared/scyther/test-delta.py deleted file mode 100644 index 863d13b..0000000 --- a/Vagrant Files/shared/scyther/test-delta.py +++ /dev/null @@ -1,181 +0,0 @@ -#!/usr/bin/env python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -""" - -Example script to show how to perform large-scale tests using the -Scyther Python API (contained in the Scyther subdirectory) - -In this example, we find the differences between two different switch -settings for a large set of protocols. - -The notification triggers if claim lists differ, or when a claim is okay -in one test but not in the other. Hence, we ignore differences between -complete/bounded verification. - -Author: Cas Cremers - - -Define the strings below. - -TEST0 is used for both, TEST1/2 define the difference between -the tests. -""" -#--------------------------------------------------------------------------- - -TEST0 = "" -TEST1 = "--max-runs=1" -TEST2 = "--max-runs=4" - -#--------------------------------------------------------------------------- - -""" Import externals """ -import commands - -#--------------------------------------------------------------------------- - -""" Import scyther components """ -from Scyther import Scyther - -#--------------------------------------------------------------------------- - -def filterProtocol(protocol): - """ - We may want to filter out some protocols. - This function allows that. Return True if it is okay (and should be - included) or False otherwise. - """ - include = True - return include - -def simpleRun(args): - x = Scyther.Scyther() - x.options = args - x.verify() - return x - -def ScytherRes(protocol,args=""): - """ - Run Scyther on a protocol and return a tuple with the - resulting object and claim list. - """ - global TEST0 - - args = "%s %s %s" % (TEST0, args, protocol) - s = simpleRun(args) - return (s,s.claims) - - -def findSameClaim(cl,claim): - """ - Find in claim list the claim that corresponds to claim - """ - for claim2 in cl: - if claim2.id == claim.id: - return claim2 - return None - - -def ScytherDiff(protocol): - """ - Check whether the two different switch settings yield a different - result. - """ - global TEST1, TEST2 - - (s1,cl1) = ScytherRes(protocol,TEST1) - (s2,cl2) = ScytherRes(protocol,TEST2) - - res = "" - if len(cl1) != len(cl2): - res += "Different claim lists:\n%s\n%s\n" % (cl1,cl2) - else: - for claim1 in cl1: - claim2 = findSameClaim(cl2,claim1) - if claim2 == None: - res += "%s not in second test.\n" % (claim1) - else: - if claim1.okay != claim2.okay: - res += "Different results:\n%s\n%s\n" % (claim1,claim2) - - if res == "": - return None - else: - return res - - -def findProtocols(): - """ - Find a list of protocol names - """ - - cmd = "find -iname '*.spdl'" - plist = commands.getoutput(cmd).splitlines() - nlist = [] - for prot in plist: - if filterProtocol(prot): - nlist.append(prot) - return nlist - - -def main(): - """ - Simple test case with a few protocols - """ - global TEST0,TEST1,TEST2 - - list = findProtocols() - print "Performing delta analysis" - print - print "String 0 (used for both): '%s'" % TEST0 - print "String 1: '%s'" % TEST1 - print "String 2: '%s'" % TEST2 - print - print "After filtering, we are left with the following protocols:", list - print - maxcount = len(list) - count = 1 - delta = 0 - for prot in list: - perc = (100 * count) / maxcount - print "[%i%%] %s: " % (perc,prot), - res = ScytherDiff(prot) - if res != None: - print - print "-" * 72 - print prot - print "-" * 72 - print res - delta = delta + 1 - else: - print "No interesting delta found." - count = count + 1 - - print - print "Analysis complete." - print "%i out of %i protocols differed [%i%%]." % (delta,maxcount,(100 * delta)/maxcount) - - -if __name__ == '__main__': - main() - - -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/test-mpa.py b/Vagrant Files/shared/scyther/test-mpa.py deleted file mode 100644 index bf5a344..0000000 --- a/Vagrant Files/shared/scyther/test-mpa.py +++ /dev/null @@ -1,896 +0,0 @@ -#!/usr/bin/env python -""" - Scyther : An automatic verifier for security protocols. - Copyright (C) 2007-2013 Cas Cremers - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" - - -""" - -Example script to show how to perform large-scale tests using the -Scyther Python API (contained in the Scyther subdirectory) - -In this example, multi-protocol attack analysis is performed on a small -test set. - -Author: Cas Cremers - -""" - -from Scyther import Scyther - -from optparse import OptionParser, OptionGroup, SUPPRESS_HELP -import time -import os.path -import json - -try: - from progressbar import * - PROGRESSBAR = True -except ImportError: - from progressbarDummy import * - PROGRESSBAR = False - print """ -Missing the progressbar library. - -It can be downloaded from: - -http://code.google.com/p/python-progressbar/ - -""" - -FOUND = [] -ALLMPA = [] -ALLCLAIMS = [] -INVOLVED = [] -PROTFILETONAME = {} -PROTNAMETOFILE = {} -OPTS = None -ARGS = None -PICKLEDATA = set() - - -#--------------------------------------------------------------------------- - -def parseArgs(): - usage = "usage: %prog [options] [inputfile]" - description = "test-mpa.py is a test script to help with multi-protocol analysis." - parser = OptionParser(usage=usage,description=description, version="%prog 2.0") - - group = OptionGroup(parser, "Bounding the search space") - group.add_option("-m","--max-protocols",type="int",dest="maxprotocols",default=3, - help="Define maximum number of protocols in a multi-protocol attack [3].") - - group.add_option("-r","--max-runs",type="int",dest="maxruns",default=4, - help="Define maximum number of runs in the analysis [4].") - - group.add_option("-T","--timeout",type="int",dest="timeout",default=600, - help="Timeout in seconds for each analysis [600].") - - group.add_option("-L","--limit",type="int",dest="limit",default=0, - help="Limit the length of the list of protocols [None].") - parser.add_option_group(group) - - group = OptionGroup(parser, "Matching type options") - group.add_option("-t","--typed",dest="defoptarray",default=[],action="append_const",const="--match=0", - help="Verify protocols with respect to a typed model (-m 0) [default]") - group.add_option("-b","--basic-types",dest="defoptarray",default=[],action="append_const",const="--match=1", - help="Verify protocols with respect to basic type flaws only (-m 1)") - group.add_option("-u","--untyped",dest="defoptarray",default=[],action="append_const",const="--match=2", - help="Verify protocols with respect to an untyped model (-m 2)") - group.add_option("-A","--all-types",dest="alltypes",default=False,action="store_true", - help="Verify protocols with respect to all matching types") - parser.add_option_group(group) - - group = OptionGroup(parser, "Restricting self-communication") - group.add_option("-U","--init-unique",dest="defoptarray",default=[],action="append_const",const="--init-unique", - help="Use Scythers --init-unique switch to filter out initiators talking to themselves.") - group.add_option("-E","--extravert",dest="defoptarray",default=[],action="append_const",const="--extravert", - help="Use Scythers --extravert switch to filter out agents talking to themselves.") - group.add_option("","--self-communication",dest="selfcommunication",default=False,action="store_true", - help="Explore all self-communication restrictions (as MPA-only option).") - parser.add_option_group(group) - - # Misc - parser.add_option("","--pickle",dest="pickle", - help="Do not invoke Scyther but write intended calls to a file with the given name.") # action="store" and type="string" are defaults - parser.add_option("-l","--latex",dest="latex", - help="Output latex files with the given prefix.") # action="store" and type="string" are defaults - parser.add_option("-v","--verbose",dest="verbose",default=False,action="store_true", - help="Be more verbose.") - parser.add_option("-D","--debug",dest="debug",default=False,action="store_true", - help="Enable debugging features.") - parser.add_option("-p","--plain",dest="plain",default=False,action="store_true", - help="Ensure plain output, e.g., no progress bars.") - - return parser.parse_args() - -#--------------------------------------------------------------------------- - -class Attack(object): - - def __init__(self,claim,mpalist): - - self.claim = claim - self.mpalist = mpalist - - def protocol(self): - return self.claim.protocol - - def mpashort(self): - - s = [] - for fn in self.mpalist: - ptn = os.path.normpath(fn) - (head,tail) = os.path.split(ptn) - s.append(tail) - - return s - - def claimid(self): - return "%s" % (self.claim.id) - - def __str__(self): - s = "(%s,%s)" % (self.claim.id, self.mpashort()) - return s - - def fullstr(self): - s = "%s,%s" % (self.claim.id, self.mpalist) - return s - - def __cmp__(self,other): - s1 = self.fullstr() - s2 = other.fullstr() - if (s1 == s2): - return 0 - else: - if s1 < s2: - return -1 - else: - return 1 - - -#--------------------------------------------------------------------------- - - -def uniq(l): - - ll = [] - for x in l: - if x not in ll: - ll.append(x) - return ll - - -def powerset(s): - """ - s is a set - returns the powerset - """ - pws = set([frozenset()]) - for el in s: - # Double old powerset by adding its elements and also new ones - for s2 in pws.copy(): - if len(s2) == 0: - pws.add(frozenset([el])) - else: - pws.add(frozenset([el]).union(s2)) - return pws - - -#--------------------------------------------------------------------------- - -def MyScyther(protocollist,filt=None,options=[],checkpickle=True): - """ - Evaluate the composition of the protocols in protocollist. - If there is a filter, i.e. "ns3,I1" then only this specific claim - will be evaluated. - - By default, when Pickling, no evaluation is done (checkpickle=True). - Setting 'checkpickle' to False ignores this check and verifies anyway. - """ - global OPTS - global PICKLEDATA - - s = Scyther.Scyther() - - # Standard - opts = OPTS.defoptarray + options - - # Cover for caching issue where no --match= option is given (default to 0) - matchfound = False - for opt in opts: - if opt.startswith("--match="): - matchfound = True - break - if not matchfound: - opts.append("--match=0") - - # Adding other command-line parameters (i.e. with arguments) - opts.append("-T %i" % (int(OPTS.timeout))) - opts.append("--max-runs=%i" % (int(OPTS.maxruns))) - - # arguments to call - s.options = (" ".join(sorted(uniq(opts)))).strip() - if OPTS.debug: - print s.options - - for protocol in sorted(protocollist): - s.addFile(protocol) - if checkpickle and OPTS.pickle: - # Do not really verify! Just dump request if not already known - if s.verifyOne(filt, checkKnown=True) == False: - PICKLEDATA.add((tuple(sorted(protocollist)),s.options,filt)) - else: - # Verify results - s.verifyOne(filt) - return s - - -def getCorrectIsolatedClaims(protocolset,options=[]): - """ - Given a set of protocols, determine the correct claims when run in - isolation. - Returns a tuple, consisting of - - a list of compiling protocols - - a list of tuples (protocol,claimid) wich denote correct claims - """ - correctclaims = [] - goodprotocols = [] - - if not OPTS.plain: - widgets = ['Scanning for claims that are correct in isolation: ', SimpleProgress(), ' protocols (', Percentage(), ') ', - Bar(marker='#',left='[',right=']') - ] - pbar = ProgressBar(widgets=widgets, maxval=len(protocolset)) - pbar.start() - count = 0 - cpcount = 0 - for protocol in protocolset: - # verify protocol in isolation - s = MyScyther([protocol],options=options,checkpickle=False) - # investigate the results - goodprotocols.append(protocol) - allfalse = True - for claim in s.claims: - global ALLCLAIMS - global PROTFILETONAME - global PROTNAMETOFILE - - if claim not in ALLCLAIMS: - ALLCLAIMS.append(claim) - - if claim.okay: - correctclaims.append((protocol,claim.id)) - allfalse = False - - PROTFILETONAME[protocol] = str(claim.protocol) - PROTNAMETOFILE[str(claim.protocol)] = protocol - - count += 1 - if not allfalse: - cpcount += 1 - if not OPTS.plain: - pbar.update(count) - - if not OPTS.plain: - pbar.finish() - return (goodprotocols,correctclaims,cpcount) - - -def verifyProtList(protlist,claimid,options=[]): - """ - Check attacks on this protocol list. - Returns True if no attack ("correct") and False if an attack is found. - """ - s = MyScyther(protlist,claimid,options) - claim = s.getClaim(claimid) - if claim: - if not claim.okay: - return False - return True - - - -def verifyProtSubSet(protlist,claimid,options=[]): - """ - Check attacks on true subsets of this list. - Note subsets must include the claim id - """ - global OPTS - - ps = powerset(set(protlist)) - for s in ps: - if (len(s) > 0) and (len(s) < len(protlist)): - res = verifyProtList(list(s),claimid,options) - if res == False: - """ - If an attack is found we're actually done but for pickle we - make an exception to generate all possible variants. - """ - if not OPTS.pickle: - return False - return True - - -def verifyMPAattack(mpalist,claimid,options=[]): - """ - Check for Multi-Protocol Attacks on this protocol list. - Returns True if no attack ("correct") and False if an MPA attack is found. - - First consider subsets, so if there is an attack there, don't consider others. - """ - global OPTS - - res = verifyProtSubSet(mpalist,claimid,options) - if res or OPTS.pickle: - """ - Only really needed when no attack found but for pickle we make an - exception to generate all possible variants. - """ - return verifyProtList(mpalist,claimid,options) - return True - - -def verifyMPAlist(mpalist,claimid,options=[]): - """ - Check the existence of a multi-protocol attack in this context - - If an attack is found, we return False, otherwise True. This is - needed for the iteration later. - """ - global OPTS, ARGS - - if OPTS.debug: - print time.asctime(), mpalist, claimid, options - - if not verifyMPAattack(mpalist,claimid,options): - global FOUND - global ALLFOUND - global INVOLVED - - claim = claimidToClaim(claimid) - - # This is an MPA attack! - if OPTS.debug: - print "I've found a multi-protocol attack on claim %s in the context %s." % (claimid,str(mpalist)) - - att = Attack(claim,mpalist) - FOUND.append(att) - ALLFOUND.append(att) - - inv = [claim.protocol] - for fn in mpalist: - global PROTFILETONAME - inv.append(PROTFILETONAME[fn]) - - for pn in inv: - if pn not in INVOLVED: - INVOLVED.append(pn) - - #return False - - return True - - -def constructMPAlist(protocolset,claimid,mpalist,length,start,callback,options=[]): - """ - Append a list of parallel protocols, without duplicates, - such that the added part is lexicographically ordered (from - index 'start' in the protocol list) - For each possible list, the function callback is called. If the - callback returns true, iteration proceeds (returning true in the - end), otherwise it aborts and returns false. - """ - if len(mpalist) < length: - # list is not long enough yet - for pn in range(start,len(protocolset)): - p = protocolset[pn] - if p not in mpalist: - if not constructMPAlist(protocolset,claimid,mpalist + [p],length,pn+1,callback,options=options): - return False - return True - else: - # list is long enough: callback - return callback(mpalist,claimid,options) - - -def findMPA(protocolset,protocol,claimid,options=[]): - """ - The protocol claim is assumed to be correct. When does it break? - """ - global OPTS - - # First we examine 2-protocol attacks, and then increase the - # number of parallel protocols if we don't find any attacks on the - # claim. - maxcount = OPTS.maxprotocols - count = 2 - if len(protocolset) < maxcount: - # we cannot have more protocols in parallel than there are - # protocols. - maxcount = len(protocolset) - - # the actual incremental search loop - while count <= maxcount: - constructMPAlist(protocolset,claimid,[protocol],count,0,verifyMPAlist,options) - count += 1 - return None - - -def foundToDicts(attacklist = []): - """ - Turn a list of attacks into a more structured dict of dicts - protocolname -> claimid -> P(attack) - """ - res = {} - for att in attacklist: - pn = str(att.protocol()) - cl = att.claimid() - - if pn not in res.keys(): - res[pn] = {} - if cl not in res[pn].keys(): - res[pn][cl] = set() - res[pn][cl].add(att) - return res - - -def findAllMPA(protocolset,options=[],mpaoptions=[]): - """ - Given a set of protocols, find multi-protocol attacks - """ - - global FOUND - global OPTS, ARGS - global PROTNAMETOFILE - global ALLCLAIMS - - FOUND = [] - - # Find all correct claims in each protocol - (protocolset,correct,cpcount) = getCorrectIsolatedClaims(protocolset,options) - print "Investigating %i correct claims in %i protocols." % (len(correct), cpcount) - - mpaprots = [] - res = [] - - if len(correct) == 0: - print "Nothing to do." - return res - - if OPTS.verbose: - """ - When verbose, list correct claims in protocols - """ - pmapclaims = {} - for (protocol,claimid) in correct: - if protocol not in pmapclaims.keys(): - pmapclaims[protocol] = set() - pmapclaims[protocol].add(claimid) - print "Protocols with correct claims:" - if len(pmapclaims.keys()) == 0: - print " None." - else: - for pk in pmapclaims.keys(): - print " %s, %s" % (pk, pmapclaims[pk]) - print - left = set() - for p in protocolset: - if p not in pmapclaims.keys(): - left.add(p) - print "Protocols with no correct claims:" - if len(left) == 0: - print " None." - else: - for p in left: - print " %s" % (p) - print - - # output of all claims (only if latex required) - - if OPTS.latex: - clset = set() - for claim in ALLCLAIMS: - prot = str(claim.protocol) - file = PROTNAMETOFILE[prot] - clid = claim.id - descr = claim.roledescribe() - - tup = (file,prot,clid,descr) - clset.add(tup) - - fp = open("gen-%s-claims.txt" % (OPTS.latex),"w") - - fp.write("%% OPTS: %s\n" % OPTS) - fp.write("%% ARGS: %s\n" % ARGS) - - for (file,prot,clid,descr) in sorted(clset): - fp.write("%s; %s; %s; %s\n" % (file,prot,clid,descr)) - - fp.close() - - # Latex output of protocols with correct claims - if OPTS.latex: - pmapclaims = {} - for (protocol,claimid) in correct: - if protocol not in pmapclaims.keys(): - pmapclaims[protocol] = set() - pmapclaims[protocol].add(claimid) - - fp = open("gen-%s-correctclaims.tex" % (OPTS.latex),"w") - - fp.write("%% OPTS: %s\n" % OPTS) - fp.write("%% ARGS: %s\n" % ARGS) - - fp.write("\\begin{tabular}{ll}\n") - fp.write("Protocol & Claims \\\\\n") - for protocol in sorted(pmapclaims.keys()): - fp.write("%s & " % (PROTFILETONAME[protocol])) - claims = sorted(pmapclaims[protocol]) - latexcl = set() - for claimid in claims: - claim = claimidToClaim(claimid) - latexcl.add(claim.roledescribe()) - - fp.write("; ".join(sorted(latexcl))) - fp.write("\\\\\n") - fp.write("\\end{tabular}\n") - fp.close() - - # For all these claims... - if not OPTS.plain: - widgets = ['Scanning for MPA attacks: ', SimpleProgress(), ' claims (', Percentage(), ') ', - Bar(marker='#',left='[',right=']'), - ETA() - ] - pbar = ProgressBar(widgets=widgets, maxval=len(correct)) - pbar.start() - count = 0 - - # Concatenate options but add space iff needed - alloptions = options + mpaoptions - - for (protocol,claimid) in correct: - # Try to find multi-protocol attacks - findMPA(protocolset,protocol,claimid,options=alloptions) - count += 1 - if not OPTS.plain: - pbar.update(count) - if not OPTS.plain: - pbar.finish() - - """ - The below computation assumes protocol names are unique to files, but if - they are not, some other errors should have been reported by the Scyther - backend anyway (conflicting protocol definitions in MPA analysis). - """ - for att in FOUND: - pn = att.protocol() - if pn not in mpaprots: - mpaprots.append(pn) - res.append(att) - - """ - Latex table of attacks - - TODO : map file names to protocol names, write out claim details - - TODO : remove main protocol from list (it's: "MPA attacks when run in parallel with") - - TODO : Check whether current tests stop after finding *one* MPA attack or whether they find *all*. - - """ - if OPTS.latex and not OPTS.pickle: - fp = open("gen-%s-mpaattacks.tex" % (OPTS.latex),"w") - - fp.write("%% OPTS: %s\n" % OPTS) - fp.write("%% ARGS: %s\n" % ARGS) - - fp.write("\\begin{tabular}{lll}\n") - fp.write("Protocol & Claim & MPA attacks \\\\ \n") - - # Convert to more useful structure (maybe move one level up) - res = foundToDicts(FOUND) - - """ - Scan per protocol in mpaprots (maybe sorted?) - """ - for prot in sorted(res.keys()): - """ - List claim and then attack scenarios (to some max?) - """ - ltprot = prot - for claimid in sorted(res[prot].keys()): - - firstclaim = True - for att in sorted(res[prot][claimid]): - - if firstclaim: - - ltclaim = att.claim.roledescribe() - firstclaim = False - - attl = att.mpalist - ltattacks = [] - for attprot in attl: - if PROTFILETONAME[attprot] != att.claim.protocol: - ltattacks.append(PROTFILETONAME[attprot]) - - fp.write("%s & %s & %s \\\\ \n" % (ltprot,ltclaim,sorted(ltattacks))) - - # Erase for cleaner table - ltprot = "" - ltclaim = "" - - fp.write("\\end{tabular}\n") - fp.close() - - print "-" * 70 - print "Summary:" - print - print "We scanned %i protocols with options [%s]." % (len(protocolset),options) - print "We found %i correct claims." % (len(correct)) - print "We then scanned combinations of at most %i protocols with options [%s]." % (OPTS.maxprotocols,alloptions) - if OPTS.pickle: - print "However, just precomputing now, hence we are not drawing any conclusions." - else: - print "We found %i MPA attacks." % (len(FOUND)) - print "The attacks involve the claims of %i protocols." % (len(mpaprots)) - print "-" * 70 - print - - return res - - -def claimidToClaim(claimid): - """ - Return claim object given a claim id - """ - global ALLCLAIMS - - for claim in ALLCLAIMS: - if claim.id == claimid: - return claim - - - -def showDiff(reslist): - """ - Show difference between (opts,mpaopts,attacklist) tuples in list - """ - if len(reslist) == 0: - print "Comparison list is empty" - return - - (opt1,mpaopt1,al1) = reslist[0] - print "-" * 70 - print "Base case: attacks for \n [%s]:" % (opt1 + mpaopt1) - print - print len(al1) - for a in al1: - print "Base attack: %s" % (a) - - print "-" * 70 - print - - for i in range(0,len(reslist)-1): - (opt1,mpaopt1,al1) = reslist[i] - (opt2,mpaopt2,al2) = reslist[i+1] - - print "-" * 70 - print "Comparing the attacks for \n [%s] with\n [%s]:" % (opt1 + mpaopt1, opt2 + mpaopt2) - print - print len(al1), len(al2) - for a in al2: - if a not in al1: - print "Added attack: %s" % (a) - for a in al1: - if a not in al2: - print "Removed attack: %s" % (a) - - print "-" * 70 - print - - - - - - -def makeChoices(): - """ - Make choice grid. - Later options should (intuitively) give more attacks. - - [ MPAonly, (text,switch)* ] - """ - - global OPTS, ARGS - - choices = [] - - if OPTS.alltypes: - - choices.append([ False, \ - ("no type flaws",["--match=0"]), \ - ("basic type flaws",["--match=1"]), \ - ("all type flaws",["--match=2"]), \ - ]) - - if OPTS.selfcommunication: - - choices.append([ True, \ - ("Disallow A-A",["--extravert"]), \ - ("Allow responder A-A",["--init-unique"]), \ - ("Allow A-A",[]) \ - ]) - - return choices - - -def exploreTree( i, choices , l, options = [], mpaoptions = []): - """ - Each choice[x] is an array again: - - MPAonly, (txt,arg)* - """ - - if i >= len(choices): - return [(options,mpaoptions,findAllMPA(l, options = options, mpaoptions = mpaoptions))] - - mpaonly = choices[i][0] - cl = choices[i][1:] - - res = [] - for (txt,arg) in cl: - - print "For choice %i, selecting options %s" % (i,txt) - if mpaonly: - o1 = [] - o2 = arg - else: - o1 = arg - o2 = [] - res = res + exploreTree(i+1, choices, l, options = options + o1, mpaoptions = mpaoptions + o2) - - return res - - - -def fullScan(l, options = [], mpaoptions = []): - - global OPTS - global ALLFOUND - global ALLCLAIMS - global INVOLVED - global PROTNAMETOFILE - global PROTFILETONAME - - ALLFOUND = [] - ALLCLAIMS = [] - INVOLVED = [] - - if OPTS.limit > 0: - l = l[:OPTS.limit] - - choices = makeChoices() - if len(choices) == 0: - """ - No choices, just evaluate - """ - res = findAllMPA(l, options = options, mpaoptions = mpaoptions) - - else: - lres = exploreTree(0, choices, l, options = options, mpaoptions = mpaoptions) - if len(lres) > 1: - if not OPTS.pickle: - showDiff(lres) - - allprots = set() - attprots = set() - invprots = set() - for att in ALLFOUND: - attprots.add(str(att.protocol())) - for cl in ALLCLAIMS: - allprots.add(str(cl.protocol)) - for prot in INVOLVED: - invprots.add(str(prot)) - - if not OPTS.pickle: - print "The bottom line: we found %i protocols with multi-protocol attacks from a set of %i protocols." % (len(attprots),len(allprots)) - print - - print "Multi-protocol attacks were found on:" - for prot in sorted(list(allprots & attprots)): - print " %s" % (prot) - print - - print "No multi-protocol attacks were found on these protocols, but they caused MPA attacks:" - for prot in sorted(list((allprots - attprots) & invprots)): - print " %s" % (prot) - print - - print "These protocols were not involved in any MPA attacks:" - for prot in sorted(list((allprots - attprots) - invprots)): - print " %s\t[%s]" % (prot,PROTNAMETOFILE[prot]) - print - - - - -def bigTest(): - """ - Perform the tests as reported in the book. - """ - import os - - global OPTS, ARGS - - l = [] - nl = [] - - """ - Check for any given filenames - """ - if len(ARGS) == 0: - # No filenames given - testpath = "Protocols/MultiProtocolAttacks/" - fl = os.listdir(testpath) - for fn in fl: - if fn.endswith(".spdl"): - nl.append(fn) - - # Prepend again the path - l = [] - for fn in nl: - l.append(testpath+fn) - else: - for fn in ARGS: - l.append(fn) - nl = l - - # Report list - print "Performing multi-protocol analysis for the following protocols:", nl - - fullScan(l) - - - -def main(): - global OPTS, ARGS, PICKLEDATA - - (OPTS,ARGS) = parseArgs() - if OPTS.pickle: - PICKLEDATA = set() - - bigTest() - - #simpleTest() - - if OPTS.pickle: - pf = open(OPTS.pickle,"wa") - for el in PICKLEDATA: - json.dump(el,pf) - pf.write("\n") - pf.close() - - -if __name__ == '__main__': - main() - - -# vim: set ts=4 sw=4 et list lcs=tab\:>-: diff --git a/Vagrant Files/shared/scyther/todo.txt b/Vagrant Files/shared/scyther/todo.txt deleted file mode 100644 index 60e05af..0000000 --- a/Vagrant Files/shared/scyther/todo.txt +++ /dev/null @@ -1,29 +0,0 @@ -URGENT - -- - -TO BE DONE - -- Config file should use Python's confParse module. -- Save preferences in local file on close. - -WOULD LIKE TO HAVE - -- Font selector for graphs. -- Nice graph scaling for all platforms (now only supported under Linux - using the Python Imaging Library through postscript; currently - wxPython does not support any cross-platform vector format out of the - box, as SVG is still only a non-default build option.) -- Support for using an external editor. - - toggle for 'watch file'. - - toggle for 'auto-verify on change' or something like that. -- Ideally we somehow color the correct/incorrect tags in the editor. -- Line numbering is needed for the editor window otherwise you cannot - interpret attacks. Probably use wx.Py editor things. -- Scyther executable should be able to be set by means of preferences. - -IN AN IDEAL WORLD... - -- Use Python modules to generate the attack graphs from the XML, also - allow for eg. ASCII output. - diff --git a/Vagrant Files/shared/scyther/wiper.sh b/Vagrant Files/shared/scyther/wiper.sh deleted file mode 100644 index 11766f7..0000000 --- a/Vagrant Files/shared/scyther/wiper.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# -# Wipe Brutus artefacts. -# -# Run as 'watch -n 10 ./wiper.sh' - -find lsf.* -maxdepth 0 -amin +11 -print -delete 2>&1 - - diff --git a/Vagrant Files/shared/example.txt.txt b/Vagrant Files/shared/test folder/example.txt.txt similarity index 100% rename from Vagrant Files/shared/example.txt.txt rename to Vagrant Files/shared/test folder/example.txt.txt -- GitLab