this repo has no description
1use cid::Cid;
2use jacquard::types::{integer::LimitedU32, string::Tid};
3use jacquard_repo::commit::Commit;
4use k256::ecdsa::SigningKey;
5use std::str::FromStr;
6use tranquil_pds::Did;
7
8#[test]
9fn test_commit_signing_produces_valid_signature() {
10 let signing_key = SigningKey::random(&mut rand::thread_rng());
11
12 let did = "did:plc:testuser123456789abcdef";
13 let data_cid =
14 Cid::from_str("bafyreib2rxk3ryblouj3fxza5jvx6psmwewwessc4m6g6e7pqhhkwqomfi").unwrap();
15 let rev = Tid::now(LimitedU32::MIN);
16
17 let did_typed = jacquard::types::string::Did::new(did).unwrap();
18 let unsigned = Commit::new_unsigned(did_typed, data_cid, rev, None);
19 let signed = unsigned.sign(&signing_key).unwrap();
20
21 let pubkey_bytes = signing_key.verifying_key().to_encoded_point(true);
22 let pubkey = jacquard::types::crypto::PublicKey {
23 codec: jacquard::types::crypto::KeyCodec::Secp256k1,
24 bytes: std::borrow::Cow::Owned(pubkey_bytes.as_bytes().to_vec()),
25 };
26
27 signed.verify(&pubkey).expect("signature should verify");
28}
29
30#[test]
31fn test_commit_signing_with_prev() {
32 let signing_key = SigningKey::random(&mut rand::thread_rng());
33
34 let did = "did:plc:testuser123456789abcdef";
35 let data_cid =
36 Cid::from_str("bafyreib2rxk3ryblouj3fxza5jvx6psmwewwessc4m6g6e7pqhhkwqomfi").unwrap();
37 let prev_cid =
38 Cid::from_str("bafyreigxmvutyl3k5m4guzwxv3xf34gfxjlykgfdqkjmf32vwb5vcjxlui").unwrap();
39 let rev = Tid::now(LimitedU32::MIN);
40
41 let did_typed = jacquard::types::string::Did::new(did).unwrap();
42 let unsigned = Commit::new_unsigned(did_typed, data_cid, rev, Some(prev_cid));
43 let signed = unsigned.sign(&signing_key).unwrap();
44
45 let pubkey_bytes = signing_key.verifying_key().to_encoded_point(true);
46 let pubkey = jacquard::types::crypto::PublicKey {
47 codec: jacquard::types::crypto::KeyCodec::Secp256k1,
48 bytes: std::borrow::Cow::Owned(pubkey_bytes.as_bytes().to_vec()),
49 };
50
51 signed.verify(&pubkey).expect("signature should verify");
52}
53
54#[test]
55fn test_unsigned_commit_has_5_fields() {
56 let did = "did:plc:test";
57 let data_cid =
58 Cid::from_str("bafyreib2rxk3ryblouj3fxza5jvx6psmwewwessc4m6g6e7pqhhkwqomfi").unwrap();
59 let rev = Tid::from_str("3masrxv55po22").unwrap();
60
61 let did_typed = jacquard::types::string::Did::new(did).unwrap();
62 let unsigned = Commit::new_unsigned(did_typed, data_cid, rev, None);
63
64 let unsigned_bytes = serde_ipld_dagcbor::to_vec(&unsigned).unwrap();
65
66 let decoded: ciborium::Value = ciborium::from_reader(&unsigned_bytes[..]).unwrap();
67 if let ciborium::Value::Map(map) = decoded {
68 assert_eq!(
69 map.len(),
70 5,
71 "Unsigned commit must have exactly 5 fields (data, did, prev, rev, version) - no sig field"
72 );
73 let keys: Vec<String> = map
74 .iter()
75 .filter_map(|(k, _)| {
76 if let ciborium::Value::Text(s) = k {
77 Some(s.clone())
78 } else {
79 None
80 }
81 })
82 .collect();
83 assert!(keys.contains(&"data".to_string()));
84 assert!(keys.contains(&"did".to_string()));
85 assert!(keys.contains(&"prev".to_string()));
86 assert!(keys.contains(&"rev".to_string()));
87 assert!(keys.contains(&"version".to_string()));
88 assert!(
89 !keys.contains(&"sig".to_string()),
90 "Unsigned commit must NOT contain sig field"
91 );
92 } else {
93 panic!("Expected CBOR map");
94 }
95}
96
97#[test]
98fn test_create_signed_commit_helper() {
99 use tranquil_pds::api::repo::record::utils::create_signed_commit;
100
101 let signing_key = SigningKey::random(&mut rand::thread_rng());
102 let did = Did::new_unchecked("did:plc:testuser123456789abcdef");
103 let data_cid =
104 Cid::from_str("bafyreib2rxk3ryblouj3fxza5jvx6psmwewwessc4m6g6e7pqhhkwqomfi").unwrap();
105 let rev = Tid::now(LimitedU32::MIN).to_string();
106
107 let (signed_bytes, sig) = create_signed_commit(&did, data_cid, &rev, None, &signing_key)
108 .expect("signing should succeed");
109
110 assert!(!signed_bytes.is_empty());
111 assert_eq!(sig.len(), 64);
112
113 let commit = Commit::from_cbor(&signed_bytes).expect("should parse as valid commit");
114
115 let pubkey_bytes = signing_key.verifying_key().to_encoded_point(true);
116 let pubkey = jacquard::types::crypto::PublicKey {
117 codec: jacquard::types::crypto::KeyCodec::Secp256k1,
118 bytes: std::borrow::Cow::Owned(pubkey_bytes.as_bytes().to_vec()),
119 };
120
121 commit.verify(&pubkey).expect("signature should verify");
122}