@@ -226,10 +226,10 @@ impl WitnessServerState {
226226 sig : vec ! [ ] ,
227227 } ;
228228
229- let payload_for_said = receipt
230- . signing_payload ( )
229+ let receipt_value = serde_json:: to_value ( & receipt)
230+ . map_err ( |e| WitnessError :: Serialization ( e. to_string ( ) ) ) ?;
231+ receipt. d = crate :: crypto:: said:: compute_said ( & receipt_value)
231232 . map_err ( |e| WitnessError :: Serialization ( e. to_string ( ) ) ) ?;
232- receipt. d = crate :: crypto:: said:: compute_said ( & payload_for_said) ;
233233
234234 let signing_payload = receipt
235235 . signing_payload ( )
@@ -314,17 +314,10 @@ fn verify_event_said(event: &serde_json::Value) -> Result<(), String> {
314314 . and_then ( |v| v. as_str ( ) )
315315 . ok_or ( "missing 'd' (SAID) field" ) ?;
316316
317- let mut zeroed = event. clone ( ) ;
318- zeroed
319- . as_object_mut ( )
320- . ok_or ( "event must be a JSON object" ) ?
321- . insert ( "d" . to_string ( ) , serde_json:: Value :: String ( String :: new ( ) ) ) ;
317+ let computed = crate :: crypto:: said:: compute_said ( event)
318+ . map_err ( |e| format ! ( "failed to compute SAID: {}" , e) ) ?;
322319
323- let canonical =
324- serde_json:: to_vec ( & zeroed) . map_err ( |e| format ! ( "failed to serialize event: {}" , e) ) ?;
325- let computed = crate :: crypto:: said:: compute_said ( & canonical) ;
326-
327- if computed != claimed_d {
320+ if computed. as_str ( ) != claimed_d {
328321 return Err ( format ! (
329322 "SAID mismatch: claimed {} but computed {}" ,
330323 claimed_d, computed
@@ -678,13 +671,9 @@ mod tests {
678671 let sig = kp. sign ( & payload) ;
679672 event[ "x" ] = serde_json:: Value :: String ( hex:: encode ( sig. as_ref ( ) ) ) ;
680673
681- // Compute SAID (with empty d, but final x)
682- let mut for_said = event. clone ( ) ;
683- for_said[ "d" ] = serde_json:: Value :: String ( String :: new ( ) ) ;
684- let said_payload = serde_json:: to_vec ( & for_said) . unwrap ( ) ;
685- event[ "d" ] = serde_json:: Value :: String (
686- crate :: crypto:: said:: compute_said ( & said_payload) . into_inner ( ) ,
687- ) ;
674+ // Compute SAID (x is already set; compute_said ignores x and injects d placeholder)
675+ let said = crate :: crypto:: said:: compute_said ( & event) . unwrap ( ) ;
676+ event[ "d" ] = serde_json:: Value :: String ( said. into_inner ( ) ) ;
688677
689678 event
690679 }
@@ -794,10 +783,8 @@ mod tests {
794783 "x" : "not_valid_hex!!!"
795784 } ) ;
796785 // Set proper SAID for the event as-is
797- let said_payload = serde_json:: to_vec ( & event) . unwrap ( ) ;
798- event[ "d" ] = serde_json:: Value :: String (
799- crate :: crypto:: said:: compute_said ( & said_payload) . into_inner ( ) ,
800- ) ;
786+ let said = crate :: crypto:: said:: compute_said ( & event) . unwrap ( ) ;
787+ event[ "d" ] = serde_json:: Value :: String ( said. into_inner ( ) ) ;
801788
802789 let response = app
803790 . oneshot (
@@ -839,13 +826,9 @@ mod tests {
839826 let sig = wrong_kp. sign ( & payload) ;
840827 event[ "x" ] = serde_json:: Value :: String ( hex:: encode ( sig. as_ref ( ) ) ) ;
841828
842- // Compute SAID
843- let mut for_said = event. clone ( ) ;
844- for_said[ "d" ] = serde_json:: Value :: String ( String :: new ( ) ) ;
845- let said_payload = serde_json:: to_vec ( & for_said) . unwrap ( ) ;
846- event[ "d" ] = serde_json:: Value :: String (
847- crate :: crypto:: said:: compute_said ( & said_payload) . into_inner ( ) ,
848- ) ;
829+ // Compute SAID (x is already set; compute_said ignores x and injects d placeholder)
830+ let said = crate :: crypto:: said:: compute_said ( & event) . unwrap ( ) ;
831+ event[ "d" ] = serde_json:: Value :: String ( said. into_inner ( ) ) ;
849832
850833 let response = app
851834 . oneshot (
0 commit comments