@@ -927,6 +927,14 @@ async function wrapKey(format, key, wrappingKey, algorithm) {
927927 } catch {
928928 algorithm = normalizeAlgorithm ( algorithm , 'encrypt' ) ;
929929 }
930+
931+ if ( algorithm . name !== wrappingKey [ kAlgorithm ] . name )
932+ throw lazyDOMException ( 'Key algorithm mismatch' , 'InvalidAccessError' ) ;
933+
934+ if ( ! ArrayPrototypeIncludes ( wrappingKey [ kKeyUsages ] , 'wrapKey' ) )
935+ throw lazyDOMException (
936+ 'Unable to use this key to wrapKey' , 'InvalidAccessError' ) ;
937+
930938 let keyData = await FunctionPrototypeCall ( exportKey , this , format , key ) ;
931939
932940 if ( format === 'jwk' ) {
@@ -1005,6 +1013,13 @@ async function unwrapKey(
10051013
10061014 unwrappedKeyAlgo = normalizeAlgorithm ( unwrappedKeyAlgo , 'importKey' ) ;
10071015
1016+ if ( unwrapAlgo . name !== unwrappingKey [ kAlgorithm ] . name )
1017+ throw lazyDOMException ( 'Key algorithm mismatch' , 'InvalidAccessError' ) ;
1018+
1019+ if ( ! ArrayPrototypeIncludes ( unwrappingKey [ kKeyUsages ] , 'unwrapKey' ) )
1020+ throw lazyDOMException (
1021+ 'Unable to use this key to unwrapKey' , 'InvalidAccessError' ) ;
1022+
10081023 let keyData = await cipherOrWrap (
10091024 kWebCryptoCipherDecrypt ,
10101025 unwrapAlgo ,
@@ -1038,12 +1053,12 @@ async function signVerify(algorithm, key, data, signature) {
10381053 }
10391054 algorithm = normalizeAlgorithm ( algorithm , usage ) ;
10401055
1041- if ( ! ArrayPrototypeIncludes ( key [ kKeyUsages ] , usage ) ||
1042- algorithm . name !== key [ kAlgorithm ] . name ) {
1056+ if ( algorithm . name !== key [ kAlgorithm ] . name )
1057+ throw lazyDOMException ( 'Key algorithm mismatch' , 'InvalidAccessError' ) ;
1058+
1059+ if ( ! ArrayPrototypeIncludes ( key [ kKeyUsages ] , usage ) )
10431060 throw lazyDOMException (
1044- `Unable to use this key to ${ usage } ` ,
1045- 'InvalidAccessError' ) ;
1046- }
1061+ `Unable to use this key to ${ usage } ` , 'InvalidAccessError' ) ;
10471062
10481063 switch ( algorithm . name ) {
10491064 case 'RSA-PSS' :
@@ -1128,18 +1143,6 @@ async function verify(algorithm, key, signature, data) {
11281143}
11291144
11301145async function cipherOrWrap ( mode , algorithm , key , data , op ) {
1131- // We use a Node.js style error here instead of a DOMException because
1132- // the WebCrypto spec is not specific what kind of error is to be thrown
1133- // in this case. Both Firefox and Chrome throw simple TypeErrors here.
1134- // The key algorithm and cipher algorithm must match, and the
1135- // key must have the proper usage.
1136- if ( key [ kAlgorithm ] . name !== algorithm . name ||
1137- ! ArrayPrototypeIncludes ( key [ kKeyUsages ] , op ) ) {
1138- throw lazyDOMException (
1139- 'The requested operation is not valid for the provided key' ,
1140- 'InvalidAccessError' ) ;
1141- }
1142-
11431146 // While WebCrypto allows for larger input buffer sizes, we limit
11441147 // those to sizes that can fit within uint32_t because of limitations
11451148 // in the OpenSSL API.
@@ -1190,6 +1193,14 @@ async function encrypt(algorithm, key, data) {
11901193 } ) ;
11911194
11921195 algorithm = normalizeAlgorithm ( algorithm , 'encrypt' ) ;
1196+
1197+ if ( algorithm . name !== key [ kAlgorithm ] . name )
1198+ throw lazyDOMException ( 'Key algorithm mismatch' , 'InvalidAccessError' ) ;
1199+
1200+ if ( ! ArrayPrototypeIncludes ( key [ kKeyUsages ] , 'encrypt' ) )
1201+ throw lazyDOMException (
1202+ 'Unable to use this key to encrypt' , 'InvalidAccessError' ) ;
1203+
11931204 return await cipherOrWrap (
11941205 kWebCryptoCipherEncrypt ,
11951206 algorithm ,
@@ -1219,6 +1230,14 @@ async function decrypt(algorithm, key, data) {
12191230 } ) ;
12201231
12211232 algorithm = normalizeAlgorithm ( algorithm , 'decrypt' ) ;
1233+
1234+ if ( algorithm . name !== key [ kAlgorithm ] . name )
1235+ throw lazyDOMException ( 'Key algorithm mismatch' , 'InvalidAccessError' ) ;
1236+
1237+ if ( ! ArrayPrototypeIncludes ( key [ kKeyUsages ] , 'decrypt' ) )
1238+ throw lazyDOMException (
1239+ 'Unable to use this key to decrypt' , 'InvalidAccessError' ) ;
1240+
12221241 return await cipherOrWrap (
12231242 kWebCryptoCipherDecrypt ,
12241243 algorithm ,
0 commit comments