Skip to content

Commit a2af6f1

Browse files
committed
feat(rust/signed-doc): test verify signatures
1 parent 5682dd5 commit a2af6f1

File tree

3 files changed

+46
-14
lines changed

3 files changed

+46
-14
lines changed

rust/signed_doc/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ clap = { version = "4.5.23", features = ["derive", "env"] }
2626

2727

2828
[dev-dependencies]
29+
base64-url = "3.0.0"
2930
rand = "0.8.5"
3031

3132

rust/signed_doc/src/lib.rs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -321,12 +321,15 @@ impl Encode<()> for CatalystSignedDocument {
321321

322322
#[cfg(test)]
323323
mod tests {
324+
use std::str::FromStr;
325+
326+
use ed25519_dalek::SigningKey;
324327
use metadata::{ContentEncoding, ContentType};
328+
use rand::rngs::OsRng;
325329

326330
use super::*;
327331

328-
#[test]
329-
fn catalyst_signed_doc_cbor_roundtrip_test() {
332+
fn test_metadata() -> anyhow::Result<(UuidV7, UuidV4, Metadata)> {
330333
let uuid_v7 = UuidV7::new();
331334
let uuid_v4 = UuidV4::new();
332335
let section = "some section".to_string();
@@ -350,7 +353,13 @@ mod tests {
350353
"brand_id": {"id": uuid_v7.to_string()},
351354
"category_id": {"id": uuid_v7.to_string()},
352355
}))
353-
.unwrap();
356+
.map_err(|_| anyhow::anyhow!("Invalid example metadata. This should not happen."))?;
357+
Ok((uuid_v7, uuid_v4, metadata))
358+
}
359+
360+
#[test]
361+
fn catalyst_signed_doc_cbor_roundtrip_test() {
362+
let (uuid_v7, uuid_v4, metadata) = test_metadata().unwrap();
354363
let content = serde_json::to_vec(&serde_json::Value::Null).unwrap();
355364

356365
let doc = Builder::new()
@@ -368,4 +377,37 @@ mod tests {
368377
assert_eq!(decoded.doc_content().decoded_bytes(), &content);
369378
assert_eq!(decoded.doc_meta(), metadata.extra());
370379
}
380+
381+
#[test]
382+
fn signature_verification_test() {
383+
let mut csprng = OsRng;
384+
let sk: SigningKey = SigningKey::generate(&mut csprng);
385+
let content = serde_json::to_vec(&serde_json::Value::Null).unwrap();
386+
let pk = sk.verifying_key();
387+
388+
let kid_str = format!(
389+
"kid.catalyst-rbac://cardano/{}/0/0",
390+
base64_url::encode(pk.as_bytes())
391+
);
392+
393+
let kid = KidUri::from_str(&kid_str).unwrap();
394+
let (_, _, metadata) = test_metadata().unwrap();
395+
let signed_doc = Builder::new()
396+
.with_decoded_content(content)
397+
.with_metadata(metadata)
398+
.add_signature(sk.to_bytes(), kid.clone())
399+
.unwrap()
400+
.build()
401+
.unwrap();
402+
403+
assert!(signed_doc
404+
.verify(|k| {
405+
if k.to_string() == kid.to_string() {
406+
pk
407+
} else {
408+
k.role0_pk()
409+
}
410+
})
411+
.is_ok());
412+
}
371413
}

rust/signed_doc/src/metadata/document_ref.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,6 @@ pub struct DocumentRef {
1313
pub ver: Option<UuidV7>,
1414
}
1515

16-
impl DocumentRef {
17-
/// Determine if internal `UUID`s are valid.
18-
#[must_use]
19-
pub fn is_valid(&self) -> bool {
20-
match self.ver {
21-
Some(ver) => self.id.is_valid() && ver.is_valid() && ver >= self.id,
22-
None => self.id.is_valid(),
23-
}
24-
}
25-
}
26-
2716
impl TryFrom<DocumentRef> for Value {
2817
type Error = anyhow::Error;
2918

0 commit comments

Comments
 (0)