@@ -322,36 +322,25 @@ async function exportKeySpki(key) {
322
322
case 'RSA-PSS' :
323
323
// Fall through
324
324
case 'RSA-OAEP' :
325
- if ( key . type === 'public' ) {
326
- return require ( 'internal/crypto/rsa' )
327
- . rsaExportKey ( key , kWebCryptoKeyFormatSPKI ) ;
328
- }
329
- break ;
325
+ return require ( 'internal/crypto/rsa' )
326
+ . rsaExportKey ( key , kWebCryptoKeyFormatSPKI ) ;
330
327
case 'ECDSA' :
331
328
// Fall through
332
329
case 'ECDH' :
333
- if ( key . type === 'public' ) {
334
- return require ( 'internal/crypto/ec' )
335
- . ecExportKey ( key , kWebCryptoKeyFormatSPKI ) ;
336
- }
337
- break ;
330
+ return require ( 'internal/crypto/ec' )
331
+ . ecExportKey ( key , kWebCryptoKeyFormatSPKI ) ;
338
332
case 'Ed25519' :
339
333
// Fall through
340
334
case 'Ed448' :
341
335
// Fall through
342
336
case 'X25519' :
343
337
// Fall through
344
338
case 'X448' :
345
- if ( key . type === 'public' ) {
346
- return require ( 'internal/crypto/cfrg' )
347
- . cfrgExportKey ( key , kWebCryptoKeyFormatSPKI ) ;
348
- }
349
- break ;
339
+ return require ( 'internal/crypto/cfrg' )
340
+ . cfrgExportKey ( key , kWebCryptoKeyFormatSPKI ) ;
341
+ default :
342
+ return undefined ;
350
343
}
351
-
352
- throw lazyDOMException (
353
- `Unable to export a raw ${ key . algorithm . name } ${ key . type } key` ,
354
- 'InvalidAccessError' ) ;
355
344
}
356
345
357
346
async function exportKeyPkcs8 ( key ) {
@@ -361,60 +350,43 @@ async function exportKeyPkcs8(key) {
361
350
case 'RSA-PSS' :
362
351
// Fall through
363
352
case 'RSA-OAEP' :
364
- if ( key . type === 'private' ) {
365
- return require ( 'internal/crypto/rsa' )
366
- . rsaExportKey ( key , kWebCryptoKeyFormatPKCS8 ) ;
367
- }
368
- break ;
353
+ return require ( 'internal/crypto/rsa' )
354
+ . rsaExportKey ( key , kWebCryptoKeyFormatPKCS8 ) ;
369
355
case 'ECDSA' :
370
356
// Fall through
371
357
case 'ECDH' :
372
- if ( key . type === 'private' ) {
373
- return require ( 'internal/crypto/ec' )
374
- . ecExportKey ( key , kWebCryptoKeyFormatPKCS8 ) ;
375
- }
376
- break ;
358
+ return require ( 'internal/crypto/ec' )
359
+ . ecExportKey ( key , kWebCryptoKeyFormatPKCS8 ) ;
377
360
case 'Ed25519' :
378
361
// Fall through
379
362
case 'Ed448' :
380
363
// Fall through
381
364
case 'X25519' :
382
365
// Fall through
383
366
case 'X448' :
384
- if ( key . type === 'private' ) {
385
- return require ( 'internal/crypto/cfrg' )
386
- . cfrgExportKey ( key , kWebCryptoKeyFormatPKCS8 ) ;
387
- }
388
- break ;
367
+ return require ( 'internal/crypto/cfrg' )
368
+ . cfrgExportKey ( key , kWebCryptoKeyFormatPKCS8 ) ;
369
+ default :
370
+ return undefined ;
389
371
}
390
-
391
- throw lazyDOMException (
392
- `Unable to export a pkcs8 ${ key . algorithm . name } ${ key . type } key` ,
393
- 'InvalidAccessError' ) ;
394
372
}
395
373
396
374
async function exportKeyRaw ( key ) {
397
375
switch ( key . algorithm . name ) {
398
376
case 'ECDSA' :
399
377
// Fall through
400
378
case 'ECDH' :
401
- if ( key . type === 'public' ) {
402
- return require ( 'internal/crypto/ec' )
403
- . ecExportKey ( key , kWebCryptoKeyFormatRaw ) ;
404
- }
405
- break ;
379
+ return require ( 'internal/crypto/ec' )
380
+ . ecExportKey ( key , kWebCryptoKeyFormatRaw ) ;
406
381
case 'Ed25519' :
407
382
// Fall through
408
383
case 'Ed448' :
409
384
// Fall through
410
385
case 'X25519' :
411
386
// Fall through
412
387
case 'X448' :
413
- if ( key . type === 'public' ) {
414
- return require ( 'internal/crypto/cfrg' )
415
- . cfrgExportKey ( key , kWebCryptoKeyFormatRaw ) ;
416
- }
417
- break ;
388
+ return require ( 'internal/crypto/cfrg' )
389
+ . cfrgExportKey ( key , kWebCryptoKeyFormatRaw ) ;
418
390
case 'AES-CTR' :
419
391
// Fall through
420
392
case 'AES-CBC' :
@@ -425,70 +397,65 @@ async function exportKeyRaw(key) {
425
397
// Fall through
426
398
case 'HMAC' :
427
399
return key [ kKeyObject ] . export ( ) . buffer ;
400
+ default :
401
+ return undefined ;
428
402
}
429
-
430
- throw lazyDOMException (
431
- `Unable to export a raw ${ key . algorithm . name } ${ key . type } key` ,
432
- 'InvalidAccessError' ) ;
433
403
}
434
404
435
405
async function exportKeyJWK ( key ) {
436
- const jwk = key [ kKeyObject ] [ kHandle ] . exportJwk ( {
406
+ const parameters = {
437
407
key_ops : key . usages ,
438
408
ext : key . extractable ,
439
- } , true ) ;
409
+ } ;
440
410
switch ( key . algorithm . name ) {
441
411
case 'RSASSA-PKCS1-v1_5' :
442
- jwk . alg = normalizeHashName (
412
+ parameters . alg = normalizeHashName (
443
413
key . algorithm . hash . name ,
444
414
normalizeHashName . kContextJwkRsa ) ;
445
- return jwk ;
415
+ break ;
446
416
case 'RSA-PSS' :
447
- jwk . alg = normalizeHashName (
417
+ parameters . alg = normalizeHashName (
448
418
key . algorithm . hash . name ,
449
419
normalizeHashName . kContextJwkRsaPss ) ;
450
- return jwk ;
420
+ break ;
451
421
case 'RSA-OAEP' :
452
- jwk . alg = normalizeHashName (
422
+ parameters . alg = normalizeHashName (
453
423
key . algorithm . hash . name ,
454
424
normalizeHashName . kContextJwkRsaOaep ) ;
455
- return jwk ;
425
+ break ;
456
426
case 'ECDSA' :
457
427
// Fall through
458
428
case 'ECDH' :
459
- jwk . crv ||= key . algorithm . namedCurve ;
460
- return jwk ;
429
+ // Fall through
461
430
case 'X25519' :
462
431
// Fall through
463
432
case 'X448' :
464
- jwk . crv ||= key . algorithm . name ;
465
- return jwk ;
433
+ break ;
466
434
case 'Ed25519' :
467
435
// Fall through
468
436
case 'Ed448' :
469
- jwk . crv ||= key . algorithm . name ;
470
- jwk . alg = key . algorithm . name ;
471
- return jwk ;
437
+ parameters . alg = key . algorithm . name ;
438
+ break ;
472
439
case 'AES-CTR' :
473
440
// Fall through
474
441
case 'AES-CBC' :
475
442
// Fall through
476
443
case 'AES-GCM' :
477
444
// Fall through
478
445
case 'AES-KW' :
479
- jwk . alg = require ( 'internal/crypto/aes' )
446
+ parameters . alg = require ( 'internal/crypto/aes' )
480
447
. getAlgorithmName ( key . algorithm . name , key . algorithm . length ) ;
481
- return jwk ;
448
+ break ;
482
449
case 'HMAC' :
483
- jwk . alg = normalizeHashName (
450
+ parameters . alg = normalizeHashName (
484
451
key . algorithm . hash . name ,
485
452
normalizeHashName . kContextJwkHmac ) ;
486
- return jwk ;
453
+ break ;
487
454
default :
488
- // Fall through
455
+ return undefined ;
489
456
}
490
457
491
- throw lazyDOMException ( 'Not yet supported' , 'NotSupportedError' ) ;
458
+ return key [ kKeyObject ] [ kHandle ] . exportJwk ( parameters , true ) ;
492
459
}
493
460
494
461
async function exportKey ( format , key ) {
@@ -506,17 +473,49 @@ async function exportKey(format, key) {
506
473
context : '2nd argument' ,
507
474
} ) ;
508
475
476
+ try {
477
+ normalizeAlgorithm ( key . algorithm , 'exportKey' ) ;
478
+ } catch {
479
+ throw lazyDOMException (
480
+ `${ key . algorithm . name } key export is not supported` , 'NotSupportedError' ) ;
481
+ }
482
+
509
483
if ( ! key . extractable )
510
484
throw lazyDOMException ( 'key is not extractable' , 'InvalidAccessException' ) ;
511
485
486
+ let result ;
512
487
switch ( format ) {
513
- case 'spki' : return exportKeySpki ( key ) ;
514
- case 'pkcs8' : return exportKeyPkcs8 ( key ) ;
515
- case 'jwk' : return exportKeyJWK ( key ) ;
516
- case 'raw' : return exportKeyRaw ( key ) ;
488
+ case 'spki' : {
489
+ if ( key . type === 'public' ) {
490
+ result = await exportKeySpki ( key ) ;
491
+ }
492
+ break ;
493
+ }
494
+ case 'pkcs8' : {
495
+ if ( key . type === 'private' ) {
496
+ result = await exportKeyPkcs8 ( key ) ;
497
+ }
498
+ break ;
499
+ }
500
+ case 'jwk' : {
501
+ result = await exportKeyJWK ( key ) ;
502
+ break ;
503
+ }
504
+ case 'raw' : {
505
+ if ( key . type !== 'private' ) {
506
+ result = await exportKeyRaw ( key ) ;
507
+ }
508
+ break ;
509
+ }
510
+ }
511
+
512
+ if ( ! result ) {
513
+ throw lazyDOMException (
514
+ `Unable to export ${ key . algorithm . name } ${ key . type } key using ${ format } format` ,
515
+ 'NotSupportedError' ) ;
517
516
}
518
- throw lazyDOMException (
519
- 'Export format is unsupported' , 'NotSupportedError' ) ;
517
+
518
+ return result ;
520
519
}
521
520
522
521
async function importKey (
0 commit comments