Skip to content

fix: cherry picks from closed PR on multiple signing keys - MPC context in custodian backup #509

Merged
jot2re merged 58 commits intomainfrom
tore/fix/signing-key-cherry-picks
Apr 17, 2026
Merged

fix: cherry picks from closed PR on multiple signing keys - MPC context in custodian backup #509
jot2re merged 58 commits intomainfrom
tore/fix/signing-key-cherry-picks

Conversation

@jot2re
Copy link
Copy Markdown
Collaborator

@jot2re jot2re commented Apr 8, 2026

Description of changes

This PR cherry picks changes from this PR (where we wanted to implement support for multiple signing keys). More specifically the following changes and enhancements and carried over into this PR:

  • Updates to client validation in user decryption to properly ensure respones are ok, and not accept multiple responses signed by the same KMS.
  • Changes to backup to ensure the MPC context is part of a backup, s.t. we can know which verification keys to use in case of a backup recovery when the context has changed. This also means that the MPC context must exist when constructing a custodian context and the existence is validated.
  • SessionMaker now loads all MPC contexts on init, ensuring that the default context is properly loaded.
  • Backwards compatibility tests have been updated: 1. the 0.13.10 has been changed to use the correct tag, 2. a draft for 0.13.20 has been made. 3. Older 0.13.x versions has been changed to not check custodian backup formats. The reason being they are now changed (added MPC context) but a upgrade path has not been implemented (since custodian backup is not currently used). This was the simplest way to ensure the backwards tests kept working.
  • Smaller refactorings, in particular of S3 helper methods.
  • Other minor refactorings

Issue ticket number and link

PR Checklist

