@@ -165,43 +165,49 @@ class RegistryFetcher extends Fetcher {
165165 mani . _integrity = String ( this . integrity )
166166 if ( dist . signatures ) {
167167 if ( this . opts . verifySignatures ) {
168- if ( this . registryKeys ) {
169- // validate and throw on error, then set _signatures
170- const message = `${ mani . _id } :${ mani . _integrity } `
171- for ( const signature of dist . signatures ) {
172- const publicKey = this . registryKeys . filter ( key => ( key . keyid === signature . keyid ) ) [ 0 ]
173- if ( ! publicKey ) {
174- throw Object . assign ( new Error (
175- `${ mani . _id } has a signature with keyid: ${ signature . keyid } ` +
176- 'but no corresponding public key can be found.'
177- ) , { code : 'EMISSINGSIGNATUREKEY' } )
178- }
179- const validPublicKey =
180- ! publicKey . expires || ( Date . parse ( publicKey . expires ) > Date . now ( ) )
181- if ( ! validPublicKey ) {
182- throw Object . assign ( new Error (
183- `${ mani . _id } has a signature with keyid: ${ signature . keyid } ` +
184- `but the corresponding public key has expired ${ publicKey . expires } `
185- ) , { code : 'EEXPIREDSIGNATUREKEY' } )
186- }
187- const verifier = crypto . createVerify ( 'SHA256' )
188- verifier . write ( message )
189- verifier . end ( )
190- const valid = verifier . verify (
191- publicKey . pemkey ,
192- signature . sig ,
193- 'base64'
194- )
195- if ( ! valid ) {
196- throw Object . assign ( new Error (
197- 'Integrity checksum signature failed: ' +
198- `key ${ publicKey . keyid } signature ${ signature . sig } `
199- ) , { code : 'EINTEGRITYSIGNATURE' } )
200- }
168+ // validate and throw on error, then set _signatures
169+ const _id = `${ mani . name } @${ mani . version } `
170+ const message = `${ _id } :${ mani . _integrity } `
171+ for ( const signature of dist . signatures ) {
172+ const publicKey = this . registryKeys &&
173+ this . registryKeys . filter ( key => ( key . keyid === signature . keyid ) ) [ 0 ]
174+ if ( ! publicKey ) {
175+ throw Object . assign ( new Error (
176+ `${ _id } has a registry signature with keyid: ${ signature . keyid } ` +
177+ `but no corresponding public key can be found on ${ this . registry } -/npm/v1/keys`
178+ ) , { code : 'EMISSINGSIGNATUREKEY' } )
179+ }
180+ const validPublicKey =
181+ ! publicKey . expires || ( Date . parse ( publicKey . expires ) > Date . now ( ) )
182+ if ( ! validPublicKey ) {
183+ throw Object . assign ( new Error (
184+ `${ _id } has a registry signature with keyid: ${ signature . keyid } ` +
185+ `but the corresponding public key on ${ this . registry } -/npm/v1/keys ` +
186+ `has expired ${ publicKey . expires } `
187+ ) , { code : 'EEXPIREDSIGNATUREKEY' } )
188+ }
189+ const verifier = crypto . createVerify ( 'SHA256' )
190+ verifier . write ( message )
191+ verifier . end ( )
192+ const valid = verifier . verify (
193+ publicKey . pemkey ,
194+ signature . sig ,
195+ 'base64'
196+ )
197+ if ( ! valid ) {
198+ throw Object . assign ( new Error (
199+ `${ _id } has an invalid registry signature with ` +
200+ `keyid: ${ publicKey . keyid } and signature: ${ signature . sig } `
201+ ) , {
202+ code : 'EINTEGRITYSIGNATURE' ,
203+ keyid : publicKey . keyid ,
204+ signature : signature . sig ,
205+ resolved : mani . _resolved ,
206+ integrity : mani . _integrity ,
207+ } )
201208 }
202- mani . _signatures = dist . signatures
203209 }
204- // if no keys, don't set _signatures
210+ mani . _signatures = dist . signatures
205211 } else {
206212 mani . _signatures = dist . signatures
207213 }
0 commit comments