// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // Copyright by contributors to this project. // SPDX-License-Identifier: (Apache-2.0 OR MIT)
usecrate::client::MlsError; usecrate::crypto::{CipherSuiteProvider, HpkePublicKey, HpkeSecretKey}; usecrate::group::key_schedule::kdf_derive_secret; use alloc::vec; use alloc::vec::Vec; use core::{
fmt::{self, Debug},
ops::Deref,
}; use mls_rs_codec::{MlsDecode, MlsEncode, MlsSize}; use mls_rs_core::error::IntoAnyError; use zeroize::Zeroizing;
pubfn empty<P: CipherSuiteProvider>(cipher_suite_provider: &P) -> Self { // Define commit_secret as the all-zero vector of the same length as a path_secret
PathSecret::from(vec![0u8; cipher_suite_provider.kdf_extract_size()])
}
}
#[maybe_async::test(not(mls_build_async), async(mls_build_async, crate::futures_test))] asyncfn test_path_secret_generation() { let cases = load_test_cases();
for test_case in cases { let Some(cs_provider) = try_test_cipher_suite_provider(test_case.cipher_suite) else { continue;
};
let first_secret = PathSecret::from(hex::decode(&test_case.generations[0]).unwrap()); letmut generator = PathSecretGenerator::starting_with(&cs_provider, first_secret);
for expected in &test_case.generations { let generated = hex::encode(&*generator.next_secret().await.unwrap());
assert_eq!(expected, &generated);
}
}
}
#[maybe_async::test(not(mls_build_async), async(mls_build_async, crate::futures_test))] asyncfn test_first_path_is_random() { let cs_provider = test_cipher_suite_provider(TEST_CIPHER_SUITE);
letmut generator = PathSecretGenerator::new(&cs_provider); let first_secret = generator.next_secret().await.unwrap();
for _ in0..100 { letmut next_generator = PathSecretGenerator::new(&cs_provider); let next_secret = next_generator.next_secret().await.unwrap();
assert_ne!(first_secret, next_secret);
}
}
#[maybe_async::test(not(mls_build_async), async(mls_build_async, crate::futures_test))] asyncfn test_starting_with() { let cs_provider = test_cipher_suite_provider(TEST_CIPHER_SUITE); let secret = PathSecret::random(&cs_provider).unwrap();
#[test] fn test_empty_path_secret() { for cipher_suite in TestCryptoProvider::all_supported_cipher_suites() { let cs_provider = test_cipher_suite_provider(cipher_suite); let empty = PathSecret::empty(&cs_provider);
assert_eq!(
empty,
PathSecret::from(vec![0u8; cs_provider.kdf_extract_size()])
)
}
}
#[test] fn test_random_path_secret() { let cs_provider = test_cipher_suite_provider(CipherSuite::P256_AES128); let initial = PathSecret::random(&cs_provider).unwrap();
for _ in0..100 { let next = PathSecret::random(&cs_provider).unwrap();
assert_ne!(next, initial);
}
}
}
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.14Bemerkung:
(vorverarbeitet am 2026-06-20)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.