@@ -4,6 +4,7 @@ const localeCompare = require('@isaacs/string-locale-compare')('en')
4
4
const npa = require ( 'npm-package-arg' )
5
5
const pacote = require ( 'pacote' )
6
6
const pMap = require ( 'p-map' )
7
+ const { sigstore } = require ( 'sigstore' )
7
8
8
9
const ArboristWorkspaceCmd = require ( '../arborist-cmd.js' )
9
10
const auditError = require ( '../utils/audit-error.js' )
@@ -188,19 +189,41 @@ class VerifySignatures {
188
189
}
189
190
190
191
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
+
204
227
if ( keys ) {
205
228
this . keys . set ( registry , keys )
206
229
}
0 commit comments