-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTagSystem.ec
102 lines (66 loc) · 1.79 KB
/
TagSystem.ec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
require import Int Bool SmtMap Distr.
abstract theory Tags.
type pkey, skey, tag.
type Time = int.
op keys : (pkey * skey) distr.
(* tag system is functional (stateless) *)
op tag : skey -> Time -> tag.
op tagVerify : pkey -> Time -> tag -> bool.
op toTime : tag -> Time.
axiom validKeys pk sk t : (pk, sk) \in keys => tagVerify pk t (tag sk t) = true.
axiom toTimeProp pk sk t : (pk, sk) \in keys => toTime (tag sk t) = t.
(* instead of using option monad we have a default tag *)
op defpksk : pkey * skey.
axiom defvalid : defpksk \in keys.
op deftag = tag defpksk.`2 0.
module type Tag_Oracle = {
proc init() : pkey {}
proc createTag(m : Time) : tag
proc verifyTag(m : Time, s : tag) : bool
proc askedTag() : tag
}.
module type Tag_AdvOracle = { proc createTag(m : Time) : tag }.
module type Tag_Adv(O:Tag_Oracle) = {
proc forgeTag(pk : pkey) : Time * tag {O.createTag}
}.
module Tag_Wrap : Tag_Oracle = {
var usedFlag : bool
var usedTag : tag
var pk : pkey
var sk : skey
proc init() : pkey = {
(pk, sk) <$ keys;
usedFlag <- false;
usedTag <- deftag;
return pk;
}
proc createTag(t : Time) : tag = {
if(!usedFlag){
usedTag <- tag sk t;
}
usedFlag <- true;
return usedTag;
}
proc verifyTag(m : Time, s : tag) : bool = {
return tagVerify pk m s;
}
proc askedTag() : tag = {
return usedTag;
}
}.
module TagGame(O : Tag_Oracle, A : Tag_Adv) = {
module A = A(O)
var tg, tg' : tag
var m, m' : Time
var forged, fresh : bool
proc main() : bool = {
var pk : pkey;
pk <@ O.init();
(m, tg) <@ A.forgeTag(pk);
forged <@ O.verifyTag(m,tg);
tg' <@ O.askedTag();
m' <- toTime tg';
return forged /\ (m' < m \/ (m = m' /\ tg <> tg'));
}
}.
end Tags.