|
8 | 8 | "fmt"
|
9 | 9 | "io"
|
10 | 10 | "math"
|
11 |
| -"math/bits" |
12 | 11 |
|
13 | 12 | "nhooyr.io/websocket/internal/errd"
|
14 | 13 | )
|
@@ -172,125 +171,3 @@ func writeFrameHeader(h header, w *bufio.Writer, buf []byte) (err error) {
|
172 | 171 |
|
173 | 172 | returnnil
|
174 | 173 | }
|
175 |
| - |
176 |
| -// mask applies the WebSocket masking algorithm to p |
177 |
| -// with the given key. |
178 |
| -// See https://tools.ietf.org/html/rfc6455#section-5.3 |
179 |
| -// |
180 |
| -// The returned value is the correctly rotated key to |
181 |
| -// to continue to mask/unmask the message. |
182 |
| -// |
183 |
| -// It is optimized for LittleEndian and expects the key |
184 |
| -// to be in little endian. |
185 |
| -// |
186 |
| -// See https://github.com/golang/go/issues/31586 |
187 |
| -funcmaskGo(keyuint32,b []byte)uint32 { |
188 |
| -iflen(b)>=8 { |
189 |
| -key64:=uint64(key)<<32|uint64(key) |
190 |
| - |
191 |
| -// At some point in the future we can clean these unrolled loops up. |
192 |
| -// See https://github.com/golang/go/issues/31586#issuecomment-487436401 |
193 |
| - |
194 |
| -// Then we xor until b is less than 128 bytes. |
195 |
| -forlen(b)>=128 { |
196 |
| -v:=binary.LittleEndian.Uint64(b) |
197 |
| -binary.LittleEndian.PutUint64(b,v^key64) |
198 |
| -v=binary.LittleEndian.Uint64(b[8:16]) |
199 |
| -binary.LittleEndian.PutUint64(b[8:16],v^key64) |
200 |
| -v=binary.LittleEndian.Uint64(b[16:24]) |
201 |
| -binary.LittleEndian.PutUint64(b[16:24],v^key64) |
202 |
| -v=binary.LittleEndian.Uint64(b[24:32]) |
203 |
| -binary.LittleEndian.PutUint64(b[24:32],v^key64) |
204 |
| -v=binary.LittleEndian.Uint64(b[32:40]) |
205 |
| -binary.LittleEndian.PutUint64(b[32:40],v^key64) |
206 |
| -v=binary.LittleEndian.Uint64(b[40:48]) |
207 |
| -binary.LittleEndian.PutUint64(b[40:48],v^key64) |
208 |
| -v=binary.LittleEndian.Uint64(b[48:56]) |
209 |
| -binary.LittleEndian.PutUint64(b[48:56],v^key64) |
210 |
| -v=binary.LittleEndian.Uint64(b[56:64]) |
211 |
| -binary.LittleEndian.PutUint64(b[56:64],v^key64) |
212 |
| -v=binary.LittleEndian.Uint64(b[64:72]) |
213 |
| -binary.LittleEndian.PutUint64(b[64:72],v^key64) |
214 |
| -v=binary.LittleEndian.Uint64(b[72:80]) |
215 |
| -binary.LittleEndian.PutUint64(b[72:80],v^key64) |
216 |
| -v=binary.LittleEndian.Uint64(b[80:88]) |
217 |
| -binary.LittleEndian.PutUint64(b[80:88],v^key64) |
218 |
| -v=binary.LittleEndian.Uint64(b[88:96]) |
219 |
| -binary.LittleEndian.PutUint64(b[88:96],v^key64) |
220 |
| -v=binary.LittleEndian.Uint64(b[96:104]) |
221 |
| -binary.LittleEndian.PutUint64(b[96:104],v^key64) |
222 |
| -v=binary.LittleEndian.Uint64(b[104:112]) |
223 |
| -binary.LittleEndian.PutUint64(b[104:112],v^key64) |
224 |
| -v=binary.LittleEndian.Uint64(b[112:120]) |
225 |
| -binary.LittleEndian.PutUint64(b[112:120],v^key64) |
226 |
| -v=binary.LittleEndian.Uint64(b[120:128]) |
227 |
| -binary.LittleEndian.PutUint64(b[120:128],v^key64) |
228 |
| -b=b[128:] |
229 |
| -} |
230 |
| - |
231 |
| -// Then we xor until b is less than 64 bytes. |
232 |
| -forlen(b)>=64 { |
233 |
| -v:=binary.LittleEndian.Uint64(b) |
234 |
| -binary.LittleEndian.PutUint64(b,v^key64) |
235 |
| -v=binary.LittleEndian.Uint64(b[8:16]) |
236 |
| -binary.LittleEndian.PutUint64(b[8:16],v^key64) |
237 |
| -v=binary.LittleEndian.Uint64(b[16:24]) |
238 |
| -binary.LittleEndian.PutUint64(b[16:24],v^key64) |
239 |
| -v=binary.LittleEndian.Uint64(b[24:32]) |
240 |
| -binary.LittleEndian.PutUint64(b[24:32],v^key64) |
241 |
| -v=binary.LittleEndian.Uint64(b[32:40]) |
242 |
| -binary.LittleEndian.PutUint64(b[32:40],v^key64) |
243 |
| -v=binary.LittleEndian.Uint64(b[40:48]) |
244 |
| -binary.LittleEndian.PutUint64(b[40:48],v^key64) |
245 |
| -v=binary.LittleEndian.Uint64(b[48:56]) |
246 |
| -binary.LittleEndian.PutUint64(b[48:56],v^key64) |
247 |
| -v=binary.LittleEndian.Uint64(b[56:64]) |
248 |
| -binary.LittleEndian.PutUint64(b[56:64],v^key64) |
249 |
| -b=b[64:] |
250 |
| -} |
251 |
| - |
252 |
| -// Then we xor until b is less than 32 bytes. |
253 |
| -forlen(b)>=32 { |
254 |
| -v:=binary.LittleEndian.Uint64(b) |
255 |
| -binary.LittleEndian.PutUint64(b,v^key64) |
256 |
| -v=binary.LittleEndian.Uint64(b[8:16]) |
257 |
| -binary.LittleEndian.PutUint64(b[8:16],v^key64) |
258 |
| -v=binary.LittleEndian.Uint64(b[16:24]) |
259 |
| -binary.LittleEndian.PutUint64(b[16:24],v^key64) |
260 |
| -v=binary.LittleEndian.Uint64(b[24:32]) |
261 |
| -binary.LittleEndian.PutUint64(b[24:32],v^key64) |
262 |
| -b=b[32:] |
263 |
| -} |
264 |
| - |
265 |
| -// Then we xor until b is less than 16 bytes. |
266 |
| -forlen(b)>=16 { |
267 |
| -v:=binary.LittleEndian.Uint64(b) |
268 |
| -binary.LittleEndian.PutUint64(b,v^key64) |
269 |
| -v=binary.LittleEndian.Uint64(b[8:16]) |
270 |
| -binary.LittleEndian.PutUint64(b[8:16],v^key64) |
271 |
| -b=b[16:] |
272 |
| -} |
273 |
| - |
274 |
| -// Then we xor until b is less than 8 bytes. |
275 |
| -forlen(b)>=8 { |
276 |
| -v:=binary.LittleEndian.Uint64(b) |
277 |
| -binary.LittleEndian.PutUint64(b,v^key64) |
278 |
| -b=b[8:] |
279 |
| -} |
280 |
| -} |
281 |
| - |
282 |
| -// Then we xor until b is less than 4 bytes. |
283 |
| -forlen(b)>=4 { |
284 |
| -v:=binary.LittleEndian.Uint32(b) |
285 |
| -binary.LittleEndian.PutUint32(b,v^key) |
286 |
| -b=b[4:] |
287 |
| -} |
288 |
| - |
289 |
| -// xor remaining bytes. |
290 |
| -fori:=rangeb { |
291 |
| -b[i]^=byte(key) |
292 |
| -key=bits.RotateLeft32(key,-8) |
293 |
| -} |
294 |
| - |
295 |
| -returnkey |
296 |
| -} |