GeezerVison is showing github.com — crypto: refactor verify acceptable key usage functions · nodejs/node@fa0a2d8
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 +11-21Lines changed: 11 additions & 21 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -47,32 +47,22 @@ const { | 47 | 47 |
| 48 | 48 | const generateKeyPair = promisify(_generateKeyPair); | 49 | 49 |
| 50 | | -function verifyAcceptableCfrgKeyUse(name, type, usages) { | | 50 | +function verifyAcceptableCfrgKeyUse(name, isPublic, usages) { | 51 | 51 | let checkSet; | 52 | 52 | switch (name) { | 53 | 53 | case 'X25519': | 54 | 54 | // Fall through | 55 | 55 | case 'X448': | 56 | | - switch (type) { | 57 | | - case 'private': | 58 | | - checkSet = ['deriveKey', 'deriveBits']; | 59 | | - break; | 60 | | - case 'public': | 61 | | - checkSet = []; | 62 | | - break; | 63 | | - } | | 56 | + checkSet = isPublic ? [] : ['deriveKey', 'deriveBits']; | 64 | 57 | break; | 65 | 58 | case 'Ed25519': | 66 | 59 | // Fall through | 67 | 60 | case 'Ed448': | 68 | | - switch (type) { | 69 | | - case 'private': | 70 | | - checkSet = ['sign']; | 71 | | - break; | 72 | | - case 'public': | 73 | | - checkSet = ['verify']; | 74 | | - break; | 75 | | - } | | 61 | + checkSet = isPublic ? ['verify'] : ['sign']; | | 62 | + break; | | 63 | + default: | | 64 | + throw lazyDOMException( | | 65 | + 'The algorithm is not supported', 'NotSupportedError'); | 76 | 66 | } | 77 | 67 | if (hasAnyNotIn(usages, checkSet)) { | 78 | 68 | throw lazyDOMException( | @@ -219,7 +209,7 @@ async function cfrgImportKey( | 219 | 209 | const usagesSet = new SafeSet(keyUsages); | 220 | 210 | switch (format) { | 221 | 211 | case 'spki': { | 222 | | - verifyAcceptableCfrgKeyUse(name, 'public', usagesSet); | | 212 | + verifyAcceptableCfrgKeyUse(name, true, usagesSet); | 223 | 213 | try { | 224 | 214 | keyObject = createPublicKey({ | 225 | 215 | key: keyData, | @@ -233,7 +223,7 @@ async function cfrgImportKey( | 233 | 223 | break; | 234 | 224 | } | 235 | 225 | case 'pkcs8': { | 236 | | - verifyAcceptableCfrgKeyUse(name, 'private', usagesSet); | | 226 | + verifyAcceptableCfrgKeyUse(name, false, usagesSet); | 237 | 227 | try { | 238 | 228 | keyObject = createPrivateKey({ | 239 | 229 | key: keyData, | @@ -298,7 +288,7 @@ async function cfrgImportKey( | 298 | 288 |
| 299 | 289 | verifyAcceptableCfrgKeyUse( | 300 | 290 | name, | 301 | | - isPublic ? 'public' : 'private', | | 291 | + isPublic, | 302 | 292 | usagesSet); | 303 | 293 |
| 304 | 294 | const publicKeyObject = createCFRGRawKey( | @@ -321,7 +311,7 @@ async function cfrgImportKey( | 321 | 311 | break; | 322 | 312 | } | 323 | 313 | case 'raw': { | 324 | | - verifyAcceptableCfrgKeyUse(name, 'public', usagesSet); | | 314 | + verifyAcceptableCfrgKeyUse(name, true, usagesSet); | 325 | 315 | keyObject = createCFRGRawKey(name, keyData, true); | 326 | 316 | break; | 327 | 317 | } | |
Collapse file Copy file name to clipboardExpand all lines: lib/internal/crypto/ec.js +14-25Lines changed: 14 additions & 25 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -54,28 +54,18 @@ const { | 54 | 54 |
| 55 | 55 | const generateKeyPair = promisify(_generateKeyPair); | 56 | 56 |
| 57 | | -function verifyAcceptableEcKeyUse(name, type, usages) { | | 57 | +function verifyAcceptableEcKeyUse(name, isPublic, usages) { | 58 | 58 | let checkSet; | 59 | 59 | switch (name) { | 60 | 60 | case 'ECDH': | 61 | | - switch (type) { | 62 | | - case 'private': | 63 | | - checkSet = ['deriveKey', 'deriveBits']; | 64 | | - break; | 65 | | - case 'public': | 66 | | - checkSet = []; | 67 | | - break; | 68 | | - } | | 61 | + checkSet = isPublic ? [] : ['deriveKey', 'deriveBits']; | 69 | 62 | break; | 70 | 63 | case 'ECDSA': | 71 | | - switch (type) { | 72 | | - case 'private': | 73 | | - checkSet = ['sign']; | 74 | | - break; | 75 | | - case 'public': | 76 | | - checkSet = ['verify']; | 77 | | - break; | 78 | | - } | | 64 | + checkSet = isPublic ? ['verify'] : ['sign']; | | 65 | + break; | | 66 | + default: | | 67 | + throw lazyDOMException( | | 68 | + 'The algorithm is not supported', 'NotSupportedError'); | 79 | 69 | } | 80 | 70 | if (hasAnyNotIn(usages, checkSet)) { | 81 | 71 | throw lazyDOMException( | @@ -186,7 +176,7 @@ async function ecImportKey( | 186 | 176 | const usagesSet = new SafeSet(keyUsages); | 187 | 177 | switch (format) { | 188 | 178 | case 'spki': { | 189 | | - verifyAcceptableEcKeyUse(name, 'public', usagesSet); | | 179 | + verifyAcceptableEcKeyUse(name, true, usagesSet); | 190 | 180 | try { | 191 | 181 | keyObject = createPublicKey({ | 192 | 182 | key: keyData, | @@ -200,7 +190,7 @@ async function ecImportKey( | 200 | 190 | break; | 201 | 191 | } | 202 | 192 | case 'pkcs8': { | 203 | | - verifyAcceptableEcKeyUse(name, 'private', usagesSet); | | 193 | + verifyAcceptableEcKeyUse(name, false, usagesSet); | 204 | 194 | try { | 205 | 195 | keyObject = createPrivateKey({ | 206 | 196 | key: keyData, | @@ -221,11 +211,10 @@ async function ecImportKey( | 221 | 211 | if (keyData.crv !== namedCurve) | 222 | 212 | throw lazyDOMException('Named curve mismatch', 'DataError'); | 223 | 213 |
| 224 | | - if (keyData.d !== undefined) { | 225 | | - verifyAcceptableEcKeyUse(name, 'private', usagesSet); | 226 | | - } else { | 227 | | - verifyAcceptableEcKeyUse(name, 'public', usagesSet); | 228 | | - } | | 214 | + verifyAcceptableEcKeyUse( | | 215 | + name, | | 216 | + keyData.d === undefined, | | 217 | + usagesSet); | 229 | 218 |
| 230 | 219 | if (usagesSet.size > 0 && keyData.use !== undefined) { | 231 | 220 | if (algorithm.name === 'ECDSA' && keyData.use !== 'sig') | @@ -265,7 +254,7 @@ async function ecImportKey( | 265 | 254 | break; | 266 | 255 | } | 267 | 256 | case 'raw': { | 268 | | - verifyAcceptableEcKeyUse(name, 'public', usagesSet); | | 257 | + verifyAcceptableEcKeyUse(name, true, usagesSet); | 269 | 258 | keyObject = createECPublicKeyRaw(namedCurve, keyData); | 270 | 259 | break; | 271 | 260 | } | |
Collapse file Copy file name to clipboardExpand all lines: lib/internal/crypto/rsa.js +12-20Lines changed: 12 additions & 20 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -74,28 +74,20 @@ const kRsaVariants = { | 74 | 74 | }; | 75 | 75 | const generateKeyPair = promisify(_generateKeyPair); | 76 | 76 |
| 77 | | -function verifyAcceptableRsaKeyUse(name, type, usages) { | | 77 | +function verifyAcceptableRsaKeyUse(name, isPublic, usages) { | 78 | 78 | let checkSet; | 79 | 79 | switch (name) { | 80 | 80 | case 'RSA-OAEP': | 81 | | - switch (type) { | 82 | | - case 'private': | 83 | | - checkSet = ['decrypt', 'unwrapKey']; | 84 | | - break; | 85 | | - case 'public': | 86 | | - checkSet = ['encrypt', 'wrapKey']; | 87 | | - break; | 88 | | - } | | 81 | + checkSet = isPublic ? ['encrypt', 'wrapKey'] : ['decrypt', 'unwrapKey']; | | 82 | + break; | | 83 | + case 'RSA-PSS': | | 84 | + // Fall through | | 85 | + case 'RSASSA-PKCS1-v1_5': | | 86 | + checkSet = isPublic ? ['verify'] : ['sign']; | 89 | 87 | break; | 90 | 88 | default: | 91 | | - switch (type) { | 92 | | - case 'private': | 93 | | - checkSet = ['sign']; | 94 | | - break; | 95 | | - case 'public': | 96 | | - checkSet = ['verify']; | 97 | | - break; | 98 | | - } | | 89 | + throw lazyDOMException( | | 90 | + 'The algorithm is not supported', 'NotSupportedError'); | 99 | 91 | } | 100 | 92 | if (hasAnyNotIn(usages, checkSet)) { | 101 | 93 | throw lazyDOMException( | @@ -244,7 +236,7 @@ async function rsaImportKey( | 244 | 236 | let keyObject; | 245 | 237 | switch (format) { | 246 | 238 | case 'spki': { | 247 | | - verifyAcceptableRsaKeyUse(algorithm.name, 'public', usagesSet); | | 239 | + verifyAcceptableRsaKeyUse(algorithm.name, true, usagesSet); | 248 | 240 | try { | 249 | 241 | keyObject = createPublicKey({ | 250 | 242 | key: keyData, | @@ -258,7 +250,7 @@ async function rsaImportKey( | 258 | 250 | break; | 259 | 251 | } | 260 | 252 | case 'pkcs8': { | 261 | | - verifyAcceptableRsaKeyUse(algorithm.name, 'private', usagesSet); | | 253 | + verifyAcceptableRsaKeyUse(algorithm.name, false, usagesSet); | 262 | 254 | try { | 263 | 255 | keyObject = createPrivateKey({ | 264 | 256 | key: keyData, | @@ -277,7 +269,7 @@ async function rsaImportKey( | 277 | 269 |
| 278 | 270 | verifyAcceptableRsaKeyUse( | 279 | 271 | algorithm.name, | 280 | | - keyData.d !== undefined ? 'private' : 'public', | | 272 | + keyData.d === undefined, | 281 | 273 | usagesSet); | 282 | 274 |
| 283 | 275 | if (keyData.kty !== 'RSA') | |
|