@@ -13,10 +13,10 @@ import (
13
13
// to be used for masking in the key. This is so that
14
14
// unmasking can be performed without the entire frame.
15
15
func fastXOR (key [4 ]byte , keyPos int , b []byte ) int {
16
- // If the payload is greater than 16 bytes, then it's worth
16
+ // If the payload is greater than or equal to 16 bytes, then it's worth
17
17
// masking 8 bytes at a time.
18
18
// Optimization from https://github.com/golang/go/issues/31586#issuecomment-485530859
19
- if len (b ) > 16 {
19
+ if len (b ) >= 16 {
20
20
// We first create a key that is 8 bytes long
21
21
// and is aligned on the position correctly.
22
22
var alignedKey [8 ]byte
@@ -25,6 +25,43 @@ func fastXOR(key [4]byte, keyPos int, b []byte) int {
25
25
}
26
26
k := binary .LittleEndian .Uint64 (alignedKey [:])
27
27
28
+ // Then we xor until b is less than 128 bytes.
29
+ for len (b ) >= 128 {
30
+ v := binary .LittleEndian .Uint64 (b )
31
+ binary .LittleEndian .PutUint64 (b , v ^ k )
32
+ v = binary .LittleEndian .Uint64 (b [8 :])
33
+ binary .LittleEndian .PutUint64 (b [8 :], v ^ k )
34
+ v = binary .LittleEndian .Uint64 (b [16 :])
35
+ binary .LittleEndian .PutUint64 (b [16 :], v ^ k )
36
+ v = binary .LittleEndian .Uint64 (b [24 :])
37
+ binary .LittleEndian .PutUint64 (b [24 :], v ^ k )
38
+ v = binary .LittleEndian .Uint64 (b [32 :])
39
+ binary .LittleEndian .PutUint64 (b [32 :], v ^ k )
40
+ v = binary .LittleEndian .Uint64 (b [40 :])
41
+ binary .LittleEndian .PutUint64 (b [40 :], v ^ k )
42
+ v = binary .LittleEndian .Uint64 (b [48 :])
43
+ binary .LittleEndian .PutUint64 (b [48 :], v ^ k )
44
+ v = binary .LittleEndian .Uint64 (b [56 :])
45
+ binary .LittleEndian .PutUint64 (b [56 :], v ^ k )
46
+ v = binary .LittleEndian .Uint64 (b [64 :])
47
+ binary .LittleEndian .PutUint64 (b [64 :], v ^ k )
48
+ v = binary .LittleEndian .Uint64 (b [72 :])
49
+ binary .LittleEndian .PutUint64 (b [72 :], v ^ k )
50
+ v = binary .LittleEndian .Uint64 (b [80 :])
51
+ binary .LittleEndian .PutUint64 (b [80 :], v ^ k )
52
+ v = binary .LittleEndian .Uint64 (b [88 :])
53
+ binary .LittleEndian .PutUint64 (b [88 :], v ^ k )
54
+ v = binary .LittleEndian .Uint64 (b [96 :])
55
+ binary .LittleEndian .PutUint64 (b [96 :], v ^ k )
56
+ v = binary .LittleEndian .Uint64 (b [104 :])
57
+ binary .LittleEndian .PutUint64 (b [104 :], v ^ k )
58
+ v = binary .LittleEndian .Uint64 (b [112 :])
59
+ binary .LittleEndian .PutUint64 (b [112 :], v ^ k )
60
+ v = binary .LittleEndian .Uint64 (b [120 :])
61
+ binary .LittleEndian .PutUint64 (b [120 :], v ^ k )
62
+ b = b [128 :]
63
+ }
64
+
28
65
// Then we xor until b is less than 8 bytes.
29
66
for len (b ) >= 8 {
30
67
v := binary .LittleEndian .Uint64 (b )
0 commit comments