@@ -67,6 +67,7 @@ __export(src_exports, {
67
67
getDraftAlgoString : ( ) => getDraftAlgoString ,
68
68
getNistCurveFromOid : ( ) => getNistCurveFromOid ,
69
69
getPublicKeyAlgorithmNameFromOid : ( ) => getPublicKeyAlgorithmNameFromOid ,
70
+ getWebcrypto : ( ) => getWebcrypto ,
70
71
keyHashAlgosForDraftDecoding : ( ) => keyHashAlgosForDraftDecoding ,
71
72
keyHashAlgosForDraftEncofing : ( ) => keyHashAlgosForDraftEncofing ,
72
73
lcObjectGet : ( ) => lcObjectGet ,
@@ -263,6 +264,9 @@ function parsePublicKey(input) {
263
264
}
264
265
265
266
// src/utils.ts
267
+ async function getWebcrypto ( ) {
268
+ return globalThis . crypto ?? ( await import ( "node:crypto" ) ) . webcrypto ;
269
+ }
266
270
function lcObjectKey ( src ) {
267
271
return Object . entries ( src ) . reduce ( ( dst , [ key , value ] ) => {
268
272
if ( key === "__proto__" )
@@ -455,7 +459,7 @@ function genDraftSigningString(request, includeHeaders, additional) {
455
459
return results . join ( "\n" ) ;
456
460
}
457
461
async function genDraftSignature ( privateKey , signingString ) {
458
- const signatureAB = await globalThis . crypto . subtle . sign ( privateKey . algorithm , privateKey , new TextEncoder ( ) . encode ( signingString ) ) ;
462
+ const signatureAB = await ( await getWebcrypto ( ) ) . subtle . sign ( privateKey . algorithm , privateKey , new TextEncoder ( ) . encode ( signingString ) ) ;
459
463
return encodeArrayBufferToBase64 ( signatureAB ) ;
460
464
}
461
465
function genDraftSignatureHeader ( includeHeaders , keyId , signature , algorithm ) {
@@ -465,7 +469,7 @@ async function signAsDraftToRequest(request, key, includeHeaders, opts = {}) {
465
469
const hash = opts ?. hashAlgorithm || "SHA-256" ;
466
470
const parsedPrivateKey = parsePkcs8 ( key . privateKeyPem ) ;
467
471
const importParams = genSignInfo ( parsedPrivateKey , { hash, ec : "DSA" } ) ;
468
- const privateKey = await globalThis . crypto . subtle . importKey ( "pkcs8" , parsedPrivateKey . der , importParams , false , [ "sign" ] ) ;
472
+ const privateKey = await ( await getWebcrypto ( ) ) . subtle . importKey ( "pkcs8" , parsedPrivateKey . der , importParams , false , [ "sign" ] ) ;
469
473
const algoString = getDraftAlgoString ( importParams ) ;
470
474
const signingString = genDraftSigningString ( request , includeHeaders , { keyId : key . keyId , algorithm : algoString } ) ;
471
475
const signature = await genDraftSignature ( privateKey , signingString ) ;
@@ -722,15 +726,15 @@ function parseRequestSignature(request, options) {
722
726
723
727
// src/keypair.ts
724
728
async function exportPublicKeyPem ( key ) {
725
- const ab = await globalThis . crypto . subtle . exportKey ( "spki" , key ) ;
729
+ const ab = await ( await getWebcrypto ( ) ) . subtle . exportKey ( "spki" , key ) ;
726
730
return "-----BEGIN PUBLIC KEY-----\n" + splitPer64Chars ( encodeArrayBufferToBase64 ( ab ) ) . join ( "\n" ) + "\n-----END PUBLIC KEY-----\n" ;
727
731
}
728
732
async function exportPrivateKeyPem ( key ) {
729
- const ab = await globalThis . crypto . subtle . exportKey ( "pkcs8" , key ) ;
733
+ const ab = await ( await getWebcrypto ( ) ) . subtle . exportKey ( "pkcs8" , key ) ;
730
734
return "-----BEGIN PRIVATE KEY-----\n" + splitPer64Chars ( encodeArrayBufferToBase64 ( ab ) ) . join ( "\n" ) + "\n-----END PRIVATE KEY-----\n" ;
731
735
}
732
736
async function genRsaKeyPair ( modulusLength = 4096 , keyUsage = [ "sign" , "verify" ] ) {
733
- const keyPair = await globalThis . crypto . subtle . generateKey (
737
+ const keyPair = await ( await getWebcrypto ( ) ) . subtle . generateKey (
734
738
{
735
739
name : "RSASSA-PKCS1-v1_5" ,
736
740
modulusLength,
@@ -746,7 +750,7 @@ async function genRsaKeyPair(modulusLength = 4096, keyUsage = ["sign", "verify"]
746
750
} ;
747
751
}
748
752
async function genEcKeyPair ( namedCurve = "P-256" , keyUsage = [ "sign" , "verify" ] ) {
749
- const keyPair = await globalThis . crypto . subtle . generateKey (
753
+ const keyPair = await ( await getWebcrypto ( ) ) . subtle . generateKey (
750
754
{
751
755
name : "ECDSA" ,
752
756
namedCurve
@@ -760,7 +764,7 @@ async function genEcKeyPair(namedCurve = "P-256", keyUsage = ["sign", "verify"])
760
764
} ;
761
765
}
762
766
async function genEd25519KeyPair ( keyUsage = [ "sign" , "verify" ] ) {
763
- const keyPair = await globalThis . crypto . subtle . generateKey (
767
+ const keyPair = await ( await getWebcrypto ( ) ) . subtle . generateKey (
764
768
{
765
769
name : "Ed25519"
766
770
} ,
@@ -773,7 +777,7 @@ async function genEd25519KeyPair(keyUsage = ["sign", "verify"]) {
773
777
} ;
774
778
}
775
779
async function genEd448KeyPair ( keyUsage ) {
776
- const keyPair = await globalThis . crypto . subtle . generateKey (
780
+ const keyPair = await ( await getWebcrypto ( ) ) . subtle . generateKey (
777
781
{
778
782
name : "Ed448"
779
783
} ,
@@ -787,7 +791,6 @@ async function genEd448KeyPair(keyUsage) {
787
791
}
788
792
789
793
// src/digest/utils.ts
790
- var import_node_crypto = require ( "node:crypto" ) ;
791
794
async function createBase64Digest ( body , hash = "SHA-256" ) {
792
795
if ( Array . isArray ( hash ) ) {
793
796
return new Map ( await Promise . all ( hash . map ( ( h ) => {
@@ -800,7 +803,7 @@ async function createBase64Digest(body, hash = "SHA-256") {
800
803
if ( typeof body === "string" ) {
801
804
body = new TextEncoder ( ) . encode ( body ) ;
802
805
}
803
- const hashAb = await import_node_crypto . webcrypto . subtle . digest ( hash , body ) ;
806
+ const hashAb = await ( await getWebcrypto ( ) ) . subtle . digest ( hash , body ) ;
804
807
return encodeArrayBufferToBase64 ( hashAb ) ;
805
808
}
806
809
@@ -851,7 +854,6 @@ async function verifyRFC3230DigestHeader(request, rawBody, failOnNoDigest = true
851
854
}
852
855
throw e ;
853
856
}
854
- ;
855
857
if ( hash !== value ) {
856
858
if ( errorLogger )
857
859
errorLogger ( `Digest header hash mismatch` ) ;
@@ -959,8 +961,8 @@ var genSignInfoDraft = parseSignInfo;
959
961
async function verifyDraftSignature ( parsed , publicKeyPem , errorLogger ) {
960
962
try {
961
963
const parsedSpki = parsePublicKey ( publicKeyPem ) ;
962
- const publicKey = await globalThis . crypto . subtle . importKey ( "spki" , parsedSpki . der , genSignInfo ( parsedSpki ) , false , [ "verify" ] ) ;
963
- const verify = await globalThis . crypto . subtle . verify ( publicKey . algorithm , publicKey , decodeBase64ToUint8Array ( parsed . params . signature ) , new TextEncoder ( ) . encode ( parsed . signingString ) ) ;
964
+ const publicKey = await ( await getWebcrypto ( ) ) . subtle . importKey ( "spki" , parsedSpki . der , genSignInfo ( parsedSpki ) , false , [ "verify" ] ) ;
965
+ const verify = await ( await getWebcrypto ( ) ) . subtle . verify ( publicKey . algorithm , publicKey , decodeBase64ToUint8Array ( parsed . params . signature ) , new TextEncoder ( ) . encode ( parsed . signingString ) ) ;
964
966
return verify ;
965
967
} catch ( e ) {
966
968
if ( errorLogger )
@@ -1007,6 +1009,7 @@ async function verifyDraftSignature(parsed, publicKeyPem, errorLogger) {
1007
1009
getDraftAlgoString,
1008
1010
getNistCurveFromOid,
1009
1011
getPublicKeyAlgorithmNameFromOid,
1012
+ getWebcrypto,
1010
1013
keyHashAlgosForDraftDecoding,
1011
1014
keyHashAlgosForDraftEncofing,
1012
1015
lcObjectGet,
0 commit comments