uxutils.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "putty.h"
  2. #include "ssh.h"
  3. #include "uxutils.h"
  4. #if defined __arm__ || defined __aarch64__
  5. bool platform_aes_hw_available(void)
  6. {
  7. #if defined HWCAP_AES
  8. return getauxval(AT_HWCAP) & HWCAP_AES;
  9. #elif defined HWCAP2_AES
  10. return getauxval(AT_HWCAP2) & HWCAP2_AES;
  11. #elif defined __APPLE__
  12. /* M1 macOS defines no optional sysctl flag indicating presence of
  13. * the AES extension, which I assume to be because it's always
  14. * present */
  15. return true;
  16. #else
  17. return false;
  18. #endif
  19. }
  20. bool platform_sha256_hw_available(void)
  21. {
  22. #if defined HWCAP_SHA2
  23. return getauxval(AT_HWCAP) & HWCAP_SHA2;
  24. #elif defined HWCAP2_SHA2
  25. return getauxval(AT_HWCAP2) & HWCAP2_SHA2;
  26. #elif defined __APPLE__
  27. /* Assume always present on M1 macOS, similarly to AES */
  28. return true;
  29. #else
  30. return false;
  31. #endif
  32. }
  33. bool platform_sha1_hw_available(void)
  34. {
  35. #if defined HWCAP_SHA1
  36. return getauxval(AT_HWCAP) & HWCAP_SHA1;
  37. #elif defined HWCAP2_SHA1
  38. return getauxval(AT_HWCAP2) & HWCAP2_SHA1;
  39. #elif defined __APPLE__
  40. /* Assume always present on M1 macOS, similarly to AES */
  41. return true;
  42. #else
  43. return false;
  44. #endif
  45. }
  46. bool platform_sha512_hw_available(void)
  47. {
  48. #if defined HWCAP_SHA512
  49. return getauxval(AT_HWCAP) & HWCAP_SHA512;
  50. #elif defined HWCAP2_SHA512
  51. return getauxval(AT_HWCAP2) & HWCAP2_SHA512;
  52. #elif defined __APPLE__
  53. return test_sysctl_flag("hw.optional.armv8_2_sha512");
  54. #else
  55. return false;
  56. #endif
  57. }
  58. #endif /* defined __arm__ || defined __aarch64__ */