github.com/AESNooper/go/src@v0.0.0-20220218095104-b56a4ab1bbbb/crypto/aes/cipher_ppc64le.go (about) 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 package aes 6 7 import ( 8 "crypto/cipher" 9 "crypto/internal/subtle" 10 ) 11 12 // defined in asm_ppc64le.s 13 14 //go:noescape 15 func setEncryptKeyAsm(key *byte, keylen int, enc *uint32) int 16 17 //go:noescape 18 func setDecryptKeyAsm(key *byte, keylen int, dec *uint32) int 19 20 //go:noescape 21 func doEncryptKeyAsm(key *byte, keylen int, dec *uint32) int 22 23 //go:noescape 24 func encryptBlockAsm(dst, src *byte, enc *uint32) 25 26 //go:noescape 27 func decryptBlockAsm(dst, src *byte, dec *uint32) 28 29 type aesCipherAsm struct { 30 aesCipher 31 } 32 33 func newCipher(key []byte) (cipher.Block, error) { 34 n := 64 // size is fixed for all and round value is stored inside it too 35 c := aesCipherAsm{aesCipher{make([]uint32, n), make([]uint32, n)}} 36 k := len(key) 37 38 ret := 0 39 ret += setEncryptKeyAsm(&key[0], k*8, &c.enc[0]) 40 ret += setDecryptKeyAsm(&key[0], k*8, &c.dec[0]) 41 42 if ret > 0 { 43 return nil, KeySizeError(k) 44 } 45 46 return &c, nil 47 } 48 49 func (c *aesCipherAsm) BlockSize() int { return BlockSize } 50 51 func (c *aesCipherAsm) Encrypt(dst, src []byte) { 52 if len(src) < BlockSize { 53 panic("crypto/aes: input not full block") 54 } 55 if len(dst) < BlockSize { 56 panic("crypto/aes: output not full block") 57 } 58 if subtle.InexactOverlap(dst[:BlockSize], src[:BlockSize]) { 59 panic("crypto/aes: invalid buffer overlap") 60 } 61 encryptBlockAsm(&dst[0], &src[0], &c.enc[0]) 62 } 63 64 func (c *aesCipherAsm) Decrypt(dst, src []byte) { 65 if len(src) < BlockSize { 66 panic("crypto/aes: input not full block") 67 } 68 if len(dst) < BlockSize { 69 panic("crypto/aes: output not full block") 70 } 71 if subtle.InexactOverlap(dst[:BlockSize], src[:BlockSize]) { 72 panic("crypto/aes: invalid buffer overlap") 73 } 74 decryptBlockAsm(&dst[0], &src[0], &c.dec[0]) 75 } 76 77 // expandKey is used by BenchmarkExpand to ensure that the asm implementation 78 // of key expansion is used for the benchmark when it is available. 79 func expandKey(key []byte, enc, dec []uint32) { 80 setEncryptKeyAsm(&key[0], len(key)*8, &enc[0]) 81 setDecryptKeyAsm(&key[0], len(key)*8, &dec[0]) 82 }