Skip to content

Commit 5349dd3

Browse files
author
Marta Mularczyk
committed
Add SigningData struct
1 parent 369a67b commit 5349dd3

File tree

7 files changed

+95
-62
lines changed

7 files changed

+95
-62
lines changed

mls-rs-core/src/identity.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,17 @@ mod x509;
1212

1313
pub use basic::*;
1414
pub use credential::*;
15+
use mls_rs_codec::{MlsDecode, MlsEncode, MlsSize};
1516
pub use provider::*;
1617
pub use signing_identity::*;
1718

1819
#[cfg(feature = "x509")]
1920
pub use x509::*;
21+
22+
use crate::crypto::SignatureSecretKey;
23+
24+
#[derive(Clone, Debug, MlsEncode, MlsSize, MlsDecode, PartialEq)]
25+
pub struct SigningData {
26+
pub signing_identity: SigningIdentity,
27+
pub signing_key: SignatureSecretKey,
28+
}

mls-rs/examples/api_1x.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ fn main() -> Result<(), MlsError> {
2626

2727
// Bob generates key package. We store secrets in memory, no need for any storage.
2828
let key_package_generation = bob
29-
.key_package_builder(CIPHERSUITE)?
29+
.key_package_builder(CIPHERSUITE, None)?
3030
.valid_for_sec(123)
3131
.build()?;
3232

mls-rs/src/client.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ use mls_rs_core::crypto::{CryptoProvider, SignatureSecretKey};
3131
use mls_rs_core::error::{AnyError, IntoAnyError};
3232
use mls_rs_core::extension::{ExtensionError, ExtensionList, ExtensionType};
3333
use mls_rs_core::group::{GroupStateStorage, ProposalType};
34-
use mls_rs_core::identity::{CredentialType, IdentityProvider, MemberValidationContext};
34+
use mls_rs_core::identity::{
35+
CredentialType, IdentityProvider, MemberValidationContext, SigningData,
36+
};
3537
use mls_rs_core::key_package::{KeyPackageData, KeyPackageStorage};
3638

3739
use crate::group::external_commit::ExternalCommitBuilder;
@@ -491,8 +493,9 @@ where
491493
pub fn key_package_builder(
492494
&self,
493495
cipher_suite: CipherSuite,
496+
signing_data: Option<SigningData>,
494497
) -> Result<
495-
KeyPackageBuilder<'_, <C::CryptoProvider as CryptoProvider>::CipherSuiteProvider>,
498+
KeyPackageBuilder<<C::CryptoProvider as CryptoProvider>::CipherSuiteProvider>,
496499
MlsError,
497500
> {
498501
let cipher_suite_provider = self
@@ -501,7 +504,11 @@ where
501504
.cipher_suite_provider(cipher_suite)
502505
.ok_or(MlsError::UnsupportedCipherSuite(cipher_suite))?;
503506

504-
Ok(KeyPackageBuilder::new(self, cipher_suite_provider))
507+
Ok(KeyPackageBuilder::new(
508+
self,
509+
cipher_suite_provider,
510+
signing_data,
511+
)?)
505512
}
506513

507514
/// Create a group with a specific group_id.

mls-rs/src/external_client.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ mod config;
1313
mod group;
1414

1515
pub(crate) use config::ExternalClientConfig;
16-
use mls_rs_core::{
17-
crypto::{CryptoProvider, SignatureSecretKey},
18-
identity::SigningIdentity,
19-
};
16+
use mls_rs_core::{crypto::CryptoProvider, identity::SigningData};
2017

2118
use builder::{ExternalBaseConfig, ExternalClientBuilder};
2219

@@ -39,7 +36,7 @@ pub use group::{ExternalGroup, ExternalReceivedMessage, ExternalSnapshot};
3936
/// the resulting group state.
4037
pub struct ExternalClient<C> {
4138
config: C,
42-
signing_data: Option<(SignatureSecretKey, SigningIdentity)>,
39+
signing_data: Option<SigningData>,
4340
}
4441

4542
impl ExternalClient<()> {
@@ -52,10 +49,7 @@ impl<C> ExternalClient<C>
5249
where
5350
C: ExternalClientConfig + Clone,
5451
{
55-
pub(crate) fn new(
56-
config: C,
57-
signing_data: Option<(SignatureSecretKey, SigningIdentity)>,
58-
) -> Self {
52+
pub(crate) fn new(config: C, signing_data: Option<SigningData>) -> Self {
5953
Self {
6054
config,
6155
signing_data,

mls-rs/src/external_client/builder.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,10 @@ impl<C: IntoConfig> ExternalClientBuilder<C> {
276276
signing_identity: SigningIdentity,
277277
) -> ExternalClientBuilder<IntoConfigOutput<C>> {
278278
let mut c = self.0.into_config();
279-
c.0.signing_data = Some((signer, signing_identity));
279+
c.0.signing_data = Some(SigningData {
280+
signing_identity,
281+
signing_key: signer,
282+
});
280283
ExternalClientBuilder(c)
281284
}
282285
}
@@ -520,7 +523,7 @@ impl Default for Settings {
520523
/// Definitions meant to be private that are inaccessible outside this crate. They need to be marked
521524
/// `pub` because they appear in public definitions.
522525
mod private {
523-
use mls_rs_core::{crypto::SignatureSecretKey, identity::SigningIdentity};
526+
use mls_rs_core::identity::SigningData;
524527

525528
use super::{IntoConfigOutput, Settings};
526529

@@ -533,7 +536,7 @@ mod private {
533536
pub(crate) identity_provider: Ip,
534537
pub(crate) mls_rules: Mpf,
535538
pub(crate) crypto_provider: Cp,
536-
pub(crate) signing_data: Option<(SignatureSecretKey, SigningIdentity)>,
539+
pub(crate) signing_data: Option<SigningData>,
537540
}
538541

539542
pub trait IntoConfig {
@@ -557,7 +560,7 @@ mod private {
557560

558561
use mls_rs_core::{
559562
crypto::SignatureSecretKey,
560-
identity::{IdentityProvider, SigningIdentity},
563+
identity::{IdentityProvider, SigningData, SigningIdentity},
561564
};
562565
use private::{Config, ConfigInner, IntoConfig};
563566

mls-rs/src/external_client/group.rs

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44

55
use mls_rs_codec::{MlsDecode, MlsEncode, MlsSize};
66
use mls_rs_core::{
7-
crypto::SignatureSecretKey, error::IntoAnyError, extension::ExtensionList, group::Member,
8-
identity::IdentityProvider,
7+
error::IntoAnyError,
8+
extension::ExtensionList,
9+
group::Member,
10+
identity::{IdentityProvider, SigningData},
911
};
1012

1113
use crate::{
@@ -103,14 +105,14 @@ where
103105
pub(crate) config: C,
104106
pub(crate) cipher_suite_provider: <C::CryptoProvider as CryptoProvider>::CipherSuiteProvider,
105107
pub(crate) state: GroupState,
106-
pub(crate) signing_data: Option<(SignatureSecretKey, SigningIdentity)>,
108+
pub(crate) signing_data: Option<SigningData>,
107109
}
108110

109111
impl<C: ExternalClientConfig + Clone> ExternalGroup<C> {
110112
#[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)]
111113
pub(crate) async fn join(
112114
config: C,
113-
signing_data: Option<(SignatureSecretKey, SigningIdentity)>,
115+
signing_data: Option<SigningData>,
114116
group_info: MlsMessage,
115117
tree_data: Option<ExportedTree<'_>>,
116118
) -> Result<Self, MlsError> {
@@ -428,8 +430,10 @@ impl<C: ExternalClientConfig + Clone> ExternalGroup<C> {
428430
proposal: Proposal,
429431
authenticated_data: Vec<u8>,
430432
) -> Result<MlsMessage, MlsError> {
431-
let (signer, signing_identity) =
432-
self.signing_data.as_ref().ok_or(MlsError::SignerNotFound)?;
433+
let SigningData {
434+
signing_key,
435+
signing_identity,
436+
} = self.signing_data.as_ref().ok_or(MlsError::SignerNotFound)?;
433437

434438
let external_senders_ext = self
435439
.state
@@ -451,7 +455,7 @@ impl<C: ExternalClientConfig + Clone> ExternalGroup<C> {
451455
&self.state.context,
452456
sender,
453457
Content::Proposal(Box::new(proposal.clone())),
454-
signer,
458+
signing_key,
455459
WireFormat::PublicMessage,
456460
authenticated_data,
457461
)
@@ -664,7 +668,7 @@ where
664668
pub struct ExternalSnapshot {
665669
version: u16,
666670
pub(crate) state: RawGroupState,
667-
signing_data: Option<(SignatureSecretKey, SigningIdentity)>,
671+
signing_data: Option<SigningData>,
668672
}
669673

670674
impl ExternalSnapshot {
@@ -851,6 +855,9 @@ mod tests {
851855
use assert_matches::assert_matches;
852856
use mls_rs_codec::{MlsDecode, MlsEncode};
853857

858+
#[cfg(feature = "by_ref_proposal")]
859+
use mls_rs_core::identity::SigningData;
860+
854861
#[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)]
855862
async fn test_group_with_one_commit(v: ProtocolVersion, cs: CipherSuite) -> TestGroup {
856863
let mut group = test_group(v, cs).await;
@@ -1170,7 +1177,10 @@ mod tests {
11701177

11711178
let mut server = make_external_group(&alice).await;
11721179

1173-
server.signing_data = Some((server_key, server_identity));
1180+
server.signing_data = Some(SigningData {
1181+
signing_key: server_key,
1182+
signing_identity: server_identity,
1183+
});
11741184

11751185
let charlie_key_package =
11761186
test_key_package_message(TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE, "charlie").await;
@@ -1190,7 +1200,10 @@ mod tests {
11901200

11911201
let mut server = make_external_group(&alice).await;
11921202

1193-
server.signing_data = Some((server_key, server_identity));
1203+
server.signing_data = Some(SigningData {
1204+
signing_key: server_key,
1205+
signing_identity: server_identity,
1206+
});
11941207

11951208
let external_proposal = server.propose_remove(1, vec![]).await.unwrap();
11961209

@@ -1203,7 +1216,10 @@ mod tests {
12031216
let (signing_id, secret_key, alice) = setup_extern_proposal_test(false).await;
12041217
let mut server = make_external_group(&alice).await;
12051218

1206-
server.signing_data = Some((secret_key, signing_id));
1219+
server.signing_data = Some(SigningData {
1220+
signing_key: secret_key,
1221+
signing_identity: signing_id,
1222+
});
12071223

12081224
let charlie_key_package =
12091225
test_key_package_message(TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE, "charlie").await;
@@ -1232,7 +1248,10 @@ mod tests {
12321248

12331249
let mut server = make_external_group(&alice).await;
12341250

1235-
server.signing_data = Some((server_key, server_identity));
1251+
server.signing_data = Some(SigningData {
1252+
signing_key: server_key,
1253+
signing_identity: server_identity,
1254+
});
12361255

12371256
let res = server.propose_remove(1, vec![]).await;
12381257

mls-rs/src/key_package/builder.rs

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ use alloc::vec;
88
use mls_rs_codec::{MlsDecode, MlsEncode, MlsSize};
99
use mls_rs_core::error::IntoAnyError;
1010
use mls_rs_core::extension::MlsExtension;
11+
use mls_rs_core::identity::SigningData;
1112
use mls_rs_core::key_package::KeyPackageData;
1213

1314
use crate::client::MlsError;
1415
use crate::client_config::ClientConfig;
1516
use crate::Client;
1617
use crate::{
17-
crypto::{HpkeSecretKey, SignatureSecretKey},
18+
crypto::HpkeSecretKey,
1819
group::framing::MlsMessagePayload,
19-
identity::SigningIdentity,
2020
protocol_version::ProtocolVersion,
2121
signer::Signable,
2222
tree_kem::{
@@ -29,31 +29,18 @@ use crate::{
2929
use super::{KeyPackage, KeyPackageRef};
3030

3131
#[derive(Clone, Debug)]
32-
pub struct KeyPackageBuilder<'a, CP> {
32+
pub struct KeyPackageBuilder<CP> {
3333
protocol_version: ProtocolVersion,
3434
cipher_suite_provider: CP,
35-
signing_identity: Option<SigningIdentity>,
36-
signing_key: Option<&'a SignatureSecretKey>,
35+
signing_data: SigningData,
3736
key_package_extensions: ExtensionList,
3837
leaf_node_extensions: ExtensionList,
3938
validity_sec: u64,
4039
// This I feel like can still be fixed for client as it rarely changes?
4140
capabilities: Capabilities,
4241
}
4342

44-
impl<'a, CP> KeyPackageBuilder<'a, CP> {
45-
pub fn signing_data(
46-
self,
47-
signing_identity: SigningIdentity,
48-
signing_key: &'a SignatureSecretKey,
49-
) -> Self {
50-
Self {
51-
signing_identity: Some(signing_identity),
52-
signing_key: Some(signing_key),
53-
..self
54-
}
55-
}
56-
43+
impl<CP> KeyPackageBuilder<CP> {
5744
pub fn with_key_package_extension<T: MlsExtension>(
5845
mut self,
5946
extension: T,
@@ -80,13 +67,13 @@ impl<'a, CP> KeyPackageBuilder<'a, CP> {
8067
}
8168
}
8269

83-
impl<CP: CipherSuiteProvider> KeyPackageBuilder<'_, CP> {
70+
impl<CP: CipherSuiteProvider> KeyPackageBuilder<CP> {
8471
#[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)]
8572
pub async fn build(self) -> Result<KeyPackageGeneration, MlsError> {
86-
let (signing_identity, signing_key) = self
87-
.signing_identity
88-
.zip(self.signing_key)
89-
.ok_or(MlsError::SignerNotFound)?;
73+
let SigningData {
74+
signing_identity,
75+
signing_key,
76+
} = self.signing_data;
9077

9178
let (init_secret_key, public_init) = self
9279
.cipher_suite_provider
@@ -105,7 +92,7 @@ impl<CP: CipherSuiteProvider> KeyPackageBuilder<'_, CP> {
10592
&self.cipher_suite_provider,
10693
properties,
10794
signing_identity,
108-
signing_key,
95+
&signing_key,
10996
lifetime,
11097
)
11198
.await?;
@@ -122,7 +109,7 @@ impl<CP: CipherSuiteProvider> KeyPackageBuilder<'_, CP> {
122109
package.grease(&self.cipher_suite_provider)?;
123110

124111
package
125-
.sign(&self.cipher_suite_provider, signing_key, &())
112+
.sign(&self.cipher_suite_provider, &signing_key, &())
126113
.await?;
127114

128115
let package_bytes = package.mls_encode_to_vec()?;
@@ -160,18 +147,32 @@ pub struct KeyPackageGeneration {
160147
pub key_package_data: KeyPackageData,
161148
}
162149

163-
impl<'a, CP> KeyPackageBuilder<'a, CP> {
164-
pub(crate) fn new<C: ClientConfig>(client: &'a Client<C>, cipher_suite_provider: CP) -> Self {
165-
Self {
150+
impl<CP> KeyPackageBuilder<CP> {
151+
pub(crate) fn new<C: ClientConfig>(
152+
client: &Client<C>,
153+
cipher_suite_provider: CP,
154+
signing_data: Option<SigningData>,
155+
) -> Result<Self, MlsError> {
156+
let signing_data = client
157+
.signing_identity
158+
.clone()
159+
.zip(client.signer.clone())
160+
.map(|((signing_identity, _), signing_key)| SigningData {
161+
signing_identity,
162+
signing_key,
163+
})
164+
.or_else(|| signing_data)
165+
.ok_or(MlsError::SignerNotFound)?;
166+
167+
Ok(Self {
166168
protocol_version: client.version,
167169
cipher_suite_provider,
168-
signing_identity: client.signing_identity.clone().map(|(id, _)| id),
169-
signing_key: client.signer.as_ref(),
170+
signing_data,
170171
key_package_extensions: Default::default(),
171172
leaf_node_extensions: Default::default(),
172173
validity_sec: 86400 * 366,
173174
capabilities: client.config.capabilities(),
174-
}
175+
})
175176
}
176177
}
177178

@@ -213,7 +214,7 @@ mod tests {
213214
.build();
214215

215216
let generated = client
216-
.key_package_builder(cipher_suite)
217+
.key_package_builder(cipher_suite, None)
217218
.unwrap()
218219
.with_key_package_extension(TestExtension::from(32))
219220
.unwrap()
@@ -296,7 +297,7 @@ mod tests {
296297
.extension_types([42.into()])
297298
.build();
298299

299-
let builder = client.key_package_builder(TEST_CIPHER_SUITE).unwrap();
300+
let builder = client.key_package_builder(TEST_CIPHER_SUITE, None).unwrap();
300301
let mut generated_keys = HashSet::new();
301302

302303
for _ in 0..100 {

0 commit comments

Comments
 (0)