|
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 | return nil |
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 | | -func mask(key uint32, b []byte) uint32 { |
188 | | - if len(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 | | - for len(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 | | - for len(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 | | - for len(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 | | - for len(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 | | - for len(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 | | - for len(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 | | - for i := range b { |
291 | | - b[i] ^= byte(key) |
292 | | - key = bits.RotateLeft32(key, -8) |
293 | | - } |
294 | | - |
295 | | - return key |
296 | | -} |
0 commit comments