|
4 | 4 |
|
5 | 5 | const net = require('net'); |
6 | 6 | const tls = require('tls'); |
7 | | -const { randomFillMask } = require('./random-util'); |
8 | 7 |
|
9 | 8 | const PerMessageDeflate = require('./permessage-deflate'); |
10 | 9 | const { EMPTY_BUFFER } = require('./constants'); |
11 | 10 | const { isValidStatusCode } = require('./validation'); |
12 | 11 | const { mask: applyMask, toBuffer } = require('./buffer-util'); |
| 12 | +const { randomBytes } = require('crypto'); |
13 | 13 |
|
14 | 14 | const mask = Buffer.alloc(4); |
15 | 15 |
|
| 16 | +const RANDOM_POOL_SIZE = 8192; |
| 17 | +const RANDOM_POOL_REFRESH = 1024; |
| 18 | + |
| 19 | +let randomPool = Buffer.alloc(RANDOM_POOL_SIZE); |
| 20 | +let randomPoolIdx = RANDOM_POOL_SIZE; |
| 21 | +let randomPending = true; |
| 22 | + |
| 23 | +function onRandomBytes (err, buf) { |
| 24 | + randomPending = false; |
| 25 | + if (!err) { |
| 26 | + randomPool = buf; |
| 27 | + randomPoolIdx = 0; |
| 28 | + } |
| 29 | +} |
| 30 | +randomBytes(RANDOM_POOL_SIZE, onRandomBytes); |
| 31 | + |
16 | 32 | /** |
17 | 33 | * HyBi Sender implementation. |
18 | 34 | */ |
@@ -81,13 +97,21 @@ class Sender { |
81 | 97 |
|
82 | 98 | if (!options.mask) return [target, data]; |
83 | 99 |
|
84 | | - randomFillMask(mask); |
| 100 | + if (randomPool.length - randomPoolIdx < 4) { |
| 101 | + randomPool = randomBytes(32); |
| 102 | + randomPoolIdx = 0; |
| 103 | + } |
85 | 104 |
|
86 | 105 | target[1] |= 0x80; |
87 | | - target[offset - 4] = mask[0]; |
88 | | - target[offset - 3] = mask[1]; |
89 | | - target[offset - 2] = mask[2]; |
90 | | - target[offset - 1] = mask[3]; |
| 106 | + target[offset - 4] = mask[0] = randomPool[randomPoolIdx++]; |
| 107 | + target[offset - 3] = mask[1] = randomPool[randomPoolIdx++]; |
| 108 | + target[offset - 2] = mask[2] = randomPool[randomPoolIdx++]; |
| 109 | + target[offset - 1] = mask[3] = randomPool[randomPoolIdx++]; |
| 110 | + |
| 111 | + if (randomPool.length - randomPoolIdx < RANDOM_POOL_REFRESH && !randomPending) { |
| 112 | + randomPending = true; |
| 113 | + randomBytes(RANDOM_POOL_SIZE, onRandomBytes); |
| 114 | + } |
91 | 115 |
|
92 | 116 | if (merge) { |
93 | 117 | applyMask(data, mask, target, offset, data.length); |
|
0 commit comments