|
|
|
package result
|
|
|
|
|
|
|
|
import (
|
|
|
|
pb "github.com/moby/buildkit/frontend/gateway/pb"
|
|
|
|
digest "github.com/opencontainers/go-digest"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
AttestationReasonKey = "reason"
|
|
|
|
AttestationSBOMCore = "sbom-core"
|
|
|
|
AttestationInlineOnlyKey = "inline-only"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
AttestationReasonSBOM = "sbom"
|
|
|
|
AttestationReasonProvenance = "provenance"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Attestation[T any] struct {
|
|
|
|
Kind pb.AttestationKind
|
|
|
|
|
|
|
|
Metadata map[string][]byte
|
|
|
|
|
|
|
|
Ref T
|
|
|
|
Path string
|
|
|
|
ContentFunc func() ([]byte, error)
|
|
|
|
|
|
|
|
InToto InTotoAttestation
|
|
|
|
}
|
|
|
|
|
|
|
|
type InTotoAttestation struct {
|
|
|
|
PredicateType string
|
|
|
|
Subjects []InTotoSubject
|
|
|
|
}
|
|
|
|
|
|
|
|
type InTotoSubject struct {
|
|
|
|
Kind pb.InTotoSubjectKind
|
|
|
|
|
|
|
|
Name string
|
|
|
|
Digest []digest.Digest
|
|
|
|
}
|
|
|
|
|
|
|
|
func ToDigestMap(ds ...digest.Digest) map[string]string {
|
|
|
|
m := map[string]string{}
|
|
|
|
for _, d := range ds {
|
|
|
|
m[d.Algorithm().String()] = d.Encoded()
|
|
|
|
}
|
|
|
|
return m
|
|
|
|
}
|
|
|
|
|
|
|
|
func FromDigestMap(m map[string]string) []digest.Digest {
|
|
|
|
var ds []digest.Digest
|
|
|
|
for k, v := range m {
|
|
|
|
ds = append(ds, digest.NewDigestFromEncoded(digest.Algorithm(k), v))
|
|
|
|
}
|
|
|
|
return ds
|
|
|
|
}
|
|
|
|
|
|
|
|
func ConvertAttestation[U comparable, V comparable](a *Attestation[U], fn func(U) (V, error)) (*Attestation[V], error) {
|
|
|
|
var zero U
|
|
|
|
|
|
|
|
var ref V
|
|
|
|
if a.Ref != zero {
|
|
|
|
var err error
|
|
|
|
ref, err = fn(a.Ref)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return &Attestation[V]{
|
|
|
|
Kind: a.Kind,
|
|
|
|
Metadata: a.Metadata,
|
|
|
|
Ref: ref,
|
|
|
|
Path: a.Path,
|
|
|
|
ContentFunc: a.ContentFunc,
|
|
|
|
InToto: a.InToto,
|
|
|
|
}, nil
|
|
|
|
}
|