-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathproxy_token.js
More file actions
34 lines (30 loc) · 1.25 KB
/
Copy pathproxy_token.js
File metadata and controls
34 lines (30 loc) · 1.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
'use strict';
const crypto = require('crypto');
// PROXY_SECRET deve ser definido em .env. Se não estiver, gera um aleatório
// por processo — URLs geradas numa sessão são inválidas após reiniciar,
// o que é aceitável (Stremio re-resolve o stream).
const SECRET = process.env.PROXY_SECRET || crypto.randomBytes(32).toString('hex');
function sign(obj) {
const data = Buffer.from(JSON.stringify(obj)).toString('base64url');
const sig = crypto.createHmac('sha256', SECRET).update(data).digest('base64url');
return `${data}.${sig}`;
}
function verify(token) {
if (typeof token !== 'string') return null;
const dot = token.lastIndexOf('.');
if (dot === -1) return null;
const data = token.slice(0, dot);
const sig = token.slice(dot + 1);
const expected = crypto.createHmac('sha256', SECRET).update(data).digest('base64url');
try {
// timingSafeEqual requires equal-length buffers
const sigBuf = Buffer.from(sig, 'base64url');
const expBuf = Buffer.from(expected, 'base64url');
if (sigBuf.length !== expBuf.length) return null;
if (!crypto.timingSafeEqual(sigBuf, expBuf)) return null;
return JSON.parse(Buffer.from(data, 'base64url').toString());
} catch {
return null;
}
}
module.exports = { sign, verify };