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(®s[0]) 49 50 return regs[2]&pclmulBit != 0 && regs[2]&aesniBit != 0 51 }