@@ -31,8 +31,10 @@ use chrono::{DateTime, Utc};
3131use serde:: { Deserialize , Serialize } ;
3232use std:: sync:: Mutex ;
3333
34+ use auths_keri:: { KeriSequence , VersionString } ;
35+
3436use super :: error:: { DuplicityEvidence , WitnessError } ;
35- use super :: receipt:: { KERI_VERSION , RECEIPT_TYPE , Receipt } ;
37+ use super :: receipt:: { RECEIPT_TYPE , Receipt , SignedReceipt } ;
3638use super :: storage:: WitnessStorage ;
3739
3840/// Shared server state.
@@ -41,6 +43,7 @@ pub struct WitnessServerState {
4143 inner : Arc < WitnessServerInner > ,
4244}
4345
46+ #[ allow( dead_code) ]
4447struct WitnessServerInner {
4548 /// Witness identifier (DID)
4649 witness_did : DeviceDID ,
@@ -141,6 +144,7 @@ pub struct ErrorResponse {
141144 pub duplicity : Option < DuplicityEvidence > ,
142145}
143146
147+ #[ allow( dead_code) ]
144148impl WitnessServerState {
145149 /// Create a new server state.
146150 #[ allow( clippy:: disallowed_methods) ] // Server constructor is a clock boundary
@@ -212,31 +216,35 @@ impl WitnessServerState {
212216 /// Create a receipt for an event.
213217 fn create_receipt (
214218 & self ,
215- _prefix : & Prefix ,
219+ prefix : & Prefix ,
216220 seq : u64 ,
217221 event_said : & Said ,
218222 ) -> Result < Receipt , WitnessError > {
219- let mut receipt = Receipt {
220- v : KERI_VERSION . into ( ) ,
223+ let receipt = Receipt {
224+ v : VersionString :: placeholder ( ) ,
221225 t : RECEIPT_TYPE . into ( ) ,
222- d : Said :: default ( ) ,
223- i : self . inner . witness_did . to_string ( ) ,
224- s : seq,
225- a : event_said. clone ( ) ,
226- sig : vec ! [ ] ,
226+ d : event_said. clone ( ) ,
227+ i : prefix. clone ( ) ,
228+ s : KeriSequence :: new ( seq) ,
227229 } ;
228230
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)
232- . map_err ( |e| WitnessError :: Serialization ( e. to_string ( ) ) ) ?;
231+ Ok ( receipt)
232+ }
233233
234- let signing_payload = receipt
235- . signing_payload ( )
236- . map_err ( |e| WitnessError :: Serialization ( e. to_string ( ) ) ) ?;
237- receipt. sig = self . sign_payload ( & signing_payload) ?;
234+ /// Create a signed receipt for an event.
235+ fn create_signed_receipt (
236+ & self ,
237+ prefix : & Prefix ,
238+ seq : u64 ,
239+ event_said : & Said ,
240+ ) -> Result < SignedReceipt , WitnessError > {
241+ let receipt = self . create_receipt ( prefix, seq, event_said) ?;
238242
239- Ok ( receipt)
243+ let signing_payload =
244+ serde_json:: to_vec ( & receipt) . map_err ( |e| WitnessError :: Serialization ( e. to_string ( ) ) ) ?;
245+ let signature = self . sign_payload ( & signing_payload) ?;
246+
247+ Ok ( SignedReceipt { receipt, signature } )
240248 }
241249
242250 /// Sign a payload with the witness Ed25519 keypair.
@@ -930,19 +938,16 @@ mod tests {
930938 }
931939
932940 #[ test]
933- fn receipt_said_is_proper_blake3 ( ) {
941+ fn receipt_d_matches_event_said ( ) {
934942 let state = test_state ( ) ;
935943 let prefix = Prefix :: new_unchecked ( "EPrefix" . into ( ) ) ;
936- let receipt = state
937- . create_receipt ( & prefix, 0 , & Said :: new_unchecked ( "ESAID123" . into ( ) ) )
938- . unwrap ( ) ;
939- // SAID should be 44 chars: 'E' + 43 base64url chars
940- assert_eq ! ( receipt. d. as_str( ) . len( ) , 44 ) ;
941- assert ! ( receipt. d. as_str( ) . starts_with( 'E' ) ) ;
944+ let event_said = Said :: new_unchecked ( "ESAID123" . into ( ) ) ;
945+ let receipt = state. create_receipt ( & prefix, 0 , & event_said) . unwrap ( ) ;
946+ assert_eq ! ( receipt. d, event_said) ;
942947 }
943948
944949 #[ test]
945- fn receipt_said_changes_with_inputs ( ) {
950+ fn receipt_d_changes_with_event_said ( ) {
946951 let state = test_state ( ) ;
947952 let prefix = Prefix :: new_unchecked ( "EPrefix" . into ( ) ) ;
948953 let receipt_a = state
@@ -952,29 +957,21 @@ mod tests {
952957 . create_receipt ( & prefix, 0 , & Said :: new_unchecked ( "ESAID_B" . into ( ) ) )
953958 . unwrap ( ) ;
954959 assert_ne ! ( receipt_a. d, receipt_b. d) ;
955-
956- let receipt_c = state
957- . create_receipt ( & prefix, 0 , & Said :: new_unchecked ( "ESAID_A" . into ( ) ) )
958- . unwrap ( ) ;
959- let receipt_d = state
960- . create_receipt ( & prefix, 1 , & Said :: new_unchecked ( "ESAID_A" . into ( ) ) )
961- . unwrap ( ) ;
962- assert_ne ! ( receipt_c. d, receipt_d. d) ;
963960 }
964961
965962 #[ test]
966- fn receipt_signature_verifies_against_signing_payload ( ) {
963+ fn signed_receipt_signature_verifies ( ) {
967964 let state = test_state ( ) ;
968965 let prefix = Prefix :: new_unchecked ( "EPrefix" . into ( ) ) ;
969- let receipt = state
970- . create_receipt ( & prefix, 0 , & Said :: new_unchecked ( "ESAID123" . into ( ) ) )
966+ let signed = state
967+ . create_signed_receipt ( & prefix, 0 , & Said :: new_unchecked ( "ESAID123" . into ( ) ) )
971968 . unwrap ( ) ;
972969 let public_key = state. public_key ( ) ;
973- let payload = receipt . signing_payload ( ) . unwrap ( ) ;
970+ let payload = serde_json :: to_vec ( & signed . receipt ) . unwrap ( ) ;
974971
975972 let pk = ring:: signature:: UnparsedPublicKey :: new ( & ring:: signature:: ED25519 , & public_key) ;
976- pk. verify ( & payload, & receipt . sig )
977- . expect ( "receipt signature should verify against signing_payload " ) ;
973+ pk. verify ( & payload, & signed . signature )
974+ . expect ( "signed receipt signature should verify against serialized receipt " ) ;
978975 }
979976
980977 #[ test]
0 commit comments