Skip to content

Commit c62ed73

Browse files
committed
crypto: use DataError for webcrypto keyData import failures
PR-URL: nodejs#45569 Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Tobias Nießen <[email protected]> Backport-PR-URL: nodejs#47336
1 parent a321238 commit c62ed73

File tree

3 files changed

+70
-38
lines changed

3 files changed

+70
-38
lines changed

lib/internal/crypto/cfrg.js

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -90,26 +90,26 @@ function createCFRGRawKey(name, keyData, isPublic) {
9090
case 'X25519':
9191
if (keyData.byteLength !== 32) {
9292
throw lazyDOMException(
93-
`${name} raw keys must be exactly 32-bytes`);
93+
`${name} raw keys must be exactly 32-bytes`, 'DataError');
9494
}
9595
break;
9696
case 'Ed448':
9797
if (keyData.byteLength !== 57) {
9898
throw lazyDOMException(
99-
`${name} raw keys must be exactly 57-bytes`);
99+
`${name} raw keys must be exactly 57-bytes`, 'DataError');
100100
}
101101
break;
102102
case 'X448':
103103
if (keyData.byteLength !== 56) {
104104
throw lazyDOMException(
105-
`${name} raw keys must be exactly 56-bytes`);
105+
`${name} raw keys must be exactly 56-bytes`, 'DataError');
106106
}
107107
break;
108108
}
109109

110110
const keyType = isPublic ? kKeyTypePublic : kKeyTypePrivate;
111111
if (!handle.initEDRaw(name, keyData, keyType)) {
112-
throw lazyDOMException('Failure to generate key object');
112+
throw lazyDOMException('Invalid keyData', 'DataError');
113113
}
114114

115115
return isPublic ? new PublicKeyObject(handle) : new PrivateKeyObject(handle);
@@ -221,20 +221,30 @@ async function cfrgImportKey(
221221
switch (format) {
222222
case 'spki': {
223223
verifyAcceptableCfrgKeyUse(name, 'public', usagesSet);
224-
keyObject = createPublicKey({
225-
key: keyData,
226-
format: 'der',
227-
type: 'spki'
228-
});
224+
try {
225+
keyObject = createPublicKey({
226+
key: keyData,
227+
format: 'der',
228+
type: 'spki'
229+
});
230+
} catch (err) {
231+
throw lazyDOMException(
232+
'Invalid keyData', 'DataError');
233+
}
229234
break;
230235
}
231236
case 'pkcs8': {
232237
verifyAcceptableCfrgKeyUse(name, 'private', usagesSet);
233-
keyObject = createPrivateKey({
234-
key: keyData,
235-
format: 'der',
236-
type: 'pkcs8'
237-
});
238+
try {
239+
keyObject = createPrivateKey({
240+
key: keyData,
241+
format: 'der',
242+
type: 'pkcs8'
243+
});
244+
} catch (err) {
245+
throw lazyDOMException(
246+
'Invalid keyData', 'DataError');
247+
}
238248
break;
239249
}
240250
case 'jwk': {

lib/internal/crypto/ec.js

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,12 @@ function verifyAcceptableEcKeyUse(name, type, usages) {
8080
function createECPublicKeyRaw(namedCurve, keyData) {
8181
const handle = new KeyObjectHandle();
8282
keyData = getArrayBufferOrView(keyData, 'keyData');
83-
if (handle.initECRaw(kNamedCurveAliases[namedCurve], keyData))
84-
return new PublicKeyObject(handle);
83+
84+
if (!handle.initECRaw(kNamedCurveAliases[namedCurve], keyData)) {
85+
throw lazyDOMException('Invalid keyData', 'DataError');
86+
}
87+
88+
return new PublicKeyObject(handle);
8589
}
8690

8791
async function ecGenerateKey(algorithm, extractable, keyUsages) {
@@ -177,20 +181,30 @@ async function ecImportKey(
177181
switch (format) {
178182
case 'spki': {
179183
verifyAcceptableEcKeyUse(name, 'public', usagesSet);
180-
keyObject = createPublicKey({
181-
key: keyData,
182-
format: 'der',
183-
type: 'spki'
184-
});
184+
try {
185+
keyObject = createPublicKey({
186+
key: keyData,
187+
format: 'der',
188+
type: 'spki'
189+
});
190+
} catch (err) {
191+
throw lazyDOMException(
192+
'Invalid keyData', 'DataError');
193+
}
185194
break;
186195
}
187196
case 'pkcs8': {
188197
verifyAcceptableEcKeyUse(name, 'private', usagesSet);
189-
keyObject = createPrivateKey({
190-
key: keyData,
191-
format: 'der',
192-
type: 'pkcs8'
193-
});
198+
try {
199+
keyObject = createPrivateKey({
200+
key: keyData,
201+
format: 'der',
202+
type: 'pkcs8'
203+
});
204+
} catch (err) {
205+
throw lazyDOMException(
206+
'Invalid keyData', 'DataError');
207+
}
194208
break;
195209
}
196210
case 'jwk': {
@@ -247,8 +261,6 @@ async function ecImportKey(
247261
case 'raw': {
248262
verifyAcceptableEcKeyUse(name, 'public', usagesSet);
249263
keyObject = createECPublicKeyRaw(namedCurve, keyData);
250-
if (keyObject === undefined)
251-
throw lazyDOMException('Unable to import EC key', 'OperationError');
252264
break;
253265
}
254266
}

lib/internal/crypto/rsa.js

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -246,20 +246,30 @@ async function rsaImportKey(
246246
switch (format) {
247247
case 'spki': {
248248
verifyAcceptableRsaKeyUse(algorithm.name, 'public', usagesSet);
249-
keyObject = createPublicKey({
250-
key: keyData,
251-
format: 'der',
252-
type: 'spki'
253-
});
249+
try {
250+
keyObject = createPublicKey({
251+
key: keyData,
252+
format: 'der',
253+
type: 'spki'
254+
});
255+
} catch (err) {
256+
throw lazyDOMException(
257+
'Invalid keyData', 'DataError');
258+
}
254259
break;
255260
}
256261
case 'pkcs8': {
257262
verifyAcceptableRsaKeyUse(algorithm.name, 'private', usagesSet);
258-
keyObject = createPrivateKey({
259-
key: keyData,
260-
format: 'der',
261-
type: 'pkcs8'
262-
});
263+
try {
264+
keyObject = createPrivateKey({
265+
key: keyData,
266+
format: 'der',
267+
type: 'pkcs8'
268+
});
269+
} catch (err) {
270+
throw lazyDOMException(
271+
'Invalid keyData', 'DataError');
272+
}
263273
break;
264274
}
265275
case 'jwk': {

0 commit comments

Comments
 (0)