@@ -427,7 +427,7 @@ fn verify_fragmented(init_pattern: &Path, frag_pattern: &Path) -> Result<Vec<Rea
427
427
Ok ( readers)
428
428
}
429
429
430
- // Update/decorate the displayed JSON string for a more human-readable JSON output.
430
+ /// Update/decorate the displayed JSON string for a more human-readable JSON output.
431
431
fn decorate_json_display ( reader : Reader , tokio_runtime : & Runtime ) -> String {
432
432
let mut reader_content = match reader. json_value_map ( ) {
433
433
Ok ( mapped_json) => mapped_json,
@@ -465,8 +465,12 @@ fn decorate_json_display(reader: Reader, tokio_runtime: &Runtime) -> String {
465
465
}
466
466
}
467
467
468
- // Update/decorate the displayed JSON assertions for a more human-readable JSON output.
469
- fn decorate_json_assertions ( reader : Reader , json_content : & mut Value , tokio_runtime : & Runtime ) -> Result < ( ) , Error > {
468
+ /// Update/decorate the displayed JSON assertions for a more human-readable JSON output.
469
+ fn decorate_json_assertions (
470
+ reader : Reader ,
471
+ json_content : & mut Value ,
472
+ tokio_runtime : & Runtime ,
473
+ ) -> Result < ( ) , Error > {
470
474
if let Value :: Object ( map) = json_content {
471
475
// Iterate over the key-value pairs
472
476
for ( key, value) in & mut * map {
@@ -475,21 +479,27 @@ fn decorate_json_assertions(reader: Reader, json_content: &mut Value, tokio_runt
475
479
let current_manifest = match current_manifest {
476
480
Some ( current_manifest) => current_manifest,
477
481
None => {
478
- return Err ( crate :: Error :: JsonSerializationError ( "Could not get current manifest" . to_string ( ) ) ) ;
482
+ return Err ( crate :: Error :: JsonSerializationError (
483
+ "Could not get current manifest" . to_string ( ) ,
484
+ ) ) ;
479
485
}
480
486
} ;
481
487
482
488
// Get the assertions as array from the JSON
483
489
let assertions = match value. get_mut ( "assertions" ) {
484
490
Some ( assertions) => assertions,
485
491
None => {
486
- return Err ( crate :: Error :: JsonSerializationError ( "Could not parse JSON assertions as object" . to_string ( ) ) ) ;
492
+ return Err ( crate :: Error :: JsonSerializationError (
493
+ "Could not parse JSON assertions as object" . to_string ( ) ,
494
+ ) ) ;
487
495
}
488
496
} ;
489
497
let assertions_array = match assertions. as_array_mut ( ) {
490
498
Some ( assertions_array) => assertions_array,
491
499
None => {
492
- return Err ( crate :: Error :: JsonSerializationError ( "Could not parse JSON assertions as array" . to_string ( ) ) ) ;
500
+ return Err ( crate :: Error :: JsonSerializationError (
501
+ "Could not parse JSON assertions as array" . to_string ( ) ,
502
+ ) ) ;
493
503
}
494
504
} ;
495
505
@@ -498,45 +508,15 @@ fn decorate_json_assertions(reader: Reader, json_content: &mut Value, tokio_runt
498
508
let label = match assertion. get ( "label" ) {
499
509
Some ( label) => label. to_string ( ) ,
500
510
None => {
501
- return Err ( crate :: Error :: JsonSerializationError ( "Could not parse assertion label" . to_string ( ) ) ) ;
511
+ return Err ( crate :: Error :: JsonSerializationError (
512
+ "Could not parse assertion label" . to_string ( ) ,
513
+ ) ) ;
502
514
}
503
515
} ;
504
516
505
517
// for CAWG assertions, further parse the signature
506
518
if label. contains ( "cawg.identity" ) {
507
- let parsed_cawg_json_string = match get_cawg_details_for_manifest (
508
- current_manifest,
509
- tokio_runtime,
510
- ) {
511
- Some ( parsed_cawg_json_string) => parsed_cawg_json_string,
512
- None => {
513
- println ! ( "Could not parse CAWG details for manifest (leaving original raw data unformatted)" ) ;
514
- continue ;
515
- }
516
- } ;
517
-
518
- let assertion_data: & mut serde_json:: Value = assertion. get_mut ( "data" ) . unwrap ( ) ;
519
- // update signature with parsed content
520
-
521
- let parsed_signature = match serde_json:: from_str ( & parsed_cawg_json_string) {
522
- Ok ( parsed_signature) => parsed_signature,
523
- Err ( err) => {
524
- println ! ( "Could not parse CAWG signature details: {:?}" , err) ;
525
- continue ;
526
- }
527
- } ;
528
- assertion_data[ "signature" ] = parsed_signature;
529
-
530
- // we don't need to show the padding fields either
531
- let assertion_data_map = match assertion_data. as_object_mut ( ) {
532
- Some ( assertion_data_map) => assertion_data_map,
533
- None => {
534
- println ! ( "Could not parse assertion data as object" ) ;
535
- continue ;
536
- }
537
- } ;
538
- assertion_data_map. remove ( "pad1" ) ;
539
- assertion_data_map. remove ( "pad2" ) ;
519
+ decorate_json_cawg_assertions ( current_manifest, assertion, tokio_runtime) ?;
540
520
}
541
521
}
542
522
}
@@ -545,6 +525,57 @@ fn decorate_json_assertions(reader: Reader, json_content: &mut Value, tokio_runt
545
525
Ok ( ( ) )
546
526
}
547
527
528
+ /// Update/decorate the displayed CAWG assertion for a more human-readable JSON output.
529
+ fn decorate_json_cawg_assertions (
530
+ holding_manifest : & c2pa:: Manifest ,
531
+ assertion : & mut Value ,
532
+ tokio_runtime : & Runtime ,
533
+ ) -> Result < ( ) , Error > {
534
+ let parsed_cawg_json_string =
535
+ match get_cawg_details_for_manifest ( holding_manifest, tokio_runtime) {
536
+ Some ( parsed_cawg_json_string) => parsed_cawg_json_string,
537
+ None => {
538
+ println ! (
539
+ "Could not parse CAWG details for manifest (leaving original raw data unformatted)"
540
+ ) ;
541
+ return Ok ( ( ) ) ;
542
+ }
543
+ } ;
544
+
545
+ // Let's look at the assertion data
546
+ let assertion_data = match assertion. get_mut ( "data" ) {
547
+ Some ( assertion_data) => assertion_data,
548
+ None => {
549
+ return Err ( crate :: Error :: JsonSerializationError (
550
+ "Could not parse CAWG assertion data" . to_string ( ) ,
551
+ ) ) ;
552
+ }
553
+ } ;
554
+
555
+ // Update signature with parsed content
556
+ let parsed_signature = match serde_json:: from_str ( & parsed_cawg_json_string) {
557
+ Ok ( parsed_signature) => parsed_signature,
558
+ Err ( err) => {
559
+ return Err ( crate :: Error :: JsonSerializationError ( err. to_string ( ) ) ) ;
560
+ }
561
+ } ;
562
+ assertion_data[ "signature" ] = parsed_signature;
563
+
564
+ // We don't need to show the padding fields either
565
+ let assertion_data_map = match assertion_data. as_object_mut ( ) {
566
+ Some ( assertion_data_map) => assertion_data_map,
567
+ None => {
568
+ return Err ( crate :: Error :: JsonSerializationError (
569
+ "Could not parse CAWG assertion data as object" . to_string ( ) ,
570
+ ) ) ;
571
+ }
572
+ } ;
573
+ assertion_data_map. remove ( "pad1" ) ;
574
+ assertion_data_map. remove ( "pad2" ) ;
575
+
576
+ Ok ( ( ) )
577
+ }
578
+
548
579
/// Parse additional CAWG details from the manifest store to update displayed results.
549
580
/// As CAWG mostly async, this will block on network requests for checks using a tokio runtime.
550
581
fn get_cawg_details_for_manifest (
0 commit comments