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}