services_hardening_reconciliation_attestation_contract.rs (4970B)
1 #![forbid(unsafe_code)] 2 3 use rhi::{ 4 RHI_RECONCILIATION_ATTESTATION_CONTRACT_VERSION, 5 RHI_RECONCILIATION_SIGNED_ATTESTATION_MAX_BYTES, 6 }; 7 use serde_json::json; 8 9 const CONTRACT: &str = 10 include_str!("../contracts/services_hardening/reconciliation_attestation.v1.json"); 11 const ROOT: &str = include_str!("../src/lib.rs"); 12 const SOURCE: &str = include_str!("../src/reconciliation_attestation.rs"); 13 const IDENTITY: &str = include_str!("../src/identity_envelope.rs"); 14 const README: &str = include_str!("../README"); 15 const SIGNED_VECTOR: &str = include_str!( 16 "../contracts/conformance/vectors/reconciliation_attestation_signed_event.v1.json" 17 ); 18 19 #[test] 20 fn machine_contract_freezes_the_complete_step_196_boundary() { 21 let contract: serde_json::Value = serde_json::from_str(CONTRACT).expect("contract"); 22 assert_eq!( 23 contract["schema"], 24 "radroots.rhi.reconciliation-attestation" 25 ); 26 assert_eq!(contract["schema_version"], 1); 27 assert_eq!( 28 contract["contract_version"], 29 RHI_RECONCILIATION_ATTESTATION_CONTRACT_VERSION 30 ); 31 assert_eq!(contract["report"]["maximum_canonical_bytes"], 16_384); 32 assert_eq!(contract["event"]["kind"], 3_441); 33 assert_eq!( 34 contract["event"]["maximum_signed_json_bytes"], 35 RHI_RECONCILIATION_SIGNED_ATTESTATION_MAX_BYTES 36 ); 37 assert_eq!( 38 contract["conformance_vector"], 39 "contracts/conformance/vectors/reconciliation_attestation_signed_event.v1.json" 40 ); 41 let vector: serde_json::Value = serde_json::from_str(SIGNED_VECTOR).expect("signed vector"); 42 assert_eq!( 43 vector["id"], 44 "f1a2a41d73b42ba54be19c716d6b49a9e5d608ae2a9c96347155d1773b8b8a1b" 45 ); 46 assert_eq!(vector["kind"], 3_441); 47 assert_eq!(vector["tags"].as_array().expect("tags").len(), 5); 48 assert_eq!( 49 contract["independent_verification"], 50 json!([ 51 "bounded_original_signed_JSON", 52 "strict_NIP01_wire_admission_with_no_extra_fields", 53 "event_id_recomputation", 54 "Schnorr_signature", 55 "exact_planned_event_id_author_created_at_kind_tags_and_content", 56 "typed_RHI_attestation_decode_and_structural_tag_binding", 57 "canonical_shared_report_reparse", 58 "exact_manifest_binding", 59 "complete_report_equality", 60 "governed_supersession_ordering_when_present" 61 ]) 62 ); 63 for effect in [ 64 "sqlite", 65 "filesystem", 66 "source_or_relay", 67 "network", 68 "task_spawn", 69 "ambient_clock", 70 "ambient_entropy", 71 "publication", 72 "job_finalization", 73 ] { 74 assert_eq!(contract["effects"][effect], false, "effect {effect}"); 75 } 76 } 77 78 #[test] 79 fn implementation_uses_only_typed_authoring_and_independent_verification() { 80 assert!(ROOT.contains("mod reconciliation_attestation;")); 81 assert!(!ROOT.contains("pub mod reconciliation_attestation;")); 82 for required in [ 83 "RhiSignedEvidenceAttestation", 84 "RhiEvidenceAttestationSupersession", 85 "RhiReconciliationAttestationErrorKind", 86 "build_rhi_signed_evidence_attestation", 87 "RHI_RECONCILIATION_SIGNED_ATTESTATION_MAX_BYTES", 88 ] { 89 assert!(ROOT.contains(required), "root API is missing {required}"); 90 } 91 for required in [ 92 "RadrootsRhiEvidenceReportV1::new(", 93 "RadrootsRhiEvidenceAttestationV1::from_canonical_content(", 94 "validate_rhi_evidence_attestation_supersession(", 95 "AuthoredEventBody::from_rhi_evidence_attestation(", 96 "AuthoredEventPlan::bind(", 97 ".fill_bytes(&mut auxiliary[..])", 98 "sign_nostr_event(unsigned, auxiliary)", 99 "Nip01EventWire::parse_json_unverified_with_limits(", 100 "verify_id(&event)", 101 "verify(&event)", 102 "rhi_evidence_attestation_from_event(&event)", 103 "validate_against_manifest(manifest)", 104 ] { 105 assert!( 106 SOURCE.contains(required), 107 "implementation is missing {required}" 108 ); 109 } 110 for required in [ 111 "sign_schnorr_with_aux_rand", 112 "non_secure_erase()", 113 "actual.to_hex() != self.public_identity.as_hex()", 114 ] { 115 assert!(IDENTITY.contains(required), "signer is missing {required}"); 116 } 117 for forbidden in [ 118 "std::fs", 119 "std::net", 120 "sqlx::", 121 "tokio::", 122 "SystemTime", 123 "SystemEntropy", 124 "OsRng", 125 "thread_rng", 126 "INSERT ", 127 "UPDATE ", 128 "DELETE ", 129 "pub fn new(", 130 "pub const fn new(", 131 ] { 132 assert!( 133 !SOURCE.contains(forbidden), 134 "attestation boundary gained forbidden authority {forbidden}" 135 ); 136 } 137 assert!(README.contains("## Canonical signed reconciliation attestation")); 138 assert!(README.contains( 139 "[`reconciliation_attestation.v1.json`](contracts/services_hardening/reconciliation_attestation.v1.json)" 140 )); 141 }