@@ -12,6 +12,7 @@ if (!hasOpenSSL(3, 5))
1212
1313const assert = require ( 'assert' ) ;
1414const { subtle } = globalThis . crypto ;
15+ const { createPrivateKey } = require ( 'crypto' ) ;
1516
1617const fixtures = require ( '../common/fixtures' ) ;
1718
@@ -199,42 +200,32 @@ async function testImportPkcs8SeedOnly({ name, privateUsages }, extractable) {
199200}
200201
201202async function testImportPkcs8PrivOnly ( { name, privateUsages } , extractable ) {
202- const key = await subtle . importKey (
203- 'pkcs8' ,
204- keyData [ name ] . pkcs8_priv_only ,
205- { name } ,
206- extractable ,
207- privateUsages ) ;
208- assert . strictEqual ( key . type , 'private' ) ;
209- assert . strictEqual ( key . extractable , extractable ) ;
210- assert . deepStrictEqual ( key . usages , privateUsages ) ;
211- assert . deepStrictEqual ( key . algorithm . name , name ) ;
212- assert . strictEqual ( key . algorithm , key . algorithm ) ;
213- assert . strictEqual ( key . usages , key . usages ) ;
214-
215- if ( extractable ) {
216- await assert . rejects ( subtle . exportKey ( 'pkcs8' , key ) , ( err ) => {
217- assert . strictEqual ( err . name , 'OperationError' ) ;
218- assert . strictEqual ( err . cause . code , 'ERR_CRYPTO_OPERATION_FAILED' ) ;
219- assert . strictEqual ( err . cause . message , 'Failed to get raw seed' ) ;
220- return true ;
203+ await assert . rejects (
204+ subtle . importKey (
205+ 'pkcs8' ,
206+ keyData [ name ] . pkcs8_priv_only ,
207+ { name } ,
208+ extractable ,
209+ privateUsages ) ,
210+ {
211+ name : 'NotSupportedError' ,
212+ message : 'Importing an ML-DSA PKCS#8 key without a seed is not supported' ,
221213 } ) ;
222- } else {
223- await assert . rejects (
224- subtle . exportKey ( 'pkcs8' , key ) , {
225- message : / k e y i s n o t e x t r a c t a b l e / ,
226- name : 'InvalidAccessError' ,
227- } ) ;
228- }
214+ }
229215
216+ async function testImportPkcs8MismatchedSeed ( { name, privateUsages } , extractable ) {
217+ const modified = Buffer . from ( keyData [ name ] . pkcs8 ) ;
218+ modified [ 30 ] ^= 0xff ;
230219 await assert . rejects (
231220 subtle . importKey (
232221 'pkcs8' ,
233- keyData [ name ] . pkcs8_seed_only ,
222+ modified ,
234223 { name } ,
235224 extractable ,
236- [ /* empty usages */ ] ) ,
237- { name : 'SyntaxError' , message : 'Usages cannot be empty when importing a private key.' } ) ;
225+ privateUsages ) ,
226+ {
227+ name : 'DataError' ,
228+ } ) ;
238229}
239230
240231async function testImportJwk ( { name, publicUsages, privateUsages } , extractable ) {
@@ -499,6 +490,7 @@ async function testImportRawSeed({ name, privateUsages }, extractable) {
499490 tests . push ( testImportPkcs8 ( vector , extractable ) ) ;
500491 tests . push ( testImportPkcs8SeedOnly ( vector , extractable ) ) ;
501492 tests . push ( testImportPkcs8PrivOnly ( vector , extractable ) ) ;
493+ tests . push ( testImportPkcs8MismatchedSeed ( vector , extractable ) ) ;
502494 tests . push ( testImportJwk ( vector , extractable ) ) ;
503495 tests . push ( testImportRawSeed ( vector , extractable ) ) ;
504496 tests . push ( testImportRawPublic ( vector , extractable ) ) ;
@@ -515,3 +507,17 @@ async function testImportRawSeed({ name, privateUsages }, extractable) {
515507 message : 'Unable to import ML-DSA-44 using raw format' ,
516508 } ) ;
517509} ) ( ) . then ( common . mustCall ( ) ) ;
510+
511+ ( async function ( ) {
512+ for ( const { name, privateUsages } of testVectors ) {
513+ const pem = fixtures . readKey ( getKeyFileName ( name . toLowerCase ( ) , 'private_priv_only' ) , 'ascii' ) ;
514+ const keyObject = createPrivateKey ( pem ) ;
515+ const key = keyObject . toCryptoKey ( { name } , true , privateUsages ) ;
516+ await assert . rejects ( subtle . exportKey ( 'pkcs8' , key ) , ( err ) => {
517+ assert . strictEqual ( err . name , 'OperationError' ) ;
518+ assert . strictEqual ( err . cause . code , 'ERR_CRYPTO_OPERATION_FAILED' ) ;
519+ assert . strictEqual ( err . cause . message , 'Failed to get raw seed' ) ;
520+ return true ;
521+ } ) ;
522+ }
523+ } ) ( ) . then ( common . mustCall ( ) ) ;
0 commit comments