blob: afa8786a727195d466dd54f0bd32b0af707d6e63 [file] [edit]
// Copyright 2016 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.
//go:build !purego
package aes
import (
"crypto/internal/fips140/subtle"
"crypto/internal/fips140deps/byteorder"
)
func ctrBlocks1(b *Block, dst, src *[BlockSize]byte, ivlo, ivhi uint64) {
ctrBlocksS390x(b, dst[:], src[:], ivlo, ivhi)
}
func ctrBlocks2(b *Block, dst, src *[2 * BlockSize]byte, ivlo, ivhi uint64) {
ctrBlocksS390x(b, dst[:], src[:], ivlo, ivhi)
}
func ctrBlocks4(b *Block, dst, src *[4 * BlockSize]byte, ivlo, ivhi uint64) {
ctrBlocksS390x(b, dst[:], src[:], ivlo, ivhi)
}
func ctrBlocks8(b *Block, dst, src *[8 * BlockSize]byte, ivlo, ivhi uint64) {
ctrBlocksS390x(b, dst[:], src[:], ivlo, ivhi)
}
func ctrBlocksS390x(b *Block, dst, src []byte, ivlo, ivhi uint64) {
if b.fallback != nil {
ctrBlocks(b, dst, src, ivlo, ivhi)
return
}
buf := make([]byte, len(src), 8*BlockSize)
for i := 0; i < len(buf); i += BlockSize {
byteorder.BEPutUint64(buf[i:], ivhi)
byteorder.BEPutUint64(buf[i+8:], ivlo)
ivlo, ivhi = add128(ivlo, ivhi, 1)
}
// Encrypt the buffer using AES in ECB mode.
cryptBlocks(b.function, &b.key[0], &buf[0], &buf[0], len(buf))
// XOR into buf first, in case src and dst overlap (see ctrBlocks).
subtle.XORBytes(buf, src, buf)
copy(dst, buf)
}