...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package static
17
18 import (
19 "io"
20
21 v1 "github.com/google/go-containerregistry/pkg/v1"
22 "github.com/google/go-containerregistry/pkg/v1/empty"
23 "github.com/google/go-containerregistry/pkg/v1/mutate"
24 "github.com/google/go-containerregistry/pkg/v1/types"
25 payloadsize "github.com/sigstore/cosign/v2/internal/pkg/cosign/payload/size"
26 "github.com/sigstore/cosign/v2/internal/pkg/now"
27 "github.com/sigstore/cosign/v2/pkg/oci"
28 "github.com/sigstore/cosign/v2/pkg/oci/signed"
29 )
30
31
32 func NewFile(payload []byte, opts ...Option) (oci.File, error) {
33 o, err := makeOptions(opts...)
34 if err != nil {
35 return nil, err
36 }
37 base := mutate.MediaType(empty.Image, types.OCIManifestSchema1)
38 base = mutate.ConfigMediaType(base, o.ConfigMediaType)
39 layer := &staticLayer{
40 b: payload,
41 opts: o,
42 }
43 img, err := mutate.Append(base, mutate.Addendum{
44 Layer: layer,
45 })
46 if err != nil {
47 return nil, err
48 }
49
50
51 img = mutate.Annotations(img, o.Annotations).(v1.Image)
52
53 if o.RecordCreationTimestamp {
54 t, err := now.Now()
55 if err != nil {
56 return nil, err
57 }
58
59
60 img, err = mutate.CreatedAt(img, v1.Time{Time: t})
61 if err != nil {
62 return nil, err
63 }
64 }
65
66 return &file{
67 SignedImage: signed.Image(img),
68 layer: layer,
69 }, nil
70 }
71
72 type file struct {
73 oci.SignedImage
74 layer v1.Layer
75 }
76
77 var _ oci.File = (*file)(nil)
78
79
80 func (f *file) FileMediaType() (types.MediaType, error) {
81 return f.layer.MediaType()
82 }
83
84
85 func (f *file) Payload() ([]byte, error) {
86 size, err := f.layer.Size()
87 if err != nil {
88 return nil, err
89 }
90 err = payloadsize.CheckSize(uint64(size))
91 if err != nil {
92 return nil, err
93 }
94 rc, err := f.layer.Uncompressed()
95 if err != nil {
96 return nil, err
97 }
98 defer rc.Close()
99 return io.ReadAll(rc)
100 }
101
View as plain text