Skip to content

Commit 90f3c5e

Browse files
panvadanielleadams
authored andcommitted
crypto: fix webcrypto operation errors to be OperationError
PR-URL: #44171 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de>
1 parent 46c92c1 commit 90f3c5e

File tree

9 files changed

+185
-205
lines changed

9 files changed

+185
-205
lines changed

lib/internal/crypto/aes.js

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ const {
77
ArrayPrototypeIncludes,
88
ArrayPrototypePush,
99
MathFloor,
10-
Promise,
1110
SafeSet,
1211
TypedArrayPrototypeSlice,
1312
} = primordials;
@@ -46,6 +45,7 @@ const {
4645

4746
const {
4847
lazyDOMException,
48+
promisify,
4949
} = require('internal/util');
5050

5151
const { PromiseReject } = primordials;
@@ -57,7 +57,7 @@ const {
5757
} = require('internal/crypto/keys');
5858

5959
const {
60-
generateKey,
60+
generateKey: _generateKey,
6161
} = require('internal/crypto/keygen');
6262

6363
const {
@@ -67,6 +67,7 @@ const {
6767

6868
const kMaxCounterLength = 128;
6969
const kTagLengths = [32, 64, 96, 104, 112, 120, 128];
70+
const generateKey = promisify(_generateKey);
7071

7172
function getAlgorithmName(name, length) {
7273
switch (name) {
@@ -241,22 +242,19 @@ async function aesGenerateKey(algorithm, extractable, keyUsages) {
241242
'SyntaxError');
242243
}
243244

244-
return new Promise((resolve, reject) => {
245-
generateKey('aes', { length }, (err, key) => {
246-
if (err) {
247-
return reject(lazyDOMException(
248-
'The operation failed for an operation-specific reason ' +
249-
`[${err.message}]`,
250-
'OperationError'));
251-
}
252-
253-
resolve(new InternalCryptoKey(
254-
key,
255-
{ name, length },
256-
ArrayFrom(usagesSet),
257-
extractable));
258-
});
245+
const key = await generateKey('aes', { length }).catch((err) => {
246+
// TODO(@panva): add err as cause to DOMException
247+
throw lazyDOMException(
248+
'The operation failed for an operation-specific reason' +
249+
`[${err.message}]`,
250+
'OperationError');
259251
});
252+
253+
return new InternalCryptoKey(
254+
key,
255+
{ name, length },
256+
ArrayFrom(usagesSet),
257+
extractable);
260258
}
261259

262260
async function aesImportKey(

lib/internal/crypto/cfrg.js

Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
'use strict';
22

33
const {
4-
Promise,
54
SafeSet,
65
} = primordials;
76

@@ -31,10 +30,11 @@ const {
3130
const {
3231
emitExperimentalWarning,
3332
lazyDOMException,
33+
promisify,
3434
} = require('internal/util');
3535

3636
const {
37-
generateKeyPair,
37+
generateKeyPair: _generateKeyPair,
3838
} = require('internal/crypto/keygen');
3939

4040
const {
@@ -45,6 +45,8 @@ const {
4545
createPublicKey,
4646
} = require('internal/crypto/keys');
4747

48+
const generateKeyPair = promisify(_generateKeyPair);
49+
4850
function verifyAcceptableCfrgKeyUse(name, type, usages) {
4951
let checkSet;
5052
switch (name) {
@@ -131,65 +133,63 @@ async function cfrgGenerateKey(algorithm, extractable, keyUsages) {
131133
}
132134
break;
133135
}
134-
return new Promise((resolve, reject) => {
135-
let genKeyType;
136-
switch (name) {
137-
case 'Ed25519':
138-
genKeyType = 'ed25519';
139-
break;
140-
case 'Ed448':
141-
genKeyType = 'ed448';
142-
break;
143-
case 'X25519':
144-
genKeyType = 'x25519';
145-
break;
146-
case 'X448':
147-
genKeyType = 'x448';
148-
break;
149-
}
150-
generateKeyPair(genKeyType, undefined, (err, pubKey, privKey) => {
151-
if (err) {
152-
return reject(lazyDOMException(
153-
'The operation failed for an operation-specific reason',
154-
'OperationError'));
155-
}
136+
let genKeyType;
137+
switch (name) {
138+
case 'Ed25519':
139+
genKeyType = 'ed25519';
140+
break;
141+
case 'Ed448':
142+
genKeyType = 'ed448';
143+
break;
144+
case 'X25519':
145+
genKeyType = 'x25519';
146+
break;
147+
case 'X448':
148+
genKeyType = 'x448';
149+
break;
150+
}
156151

157-
const algorithm = { name };
152+
const keyPair = await generateKeyPair(genKeyType).catch((err) => {
153+
// TODO(@panva): add err as cause to DOMException
154+
throw lazyDOMException(
155+
'The operation failed for an operation-specific reason',
156+
'OperationError');
157+
});
158158

159-
let publicUsages;
160-
let privateUsages;
161-
switch (name) {
162-
case 'Ed25519':
163-
// Fall through
164-
case 'Ed448':
165-
publicUsages = getUsagesUnion(usageSet, 'verify');
166-
privateUsages = getUsagesUnion(usageSet, 'sign');
167-
break;
168-
case 'X25519':
169-
// Fall through
170-
case 'X448':
171-
publicUsages = [];
172-
privateUsages = getUsagesUnion(usageSet, 'deriveKey', 'deriveBits');
173-
break;
174-
}
159+
let publicUsages;
160+
let privateUsages;
161+
switch (name) {
162+
case 'Ed25519':
163+
// Fall through
164+
case 'Ed448':
165+
publicUsages = getUsagesUnion(usageSet, 'verify');
166+
privateUsages = getUsagesUnion(usageSet, 'sign');
167+
break;
168+
case 'X25519':
169+
// Fall through
170+
case 'X448':
171+
publicUsages = [];
172+
privateUsages = getUsagesUnion(usageSet, 'deriveKey', 'deriveBits');
173+
break;
174+
}
175175

176-
const publicKey =
177-
new InternalCryptoKey(
178-
pubKey,
179-
algorithm,
180-
publicUsages,
181-
true);
182-
183-
const privateKey =
184-
new InternalCryptoKey(
185-
privKey,
186-
algorithm,
187-
privateUsages,
188-
extractable);
189-
190-
resolve({ publicKey, privateKey });
191-
});
192-
});
176+
const keyAlgorithm = { name };
177+
178+
const publicKey =
179+
new InternalCryptoKey(
180+
keyPair.publicKey,
181+
keyAlgorithm,
182+
publicUsages,
183+
true);
184+
185+
const privateKey =
186+
new InternalCryptoKey(
187+
keyPair.privateKey,
188+
keyAlgorithm,
189+
privateUsages,
190+
extractable);
191+
192+
return { privateKey, publicKey };
193193
}
194194

195195
function cfrgExportKey(key, format) {

lib/internal/crypto/ec.js

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
const {
44
ObjectKeys,
5-
Promise,
65
SafeSet,
76
} = primordials;
87

@@ -42,10 +41,11 @@ const {
4241

4342
const {
4443
lazyDOMException,
44+
promisify,
4545
} = require('internal/util');
4646

4747
const {
48-
generateKeyPair,
48+
generateKeyPair: _generateKeyPair,
4949
} = require('internal/crypto/keygen');
5050

5151
const {
@@ -56,6 +56,8 @@ const {
5656
createPublicKey,
5757
} = require('internal/crypto/keys');
5858

59+
const generateKeyPair = promisify(_generateKeyPair);
60+
5961
function verifyAcceptableEcKeyUse(name, type, usages) {
6062
let checkSet;
6163
switch (name) {
@@ -111,46 +113,44 @@ async function ecGenerateKey(algorithm, extractable, keyUsages) {
111113
}
112114
// Fall through
113115
}
114-
return new Promise((resolve, reject) => {
115-
generateKeyPair('ec', { namedCurve }, (err, pubKey, privKey) => {
116-
if (err) {
117-
return reject(lazyDOMException(
118-
'The operation failed for an operation-specific reason',
119-
'OperationError'));
120-
}
121116

122-
const algorithm = { name, namedCurve };
117+
const keypair = await generateKeyPair('ec', { namedCurve }).catch((err) => {
118+
// TODO(@panva): add err as cause to DOMException
119+
throw lazyDOMException(
120+
'The operation failed for an operation-specific reason',
121+
'OperationError');
122+
});
123123

124-
let publicUsages;
125-
let privateUsages;
126-
switch (name) {
127-
case 'ECDSA':
128-
publicUsages = getUsagesUnion(usageSet, 'verify');
129-
privateUsages = getUsagesUnion(usageSet, 'sign');
130-
break;
131-
case 'ECDH':
132-
publicUsages = [];
133-
privateUsages = getUsagesUnion(usageSet, 'deriveKey', 'deriveBits');
134-
break;
135-
}
124+
let publicUsages;
125+
let privateUsages;
126+
switch (name) {
127+
case 'ECDSA':
128+
publicUsages = getUsagesUnion(usageSet, 'verify');
129+
privateUsages = getUsagesUnion(usageSet, 'sign');
130+
break;
131+
case 'ECDH':
132+
publicUsages = [];
133+
privateUsages = getUsagesUnion(usageSet, 'deriveKey', 'deriveBits');
134+
break;
135+
}
136136

137-
const publicKey =
138-
new InternalCryptoKey(
139-
pubKey,
140-
algorithm,
141-
publicUsages,
142-
true);
143-
144-
const privateKey =
145-
new InternalCryptoKey(
146-
privKey,
147-
algorithm,
148-
privateUsages,
149-
extractable);
150-
151-
resolve({ publicKey, privateKey });
152-
});
153-
});
137+
const keyAlgorithm = { name, namedCurve };
138+
139+
const publicKey =
140+
new InternalCryptoKey(
141+
keypair.publicKey,
142+
keyAlgorithm,
143+
publicUsages,
144+
true);
145+
146+
const privateKey =
147+
new InternalCryptoKey(
148+
keypair.privateKey,
149+
keyAlgorithm,
150+
privateUsages,
151+
extractable);
152+
153+
return { publicKey, privateKey };
154154
}
155155

156156
function ecExportKey(key, format) {

lib/internal/crypto/mac.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
const {
44
ArrayFrom,
5-
Promise,
65
SafeSet,
76
} = primordials;
87

@@ -27,6 +26,7 @@ const {
2726

2827
const {
2928
lazyDOMException,
29+
promisify,
3030
} = require('internal/util');
3131

3232
const {
@@ -36,7 +36,7 @@ const {
3636
} = require('internal/errors');
3737

3838
const {
39-
generateKey,
39+
generateKey: _generateKey,
4040
} = require('internal/crypto/keygen');
4141

4242
const {
@@ -45,6 +45,8 @@ const {
4545
createSecretKey,
4646
} = require('internal/crypto/keys');
4747

48+
const generateKey = promisify(_generateKey);
49+
4850
async function hmacGenerateKey(algorithm, extractable, keyUsages) {
4951
const { hash, name } = algorithm;
5052
let { length } = algorithm;
@@ -62,21 +64,19 @@ async function hmacGenerateKey(algorithm, extractable, keyUsages) {
6264
'Unsupported key usage for an HMAC key',
6365
'SyntaxError');
6466
}
65-
return new Promise((resolve, reject) => {
66-
generateKey('hmac', { length }, (err, key) => {
67-
if (err) {
68-
return reject(lazyDOMException(
69-
'The operation failed for an operation-specific reason',
70-
'OperationError'));
71-
}
7267

73-
resolve(new InternalCryptoKey(
74-
key,
75-
{ name, length, hash: { name: hash.name } },
76-
ArrayFrom(usageSet),
77-
extractable));
78-
});
68+
const key = await generateKey('hmac', { length }).catch((err) => {
69+
// TODO(@panva): add err as cause to DOMException
70+
throw lazyDOMException(
71+
'The operation failed for an operation-specific reason',
72+
'OperationError');
7973
});
74+
75+
return new InternalCryptoKey(
76+
key,
77+
{ name, length, hash: { name: hash.name } },
78+
ArrayFrom(usageSet),
79+
extractable);
8080
}
8181

8282
async function hmacImportKey(

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy