(ref name.Reference, digest string)
| 69 | } |
| 70 | |
| 71 | func (c LiveClient) GetAttestations(ref name.Reference, digest string) ([]*api.Attestation, error) { |
| 72 | attestations := make([]*api.Attestation, 0) |
| 73 | |
| 74 | transportOpts := []remote.Option{remote.WithAuthFromKeychain(authn.DefaultKeychain)} |
| 75 | referrers, err := remote.Referrers(ref.Context().Digest(digest), transportOpts...) |
| 76 | if err != nil { |
| 77 | return attestations, fmt.Errorf("error getting referrers: %w", err) |
| 78 | } |
| 79 | refManifest, err := referrers.IndexManifest() |
| 80 | if err != nil { |
| 81 | return attestations, fmt.Errorf("error getting referrers manifest: %w", err) |
| 82 | } |
| 83 | |
| 84 | for _, refDesc := range refManifest.Manifests { |
| 85 | if !strings.HasPrefix(refDesc.ArtifactType, "application/vnd.dev.sigstore.bundle") { |
| 86 | continue |
| 87 | } |
| 88 | |
| 89 | refImg, err := remote.Image(ref.Context().Digest(refDesc.Digest.String()), remote.WithAuthFromKeychain(authn.DefaultKeychain)) |
| 90 | if err != nil { |
| 91 | return attestations, fmt.Errorf("error getting referrer image: %w", err) |
| 92 | } |
| 93 | layers, err := refImg.Layers() |
| 94 | if err != nil { |
| 95 | return attestations, fmt.Errorf("error getting referrer image: %w", err) |
| 96 | } |
| 97 | |
| 98 | if len(layers) > 0 { |
| 99 | layer0, err := layers[0].Uncompressed() |
| 100 | if err != nil { |
| 101 | return attestations, fmt.Errorf("error getting referrer image: %w", err) |
| 102 | } |
| 103 | defer layer0.Close() |
| 104 | |
| 105 | bundleBytes, err := io.ReadAll(layer0) |
| 106 | |
| 107 | if err != nil { |
| 108 | return attestations, fmt.Errorf("error getting referrer image: %w", err) |
| 109 | } |
| 110 | |
| 111 | b := &bundle.Bundle{} |
| 112 | err = b.UnmarshalJSON(bundleBytes) |
| 113 | |
| 114 | if err != nil { |
| 115 | return attestations, fmt.Errorf("error unmarshalling bundle: %w", err) |
| 116 | } |
| 117 | |
| 118 | a := api.Attestation{Bundle: b} |
| 119 | attestations = append(attestations, &a) |
| 120 | } else { |
| 121 | return attestations, fmt.Errorf("error getting referrer image: no layers found") |
| 122 | } |
| 123 | } |
| 124 | return attestations, nil |
| 125 | } |
| 126 | |
| 127 | // Unlike other parts of this command set, we cannot pass a custom HTTP client |
| 128 | // to the go-containerregistry library. This means we have limited visibility |
nothing calls this directly
no test coverage detected