@@ -321,12 +321,15 @@ impl Encode<()> for CatalystSignedDocument {
321321
322322#[ cfg( test) ]
323323mod tests {
324+ use std:: str:: FromStr ;
325+
326+ use ed25519_dalek:: SigningKey ;
324327 use metadata:: { ContentEncoding , ContentType } ;
328+ use rand:: rngs:: OsRng ;
325329
326330 use super :: * ;
327331
328- #[ test]
329- fn catalyst_signed_doc_cbor_roundtrip_test ( ) {
332+ fn test_metadata ( ) -> anyhow:: Result < ( UuidV7 , UuidV4 , Metadata ) > {
330333 let uuid_v7 = UuidV7 :: new ( ) ;
331334 let uuid_v4 = UuidV4 :: new ( ) ;
332335 let section = "some section" . to_string ( ) ;
@@ -350,7 +353,13 @@ mod tests {
350353 "brand_id" : { "id" : uuid_v7. to_string( ) } ,
351354 "category_id" : { "id" : uuid_v7. to_string( ) } ,
352355 } ) )
353- . unwrap ( ) ;
356+ . map_err ( |_| anyhow:: anyhow!( "Invalid example metadata. This should not happen." ) ) ?;
357+ Ok ( ( uuid_v7, uuid_v4, metadata) )
358+ }
359+
360+ #[ test]
361+ fn catalyst_signed_doc_cbor_roundtrip_test ( ) {
362+ let ( uuid_v7, uuid_v4, metadata) = test_metadata ( ) . unwrap ( ) ;
354363 let content = serde_json:: to_vec ( & serde_json:: Value :: Null ) . unwrap ( ) ;
355364
356365 let doc = Builder :: new ( )
@@ -368,4 +377,37 @@ mod tests {
368377 assert_eq ! ( decoded. doc_content( ) . decoded_bytes( ) , & content) ;
369378 assert_eq ! ( decoded. doc_meta( ) , metadata. extra( ) ) ;
370379 }
380+
381+ #[ test]
382+ fn test_signature_verification ( ) {
383+ let mut csprng = OsRng ;
384+ let sk: SigningKey = SigningKey :: generate ( & mut csprng) ;
385+ let content = serde_json:: to_vec ( & serde_json:: Value :: Null ) . unwrap ( ) ;
386+ let pk = sk. verifying_key ( ) ;
387+
388+ let kid_str = format ! (
389+ "kid.catalyst-rbac://cardano/{}/0/0" ,
390+ base64_url:: encode( pk. as_bytes( ) )
391+ ) ;
392+
393+ let kid = KidUri :: from_str ( & kid_str) . unwrap ( ) ;
394+ let ( _, _, metadata) = test_metadata ( ) . unwrap ( ) ;
395+ let signed_doc = Builder :: new ( )
396+ . with_decoded_content ( content)
397+ . with_metadata ( metadata)
398+ . add_signature ( sk. to_bytes ( ) , kid. clone ( ) )
399+ . unwrap ( )
400+ . build ( )
401+ . unwrap ( ) ;
402+
403+ assert ! ( signed_doc
404+ . verify( |k| {
405+ if k. to_string( ) == kid. to_string( ) {
406+ pk
407+ } else {
408+ k. role0_pk( )
409+ }
410+ } )
411+ . is_ok( ) ) ;
412+ }
371413}
0 commit comments