@@ -31,6 +31,7 @@ import (
3131 "github.com/veraison/services/plugin"
3232 "github.com/veraison/services/proto"
3333 "github.com/veraison/services/vts/appraisal"
34+ "github.com/veraison/services/vts/compositeevidenceparser"
3435 "github.com/veraison/services/vts/coservsigner"
3536 "github.com/veraison/services/vts/earsigner"
3637 "github.com/veraison/services/vts/policymanager"
@@ -412,27 +413,68 @@ func (o *GRPC) GetCompositeAttestation(
412413 o .logger .Infow ("get composite attestation" , "media-type" , token .MediaType ,
413414 "tenant-id" , token .TenantId )
414415
415- // TODO(tho)
416- //
417- // lead_verifier(CE, ce-type, n) -> CAR {
418- // // lookup CE parser
419- // parser = ce_parsers_table[ce-type]
420- //
421- // // tokenise the composite evidence
422- // {CE_i, ce_i-type, label_i} = parser(CE)
423- //
424- // // walk the items in the composite evidence
425- // foreach c, t, l in {CE_i, ce_i-type, label_i}:
426- // client = dispatch_table[ce_i-type]
427- // if !client:
428- // EAR[label_i] = { raw-evidence: c, status: unknown }
429- // else:
430- // EAR[label_i] = client(c, n)
431- //
432- // CAR = make_car(EAR, lead_verifier_signing_key)
433- //
434- // return CAR
435- // }
416+ /****************/
417+ // For Master Plugin at the start to track the context
418+ handler , err := o .EvPluginManager .LookupByMediaType (token .MediaType )
419+ if err != nil {
420+ appraisal := appraisal .New (token .TenantId , token .Nonce , "ERROR" )
421+ appraisal .SetAllClaims (ear .UnexpectedEvidenceClaim )
422+ appraisal .AddPolicyClaim ("problem" , "could not resolve media type" )
423+ return o .finalize (appraisal , err )
424+ }
425+
426+ scheme := handler .GetAttestationScheme ()
427+ stHandler , err := o .StorePluginManager .LookupByAttestationScheme (scheme )
428+ if err != nil {
429+ appraisal := appraisal .New (token .TenantId , token .Nonce , "ERROR" )
430+ appraisal .SetAllClaims (ear .UnexpectedEvidenceClaim )
431+ appraisal .AddPolicyClaim ("problem" , "could not resolve scheme name" )
432+ return o .finalize (appraisal , err )
433+ }
434+
435+ masterAppraisal , err := o .initEvidenceContext (stHandler , token )
436+ if err != nil {
437+ return o .finalize (masterAppraisal , err )
438+ }
439+
440+ /******************/
441+ p , err := compositeevidenceparser .GetCEParserFromMediaType (token .MediaType )
442+ if err != nil {
443+ return nil , fmt .Errorf ("unable to fecth parser from received MediaType: %s, %w" , token .MediaType , err )
444+ }
445+
446+ evs , err := p .Parse (token .Data )
447+ if err != nil {
448+ return nil , fmt .Errorf ("unable to parse Composite Evidence for the MediaType: %s, %w" , token .MediaType , err )
449+ }
450+
451+ for i , ev := range evs {
452+ var clientCfg []byte
453+ mt := ev .GetMediaType ()
454+ client , err := o .LeadVerifierPluginManager .LookupByMediaType (mt )
455+ if err != nil {
456+ return nil , fmt .Errorf ("unable to get component verifier client for component evidence at index: %d, media type: %s, %w" , i , mt , err )
457+ }
458+
459+ // TO DO Check if this is ear.Appraisal or ear.AttestationResults
460+ ar , err := client .AppraiseComponentEvidence (ev .GetevidenceData (), mt , token .Nonce , clientCfg )
461+
462+ if err != nil {
463+ appraisal := appraisal .New (token .TenantId , token .Nonce , "ERROR" )
464+ appraisal .SetAllClaims (ear .UnexpectedEvidenceClaim )
465+ appraisal .AddPolicyClaim ("problem" , "could not appraise component evidence" )
466+ aggregatePartialAttestationResults (masterAppraisal .Result , appraisal .Result )
467+ return o .finalize (appraisal , err )
468+ }
469+ var compAR * ear.AttestationResult = & ear.AttestationResult {}
470+ if err := compAR .UnmarshalJSON (ar ); err != nil {
471+ // finalise appraisal
472+ }
473+ masterAppraisal .Result , err = aggregatePartialAttestationResults (masterAppraisal .Result , compAR )
474+ if err != nil {
475+ //finalise appraisal
476+ }
477+ }
436478
437479 return nil , errors .New ("not implemented" )
438480}
@@ -947,3 +989,9 @@ func SerializeCertPEMBytes(certPEMs [][]byte) ([]byte, error) {
947989
948990 return allPEM .Bytes (), nil
949991}
992+
993+ // TO DO THis Function should be in EAR Library
994+ func aggregatePartialAttestationResults (overall * ear.AttestationResult , apprInput * ear.AttestationResult ) (appraisal * ear.AttestationResult , err error ) {
995+
996+ return nil , nil
997+ }
0 commit comments