Skip to content

Commit 00217a4

Browse files
committed
Merge branch 'fabian-hk/development' of github.com:REPROSEC/dolev-yao-star-extrinsic into fabian-hk/development
2 parents e6575e8 + 5b93cff commit 00217a4

11 files changed

+821
-202
lines changed

src/lib/communication/DY.Lib.Communication.Core.Invariants.fst

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ let sign_crypto_predicate_communication_layer_core #cusages a #config = {
5151
| Some (Plain sender receiver payload) -> (
5252
sk_usage == long_term_key_type_to_usage (LongTermSigKey (comm_layer_sign_tag a)) sender /\
5353
get_label tr (serialize a payload) `can_flow tr` public /\
54-
event_triggered tr sender (CommAuthSendMsg sender payload <: communication_core_event a)
54+
event_triggered tr sender (CommAuthSendMsg sender receiver payload <: communication_core_event a)
5555
)
5656
| Some (Encrypted payload pk_receiver) -> (
5757
get_label tr payload `can_flow tr` public /\
@@ -111,17 +111,17 @@ type comm_core_higher_layer_event_preds (a:Type) {|comm_layer_core_config a|} =
111111
)
112112
(ensures send_conf tr2 sender receiver payload)
113113
;
114-
send_auth: tr:trace -> sender:principal -> payload:a -> prop;
114+
send_auth: tr:trace -> sender:principal -> receiver:principal -> payload:a -> prop;
115115
send_auth_later:
116116
tr1:trace -> tr2:trace ->
117-
sender:principal -> payload:a ->
117+
sender:principal -> receiver:principal -> payload:a ->
118118
Lemma
119119
(requires
120-
send_auth tr1 sender payload /\
120+
send_auth tr1 sender receiver payload /\
121121
is_well_formed a (bytes_well_formed tr1) payload /\
122122
tr1 <$ tr2
123123
)
124-
(ensures send_auth tr2 sender payload)
124+
(ensures send_auth tr2 sender receiver payload)
125125
;
126126
send_conf_auth: tr:trace -> sender:principal -> receiver:principal -> payload:a -> prop;
127127
send_conf_auth_later:
@@ -139,8 +139,8 @@ type comm_core_higher_layer_event_preds (a:Type) {|comm_layer_core_config a|} =
139139
let default_comm_core_higher_layer_event_preds (a:Type) {|comm_layer_core_config a|} : comm_core_higher_layer_event_preds a = {
140140
send_conf = (fun tr sender receiver payload -> False);
141141
send_conf_later = (fun tr1 tr2 sender receiver payload -> ());
142-
send_auth = (fun tr sender payload -> False);
143-
send_auth_later = (fun tr1 tr2 sender payload -> ());
142+
send_auth = (fun tr sender receiver payload -> False);
143+
send_auth_later = (fun tr1 tr2 sender receiver payload -> ());
144144
send_conf_auth = (fun tr sender receiver payload -> False);
145145
send_conf_auth_later = (fun tr1 tr2 sender receiver payload -> ())
146146
}
@@ -161,13 +161,13 @@ let event_predicate_communication_layer_core
161161
(exists sender. event_triggered tr sender (CommConfSendMsg sender receiver payload <: communication_core_event a)) \/
162162
is_well_formed a (is_publishable tr) payload
163163
)
164-
| CommAuthSendMsg sender payload -> (
165-
higher_layer_preds.send_auth tr sender payload
164+
| CommAuthSendMsg sender receiver payload -> (
165+
higher_layer_preds.send_auth tr sender receiver payload
166166
)
167167
| CommAuthReceiveMsg sender receiver payload -> (
168168
is_well_formed a (is_publishable tr) payload /\
169169
(
170-
event_triggered tr sender (CommAuthSendMsg sender payload <: communication_core_event a) \/
170+
event_triggered tr sender (CommAuthSendMsg sender receiver payload <: communication_core_event a) \/
171171
is_corrupt tr (long_term_key_label sender)
172172
)
173173
)

src/lib/communication/DY.Lib.Communication.Core.Lemmas.fst

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,10 @@ let receive_confidential_proof #invs #a tr higher_layer_preds comm_keys_ids rece
232232

233233
val comm_auth_send_event_triggered:
234234
#a:Type0 -> {|comm_layer_core_config a|} ->
235-
trace -> principal -> a ->
235+
trace -> principal -> principal -> a ->
236236
prop
237-
let comm_auth_send_event_triggered #a tr sender payload =
238-
event_triggered tr sender (CommAuthSendMsg sender payload <: communication_core_event a)
237+
let comm_auth_send_event_triggered #a tr sender receiver payload =
238+
event_triggered tr sender (CommAuthSendMsg sender receiver payload <: communication_core_event a)
239239

240240
val comm_conf_auth_send_event_triggered:
241241
#a:Type0 -> {|comm_layer_core_config a|} ->
@@ -261,7 +261,7 @@ val sign_message_proof:
261261
match input with
262262
| Inl payload -> (
263263
is_well_formed a (is_publishable tr) payload /\
264-
comm_auth_send_event_triggered #a tr sender payload
264+
comm_auth_send_event_triggered #a tr sender receiver payload
265265
)
266266
| Inr (payload, pk) -> (
267267
is_publishable tr payload /\
@@ -319,7 +319,7 @@ val send_authenticated_proof:
319319
trace_invariant tr /\
320320
has_private_keys_invariant /\
321321
has_communication_layer_core_predicates higher_layer_preds /\
322-
higher_layer_preds.send_auth tr sender payload /\
322+
higher_layer_preds.send_auth tr sender receiver payload /\
323323
is_well_formed a (is_publishable tr) payload
324324
)
325325
(ensures (
@@ -336,9 +336,9 @@ let send_authenticated_proof #invs #a tr higher_layer_preds comm_keys_ids sender
336336
| (Some _, tr_out) -> (
337337
let (Some sk_sender, tr') = get_private_key sender comm_keys_ids.private_keys (LongTermSigKey (comm_layer_sign_tag a)) tr in
338338
let (nonce, tr') = mk_rand SigNonce (long_term_key_label sender) 32 tr' in
339-
higher_layer_preds.send_auth_later tr tr' sender payload;
340-
let ((), tr') = trigger_event sender (CommAuthSendMsg sender payload <: communication_core_event a) tr' in
341-
assert(comm_auth_send_event_triggered tr' sender payload);
339+
higher_layer_preds.send_auth_later tr tr' sender receiver payload;
340+
let ((), tr') = trigger_event sender (CommAuthSendMsg sender receiver payload <: communication_core_event a) tr' in
341+
assert(comm_auth_send_event_triggered tr' sender receiver payload);
342342
sign_message_proof #invs.crypto_invs #a tr' sender receiver (Inl payload) sk_sender nonce;
343343
let msg_signed = sign_message #a sender receiver (Inl payload) sk_sender nonce in
344344
let (msg_id, tr') = send_msg msg_signed tr' in
@@ -375,7 +375,7 @@ val verify_message_proof:
375375
(
376376
sender == sender' /\
377377
receiver == receiver' /\
378-
comm_auth_send_event_triggered tr sender (Inl?.v payload) \/
378+
comm_auth_send_event_triggered tr sender receiver (Inl?.v payload) \/
379379
is_corrupt tr (long_term_key_label sender)
380380
)
381381
)

src/lib/communication/DY.Lib.Communication.Core.Properties.fst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ val sender_authentication:
7878
event_triggered_at tr i receiver (CommAuthReceiveMsg sender receiver payload <: communication_core_event a)
7979
)
8080
(ensures
81-
event_triggered (prefix tr i) sender (CommAuthSendMsg sender payload <: communication_core_event a) \/
81+
event_triggered (prefix tr i) sender (CommAuthSendMsg sender receiver payload <: communication_core_event a) \/
8282
is_corrupt (prefix tr i) (long_term_key_label sender)
8383
)
8484
let sender_authentication #tag #invs #a tr i higher_layer_preds sender receiver secret = ()

src/lib/communication/DY.Lib.Communication.Core.fst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ let comm_label sender receiver = join (principal_label sender) (principal_label
3434
type communication_core_event (a:Type) {|config:comm_layer_core_config a|} =
3535
| CommConfSendMsg: sender:principal -> receiver:principal -> [@@@ with_parser #bytes config.core_ps_a] payload:a -> communication_core_event a
3636
| CommConfReceiveMsg: receiver:principal -> [@@@ with_parser #bytes config.core_ps_a] payload:a -> communication_core_event a
37-
| CommAuthSendMsg: sender:principal -> [@@@ with_parser #bytes config.core_ps_a] payload:a -> communication_core_event a
37+
| CommAuthSendMsg: sender:principal -> receiver:principal -> [@@@ with_parser #bytes config.core_ps_a] payload:a -> communication_core_event a
3838
| CommAuthReceiveMsg: sender:principal -> receiver:principal -> [@@@ with_parser #bytes config.core_ps_a] payload:a -> communication_core_event a
3939
| CommConfAuthSendMsg: sender:principal -> receiver:principal -> [@@@ with_parser #bytes config.core_ps_a] payload:a -> communication_core_event a
4040
| CommConfAuthReceiveMsg: sender:principal -> receiver:principal -> [@@@ with_parser #bytes config.core_ps_a] payload:a -> communication_core_event a
@@ -129,7 +129,7 @@ val send_authenticated:
129129
let send_authenticated #a comm_keys_ids sender receiver payload =
130130
let*? sk_sender = get_private_key sender comm_keys_ids.private_keys (LongTermSigKey (comm_layer_sign_tag a)) in
131131
let* nonce = mk_rand SigNonce (long_term_key_label sender) 32 in
132-
trigger_event sender (CommAuthSendMsg sender payload <: communication_core_event a);*
132+
trigger_event sender (CommAuthSendMsg sender receiver payload <: communication_core_event a);*
133133
let msg_signed = sign_message sender receiver (Inl payload) sk_sender nonce in
134134
let* msg_id = send_msg msg_signed in
135135
return (Some msg_id)

src/lib/communication/DY.Lib.Communication.Data.fst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ type response_envelope = {
9393

9494
[@@with_bytes bytes]
9595
type authenticated_data = {
96+
[@@@ with_parser #bytes (ps_option ps_principal)]
97+
client:option principal;
9698
server:principal
9799
}
98100

src/lib/communication/DY.Lib.Communication.Printing.fst

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ let comm_message_to_string #core_type #core_config #reqres_type #reqres_config m
7777
| None -> Some (other_messages_to_string b)
7878
)
7979

80+
// TODO: This should be moved to the printing library
81+
val option_to_string: (#a:Type0) -> (a -> string) -> option a -> string
82+
let option_to_string #a to_string opt =
83+
match opt with
84+
| Some x -> Printf.sprintf "Some (%s)" (to_string x)
85+
| None -> "None"
86+
8087
val com_core_event_to_string:
8188
#a:Type0 -> {|comm_layer_core_config a|} ->
8289
(a -> string) ->
@@ -91,9 +98,9 @@ let com_core_event_to_string #a payload_to_string =
9198
| CommConfReceiveMsg receiver payload ->
9299
Some (Printf.sprintf "CommConfReceiveMsg receiver = %s, payload = (%s)"
93100
receiver (payload_to_string payload))
94-
| CommAuthSendMsg sender payload ->
95-
Some (Printf.sprintf "CommAuthSendMsg sender = %s, payload = (%s)"
96-
sender (payload_to_string payload))
101+
| CommAuthSendMsg sender receiver payload ->
102+
Some (Printf.sprintf "CommAuthSendMsg sender = %s, receiver = %s, payload = (%s)"
103+
sender receiver (payload_to_string payload))
97104
| CommAuthReceiveMsg sender receiver payload ->
98105
Some (Printf.sprintf "CommAuthReceiveMsg sender = %s, receiver = %s, payload = (%s)"
99106
sender receiver (payload_to_string payload))
@@ -113,21 +120,21 @@ let com_reqres_event_to_string #a payload_to_string =
113120
((event_communication_reqres_event #a).tag, (fun b -> (
114121
let? cre = parse (communication_reqres_event a) b in
115122
match cre with
116-
| CommClientSendRequest client server request key -> (
117-
Some (Printf.sprintf "CommClientSendRequest client = %s, server = %s, request = (%s)"
118-
client server (payload_to_string request))
123+
| CommClientSendRequest authenticated client server request key -> (
124+
Some (Printf.sprintf "CommClientSendRequest authenticated = %b, client = %s, server = %s, request = (%s)"
125+
authenticated client server (payload_to_string request))
119126
)
120-
| CommServerReceiveRequest server request key -> (
121-
Some (Printf.sprintf "CommServerReceiveRequest server = %s, request = (%s), key = %s"
122-
server (payload_to_string request) (bytes_to_string key))
127+
| CommServerReceiveRequest client server request key -> (
128+
Some (Printf.sprintf "CommServerReceiveRequest client = %s, server = %s, request = (%s), key = %s"
129+
(option_to_string (fun s -> s) client) server (payload_to_string request) (bytes_to_string key))
123130
)
124-
| CommServerSendResponse server request response key -> (
125-
Some (Printf.sprintf "CommServerSendResponse server = %s, request = %s, response = (%s), key = %s"
126-
server (payload_to_string request) (payload_to_string response) (bytes_to_string key))
131+
| CommServerSendResponse client server request response key -> (
132+
Some (Printf.sprintf "CommServerSendResponse client = %s, server = %s, request = %s, response = (%s), key = %s"
133+
(option_to_string (fun s -> s) client) server (payload_to_string request) (payload_to_string response) (bytes_to_string key))
127134
)
128-
| CommClientReceiveResponse client server request response key -> (
129-
Some (Printf.sprintf "CommClientReceiveResponse client = %s, server = %s, response = (%s), key = %s"
130-
client server (payload_to_string response) (bytes_to_string key))
135+
| CommClientReceiveResponse authenticated client server request response key -> (
136+
Some (Printf.sprintf "CommClientReceiveResponse authenticated = %b, client = %s, server = %s, response = (%s), key = %s"
137+
authenticated client server (payload_to_string response) (bytes_to_string key))
131138
)
132139
)))
133140

src/lib/communication/DY.Lib.Communication.RequestResponse.Invariants.fst

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,18 @@ let aead_crypto_predicate_communication_layer_reqres #cusages a #config = {
2929
pred = (fun tr key_usage key nonce msg ad ->
3030
(match parse authenticated_data ad with
3131
| None -> False
32-
| Some {server} -> (exists request.
32+
| Some {client; server} -> (exists request.
3333
match parse a msg with
3434
| None -> False
3535
| Some response ->
36-
event_triggered tr server (CommServerSendResponse server request response key <: communication_reqres_event a)
36+
event_triggered tr server (CommServerSendResponse client server request response key <: communication_reqres_event a)
3737
)
3838
)
3939
);
4040
pred_later = (fun tr1 tr2 key_usage key nonce msg ad -> (
4141
match parse authenticated_data ad with
4242
| None -> assert(False)
43-
| Some {server} -> ()
43+
| Some {client; server} -> ()
4444
))
4545
}
4646
#pop-options
@@ -93,10 +93,10 @@ let state_predicate_communication_layer_reqres {|crypto_invariants|} (a:Type) {|
9393
is_secret (comm_label client server) tr key /\
9494
key `has_usage tr` (AeadKey (comm_layer_aead_tag a) empty)
9595
)
96-
| ServerReceiveRequest {request; key} -> (
96+
| ServerReceiveRequest {client; request; key} -> (
9797
let server = prin in
9898
is_knowable_by (principal_label server) tr key /\
99-
is_well_formed a (is_knowable_by (principal_label server) tr) request /\
99+
is_well_formed a (is_knowable_by (get_label tr key) tr) request /\
100100
key `has_usage tr` (AeadKey (comm_layer_aead_tag a) empty)
101101
)
102102
| ClientReceiveResponse {server; response; key} -> (
@@ -156,6 +156,20 @@ class comm_reqres_preds (a:Type) {| comm_layer_reqres_config a |} = {
156156
send_request_pred tr2 client server request key_label
157157
)
158158
;
159+
authenticated_request_pred: tr:trace -> client:principal -> server:principal -> request:a -> key_label:label -> prop;
160+
authenticated_request_pred_later:
161+
tr1:trace -> tr2:trace ->
162+
client:principal -> server:principal -> request:a -> key_label:label ->
163+
Lemma
164+
(requires
165+
authenticated_request_pred tr1 client server request key_label /\
166+
is_well_formed a (bytes_well_formed tr1) request /\
167+
tr1 <$ tr2
168+
)
169+
(ensures
170+
authenticated_request_pred tr2 client server request key_label
171+
)
172+
;
159173
// TODO rename to response_pred
160174
send_response_pred: tr:trace -> server:principal -> request:a -> response:a -> key_label:label -> prop;
161175
send_response_pred_later:
@@ -181,35 +195,40 @@ let event_predicate_communication_layer_reqres
181195
event_predicate (communication_reqres_event a) =
182196
fun tr prin e ->
183197
(match e with
184-
| CommClientSendRequest client server request key -> (
198+
| CommClientSendRequest authenticated client server request key -> (
185199
rand_just_generated tr key /\
186200
is_well_formed a (is_knowable_by (get_label tr key) tr) request /\
187201
is_secret (comm_label client server) tr key /\
188202
key `has_usage tr` (AeadKey (comm_layer_aead_tag a) empty) /\
189203
crpreds.send_request_pred tr client server request (get_label tr key)
190204
)
191-
| CommServerReceiveRequest server request key -> (
205+
| CommServerReceiveRequest client server request key -> (
192206
is_knowable_by (principal_label server) tr key /\
193207
is_well_formed a (is_knowable_by (get_label tr key) tr) request /\
194208
key `has_usage tr` (AeadKey (comm_layer_aead_tag a) empty) /\
195-
(
196-
(exists client. event_triggered tr client (CommClientSendRequest client server request key <: communication_reqres_event a)) \/
197-
(is_publishable tr key /\ is_well_formed a (is_publishable tr) request)
209+
(match client with
210+
| None -> (
211+
(exists client. event_triggered tr client (CommClientSendRequest Unauthenticated client server request key <: communication_reqres_event a)) \/
212+
(is_publishable tr key /\ is_well_formed a (is_publishable tr) request)
198213
)
214+
| Some client -> (
215+
event_triggered tr client (CommClientSendRequest Authenticated client server request key <: communication_reqres_event a) \/
216+
is_corrupt tr (long_term_key_label client)
217+
))
199218
)
200-
| CommServerSendResponse server request response key -> (
201-
event_triggered tr server (CommServerReceiveRequest server request key <: communication_reqres_event a) /\
219+
| CommServerSendResponse client server request response key -> (
220+
event_triggered tr server (CommServerReceiveRequest client server request key <: communication_reqres_event a) /\
202221
is_well_formed a (bytes_well_formed tr) request /\
203222
is_well_formed a (bytes_well_formed tr) response /\
204223
bytes_well_formed tr key /\
205224
crpreds.send_response_pred tr server request response (get_label tr key)
206225
)
207-
| CommClientReceiveResponse client server request response key -> (
208-
is_well_formed a (is_knowable_by (get_label tr key) tr) response /\
209-
is_secret (comm_label client server) tr key /\
210-
event_triggered tr client (CommClientSendRequest client server request key <: communication_reqres_event a) /\
211-
(event_triggered tr server (CommServerSendResponse server request response key <: communication_reqres_event a) \/
212-
(is_publishable tr key /\ is_well_formed a (is_publishable tr) response))
226+
| CommClientReceiveResponse client response req_meta_data -> (
227+
is_well_formed a (is_knowable_by (comm_label client req_meta_data.server) tr) response /\
228+
is_secret (comm_label client req_meta_data.server) tr req_meta_data.key /\
229+
event_triggered tr client (CommClientSendRequest (request_authenticated req_meta_data) client req_meta_data.server req_meta_data.request req_meta_data.key <: communication_reqres_event a) /\
230+
(event_triggered tr req_meta_data.server (CommServerSendResponse req_meta_data.client req_meta_data.server req_meta_data.request response req_meta_data.key <: communication_reqres_event a) \/
231+
is_corrupt tr (principal_label client) \/ is_corrupt tr (principal_label req_meta_data.server))
213232
)
214233
)
215234
#pop-options
@@ -225,12 +244,19 @@ let comm_core_higher_layer_event_preds_reqres #cinvs a #config = {
225244
send_conf = (fun tr client server (com_msg_t:comm_message_t) ->
226245
match com_msg_t with
227246
| RequestMessage {request; key} -> (
228-
parse_and_pred (fun request_parsed -> event_triggered tr client (CommClientSendRequest client server request_parsed key <: communication_reqres_event a)) request
247+
parse_and_pred (fun request_parsed -> event_triggered tr client (CommClientSendRequest Unauthenticated client server request_parsed key <: communication_reqres_event a)) request
248+
)
249+
| _ -> False
250+
);
251+
send_conf_later = (fun tr1 tr2 client server msg -> ());
252+
send_conf_auth = (fun tr client server (com_msg_t:comm_message_t) ->
253+
match com_msg_t with
254+
| RequestMessage {request; key} -> (
255+
parse_and_pred (fun request_parsed -> event_triggered tr client (CommClientSendRequest Authenticated client server request_parsed key <: communication_reqres_event a)) request
229256
)
230257
| _ -> False
231258
);
232-
send_conf_later = (fun tr1 tr2 client server msg -> ()
233-
)
259+
send_conf_auth_later = (fun tr1 tr2 client server msg -> ());
234260
}
235261
#pop-options
236262

0 commit comments

Comments
 (0)