Skip to content

Commit e0a124b

Browse files
erskingardneryukibtc
authored andcommitted
mls: change NostrMls::exporter_secret output value to [u8;32]
Change `NostrMls::exporter_secret` output value to `[u8;32]`, to enforce size limit.
1 parent 57a582d commit e0a124b

File tree

6 files changed

+32
-22
lines changed

6 files changed

+32
-22
lines changed

crates/nostr-mls-memory-storage/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,12 +350,12 @@ mod tests {
350350
let group_exporter_secret_0 = GroupExporterSecret {
351351
mls_group_id: mls_group_id.clone(),
352352
epoch: 0,
353-
secret: vec![1, 2, 3, 4],
353+
secret: [0u8; 32],
354354
};
355355
let group_exporter_secret_1 = GroupExporterSecret {
356356
mls_group_id: mls_group_id.clone(),
357357
epoch: 1,
358-
secret: vec![5, 6, 7, 8],
358+
secret: [0u8; 32],
359359
};
360360
nostr_storage
361361
.save_group_exporter_secret(group_exporter_secret_0.clone())

crates/nostr-mls-sqlite-storage/src/db.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ pub fn row_to_group_relay(row: &Row) -> SqliteResult<GroupRelay> {
106106
pub fn row_to_group_exporter_secret(row: &Row) -> SqliteResult<GroupExporterSecret> {
107107
let mls_group_id: GroupId = GroupId::from_slice(row.get_ref("mls_group_id")?.as_blob()?);
108108
let epoch: u64 = row.get("epoch")?;
109-
let secret: Vec<u8> = row.get("secret")?;
109+
let secret: [u8; 32] = row.get("secret")?;
110110

111111
Ok(GroupExporterSecret {
112112
mls_group_id,

crates/nostr-mls-sqlite-storage/src/groups.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ mod tests {
385385
let secret1 = GroupExporterSecret {
386386
mls_group_id: mls_group_id.clone(),
387387
epoch: 1,
388-
secret: vec![5, 6, 7, 8],
388+
secret: [0u8; 32],
389389
};
390390

391391
// Save the secret
@@ -396,13 +396,13 @@ mod tests {
396396
.get_group_exporter_secret(&mls_group_id, 1)
397397
.unwrap()
398398
.unwrap();
399-
assert_eq!(retrieved_secret.secret, vec![5, 6, 7, 8]);
399+
assert_eq!(retrieved_secret.secret, [0u8; 32]);
400400

401401
// Create a second secret with same group_id and epoch but different secret value
402402
let secret2 = GroupExporterSecret {
403403
mls_group_id: mls_group_id.clone(),
404404
epoch: 1,
405-
secret: vec![9, 10, 11, 12],
405+
secret: [0u8; 32],
406406
};
407407

408408
// Save the second secret - this should replace the first one due to the "OR REPLACE" in the SQL
@@ -413,13 +413,13 @@ mod tests {
413413
.get_group_exporter_secret(&mls_group_id, 1)
414414
.unwrap()
415415
.unwrap();
416-
assert_eq!(retrieved_secret.secret, vec![9, 10, 11, 12]);
416+
assert_eq!(retrieved_secret.secret, [0u8; 32]);
417417

418418
// Verify we can still save a different epoch
419419
let secret3 = GroupExporterSecret {
420420
mls_group_id: mls_group_id.clone(),
421421
epoch: 2,
422-
secret: vec![13, 14, 15, 16],
422+
secret: [0u8; 32],
423423
};
424424

425425
storage.save_group_exporter_secret(secret3).unwrap();
@@ -434,7 +434,7 @@ mod tests {
434434
.unwrap()
435435
.unwrap();
436436

437-
assert_eq!(retrieved_secret1.secret, vec![9, 10, 11, 12]);
438-
assert_eq!(retrieved_secret2.secret, vec![13, 14, 15, 16]);
437+
assert_eq!(retrieved_secret1.secret, [0u8; 32]);
438+
assert_eq!(retrieved_secret2.secret, [0u8; 32]);
439439
}
440440
}

crates/nostr-mls-sqlite-storage/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,13 +319,13 @@ mod tests {
319319
let secret_epoch_0 = GroupExporterSecret {
320320
mls_group_id: mls_group_id.clone(),
321321
epoch: 0,
322-
secret: vec![1, 2, 3, 4],
322+
secret: [0u8; 32],
323323
};
324324

325325
let secret_epoch_1 = GroupExporterSecret {
326326
mls_group_id: mls_group_id.clone(),
327327
epoch: 1,
328-
secret: vec![5, 6, 7, 8],
328+
secret: [0u8; 32],
329329
};
330330

331331
// Save the exporter secrets
@@ -362,7 +362,7 @@ mod tests {
362362
let updated_secret_0 = GroupExporterSecret {
363363
mls_group_id: mls_group_id.clone(),
364364
epoch: 0,
365-
secret: vec![9, 10, 11, 12],
365+
secret: [0u8; 32],
366366
};
367367
storage
368368
.save_group_exporter_secret(updated_secret_0.clone())
@@ -378,7 +378,7 @@ mod tests {
378378
let invalid_secret = GroupExporterSecret {
379379
mls_group_id: non_existent_group_id.clone(),
380380
epoch: 0,
381-
secret: vec![1, 2, 3, 4],
381+
secret: [0u8; 32],
382382
};
383383
let result = storage.save_group_exporter_secret(invalid_secret);
384384
assert!(result.is_err());

crates/nostr-mls-storage/src/groups/types.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ pub struct GroupExporterSecret {
178178
/// The epoch
179179
pub epoch: u64,
180180
/// The secret
181-
pub secret: Vec<u8>,
181+
pub secret: [u8; 32],
182182
}
183183

184184
#[cfg(test)]
@@ -311,27 +311,33 @@ mod tests {
311311
#[test]
312312
fn test_group_exporter_secret_serialization() {
313313
let secret = GroupExporterSecret {
314-
mls_group_id: GroupId::from_slice(vec![1, 2, 3].as_slice()),
314+
mls_group_id: GroupId::from_slice(&[1, 2, 3]),
315315
epoch: 42,
316-
secret: vec![4, 5, 6],
316+
secret: [0u8; 32],
317317
};
318318

319319
let serialized = serde_json::to_value(&secret).unwrap();
320320
assert_eq!(serialized["mls_group_id"]["value"]["vec"], json!([1, 2, 3]));
321321
assert_eq!(serialized["epoch"], json!(42));
322-
assert_eq!(serialized["secret"], json!([4, 5, 6]));
322+
assert_eq!(
323+
serialized["secret"],
324+
json!([
325+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
326+
0, 0, 0, 0
327+
])
328+
);
323329

324330
// Test deserialization
325331
let deserialized: GroupExporterSecret = serde_json::from_value(serialized).unwrap();
326332
assert_eq!(deserialized.epoch, 42);
327-
assert_eq!(deserialized.secret, vec![4, 5, 6]);
333+
assert_eq!(deserialized.secret, [0u8; 32]);
328334
}
329335

330336
#[test]
331337
fn test_group_relay_serialization() {
332338
let relay = GroupRelay {
333339
relay_url: RelayUrl::from_str("wss://relay.example.com").unwrap(),
334-
mls_group_id: GroupId::from_slice(vec![1, 2, 3].as_slice()),
340+
mls_group_id: GroupId::from_slice(&[1, 2, 3]),
335341
};
336342

337343
let serialized = serde_json::to_value(&relay).unwrap();

crates/nostr-mls/src/groups.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,12 @@ where
130130
Some(group_exporter_secret) => Ok(group_exporter_secret),
131131
// If it's not already in the storage, export the secret and save it
132132
None => {
133-
let export_secret: Vec<u8> =
134-
group.export_secret(&self.provider, "nostr", b"nostr", 32)?;
133+
let export_secret: [u8; 32] = group
134+
.export_secret(&self.provider, "nostr", b"nostr", 32)?
135+
.try_into()
136+
.map_err(|_| {
137+
Error::Group("Failed to convert export secret to [u8; 32]".to_string())
138+
})?;
135139
let group_exporter_secret = group_types::GroupExporterSecret {
136140
mls_group_id: group_id.clone(),
137141
epoch: group.epoch().as_u64(),

0 commit comments

Comments
 (0)