@@ -28,13 +28,18 @@ static SerialisedProtobufContentWithProForTesting build_protobuf_content_with_se
2828 std::string_view data_body,
2929 const array_uc64& user_rotating_privkey,
3030 const array_uc64& pro_backend_privkey,
31+ std::chrono::sys_seconds content_unix_ts,
3132 std::chrono::sys_seconds pro_expiry_unix_ts,
3233 session_protocol_pro_message_bitset msg_bitset,
3334 session_protocol_pro_profile_bitset profile_bitset) {
3435 SerialisedProtobufContentWithProForTesting result = {};
3536
3637 // Create protobuf `Content.dataMessage`
3738 SessionProtos::Content content = {};
39+ content.set_sigtimestamp (std::chrono::duration_cast<std::chrono::milliseconds>(
40+ content_unix_ts.time_since_epoch ())
41+ .count ());
42+
3843 SessionProtos::DataMessage* data = content.mutable_datamessage ();
3944 data->set_body (std::string (data_body));
4045
@@ -234,6 +239,8 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
234239 std::string plaintext;
235240 {
236241 SessionProtos::Content content = {};
242+ content.set_sigtimestamp (timestamp_ms.time_since_epoch ().count ());
243+
237244 SessionProtos::DataMessage* data = content.mutable_datamessage ();
238245 data->set_body (std::string (data_body));
239246 plaintext = content.SerializeAsString ();
@@ -268,7 +275,6 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
268275 &decrypt_keys,
269276 encrypt_result.ciphertext .data ,
270277 encrypt_result.ciphertext .size ,
271- timestamp_ms.time_since_epoch ().count (),
272278 pro_backend_ed_pk.data (),
273279 pro_backend_ed_pk.size (),
274280 error,
@@ -309,6 +315,7 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
309315 /* data_body*/ data_body,
310316 /* user_rotating_privkey*/ user_pro_ed_sk,
311317 /* pro_backend_privkey*/ pro_backend_ed_sk,
318+ /* content_unix_ts=*/ timestamp_s,
312319 /* pro_expiry_unix_ts*/ timestamp_s,
313320 /* msg_bitset*/ {},
314321 /* profile_bitset*/ {});
@@ -388,7 +395,6 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
388395 &decrypt_keys,
389396 encrypt_result.ciphertext .data ,
390397 encrypt_result.ciphertext .size ,
391- timestamp_ms.time_since_epoch ().count (),
392398 pro_backend_ed_pk.data (),
393399 pro_backend_ed_pk.size (),
394400 error,
@@ -434,6 +440,7 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
434440 /* data_body*/ large_message,
435441 /* user_rotating_privkey*/ user_pro_ed_sk,
436442 /* pro_backend_privkey*/ pro_backend_ed_sk,
443+ /* content_unix_ts*/ timestamp_s,
437444 /* pro_expiry_unix_ts*/ timestamp_s,
438445 /* msg_bitset*/ pro_msg.bitset ,
439446 /* proilfe_bitset*/ profile_bitset);
@@ -462,7 +469,6 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
462469 &decrypt_keys,
463470 encrypt_result.ciphertext .data ,
464471 encrypt_result.ciphertext .size ,
465- timestamp_ms.time_since_epoch ().count (),
466472 pro_backend_ed_pk.data (),
467473 pro_backend_ed_pk.size (),
468474 error,
@@ -565,7 +571,6 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
565571 &decrypt_keys,
566572 encrypt_result.ciphertext .data ,
567573 encrypt_result.ciphertext .size ,
568- timestamp_ms.time_since_epoch ().count (),
569574 pro_backend_ed_pk.data (),
570575 pro_backend_ed_pk.size (),
571576 error,
@@ -609,7 +614,6 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
609614 &decrypt_keys,
610615 encrypt_result.ciphertext .data ,
611616 encrypt_result.ciphertext .size ,
612- timestamp_ms.time_since_epoch ().count (),
613617 pro_backend_ed_pk.data (),
614618 pro_backend_ed_pk.size (),
615619 error,
@@ -639,11 +643,44 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
639643
640644 // Try decrypt with a timestamp past the pro proof expiry date
641645 {
646+ // Build protobuf `Content` message, serialise to `plaintext` and get it signed by the
647+ // user's "Session Pro" key into `sig_over_plaintext_with_user_pro_key`
648+ std::chrono::milliseconds bad_timestamp_ms =
649+ std::chrono::duration_cast<std::chrono::milliseconds>(
650+ protobuf_content.proof .expiry_unix_ts .time_since_epoch ()) +
651+ std::chrono::seconds (1 );
652+
653+ SerialisedProtobufContentWithProForTesting bad_protobuf_content =
654+ build_protobuf_content_with_session_pro (
655+ /* data_body*/ data_body,
656+ /* user_rotating_privkey*/ user_pro_ed_sk,
657+ /* pro_backend_privkey*/ pro_backend_ed_sk,
658+ /* content_unix_ts=*/
659+ std::chrono::sys_seconds (
660+ std::chrono::duration_cast<std::chrono::seconds>(
661+ bad_timestamp_ms)),
662+ /* pro_expiry_unix_ts*/ timestamp_s,
663+ /* msg_bitset*/ {},
664+ /* profile_bitset*/ {});
665+
666+ session_protocol_encoded_for_destination encrypt_bad_result =
667+ session_protocol_encode_for_1o1 (
668+ bad_protobuf_content.plaintext .data (),
669+ bad_protobuf_content.plaintext .size (),
670+ keys.ed_sk0 .data (),
671+ keys.ed_sk0 .size (),
672+ bad_timestamp_ms.count (),
673+ &base_dest.recipient_pubkey ,
674+ user_pro_ed_sk.data (),
675+ user_pro_ed_sk.size (),
676+ error,
677+ sizeof (error));
678+ REQUIRE (encrypt_bad_result.error_len_incl_null_terminator == 0 );
679+
642680 session_protocol_decoded_envelope decrypt_result = session_protocol_decode_envelope (
643681 &decrypt_keys,
644- encrypt_result.ciphertext .data ,
645- encrypt_result.ciphertext .size ,
646- protobuf_content.proof .expiry_unix_ts .time_since_epoch ().count () + 1 ,
682+ encrypt_bad_result.ciphertext .data ,
683+ encrypt_bad_result.ciphertext .size ,
647684 pro_backend_ed_pk.data (),
648685 pro_backend_ed_pk.size (),
649686 error,
@@ -662,7 +699,6 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
662699 &decrypt_keys,
663700 encrypt_result.ciphertext .data ,
664701 encrypt_result.ciphertext .size ,
665- protobuf_content.proof .expiry_unix_ts .time_since_epoch ().count (),
666702 bad_pro_backend_ed_pk.data (),
667703 bad_pro_backend_ed_pk.size (),
668704 error,
@@ -684,7 +720,6 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
684720 &bad_decrypt_keys,
685721 encrypt_result.ciphertext .data ,
686722 encrypt_result.ciphertext .size ,
687- protobuf_content.proof .expiry_unix_ts .time_since_epoch ().count (),
688723 pro_backend_ed_pk.data (),
689724 pro_backend_ed_pk.size (),
690725 error,
@@ -707,9 +742,6 @@ TEST_CASE("Session protocol helpers C API", "[session-protocol][helpers]") {
707742 &multi_decrypt_keys,
708743 encrypt_result.ciphertext .data ,
709744 encrypt_result.ciphertext .size ,
710- std::chrono::duration_cast<std::chrono::seconds>(
711- protobuf_content.proof .expiry_unix_ts .time_since_epoch ())
712- .count (),
713745 pro_backend_ed_pk.data (),
714746 pro_backend_ed_pk.size (),
715747 error,
0 commit comments