Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit af8d092

Browse filesBrowse files
panvaaduh95
authored andcommitted
test: add WebCrypto Promise.prototype.then pollution regression tests
PR-URL: #62226 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Jordan Harband <ljharb@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Zeyu "Alex" Yang <himself65@outlook.com>
1 parent 9dc102b commit af8d092
Copy full SHA for af8d092

1 file changed

+95Lines changed: 95 additions & 0 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file
+95Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import * as common from '../common/index.mjs';
2+
3+
if (!common.hasCrypto) common.skip('missing crypto');
4+
5+
// WebCrypto subtle methods must not leak intermediate values
6+
// through Promise.prototype.then pollution.
7+
// Regression test for https://github.com/nodejs/node/pull/61492
8+
// and https://github.com/nodejs/node/issues/59699.
9+
10+
import { hasOpenSSL } from '../common/crypto.js';
11+
12+
const { subtle } = globalThis.crypto;
13+
14+
Promise.prototype.then = common.mustNotCall('Promise.prototype.then');
15+
16+
await subtle.digest('SHA-256', new Uint8Array([1, 2, 3]));
17+
18+
await subtle.generateKey({ name: 'AES-CBC', length: 256 }, true, ['encrypt', 'decrypt']);
19+
20+
await subtle.generateKey({ name: 'ECDSA', namedCurve: 'P-256' }, true, ['sign', 'verify']);
21+
22+
const rawKey = globalThis.crypto.getRandomValues(new Uint8Array(32));
23+
24+
const importedKey = await subtle.importKey(
25+
'raw', rawKey, { name: 'AES-CBC', length: 256 }, false, ['encrypt', 'decrypt']);
26+
27+
const exportableKey = await subtle.importKey(
28+
'raw', rawKey, { name: 'AES-CBC', length: 256 }, true, ['encrypt', 'decrypt']);
29+
30+
await subtle.exportKey('raw', exportableKey);
31+
32+
const iv = globalThis.crypto.getRandomValues(new Uint8Array(16));
33+
const plaintext = new TextEncoder().encode('Hello, world!');
34+
35+
const ciphertext = await subtle.encrypt({ name: 'AES-CBC', iv }, importedKey, plaintext);
36+
37+
await subtle.decrypt({ name: 'AES-CBC', iv }, importedKey, ciphertext);
38+
39+
const signingKey = await subtle.generateKey(
40+
{ name: 'HMAC', hash: 'SHA-256' }, false, ['sign', 'verify']);
41+
42+
const data = new TextEncoder().encode('test data');
43+
44+
const signature = await subtle.sign('HMAC', signingKey, data);
45+
46+
await subtle.verify('HMAC', signingKey, signature, data);
47+
48+
const pbkdf2Key = await subtle.importKey(
49+
'raw', rawKey, 'PBKDF2', false, ['deriveBits', 'deriveKey']);
50+
51+
await subtle.deriveBits(
52+
{ name: 'PBKDF2', salt: rawKey, iterations: 1000, hash: 'SHA-256' },
53+
pbkdf2Key, 256);
54+
55+
await subtle.deriveKey(
56+
{ name: 'PBKDF2', salt: rawKey, iterations: 1000, hash: 'SHA-256' },
57+
pbkdf2Key,
58+
{ name: 'AES-CBC', length: 256 },
59+
true,
60+
['encrypt', 'decrypt']);
61+
62+
const wrappingKey = await subtle.generateKey(
63+
{ name: 'AES-KW', length: 256 }, true, ['wrapKey', 'unwrapKey']);
64+
65+
const keyToWrap = await subtle.generateKey(
66+
{ name: 'AES-CBC', length: 256 }, true, ['encrypt', 'decrypt']);
67+
68+
const wrapped = await subtle.wrapKey('raw', keyToWrap, wrappingKey, 'AES-KW');
69+
70+
await subtle.unwrapKey(
71+
'raw', wrapped, wrappingKey, 'AES-KW',
72+
{ name: 'AES-CBC', length: 256 }, true, ['encrypt', 'decrypt']);
73+
74+
const { privateKey } = await subtle.generateKey(
75+
{ name: 'ECDSA', namedCurve: 'P-256' }, true, ['sign', 'verify']);
76+
77+
await subtle.getPublicKey(privateKey, ['verify']);
78+
79+
if (hasOpenSSL(3, 5)) {
80+
const kemPair = await subtle.generateKey(
81+
{ name: 'ML-KEM-768' }, false,
82+
['encapsulateKey', 'encapsulateBits', 'decapsulateKey', 'decapsulateBits']);
83+
84+
const { ciphertext: ct1 } = await subtle.encapsulateKey(
85+
{ name: 'ML-KEM-768' }, kemPair.publicKey, 'HKDF', false, ['deriveBits']);
86+
87+
await subtle.decapsulateKey(
88+
{ name: 'ML-KEM-768' }, kemPair.privateKey, ct1, 'HKDF', false, ['deriveBits']);
89+
90+
const { ciphertext: ct2 } = await subtle.encapsulateBits(
91+
{ name: 'ML-KEM-768' }, kemPair.publicKey);
92+
93+
await subtle.decapsulateBits(
94+
{ name: 'ML-KEM-768' }, kemPair.privateKey, ct2);
95+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.