Skip to content

Commit

Permalink
Implement de/serialization tests for shamir errors.
Browse files Browse the repository at this point in the history
  • Loading branch information
AureliaDolo committed Jun 6, 2024
1 parent c8956e6 commit 87058bd
Show file tree
Hide file tree
Showing 3 changed files with 165 additions and 44 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions libparsec/crates/protocol/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ futures = { workspace = true, features = ["std", "async-await", "executor"] }
bytes = { workspace = true, features = ["serde"] }

[dev-dependencies]
hex = { workspace = true }
libparsec_tests_lite = { workspace = true }
libparsec_tests_fixtures = { workspace = true }
serde_json = { workspace = true, features = ["std"] }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,68 +3,187 @@

use libparsec_protocol::authenticated_cmds::v4::shamir_recovery_setup::ShamirRecoverySetup;
use libparsec_tests_lite::prelude::*;
use libparsec_types::ShamirRevealToken;
use libparsec_types::{DateTime, ShamirRevealToken};

use super::authenticated_cmds;

macro_rules! test_de_serialization {
($encoded:literal, $expected:path, $load:path) => {
let raw = hex!($encoded);
let data = $load(&raw).unwrap();
p_assert_eq!(
data,
$expected,
"Expected hex is:\n\"{}\"",
encode_and_format_with_70_width($expected.dump().unwrap())
);

// Also test serialization round trip
let raw2 = data.dump().unwrap();
let data2 = $load(&raw2).unwrap();
p_assert_eq!(data2, $expected);
};
}

fn encode_and_format_with_70_width<T: AsRef<[u8]>>(data: T) -> String {
hex::encode(data)
.as_bytes()
.chunks(70)
.map(std::str::from_utf8)
.collect::<Result<Vec<&str>, _>>()
.unwrap()
.join(" \\\n")
}

pub fn rep_shamir_setup_already_exists() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-05-29)
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-06-06)
// Content:
// "status": "shamir_setup_already_exist"
let raw = hex!("81a6737461747573bb7368616d69725f73657475705f616c72656164795f657869737473");
let expected = authenticated_cmds::shamir_recovery_setup::Rep::ShamirSetupAlreadyExists;
let data = authenticated_cmds::shamir_recovery_setup::Rep::load(&raw).unwrap();
p_assert_eq!(data, expected);

// Also test serialization round trip
let raw2 = data.dump().unwrap();
let data2 = authenticated_cmds::shamir_recovery_setup::Rep::load(&raw2).unwrap();
p_assert_eq!(data2, expected);
test_de_serialization!(
"81a6737461747573bb7368616d69725f73657475705f616c72656164795f6578697374 \
73",
authenticated_cmds::shamir_recovery_setup::Rep::ShamirSetupAlreadyExists,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}

pub fn rep_invalid_certificate() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-05-29)
pub fn rep_brief_invalid_data() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-06-06)
// Content:
// "status": "invalid_certificate"
let raw = hex!("81a6737461747573b3696e76616c69645f6365727469666963617465");
let expected = authenticated_cmds::shamir_recovery_setup::Rep::InvalidCertificate;
let data = authenticated_cmds::shamir_recovery_setup::Rep::load(&raw).unwrap();
p_assert_eq!(data, expected);

// Also test serialization round trip
let raw2 = data.dump().unwrap();
let data2 = authenticated_cmds::shamir_recovery_setup::Rep::load(&raw2).unwrap();
p_assert_eq!(data2, expected);
// "status": "brief_invalid_data"
test_de_serialization!(
"81a6737461747573b262726965665f696e76616c69645f64617461",
authenticated_cmds::shamir_recovery_setup::Rep::BriefInvalidData,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}

