@@ -327,36 +327,25 @@ async function exportKeySpki(key) {
327327    case  'RSA-PSS' :
328328      // Fall through 
329329    case  'RSA-OAEP' :
330-       if  ( key . type  ===  'public' )  { 
331-         return  require ( 'internal/crypto/rsa' ) 
332-           . rsaExportKey ( key ,  kWebCryptoKeyFormatSPKI ) ; 
333-       } 
334-       break ; 
330+       return  require ( 'internal/crypto/rsa' ) 
331+         . rsaExportKey ( key ,  kWebCryptoKeyFormatSPKI ) ; 
335332    case  'ECDSA' :
336333      // Fall through 
337334    case  'ECDH' :
338-       if  ( key . type  ===  'public' )  { 
339-         return  require ( 'internal/crypto/ec' ) 
340-           . ecExportKey ( key ,  kWebCryptoKeyFormatSPKI ) ; 
341-       } 
342-       break ; 
335+       return  require ( 'internal/crypto/ec' ) 
336+         . ecExportKey ( key ,  kWebCryptoKeyFormatSPKI ) ; 
343337    case  'Ed25519' :
344338      // Fall through 
345339    case  'Ed448' :
346340      // Fall through 
347341    case  'X25519' :
348342      // Fall through 
349343    case  'X448' :
350-       if  ( key . type  ===  'public' )  { 
351-         return  require ( 'internal/crypto/cfrg' ) 
352-           . cfrgExportKey ( key ,  kWebCryptoKeyFormatSPKI ) ; 
353-       } 
354-       break ; 
344+       return  require ( 'internal/crypto/cfrg' ) 
345+         . cfrgExportKey ( key ,  kWebCryptoKeyFormatSPKI ) ; 
346+     default :
347+       return  undefined ; 
355348  } 
356- 
357-   throw  lazyDOMException ( 
358-     `Unable to export a raw ${ key . algorithm . name } ${ key . type }  , 
359-     'InvalidAccessError' ) ; 
360349} 
361350
362351async  function  exportKeyPkcs8 ( key )  { 
@@ -366,60 +355,50 @@ async function exportKeyPkcs8(key) {
366355    case  'RSA-PSS' :
367356      // Fall through 
368357    case  'RSA-OAEP' :
369-       if  ( key . type  ===  'private' )  { 
370-         return  require ( 'internal/crypto/rsa' ) 
371-           . rsaExportKey ( key ,  kWebCryptoKeyFormatPKCS8 ) ; 
372-       } 
373-       break ; 
358+       return  require ( 'internal/crypto/rsa' ) 
359+         . rsaExportKey ( key ,  kWebCryptoKeyFormatPKCS8 ) ; 
374360    case  'ECDSA' :
375361      // Fall through 
376362    case  'ECDH' :
377-       if  ( key . type  ===  'private' )  { 
378-         return  require ( 'internal/crypto/ec' ) 
379-           . ecExportKey ( key ,  kWebCryptoKeyFormatPKCS8 ) ; 
380-       } 
381-       break ; 
363+       return  require ( 'internal/crypto/ec' ) 
364+         . ecExportKey ( key ,  kWebCryptoKeyFormatPKCS8 ) ; 
382365    case  'Ed25519' :
383366      // Fall through 
384367    case  'Ed448' :
385368      // Fall through 
386369    case  'X25519' :
387370      // Fall through 
388371    case  'X448' :
389-       if  ( key . type  ===  'private' )  { 
390-         return  require ( 'internal/crypto/cfrg' ) 
391-           . cfrgExportKey ( key ,  kWebCryptoKeyFormatPKCS8 ) ; 
392-       } 
393-       break ; 
372+       return  require ( 'internal/crypto/cfrg' ) 
373+         . cfrgExportKey ( key ,  kWebCryptoKeyFormatPKCS8 ) ; 
374+     default :
375+       return  undefined ; 
394376  } 
395- 
396-   throw  lazyDOMException ( 
397-     `Unable to export a pkcs8 ${ key . algorithm . name } ${ key . type }  , 
398-     'InvalidAccessError' ) ; 
399377} 
400378
401- async  function  exportKeyRaw ( key )  { 
379+ async  function  exportKeyRawPublic ( key )  { 
402380  switch  ( key . algorithm . name )  { 
403381    case  'ECDSA' :
404382      // Fall through 
405383    case  'ECDH' :
406-       if  ( key . type  ===  'public' )  { 
407-         return  require ( 'internal/crypto/ec' ) 
408-           . ecExportKey ( key ,  kWebCryptoKeyFormatRaw ) ; 
409-       } 
410-       break ; 
384+       return  require ( 'internal/crypto/ec' ) 
385+         . ecExportKey ( key ,  kWebCryptoKeyFormatRaw ) ; 
411386    case  'Ed25519' :
412387      // Fall through 
413388    case  'Ed448' :
414389      // Fall through 
415390    case  'X25519' :
416391      // Fall through 
417392    case  'X448' :
418-       if  ( key . type  ===  'public' )  { 
419-         return  require ( 'internal/crypto/cfrg' ) 
420-           . cfrgExportKey ( key ,  kWebCryptoKeyFormatRaw ) ; 
421-       } 
422-       break ; 
393+       return  require ( 'internal/crypto/cfrg' ) 
394+         . cfrgExportKey ( key ,  kWebCryptoKeyFormatRaw ) ; 
395+     default :
396+       return  undefined ; 
397+   } 
398+ } 
399+ 
400+ async  function  exportKeyRawSecret ( key )  { 
401+   switch  ( key . algorithm . name )  { 
423402    case  'AES-CTR' :
424403      // Fall through 
425404    case  'AES-CBC' :
@@ -429,71 +408,66 @@ async function exportKeyRaw(key) {
429408    case  'AES-KW' :
430409      // Fall through 
431410    case  'HMAC' :
432-       return  key [ kKeyObject ] . export ( ) . buffer ; 
411+       return  key [ kKeyObject ] [ kHandle ] . export ( ) . buffer ; 
412+     default :
413+       return  undefined ; 
433414  } 
434- 
435-   throw  lazyDOMException ( 
436-     `Unable to export a raw ${ key . algorithm . name } ${ key . type }  , 
437-     'InvalidAccessError' ) ; 
438415} 
439416
440417async  function  exportKeyJWK ( key )  { 
441-   const  jwk  =  key [ kKeyObject ] [ kHandle ] . exportJwk ( { 
418+   const  parameters  =  { 
442419    key_ops : key . usages , 
443420    ext : key . extractable , 
444-   } ,   true ) ; 
421+   } ; 
445422  switch  ( key . algorithm . name )  { 
446423    case  'RSASSA-PKCS1-v1_5' :
447-       jwk . alg  =  normalizeHashName ( 
424+       parameters . alg  =  normalizeHashName ( 
448425        key . algorithm . hash . name , 
449426        normalizeHashName . kContextJwkRsa ) ; 
450-       return   jwk ; 
427+       break ; 
451428    case  'RSA-PSS' :
452-       jwk . alg  =  normalizeHashName ( 
429+       parameters . alg  =  normalizeHashName ( 
453430        key . algorithm . hash . name , 
454431        normalizeHashName . kContextJwkRsaPss ) ; 
455-       return   jwk ; 
432+       break ; 
456433    case  'RSA-OAEP' :
457-       jwk . alg  =  normalizeHashName ( 
434+       parameters . alg  =  normalizeHashName ( 
458435        key . algorithm . hash . name , 
459436        normalizeHashName . kContextJwkRsaOaep ) ; 
460-       return   jwk ; 
437+       break ; 
461438    case  'ECDSA' :
462439      // Fall through 
463440    case  'ECDH' :
464-       jwk . crv  ||=  key . algorithm . namedCurve ; 
465-       return  jwk ; 
441+       // Fall through 
466442    case  'X25519' :
467443      // Fall through 
468444    case  'X448' :
469-       jwk . crv  ||=  key . algorithm . name ; 
470-       return  jwk ; 
445+       break ; 
471446    case  'Ed25519' :
472447      // Fall through 
473448    case  'Ed448' :
474-       jwk . crv  ||=  key . algorithm . name ; 
475-       jwk . alg  =  key . algorithm . name ; 
476-       return  jwk ; 
449+       parameters . alg  =  key . algorithm . name ; 
450+       break ; 
477451    case  'AES-CTR' :
478452      // Fall through 
479453    case  'AES-CBC' :
480454      // Fall through 
481455    case  'AES-GCM' :
482456      // Fall through 
483457    case  'AES-KW' :
484-       jwk . alg  =  require ( 'internal/crypto/aes' ) 
458+       parameters . alg  =  require ( 'internal/crypto/aes' ) 
485459        . getAlgorithmName ( key . algorithm . name ,  key . algorithm . length ) ; 
486-       return   jwk ; 
460+       break ; 
487461    case  'HMAC' :
488-       jwk . alg  =  normalizeHashName ( 
462+       parameters . alg  =  normalizeHashName ( 
489463        key . algorithm . hash . name , 
490464        normalizeHashName . kContextJwkHmac ) ; 
491-       return   jwk ; 
465+       break ; 
492466    default :
493-       // Fall through 
467+       return   undefined ; 
494468  } 
495469
496-   throw   lazyDOMException ( 'Not yet supported' ,   'NotSupportedError' ) ; 
470+   return   key [ kKeyObject ] [ kHandle ] . exportJwk ( parameters ,   true ) ; 
497471} 
498472
499473async  function  exportKey ( format ,  key )  { 
@@ -511,17 +485,55 @@ async function exportKey(format, key) {
511485    context : '2nd argument' , 
512486  } ) ; 
513487
488+   try  { 
489+     normalizeAlgorithm ( key . algorithm ,  'exportKey' ) ; 
490+   }  catch  { 
491+     throw  lazyDOMException ( 
492+       `${ key . algorithm . name }  ,  'NotSupportedError' ) ; 
493+   } 
494+ 
514495  if  ( ! key . extractable ) 
515496    throw  lazyDOMException ( 'key is not extractable' ,  'InvalidAccessException' ) ; 
516497
498+   let  result ; 
517499  switch  ( format )  { 
518-     case  'spki' : return  exportKeySpki ( key ) ; 
519-     case  'pkcs8' : return  exportKeyPkcs8 ( key ) ; 
520-     case  'jwk' : return  exportKeyJWK ( key ) ; 
521-     case  'raw' : return  exportKeyRaw ( key ) ; 
500+     case  'spki' : { 
501+       if  ( key . type  ===  'public' )  { 
502+         result  =  await  exportKeySpki ( key ) ; 
503+       } 
504+       break ; 
505+     } 
506+     case  'pkcs8' : { 
507+       if  ( key . type  ===  'private' )  { 
508+         result  =  await  exportKeyPkcs8 ( key ) ; 
509+       } 
510+       break ; 
511+     } 
512+     case  'jwk' : { 
513+       result  =  await  exportKeyJWK ( key ) ; 
514+       break ; 
515+     } 
516+     case  'raw' : { 
517+       if  ( key . type  ===  'secret' )  { 
518+         result  =  await  exportKeyRawSecret ( key ) ; 
519+         break ; 
520+       } 
521+ 
522+       if  ( key . type  ===  'public' )  { 
523+         result  =  await  exportKeyRawPublic ( key ) ; 
524+         break ; 
525+       } 
526+       break ; 
527+     } 
522528  } 
523-   throw  lazyDOMException ( 
524-     'Export format is unsupported' ,  'NotSupportedError' ) ; 
529+ 
530+   if  ( ! result )  { 
531+     throw  lazyDOMException ( 
532+       `Unable to export ${ key . algorithm . name } ${ key . type } ${ format }  , 
533+       'NotSupportedError' ) ; 
534+   } 
535+ 
536+   return  result ; 
525537} 
526538
527539async  function  importKey ( 
@@ -608,8 +620,12 @@ async function importKey(
608620        extractable , 
609621        keyUsages ) ; 
610622      break ; 
611-     default :
612-       throw  lazyDOMException ( 'Unrecognized algorithm name' ,  'NotSupportedError' ) ; 
623+   } 
624+ 
625+   if  ( ! result )  { 
626+     throw  lazyDOMException ( 
627+       `Unable to import ${ algorithm . name } ${ format }  , 
628+       'NotSupportedError' ) ; 
613629  } 
614630
615631  if  ( ( result . type  ===  'secret'  ||  result . type  ===  'private' )  &&  result . usages . length  ===  0 )  { 
0 commit comments