@@ -39,7 +39,8 @@ export async function fetchAsJson(packageName: string, version?: string) {
3939
4040interface KeyInfo {
4141 keyid : string ;
42- key : crypto . KeyObject ;
42+ // base64 encoded DER SPKI
43+ keyData : string ;
4344}
4445
4546async function fetchSigstoreTufKeys ( ) : Promise < Array < KeyInfo > | null > {
@@ -68,7 +69,7 @@ async function fetchSigstoreTufKeys(): Promise<Array<KeyInfo> | null> {
6869 }
6970 } ) . map ( k => ( {
7071 keyid : k . keyId ,
71- key : crypto . createPublicKey ( { key : Buffer . from ( k . publicKey . rawBytes , `base64` ) , format : `der` , type : `spki` } ) ,
72+ keyData : k . publicKey . rawBytes ,
7273 } ) ) ;
7374}
7475
@@ -83,8 +84,7 @@ async function getVerificationKeys(): Promise<Array<KeyInfo>> {
8384 debugUtils . log ( `Using COREPACK_INTEGRITY_KEYS to verify signatures: ${ keys . map ( k => k . keyid ) . join ( `, ` ) } ` ) ;
8485 return keys . map ( k => ( {
8586 keyid : k . keyid ,
86- key : crypto . createPublicKey ( `-----BEGIN PUBLIC KEY-----\n${ k . key } \n-----END PUBLIC KEY-----` ,
87- ) ,
87+ keyData : k . key ,
8888 } ) ) ;
8989 }
9090
@@ -98,12 +98,11 @@ async function getVerificationKeys(): Promise<Array<KeyInfo>> {
9898 debugUtils . log ( `Falling back to built-in npm verification keys` ) ;
9999 return defaultConfig . keys . npm . map ( k => ( {
100100 keyid : k . keyid ,
101- key : crypto . createPublicKey ( `-----BEGIN PUBLIC KEY-----\n${ k . key } \n-----END PUBLIC KEY-----` ,
102- ) ,
101+ keyData : k . key ,
103102 } ) ) ;
104103}
105104
106- let verificationKeysCache : Promise < Array < { keyid : string , key : crypto . KeyObject } > > | null = null ;
105+ let verificationKeysCache : Promise < Array < KeyInfo > > | null = null ;
107106
108107export async function verifySignature ( { signatures, integrity, packageName, version} : {
109108 signatures : Array < { keyid : string , sig : string } > ;
@@ -115,21 +114,22 @@ export async function verifySignature({signatures, integrity, packageName, versi
115114 verificationKeysCache = getVerificationKeys ( ) ;
116115
117116 const keys = await verificationKeysCache ;
118- const key = keys . find ( ( { keyid} ) => signatures . some ( s => s . keyid === keyid ) ) ;
119- if ( key == null )
117+ const keyInfo = keys . find ( ( { keyid} ) => signatures . some ( s => s . keyid === keyid ) ) ;
118+ if ( keyInfo == null )
120119 throw new Error ( `Cannot find key to verify signature. signature keys: ${ signatures . map ( s => s . keyid ) } , verification keys: ${ keys . map ( k => k . keyid ) } ` ) ;
121120
122- const signature = signatures . find ( ( { keyid} ) => keyid === key . keyid ) ;
121+ const signature = signatures . find ( ( { keyid} ) => keyid === keyInfo . keyid ) ;
123122 assert ( signature ) ;
124123
125124 const verifier = crypto . createVerify ( `SHA256` ) ;
126125 const payload = `${ packageName } @${ version } :${ integrity } ` ;
127126 verifier . end ( payload ) ;
127+ const key = crypto . createPublicKey ( { key : Buffer . from ( keyInfo . keyData , `base64` ) , format : `der` , type : `spki` } ) ;
128128 const valid = verifier . verify ( key , signature . sig , `base64` ) ;
129129
130130 if ( ! valid ) {
131131 throw new Error (
132- `Signature verification failed for ${ payload } with key ${ key . keyid } \n` +
132+ `Signature verification failed for ${ payload } with key ${ keyInfo . keyid } \n` +
133133 `If you are using a custom registry you can set COREPACK_INTEGRITY_KEYS.` ,
134134 ) ;
135135 }
0 commit comments