pub fn rep_invalid_data() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-05-29)
pub fn rep_share_invalid_data() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-06-06)
// Content:
// "status": "invalid_data"
let raw = hex!("81a6737461747573ac696e76616c69645f64617461");
let expected = authenticated_cmds::shamir_recovery_setup::Rep::InvalidData;
let data = authenticated_cmds::shamir_recovery_setup::Rep::load(&raw).unwrap();
p_assert_eq!(data, expected);
// "status": "share_invalid_data"
test_de_serialization!(
"81a6737461747573b273686172655f696e76616c69645f64617461",
authenticated_cmds::shamir_recovery_setup::Rep::ShareInvalidData,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}
pub fn rep_invalid_recipient() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-06-06)
// Content:
// "status": "invalid_recipient"
test_de_serialization!(
"81a6737461747573b1696e76616c69645f726563697069656e74",
authenticated_cmds::shamir_recovery_setup::Rep::InvalidRecipient,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}
pub fn rep_share_recipient_not_in_brief() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-06-06)
// Content:
// "status": "share_recipient_not_in_brief"
test_de_serialization!(
"81a6737461747573bc73686172655f726563697069656e745f6e6f745f696e5f627269 \
6566",
authenticated_cmds::shamir_recovery_setup::Rep::ShareRecipientNotInBrief,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}
pub fn rep_duplicate_share_for_recipient() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-06-06)
// Content:
// "status": "duplicate_share_for_recipient"
test_de_serialization!(
"81a6737461747573bd6475706c69636174655f73686172655f666f725f726563697069 \
656e74",
authenticated_cmds::shamir_recovery_setup::Rep::DuplicateShareForRecipient,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}
pub fn rep_author_included_as_recipient() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-06-06)
// Content:
// "status": "author_included_as_recipient"
test_de_serialization!(
"81a6737461747573bc617574686f725f696e636c756465645f61735f72656369706965 \
6e74",
authenticated_cmds::shamir_recovery_setup::Rep::AuthorIncludedAsRecipient,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}
pub fn rep_missing_share_for_recipient() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-06-06)
// Content:
// "status": "missing_share_for_recipient"
test_de_serialization!(
"81a6737461747573bb6d697373696e675f73686172655f666f725f726563697069656e \
74",
authenticated_cmds::shamir_recovery_setup::Rep::MissingShareForRecipient,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}
pub fn rep_threshold_greater_than_total_shares() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-06-06)
// Content:
// "status": "threshold_greater_than_total_shares"
test_de_serialization!(
"81a6737461747573d9237468726573686f6c645f677265617465725f7468616e5f746f \
74616c5f736861726573",
authenticated_cmds::shamir_recovery_setup::Rep::ThresholdGreaterThanTotalShares,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}
pub fn rep_timestamp_out_of_ballpark() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-06-06)
// Content:
// "status": "timestamp_out_of_ballpark"
// "ballpark_client_early_offset": 32.0
// "ballpark_client_late_offset": 32.0
// "client_timestamp": "2009-02-13T23:31:30Z"
// "server_timestamp": "2009-02-13T23:31:30Z"

// Also test serialization round trip
let raw2 = data.dump().unwrap();
let data2 = authenticated_cmds::shamir_recovery_setup::Rep::load(&raw2).unwrap();
p_assert_eq!(data2, expected);
let dt = DateTime::from_f64_with_us_precision(1234567890.);
let req = authenticated_cmds::shamir_recovery_setup::Rep::TimestampOutOfBallpark {
ballpark_client_early_offset: 32.,
ballpark_client_late_offset: 32.,
client_timestamp: dt,
server_timestamp: dt,
};
test_de_serialization!(
"85a6737461747573b974696d657374616d705f6f75745f6f665f62616c6c7061726bbc \
62616c6c7061726b5f636c69656e745f6561726c795f6f6666736574cb404000000000 \
0000bb62616c6c7061726b5f636c69656e745f6c6174655f6f6666736574cb40400000 \
00000000b0636c69656e745f74696d657374616d70d70141d26580b4800000b0736572 \
7665725f74696d657374616d70d70141d26580b4800000",
req,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}
pub fn rep_require_greater_timestamp() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-06-06)
// Content:
// "status": "require_greater_timestamp"
// "strictly_greater_than": "2009-02-13T23:31:30Z"
//
let req = authenticated_cmds::shamir_recovery_setup::Rep::RequireGreaterTimestamp {
strictly_greater_than: DateTime::from_f64_with_us_precision(1234567890.),
};
test_de_serialization!(
"82a6737461747573b9726571756972655f677265617465725f74696d657374616d70b5 \
7374726963746c795f677265617465725f7468616ed70141d26580b4800000",
req,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}

pub fn rep_ok() {
// Generated from Rust implementation (Parsec v3.0.0-b.6+dev 2024-05-29)
// Content:
// "status": "ok"
let raw = hex!("81a6737461747573a26f6b");
let expected = authenticated_cmds::shamir_recovery_setup::Rep::Ok;
let data = authenticated_cmds::shamir_recovery_setup::Rep::load(&raw).unwrap();
p_assert_eq!(data, expected);

// Also test serialization round trip
let raw2 = data.dump().unwrap();
let data2 = authenticated_cmds::shamir_recovery_setup::Rep::load(&raw2).unwrap();
p_assert_eq!(data2, expected);
test_de_serialization!(
"81a6737461747573a26f6b",
authenticated_cmds::shamir_recovery_setup::Rep::Ok,
authenticated_cmds::shamir_recovery_setup::Rep::load
);
}

pub fn req() {
Expand Down

0 comments on commit 87058bd

Please sign in to comment.