@@ -3,7 +3,9 @@ const fetch = require('npm-registry-fetch')
33const  localeCompare  =  require ( '@isaacs/string-locale-compare' ) ( 'en' ) 
44const  npa  =  require ( 'npm-package-arg' ) 
55const  pacote  =  require ( 'pacote' ) 
6+ const  path  =  require ( 'path' ) 
67const  pMap  =  require ( 'p-map' ) 
8+ const  {  sigstore }  =  require ( 'sigstore' ) 
79
810const  ArboristWorkspaceCmd  =  require ( '../arborist-cmd.js' ) 
911const  auditError  =  require ( '../utils/audit-error.js' ) 
@@ -188,19 +190,41 @@ class VerifySignatures {
188190 } 
189191
190192 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-  } ) 
193+  const  {  host,  pathname }  =  new  URL ( registry ) 
194+  const  regKey  =  `${ host } ${ pathname  ===  '/'  ? ''  : pathname }  /keys.json` 
195+  const  tufCachePath  =  path . join ( this . npm . cache ,  '_tuf' ) 
196+  let  keys  =  await  sigstore . tuf . getTarget ( regKey ,  {  tufCachePath } ) 
197+  . then ( ( target )  =>  JSON . parse ( target ) ) 
198+  . then ( ( {  keys : ks  } )  =>  ks . map ( ( key )  =>  ( { 
199+  ...key , 
200+  keyid : key . keyId , 
201+  pemkey : `-----BEGIN PUBLIC KEY-----\n${ key . publicKey . rawBytes }  \n-----END PUBLIC KEY-----` , 
202+  expires : key . publicKey . validFor . end  ||  null , 
203+  } ) ) ) . catch ( err  =>  { 
204+  if  ( err . code  ===  'TUF_FIND_TARGET_ERROR' )  { 
205+  return  null 
206+  }  else  { 
207+  throw  err 
208+  } 
209+  } ) 
210+ 
211+  // If keys not found in Sigstore TUF repo, fallback to registry keys API 
212+  if  ( ! keys )  { 
213+  keys  =  await  fetch . json ( '/-/npm/v1/keys' ,  { 
214+  ...this . npm . flatOptions , 
215+  registry, 
216+  } ) . then ( ( {  keys : ks  } )  =>  ks . map ( ( key )  =>  ( { 
217+  ...key , 
218+  pemkey : `-----BEGIN PUBLIC KEY-----\n${ key . key }  \n-----END PUBLIC KEY-----` , 
219+  } ) ) ) . catch ( err  =>  { 
220+  if  ( err . code  ===  'E404'  ||  err . code  ===  'E400' )  { 
221+  return  null 
222+  }  else  { 
223+  throw  err 
224+  } 
225+  } ) 
226+  } 
227+ 
204228 if  ( keys )  { 
205229 this . keys . set ( registry ,  keys ) 
206230 } 
0 commit comments