crypto_entropy_rdrand.c 661 B

12345678910111213141516171819202122232425262728293031323334
  1. #include "cpusupport.h"
  2. #ifdef CPUSUPPORT_X86_RDRAND
  3. #include <immintrin.h>
  4. #include <stddef.h>
  5. #include "crypto_entropy_rdrand.h"
  6. /**
  7. * generate_seed_rdrand(buf, len):
  8. * Fill the ${buf} buffer with values from RDRAND. This implementation uses
  9. * the RDRAND instruction, and should only be used if CPUSUPPORT_X86_RDRAND is
  10. * defined and cpusupport_x86_rdrand() returns nonzero.
  11. */
  12. int
  13. generate_seed_rdrand(unsigned int * buf, size_t len)
  14. {
  15. size_t i;
  16. /* Fill buffer. */
  17. for (i = 0; i < len; i++) {
  18. if (!_rdrand32_step(&buf[i]))
  19. goto err0;
  20. }
  21. /* Success! */
  22. return (0);
  23. err0:
  24. /* Failure! */
  25. return (1);
  26. }
  27. #endif /* CPUSUPPORT_X86_RDRAND */