From 6db1b23eb1f02f248e64065b5a6559128f9bdef1 Mon Sep 17 00:00:00 2001 From: Sun Yimin Date: Thu, 18 Aug 2022 15:00:11 +0800 Subject: [PATCH] subtle: fix generic bug --- internal/subtle/xor.go | 20 -------------------- internal/subtle/xor_amd64.go | 17 +++++++++++++++++ internal/subtle/xor_arm64.go | 18 ++++++++++++++++++ internal/subtle/xor_generic.go | 15 ++++++++++++++- 4 files changed, 49 insertions(+), 21 deletions(-) delete mode 100644 internal/subtle/xor.go diff --git a/internal/subtle/xor.go b/internal/subtle/xor.go deleted file mode 100644 index 5120862..0000000 --- a/internal/subtle/xor.go +++ /dev/null @@ -1,20 +0,0 @@ -package subtle - -// XORBytes sets dst[i] = x[i] ^ y[i] for all i < n = min(len(x), len(y)), -// returning n, the number of bytes written to dst. -// If dst does not have length at least n, -// XORBytes panics without writing anything to dst. -func XORBytes(dst, x, y []byte) int { - n := len(x) - if len(y) < n { - n = len(y) - } - if n == 0 { - return 0 - } - if n > len(dst) { - panic("subtle.XORBytes: dst too short") - } - xorBytes(&dst[0], &x[0], &y[0], n) // arch-specific - return n -} diff --git a/internal/subtle/xor_amd64.go b/internal/subtle/xor_amd64.go index c65a77f..b1854d8 100644 --- a/internal/subtle/xor_amd64.go +++ b/internal/subtle/xor_amd64.go @@ -7,5 +7,22 @@ package subtle +// XORBytes xors the bytes in a and b. The destination should have enough +// space, otherwise XORBytes will panic. Returns the number of bytes xor'd. +func XORBytes(dst, a, b []byte) int { + n := len(a) + if len(b) < n { + n = len(b) + } + if n == 0 { + return 0 + } + if n > len(dst) { + panic("subtle.XORBytes: dst too short") + } + xorBytes(&dst[0], &a[0], &b[0], n) // amd64 must have SSE2 + return n +} + //go:noescape func xorBytes(dst, a, b *byte, n int) diff --git a/internal/subtle/xor_arm64.go b/internal/subtle/xor_arm64.go index 68989ca..fcce86c 100644 --- a/internal/subtle/xor_arm64.go +++ b/internal/subtle/xor_arm64.go @@ -7,5 +7,23 @@ package subtle +// XORBytes xors the bytes in a and b. The destination should have enough +// space, otherwise XORBytes will panic. Returns the number of bytes xor'd. +func XORBytes(dst, a, b []byte) int { + n := len(a) + if len(b) < n { + n = len(b) + } + if n == 0 { + return 0 + } + if n > len(dst) { + panic("subtle.XORBytes: dst too short") + } + + xorBytes(&dst[0], &a[0], &b[0], n) + return n +} + //go:noescape func xorBytes(dst, a, b *byte, n int) diff --git a/internal/subtle/xor_generic.go b/internal/subtle/xor_generic.go index 3c7bae5..6af8a82 100644 --- a/internal/subtle/xor_generic.go +++ b/internal/subtle/xor_generic.go @@ -19,7 +19,20 @@ const supportsUnaligned = runtime.GOARCH == "386" || runtime.GOARCH == "ppc64le" || runtime.GOARCH == "s390x" -func xorBytes(dst, a, b []byte, n int) int { +// XORBytes xors the bytes in a and b. The destination should have enough +// space, otherwise XORBytes will panic. Returns the number of bytes xor'd. +func XORBytes(dst, a, b []byte) int { + n := len(a) + if len(b) < n { + n = len(b) + } + if n == 0 { + return 0 + } + if n > len(dst) { + panic("subtle.XORBytes: dst too short") + } + switch { case supportsUnaligned: fastXORBytes(dst, a, b, n)