Skip to content

Commit 03176f5

Browse files
committed
Cleanup conf_auth send and receive functions: Remove higher_layer_preds.send_conf from precondition; Add property confauth_message_properties'
1 parent eb3286e commit 03176f5

File tree

5 files changed

+122
-53
lines changed

5 files changed

+122
-53
lines changed

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,17 @@ open DY.Lib.Communication.Core
1717

1818
(*** PkEnc Predicates ***)
1919

20-
#push-options "--ifuel 1"
20+
#push-options "--ifuel 2"
2121
val pke_crypto_predicates_communication_layer_core: {|cusages:crypto_usages|} -> a:Type0 -> {|comm_layer_core_config a|} -> pke_crypto_predicate
2222
let pke_crypto_predicates_communication_layer_core #cusages a #config = {
2323
pred = (fun tr sk_usage pk msg ->
2424
(exists sender receiver.
25-
sk_usage == long_term_key_type_to_usage (LongTermPkeKey (comm_layer_pkenc_tag a)) receiver /\
25+
sk_usage == long_term_key_type_to_usage (LongTermPkeKey (comm_layer_pkenc_tag a)) receiver /\
2626
(get_label tr msg) `can_flow tr` (comm_label sender receiver) /\
27-
parse_and_pred
28-
(fun msg_parsed -> event_triggered tr sender (CommConfSendMsg sender receiver msg_parsed <: communication_core_event a))
29-
msg
27+
(match parse (encryption_input a) msg with
28+
| Some (Unsigned payload) -> event_triggered tr sender (CommConfSendMsg sender receiver payload <: communication_core_event a)
29+
| Some (Signed payload) -> event_triggered tr sender (CommConfAuthSendMsg sender receiver payload <: communication_core_event a)
30+
| None -> False)
3031
)
3132
);
3233
pred_later = (fun tr1 tr2 sk_usage pk msg -> ());
@@ -57,9 +58,9 @@ let sign_crypto_predicate_communication_layer_core #cusages a #config = {
5758
sk_usage == long_term_key_type_to_usage (LongTermSigKey (comm_layer_sign_tag a)) sender /\
5859
(exists plain_payload nonce.
5960
payload == pke_enc pk_receiver nonce plain_payload /\
60-
(match parse a plain_payload with
61-
| None -> False
62-
| Some plain_payload_parsed -> event_triggered tr sender (CommConfAuthSendMsg sender receiver plain_payload_parsed <: communication_core_event a))
61+
(match parse (encryption_input a) plain_payload with
62+
| Some (Signed plain_payload_parsed) -> event_triggered tr sender (CommConfAuthSendMsg sender receiver plain_payload_parsed <: communication_core_event a)
63+
| _ -> False)
6364
)
6465
)
6566
| None -> False)
@@ -186,6 +187,10 @@ let event_predicate_communication_layer_core
186187
(
187188
event_triggered tr sender (CommConfAuthSendMsg sender receiver payload <: communication_core_event a) \/
188189
is_corrupt tr (long_term_key_label sender)
190+
) /\
191+
(
192+
exists sender. event_triggered tr sender (CommConfAuthSendMsg sender receiver payload <: communication_core_event a) \/
193+
is_well_formed a (is_publishable tr) payload
189194
)
190195
)
191196
)

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

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,10 @@ val encrypt_message_proof:
9292
(ensures
9393
is_publishable tr (encrypt_message pk_receiver nonce payload)
9494
)
95-
let encrypt_message_proof #cinvs #a tr sender receiver pk_receiver nonce pkenc_in =
96-
reveal_opaque (`%encrypt_message) (encrypt_message #a)
95+
let encrypt_message_proof #cinvs #a #config tr sender receiver pk_receiver nonce pkenc_in =
96+
reveal_opaque (`%encrypt_message) (encrypt_message #a);
97+
assert(is_well_formed (encryption_input a) #(parseable_serializeable_bytes_encryption_input #a) (is_knowable_by (comm_label sender receiver) tr) (Unsigned pkenc_in));
98+
()
9799

98100
val send_confidential_proof:
99101
{|invs:protocol_invariants|} ->
@@ -154,7 +156,6 @@ val decrypt_message_proof:
154156
match decrypt_message #a sk_receiver msg_encrypted with
155157
| None -> True
156158
| Some payload -> (exists sender.
157-
is_well_formed a (is_knowable_by (comm_label sender receiver) tr) payload /\
158159
is_well_formed a (is_knowable_by (comm_label sender receiver) tr) payload /\
159160
(
160161
comm_conf_send_event_triggered tr sender receiver payload \/
@@ -169,8 +170,22 @@ let decrypt_message_proof #cinvs #a tr receiver sk_receiver msg_encrypted =
169170
| None -> ()
170171
| Some payload -> (
171172
let Some plaintext = pke_dec sk_receiver msg_encrypted in
172-
serialize_parse_inv_lemma #bytes a plaintext;
173-
()
173+
let Some payload = parse (encryption_input a) plaintext in
174+
let Unsigned payload = payload in
175+
assert(exists sender. is_knowable_by (comm_label sender receiver) tr plaintext);
176+
eliminate exists sender. is_knowable_by (comm_label sender receiver) tr plaintext /\
177+
(event_triggered tr sender (CommConfSendMsg sender receiver payload <: communication_core_event a) \/
178+
is_publishable tr plaintext)
179+
returns exists sender. is_well_formed a (is_knowable_by (comm_label sender receiver) tr) payload /\
180+
(
181+
comm_conf_send_event_triggered tr sender receiver payload \/
182+
is_well_formed a (is_publishable tr) payload
183+
)
184+
with _. (
185+
parse_wf_lemma (encryption_input a) (is_knowable_by (comm_label sender receiver) tr) plaintext;
186+
FStar.Classical.move_requires (parse_wf_lemma (encryption_input a) (is_publishable tr)) plaintext;
187+
()
188+
)
174189
)
175190

176191
val receive_confidential_proof:
@@ -253,9 +268,9 @@ val sign_message_proof:
253268
is_publishable tr pk /\
254269
(exists plain_payload nonce.
255270
payload == pke_enc pk nonce plain_payload /\
256-
(match parse a #(parseable_serializeable_bytes_a_core #a) plain_payload with
257-
| None -> False
258-
| Some plain_payload_parsed -> comm_conf_auth_send_event_triggered tr sender receiver plain_payload_parsed)
271+
(match parse (encryption_input a) #(parseable_serializeable_bytes_encryption_input #a) plain_payload with
272+
| Some (Signed plain_payload_parsed) -> comm_conf_auth_send_event_triggered tr sender receiver plain_payload_parsed
273+
| _ -> False)
259274
)
260275
)
261276
)
@@ -368,9 +383,9 @@ val verify_message_proof:
368383
(
369384
exists plain_payload nonce.
370385
(Inr?.v payload) == pke_enc pk_receiver nonce plain_payload /\
371-
(match parse a plain_payload with
372-
| None -> False
373-
| Some plain_payload_parsed -> comm_conf_auth_send_event_triggered tr sender receiver plain_payload_parsed)
386+
(match parse (encryption_input a) plain_payload with
387+
| Some (Signed plain_payload_parsed) -> comm_conf_auth_send_event_triggered tr sender receiver plain_payload_parsed
388+
| _ -> False)
374389
) \/ (
375390
is_corrupt tr (long_term_key_label sender)
376391
)
@@ -465,17 +480,15 @@ val encrypt_and_sign_message_proof:
465480
is_public_key_for tr pk_receiver (LongTermPkeKey (comm_layer_pkenc_tag a)) receiver /\
466481
is_private_key_for tr sk_sender (LongTermSigKey (comm_layer_sign_tag a)) sender /\
467482
is_well_formed a (is_knowable_by (comm_label sender receiver) tr) payload /\
468-
comm_conf_send_event_triggered tr sender receiver payload /\
469483
comm_conf_auth_send_event_triggered tr sender receiver payload
470484
)
471485
(ensures
472486
is_publishable tr (encrypt_and_sign_message sender receiver payload pk_receiver sk_sender enc_nonce sign_nonce)
473487
)
474488
let encrypt_and_sign_message_proof #cinvs #a tr sender receiver payload pk_receiver sk_sender enc_nonce sign_nonce =
475489
reveal_opaque (`%encrypt_and_sign_message) (encrypt_and_sign_message #a);
476-
reveal_opaque (`%encrypt_message) (encrypt_message #a); // TODO: This should be removeable.
477-
encrypt_message_proof tr sender receiver pk_receiver enc_nonce payload;
478-
let enc_payload = encrypt_message pk_receiver enc_nonce payload in
490+
assert(is_well_formed (encryption_input a) #(parseable_serializeable_bytes_encryption_input #a) (is_knowable_by (comm_label sender receiver) tr) (Signed payload));
491+
let enc_payload = pke_enc pk_receiver enc_nonce (serialize (encryption_input a) (Signed payload)) in
479492
sign_message_proof #cinvs #a tr sender receiver (Inr (enc_payload, pk_receiver)) sk_sender sign_nonce;
480493
()
481494

@@ -493,7 +506,6 @@ val send_confidential_authenticated_proof:
493506
has_private_keys_invariant /\
494507
has_pki_invariant /\
495508
has_communication_layer_core_predicates higher_layer_preds /\
496-
higher_layer_preds.send_conf tr sender receiver payload /\
497509
higher_layer_preds.send_conf_auth tr sender receiver payload /\
498510
is_well_formed a (is_knowable_by (join (principal_label sender) (principal_label receiver)) tr) payload
499511
)
@@ -514,11 +526,6 @@ let send_confidential_authenticated_proof #invs #a tr higher_layer_preds comm_ke
514526
let (enc_nonce, tr') = mk_rand PkeNonce (long_term_key_label sender) 32 tr' in
515527
let (sign_nonce, tr') = mk_rand SigNonce (long_term_key_label sender) 32 tr' in
516528

517-
let payload_bytes = serialize #bytes a payload in
518-
higher_layer_preds.send_conf_later tr tr' sender receiver payload;
519-
let ((), tr') = trigger_event sender (CommConfSendMsg sender receiver payload <: communication_core_event a) tr' in
520-
assert(comm_conf_send_event_triggered tr' sender receiver payload);
521-
522529
higher_layer_preds.send_conf_auth_later tr tr' sender receiver payload;
523530
let ((), tr') = trigger_event sender (CommConfAuthSendMsg sender receiver payload <: communication_core_event a) tr' in
524531
assert(comm_conf_auth_send_event_triggered tr' sender receiver payload);
@@ -552,7 +559,7 @@ val verify_and_decrypt_message_proof:
552559
| None -> True
553560
| Some cm -> (
554561
(
555-
(exists sender. event_triggered tr sender (CommConfSendMsg sender receiver cm.payload <: communication_core_event a)) \/
562+
(exists sender. comm_conf_auth_send_event_triggered tr sender receiver cm.payload) \/
556563
is_well_formed a (is_publishable tr) cm.payload
557564
) /\ (
558565
comm_conf_auth_send_event_triggered tr sender receiver cm.payload \/
@@ -575,16 +582,21 @@ let verify_and_decrypt_message_proof #cinvs #a tr sender receiver msg_encrypted_
575582
assert(pk_receiver == pk sk_receiver);
576583

577584
let Some plaintext = pke_dec sk_receiver payload_enc in
578-
serialize_parse_inv_lemma #bytes a plaintext;
585+
let Some payload = parse (encryption_input a) plaintext in
586+
let Signed payload = payload in
587+
588+
FStar.Classical.move_requires (parse_wf_lemma (encryption_input a) (is_publishable tr)) plaintext;
589+
assert(exists sender. event_triggered tr sender (CommConfAuthSendMsg sender receiver payload <: communication_core_event a) \/ is_well_formed a (is_publishable tr) payload);
579590

580591
introduce (~(is_corrupt tr (long_term_key_label sender))) ==> (
581592
comm_conf_auth_send_event_triggered tr sender receiver cm.payload
582593
)
583594
with _. (
584595
eliminate exists plain_payload nonce.
585596
payload_enc == pke_enc pk_receiver nonce plain_payload /\
586-
Some? (parse a plain_payload) /\
587-
comm_conf_auth_send_event_triggered tr sender receiver (Some?.v (parse a plain_payload))
597+
Some? (parse (encryption_input a) plain_payload) /\
598+
Signed? (Some?.v (parse (encryption_input a) plain_payload)) /\
599+
comm_conf_auth_send_event_triggered tr sender receiver (Signed?.payload (Some?.v (parse (encryption_input a) plain_payload)))
588600
returns comm_conf_auth_send_event_triggered tr sender receiver cm.payload
589601
with _. (
590602
pke_dec_enc sk_receiver nonce plain_payload;
@@ -609,17 +621,14 @@ val receive_confidential_authenticated_proof:
609621
has_pki_invariant /\
610622
has_communication_layer_core_predicates higher_layer_preds
611623
)
612-
(ensures
613-
(
614-
match receive_confidential_authenticated #a comm_keys_ids receiver msg_id tr with
615-
| (None, tr_out) -> trace_invariant tr_out
616-
| (Some cm, tr_out) -> (
617-
trace_invariant tr_out /\
618-
event_triggered tr_out receiver (CommConfReceiveMsg receiver cm.payload <: communication_core_event a) /\
619-
event_triggered tr_out receiver (CommConfAuthReceiveMsg cm.sender receiver cm.payload <: communication_core_event a)
620-
)
624+
(ensures(
625+
match receive_confidential_authenticated #a comm_keys_ids receiver msg_id tr with
626+
| (None, tr_out) -> trace_invariant tr_out
627+
| (Some cm, tr_out) -> (
628+
trace_invariant tr_out /\
629+
event_triggered tr_out receiver (CommConfAuthReceiveMsg cm.sender receiver cm.payload <: communication_core_event a)
621630
)
622-
)
631+
))
623632
[SMTPat (trace_invariant #invs tr);
624633
SMTPat (receive_confidential_authenticated #a comm_keys_ids receiver msg_id tr);
625634
SMTPat (core_comm_layer_lemmas_enabled higher_layer_preds)]
@@ -636,7 +645,6 @@ let receive_confidential_authenticated_proof #invs #a tr higher_layer_preds comm
636645
let (Some vk_sender, tr) = get_public_key receiver comm_keys_ids.pki (LongTermSigKey (comm_layer_sign_tag a)) sender tr in
637646
verify_and_decrypt_message_proof #invs.crypto_invs #a tr sender receiver msg_encrypted_signed sk_receiver vk_sender;
638647
let Some cm = verify_and_decrypt_message #a receiver sk_receiver vk_sender msg_encrypted_signed in
639-
let ((), tr) = trigger_event receiver (CommConfReceiveMsg receiver cm.payload <: communication_core_event a) tr in
640648
let ((), tr) = trigger_event receiver (CommConfAuthReceiveMsg sender receiver cm.payload <: communication_core_event a) tr in
641649
assert(trace_invariant tr);
642650
assert(tr == tr_out);

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

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,43 @@ let confauth_message_properties #invs #a tr higher_layer_preds sender receiver p
139139
higher_layer_preds.send_conf_auth_later (prefix tr j) tr sender receiver payload;
140140
()
141141
)
142-
and _. ()
142+
and _. ()
143+
144+
val confauth_message_properties':
145+
{|protocol_invariants|} ->
146+
#a:Type -> {|comm_layer_core_config a|} ->
147+
tr:trace ->
148+
higher_layer_preds:comm_core_higher_layer_event_preds a ->
149+
sender:principal -> receiver:principal -> payload:a ->
150+
Lemma
151+
(requires
152+
trace_invariant tr /\
153+
has_communication_layer_core_predicates higher_layer_preds /\
154+
event_triggered tr receiver (CommConfAuthReceiveMsg sender receiver payload <: communication_core_event a)
155+
)
156+
(ensures
157+
is_well_formed a (is_knowable_by (principal_label receiver) tr) payload /\
158+
(exists sender'. higher_layer_preds.send_conf_auth tr sender' receiver payload \/
159+
is_well_formed a (is_publishable tr) payload)
160+
)
161+
let confauth_message_properties' #invs #a tr higher_layer_preds sender receiver payload =
162+
let send_event sender':communication_core_event a = CommConfAuthSendMsg sender' receiver payload in
163+
let i = find_event_triggered_at_timestamp tr receiver (CommConfAuthReceiveMsg sender receiver payload <: communication_core_event a) in
164+
let tr_i = prefix tr i in
165+
eliminate (exists sender'. event_triggered tr_i sender' (send_event sender')) \/ is_well_formed a (is_publishable tr_i) payload
166+
returns
167+
is_well_formed a (is_knowable_by (principal_label receiver) tr) payload /\
168+
(exists sender'. higher_layer_preds.send_conf_auth tr sender' receiver payload \/
169+
is_well_formed a (is_publishable tr) payload)
170+
with _. (
171+
eliminate exists sender'. event_triggered tr_i sender' (send_event sender')
172+
returns _
173+
with _. (
174+
let j = find_event_triggered_at_timestamp tr sender' (send_event sender') in
175+
find_event_triggered_at_timestamp_later tr_i tr sender' (send_event sender');
176+
higher_layer_preds.send_conf_auth_later (prefix tr j) tr sender' receiver payload;
177+
()
178+
)
179+
)
180+
and _. ()
181+

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ instance event_communication_core_event (a:Type) {|config:comm_layer_core_config
5757

5858
[@@ "opaque_to_smt"]
5959
val encrypt_message:
60-
#a:Type -> {|comm_layer_core_config a|} ->
60+
#a:Type0 -> {|comm_layer_core_config a|} ->
6161
bytes -> bytes -> a -> bytes
6262
let encrypt_message #a pk_receiver nonce payload =
63-
pke_enc pk_receiver nonce (serialize a payload)
63+
pke_enc pk_receiver nonce (serialize (encryption_input a) (Unsigned payload))
6464

6565
[@@ "opaque_to_smt"]
6666
val send_confidential:
@@ -82,7 +82,10 @@ val decrypt_message:
8282
bytes -> bytes -> option a
8383
let decrypt_message #a sk_receiver msg_encrypted =
8484
let? plaintext = pke_dec sk_receiver msg_encrypted in
85-
parse #bytes a plaintext
85+
let? payload = parse (encryption_input a) plaintext in
86+
guard (Unsigned? payload);?
87+
let Unsigned payload = payload in
88+
Some payload
8689

8790
[@@ "opaque_to_smt"]
8891
val receive_confidential:
@@ -193,7 +196,7 @@ val encrypt_and_sign_message:
193196
#a:Type0 -> {|comm_layer_core_config a|} ->
194197
principal -> principal -> a -> bytes -> bytes -> bytes -> bytes -> bytes
195198
let encrypt_and_sign_message #a sender receiver payload pk_receiver sk_sender enc_nonce sign_nonce =
196-
let enc_payload = encrypt_message #a pk_receiver enc_nonce payload in
199+
let enc_payload = pke_enc pk_receiver enc_nonce (serialize (encryption_input a) (Signed payload)) in
197200
sign_message #a sender receiver (Inr (enc_payload, pk_receiver)) sk_sender sign_nonce
198201

199202
// We do not encrypt the sender and receiver because, in real-world settings,
@@ -211,7 +214,6 @@ let send_confidential_authenticated #a comm_keys_ids sender receiver payload =
211214
let*? sk_sender = get_private_key sender comm_keys_ids.private_keys (LongTermSigKey (comm_layer_sign_tag a)) in
212215
let* enc_nonce = mk_rand PkeNonce (long_term_key_label sender) 32 in
213216
let* sign_nonce = mk_rand SigNonce (long_term_key_label sender) 32 in
214-
trigger_event sender (CommConfSendMsg sender receiver payload <: communication_core_event a);*
215217
trigger_event sender (CommConfAuthSendMsg sender receiver payload <: communication_core_event a);*
216218
let msg_encrypted_signed_bytes = encrypt_and_sign_message sender receiver payload pk_receiver sk_sender enc_nonce sign_nonce in
217219
let* msg_id = send_msg msg_encrypted_signed_bytes in
@@ -223,7 +225,10 @@ val verify_and_decrypt_message:
223225
principal -> bytes -> bytes -> bytes -> option (communication_message a)
224226
let verify_and_decrypt_message #a receiver sk_receiver vk_sender msg_encrypted_signed =
225227
let? Inr payload_enc = verify_message #a receiver msg_encrypted_signed (Some sk_receiver) vk_sender in
226-
let? payload:a = decrypt_message #a sk_receiver payload_enc in
228+
let? plaintext = pke_dec sk_receiver payload_enc in
229+
let? payload = parse #bytes (encryption_input a) plaintext in
230+
guard (Signed? payload);?
231+
let Signed payload = payload in
227232
let? sender = get_sender #a msg_encrypted_signed in
228233
Some {sender; receiver; payload}
229234

@@ -238,8 +243,7 @@ let receive_confidential_authenticated #a comm_keys_ids receiver msg_id =
238243
let*? sk_receiver = get_private_key receiver comm_keys_ids.private_keys (LongTermPkeKey (comm_layer_pkenc_tag a)) in
239244
let*? sender = return (get_sender #a msg_encrypted_signed) in
240245
let*? vk_sender = get_public_key receiver comm_keys_ids.pki (LongTermSigKey (comm_layer_sign_tag a)) sender in
241-
let*? cm:communication_message a = return (verify_and_decrypt_message #a receiver sk_receiver vk_sender msg_encrypted_signed) in
242-
trigger_event receiver (CommConfReceiveMsg receiver cm.payload <: communication_core_event a);*
246+
let*? cm:communication_message a = return (verify_and_decrypt_message #a receiver sk_receiver vk_sender msg_encrypted_signed) in
243247
trigger_event receiver (CommConfAuthReceiveMsg sender receiver cm.payload <: communication_core_event a);*
244248
return (Some cm)
245249

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@ type communication_message (a:Type) = {
2727
payload:a;
2828
}
2929

30+
[@@with_bytes bytes]
31+
type encryption_input (a:Type) {|config:comm_layer_core_config a|} =
32+
| Unsigned: [@@@ with_parser #bytes config.core_ps_a] payload:a -> encryption_input a
33+
| Signed: [@@@ with_parser #bytes config.core_ps_a] payload:a -> encryption_input a
34+
35+
#push-options "--ifuel 1 --fuel 0"
36+
%splice [ps_encryption_input] (gen_parser (`encryption_input))
37+
%splice [ps_encryption_input_is_well_formed] (gen_is_well_formed_lemma (`encryption_input))
38+
#pop-options
39+
40+
instance parseable_serializeable_bytes_encryption_input (#a:Type) {|config:comm_layer_core_config a|}: parseable_serializeable bytes (encryption_input a)
41+
= mk_parseable_serializeable (ps_encryption_input a)
42+
3043
[@@with_bytes bytes]
3144
type signature_input (a:Type) {|config:comm_layer_core_config a|} =
3245
| Plain: sender:principal -> receiver:principal -> [@@@ with_parser #bytes config.core_ps_a] payload:a -> signature_input a

0 commit comments

Comments
 (0)