GeezerVison is showing github.com — crypto: fix webcrypto JWK EC and OKP import crv check · nodejs/node@0a075cb
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: lib/internal/crypto/cfrg.js +2Lines changed: 2 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -242,6 +242,8 @@ async function cfrgImportKey( | 242 | 242 | throw lazyDOMException('Invalid JWK keyData', 'DataError'); | 243 | 243 | if (keyData.kty !== 'OKP') | 244 | 244 | throw lazyDOMException('Invalid key type', 'DataError'); | | 245 | + if (keyData.crv !== name) | | 246 | + throw lazyDOMException('Subtype mismatch', 'DataError'); | 245 | 247 | const isPublic = keyData.d === undefined; | 246 | 248 |
| 247 | 249 | if (usagesSet.size > 0 && keyData.use !== undefined) { | |
Collapse file Copy file name to clipboardExpand all lines: lib/internal/crypto/ec.js +7-5Lines changed: 7 additions & 5 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -195,11 +195,12 @@ async function ecImportKey( | 195 | 195 | break; | 196 | 196 | } | 197 | 197 | case 'jwk': { | 198 | | - let curve; | 199 | 198 | if (keyData == null || typeof keyData !== 'object') | 200 | 199 | throw lazyDOMException('Invalid JWK keyData', 'DataError'); | 201 | 200 | if (keyData.kty !== 'EC') | 202 | 201 | throw lazyDOMException('Invalid key type', 'DataError'); | | 202 | + if (keyData.crv !== namedCurve) | | 203 | + throw lazyDOMException('Named curve mismatch', 'DataError'); | 203 | 204 |
| 204 | 205 | if (keyData.d !== undefined) { | 205 | 206 | verifyAcceptableEcKeyUse(name, 'private', usagesSet); | @@ -225,12 +226,13 @@ async function ecImportKey( | 225 | 226 | if (algorithm.name === 'ECDSA' && keyData.alg !== undefined) { | 226 | 227 | if (typeof keyData.alg !== 'string') | 227 | 228 | throw lazyDOMException('Invalid alg', 'DataError'); | | 229 | + let algNamedCurve; | 228 | 230 | switch (keyData.alg) { | 229 | | - case 'ES256': curve = 'P-256'; break; | 230 | | - case 'ES384': curve = 'P-384'; break; | 231 | | - case 'ES512': curve = 'P-521'; break; | | 231 | + case 'ES256': algNamedCurve = 'P-256'; break; | | 232 | + case 'ES384': algNamedCurve = 'P-384'; break; | | 233 | + case 'ES512': algNamedCurve = 'P-521'; break; | 232 | 234 | } | 233 | | - if (curve !== namedCurve) | | 235 | + if (algNamedCurve !== namedCurve) | 234 | 236 | throw lazyDOMException('Named curve mismatch', 'DataError'); | 235 | 237 | } | 236 | 238 |
| |
Collapse file Copy file name to clipboardExpand all lines: test/parallel/test-webcrypto-export-import-cfrg.js +20Lines changed: 20 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -259,6 +259,26 @@ async function testImportJwk({ name, publicUsages, privateUsages }, extractable) | 259 | 259 | message: /key is not extractable/ | 260 | 260 | }); | 261 | 261 | } | | 262 | + | | 263 | + for (const crv of [undefined, name === 'Ed25519' ? 'Ed448' : 'Ed25519']) { | | 264 | + await assert.rejects( | | 265 | + subtle.importKey( | | 266 | + 'jwk', | | 267 | + { kty: jwk.kty, x: jwk.x, y: jwk.y, crv }, | | 268 | + { name }, | | 269 | + extractable, | | 270 | + publicUsages), | | 271 | + { message: /Subtype mismatch/ }); | | 272 | + | | 273 | + await assert.rejects( | | 274 | + subtle.importKey( | | 275 | + 'jwk', | | 276 | + { kty: jwk.kty, d: jwk.d, x: jwk.x, y: jwk.y, crv }, | | 277 | + { name }, | | 278 | + extractable, | | 279 | + publicUsages), | | 280 | + { message: /Subtype mismatch/ }); | | 281 | + } | 262 | 282 | } | 263 | 283 |
| 264 | 284 | (async function() { | |
Collapse file Copy file name to clipboardExpand all lines: test/parallel/test-webcrypto-export-import-ec.js +20Lines changed: 20 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -260,6 +260,26 @@ async function testImportJwk( | 260 | 260 | message: /key is not extractable/ | 261 | 261 | }); | 262 | 262 | } | | 263 | + | | 264 | + for (const crv of [undefined, namedCurve === 'P-256' ? 'P-384' : 'P-256']) { | | 265 | + await assert.rejects( | | 266 | + subtle.importKey( | | 267 | + 'jwk', | | 268 | + { kty: jwk.kty, x: jwk.x, y: jwk.y, crv }, | | 269 | + { name, namedCurve }, | | 270 | + extractable, | | 271 | + publicUsages), | | 272 | + { message: /Named curve mismatch/ }); | | 273 | + | | 274 | + await assert.rejects( | | 275 | + subtle.importKey( | | 276 | + 'jwk', | | 277 | + { kty: jwk.kty, d: jwk.d, x: jwk.x, y: jwk.y, crv }, | | 278 | + { name, namedCurve }, | | 279 | + extractable, | | 280 | + publicUsages), | | 281 | + { message: /Named curve mismatch/ }); | | 282 | + } | 263 | 283 | } | 264 | 284 |
| 265 | 285 | (async function() { | |
|