@@ -74,6 +74,7 @@ const {
7474
7575const {
7676 customInspectSymbol : kInspect ,
77+ getDeprecationWarningEmitter,
7778 kEnumerableProperty,
7879 lazyDOMException,
7980} = require ( 'internal/util' ) ;
@@ -89,6 +90,18 @@ const kKeyUsages = Symbol('kKeyUsages');
8990const kCachedAlgorithm = Symbol ( 'kCachedAlgorithm' ) ;
9091const kCachedKeyUsages = Symbol ( 'kCachedKeyUsages' ) ;
9192
93+ const emitDEP0203 = getDeprecationWarningEmitter (
94+ 'DEP0203' ,
95+ 'Passing a CryptoKey to node:crypto functions is deprecated.' ,
96+ ) ;
97+
98+ const maybeEmitDEP0204 = getDeprecationWarningEmitter (
99+ 'DEP0204' ,
100+ 'Passing a non-extractable CryptoKey to KeyObject.from() is deprecated.' ,
101+ undefined ,
102+ false ,
103+ ( key ) => ! key [ kExtractable ] ,
104+ ) ;
92105
93106// Key input contexts.
94107const kConsumePublic = 0 ;
@@ -140,6 +153,7 @@ const {
140153 static from ( key ) {
141154 if ( ! isCryptoKey ( key ) )
142155 throw new ERR_INVALID_ARG_TYPE ( 'key' , 'CryptoKey' , key ) ;
156+ maybeEmitDEP0204 ( key ) ;
143157 return key [ kKeyObject ] ;
144158 }
145159
@@ -796,21 +810,28 @@ function prepareAsymmetricKey(key, ctx) {
796810 if ( isKeyObject ( key ) ) {
797811 // Best case: A key object, as simple as that.
798812 return { data : getKeyObjectHandle ( key , ctx ) } ;
799- } else if ( isCryptoKey ( key ) ) {
813+ }
814+ if ( isCryptoKey ( key ) ) {
815+ emitDEP0203 ( ) ;
800816 return { data : getKeyObjectHandle ( key [ kKeyObject ] , ctx ) } ;
801- } else if ( isStringOrBuffer ( key ) ) {
817+ }
818+ if ( isStringOrBuffer ( key ) ) {
802819 // Expect PEM by default, mostly for backward compatibility.
803820 return { format : kKeyFormatPEM , data : getArrayBufferOrView ( key , 'key' ) } ;
804- } else if ( typeof key === 'object' ) {
821+ }
822+ if ( typeof key === 'object' ) {
805823 const { key : data , encoding, format } = key ;
806824
807825 // The 'key' property can be a KeyObject as well to allow specifying
808826 // additional options such as padding along with the key.
809- if ( isKeyObject ( data ) )
827+ if ( isKeyObject ( data ) ) {
810828 return { data : getKeyObjectHandle ( data , ctx ) } ;
811- else if ( isCryptoKey ( data ) )
829+ }
830+ if ( isCryptoKey ( data ) ) {
831+ emitDEP0203 ( ) ;
812832 return { data : getKeyObjectHandle ( data [ kKeyObject ] , ctx ) } ;
813- else if ( format === 'jwk' ) {
833+ }
834+ if ( format === 'jwk' ) {
814835 validateObject ( data , 'key.key' ) ;
815836 return { data : getKeyObjectHandleFromJwk ( data , ctx ) , format : 'jwk' } ;
816837 } else if ( format === 'raw-public' || format === 'raw-private' ||
@@ -836,6 +857,7 @@ function prepareAsymmetricKey(key, ctx) {
836857 ...parseKeyEncoding ( key , undefined , isPublic ) ,
837858 } ;
838859 }
860+
839861 throw new ERR_INVALID_ARG_TYPE (
840862 'key' ,
841863 getKeyTypes ( ctx !== kCreatePrivate ) ,
@@ -856,7 +878,9 @@ function prepareSecretKey(key, encoding, bufferOnly = false) {
856878 if ( key . type !== 'secret' )
857879 throw new ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE ( key . type , 'secret' ) ;
858880 return key [ kHandle ] ;
859- } else if ( isCryptoKey ( key ) ) {
881+ }
882+ if ( isCryptoKey ( key ) ) {
883+ emitDEP0203 ( ) ;
860884 if ( key [ kKeyType ] !== 'secret' )
861885 throw new ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE ( key [ kKeyType ] , 'secret' ) ;
862886 return key [ kKeyObject ] [ kHandle ] ;
0 commit comments