@@ -24,13 +24,13 @@ import (
2424 "slices"
2525 "sort"
2626 "strings"
27- "time"
2827
2928 "github.com/spf13/cobra"
3029
3130 "github.com/chainguard-dev/clog"
3231
3332 "chainguard.dev/apko/pkg/apk/apk"
33+ "chainguard.dev/apko/pkg/apk/apk/keyring"
3434 "chainguard.dev/apko/pkg/apk/auth"
3535 apkfs "chainguard.dev/apko/pkg/apk/fs"
3636 "chainguard.dev/apko/pkg/build"
@@ -281,87 +281,33 @@ func stripURLScheme(url string) string {
281281func discoverKeysForLock (ctx context.Context , ic * types.ImageConfiguration , archs []types.Architecture ) []pkglock.LockKeyring {
282282 log := clog .FromContext (ctx )
283283
284- // Collect all unique repositories
285- repoSet := make (map [string ]struct {})
286- for _ , repo := range ic .Contents .BuildRepositories {
287- repoSet [repo ] = struct {}{}
288- }
289- for _ , repo := range ic .Contents .RuntimeOnlyRepositories {
290- repoSet [repo ] = struct {}{}
291- }
292- for _ , repo := range ic .Contents .Repositories {
293- repoSet [repo ] = struct {}{}
284+ keys , err := keyring .NewKeyRing (
285+ keyring .AddRepositories (ic .Contents .BuildRepositories ... ),
286+ keyring .AddRepositories (ic .Contents .RuntimeOnlyRepositories ... ),
287+ keyring .AddRepositories (ic .Contents .Repositories ... ),
288+ )
289+ if err != nil {
290+ log .Errorf ("adding repositories for key discovery: %v" , err )
291+ return nil
294292 }
295293
296- // Map to track discovered keys by URL to avoid duplicates
297- discoveredKeyMap := make (map [string ]pkglock.LockKeyring )
298-
299- // Fetch Alpine releases once (cached by HTTP client)
300- client := & http.Client {}
301- var alpineReleases * apk.Releases
302-
303- // Discover keys for each repository and architecture
304- for repo := range repoSet {
305- // Try Alpine-style key discovery
306- if ver , ok := apk .ParseAlpineVersion (repo ); ok {
307- // Fetch releases.json if not already fetched
308- if alpineReleases == nil {
309- releases , err := apk .FetchAlpineReleases (ctx , client )
310- if err != nil {
311- log .Warnf ("Failed to fetch Alpine releases: %v" , err )
312- continue
313- }
314- alpineReleases = releases
315- }
316-
317- branch := alpineReleases .GetReleaseBranch (ver )
318- if branch == nil {
319- log .Debugf ("Alpine version %s not found in releases" , ver )
320- continue
321- }
322-
323- // Get keys for each architecture
324- for _ , arch := range archs {
325- log .Debugf ("Discovering Alpine keys for %s (version %s, arch %s)" , repo , ver , arch .ToAPK ())
326- urls := branch .KeysFor (arch .ToAPK (), time .Now ())
327- if len (urls ) == 0 {
328- log .Debugf ("No keys found for arch %s and version %s" , arch .ToAPK (), ver )
329- continue
330- }
331-
332- // Add discovered key URLs to the map
333- for _ , u := range urls {
334- discoveredKeyMap [u ] = pkglock.LockKeyring {
335- Name : stripURLScheme (u ),
336- URL : u ,
337- }
338- }
339- }
340- }
294+ archStrs := make ([]string , 0 , len (archs ))
295+ for _ , arch := range archs {
296+ archStrs = append (archStrs , arch .ToAPK ())
297+ }
341298
342- // Try Chainguard-style key discovery
343- log .Debugf ("Attempting Chainguard-style key discovery for %s" , repo )
344- keys , err := apk .DiscoverKeys (ctx , client , auth .DefaultAuthenticators , repo )
345- if err != nil {
346- log .Debugf ("Chainguard-style key discovery failed for %s: %v" , repo , err )
347- } else if len (keys ) > 0 {
348- log .Debugf ("Discovered %d Chainguard-style keys for %s" , len (keys ), repo )
349- // For each JWKS key, emit a URL: repository + "/" + KeyID
350- repoBase := strings .TrimSuffix (repo , "/" )
351- for _ , key := range keys {
352- keyURL := repoBase + "/" + key .ID
353- discoveredKeyMap [keyURL ] = pkglock.LockKeyring {
354- Name : stripURLScheme (keyURL ),
355- URL : keyURL ,
356- }
357- }
358- }
299+ fetchedKeys , err := keys .FetchKeys (ctx , keyring .NewFetcher (http .DefaultClient , auth .DefaultAuthenticators ), archStrs )
300+ if err != nil {
301+ log .Errorf ("downloading keys from repositories: %v" , err )
302+ return nil
359303 }
360304
361- // Convert map to slice
362- discoveredKeys := make ([]pkglock.LockKeyring , 0 , len (discoveredKeyMap ))
363- for _ , key := range discoveredKeyMap {
364- discoveredKeys = append (discoveredKeys , key )
305+ discoveredKeys := make ([]pkglock.LockKeyring , 0 , len (fetchedKeys ))
306+ for _ , key := range fetchedKeys {
307+ discoveredKeys = append (discoveredKeys , pkglock.LockKeyring {
308+ Name : stripURLScheme (key .URL ),
309+ URL : key .URL ,
310+ })
365311 }
366312
367313 log .Infof ("Discovered %d auto-discovered keys" , len (discoveredKeys ))
0 commit comments