-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTags.ec
88 lines (69 loc) · 1.96 KB
/
Tags.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
require import Int Bool Distr AllCore List.
abstract theory TagSystem.
(* types *)
type pkey, skey, tag.
type Time = int.
(* pure tag generation and tag verification functions *)
op tagGen : skey -> Time -> tag option.
op tagVer : pkey -> Time -> tag option -> bool.
(* expiration date *)
op EXP : Time.
op dR : int distr.
(* key generation modules and types *)
require import KeyGen.
clone export KeyGen with type pkey <- pkey,
type skey <- skey,
op dR <- dR.
(* module type of a tagging oracle *)
module type TagOracleT = {
proc init(pk:pkey, sk:skey) : unit
proc tag(t : Time) : tag option
proc getTagLog() : Time list
}.
(* AdvFR represents the set of "reasonably efficient" adversaries *)
module type AdvFR (T : TagOracleT) = {
proc forge(pk:pkey) : Time * tag option {T.tag}
}.
(* standard implementation of a multiple-time tagging oracle *)
module TagOracle : TagOracleT = {
var lt : Time list
var pk : pkey
var sk : skey
proc init(pk:pkey, sk:skey) = {
TagOracle.pk <- pk;
TagOracle.sk <- sk;
lt <- [];
}
proc tag(t : Time) = {
var tg;
lt <- t :: lt;
tg <- tagGen sk t;
return tg;
}
proc getTagLog() : Time list = {
return lt;
}
proc getPK() : pkey = {
return pk;
}
}.
(* checkTagLog t l = true iff list l contains no element larger or equal than t *)
op checkTagLog (t : Time, l : Time list) : bool =
with l = [] => true
with l = (x :: xs) => if x < t then checkTagLog t xs else false.
(* multiple-time forward-resistance game *)
module GameFR(A : AdvFR, T : TagOracleT, K : KeyGenT) = {
module A = A(T)
var i : Time
var tg : tag option
var sl : Time list
proc main() : bool = {
var pk, sk;
(pk, sk) <@ K.keyGen();
T.init(pk, sk);
(i, tg) <@ A.forge(pk);
sl <@ T.getTagLog();
return 0 < i /\ i <= EXP /\ tagVer pk i tg /\ checkTagLog i sl;
}
}.
end TagSystem.