aesni.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. // +build go1.6
  23. // +build !gccgo
  24. // +build !appengine
  25. // +build !noasm
  26. // +build amd64
  27. package bsaes
  28. //go:noescape
  29. func cpuidAMD64(cpuidParams *uint32)
  30. func isCryptoAESSafe() bool {
  31. return supportsAESNI()
  32. }
  33. func supportsAESNI() bool {
  34. const (
  35. pclmulBit = 1 << 1
  36. aesniBit = 1 << 25
  37. )
  38. // Check for AES-NI and PCLMUL support.
  39. // CPUID.(EAX=01H, ECX=0H):ECX.AESNI[bit 25]==1
  40. // ECX.PCLMUL[bit 1]==1
  41. regs := [4]uint32{0x01}
  42. cpuidAMD64(&regs[0])
  43. return regs[2]&pclmulBit != 0 && regs[2]&aesniBit != 0
  44. }