ctr_s390x.mx raw

   1  // Copyright 2016 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  //go:build !purego
   6  
   7  package aes
   8  
   9  import (
  10  	"crypto/internal/fips140/subtle"
  11  	"crypto/internal/fips140deps/byteorder"
  12  )
  13  
  14  func ctrBlocks1(b *Block, dst, src *[BlockSize]byte, ivlo, ivhi uint64) {
  15  	ctrBlocksS390x(b, dst[:], src[:], ivlo, ivhi)
  16  }
  17  
  18  func ctrBlocks2(b *Block, dst, src *[2 * BlockSize]byte, ivlo, ivhi uint64) {
  19  	ctrBlocksS390x(b, dst[:], src[:], ivlo, ivhi)
  20  }
  21  
  22  func ctrBlocks4(b *Block, dst, src *[4 * BlockSize]byte, ivlo, ivhi uint64) {
  23  	ctrBlocksS390x(b, dst[:], src[:], ivlo, ivhi)
  24  }
  25  
  26  func ctrBlocks8(b *Block, dst, src *[8 * BlockSize]byte, ivlo, ivhi uint64) {
  27  	ctrBlocksS390x(b, dst[:], src[:], ivlo, ivhi)
  28  }
  29  
  30  func ctrBlocksS390x(b *Block, dst, src []byte, ivlo, ivhi uint64) {
  31  	if b.fallback != nil {
  32  		ctrBlocks(b, dst, src, ivlo, ivhi)
  33  		return
  34  	}
  35  
  36  	buf := []byte{:len(src):8*BlockSize}
  37  	for i := 0; i < len(buf); i += BlockSize {
  38  		byteorder.BEPutUint64(buf[i:], ivhi)
  39  		byteorder.BEPutUint64(buf[i+8:], ivlo)
  40  		ivlo, ivhi = add128(ivlo, ivhi, 1)
  41  	}
  42  
  43  	// Encrypt the buffer using AES in ECB mode.
  44  	cryptBlocks(b.function, &b.key[0], &buf[0], &buf[0], len(buf))
  45  
  46  	// XOR into buf first, in case src and dst overlap (see ctrBlocks).
  47  	subtle.XORBytes(buf, src, buf)
  48  	copy(dst, buf)
  49  }
  50