88 Uint8Array,
99} = primordials ;
1010
11+ const { Buffer } = require ( 'buffer' ) ;
12+
1113const {
1214 kCryptoJobAsync,
1315 KEMDecapsulateJob,
@@ -21,9 +23,16 @@ const {
2123 kWebCryptoKeyFormatSPKI,
2224} = internalBinding ( 'crypto' ) ;
2325
26+ const {
27+ codes : {
28+ ERR_CRYPTO_INVALID_JWK ,
29+ } ,
30+ } = require ( 'internal/errors' ) ;
31+
2432const {
2533 getUsagesUnion,
2634 hasAnyNotIn,
35+ validateKeyOps,
2736 kHandle,
2837 kKeyObject,
2938} = require ( 'internal/crypto/util' ) ;
@@ -193,6 +202,63 @@ function mlKemImportKey(
193202 }
194203 break ;
195204 }
205+ case 'jwk' : {
206+ if ( ! keyData . kty )
207+ throw lazyDOMException ( 'Invalid keyData' , 'DataError' ) ;
208+ if ( keyData . kty !== 'AKP' )
209+ throw lazyDOMException ( 'Invalid JWK "kty" Parameter' , 'DataError' ) ;
210+ if ( keyData . alg !== name )
211+ throw lazyDOMException (
212+ 'JWK "alg" Parameter and algorithm name mismatch' , 'DataError' ) ;
213+ const isPublic = keyData . priv === undefined ;
214+
215+ if ( usagesSet . size > 0 && keyData . use !== undefined ) {
216+ if ( keyData . use !== 'enc' )
217+ throw lazyDOMException ( 'Invalid JWK "use" Parameter' , 'DataError' ) ;
218+ }
219+
220+ validateKeyOps ( keyData . key_ops , usagesSet ) ;
221+
222+ if ( keyData . ext !== undefined &&
223+ keyData . ext === false &&
224+ extractable === true ) {
225+ throw lazyDOMException (
226+ 'JWK "ext" Parameter and extractable mismatch' ,
227+ 'DataError' ) ;
228+ }
229+
230+ if ( ! isPublic && typeof keyData . pub !== 'string' ) {
231+ throw lazyDOMException ( 'Invalid JWK' , 'DataError' ) ;
232+ }
233+
234+ verifyAcceptableMlKemKeyUse (
235+ name ,
236+ isPublic ,
237+ usagesSet ) ;
238+
239+ try {
240+ const publicKeyObject = createMlKemRawKey (
241+ name ,
242+ Buffer . from ( keyData . pub , 'base64url' ) ,
243+ true ) ;
244+
245+ if ( isPublic ) {
246+ keyObject = publicKeyObject ;
247+ } else {
248+ keyObject = createMlKemRawKey (
249+ name ,
250+ Buffer . from ( keyData . priv , 'base64url' ) ,
251+ false ) ;
252+
253+ if ( ! createPublicKey ( keyObject ) . equals ( publicKeyObject ) ) {
254+ throw new ERR_CRYPTO_INVALID_JWK ( ) ;
255+ }
256+ }
257+ } catch ( err ) {
258+ throw lazyDOMException ( 'Invalid keyData' , { name : 'DataError' , cause : err } ) ;
259+ }
260+ break ;
261+ }
196262 case 'raw-public' :
197263 case 'raw-seed' : {
198264 const isPublic = format === 'raw-public' ;
0 commit comments