@@ -31,8 +31,10 @@ import (
3131 api "github.com/chainloop-dev/chainloop/internal/attestation/crafter/api/attestation/v1"
3232 "github.com/chainloop-dev/chainloop/internal/attestation/crafter/materials"
3333 "github.com/chainloop-dev/chainloop/internal/casclient"
34+ "github.com/chainloop-dev/chainloop/internal/ociauth"
3435 "github.com/go-git/go-git/v5"
3536 "github.com/go-git/go-git/v5/plumbing"
37+ "github.com/google/go-containerregistry/pkg/authn"
3638 "github.com/rs/zerolog"
3739 "google.golang.org/protobuf/encoding/protojson"
3840 "google.golang.org/protobuf/types/known/timestamppb"
@@ -59,21 +61,37 @@ type Crafter struct {
5961 Runner supportedRunner
6062 workingDir string
6163 stateManager StateManager
64+ // Authn is used to authenticate with the OCI registry
65+ ociRegistryAuth authn.Keychain
6266}
6367
6468var ErrAttestationStateNotLoaded = errors .New ("crafting state not loaded" )
6569
66- type NewOpt func (c * Crafter )
70+ type NewOpt func (c * Crafter ) error
6771
6872func WithLogger (l * zerolog.Logger ) NewOpt {
69- return func (c * Crafter ) {
73+ return func (c * Crafter ) error {
7074 c .logger = l
75+ return nil
7176 }
7277}
7378
7479func WithWorkingDirPath (path string ) NewOpt {
75- return func (c * Crafter ) {
80+ return func (c * Crafter ) error {
7681 c .workingDir = path
82+ return nil
83+ }
84+ }
85+
86+ func WithOCIAuth (server , username , password string ) NewOpt {
87+ return func (c * Crafter ) error {
88+ k , err := ociauth .NewCredentialsFromRegistry (server , username , password )
89+ if err != nil {
90+ return fmt .Errorf ("failed to load OCI credentials: %w" , err )
91+ }
92+
93+ c .ociRegistryAuth = k
94+ return nil
7795 }
7896}
7997
@@ -86,10 +104,14 @@ func NewCrafter(stateManager StateManager, opts ...NewOpt) (*Crafter, error) {
86104 logger : & noopLogger ,
87105 workingDir : cw ,
88106 stateManager : stateManager ,
107+ // By default we authenticate with the current user's keychain (i.e ~/.docker/config.json)
108+ ociRegistryAuth : authn .DefaultKeychain ,
89109 }
90110
91111 for _ , opt := range opts {
92- opt (c )
112+ if err := opt (c ); err != nil {
113+ return nil , err
114+ }
93115 }
94116
95117 return c , nil
@@ -435,7 +457,7 @@ func (c *Crafter) AddMaterial(ctx context.Context, attestationID, key, value str
435457 }
436458
437459 // 3 - Craft resulting material
438- mt , err := materials .Craft (context .Background (), m , value , casBackend , c .logger )
460+ mt , err := materials .Craft (context .Background (), m , value , casBackend , c .ociRegistryAuth , c . logger )
439461 if err != nil {
440462 return err
441463 }
0 commit comments