diff options
Diffstat (limited to 'vendor/mellium.im/sasl/xor_unaligned.go')
-rw-r--r-- | vendor/mellium.im/sasl/xor_unaligned.go | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/vendor/mellium.im/sasl/xor_unaligned.go b/vendor/mellium.im/sasl/xor_unaligned.go new file mode 100644 index 000000000..a6b6bebcc --- /dev/null +++ b/vendor/mellium.im/sasl/xor_unaligned.go @@ -0,0 +1,52 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file was split out from Go's crypto/cipher/xor.go + +// +build 386 amd64 ppc64 ppc64le s390x appengine + +package sasl + +import ( + "unsafe" +) + +const wordSize = int(unsafe.Sizeof(uintptr(0))) + +// xorBytes xors in bulk. It only works on architectures that support unaligned +// read/writes. +func xorBytes(dst, a, b []byte) int { + n := len(a) + if len(b) < n { + n = len(b) + } + + w := n / wordSize + if w > 0 { + dw := *(*[]uintptr)(unsafe.Pointer(&dst)) + aw := *(*[]uintptr)(unsafe.Pointer(&a)) + bw := *(*[]uintptr)(unsafe.Pointer(&b)) + for i := 0; i < w; i++ { + dw[i] = aw[i] ^ bw[i] + } + } + + for i := (n - n%wordSize); i < n; i++ { + dst[i] = a[i] ^ b[i] + } + + return n +} + +// xorWords XORs multiples of 4 or 8 bytes (depending on architecture.) The +// arguments are assumed to be of equal length. +func xorWords(dst, a, b []byte) { + dw := *(*[]uintptr)(unsafe.Pointer(&dst)) + aw := *(*[]uintptr)(unsafe.Pointer(&a)) + bw := *(*[]uintptr)(unsafe.Pointer(&b)) + n := len(b) / wordSize + for i := 0; i < n; i++ { + dw[i] = aw[i] ^ bw[i] + } +} |