@@ -357,7 +357,7 @@ func (o *Handler) SubmitEvidence(c *gin.Context) {
357357 }
358358 }
359359
360- isSupported , err := o .Verifier .IsSupportedMediaType (mediaType )
360+ isSupportedMediaType , err := o .Verifier .IsSupportedMediaType (mediaType )
361361 if err != nil {
362362 status := http .StatusInternalServerError
363363 if errors .Unwrap (err ) == verifier .ErrInputParam {
@@ -368,6 +368,19 @@ func (o *Handler) SubmitEvidence(c *gin.Context) {
368368 return
369369 }
370370
371+ isSupportedCompositeEvidenceMediaType , err := o .Verifier .IsSupportedCompositeEvidenceMediaType (mediaType )
372+ if err != nil {
373+ status := http .StatusInternalServerError
374+ if errors .Unwrap (err ) == verifier .ErrInputParam {
375+ status = http .StatusBadRequest
376+ }
377+
378+ ReportProblem (c , status , fmt .Sprintf ("could not check composite evidence media type with verifier: %v" , err ))
379+ return
380+ }
381+
382+ isSupported := isSupportedMediaType || isSupportedCompositeEvidenceMediaType
383+
371384 if ! isSupported {
372385 supportedMediaTypes , err := o .Verifier .SupportedMediaTypes ()
373386 if err != nil {
@@ -379,6 +392,18 @@ func (o *Handler) SubmitEvidence(c *gin.Context) {
379392 return
380393 }
381394
395+ supportedCompositeEvidenceMediaTypes , err := o .Verifier .SupportedCompositeEvidenceMediaTypes ()
396+ if err != nil {
397+ ReportProblem (c ,
398+ http .StatusInternalServerError ,
399+ fmt .Sprintf ("could not get supported composite evidence media types from verifier: %v" ,
400+ err ),
401+ )
402+ return
403+ }
404+
405+ supportedMediaTypes = append (supportedMediaTypes , supportedCompositeEvidenceMediaTypes ... )
406+
382407 c .Header ("Accept" , strings .Join (supportedMediaTypes , ", " ))
383408 ReportProblem (c ,
384409 http .StatusUnsupportedMediaType ,
@@ -411,8 +436,16 @@ func (o *Handler) SubmitEvidence(c *gin.Context) {
411436 // reported if something in the verifier or the connection goes wrong.
412437 // Any problems with the evidence are expected to be reported via the
413438 // attestation result.
414- attestationResult , err := o .Verifier .ProcessEvidence (tenantID , session .Nonce ,
415- evidence , mediaType )
439+ var attestationResult []byte
440+
441+ if isSupportedMediaType {
442+ attestationResult , err = o .Verifier .ProcessEvidence (tenantID , session .Nonce ,
443+ evidence , mediaType )
444+ } else if isSupportedCompositeEvidenceMediaType {
445+ attestationResult , err = o .Verifier .ProcessCompositeEvidence (tenantID , session .Nonce ,
446+ evidence , mediaType )
447+ }
448+
416449 if err != nil {
417450 o .logger .Error (err )
418451 session .SetStatus (StatusFailed )
@@ -474,11 +507,27 @@ func (o *Handler) NewChallengeResponse(c *gin.Context) {
474507 if err != nil {
475508 ReportProblem (c ,
476509 http .StatusInternalServerError ,
477- fmt .Sprintf ("could not get media types form verifier: %v" , err ),
510+ fmt .Sprintf ("could not get media types from verifier: %v" , err ),
478511 )
479512 return
480513 }
481514
515+ // In lead-verifier mode, we need to get the supported collection media types
516+ // from the verifier as well, to be able to create sessions that can accept
517+ // composite evidence.
518+ supportedCollectionMediaTypes , err := o .Verifier .SupportedCompositeEvidenceMediaTypes ()
519+ if err != nil {
520+ ReportProblem (c ,
521+ http .StatusInternalServerError ,
522+ fmt .Sprintf ("could not get collection media types from verifier: %v" , err ),
523+ )
524+ return
525+ }
526+
527+ // Note that if the node is not a lead-verifier, the supported collection
528+ // media types list is empty, which makes the following a no-op.
529+ supportedMediaTypes = append (supportedMediaTypes , supportedCollectionMediaTypes ... )
530+
482531 id , session , err := newSession (nonce , supportedMediaTypes , ConfigSessionTTL )
483532 if err != nil {
484533 ReportProblem (c ,
@@ -529,15 +578,20 @@ func (o *Handler) getVerificationMediaTypes() ([]string, error) {
529578 return o .Verifier .SupportedMediaTypes ()
530579}
531580
581+ func (o * Handler ) getSupportedCompositeEvidenceMediaTypes () ([]string , error ) {
582+ return o .Verifier .SupportedCompositeEvidenceMediaTypes ()
583+ }
584+
532585func (o * Handler ) getVerificationServerVersionAndState () (string , string , error ) {
533586 vtsState , err := o .Verifier .GetVTSState ()
534587 if err != nil {
535588 return "" , "" , err
536589 }
590+
537591 version := vtsState .ServerVersion
538592 state := vtsState .Status .String ()
539- return version , state , nil
540593
594+ return version , state , nil
541595}
542596
543597func getVerificationEndpoints () map [string ]string {
@@ -574,6 +628,16 @@ func (o *Handler) GetWellKnownVerificationInfo(c *gin.Context) {
574628 return
575629 }
576630
631+ // Get verification composite evidence media types
632+ compositeEvidenceMediaTypes , err := o .getSupportedCompositeEvidenceMediaTypes ()
633+ if err != nil {
634+ ReportProblem (c ,
635+ http .StatusInternalServerError ,
636+ err .Error (),
637+ )
638+ return
639+ }
640+
577641 // Get verification server version and state
578642 version , state , err := o .getVerificationServerVersionAndState ()
579643 if err != nil {
@@ -588,7 +652,7 @@ func (o *Handler) GetWellKnownVerificationInfo(c *gin.Context) {
588652 endpoints := getVerificationEndpoints ()
589653
590654 // Get final object with well known information
591- obj , err := capability .NewWellKnownInfoObj (key , mediaTypes , nil , version , state , endpoints )
655+ obj , err := capability .NewWellKnownInfoObj (key , mediaTypes , compositeEvidenceMediaTypes , nil , version , state , endpoints )
592656 if err != nil {
593657 ReportProblem (c ,
594658 http .StatusInternalServerError ,
0 commit comments