I attest that all checked items are satisfied. Any deviation is clearly justified above.

  • Title follows conventional commits (e.g. chore: ...).
  • Tests added for every new pub item and test coverage has not decreased.
  • Public APIs and non-obvious logic documented; unfinished work marked as TODO(#issue).
  • unwrap/expect/panic only in tests or for invariant bugs (documented if present).
  • No dependency version changes OR (if changed) only minimal required fixes.
  • No architectural protocol changes OR linked spec PR/issue provided.
  • No breaking deployment config changes OR devops label + infra notified + infra-team reviewer assigned.
  • [] No breaking gRPC / serialized data changes OR commit marked with ! and affected teams notified.
  • Note changes has been made related to custodian backup, however this is not in use yet, hence not breaking.
  • No modifications to existing versionized structs OR backward compatibility tests updated.
  • No critical business logic / crypto changes OR ≥2 reviewers assigned.
  • No new sensitive data fields added OR Zeroize + ZeroizeOnDrop implemented.
  • No new public storage data OR data is verifiable (signature / digest).
  • No unsafe; if unavoidable: minimal, justified, documented, and test/fuzz covered.
  • Strongly typed boundaries: typed inputs validated at the edge; no untyped values or errors cross modules.
  • Self-review completed.

Dependency Update Questionnaire (only if deps changed or added)

Answer in the Cargo.toml next to the dependency (or here if updating):

  1. Ownership changes or suspicious concentration?
  2. Low popularity?
  3. Unusual version jump?
  4. Lacking documentation?
  5. Missing CI?
  6. No security / disclosure policy?
  7. Significant size increase?

More details and explanations for the checklist and dependency updates can be found in CONTRIBUTING.md

@cla-bot cla-bot Bot added the cla-signed The CLA has been signed. label Apr 8, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 8, 2026

Consolidated Tests Results 2026-04-16 - 17:33:29

Test Results

passed 1092 passed
alert 1 flaky

Details

tests 1092 tests
clock not captured
tool junit-to-ctrf
build main arrow-right test-reporter link #4006
pull-request fix: cherry picks from closed PR on multiple signing keys - MPC context in custodian backup link #509

Flaky Tests

client::tests::threshold::public_decryption_tests::test_decryption_threshold::case_1

test-reporter: Run #4006

Tests 📝 Passed ✅ Failed ❌ Skipped ⏭️ Pending ⏳ Other ❓ Flaky 🍂 Duration ⏱️
1092 1092 0 0 0 0 1 not captured

🎉 All tests passed!

Tests

View All Tests
Test Name Status Flaky Duration
backup::custodian::tests::invalid_threshold_should_fail 6ms
client::tests::testing_infra_tests::test_threshold_material_validation 6ms
client::tests::threshold::crs_gen_tests::secure_threshold_crs 8m 16s
client::tests::threshold::crs_gen_tests::test_crs_gen_threshold 1m 1s
client::tests::threshold::crs_gen_tests::test_insecure_crs_gen_threshold 59.1s
client::tests::threshold::custodian_backup_tests::test_auto_update_backups_threshold::case_1 5.0s
client::tests::threshold::custodian_backup_tests::test_auto_update_backups_threshold::case_2 5.0s
client::tests::threshold::custodian_backup_tests::test_backup_after_crs_threshold::case_1 43.9s
client::tests::threshold::custodian_backup_tests::test_backup_after_crs_threshold::case_2 44.0s
client::tests::threshold::custodian_backup_tests::test_decrypt_after_recovery_threshold::case_1 11.1s
client::tests::threshold::custodian_backup_tests::test_decrypt_after_recovery_threshold::case_2 11.1s
client::tests::threshold::custodian_backup_tests::test_decrypt_after_recovery_threshold_negative 4.6s
client::tests::threshold::custodian_context_tests::test_new_custodian_context_threshold::case_1 8.2s
client::tests::threshold::custodian_context_tests::test_new_custodian_context_threshold::case_2 8.2s
client::tests::threshold::key_gen_tests::default_insecure_dkg::case_1 1m 57s
client::tests::threshold::key_gen_tests::secure_threshold_compressed_keygen_test 6m 15s
client::tests::threshold::key_gen_tests::secure_threshold_keygen_test 6m 4s
client::tests::threshold::key_gen_tests::secure_threshold_keygen_test_crash_online 6m 4s
client::tests::threshold::key_gen_tests::secure_threshold_keygen_test_crash_preprocessing 5m 13s
client::tests::threshold::key_gen_tests::test_insecure_compressed_dkg::case_1 34.2s
client::tests::threshold::key_gen_tests::test_insecure_dkg::case_1 34.2s
client::tests::threshold::key_gen_tests::test_insecure_threshold_decompression_keygen 5m 30s
client::tests::threshold::key_gen_tests_isolated::default_insecure_dkg_isolated 3m 25s
client::tests::threshold::key_gen_tests_isolated::secure_threshold_compressed_keygen_from_existing_isolated 11m 36s
client::tests::threshold::key_gen_tests_isolated::secure_threshold_keygen_crash_online_isolated 5m 23s
client::tests::threshold::key_gen_tests_isolated::secure_threshold_keygen_crash_preprocessing_isolated 4m 36s
client::tests::threshold::key_gen_tests_isolated::secure_threshold_keygen_isolated 5m 29s
client::tests::threshold::key_gen_tests_isolated::test_insecure_dkg_isolated 5.1s
client::tests::threshold::key_gen_tests_isolated::test_insecure_threshold_decompression_keygen_isolated 2m 13s
client::tests::threshold::misc_tests::test_ratelimiter 30.6s
client::tests::threshold::misc_tests::test_threshold_close_after_drop 31.0s
client::tests::threshold::misc_tests::test_threshold_health_endpoint_availability 35.3s
client::tests::threshold::misc_tests::test_threshold_shutdown 32.2s
client::tests::threshold::misc_tests_isolated::test_ratelimiter_isolated 179ms
client::tests::threshold::misc_tests_isolated::test_threshold_close_after_drop_isolated 966ms
client::tests::threshold::misc_tests_isolated::test_threshold_health_endpoint_availability_isolated 4.6s
client::tests::threshold::misc_tests_isolated::test_threshold_shutdown_isolated 1.8s
client::tests::threshold::mpc_context_tests::test_context_switch_4p 34.9s
client::tests::threshold::mpc_epoch_tests::test_new_epoch_with_reshare 18m 11s
client::tests::threshold::public_decryption_tests::default_decryption_threshold::case_1 38.0s
client::tests::threshold::public_decryption_tests::default_decryption_threshold_precompute_sns::case_1::compression_1_true 35.4s
client::tests::threshold::public_decryption_tests::default_decryption_threshold_precompute_sns::case_1::compression_2_false 35.3s
client::tests::threshold::public_decryption_tests::default_decryption_threshold_with_crash::case_1 35.6s
client::tests::threshold::public_decryption_tests::test_decryption_threshold::case_1 🍂 59.6s
client::tests::threshold::public_decryption_tests::test_decryption_threshold::case_2 36.8s
client::tests::threshold::public_decryption_tests::test_decryption_threshold::case_3 36.9s
client::tests::threshold::public_decryption_tests::test_decryption_threshold_no_decompression::case_1 53.0s
client::tests::threshold::public_decryption_tests::test_decryption_threshold_no_decompression::case_2 33.4s
client::tests::threshold::public_decryption_tests::test_decryption_threshold_no_decompression::case_3 33.3s
client::tests::threshold::public_decryption_tests::test_decryption_threshold_precompute_sns::case_1::compression_1_true 36.4s
client::tests::threshold::public_decryption_tests::test_decryption_threshold_precompute_sns::case_1::compression_2_false 36.7s
client::tests::threshold::restore_from_backup_tests::test_insecure_threshold_crs_backup 1m 22s
client::tests::threshold::restore_from_backup_tests_isolated::test_insecure_threshold_crs_backup_isolated 14.5s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_1 5m 55s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_2 23.5s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_3 25.8s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_4 25.8s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_5 29.1s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_6 27.0s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_7 27.9s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_all_malicious_failure 24.5s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_malicious::case_1 25.9s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_malicious::case_2 25.8s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_malicious_failure 26.0s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_precompute_sns::case_1 26.0s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_precompute_sns::case_2 25.9s
conf::tests::test_threshold_config 7ms
conf::tests::test_threshold_config_negative 6ms
conf::threshold::test_pem_serialization 5ms
engine::migration::tests::s3_tests::test_0_13_x_to_0_13_10_threshold_s3 52ms
engine::migration::tests::s3_tests::test_after_0_13_x_threshold_s3 37ms
engine::migration::tests::s3_tests::test_migrate_threshold_s3 39ms
engine::migration::tests::s3_tests::test_remove_old_keys_threshold_s3 37ms
engine::migration::tests::test_0_13_x_to_0_13_10_threshold_file 6ms
engine::migration::tests::test_0_13_x_to_0_13_10_threshold_ram 5ms
engine::migration::tests::test_after_0_13_x_threshold_file 5ms
engine::migration::tests::test_after_0_13_x_threshold_ram 4ms
engine::migration::tests::test_migrate_threshold_file 6ms
engine::migration::tests::test_migrate_threshold_ram 4ms
engine::migration::tests::test_migrate_to_0_13_10_threshold 5ms
engine::migration::tests::test_migrate_to_0_13_x_threshold 5ms
engine::migration::tests::test_remove_old_keys_threshold_file 6ms
engine::migration::tests::test_remove_old_keys_threshold_ram 4ms
engine::threshold::service::crs_generator::tests::already_exists 5ms
engine::threshold::service::crs_generator::tests::internal_failure 6ms
engine::threshold::service::crs_generator::tests::invalid_argument 5ms
engine::threshold::service::crs_generator::tests::not_found 5ms
engine::threshold::service::crs_generator::tests::resource_exhausted 5ms
engine::threshold::service::crs_generator::tests::sunshine 46ms
engine::threshold::service::crs_generator::tests::unavailable 1m
engine::threshold::service::epoch_manager::tests::already_exists 7ms
engine::threshold::service::epoch_manager::tests::invalid_argument 6ms
engine::threshold::service::epoch_manager::tests::load_all_prss 5ms
engine::threshold::service::epoch_manager::tests::not_found 6ms
engine::threshold::service::epoch_manager::tests::prss_from_storage_test 2m 33s
engine::threshold::service::epoch_manager::tests::sunshine 7ms
engine::threshold::service::epoch_manager::tests::test_destroy_epoch_not_found 6ms
engine::threshold::service::epoch_manager::tests::test_destroy_epoch_success 6ms
engine::threshold::service::epoch_manager::tests::test_resource_exhausted 6ms
engine::threshold::service::epoch_manager::tests::test_verify_epoch_info 5ms
engine::threshold::service::key_generator::tests::aborted 4ms
engine::threshold::service::key_generator::tests::already_exists 6ms
engine::threshold::service::key_generator::tests::internal 6ms
engine::threshold::service::key_generator::tests::invalid_argument 5ms
engine::threshold::service::key_generator::tests::not_found 5ms
engine::threshold::service::key_generator::tests::resource_exhausted 6ms
engine::threshold::service::key_generator::tests::sunshine 97ms
engine::threshold::service::key_generator::tests::use_existing_key_tag_with_wrong_keyset_id 8ms
engine::threshold::service::preprocessor::tests::already_exists 7ms
engine::threshold::service::preprocessor::tests::internal 7ms
engine::threshold::service::preprocessor::tests::invalid_argument 6ms
engine::threshold::service::preprocessor::tests::not_found 6ms
engine::threshold::service::preprocessor::tests::resource_exhausted 5ms
engine::threshold::service::preprocessor::tests::sunshine 818ms
engine::threshold::service::public_decryptor::tests::already_exists 78ms
engine::threshold::service::public_decryptor::tests::invalid_argument 79ms
engine::threshold::service::public_decryptor::tests::not_found 227ms
engine::threshold::service::public_decryptor::tests::sunshine 82ms
engine::threshold::service::public_decryptor::tests::test_resource_exhausted 79ms
engine::threshold::service::reshare_utils::tests::bad_digests_get_verified_public_materials 153ms
engine::threshold::service::reshare_utils::tests::bad_digests_get_verified_public_materials_compressed 221ms
engine::threshold::service::reshare_utils::tests::empty_storage_fetch_public_materials_from_peers 157ms
engine::threshold::service::reshare_utils::tests::sunshine_fetch_public_materials_from_peers 154ms
engine::threshold::service::reshare_utils::tests::sunshine_fetch_public_materials_from_peers_compressed 94ms
engine::threshold::service::reshare_utils::tests::sunshine_get_verified_public_materials 11ms
engine::threshold::service::reshare_utils::tests::sunshine_get_verified_public_materials_compressed 90ms
engine::threshold::service::reshare_utils::tests::test_split_url 6ms
engine::threshold::service::reshare_utils::tests::wrong_digest_fetch_public_materials_from_peers 16ms
engine::threshold::service::reshare_utils::tests::wrong_digest_fetch_public_materials_from_peers_compressed 90ms
engine::threshold::service::user_decryptor::tests::already_exists 78ms
engine::threshold::service::user_decryptor::tests::invalid_argument 79ms
engine::threshold::service::user_decryptor::tests::not_found 224ms
engine::threshold::service::user_decryptor::tests::resource_exhausted 76ms
engine::threshold::service::user_decryptor::tests::sunshine 80ms
testing::material::manager::tests::test_setup_threshold_material 22ms
testing::material::spec::tests::test_threshold_basic_spec 5ms
testing::material::spec::tests::test_threshold_default_no_prss_spec 5ms
testing::material::spec::tests::test_threshold_default_spec_requires_prss 5ms
vault::storage::crypto_material::tests::read_guarded_threshold_fhe_keys_not_found 5ms
vault::storage::crypto_material::tests::write_threshold_compressed_empty_update_cleans_up 158ms
vault::storage::crypto_material::tests::write_threshold_empty_update 73ms
vault::storage::crypto_material::tests::write_threshold_keys_failed_storage 72ms
vault::storage::crypto_material::tests::write_threshold_keys_meta_update 72ms
vault::storage::file::tests::storage_helper_methods::threshold_1_true 12ms
vault::storage::file::tests::storage_helper_methods::threshold_2_false 11ms
test_backward_compatibility_threshold_fhe 116ms
kms_gen_keys_binary_test::gen_key_tempdir_threshold 607ms
kms_gen_keys_binary_test::gen_key_threshold 3.4s
kms_gen_keys_binary_test::threshold_signing_key 50ms
kms_gen_keys_binary_test::threshold_signing_key_wrong_party_id 157ms
kms_gen_keys_binary_test::threshold_wrong_num_parties 126ms
kms_server_binary_test::subcommand_dev_threshold 5.8s
config_conformance_client_local_threshold 6ms
test_threshold_custodian_backup 1.1s
test_threshold_insecure_compressed_keygen 1.1s
test_threshold_restore_from_backup 1.3s
test_threshold_mpc_context_switch 1.6s
test_threshold_mpc_context_init 8m 16s
test_threshold_reshare 9m 8s
test_threshold_concurrent_preproc_keygen 13m 20s
test_threshold_compressed_preproc_keygen 16m 41s
test_threshold_insecure 20m 6s
test_threshold_mpc_context_switch_6 22m 54s
test_threshold_compressed_keygen_from_existing 29m 54s
test_threshold_compressed_preproc_keygen 11m 59s
test_threshold_concurrent_crs 1m 34s
test_threshold_concurrent_preproc_keygen 7m 56s
test_threshold_custodian_backup 1m
test_threshold_insecure 6m 9s
test_threshold_insecure_compressed_keygen 8m 48s
test_threshold_mpc_context_init 6m 24s
test_threshold_mpc_context_switch 57.6s
test_threshold_mpc_context_switch_6 6m 18s
test_threshold_reshare 6m 49s
test_threshold_restore_from_backup 56.4s
backup::custodian::tests::internal_custodian_context_duplicate_role_should_fail 6ms
backup::custodian::tests::internal_custodian_context_role_greater_than_nodes_should_fail 5ms
backup::custodian::tests::internal_custodian_context_zero_role_should_fail 5ms
backup::operator::tests::operator_new_fails_with_bad_n_t 4ms
backup::operator::tests::operator_new_fails_with_duplicate_roles 5ms
backup::operator::tests::operator_new_fails_with_insufficient_messages 5ms
backup::operator::tests::operator_new_fails_with_invalid_header 4ms
backup::operator::tests::operator_new_fails_with_invalid_role 4ms
backup::operator::tests::operator_new_fails_with_invalid_timestamp_future 4ms
backup::operator::tests::operator_new_fails_with_invalid_timestamp_past 4ms
backup::operator::tests::operator_new_fails_with_not_enough 4ms
backup::operator::tests::operator_new_fails_with_zero_n 4ms
backup::operator::tests::operator_new_fails_with_zero_t 4ms
backup::operator::tests::operator_timestamp_validation 4ms
backup::operator::tests::validate_recovery_validation_material 5ms
backup::secretsharing::pkcs7::tests::padding_sunshine 4ms
backup::secretsharing::pkcs7::tests::padding_wrong_data 4ms
backup::secretsharing::tests::sharing_missing_shares 100ms
backup::secretsharing::tests::sharing_no_error 154ms
backup::secretsharing::tests::sharing_randomness_test 14.9s
backup::secretsharing::tests::sharing_too_many_missing_shares 11ms
backup::secretsharing::tests::sharing_wrong_params 5ms
backup::secretsharing::tests::sharing_wrong_shares 12ms
backup::seed_phrase::tests::difference 4ms
backup::seed_phrase::tests::mnemonic_robustness 5ms
backup::seed_phrase::tests::sunshine 4ms
backup::tests::custodian_reencrypt 8ms
backup::tests::full_flow::case_1 45ms
backup::tests::full_flow::case_2 30ms
backup::tests::full_flow::case_3 84ms
backup::tests::full_flow_drop_msg 34ms
backup::tests::full_flow_malicious_custodian_init 9ms
backup::tests::full_flow_malicious_custodian_not_enough 112ms
backup::tests::full_flow_malicious_custodian_second 62ms
backup::tests::full_flow_malicious_operator 31ms
backup::tests::operator_setup 7ms
client::crs_gen::tests::process_distributed_crs_result_invalid_signature_does_not_insert_key 8.7s
client::crs_gen::tests::verify_pp_with_tfhers 12.9s
client::tests::centralized::crs_gen_tests::test_crs_gen_centralized 6m 41s
client::tests::centralized::crs_gen_tests::test_crs_gen_manual 11.4s
client::tests::centralized::crs_gen_tests::test_insecure_crs_gen_centralized 15.7s
client::tests::centralized::custodian_backup_tests::test_auto_update_backups_central 4.7s
client::tests::centralized::custodian_backup_tests::test_backup_after_crs_central 8.7s
client::tests::centralized::custodian_backup_tests::test_decrypt_after_recovery_central 5.8s
client::tests::centralized::custodian_backup_tests::test_decrypt_after_recovery_centralized_negative 4.5s
client::tests::centralized::custodian_context_tests::test_new_custodian_context_central 4.3s
client::tests::centralized::key_gen_tests::default_decompression_key_gen_centralized 1m 58s
client::tests::centralized::key_gen_tests::default_key_gen_centralized 53.0s
client::tests::centralized::key_gen_tests::test_compressed_key_gen_centralized 25.3s
client::tests::centralized::key_gen_tests::test_decompression_key_gen_centralized 2m 40s
client::tests::centralized::key_gen_tests::test_key_gen_centralized 34.6s
client::tests::centralized::misc_tests::test_central_close_after_drop 33.6s
client::tests::centralized::misc_tests::test_central_health_endpoint_availability 33.6s
client::tests::centralized::misc_tests::test_largecipher 1m 4s
client::tests::centralized::misc_tests_isolated::test_central_close_after_drop_isolated 335ms
client::tests::centralized::misc_tests_isolated::test_central_health_endpoint_availability_isolated 730ms
client::tests::centralized::misc_tests_isolated::test_largecipher_isolated 20.8s
client::tests::centralized::public_decryption_tests::default_decryption_centralized::case_1 38.0s
client::tests::centralized::public_decryption_tests::default_decryption_centralized_precompute_sns::case_1 38.7s
client::tests::centralized::public_decryption_tests::test_decryption_central 34.6s
client::tests::centralized::public_decryption_tests::test_decryption_central_no_decompression 34.6s
client::tests::centralized::public_decryption_tests::test_decryption_central_precompute_sns 34.6s
client::tests::centralized::restore_from_backup_tests::test_insecure_central_autobackup_after_deletion 1m 11s
client::tests::centralized::restore_from_backup_tests::test_insecure_central_dkg_backup 1m 37s
client::tests::centralized::restore_from_backup_tests_isolated::test_insecure_central_autobackup_after_deletion_isolated 1.4s
client::tests::centralized::restore_from_backup_tests_isolated::test_insecure_central_dkg_backup_isolated 1.5s
client::tests::centralized::user_decryption_tests::default_user_decryption_centralized::secure_1_true 1m 6s
client::tests::centralized::user_decryption_tests::default_user_decryption_centralized::secure_2_false 14.4s
client::tests::centralized::user_decryption_tests::default_user_decryption_centralized_no_compression::secure_1_true 14.3s
client::tests::centralized::user_decryption_tests::default_user_decryption_centralized_no_compression::secure_2_false 14.3s
client::tests::centralized::user_decryption_tests::default_user_decryption_centralized_precompute_sns::secure_1_true::compression_1_true 15.2s
client::tests::centralized::user_decryption_tests::default_user_decryption_centralized_precompute_sns::secure_1_true::compression_2_false 15.1s
client::tests::centralized::user_decryption_tests::default_user_decryption_centralized_precompute_sns::secure_2_false::compression_1_true 15.2s
client::tests::centralized::user_decryption_tests::default_user_decryption_centralized_precompute_sns::secure_2_false::compression_2_false 15.2s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized::secure_1_true 11.1s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized::secure_2_false 11.1s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized_precompute_sns::secure_1_true::compression_1_true 11.1s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized_precompute_sns::secure_1_true::compression_2_false 11.1s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized_precompute_sns::secure_2_false::compression_1_true 11.1s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized_precompute_sns::secure_2_false::compression_2_false 11.1s
client::tests::common::num_blocks_sunshine 6ms
client::tests::testing_infra_tests::test_centralized_material_validation 6ms
client::tests::testing_infra_tests::tests::test_material_spec_creation 5ms
client::tests::testing_infra_tests::tests::test_material_spec_serialization 5ms
conf::tests::config_conformance_compose_1 6ms
conf::tests::config_conformance_compose_centralized 6ms
conf::tests::test_centralized_config 5ms
cryptography::decompression::test::test_1024b 3.1s
cryptography::decompression::test::test_128b 1.6s
cryptography::decompression::test::test_16b 1.5s
cryptography::decompression::test::test_2048b 4.6s
cryptography::decompression::test::test_256b 1.8s
cryptography::decompression::test::test_32b 1.5s
cryptography::decompression::test::test_4b 1.5s
cryptography::decompression::test::test_512b 2.2s
cryptography::decompression::test::test_64b 1.6s
cryptography::decompression::test::test_8b 1.5s
cryptography::decompression::test::test_bad_ciphertext 1.3s
cryptography::decompression::test::test_bad_fhe_type 1.5s
cryptography::decompression::test::test_bool 1.6s
cryptography::decompression::test::test_full_chain_client_copro_kms_uint8::case_1 32ms
cryptography::decompression::test::test_full_chain_client_copro_kms_uint8::case_2 1.7s
cryptography::decompression::test::test_tolerate_non_compressed 516ms
cryptography::encryption::tests::deserialize_and_validate_accepts_mlkem512 6ms
cryptography::encryption::tests::deserialize_and_validate_rejects_invalid_bytes 5ms
cryptography::encryption::tests::deserialize_and_validate_rejects_mlkem1024 5ms
cryptography::encryption::tests::nested_pke_sunshine 6ms
cryptography::encryption::tests::pke_wrong_ct_enc 5ms
cryptography::encryption::tests::pke_wrong_kem_key 5ms
cryptography::hybrid_ml_kem::tests::pke_sunshine 50ms
cryptography::hybrid_ml_kem::tests::pke_wrong_ct_hybrid 45ms
cryptography::hybrid_ml_kem::tests::pke_wrong_kem 45ms
cryptography::hybrid_ml_kem::tests::pke_wrong_key 56ms
cryptography::hybrid_ml_kem::tests::pke_wrong_nonce 45ms
cryptography::hybrid_ml_kem::tests::test_pke_serialize_size 5ms
cryptography::hybrid_ml_kem::tests::validate_consistent_cipher_encoding 4ms
cryptography::signatures::tests::bad_dsep 5ms
cryptography::signatures::tests::bad_signature 5ms
cryptography::signatures::tests::plain_signing 5ms
cryptography::signatures::tests::regression_consistent_enc 4ms
cryptography::signatures::tests::sunshine_verf_key_legacy_serialization 4ms
cryptography::signatures::tests::unnormalized_signature 5ms
cryptography::signatures::tests::validate_zeroize_signing_key 4ms
cryptography::signcryption::tests::bad_signcryption 6ms
cryptography::signcryption::tests::incorrect_server_verf_key 4ms
cryptography::signcryption::tests::signcryption_with_bad_link 5ms
cryptography::signcryption::tests::sunshine 5ms
cryptography::signcryption::tests::sunshine_encoding_decoding 5ms
cryptography::signcryption::tests::test_signcryption_payload_v0_serialization_locked 4ms
engine::backup_operator::tests::test_filter_custodian_data_invalid_custodian_role 5ms
engine::backup_operator::tests::test_filter_custodian_data_invalid_operator_role 5ms
engine::backup_operator::tests::test_filter_custodian_data_invalid_signature 5ms
engine::backup_operator::tests::test_filter_custodian_data_missing_verification_key 5ms
engine::backup_operator::tests::test_filter_custodian_missing_cus_output 5ms
engine::backup_operator::tests::test_update_backup_vault 4ms
engine::backup_operator::tests::test_update_backup_vault_with_overwrite 4ms
engine::backup_operator::tests::test_update_backup_vault_without_overwrite 5ms
engine::backup_operator::tests::test_update_epoch_backup_vault 4ms
engine::backup_operator::tests::test_update_epoch_backup_vault_with_overwrite 5ms
engine::backup_operator::tests::test_update_epoch_backup_vault_without_overwrite 4ms
engine::base::tests::sunshine_plaintext_as_u256 4ms
engine::base::tests::test_abi_encoding_fhevm_ebytes 4ms
engine::base::tests::test_compute_external_signature_preproc 6ms
engine::base::tests::test_compute_info_crs 691ms
engine::base::tests::test_compute_info_standard_keygen 120ms
engine::base::tests::test_compute_pt_message_hash 5ms
engine::base::tests::test_deserialize_ciphertext_missing_decompression_key 90ms
engine::base::tests::test_deserialize_ciphertext_wrong_ct_format 85ms
engine::base::tests::test_deserialize_ciphertext_wrong_type 83ms
engine::centralized::central_kms::tests::decrypt_with_bad_client_key 250ms
engine::centralized::central_kms::tests::multiple_default_keys_decrypt 19.6s
engine::centralized::central_kms::tests::multiple_default_keys_user_decrypt 19.8s
engine::centralized::central_kms::tests::multiple_test_keys_access 36ms
engine::centralized::central_kms::tests::multiple_test_keys_decrypt 105ms
engine::centralized::central_kms::tests::multiple_test_keys_user_decrypt 109ms
engine::centralized::central_kms::tests::sanity_check_sns_compression_test_params 57ms
engine::centralized::central_kms::tests::sunshine_default_decrypt 19.7s
engine::centralized::central_kms::tests::sunshine_default_user_decrypt 19.8s
engine::centralized::central_kms::tests::sunshine_test_decrypt 107ms
engine::centralized::central_kms::tests::sunshine_test_user_decrypt 110ms
engine::centralized::central_kms::tests::test_gen_keys 22.4s
engine::centralized::central_kms::tests::test_generate_compressed_fhe_keys 142ms
engine::centralized::central_kms::tests::user_decrypt_with_bad_client_key 115ms
engine::centralized::central_kms::tests::user_decrypt_with_bad_ephemeral_key 110ms
engine::centralized::central_kms::tests::user_decrypt_with_bad_sig_key 108ms
engine::centralized::service::crs_gen::tests::already_exists 7ms
engine::centralized::service::crs_gen::tests::default_epoch_id 588ms
engine::centralized::service::crs_gen::tests::invalid_argument 7ms
engine::centralized::service::crs_gen::tests::not_found 7ms
engine::centralized::service::crs_gen::tests::resource_exhausted 7ms
engine::centralized::service::crs_gen::tests::sunshine 587ms
engine::centralized::service::decryption::test_user_decryption::already_exists 103ms
engine::centralized::service::decryption::test_user_decryption::invalid_argument 103ms
engine::centralized::service::decryption::test_user_decryption::not_found 102ms
engine::centralized::service::decryption::test_user_decryption::resource_exhausted 103ms
engine::centralized::service::decryption::test_user_decryption::sunshine 103ms
engine::centralized::service::decryption::tests_public_decryption::already_exists 102ms
engine::centralized::service::decryption::tests_public_decryption::invalid_argument 103ms
engine::centralized::service::decryption::tests_public_decryption::not_found 105ms
engine::centralized::service::decryption::tests_public_decryption::resource_exhausted 103ms
engine::centralized::service::decryption::tests_public_decryption::sunshine 104ms
engine::centralized::service::initiator::tests::already_exists 7ms
engine::centralized::service::initiator::tests::invalid_argument 7ms
engine::centralized::service::initiator::tests::sunshine 6ms
engine::centralized::service::key_gen::tests::already_exists 92ms
engine::centralized::service::key_gen::tests::invalid_argument 7ms
engine::centralized::service::key_gen::tests::not_found 96ms
engine::centralized::service::key_gen::tests::resource_exhausted 7ms
engine::centralized::service::key_gen::tests::sunshine 95ms
engine::centralized::service::preprocessing::tests::already_exists 7ms
engine::centralized::service::preprocessing::tests::invalid_argument 7ms
engine::centralized::service::preprocessing::tests::not_found 7ms
engine::centralized::service::preprocessing::tests::resource_exhausted 6ms
engine::centralized::service::preprocessing::tests::sunshine 7ms
engine::context::tests::parse_software_semantic_version 4ms
engine::context::tests::test_context_info_duplicate_party_ids 5ms
engine::context::tests::test_software_version_display 5ms
engine::context::tests::test_software_version_equality 4ms
engine::context::tests::test_software_version_major_comparison 4ms
engine::context::tests::test_software_version_minor_comparison 4ms
engine::context::tests::test_software_version_no_tag 4ms
engine::context::tests::test_software_version_patch_comparison 5ms
engine::context::tests::test_software_version_unordered_tag 4ms
engine::context_manager::tests::test_centralized_context_cache 6ms
engine::context_manager::tests::test_centralized_context_exists_and_consistent 5ms
engine::context_manager::tests::test_centralized_multiple_contexts 6ms
engine::context_manager::tests::test_custodian_context 12ms
engine::context_manager::tests::test_gen_recovery_request_payloads 7ms
engine::context_manager::tests::test_kms_context 5ms
engine::context_manager::tests::test_kms_context_load_from_storage 5ms
engine::context_manager::tests::test_kms_context_load_multiple_from_storage 6ms
engine::context_manager::tests::test_kms_context_load_multiple_from_storage_with_error 6ms
engine::context_manager::tests::test_load_mpc_context_without_signing_key 5ms
engine::keyset_configuration::tests::test_internal_keyset_config_decompression_only_missing_added_info 4ms
engine::keyset_configuration::tests::test_internal_keyset_config_decompression_only_with_added_info_missing_ids 5ms
engine::keyset_configuration::tests::test_internal_keyset_config_decompression_only_with_added_info_with_ids 4ms
engine::keyset_configuration::tests::test_internal_keyset_config_none_defaults_to_standard 4ms
engine::keyset_configuration::tests::test_internal_keyset_config_standard_default 4ms
engine::keyset_configuration::tests::test_internal_keyset_config_standard_use_existing_missing_added_info 4ms
engine::keyset_configuration::tests::test_internal_keyset_config_standard_use_existing_with_added_info_missing_ids 4ms
engine::keyset_configuration::tests::test_internal_keyset_config_standard_use_existing_with_added_info_with_ids 4ms
engine::keyset_configuration::tests::test_new_decompression_only_unparseable_from_id 4ms
engine::keyset_configuration::tests::test_new_decompression_only_unparseable_to_id 4ms
engine::keyset_configuration::tests::test_new_use_existing_unparseable_epoch_id 4ms
engine::migration::tests::s3_tests::test_0_13_x_to_0_13_10_centralized_s3 35ms
engine::migration::tests::s3_tests::test_0_13_x_to_0_13_10_idempotent_s3 29ms
engine::migration::tests::s3_tests::test_0_13_x_to_0_13_10_no_legacy_s3 11ms
engine::migration::tests::s3_tests::test_0_13_x_to_0_13_10_skips_existing_s3 27ms
engine::migration::tests::s3_tests::test_after_0_13_x_centralized_s3 23ms
engine::migration::tests::s3_tests::test_after_0_13_x_idempotent_s3 24ms
engine::migration::tests::s3_tests::test_after_0_13_x_no_legacy_s3 10ms
engine::migration::tests::s3_tests::test_migrate_centralized_s3 25ms
engine::migration::tests::s3_tests::test_migrate_idempotent_s3 25ms
engine::migration::tests::s3_tests::test_migrate_no_legacy_data_s3 10ms
engine::migration::tests::s3_tests::test_migrate_skips_existing_s3 22ms
engine::migration::tests::s3_tests::test_remove_old_keys_centralized_s3 23ms
engine::migration::tests::s3_tests::test_remove_old_keys_no_legacy_s3 10ms
engine::migration::tests::s3_tests::test_remove_old_keys_skips_without_new_epoch_s3 16ms
engine::migration::tests::test_0_13_x_to_0_13_10_centralized_file 5ms
engine::migration::tests::test_0_13_x_to_0_13_10_centralized_ram 4ms
engine::migration::tests::test_0_13_x_to_0_13_10_idempotent_file 5ms
engine::migration::tests::test_0_13_x_to_0_13_10_idempotent_ram 4ms
engine::migration::tests::test_0_13_x_to_0_13_10_no_legacy_file 4ms
engine::migration::tests::test_0_13_x_to_0_13_10_no_legacy_ram 4ms
engine::migration::tests::test_0_13_x_to_0_13_10_skips_existing_file 5ms
engine::migration::tests::test_0_13_x_to_0_13_10_skips_existing_ram 4ms
engine::migration::tests::test_after_0_13_x_centralized_file 5ms
engine::migration::tests::test_after_0_13_x_centralized_ram 4ms
engine::migration::tests::test_after_0_13_x_idempotent_file 5ms
engine::migration::tests::test_after_0_13_x_idempotent_ram 4ms
engine::migration::tests::test_after_0_13_x_no_legacy_file 4ms
engine::migration::tests::test_after_0_13_x_no_legacy_ram 4ms
engine::migration::tests::test_migrate_centralized_file 5ms
engine::migration::tests::test_migrate_centralized_ram 4ms
engine::migration::tests::test_migrate_combined_prss_no_data_file 4ms
engine::migration::tests::test_migrate_combined_prss_no_data_ram 4ms
engine::migration::tests::test_migrate_combined_prss_sunshine 4ms
engine::migration::tests::test_migrate_context_idempotent 4ms
engine::migration::tests::test_migrate_context_no_legacy 4ms
engine::migration::tests::test_migrate_context_sunshine 4ms
engine::migration::tests::test_migrate_idempotent_file 5ms
engine::migration::tests::test_migrate_idempotent_ram 4ms
engine::migration::tests::test_migrate_legacy_prss_sunshine 5ms
engine::migration::tests::test_migrate_no_legacy_data_file 4ms
engine::migration::tests::test_migrate_no_legacy_data_ram 4ms
engine::migration::tests::test_migrate_prss_already_migrated_skips 4ms
engine::migration::tests::test_migrate_prss_missing_z128_errors 4ms
engine::migration::tests::test_migrate_prss_missing_z64_errors 4ms
engine::migration::tests::test_migrate_prss_no_legacy_data_errors 5ms
engine::migration::tests::test_migrate_skips_existing_file 5ms
engine::migration::tests::test_migrate_skips_existing_ram 4ms
engine::migration::tests::test_migrate_to_0_13_10_centralized 4ms
engine::migration::tests::test_migrate_to_0_13_10_empty_storage 4ms
engine::migration::tests::test_migrate_to_0_13_x_centralized 4ms
engine::migration::tests::test_migrate_to_0_13_x_empty_storage 4ms
engine::migration::tests::test_remove_old_keys_centralized_file 5ms
engine::migration::tests::test_remove_old_keys_centralized_ram 4ms
engine::migration::tests::test_remove_old_keys_no_legacy_file 4ms
engine::migration::tests::test_remove_old_keys_no_legacy_ram 4ms
engine::migration::tests::test_remove_old_keys_skips_without_new_epoch_file 5ms
engine::migration::tests::test_remove_old_keys_skips_without_new_epoch_ram 4ms
engine::utils::tests::sanity_check_crs_invalid_digest 343ms
engine::utils::tests::sanity_check_crs_legacy_readability_only 343ms
engine::utils::tests::sanity_check_crs_valid_digest 344ms
engine::utils::tests::sanity_check_current_compressed_keys_invalid_digest 82ms
engine::utils::tests::sanity_check_current_compressed_keys_valid_digests 78ms
engine::utils::tests::sanity_check_current_standard_keys_invalid_digest 9ms
engine::utils::tests::sanity_check_current_standard_keys_valid_digests 9ms
engine::utils::tests::sanity_check_legacy_metadata_readability_only 9ms
engine::utils::tests::test_metriced_error_creation 5ms
engine::utils::tests::test_metriced_error_drop_without_return 5ms
engine::utils::tests::test_metriced_error_no_dropping 5ms
engine::validation_non_wasm::tests::test_max_num_bits_verification 5ms
engine::validation_non_wasm::tests::test_select_most_common_dec 5ms
engine::validation_non_wasm::tests::test_validate_new_mpc_epoch_request 5ms
engine::validation_non_wasm::tests::test_validate_public_decrypt_meta_response 6ms
engine::validation_non_wasm::tests::test_validate_public_decrypt_meta_response_with_eip712 6ms
engine::validation_non_wasm::tests::test_validate_public_decrypt_req 4ms
engine::validation_non_wasm::tests::test_validate_public_decrypt_responses 8ms
engine::validation_non_wasm::tests::test_validate_public_decrypt_responses_against_request 9ms
engine::validation_non_wasm::tests::test_validate_request_id 5ms
engine::validation_non_wasm::tests::test_validate_user_decrypt_req 5ms
engine::validation_non_wasm::tests::test_verify_user_decrypt_eip712 5ms
engine::validation_wasm::tests::test_check_ext_user_decryption_signature 7ms
engine::validation_wasm::tests::test_select_most_common_user_dec 4ms
engine::validation_wasm::tests::test_validate_user_decrypt_meta_data_and_signature 6ms
engine::validation_wasm::tests::test_validate_user_decrypt_responses 123ms
engine::validation_wasm::tests::test_validate_user_decrypt_responses_against_request 7ms
engine::validation_wasm::tests::test_validate_user_decrypt_responses_with_5_responses 8ms
grpc::tests::regression_tests::test_request_id_compile_time_interface_stability 4ms
grpc::tests::regression_tests::test_request_id_core_structure_and_api_consistency 4ms
grpc::tests::regression_tests::test_request_id_validation_and_error_handling 4ms
grpc::tests::unit_tests::test_get_meta_store_info_with_real_stores 4ms
grpc::tests::unit_tests::test_get_meta_store_info_with_unavailable_stores 4ms
grpc::tests::unit_tests::test_list_requests_invalid_store_type 4ms
grpc::tests::unit_tests::test_list_requests_pagination 4ms
grpc::tests::unit_tests::test_list_requests_with_real_stores 4ms
grpc::tests::unit_tests::test_list_requests_with_unavailable_stores 4ms
grpc::tests::unit_tests::test_service_with_mixed_store_availability 4ms
testing::material::manager::tests::test_setup_centralized_material 11ms
testing::material::spec::tests::test_centralized_basic_spec 4ms
testing::material::spec::tests::test_comprehensive_spec 4ms
testing::material::spec::tests::test_key_type_covers_all_priv_data_types 4ms
testing::material::spec::tests::test_key_type_covers_all_pub_data_types 4ms
testing::material::spec::tests::test_serialization 4ms
testing::utils::test_purge 6ms
util::file_handling::tests::read_write_element 5ms
util::file_handling::tests::read_write_text 4ms
util::key_setup::tests::test_max_num_bits 3.5s
util::meta_store::tests::auto_remove 5ms
util::meta_store::tests::delete 5ms
util::meta_store::tests::double_insert 5ms
util::meta_store::tests::sunshine 5ms
util::meta_store::tests::test_kickout_of_errors 5ms
util::meta_store::tests::test_subscription 5.0s
util::meta_store::tests::too_many_elements 5ms
util::rate_limiter::tests::test_rate_limiting_1 5ms
util::rate_limiter::tests::test_rate_limiting_more 5ms
util::rate_limiter::tests::test_rate_limiting_refusal 5ms
util::retry::tests::fatal_loop_fails 49ms
util::retry::tests::retry_loop_fails 49ms
util::retry::tests::sunshine_fatal_loop 60ms
util::retry::tests::sunshine_retry_loop 60ms
vault::keychain::secretsharing::tests::test_encrypt_and_decrypt_roundtrip 5ms
vault::keychain::secretsharing::tests::test_new_keychain_without_pub_storage 4ms
vault::keychain::secretsharing::tests::test_operator_public_key_bytes_error 5ms
vault::keychain::secretsharing::tests::test_set_and_get_backup_enc_key 4ms
vault::keychain::secretsharing::tests::test_validate_recovery_material_invalid_signature 6ms
vault::keychain::secretsharing::tests::test_validate_recovery_material_no_material_is_ok 4ms
vault::keychain::secretsharing::tests::test_validate_recovery_material_valid_signature 6ms
vault::keychain::tests::test_verify_root_key_measurements 4ms
vault::storage::crypto_material::tests::read_guarded_crypto_material_from_cache_not_found 4ms
vault::storage::crypto_material::tests::read_public_key 4ms
vault::storage::crypto_material::tests::write_central_keys 9ms
vault::storage::crypto_material::tests::write_central_keys_failed_storage_sets_terminal_error 10ms
vault::storage::crypto_material::tests::write_crs 343ms
vault::storage::file::tests::test_all_data_ids_from_all_epochs_file 7ms
vault::storage::file::tests::test_data_ids_with_only_epoch_data_file 6ms
vault::storage::file::tests::test_delete_at_epoch_keeps_dir_when_not_empty 6ms
vault::storage::file::tests::test_delete_at_epoch_removes_empty_epoch_dir 6ms
vault::storage::file::tests::test_epoch_ids_with_only_non_epoch_data_file 5ms
vault::storage::file::tests::test_epoch_storage 5ms
vault::storage::file::tests::test_mixed_epoch_and_non_epoch_data_file 6ms
vault::storage::file::tests::test_overwrite_logic_files 5ms
vault::storage::file::tests::test_store_bytes_at_epoch_does_not_overwrite_file 5ms
vault::storage::file::tests::test_store_load_bytes_at_epoch_file 6ms
vault::storage::ram::tests::storage_helper_methods 5ms
vault::storage::ram::tests::test_all_data_ids_from_all_epochs_ram 5ms
vault::storage::ram::tests::test_data_ids_with_only_epoch_data_ram 5ms
vault::storage::ram::tests::test_epoch_ids_with_only_non_epoch_data_ram 4ms
vault::storage::ram::tests::test_mixed_epoch_and_non_epoch_data_ram 4ms
vault::storage::ram::tests::test_overwrite_logic_ram 5ms
vault::storage::ram::tests::test_overwrite_logic_ram_on_epoch 4ms
vault::storage::ram::tests::test_store_load_bytes_at_epoch_ram 4ms
vault::storage::s3::test_find_region 5ms
vault::storage::s3::tests::s3_storage_helper_methods 72ms
vault::storage::s3::tests::test_all_data_ids_from_all_epochs_s3 52ms
vault::storage::s3::tests::test_data_ids_with_only_epoch_data_s3 24ms
vault::storage::s3::tests::test_epoch_ids_with_only_non_epoch_data_s3 23ms
vault::storage::s3::tests::test_epoch_methods_in_s3 35ms
vault::storage::s3::tests::test_mixed_epoch_and_non_epoch_data_s3 46ms
vault::storage::s3::tests::test_overwrite_logic_files 24ms
vault::storage::s3::tests::test_s3_anon 17ms
vault::storage::s3::tests::test_store_bytes_at_epoch_does_not_overwrite_s3 18ms
vault::storage::s3::tests::test_store_load_bytes_at_epoch_s3 30ms
vault::tests::regression_test_vault_data_type_serialization 4ms
test_backward_compatibility_kms 805ms
test_backward_compatibility_kms_grpc 12ms
kms_custodian_binary_tests::sunshine_decrypt_custodian 140ms
kms_custodian_binary_tests::sunshine_generate 17ms
kms_custodian_binary_tests::sunshine_verify 19ms
kms_gen_keys_binary_test::central_s3 32ms
kms_gen_keys_binary_test::central_signing_address_format 17ms
kms_gen_keys_binary_test::central_signing_keys_overwrite 28ms
kms_gen_keys_binary_test::gen_key_centralized 3.1s
kms_gen_keys_binary_test::gen_key_tempdir_centralized 526ms
kms_gen_keys_binary_test::help 21ms
kms_init_binary_test::help 9ms
kms_init_binary_test::init 278ms
kms_server_binary_test::help 6ms
kms_server_binary_test::subcommand_dev_centralized 5.7s
kms_server_binary_test::test_cert_paths 40ms
backup::custodian::tests::internal_custodian_context_duplicate_role_should_fail 6ms
backup::custodian::tests::internal_custodian_context_role_greater_than_nodes_should_fail 5ms
backup::custodian::tests::internal_custodian_context_zero_role_should_fail 5ms
backup::custodian::tests::invalid_threshold_should_fail 5ms
backup::operator::tests::operator_new_fails_with_bad_n_t 5ms
backup::operator::tests::operator_new_fails_with_duplicate_roles 5ms
backup::operator::tests::operator_new_fails_with_insufficient_messages 5ms
backup::operator::tests::operator_new_fails_with_invalid_header 5ms
backup::operator::tests::operator_new_fails_with_invalid_role 5ms
backup::operator::tests::operator_new_fails_with_invalid_timestamp_future 5ms
backup::operator::tests::operator_new_fails_with_invalid_timestamp_past 5ms
backup::operator::tests::operator_new_fails_with_not_enough 5ms
backup::operator::tests::operator_new_fails_with_zero_n 4ms
backup::operator::tests::operator_new_fails_with_zero_t 4ms
backup::operator::tests::operator_timestamp_validation 5ms
backup::operator::tests::validate_recovery_validation_material 5ms
backup::secretsharing::pkcs7::tests::padding_sunshine 5ms
backup::secretsharing::pkcs7::tests::padding_wrong_data 5ms
backup::secretsharing::tests::sharing_missing_shares 99ms
backup::secretsharing::tests::sharing_no_error 166ms
backup::secretsharing::tests::sharing_randomness_test 15.3s
backup::secretsharing::tests::sharing_too_many_missing_shares 13ms
backup::secretsharing::tests::sharing_wrong_params 7ms
backup::secretsharing::tests::sharing_wrong_shares 14ms
backup::seed_phrase::tests::difference 6ms
backup::seed_phrase::tests::mnemonic_robustness 6ms
backup::seed_phrase::tests::sunshine 5ms
backup::tests::custodian_reencrypt 9ms
backup::tests::full_flow::case_1 47ms
backup::tests::full_flow::case_2 31ms
backup::tests::full_flow::case_3 85ms
backup::tests::full_flow_drop_msg 35ms
backup::tests::full_flow_malicious_custodian_init 11ms
backup::tests::full_flow_malicious_custodian_not_enough 119ms
backup::tests::full_flow_malicious_custodian_second 64ms
backup::tests::full_flow_malicious_operator 33ms
backup::tests::operator_setup 8ms
client::crs_gen::tests::process_distributed_crs_result_invalid_signature_does_not_insert_key 9.3s
client::crs_gen::tests::verify_pp_with_tfhers 17.6s
client::tests::centralized::crs_gen_tests::test_crs_gen_centralized 13.6s
client::tests::centralized::crs_gen_tests::test_crs_gen_manual 2.0s
client::tests::centralized::crs_gen_tests::test_insecure_crs_gen_centralized 11.2s
client::tests::centralized::custodian_backup_tests::test_auto_update_backups_central 4.0s
client::tests::centralized::custodian_backup_tests::test_backup_after_crs_central 11.6s
client::tests::centralized::custodian_backup_tests::test_decrypt_after_recovery_central 5.3s
client::tests::centralized::custodian_backup_tests::test_decrypt_after_recovery_centralized_negative 3.9s
client::tests::centralized::custodian_context_tests::test_new_custodian_context_central 3.6s
client::tests::centralized::key_gen_tests::test_decompression_key_gen_centralized 1m 31s
client::tests::centralized::key_gen_tests::test_key_gen_centralized 11.2s
client::tests::centralized::misc_tests::test_central_close_after_drop 10.1s
client::tests::centralized::misc_tests::test_central_health_endpoint_availability 10.1s
client::tests::centralized::misc_tests_isolated::test_central_close_after_drop_isolated 289ms
client::tests::centralized::misc_tests_isolated::test_central_health_endpoint_availability_isolated 767ms
client::tests::centralized::public_decryption_tests::test_decryption_central 11.3s
client::tests::centralized::public_decryption_tests::test_decryption_central_no_decompression 11.2s
client::tests::centralized::public_decryption_tests::test_decryption_central_precompute_sns 11.2s
client::tests::centralized::restore_from_backup_tests_isolated::test_insecure_central_autobackup_after_deletion_isolated 1.5s
client::tests::centralized::restore_from_backup_tests_isolated::test_insecure_central_dkg_backup_isolated 1.5s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized::secure_1_true 11.2s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized::secure_2_false 11.2s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized_precompute_sns::secure_1_true::compression_1_true 11.2s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized_precompute_sns::secure_1_true::compression_2_false 11.2s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized_precompute_sns::secure_2_false::compression_1_true 11.2s
client::tests::centralized::user_decryption_tests::test_user_decryption_centralized_precompute_sns::secure_2_false::compression_2_false 11.2s
client::tests::common::num_blocks_sunshine 6ms
client::tests::testing_infra_tests::test_centralized_material_validation 6ms
client::tests::testing_infra_tests::test_threshold_material_validation 5ms
client::tests::testing_infra_tests::tests::test_material_spec_creation 5ms
client::tests::testing_infra_tests::tests::test_material_spec_serialization 5ms
client::tests::threshold::crs_gen_tests::test_insecure_crs_gen_threshold 37.2s
client::tests::threshold::custodian_backup_tests::test_auto_update_backups_threshold::case_1 5.0s
client::tests::threshold::custodian_backup_tests::test_auto_update_backups_threshold::case_2 5.0s
client::tests::threshold::custodian_backup_tests::test_backup_after_crs_threshold::case_1 46.5s
client::tests::threshold::custodian_backup_tests::test_backup_after_crs_threshold::case_2 46.2s
client::tests::threshold::custodian_backup_tests::test_decrypt_after_recovery_threshold::case_1 11.2s
client::tests::threshold::custodian_backup_tests::test_decrypt_after_recovery_threshold::case_2 11.1s
client::tests::threshold::custodian_backup_tests::test_decrypt_after_recovery_threshold_negative 4.6s
client::tests::threshold::custodian_context_tests::test_new_custodian_context_threshold::case_1 7.0s
client::tests::threshold::custodian_context_tests::test_new_custodian_context_threshold::case_2 7.0s
client::tests::threshold::key_gen_tests::default_insecure_dkg::case_1 1m 23s
client::tests::threshold::key_gen_tests::test_insecure_compressed_dkg::case_1 8.9s
client::tests::threshold::key_gen_tests::test_insecure_dkg::case_1 8.9s
client::tests::threshold::key_gen_tests_isolated::test_insecure_dkg_isolated 5.1s
client::tests::threshold::misc_tests::test_threshold_close_after_drop 8.3s
client::tests::threshold::misc_tests::test_threshold_health_endpoint_availability 12.5s
client::tests::threshold::misc_tests::test_threshold_shutdown 9.2s
client::tests::threshold::misc_tests_isolated::test_threshold_close_after_drop_isolated 981ms
client::tests::threshold::misc_tests_isolated::test_threshold_health_endpoint_availability_isolated 4.6s
client::tests::threshold::misc_tests_isolated::test_threshold_shutdown_isolated 1.8s
client::tests::threshold::mpc_context_tests::test_context_switch_4p 12.4s
client::tests::threshold::public_decryption_tests::test_decryption_threshold::case_1 15.0s
client::tests::threshold::public_decryption_tests::test_decryption_threshold::case_2 14.6s
client::tests::threshold::public_decryption_tests::test_decryption_threshold::case_3 14.5s
client::tests::threshold::public_decryption_tests::test_decryption_threshold_no_decompression::case_1 11.6s
client::tests::threshold::public_decryption_tests::test_decryption_threshold_no_decompression::case_2 11.3s
client::tests::threshold::public_decryption_tests::test_decryption_threshold_no_decompression::case_3 11.3s
client::tests::threshold::public_decryption_tests::test_decryption_threshold_precompute_sns::case_1::compression_1_true 14.5s
client::tests::threshold::public_decryption_tests::test_decryption_threshold_precompute_sns::case_1::compression_2_false 14.5s
client::tests::threshold::restore_from_backup_tests_isolated::nightly_test_insecure_threshold_autobackup_after_deletion_isolated 5.0s
client::tests::threshold::restore_from_backup_tests_isolated::nightly_test_insecure_threshold_dkg_backup_isolated 13.1s
client::tests::threshold::restore_from_backup_tests_isolated::test_insecure_threshold_crs_backup_isolated 15.6s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_1 8.2s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_2 8.8s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_3 11.2s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_4 11.4s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_5 14.6s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_6 12.7s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold::case_7 12.5s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_all_malicious_failure 10.0s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_malicious::case_1 11.5s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_malicious::case_2 11.3s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_malicious_failure 11.4s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_precompute_sns::case_1 11.4s
client::tests::threshold::user_decryption_tests::test_user_decryption_threshold_precompute_sns::case_2 11.4s
conf::tests::config_conformance_compose_1 7ms
conf::tests::config_conformance_compose_centralized 6ms
conf::tests::test_centralized_config 6ms
conf::tests::test_threshold_config 6ms
conf::tests::test_threshold_config_negative 6ms
conf::threshold::test_pem_serialization 5ms
cryptography::decompression::test::test_1024b 3.5s
cryptography::decompression::test::test_128b 1.7s
cryptography::decompression::test::test_16b 1.6s
cryptography::decompression::test::test_2048b 5.6s
cryptography::decompression::test::test_256b 2.0s
cryptography::decompression::test::test_32b 1.7s
cryptography::decompression::test::test_4b 1.6s
cryptography::decompression::test::test_512b 2.5s
cryptography::decompression::test::test_64b 1.7s
cryptography::decompression::test::test_8b 1.6s
cryptography::decompression::test::test_bad_ciphertext 1.3s
cryptography::decompression::test::test_bad_fhe_type 1.6s
cryptography::decompression::test::test_bool 1.7s
cryptography::decompression::test::test_full_chain_client_copro_kms_uint8::case_1 39ms
cryptography::decompression::test::test_full_chain_client_copro_kms_uint8::case_2 1.8s
cryptography::decompression::test::test_tolerate_non_compressed 547ms
cryptography::encryption::tests::deserialize_and_validate_accepts_mlkem512 6ms
cryptography::encryption::tests::deserialize_and_validate_rejects_invalid_bytes 6ms
cryptography::encryption::tests::deserialize_and_validate_rejects_mlkem1024 6ms
cryptography::encryption::tests::nested_pke_sunshine 6ms
cryptography::encryption::tests::pke_wrong_ct_enc 5ms
cryptography::encryption::tests::pke_wrong_kem_key 5ms
cryptography::hybrid_ml_kem::tests::pke_sunshine 54ms
cryptography::hybrid_ml_kem::tests::pke_wrong_ct_hybrid 49ms
cryptography::hybrid_ml_kem::tests::pke_wrong_kem 49ms
cryptography::hybrid_ml_kem::tests::pke_wrong_key 60ms
cryptography::hybrid_ml_kem::tests::pke_wrong_nonce 50ms
cryptography::hybrid_ml_kem::tests::test_pke_serialize_size 6ms
cryptography::hybrid_ml_kem::tests::validate_consistent_cipher_encoding 5ms
cryptography::signatures::tests::bad_dsep 7ms
cryptography::signatures::tests::bad_signature 6ms
cryptography::signatures::tests::plain_signing 5ms
cryptography::signatures::tests::regression_consistent_enc 5ms
cryptography::signatures::tests::sunshine_verf_key_legacy_serialization 5ms
cryptography::signatures::tests::unnormalized_signature 5ms
cryptography::signatures::tests::validate_zeroize_signing_key 5ms
cryptography::signcryption::tests::bad_signcryption 7ms
cryptography::signcryption::tests::incorrect_server_verf_key 5ms
cryptography::signcryption::tests::signcryption_with_bad_link 6ms
cryptography::signcryption::tests::sunshine 7ms
cryptography::signcryption::tests::sunshine_encoding_decoding 8ms
cryptography::signcryption::tests::test_signcryption_payload_v0_serialization_locked 5ms
engine::backup_operator::tests::test_filter_custodian_data_invalid_custodian_role 7ms
engine::backup_operator::tests::test_filter_custodian_data_invalid_operator_role 7ms
engine::backup_operator::tests::test_filter_custodian_data_invalid_signature 7ms
engine::backup_operator::tests::test_filter_custodian_data_missing_verification_key 6ms
engine::backup_operator::tests::test_filter_custodian_missing_cus_output 7ms
engine::backup_operator::tests::test_update_backup_vault 6ms
engine::backup_operator::tests::test_update_backup_vault_with_overwrite 5ms
engine::backup_operator::tests::test_update_backup_vault_without_overwrite 6ms
engine::backup_operator::tests::test_update_epoch_backup_vault 5ms
engine::backup_operator::tests::test_update_epoch_backup_vault_with_overwrite 5ms
engine::backup_operator::tests::test_update_epoch_backup_vault_without_overwrite 5ms
engine::base::tests::sunshine_plaintext_as_u256 5ms
engine::base::tests::test_abi_encoding_fhevm_ebytes 5ms
engine::base::tests::test_compute_external_signature_preproc 7ms
engine::base::tests::test_compute_info_crs 826ms
engine::base::tests::test_compute_info_standard_keygen 130ms
engine::base::tests::test_compute_pt_message_hash 6ms
engine::base::tests::test_deserialize_ciphertext_missing_decompression_key 104ms
engine::base::tests::test_deserialize_ciphertext_wrong_ct_format 97ms
engine::base::tests::test_deserialize_ciphertext_wrong_type 99ms
engine::centralized::central_kms::tests::decrypt_with_bad_client_key 267ms
engine::centralized::central_kms::tests::multiple_test_keys_access 36ms
engine::centralized::central_kms::tests::multiple_test_keys_decrypt 118ms
engine::centralized::central_kms::tests::multiple_test_keys_user_decrypt 116ms
engine::centralized::central_kms::tests::sanity_check_sns_compression_test_params 70ms
engine::centralized::central_kms::tests::sunshine_test_decrypt 110ms
engine::centralized::central_kms::tests::sunshine_test_user_decrypt 117ms
engine::centralized::central_kms::tests::test_gen_keys 23.2s
engine::centralized::central_kms::tests::test_generate_compressed_fhe_keys 157ms
engine::centralized::central_kms::tests::user_decrypt_with_bad_client_key 122ms
engine::centralized::central_kms::tests::user_decrypt_with_bad_ephemeral_key 119ms
engine::centralized::central_kms::tests::user_decrypt_with_bad_sig_key 112ms
engine::centralized::service::crs_gen::tests::already_exists 8ms
engine::centralized::service::crs_gen::tests::default_epoch_id 705ms
engine::centralized::service::crs_gen::tests::invalid_argument 8ms
engine::centralized::service::crs_gen::tests::not_found 7ms
engine::centralized::service::crs_gen::tests::resource_exhausted 7ms
engine::centralized::service::crs_gen::tests::sunshine 673ms
engine::centralized::service::decryption::test_user_decryption::already_exists 112ms
engine::centralized::service::decryption::test_user_decryption::invalid_argument 115ms
engine::centralized::service::decryption::test_user_decryption::not_found 112ms
engine::centralized::service::decryption::test_user_decryption::resource_exhausted 110ms
engine::centralized::service::decryption::test_user_decryption::sunshine 112ms
engine::centralized::service::decryption::tests_public_decryption::already_exists 108ms
engine::centralized::service::decryption::tests_public_decryption::invalid_argument 110ms
engine::centralized::service::decryption::tests_public_decryption::not_found 120ms
engine::centralized::service::decryption::tests_public_decryption::resource_exhausted 115ms
engine::centralized::service::decryption::tests_public_decryption::sunshine 114ms
engine::centralized::service::initiator::tests::already_exists 8ms
engine::centralized::service::initiator::tests::invalid_argument 7ms
engine::centralized::service::initiator::tests::sunshine 7ms
engine::centralized::service::key_gen::tests::already_exists 109ms
engine::centralized::service::key_gen::tests::invalid_argument 8ms
engine::centralized::service::key_gen::tests::not_found 102ms
engine::centralized::service::key_gen::tests::resource_exhausted 8ms
engine::centralized::service::key_gen::tests::sunshine 110ms
engine::centralized::service::preprocessing::tests::already_exists 9ms
engine::centralized::service::preprocessing::tests::invalid_argument 8ms
engine::centralized::service::preprocessing::tests::not_found 7ms
engine::centralized::service::preprocessing::tests::resource_exhausted 7ms
engine::centralized::service::preprocessing::tests::sunshine 7ms
engine::context::tests::parse_software_semantic_version 5ms
engine::context::tests::test_context_info_duplicate_party_ids 5ms
engine::context::tests::test_software_version_display 5ms
engine::context::tests::test_software_version_equality 4ms
engine::context::tests::test_software_version_major_comparison 5ms
engine::context::tests::test_software_version_minor_comparison 5ms
engine::context::tests::test_software_version_no_tag 5ms
engine::context::tests::test_software_version_patch_comparison 5ms
engine::context::tests::test_software_version_unordered_tag 4ms
engine::context_manager::tests::test_centralized_context_cache 7ms
engine::context_manager::tests::test_centralized_context_exists_and_consistent 6ms
engine::context_manager::tests::test_centralized_multiple_contexts 7ms
engine::context_manager::tests::test_custodian_context 12ms
engine::context_manager::tests::test_gen_recovery_request_payloads 9ms
engine::context_manager::tests::test_kms_context 7ms
engine::context_manager::tests::test_kms_context_load_from_storage 6ms
engine::context_manager::tests::test_kms_context_load_multiple_from_storage 7ms
engine::context_manager::tests::test_kms_context_load_multiple_from_storage_with_error 7ms
engine::context_manager::tests::test_load_mpc_context_without_signing_key 6ms
engine::keyset_configuration::tests::test_internal_keyset_config_decompression_only_missing_added_info 5ms
engine::keyset_configuration::tests::test_internal_keyset_config_decompression_only_with_added_info_missing_ids 4ms
engine::keyset_configuration::tests::test_internal_keyset_config_decompression_only_with_added_info_with_ids 4ms
engine::keyset_configuration::tests::test_internal_keyset_config_none_defaults_to_standard 5ms
engine::keyset_configuration::tests::test_internal_keyset_config_standard_default 4ms
engine::keyset_configuration::tests::test_internal_keyset_config_standard_use_existing_missing_added_info 5ms
engine::keyset_configuration::tests::test_internal_keyset_config_standard_use_existing_with_added_info_missing_ids 5ms
engine::keyset_configuration::tests::test_internal_keyset_config_standard_use_existing_with_added_info_with_ids 5ms
engine::keyset_configuration::tests::test_new_decompression_only_unparseable_from_id 5ms
engine::keyset_configuration::tests::test_new_decompression_only_unparseable_to_id 5ms
engine::keyset_configuration::tests::test_new_use_existing_unparseable_epoch_id 5ms
engine::migration::tests::test_0_13_x_to_0_13_10_centralized_file 6ms
engine::migration::tests::test_0_13_x_to_0_13_10_centralized_ram 5ms
engine::migration::tests::test_0_13_x_to_0_13_10_idempotent_file 7ms
engine::migration::tests::test_0_13_x_to_0_13_10_idempotent_ram 5ms
engine::migration::tests::test_0_13_x_to_0_13_10_no_legacy_file 5ms
engine::migration::tests::test_0_13_x_to_0_13_10_no_legacy_ram 5ms
engine::migration::tests::test_0_13_x_to_0_13_10_skips_existing_file 6ms
engine::migration::tests::test_0_13_x_to_0_13_10_skips_existing_ram 5ms
engine::migration::tests::test_0_13_x_to_0_13_10_threshold_file 7ms
engine::migration::tests::test_0_13_x_to_0_13_10_threshold_ram 5ms
engine::migration::tests::test_after_0_13_x_centralized_file 6ms
engine::migration::tests::test_after_0_13_x_centralized_ram 5ms
engine::migration::tests::test_after_0_13_x_idempotent_file 6ms
engine::migration::tests::test_after_0_13_x_idempotent_ram 5ms
engine::migration::tests::test_after_0_13_x_no_legacy_file 5ms
engine::migration::tests::test_after_0_13_x_no_legacy_ram 4ms
engine::migration::tests::test_after_0_13_x_threshold_file 7ms
engine::migration::tests::test_after_0_13_x_threshold_ram 5ms
engine::migration::tests::test_migrate_centralized_file 6ms
engine::migration::tests::test_migrate_centralized_ram 5ms
engine::migration::tests::test_migrate_combined_prss_no_data_file 6ms
engine::migration::tests::test_migrate_combined_prss_no_data_ram 5ms
engine::migration::tests::test_migrate_combined_prss_sunshine 5ms
engine::migration::tests::test_migrate_context_idempotent 5ms
engine::migration::tests::test_migrate_context_no_legacy 5ms
engine::migration::tests::test_migrate_context_sunshine 5ms
engine::migration::tests::test_migrate_idempotent_file 6ms
engine::migration::tests::test_migrate_idempotent_ram 5ms
engine::migration::tests::test_migrate_legacy_prss_sunshine 5ms
engine::migration::tests::test_migrate_no_legacy_data_file 5ms
engine::migration::tests::test_migrate_no_legacy_data_ram 5ms
engine::migration::tests::test_migrate_prss_already_migrated_skips 6ms
engine::migration::tests::test_migrate_prss_missing_z128_errors 6ms
engine::migration::tests::test_migrate_prss_missing_z64_errors 5ms
engine::migration::tests::test_migrate_prss_no_legacy_data_errors 5ms
engine::migration::tests::test_migrate_skips_existing_file 6ms
engine::migration::tests::test_migrate_skips_existing_ram 5ms
engine::migration::tests::test_migrate_threshold_file 7ms
engine::migration::tests::test_migrate_threshold_ram 5ms
engine::migration::tests::test_migrate_to_0_13_10_centralized 5ms
engine::migration::tests::test_migrate_to_0_13_10_empty_storage 5ms
engine::migration::tests::test_migrate_to_0_13_10_threshold 6ms
engine::migration::tests::test_migrate_to_0_13_x_centralized 5ms
engine::migration::tests::test_migrate_to_0_13_x_empty_storage 5ms
engine::migration::tests::test_migrate_to_0_13_x_threshold 5ms
engine::migration::tests::test_remove_old_keys_centralized_file 6ms
engine::migration::tests::test_remove_old_keys_centralized_ram 5ms
engine::migration::tests::test_remove_old_keys_no_legacy_file 5ms
engine::migration::tests::test_remove_old_keys_no_legacy_ram 5ms
engine::migration::tests::test_remove_old_keys_skips_without_new_epoch_file 6ms
engine::migration::tests::test_remove_old_keys_skips_without_new_epoch_ram 5ms
engine::migration::tests::test_remove_old_keys_threshold_file 6ms
engine::migration::tests::test_remove_old_keys_threshold_ram 5ms
engine::threshold::service::crs_generator::tests::already_exists 6ms
engine::threshold::service::crs_generator::tests::internal_failure 6ms
engine::threshold::service::crs_generator::tests::invalid_argument 6ms
engine::threshold::service::crs_generator::tests::not_found 6ms
engine::threshold::service::crs_generator::tests::resource_exhausted 6ms
engine::threshold::service::crs_generator::tests::sunshine 47ms
engine::threshold::service::crs_generator::tests::unavailable 1m
engine::threshold::service::epoch_manager::tests::already_exists 7ms
engine::threshold::service::epoch_manager::tests::invalid_argument 6ms
engine::threshold::service::epoch_manager::tests::load_all_prss 6ms
engine::threshold::service::epoch_manager::tests::not_found 6ms
engine::threshold::service::epoch_manager::tests::prss_from_storage_test 57.7s
engine::threshold::service::epoch_manager::tests::sunshine 7ms
engine::threshold::service::epoch_manager::tests::test_destroy_epoch_not_found 6ms
engine::threshold::service::epoch_manager::tests::test_destroy_epoch_success 6ms
engine::threshold::service::epoch_manager::tests::test_resource_exhausted 6ms
engine::threshold::service::epoch_manager::tests::test_verify_epoch_info 5ms
engine::threshold::service::key_generator::tests::aborted 5ms
engine::threshold::service::key_generator::tests::already_exists 6ms
engine::threshold::service::key_generator::tests::internal 6ms
engine::threshold::service::key_generator::tests::invalid_argument 6ms
engine::threshold::service::key_generator::tests::not_found 6ms
engine::threshold::service::key_generator::tests::resource_exhausted 6ms
engine::threshold::service::key_generator::tests::sunshine 100ms
engine::threshold::service::key_generator::tests::use_existing_key_tag_with_wrong_keyset_id 8ms
engine::threshold::service::preprocessor::tests::already_exists 7ms
engine::threshold::service::preprocessor::tests::internal 7ms
engine::threshold::service::preprocessor::tests::invalid_argument 6ms
engine::threshold::service::preprocessor::tests::not_found 6ms
engine::threshold::service::preprocessor::tests::resource_exhausted 6ms
engine::threshold::service::preprocessor::tests::sunshine 847ms
engine::threshold::service::public_decryptor::tests::already_exists 88ms
engine::threshold::service::public_decryptor::tests::invalid_argument 82ms
engine::threshold::service::public_decryptor::tests::not_found 240ms
engine::threshold::service::public_decryptor::tests::sunshine 91ms
engine::threshold::service::public_decryptor::tests::test_resource_exhausted 82ms
engine::threshold::service::reshare_utils::tests::bad_digests_get_verified_public_materials 162ms
engine::threshold::service::reshare_utils::tests::bad_digests_get_verified_public_materials_compressed 225ms
engine::threshold::service::reshare_utils::tests::empty_storage_fetch_public_materials_from_peers 161ms
engine::threshold::service::reshare_utils::tests::sunshine_fetch_public_materials_from_peers 166ms
engine::threshold::service::reshare_utils::tests::sunshine_fetch_public_materials_from_peers_compressed 91ms
engine::threshold::service::reshare_utils::tests::sunshine_get_verified_public_materials 12ms
engine::threshold::service::reshare_utils::tests::sunshine_get_verified_public_materials_compressed 88ms
engine::threshold::service::reshare_utils::tests::test_split_url 6ms
engine::threshold::service::reshare_utils::tests::wrong_digest_fetch_public_materials_from_peers 22ms
engine::threshold::service::reshare_utils::tests::wrong_digest_fetch_public_materials_from_peers_compressed 88ms
engine::threshold::service::user_decryptor::tests::already_exists 82ms
engine::threshold::service::user_decryptor::tests::invalid_argument 82ms
engine::threshold::service::user_decryptor::tests::not_found 243ms
engine::threshold::service::user_decryptor::tests::resource_exhausted 77ms
engine::threshold::service::user_decryptor::tests::sunshine 86ms
engine::utils::tests::sanity_check_crs_invalid_digest 393ms
engine::utils::tests::sanity_check_crs_legacy_readability_only 391ms
engine::utils::tests::sanity_check_crs_valid_digest 394ms
engine::utils::tests::sanity_check_current_compressed_keys_invalid_digest 82ms
engine::utils::tests::sanity_check_current_compressed_keys_valid_digests 80ms
engine::utils::tests::sanity_check_current_standard_keys_invalid_digest 11ms
engine::utils::tests::sanity_check_current_standard_keys_valid_digests 11ms
engine::utils::tests::sanity_check_legacy_metadata_readability_only 11ms
engine::utils::tests::test_metriced_error_creation 6ms
engine::utils::tests::test_metriced_error_drop_without_return 6ms
engine::utils::tests::test_metriced_error_no_dropping 6ms
engine::validation_non_wasm::tests::test_max_num_bits_verification 5ms
engine::validation_non_wasm::tests::test_select_most_common_dec 5ms
engine::validation_non_wasm::tests::test_validate_new_mpc_epoch_request 5ms
engine::validation_non_wasm::tests::test_validate_public_decrypt_meta_response 7ms
engine::validation_non_wasm::tests::test_validate_public_decrypt_meta_response_with_eip712 7ms
engine::validation_non_wasm::tests::test_validate_public_decrypt_req 5ms
engine::validation_non_wasm::tests::test_validate_public_decrypt_responses 9ms
engine::validation_non_wasm::tests::test_validate_public_decrypt_responses_against_request 10ms
engine::validation_non_wasm::tests::test_validate_request_id 5ms
engine::validation_non_wasm::tests::test_validate_user_decrypt_req 5ms
engine::validation_non_wasm::tests::test_verify_user_decrypt_eip712 6ms
engine::validation_wasm::tests::test_check_ext_user_decryption_signature 7ms
engine::validation_wasm::tests::test_select_most_common_user_dec 4ms
engine::validation_wasm::tests::test_validate_user_decrypt_meta_data_and_signature 6ms
engine::validation_wasm::tests::test_validate_user_decrypt_responses 127ms
engine::validation_wasm::tests::test_validate_user_decrypt_responses_against_request 9ms
engine::validation_wasm::tests::test_validate_user_decrypt_responses_with_5_responses 9ms
grpc::tests::regression_tests::test_request_id_compile_time_interface_stability 5ms
grpc::tests::regression_tests::test_request_id_core_structure_and_api_consistency 5ms
grpc::tests::regression_tests::test_request_id_validation_and_error_handling 5ms
grpc::tests::unit_tests::test_get_meta_store_info_with_real_stores 5ms
grpc::tests::unit_tests::test_get_meta_store_info_with_unavailable_stores 5ms
grpc::tests::unit_tests::test_list_requests_invalid_store_type 5ms
grpc::tests::unit_tests::test_list_requests_pagination 5ms
grpc::tests::unit_tests::test_list_requests_with_real_stores 4ms
grpc::tests::unit_tests::test_list_requests_with_unavailable_stores 5ms
grpc::tests::unit_tests::test_service_with_mixed_store_availability 5ms
testing::material::manager::tests::test_setup_centralized_material 13ms
testing::material::manager::tests::test_setup_threshold_material 21ms
testing::material::spec::tests::test_centralized_basic_spec 5ms
testing::material::spec::tests::test_comprehensive_spec 5ms
testing::material::spec::tests::test_key_type_covers_all_priv_data_types 5ms
testing::material::spec::tests::test_key_type_covers_all_pub_data_types 4ms
testing::material::spec::tests::test_serialization 5ms
testing::material::spec::tests::test_threshold_basic_spec 4ms
testing::material::spec::tests::test_threshold_default_no_prss_spec 4ms
testing::material::spec::tests::test_threshold_default_spec_requires_prss 6ms
testing::utils::test_purge 7ms
util::file_handling::tests::read_write_element 5ms
util::file_handling::tests::read_write_text 5ms
util::key_setup::tests::test_max_num_bits 4.0s
util::meta_store::tests::auto_remove 6ms
util::meta_store::tests::delete 6ms
util::meta_store::tests::double_insert 6ms
util::meta_store::tests::sunshine 5ms
util::meta_store::tests::test_kickout_of_errors 5ms
util::meta_store::tests::test_subscription 5.0s
util::meta_store::tests::too_many_elements 6ms
util::rate_limiter::tests::test_rate_limiting_1 6ms
util::rate_limiter::tests::test_rate_limiting_more 5ms
util::rate_limiter::tests::test_rate_limiting_refusal 5ms
util::retry::tests::fatal_loop_fails 50ms
util::retry::tests::retry_loop_fails 50ms
util::retry::tests::sunshine_fatal_loop 62ms
util::retry::tests::sunshine_retry_loop 62ms
vault::keychain::secretsharing::tests::test_encrypt_and_decrypt_roundtrip 7ms
vault::keychain::secretsharing::tests::test_new_keychain_without_pub_storage 5ms
vault::keychain::secretsharing::tests::test_operator_public_key_bytes_error 5ms
vault::keychain::secretsharing::tests::test_set_and_get_backup_enc_key 5ms
vault::keychain::secretsharing::tests::test_validate_recovery_material_invalid_signature 7ms
vault::keychain::secretsharing::tests::test_validate_recovery_material_no_material_is_ok 5ms
vault::keychain::secretsharing::tests::test_validate_recovery_material_valid_signature 6ms
vault::keychain::tests::test_verify_root_key_measurements 5ms
vault::storage::crypto_material::tests::read_guarded_crypto_material_from_cache_not_found 5ms
vault::storage::crypto_material::tests::read_guarded_threshold_fhe_keys_not_found 5ms
vault::storage::crypto_material::tests::read_public_key 5ms
vault::storage::crypto_material::tests::write_central_keys 15ms
vault::storage::crypto_material::tests::write_central_keys_failed_storage_sets_terminal_error 11ms
vault::storage::crypto_material::tests::write_crs 389ms
vault::storage::crypto_material::tests::write_threshold_compressed_empty_update_cleans_up 159ms
vault::storage::crypto_material::tests::write_threshold_empty_update 77ms
vault::storage::crypto_material::tests::write_threshold_keys_failed_storage 73ms
vault::storage::crypto_material::tests::write_threshold_keys_meta_update 74ms
vault::storage::file::tests::storage_helper_methods::threshold_1_true 14ms
vault::storage::file::tests::storage_helper_methods::threshold_2_false 13ms
vault::storage::file::tests::test_all_data_ids_from_all_epochs_file 8ms
vault::storage::file::tests::test_data_ids_with_only_epoch_data_file 6ms
vault::storage::file::tests::test_delete_at_epoch_keeps_dir_when_not_empty 6ms
vault::storage::file::tests::test_delete_at_epoch_removes_empty_epoch_dir 6ms
vault::storage::file::tests::test_epoch_ids_with_only_non_epoch_data_file 6ms
vault::storage::file::tests::test_epoch_storage 6ms
vault::storage::file::tests::test_mixed_epoch_and_non_epoch_data_file 7ms
vault::storage::file::tests::test_overwrite_logic_files 6ms
vault::storage::file::tests::test_store_bytes_at_epoch_does_not_overwrite_file 6ms
vault::storage::file::tests::test_store_load_bytes_at_epoch_file 7ms
vault::storage::ram::tests::storage_helper_methods 5ms
vault::storage::ram::tests::test_all_data_ids_from_all_epochs_ram 5ms
vault::storage::ram::tests::test_data_ids_with_only_epoch_data_ram 5ms
vault::storage::ram::tests::test_epoch_ids_with_only_non_epoch_data_ram 5ms
vault::storage::ram::tests::test_mixed_epoch_and_non_epoch_data_ram 5ms
vault::storage::ram::tests::test_overwrite_logic_ram 5ms
vault::storage::ram::tests::test_overwrite_logic_ram_on_epoch 5ms
vault::storage::ram::tests::test_store_load_bytes_at_epoch_ram 5ms
vault::storage::s3::test_find_region 4ms
vault::tests::regression_test_vault_data_type_serialization 4ms
client::tests::threshold::user_decryption_tests::default_user_decryption_threshold::case_1::secure_1_true 7m 12s
client::tests::threshold::user_decryption_tests::default_user_decryption_threshold::case_2::secure_1_true 27.2s
client::tests::threshold::user_decryption_tests::default_user_decryption_threshold_precompute_sns::case_1::secure_1_true 28.0s
client::tests::threshold::user_decryption_tests::default_user_decryption_threshold_with_crash::case_1::secure_1_true 28.2s
client::tests::threshold::user_decryption_tests::default_user_decryption_threshold_with_crash::case_1::secure_2_false 28.2s
config_conformance_client_local_centralized 6ms
test_centralized_insecure_compressed_keygen 789ms
test_centralized_custodian_backup 840ms
test_centralized_crsgen_secure 1.1s
test_centralized_restore_from_backup 1.2s
test_centralized_insecure 41.9s
test_centralized_crsgen_secure 10m 32s
test_centralized_custodian_backup 53.4s
test_centralized_insecure 4m 2s
test_centralized_insecure_compressed_keygen 7m 56s
test_centralized_restore_from_backup 52.5s
test_backward_compatibility_kms_grpc 4ms
test_backward_compatibility_threshold_fhe 77ms
test_backward_compatibility_kms 759ms
tests::test_parse_hex 4ms
tests::test_parse_previous_key_info 4ms
tests::test_invalid_hex 4ms
tests::test_core_client_config 4ms
crsgen::tests::test_eip712_sigs 549ms
conf::party::tests::test_party_conf_with_env 4ms
conf::party::tests::test_party_conf_error_conf 5ms
conf::party::tests::test_party_conf_with_real_file 5ms
conf::party::tests::test_party_conf_no_peers 5ms
tls_certs::tests::test_ca_name_validation 3ms
tls_certs::tests::test_ca_cert_selfsigned_verify 30ms
tls_certs::tests::test_cert_chain 31ms
identifiers::tests::request_id_ordering 4ms
rpc_types::tests::test_types_plaintext_ser 4ms
rpc_types::tests::test_abi_encoding_fhevm 4ms
rpc_types::tests::test_request_id 4ms
identifiers::tests::test_v1_request_id_with_prefix 6ms
rpc_types::tests::test_enum_default 6ms
identifiers::tests::test_invalid_id_all_zeros 6ms
identifiers::tests::test_v1_request_id_to_u128_conversion 6ms
rpc_types::tests::test_eip712_verification 6ms
identifiers::tests::test_invalid_hex_length 7ms
identifiers::tests::test_key_id_from_str 7ms
identifiers::tests::test_id_type_conversions 7ms
rpc_types::tests::test_request_id_raw_string 7ms
identifiers::tests::test_key_id_protobuf_conversion 7ms
identifiers::tests::test_v1_request_id_conversion 9ms
identifiers::tests::test_invalid_v1_request_id 9ms
rpc_types::tests::test_old_fhe_type_enum_compatibility 9ms
identifiers::tests::test_valid_hex_characters 9ms
rpc_types::tests::idempotent_plaintext 9ms
identifiers::tests::test_request_id_random 10ms
identifiers::tests::test_v1_request_id_with_whitespace 10ms

Flaky Tests

Flaky Tests 🍂 Retries
client::tests::threshold::public_decryption_tests::test_decryption_threshold::case_1 1

Github Test Reporter by CTRF 💚

🔄 This comment has been updated

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the custodian backup/recovery flow to carry an explicit MPC context identifier so recovery artifacts can be associated with the correct operator verification key when multiple signing keys exist. It also refactors S3 anonymous access helpers (including region inference) and updates tests/docs accordingly.

Changes:

  • Add mpc_context_id to NewCustodianContextRequest and propagate it through recovery material creation and custodian recovery outputs.
  • Tighten public decryption response validation around server verification keys (uniqueness/matching) and adjust related tests.
  • Move/centralize S3 region inference + update anonymous S3 client construction call sites (core + core-client).

Reviewed changes

Copilot reviewed 23 out of 24 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
docs/guides/core_client.md Updates manual test instructions; adds required --mpc_context_id and a key filename warning.
core/service/tests/integration_test.rs Updates integration test setup for renamed custodian context field and new mpc_context.
core/service/tests/backward_compatibility_kms.rs Updates backward-compat tests to include the new mpc_context/mpc_context_id fields.
core/service/src/vault/storage/s3.rs Changes anonymous client builder signature; adds find_region_from_s3_url; adds tests (but currently contains unresolved conflict markers).
core/service/src/vault/keychain/secretsharing.rs Updates tests for renamed custodian context field and new RecoveryValidationMaterial::new signature.
core/service/src/engine/validation_non_wasm.rs Refactors public decrypt response validation to validate uniqueness by deserializing server keys; updates test helpers/calls.
core/service/src/engine/threshold/service/reshare_utils.rs Uses S3 helpers from vault::storage::s3 and updates anonymous client construction.
core/service/src/engine/context_manager.rs Requires mpc_context_id for new custodian contexts; threads it through validation material generation; updates tests.
core/service/src/engine/backup_operator.rs Threads MPC context through recovery request generation by reading it from stored validation material.
core/service/src/client/tests/threshold/custodian_context_tests.rs Updates client test helper to pass an MPC context id.
core/service/src/client/tests/threshold/custodian_backup_tests.rs Updates reencryption verification calls to include mpc_context_id.
core/service/src/client/tests/centralized/custodian_context_tests.rs Updates client test helper to pass an MPC context id.
core/service/src/client/tests/centralized/custodian_backup_tests.rs Updates reencryption verification calls to include mpc_context_id.
core/service/src/client/custodian_context.rs Updates request builder for renamed proto field and adds mpc_context_id.
core/service/src/bin/kms-custodian.rs Adds CLI flag --mpc_context_id and passes it into custodian reencryption verification (currently uses panics on invalid input).
core/service/src/backup/tests.rs Updates backup tests to pass mpc_context_id into reencryption + validation material creation.
core/service/src/backup/operator.rs Extends RecoveryValidationMaterialPayload with mpc_context.
core/service/src/backup/custodian.rs Extends InternalCustodianRecoveryOutput and grpc conversions with mpc_context_id; updates custodian context field name.
core/grpc/proto/kms.v1.proto Renames custodian context id field; renames new_context field; adds mpc_context_id and recovery output field.
core-client/tests/integration/integration_test.rs Updates core-client integration test to pass mpc_context_id when creating custodian context.
core-client/tests/integration/integration_test_isolated.rs Same as above for isolated tests.
core-client/src/s3_operations.rs Refactors key fetching to use S3Storage + shared S3 helper utilities.
core-client/src/lib.rs Adds mpc_context_id CLI arg for the NewCustodianContext command and parses it as a ContextId.
core-client/src/backup.rs Updates custodian context creation RPC to include mpc_context_id; enforces all recovery outputs share the same MPC context id.
Comments suppressed due to low confidence (1)

core/service/src/engine/validation_non_wasm.rs:589

  • validate_public_decrypt_responses no longer checks trusted_ctx.extra_data against cur_resp.extra_data when eip712_domain is None. This makes PublicDecTrustedValidationContext::extra_data effectively unenforced in the non-EIP712 path and can allow responses with unexpected extra_data to be accepted. If extra_data is meant to be part of the request/response binding outside of EIP-712, reintroduce the explicit mismatch check (or include it in the signed message) for the non-EIP712 case.
        // Validate that all the responses agree with the pivot on the static parts of the
        // response
        let eip712_params = trusted_ctx
            .eip712_domain
            .map(|domain| Eip712VerificationParams {
                response_external_signature: &cur_resp.external_signature,
                response_extra_data: &cur_resp.extra_data,
                trusted_eip712_domain: domain,
            });
        if !validate_public_decrypt_meta_data(
            &cur_verf_key,
            trusted_ctx.ext_handles_bytes,
            &pivot_payload,
            cur_payload,
            &cur_resp.signature,
            eip712_params.as_ref(),
        )? {
            tracing::warn!("Some server did not provide the proper response!");

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread core/service/src/vault/storage/s3.rs
Comment thread core/service/src/vault/storage/s3.rs Outdated
Comment thread core/service/src/backup/operator.rs
Comment thread core/service/src/backup/custodian.rs
Comment thread core/service/src/backup/custodian.rs
jot2re and others added 2 commits April 9, 2026 16:17
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@jot2re jot2re marked this pull request as ready for review April 9, 2026 14:27
@jot2re jot2re requested a review from a team as a code owner April 9, 2026 14:27
@jot2re jot2re changed the title fix: cherry picks from closed PR on multiple signing keys fix: cherry picks from closed PR on multiple signing keys - MPC context in custodian backup Apr 9, 2026
Comment thread core/service/src/bin/kms-custodian.rs Outdated
Comment thread core/service/src/engine/backup_operator.rs Outdated
Comment thread core/service/src/engine/validation_non_wasm.rs
@dd23
Copy link
Copy Markdown
Member

dd23 commented Apr 9, 2026

From a review that I did locally with Codex (and that I didn't have the time to check to the full extent):

The PR adds the right identifier, but the recovery path still trusts the wrong key.

Here’s the flow I’m worried about:

  1. When a custodian backup is created, the operator signs RecoveryValidationMaterial with the operator signing key that exists at backup time. The PR now also stores the MPC context ID alongside that material in operator.rs (line 280).
  2. MPC contexts already contain per-node verification keys, so that stored context ID is exactly what you’d need to recover the old operator key later. You can see that in kms.v1.proto (line 555) and in how default contexts are built in context_manager.rs (line 398).
  3. But during recovery init, the code loads the stored recovery material and immediately validates its signature with the current self.base_kms.verf_key() in backup_operator.rs (line 305).
  4. The helper used for the same step also takes only a caller-supplied verification key and checks against that current key, not against the key from payload.mpc_context, in backup_operator.rs (line 527).
  5. Then the supposedly relevant payload.mpc_context is passed into gen_outer_recovery_request, but that parameter is named _mpc_context and never used in the function body, which is a strong sign the implementation stopped halfway.

Why that matters:

  • Suppose backup B was created under MPC context C1, where this node’s operator verification key was VK_old.
  • Later the system moves to context C2, and the node now uses VK_new.
  • The stored backup metadata is still signed by VK_old.
  • Recovery should say “this backup belongs to C1, so validate it with the C1 key for this node.”
  • Instead it says “validate it with the node’s current key,” which is VK_new, so verification fails before the new mpc_context field can help at all.

So the essence of the P1 is not “the new field is useless everywhere,” but “the critical place where it needs to be consumed still uses the live key, which defeats the stated recovery-after-context-change goal.”

What I’d expect instead is roughly:

  • Load recovery_material.
  • Read recovery_material.payload.mpc_context.
  • Resolve that historical MPC context to this node’s historical verification key.
  • Validate the stored recovery material with that historical key, not self.base_kms.verf_key().

I’d also re-check any later recovery steps for the same “current key vs historical key” assumption, but this validation step is the first hard blocker.

I think the TL;DR is: It seems we're trying to verify an old backup with a new key, which seems like an issue indeed. We should check this.

Copy link
Copy Markdown
Contributor

@kc1212 kc1212 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There seem to be something weird going on with the verification

Comment thread core-client/tests/integration/integration_test.rs Outdated
Comment thread core/grpc/proto/kms.v1.proto
Comment thread core/service/src/bin/kms-custodian.rs Outdated
Comment thread core/service/src/engine/validation_non_wasm.rs
Comment thread core/service/src/engine/validation_non_wasm.rs Outdated
Comment thread core/service/src/engine/validation_non_wasm.rs
Comment thread core/service/src/engine/validation_non_wasm.rs Outdated
@jot2re
Copy link
Copy Markdown
Collaborator Author

jot2re commented Apr 15, 2026

@dd23 @kc1212 could you do a rereview? Note: I had to make some more fixes. The description of the PR has been updated to reflect the changes

@kc1212
Copy link
Copy Markdown
Contributor

kc1212 commented Apr 15, 2026

Updates to client validation in user decryption to properly ensure respones are ok, and not accept multiple responses signed by the same KMS.

you mean public decryption right? because the simplification is in validation_non_wasm

Comment thread core/service/src/vault/storage/s3.rs Outdated
Copy link
Copy Markdown
Contributor

@kc1212 kc1212 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My main question is on the mpc_context_id, otherwise LGTM!

Comment thread core/service/src/bin/kms-custodian.rs Outdated
Comment thread backward-compatibility/data/kms.ron
Comment thread core/service/src/backup/operator.rs
@dd23
Copy link
Copy Markdown
Member

dd23 commented Apr 15, 2026

Codex flagged the following:

This code verifies that all custodian outputs agree on mpc_context_id, but then immediately looks up each operator by the current SIGNING_KEY_ID from S3 and only forwards outputs whose embedded operator key matches that current key. The PR also stores the backup's original MPC context in RecoveryValidationMaterialPayload, but that context is never consulted here or in server-side recovery loading. In the exact scenario this PR describes—backup created under an old MPC context, then context/signing keys changed—none of the reencryption outputs will match the current keys, so the client sends empty recovery sets and backup recovery fails.

Backup recovery after an MPC context change still looks broken. The client records and checks a shared mpc_context_id in backup.rs (line 140), and the PR stores that context in operator.rs (line 304), but recovery routing still uses the current verification keys fetched from s3_operations.rs (line 85). I also don’t see the stored mpc_context being consulted when loading recovery material in backup_operator.rs (line 520). If signing keys changed with the context, the reencryption outputs won’t be matched to any current operator and recovery will fail.

I tried to make sense of if, but I'm not sure if it's an actual issue. Maybe you can have a look @jot2re

@jot2re
Copy link
Copy Markdown
Collaborator Author

jot2re commented Apr 15, 2026

Codex flagged the following:

This code verifies that all custodian outputs agree on mpc_context_id, but then immediately looks up each operator by the current SIGNING_KEY_ID from S3 and only forwards outputs whose embedded operator key matches that current key. The PR also stores the backup's original MPC context in RecoveryValidationMaterialPayload, but that context is never consulted here or in server-side recovery loading. In the exact scenario this PR describes—backup created under an old MPC context, then context/signing keys changed—none of the reencryption outputs will match the current keys, so the client sends empty recovery sets and backup recovery fails.
Backup recovery after an MPC context change still looks broken. The client records and checks a shared mpc_context_id in backup.rs (line 140), and the PR stores that context in operator.rs (line 304), but recovery routing still uses the current verification keys fetched from s3_operations.rs (line 85). I also don’t see the stored mpc_context being consulted when loading recovery material in backup_operator.rs (line 520). If signing keys changed with the context, the reencryption outputs won’t be matched to any current operator and recovery will fail.

I tried to make sense of if, but I'm not sure if it's an actual issue. Maybe you can have a look @jot2re

From how I understand Codex here, it looks like the issue is exactly the thing we talked about last night; that we now assume signing keys never change (at least not without making a new context that is deployed by a new conceptual party). For this reason a backup must be redone when we launch such a new party and old backups won't work, since they are conceptually done by another party.

However, I find Codex comment a bit weird and partially untrue; we don't store the MPC context as part of any objects used in custodian backup. We only store the MPC context ID.

I guess part of it's complaint is that we do not use it when recovering, but I cannot see why would need it? I guess if we want to be pedantic we could validate that the verification key fetched does indeed match the one of the context, after having recovered. But tbh I don't think we need to do these extra, restrictive checks, in code. We have always found that checks that aren't strictly needed, could hinder us when experimenting with new features.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 109 out of 120 changed files in this pull request and generated 6 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread docs/guides/backup.md Outdated
Comment thread docs/guides/core_client.md Outdated
Comment thread core/service/src/engine/threshold/service/reshare_utils.rs Outdated
Comment thread core/service/src/engine/validation_non_wasm.rs
Comment thread docs/guides/backup.md Outdated
Comment thread docs/guides/backup.md Outdated
Copy link
Copy Markdown
Member

@dd23 dd23 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great work! LGTM.

@jot2re jot2re merged commit 628d48f into main Apr 17, 2026
68 checks passed
@jot2re jot2re deleted the tore/fix/signing-key-cherry-picks branch April 17, 2026 14:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla-signed The CLA has been signed.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants