github.com/mad-day/Yawning-crypto@v0.0.0-20190711051033-5a5f8cca32ec/bsaes/aesni.go (about)

     1  // Copyright (c) 2017 Yawning Angel <yawning at schwanenlied dot me>
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining
     4  // a copy of this software and associated documentation files (the
     5  // "Software"), to deal in the Software without restriction, including
     6  // without limitation the rights to use, copy, modify, merge, publish,
     7  // distribute, sublicense, and/or sell copies of the Software, and to
     8  // permit persons to whom the Software is furnished to do so, subject to
     9  // the following conditions:
    10  //
    11  // The above copyright notice and this permission notice shall be
    12  // included in all copies or substantial portions of the Software.
    13  //
    14  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    15  // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    16  // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    17  // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
    18  // BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
    19  // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    20  // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    21  // SOFTWARE.
    22  
    23  // +build go1.6
    24  // +build !gccgo
    25  // +build !appengine
    26  // +build !noasm
    27  // +build amd64
    28  
    29  package bsaes
    30  
    31  //go:noescape
    32  func cpuidAMD64(cpuidParams *uint32)
    33  
    34  func isCryptoAESSafe() bool {
    35  	return supportsAESNI()
    36  }
    37  
    38  func supportsAESNI() bool {
    39  	const (
    40  		pclmulBit = 1 << 1
    41  		aesniBit  = 1 << 25
    42  	)
    43  
    44  	// Check for AES-NI and PCLMUL support.
    45  	// CPUID.(EAX=01H, ECX=0H):ECX.AESNI[bit 25]==1
    46  	//                         ECX.PCLMUL[bit 1]==1
    47  	regs := [4]uint32{0x01}
    48  	cpuidAMD64(&regs[0])
    49  
    50  	return regs[2]&pclmulBit != 0 && regs[2]&aesniBit != 0
    51  }