@@ -4,6 +4,7 @@ const localeCompare = require('@isaacs/string-locale-compare')('en')
44const npa = require ( 'npm-package-arg' )
55const pacote = require ( 'pacote' )
66const pMap = require ( 'p-map' )
7+ const { sigstore } = require ( 'sigstore' )
78
89const ArboristWorkspaceCmd = require ( '../arborist-cmd.js' )
910const auditError = require ( '../utils/audit-error.js' )
@@ -188,19 +189,41 @@ class VerifySignatures {
188189 }
189190
190191 async setKeys ( { registry } ) {
191- const keys = await fetch . json ( '/-/npm/v1/keys' , {
192- ...this . npm . flatOptions ,
193- registry,
194- } ) . then ( ( { keys : ks } ) => ks . map ( ( key ) => ( {
195- ...key ,
196- pemkey : `-----BEGIN PUBLIC KEY-----\n${ key . key } \n-----END PUBLIC KEY-----` ,
197- } ) ) ) . catch ( err => {
198- if ( err . code === 'E404' || err . code === 'E400' ) {
199- return null
200- } else {
201- throw err
202- }
203- } )
192+ const { host, pathname } = new URL ( registry )
193+ // Strip any trailing slashes from pathname
194+ const regKey = `${ host } ${ pathname . replace ( / \/ $ / , '' ) } /keys.json`
195+ let keys = await sigstore . tuf . getTarget ( regKey , { tufCachePath : this . opts . tufCache } )
196+ . then ( ( target ) => JSON . parse ( target ) )
197+ . then ( ( { keys : ks } ) => ks . map ( ( key ) => ( {
198+ ...key ,
199+ keyid : key . keyId ,
200+ pemkey : `-----BEGIN PUBLIC KEY-----\n${ key . publicKey . rawBytes } \n-----END PUBLIC KEY-----` ,
201+ expires : key . publicKey . validFor . end || null ,
202+ } ) ) ) . catch ( err => {
203+ if ( err . code === 'TUF_FIND_TARGET_ERROR' ) {
204+ return null
205+ } else {
206+ throw err
207+ }
208+ } )
209+
210+ // If keys not found in Sigstore TUF repo, fallback to registry keys API
211+ if ( ! keys ) {
212+ keys = await fetch . json ( '/-/npm/v1/keys' , {
213+ ...this . npm . flatOptions ,
214+ registry,
215+ } ) . then ( ( { keys : ks } ) => ks . map ( ( key ) => ( {
216+ ...key ,
217+ pemkey : `-----BEGIN PUBLIC KEY-----\n${ key . key } \n-----END PUBLIC KEY-----` ,
218+ } ) ) ) . catch ( err => {
219+ if ( err . code === 'E404' || err . code === 'E400' ) {
220+ return null
221+ } else {
222+ throw err
223+ }
224+ } )
225+ }
226+
204227 if ( keys ) {
205228 this . keys . set ( registry , keys )
206229 }
0 commit comments