@@ -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
98100val 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
176191val 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 )
474488let 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 );
0 commit comments