@@ -68,6 +68,8 @@ __export(src_exports, {
68
68
getNistCurveFromOid : ( ) => getNistCurveFromOid ,
69
69
getPublicKeyAlgorithmNameFromOid : ( ) => getPublicKeyAlgorithmNameFromOid ,
70
70
getWebcrypto : ( ) => getWebcrypto ,
71
+ importPrivateKey : ( ) => importPrivateKey ,
72
+ importPublicKey : ( ) => importPublicKey ,
71
73
keyHashAlgosForDraftDecoding : ( ) => keyHashAlgosForDraftDecoding ,
72
74
keyHashAlgosForDraftEncofing : ( ) => keyHashAlgosForDraftEncofing ,
73
75
lcObjectGet : ( ) => lcObjectGet ,
@@ -262,6 +264,10 @@ function parsePublicKey(input) {
262
264
}
263
265
}
264
266
}
267
+ async function importPublicKey ( key , keyUsages , defaults ) {
268
+ const parsedPublicKey = parsePublicKey ( key ) ;
269
+ return await ( await getWebcrypto ( ) ) . subtle . importKey ( "spki" , parsedPublicKey . der , genSignInfo ( parsedPublicKey ) , false , keyUsages ) ;
270
+ }
265
271
266
272
// src/utils.ts
267
273
async function getWebcrypto ( ) {
@@ -386,6 +392,11 @@ function parsePkcs8(input) {
386
392
attributesRaw : attributes ? asn1ToArrayBuffer ( attributes ) : null
387
393
} ;
388
394
}
395
+ async function importPrivateKey ( key , keyUsages , defaults ) {
396
+ const parsedPrivateKey = parsePkcs8 ( key ) ;
397
+ const importParams = genSignInfo ( parsedPrivateKey , defaults ) ;
398
+ return await ( await getWebcrypto ( ) ) . subtle . importKey ( "pkcs8" , parsedPrivateKey . der , importParams , false , keyUsages ) ;
399
+ }
389
400
390
401
// src/draft/const.ts
391
402
var keyHashAlgosForDraftEncofing = {
@@ -405,29 +416,29 @@ var keyHashAlgosForDraftDecoding = {
405
416
} ;
406
417
407
418
// src/draft/sign.ts
408
- function getDraftAlgoString ( algorithm ) {
419
+ function getDraftAlgoString ( keyAlgorithm , hashAlgorithm ) {
409
420
const verifyHash = ( ) => {
410
- if ( ! algorithm . hash )
421
+ if ( ! hashAlgorithm )
411
422
throw new Error ( `hash is required` ) ;
412
- if ( ! ( algorithm . hash in keyHashAlgosForDraftEncofing ) )
413
- throw new Error ( `unsupported hash: ${ algorithm . hash } ` ) ;
423
+ if ( ! ( hashAlgorithm in keyHashAlgosForDraftEncofing ) )
424
+ throw new Error ( `unsupported hash: ${ hashAlgorithm } ` ) ;
414
425
} ;
415
- if ( algorithm . name === "RSASSA-PKCS1-v1_5" ) {
426
+ if ( keyAlgorithm === "RSASSA-PKCS1-v1_5" ) {
416
427
verifyHash ( ) ;
417
- return `rsa-${ keyHashAlgosForDraftEncofing [ algorithm . hash ] } ` ;
428
+ return `rsa-${ keyHashAlgosForDraftEncofing [ hashAlgorithm ] } ` ;
418
429
}
419
- if ( algorithm . name === "ECDSA" ) {
430
+ if ( keyAlgorithm === "ECDSA" ) {
420
431
verifyHash ( ) ;
421
- return `ecdsa-${ keyHashAlgosForDraftEncofing [ algorithm . hash ] } ` ;
432
+ return `ecdsa-${ keyHashAlgosForDraftEncofing [ hashAlgorithm ] } ` ;
422
433
}
423
- if ( algorithm . name === "ECDH" ) {
434
+ if ( keyAlgorithm === "ECDH" ) {
424
435
verifyHash ( ) ;
425
- return `ecdh-${ keyHashAlgosForDraftEncofing [ algorithm . hash ] } ` ;
436
+ return `ecdh-${ keyHashAlgosForDraftEncofing [ hashAlgorithm ] } ` ;
426
437
}
427
- if ( algorithm . name === "Ed25519" ) {
438
+ if ( keyAlgorithm === "Ed25519" ) {
428
439
return `ed25519-sha512` ;
429
440
}
430
- if ( algorithm . name === "Ed448" ) {
441
+ if ( keyAlgorithm === "Ed448" ) {
431
442
return `ed448` ;
432
443
}
433
444
throw new Error ( `unsupported keyAlgorithm` ) ;
@@ -467,10 +478,8 @@ function genDraftSignatureHeader(includeHeaders, keyId, signature, algorithm) {
467
478
}
468
479
async function signAsDraftToRequest ( request , key , includeHeaders , opts = { } ) {
469
480
const hash = opts ?. hashAlgorithm || "SHA-256" ;
470
- const parsedPrivateKey = parsePkcs8 ( key . privateKeyPem ) ;
471
- const importParams = genSignInfo ( parsedPrivateKey , { hash, ec : "DSA" } ) ;
472
- const privateKey = await ( await getWebcrypto ( ) ) . subtle . importKey ( "pkcs8" , parsedPrivateKey . der , importParams , false , [ "sign" ] ) ;
473
- const algoString = getDraftAlgoString ( importParams ) ;
481
+ const privateKey = "privateKey" in key ? key . privateKey : await importPrivateKey ( key . privateKeyPem , [ "sign" ] , { hash, ec : "DSA" } ) ;
482
+ const algoString = getDraftAlgoString ( privateKey . algorithm . name , hash ) ;
474
483
const signingString = genDraftSigningString ( request , includeHeaders , { keyId : key . keyId , algorithm : algoString } ) ;
475
484
const signature = await genDraftSignature ( privateKey , signingString ) ;
476
485
const signatureHeader = genDraftSignatureHeader ( includeHeaders , key . keyId , signature , algoString ) ;
@@ -958,10 +967,9 @@ function parseSignInfo(algorithm, parsed, errorLogger) {
958
967
959
968
// src/draft/verify.ts
960
969
var genSignInfoDraft = parseSignInfo ;
961
- async function verifyDraftSignature ( parsed , publicKeyPem , errorLogger ) {
970
+ async function verifyDraftSignature ( parsed , key , errorLogger ) {
962
971
try {
963
- const parsedSpki = parsePublicKey ( publicKeyPem ) ;
964
- const publicKey = await ( await getWebcrypto ( ) ) . subtle . importKey ( "spki" , parsedSpki . der , genSignInfo ( parsedSpki ) , false , [ "verify" ] ) ;
972
+ const publicKey = typeof key === "string" ? await importPublicKey ( key , [ "verify" ] ) : key ;
965
973
const verify = await ( await getWebcrypto ( ) ) . subtle . verify ( publicKey . algorithm , publicKey , decodeBase64ToUint8Array ( parsed . params . signature ) , new TextEncoder ( ) . encode ( parsed . signingString ) ) ;
966
974
return verify ;
967
975
} catch ( e ) {
@@ -1010,6 +1018,8 @@ async function verifyDraftSignature(parsed, publicKeyPem, errorLogger) {
1010
1018
getNistCurveFromOid,
1011
1019
getPublicKeyAlgorithmNameFromOid,
1012
1020
getWebcrypto,
1021
+ importPrivateKey,
1022
+ importPublicKey,
1013
1023
keyHashAlgosForDraftDecoding,
1014
1024
keyHashAlgosForDraftEncofing,
1015
1025
lcObjectGet,
0 commit comments