@@ -7,6 +7,28 @@ const assert = require('assert');
77const crypto = require ( 'crypto' ) ;
88const { hasOpenSSL } = require ( '../common/crypto' ) ;
99
10+ // Error code for a key-type mismatch during (EC)DH. The underlying OpenSSL
11+ // error code varies by version, and in OpenSSL 4.0 by platform: some builds
12+ // report a generic internal error instead of a typed key-type mismatch.
13+ // https://github.com/openssl/openssl/issues/30895
14+ // TODO(panva): Tighten this check once/if fixed.
15+ let keyTypeMismatchCode ;
16+ if ( hasOpenSSL ( 4 , 0 ) ) {
17+ keyTypeMismatchCode =
18+ / ^ E R R _ O S S L _ E V P _ ( O P E R A T I O N _ N O T _ S U P P O R T E D _ F O R _ T H I S _ K E Y T Y P E | I N T E R N A L _ E R R O R ) $ / ;
19+ } else if ( hasOpenSSL ( 3 ) ) {
20+ keyTypeMismatchCode = 'ERR_OSSL_EVP_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE' ;
21+ } else {
22+ keyTypeMismatchCode = 'ERR_OSSL_EVP_DIFFERENT_KEY_TYPES' ;
23+ }
24+
25+ function assertErrorCode ( actual , expected ) {
26+ if ( expected instanceof RegExp )
27+ assert . match ( actual , expected ) ;
28+ else
29+ assert . strictEqual ( actual , expected ) ;
30+ }
31+
1032assert . throws ( ( ) => crypto . diffieHellman ( crypto . generateKeyPairSync ( 'ec' , { namedCurve : 'P-256' } ) , null ) , {
1133 name : 'TypeError' ,
1234 code : 'ERR_INVALID_ARG_TYPE' ,
@@ -341,16 +363,16 @@ for (const { privateKey: alicePriv, publicKey: bobPub } of [
341363 privateKey : ec256 . privateKey . export ( { type : 'pkcs8' , format : 'pem' } ) ,
342364 publicKey : x25519 . publicKey . export ( { type : 'spki' , format : 'pem' } ) ,
343365 } , common . mustCall ( ( err ) => {
344- assert . strictEqual ( err . code ,
345- hasOpenSSL ( 3 ) ? 'ERR_OSSL_EVP_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE' :
346- 'ERR_OSSL_EVP_DIFFERENT_KEY_TYPES' ) ;
366+ assertErrorCode ( err . code , keyTypeMismatchCode ) ;
347367 } ) ) ;
348368
349369 // Unsupported key type (ed25519)
350370 crypto . diffieHellman ( {
351371 privateKey : ed25519 . privateKey . export ( { type : 'pkcs8' , format : 'pem' } ) ,
352372 publicKey : ed25519 . publicKey . export ( { type : 'spki' , format : 'pem' } ) ,
353373 } , common . mustCall ( ( err ) => {
354- assert . strictEqual ( err . code , 'ERR_OSSL_EVP_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE' ) ;
374+ assertErrorCode ( err . code , hasOpenSSL ( 4 , 0 ) ?
375+ / ^ E R R _ O S S L _ E V P _ ( O P E R A T I O N _ N O T _ S U P P O R T E D _ F O R _ T H I S _ K E Y T Y P E | I N T E R N A L _ E R R O R ) $ / :
376+ 'ERR_OSSL_EVP_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE' ) ;
355377 } ) ) ;
356378}
0 commit comments