Skip to content

Commit ad8ef3a

Browse files
panvaruyadorno
authored andcommitted
crypto: fix webcrypto operation errors to be OperationError
PR-URL: #44171 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Tobias Nießen <[email protected]>
1 parent f39a051 commit ad8ef3a

File tree

9 files changed

+185
-205
lines changed

9 files changed

+185
-205
lines changed

lib/internal/crypto/aes.js

+15-17
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

+58-58
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

+39-39
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

+15-15
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)