MOVQ $masks<>(SB), AX
PAND (AX)(CX*8), X1
final1:
- AESENC X0, X1 // scramble input, xor in seed
- AESENC X1, X1 // scramble combo 2 times
+ PXOR X0, X1 // xor data with seed
+ AESENC X1, X1 // scramble combo 3 times
+ AESENC X1, X1
AESENC X1, X1
MOVQ X1, (DX)
RET
MOVOU (AX), X2
MOVOU -16(AX)(CX*1), X3
+ // xor with seed
+ PXOR X0, X2
+ PXOR X1, X3
+
// scramble 3 times
- AESENC X0, X2
- AESENC X1, X3
+ AESENC X2, X2
+ AESENC X3, X3
AESENC X2, X2
AESENC X3, X3
AESENC X2, X2
MOVOU 16(AX), X5
MOVOU -32(AX)(CX*1), X6
MOVOU -16(AX)(CX*1), X7
+
+ PXOR X0, X4
+ PXOR X1, X5
+ PXOR X2, X6
+ PXOR X3, X7
- AESENC X0, X4
- AESENC X1, X5
- AESENC X2, X6
- AESENC X3, X7
+ AESENC X4, X4
+ AESENC X5, X5
+ AESENC X6, X6
+ AESENC X7, X7
AESENC X4, X4
AESENC X5, X5
MOVOU -32(AX)(CX*1), X14
MOVOU -16(AX)(CX*1), X15
- // scramble data, xor in seed
- AESENC X0, X8
- AESENC X1, X9
- AESENC X2, X10
- AESENC X3, X11
- AESENC X4, X12
- AESENC X5, X13
- AESENC X6, X14
- AESENC X7, X15
+ // xor with seed
+ PXOR X0, X8
+ PXOR X1, X9
+ PXOR X2, X10
+ PXOR X3, X11
+ PXOR X4, X12
+ PXOR X5, X13
+ PXOR X6, X14
+ PXOR X7, X15
- // scramble twice
+ // scramble 3 times
AESENC X8, X8
AESENC X9, X9
AESENC X10, X10
AESENC X13, X13
AESENC X14, X14
AESENC X15, X15
-
+
+ AESENC X8, X8
+ AESENC X9, X9
+ AESENC X10, X10
+ AESENC X11, X11
+ AESENC X12, X12
+ AESENC X13, X13
+ AESENC X14, X14
+ AESENC X15, X15
+
AESENC X8, X8
AESENC X9, X9
AESENC X10, X10
MOVOU -32(AX)(CX*1), X14
MOVOU -16(AX)(CX*1), X15
- // scramble input once, xor in seed
- AESENC X0, X8
- AESENC X1, X9
- AESENC X2, X10
- AESENC X3, X11
- AESENC X4, X12
- AESENC X5, X13
- AESENC X6, X14
- AESENC X7, X15
+ // xor in seed
+ PXOR X0, X8
+ PXOR X1, X9
+ PXOR X2, X10
+ PXOR X3, X11
+ PXOR X4, X12
+ PXOR X5, X13
+ PXOR X6, X14
+ PXOR X7, X15
// compute number of remaining 128-byte blocks
DECQ CX
SHRQ $7, CX
aesloop:
+ // scramble state
+ AESENC X8, X8
+ AESENC X9, X9
+ AESENC X10, X10
+ AESENC X11, X11
+ AESENC X12, X12
+ AESENC X13, X13
+ AESENC X14, X14
+ AESENC X15, X15
+
// scramble state, xor in a block
MOVOU (AX), X0
MOVOU 16(AX), X1
AESENC X6, X14
AESENC X7, X15
- // scramble state
+ ADDQ $128, AX
+ DECQ CX
+ JNE aesloop
+
+ // 3 more scrambles to finish
AESENC X8, X8
AESENC X9, X9
AESENC X10, X10
AESENC X13, X13
AESENC X14, X14
AESENC X15, X15
-
- ADDQ $128, AX
- DECQ CX
- JNE aesloop
-
- // 2 more scrambles to finish
AESENC X8, X8
AESENC X9, X9
AESENC X10, X10
}
sink = s
}
+
+func TestCollisions(t *testing.T) {
+ for i := 0; i < 16; i++ {
+ for j := 0; j < 16; j++ {
+ if j == i {
+ continue
+ }
+ var a [16]byte
+ m := make(map[uint16]struct{}, 1<<16)
+ for n := 0; n < 1<<16; n++ {
+ a[i] = byte(n)
+ a[j] = byte(n >> 8)
+ m[uint16(BytesHash(a[:], 0))] = struct{}{}
+ }
+ if len(m) <= 1<<15 {
+ t.Errorf("too many collisions i=%d j=%d outputs=%d out of 65536\n", i, j, len(m))
+ }
+ }
+ }
+}