@@ -165,43 +165,49 @@ class RegistryFetcher extends Fetcher {
165
165
mani . _integrity = String ( this . integrity )
166
166
if ( dist . signatures ) {
167
167
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
+ } )
201
208
}
202
- mani . _signatures = dist . signatures
203
209
}
204
- // if no keys, don't set _signatures
210
+ mani . _signatures = dist . signatures
205
211
} else {
206
212
mani . _signatures = dist . signatures
207
213
}
0 commit comments