@@ -591,87 +591,100 @@ function exportKeyPkcs8(key) {
591591}
592592
593593function exportKeyRawPublic ( key , format ) {
594+ let exporter ;
595+ let exportFormat = kWebCryptoKeyFormatRaw ;
594596 switch ( getCryptoKeyAlgorithm ( key ) . name ) {
595597 case 'ECDSA' :
596598 // Fall through
597599 case 'ECDH' :
598- return require ( 'internal/crypto/ec' )
599- . ecExportKey ( key , kWebCryptoKeyFormatRaw ) ;
600+ exporter = require ( 'internal/crypto/ec' ) . ecExportKey ;
601+ break ;
600602 case 'Ed25519' :
601603 // Fall through
602604 case 'Ed448' :
603605 // Fall through
604606 case 'X25519' :
605607 // Fall through
606608 case 'X448' :
607- return require ( 'internal/crypto/cfrg' )
608- . cfrgExportKey ( key , kWebCryptoKeyFormatRaw ) ;
609+ exporter = require ( 'internal/crypto/cfrg' ) . cfrgExportKey ;
610+ break ;
609611 case 'ML-DSA-44' :
610612 // Fall through
611613 case 'ML-DSA-65' :
612614 // Fall through
613- case 'ML-DSA-87' : {
615+ case 'ML-DSA-87' :
614616 // ML-DSA keys don't recognize "raw"
615617 if ( format !== 'raw-public' ) {
616618 return undefined ;
617619 }
618- return require ( 'internal/crypto/ml_dsa' )
619- . mlDsaExportKey ( key , kWebCryptoKeyFormatRaw ) ;
620- }
620+ exporter = require ( 'internal/crypto/ml_dsa' ) . mlDsaExportKey ;
621+ break ;
621622 case 'ML-KEM-512' :
622623 // Fall through
623624 case 'ML-KEM-768' :
624625 // Fall through
625- case 'ML-KEM-1024' : {
626+ case 'ML-KEM-1024' :
626627 // ML-KEM keys don't recognize "raw"
627628 if ( format !== 'raw-public' ) {
628629 return undefined ;
629630 }
630- return require ( 'internal/crypto/ml_kem' )
631- . mlKemExportKey ( key , kWebCryptoKeyFormatRaw ) ;
632- }
631+ exporter = require ( 'internal/crypto/ml_kem' ) . mlKemExportKey ;
632+ break ;
633633 case 'MLKEM768-P256' :
634634 // Fall through
635635 case 'MLKEM768-X25519' :
636636 // Fall through
637- case 'MLKEM1024-P384' : {
637+ case 'MLKEM1024-P384' :
638638 if ( format !== 'raw-public' ) {
639639 return undefined ;
640640 }
641- return require ( 'internal/crypto/kem_hybrids' )
642- . kemHybridExportKey ( key , format ) ;
643- }
641+ exporter = require ( 'internal/crypto/kem_hybrids' ) . kemHybridExportKey ;
642+ exportFormat = format ;
643+ break ;
644644 default :
645645 return undefined ;
646646 }
647+
648+ if ( getCryptoKeyType ( key ) !== 'public' )
649+ throw lazyDOMException ( 'Key must be a public key' , 'InvalidAccessError' ) ;
650+
651+ return exporter ( key , exportFormat ) ;
647652}
648653
649654function exportKeyRawSeed ( key ) {
655+ let exporter ;
656+ let exportFormat = kWebCryptoKeyFormatRaw ;
650657 switch ( getCryptoKeyAlgorithm ( key ) . name ) {
651658 case 'ML-DSA-44' :
652659 // Fall through
653660 case 'ML-DSA-65' :
654661 // Fall through
655662 case 'ML-DSA-87' :
656- return require ( 'internal/crypto/ml_dsa' )
657- . mlDsaExportKey ( key , kWebCryptoKeyFormatRaw ) ;
663+ exporter = require ( 'internal/crypto/ml_dsa' ) . mlDsaExportKey ;
664+ break ;
658665 case 'ML-KEM-512' :
659666 // Fall through
660667 case 'ML-KEM-768' :
661668 // Fall through
662669 case 'ML-KEM-1024' :
663- return require ( 'internal/crypto/ml_kem' )
664- . mlKemExportKey ( key , kWebCryptoKeyFormatRaw ) ;
670+ exporter = require ( 'internal/crypto/ml_kem' ) . mlKemExportKey ;
671+ break ;
665672 case 'MLKEM768-P256' :
666673 // Fall through
667674 case 'MLKEM768-X25519' :
668675 // Fall through
669676 case 'MLKEM1024-P384' :
670- return require ( 'internal/crypto/kem_hybrids' )
671- . kemHybridExportKey ( key , 'raw-seed' ) ;
677+ exporter = require ( 'internal/crypto/kem_hybrids' ) . kemHybridExportKey ;
678+ exportFormat = 'raw-seed' ;
679+ break ;
672680 default :
673681 return undefined ;
674682 }
683+
684+ if ( getCryptoKeyType ( key ) !== 'private' )
685+ throw lazyDOMException ( 'Key must be a private key' , 'InvalidAccessError' ) ;
686+
687+ return exporter ( key , exportFormat ) ;
675688}
676689
677690function exportKeyRawSecret ( key , format ) {
@@ -835,21 +848,17 @@ function exportKeySync(format, key) {
835848 break ;
836849 }
837850 case 'raw-public' : {
838- if ( type === 'public' ) {
839- result = exportKeyRawPublic ( key , format ) ;
840- }
851+ result = exportKeyRawPublic ( key , format ) ;
841852 break ;
842853 }
843854 case 'raw-seed' : {
844- if ( type === 'private' ) {
845- result = exportKeyRawSeed ( key ) ;
846- }
855+ result = exportKeyRawSeed ( key ) ;
847856 break ;
848857 }
849858 case 'raw' : {
850859 if ( type === 'secret' ) {
851860 result = exportKeyRawSecret ( key , format ) ;
852- } else if ( type === 'public' ) {
861+ } else {
853862 result = exportKeyRawPublic ( key , format ) ;
854863 }
855864 break ;
0 commit comments