44} = require ( 'crypto' )
55const { promisify } = require ( 'util' )
66const pem2jwk = require ( 'pem-jwk' ) . pem2jwk
7+ const {
8+ emitter,
9+ GENERATE_KEY_START ,
10+ GENERATE_KEY ,
11+ GENERATE_KEY_ERROR
12+ } = require ( './events' )
713
814function toBase64Url ( base64 ) {
915 return base64 . replace ( / \+ / g, '-' ) . replace ( / \/ / g, '_' ) . replace ( / = / g, '' )
@@ -17,23 +23,31 @@ function thumbprint ({ e, kty, n }) {
1723}
1824
1925async function generateKey ( jwksURI , options = { } , modulusLength = 2048 ) {
20- if ( ! jwksURI && ! options . kid ) {
21- throw new Error ( 'jwksURI must be passed in' )
22- }
23- if ( ! options || ! options . use ) {
24- throw new Error ( '{ use } must be passed as an option' )
25- }
26- const { privateKey } = await promisify ( generateKeyPair ) ( 'rsa' , {
27- modulusLength,
28- publicKeyEncoding : { type : 'pkcs1' , format : 'pem' } ,
29- privateKeyEncoding : { type : 'pkcs1' , format : 'pem' }
30- } )
31- const key = pem2jwk ( privateKey , options )
32- if ( ! key . kid ) {
33- key . kid = `${ jwksURI } /${ await thumbprint ( key ) } `
34- }
26+ emitter . emit ( GENERATE_KEY_START , { modulusLength } )
3527
36- return key
28+ try {
29+ if ( ! jwksURI && ! options . kid ) {
30+ throw new Error ( 'jwksURI must be passed in' )
31+ }
32+ if ( ! options || ! options . use ) {
33+ throw new Error ( '{ use } must be passed as an option' )
34+ }
35+ const { privateKey } = await promisify ( generateKeyPair ) ( 'rsa' , {
36+ modulusLength,
37+ publicKeyEncoding : { type : 'pkcs1' , format : 'pem' } ,
38+ privateKeyEncoding : { type : 'pkcs1' , format : 'pem' }
39+ } )
40+ const key = pem2jwk ( privateKey , options )
41+ if ( ! key . kid ) {
42+ key . kid = `${ jwksURI } /${ await thumbprint ( key ) } `
43+ }
44+ emitter . emit ( GENERATE_KEY , { modulusLength : modulusLength } )
45+
46+ return key
47+ } catch ( error ) {
48+ emitter . emit ( GENERATE_KEY_ERROR , error )
49+ throw error
50+ }
3751}
3852
3953function toPublicKey ( { e, kid, kty, n, use } ) {
0 commit comments