...

Source file src/pkg/vendor/golang.org/x/crypto/internal/chacha20/xor.go

     1	// Copyright 2018 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found src the LICENSE file.
     4	
     5	package chacha20
     6	
     7	import (
     8		"runtime"
     9	)
    10	
    11	// Platforms that have fast unaligned 32-bit little endian accesses.
    12	const unaligned = runtime.GOARCH == "386" ||
    13		runtime.GOARCH == "amd64" ||
    14		runtime.GOARCH == "arm64" ||
    15		runtime.GOARCH == "ppc64le" ||
    16		runtime.GOARCH == "s390x"
    17	
    18	// xor reads a little endian uint32 from src, XORs it with u and
    19	// places the result in little endian byte order in dst.
    20	func xor(dst, src []byte, u uint32) {
    21		_, _ = src[3], dst[3] // eliminate bounds checks
    22		if unaligned {
    23			// The compiler should optimize this code into
    24			// 32-bit unaligned little endian loads and stores.
    25			// TODO: delete once the compiler does a reliably
    26			// good job with the generic code below.
    27			// See issue #25111 for more details.
    28			v := uint32(src[0])
    29			v |= uint32(src[1]) << 8
    30			v |= uint32(src[2]) << 16
    31			v |= uint32(src[3]) << 24
    32			v ^= u
    33			dst[0] = byte(v)
    34			dst[1] = byte(v >> 8)
    35			dst[2] = byte(v >> 16)
    36			dst[3] = byte(v >> 24)
    37		} else {
    38			dst[0] = src[0] ^ byte(u)
    39			dst[1] = src[1] ^ byte(u>>8)
    40			dst[2] = src[2] ^ byte(u>>16)
    41			dst[3] = src[3] ^ byte(u>>24)
    42		}
    43	}
    44	

View as plain text