test: add session reuse host verification regressions · nodejs/node@e3723ff · GitHub
Skip to content

Commit e3723ff

Browse files
mcollinaaduh95
authored andcommitted
test: add session reuse host verification regressions
Backport-PR-URL: nodejs-private/node-private#895 PR-URL: nodejs-private/node-private#854 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Refs: https://hackerone.com/reports/3649802
1 parent a77af48 commit e3723ff

3 files changed

Lines changed: 394 additions & 0 deletions
Lines changed: 146 additions & 0 deletions
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
'use strict';
2+
const common = require('../common');
3+
if (!common.hasCrypto)
4+
common.skip('missing crypto');
5+
6+
const assert = require('assert');
7+
const fixtures = require('../common/fixtures');
8+
const https = require('https');
9+
const tls = require('tls');
10+
const { once } = require('events');
11+
12+
function load(name) {
13+
return fixtures.readKey(name);
14+
}
15+
16+
const contexts = {
17+
agent1: tls.createSecureContext({
18+
key: load('agent1-key.pem'),
19+
cert: load('agent1-cert.pem'),
20+
}),
21+
agent3: tls.createSecureContext({
22+
key: load('agent3-key.pem'),
23+
cert: load('agent3-cert.pem'),
24+
}),
25+
};
26+
27+
function request(options) {
28+
return new Promise((resolve, reject) => {
29+
const req = https.get({
30+
...options,
31+
host: '127.0.0.1',
32+
agent: false,
33+
}, (res) => {
34+
res.resume();
35+
res.once('end', () => resolve(res));
36+
});
37+
38+
req.once('error', reject);
39+
});
40+
}
41+
42+
async function requestAndCaptureSession(options) {
43+
let sessionResolve;
44+
const sessionPromise = new Promise((resolve) => {
45+
sessionResolve = resolve;
46+
});
47+
48+
const req = https.get({
49+
...options,
50+
host: '127.0.0.1',
51+
agent: false,
52+
});
53+
54+
req.on('socket', (socket) => {
55+
socket.once('session', sessionResolve);
56+
});
57+
58+
const res = await new Promise((resolve, reject) => {
59+
req.once('response', resolve);
60+
req.once('error', reject);
61+
});
62+
63+
assert.strictEqual(res.socket.authorized, true);
64+
assert.strictEqual(res.socket.isSessionReused(), false);
65+
66+
res.resume();
67+
await once(res, 'end');
68+
69+
const session = await sessionPromise;
70+
assert(session);
71+
return session;
72+
}
73+
74+
const server = https.createServer({
75+
key: load('agent1-key.pem'),
76+
cert: load('agent1-cert.pem'),
77+
minVersion: 'TLSv1.2',
78+
maxVersion: 'TLSv1.2',
79+
SNICallback(servername, cb) {
80+
cb(null, contexts[servername] || contexts.agent1);
81+
},
82+
}, (req, res) => {
83+
res.end('ok');
84+
});
85+
86+
(async function() {
87+
server.listen(0);
88+
await once(server, 'listening');
89+
90+
try {
91+
const session = await requestAndCaptureSession({
92+
port: server.address().port,
93+
servername: 'agent1',
94+
rejectUnauthorized: true,
95+
ca: [load('ca1-cert.pem')],
96+
});
97+
98+
await assert.rejects(
99+
request({
100+
port: server.address().port,
101+
servername: 'agent3',
102+
session,
103+
rejectUnauthorized: true,
104+
ca: [load('ca1-cert.pem')],
105+
}),
106+
{
107+
code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',
108+
},
109+
);
110+
111+
await assert.rejects(
112+
request({
113+
port: server.address().port,
114+
servername: 'agent3',
115+
rejectUnauthorized: true,
116+
ca: [load('ca1-cert.pem')],
117+
}),
118+
{
119+
code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',
120+
},
121+
);
122+
} finally {
123+
server.close();
124+
await once(server, 'close');
125+
}
126+
})().then(common.mustCall());
Lines changed: 122 additions & 0 deletions

0 commit comments

Comments
 (0)