Skip to content

Commit 9ef81ed

Browse files
Updated verification loading logic.
Before if a trust domain was used, pgi and dotcom was not loaded. This commit makes it possible to mix and match as the operator wants to, so dotcom and a custom trust domain can be used together.
1 parent 04e473f commit 9ef81ed

File tree

4 files changed

+64
-83
lines changed

4 files changed

+64
-83
lines changed

cmd/aaop/aaop.go

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"os/signal"
1515
"path"
1616
"path/filepath"
17+
"strings"
1718
"syscall"
1819
"time"
1920

@@ -34,7 +35,7 @@ import (
3435
var (
3536
noPGI = flag.Bool("no-public-good", false, "disable public good sigstore instance")
3637
certsDir = flag.String("certs", "", "Directory to where TLS certs are stored")
37-
trustDomain = flag.String("trust-domain", "", "trust domain to use")
38+
trustDomains = flag.String("trust-domain", "", "comma separated trust domains to use")
3839
tufRepo = flag.String("tuf-repo", "", "URL to TUF repository")
3940
tufRoot = flag.String("tuf-root", "", "Path to a root.json used to initialize TUF repository")
4041
ns = flag.String("namespace", "", "namespace the pod runs in")
@@ -66,17 +67,20 @@ func main() {
6667
var kc *authn.KeyChainProvider
6768
var v provider.Verifier
6869
var err error
70+
var tds []string
6971

7072
flag.Parse()
7173

74+
tds = strings.Split(*trustDomains, ",")
75+
7276
if *tufRepo != "" && *tufRoot != "" {
7377
if v, err = loadCustomVerifier(*tufRepo,
7478
*tufRoot,
75-
*trustDomain); err != nil {
79+
tds); err != nil {
7680
log.Fatal(err)
7781
}
7882
} else {
79-
if v, err = loadVerifiers(!*noPGI, *trustDomain); err != nil {
83+
if v, err = loadVerifiers(!*noPGI, tds); err != nil {
8084
log.Fatal(err)
8185
}
8286
}
@@ -185,9 +189,11 @@ func run(ctx context.Context, srv *http.Server, cf string, kf string) error {
185189
// loadCustomVerifier loads a user provided TUF root.
186190
// Currently only verificatoin options with RFC3161 signed timestamps
187191
// are supported.
188-
func loadCustomVerifier(repo, root, td string) (provider.Verifier, error) {
192+
func loadCustomVerifier(repo, root string, tds []string) (provider.Verifier, error) {
193+
var mv = verifier.Multi{
194+
V: []*verifier.Verifier{},
195+
}
189196
var rb []byte
190-
var v *verifier.Verifier
191197
var vo = []verify.VerifierOption{
192198
verify.WithSignedTimestamps(1),
193199
}
@@ -197,49 +203,63 @@ func loadCustomVerifier(repo, root, td string) (provider.Verifier, error) {
197203
return nil, fmt.Errorf("failed to load verifier: %w", err)
198204
}
199205

200-
if v, err = verifier.New(rb, repo, td, vo); err != nil {
201-
return nil, fmt.Errorf("failed to create verifier: %w", err)
206+
for _, td := range tds {
207+
var v *verifier.Verifier
208+
209+
if v, err = verifier.New(rb, repo, td, vo); err != nil {
210+
return nil, fmt.Errorf("failed to create verifier: %w", err)
211+
}
212+
213+
mv.V = append(mv.V, v)
214+
215+
slog.Info("loaded verifier",
216+
"tuf_repo", repo,
217+
"trust_domain", td)
202218
}
203219

204-
return v, nil
220+
if len(mv.V) == 0 {
221+
return nil, errors.New("no trust root provided")
222+
}
223+
224+
return &mv, nil
205225
}
206226

207227
// loadVerifiers returns the default verifiers. If pgi is true and tr is
208228
// the empty string, pgi and gh verifiers are returned.
209229
// if the provided trust domain is set, only gh verifier is returend,
210230
// with the set trust domain.
211-
func loadVerifiers(pgi bool, td string) (provider.Verifier, error) {
231+
func loadVerifiers(pgi bool, tds []string) (provider.Verifier, error) {
212232
var mv = verifier.Multi{
213-
V: map[string]*verifier.Verifier{},
233+
V: []*verifier.Verifier{},
214234
}
215235
var v *verifier.Verifier
216236
var err error
217-
var dotcom bool
218237

219-
// only load PGI if no tenant's trust domain is selected
220-
if td == "" || td == DotcomTrustDomain {
221-
dotcom = true
238+
if len(tds) == 0 {
239+
tds = append(tds, DotcomTrustDomain)
222240
}
223241

224-
if pgi && dotcom {
242+
if pgi {
225243
if v, err = verifier.PGIVerifier(); err != nil {
226244
return nil, fmt.Errorf("failed to load PGI verifier: %w", err)
227245
}
228-
mv.V[verifier.PublicGoodIssuer] = v
246+
mv.V = append(mv.V, v)
229247
slog.Info("loaded verifier",
230248
"instance", "public good Sigstore")
231249
}
232250

233-
if v, err = verifier.GHVerifier(td); err != nil {
234-
return nil, fmt.Errorf("failed to load GitHub verifier: %w", err)
235-
}
236-
mv.V[verifier.GitHubIssuer] = v
237-
if td == "" {
238-
td = "dotcom"
251+
for _, td := range tds {
252+
var v *verifier.Verifier
253+
254+
if v, err = verifier.GHVerifier(td); err != nil {
255+
return nil, fmt.Errorf("failed to load GitHub verifier: %w", err)
256+
}
257+
mv.V = append(mv.V, v)
258+
259+
slog.Info("loaded verifier",
260+
"instance", "GitHub Sigstore",
261+
"trust_domain", td)
239262
}
240-
slog.Info("loaded verifier",
241-
"instance", "GitHub Sigstore",
242-
"trust_domain", td)
243263

244264
return &mv, nil
245265
}

cmd/cver/cver.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ var (
2020
)
2121

2222
func main() {
23-
var mv = &verifier.Multi{
24-
V: map[string]*verifier.Verifier{},
25-
}
23+
var mv = &verifier.Multi{}
2624
var v *verifier.Verifier
2725
var res []*verify.VerificationResult
2826
var ref name.Reference
@@ -41,12 +39,12 @@ func main() {
4139
log.Print(err)
4240
}
4341

44-
mv.V[verifier.PublicGoodIssuer] = v
42+
mv.V = append(mv.V, v)
4543

4644
if v, err = verifier.GHVerifier(""); err != nil {
4745
log.Print(err)
4846
}
49-
mv.V[verifier.GitHubIssuer] = v
47+
mv.V = append(mv.V, v)
5048

5149
if ref, err = name.ParseReference(*img); err != nil {
5250
log.Print(err)

pkg/verifier/multi.go

Lines changed: 14 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package verifier
22

33
import (
4-
"crypto/x509"
5-
"fmt"
64
"log/slog"
75

86
"github.com/google/go-containerregistry/pkg/v1"
@@ -22,14 +20,17 @@ const (
2220
// Multi is a Verifier that knows about multiple trust roots and inspects
2321
// the bundle to select the correct trust root for each provided bundle.
2422
type Multi struct {
25-
V map[string]*Verifier
23+
V []*Verifier
2624
}
2725

2826
// NewMulti initializes the multi verifier with a map of Issuer org to
2927
// a Verifier.
30-
func NewMulti(v map[string]*Verifier) *Multi {
28+
func NewMulti(v []*Verifier) *Multi {
29+
var m = make([]*Verifier, len(v))
30+
31+
copy(m, v)
3132
return &Multi{
32-
V: v,
33+
V: m,
3334
}
3435
}
3536

@@ -38,31 +39,20 @@ func NewMulti(v map[string]*Verifier) *Multi {
3839
// issuers are ignored.
3940
func (m *Multi) Verify(bundles []*bundle.Bundle, h *v1.Hash) ([]*verify.VerificationResult, error) {
4041
var res = []*verify.VerificationResult{}
42+
var err error
4143

4244
for _, b := range bundles {
4345
var r *verify.VerificationResult
44-
var v *Verifier
45-
var iss string
46-
var err error
47-
48-
if iss, err = getIssuer(b); err != nil {
49-
slog.Error("failed to extract issuer from bundle",
50-
"image_digest", h.Hex,
51-
"error", err)
52-
continue
53-
}
5446

55-
if v = m.V[iss]; v == nil {
56-
slog.Error("unknown issuer",
57-
"image_digest", h.Hex,
58-
"issuer", iss)
59-
// No configured verifier for this issuer
60-
continue
47+
for _, v := range m.V {
48+
if r, err = v.VerifyOne(b, h); err == nil {
49+
res = append(res, r)
50+
// skip rest of verifiers if verified
51+
break
52+
}
6153
}
6254

63-
if r, err = v.VerifyOne(b, h); err == nil {
64-
res = append(res, r)
65-
} else {
55+
if r == nil {
6656
subjects, subjectsErr := bundleSubjects(b)
6757
attrs := []any{
6858
"image_digest", h.Hex,
@@ -80,24 +70,3 @@ func (m *Multi) Verify(bundles []*bundle.Bundle, h *v1.Hash) ([]*verify.Verifica
8070

8171
return res, nil
8272
}
83-
84-
// getIssuer extracts the certificate from the bundle and returns the
85-
// organization name that issued the certificate.
86-
func getIssuer(b *bundle.Bundle) (string, error) {
87-
var vc verify.VerificationContent
88-
var c *x509.Certificate
89-
var err error
90-
91-
if vc, err = b.VerificationContent(); err != nil {
92-
return "", err
93-
}
94-
if c = vc.Certificate(); c == nil {
95-
return "", err
96-
}
97-
98-
if len(c.Issuer.Organization) != 1 {
99-
return "", fmt.Errorf("expected 1 issuer, found %d", len(c.Issuer.Organization))
100-
}
101-
102-
return c.Issuer.Organization[0], nil
103-
}

pkg/verifier/multi_test.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,7 @@ func TestMultiVerifier(t *testing.T) {
4646
require.NoError(t, err)
4747
assert.NotNil(t, gh)
4848

49-
var mv = NewMulti(map[string]*Verifier{
50-
PublicGoodIssuer: pgi,
51-
GitHubIssuer: gh,
52-
})
49+
var mv = NewMulti([]*Verifier{pgi, gh})
5350

5451
var b = &bundle.Bundle{}
5552
err = b.UnmarshalJSON([]byte(okBundle))
@@ -76,10 +73,7 @@ func TestMultiVerifierWrongHash(t *testing.T) {
7673
require.NoError(t, err)
7774
assert.NotNil(t, gh)
7875

79-
var mv = NewMulti(map[string]*Verifier{
80-
PublicGoodIssuer: pgi,
81-
GitHubIssuer: gh,
82-
})
76+
var mv = NewMulti([]*Verifier{pgi, gh})
8377

8478
var b = &bundle.Bundle{}
8579
err = b.UnmarshalJSON([]byte(okBundle))

0 commit comments

Comments
 (0)