Advertisement
MeBeiM

Try making x86 RDRAND fail.

Jun 14th, 2020
1,064
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.98 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <string.h>
  4. #include <pthread.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7.  
  8. // Try making RDRAND fail.
  9. // gcc -Wall -Wextra -pedantic rdrand.c -pthread
  10.  
  11. void *fseed(void *arg) {
  12.         int id = *(int *)arg;
  13.  
  14.         fprintf(stderr, "Thread SEED%02d started.\n", id);
  15.  
  16.         asm volatile (
  17.                 "x:\n\t"
  18.                 "pause\n\t"
  19.                 "rdseed %%rax\n\t"
  20.                 "jmp x\n\t"
  21.                 : : : "rax"
  22.         );
  23.  
  24.         return NULL;
  25. }
  26.  
  27. void *frand(void *arg) {
  28.         int id = *(int *)arg;
  29.         unsigned x = 0;
  30.         unsigned long tries = 0;
  31.  
  32.         fprintf(stderr, "Thread RAND%02d started.\n", id);
  33.  
  34.         asm volatile (
  35.                 "xor %1, %1\n\t"
  36.                 "retry:\n\t"
  37.                 "pause\n\t"
  38.                 "inc %1\n\t"
  39.                 "rdrand %0\n\t"
  40.                 "jc retry\n\t"
  41.                 "done:\n\t"
  42.                 : "=a"(x), "=r"(tries) : :
  43.         );
  44.  
  45.         fprintf(stderr, "Thread RAND%02d done after %lu tries.\n", id, tries);
  46.         exit(0);
  47.  
  48.         return NULL;
  49. }
  50.  
  51. #define NSEED 1
  52. #define NRAND 10
  53.  
  54. int main(void) {
  55.         pthread_t st[NSEED], rt[NRAND];
  56.         int sids[NSEED], rids[NRAND];
  57.  
  58.         for (int i = 0; i < NSEED; i++) {
  59.                 sids[i] = i;
  60.  
  61.                 if ((errno = pthread_create(st + i, NULL, fseed, &sids[i])) != 0) {
  62.                         fprintf(stderr, "Thread SEED%02d startup failed: %s\n", i, strerror(errno));
  63.                         return 1;
  64.                 }
  65.         }
  66.  
  67.         for (int i = 0; i < NRAND; i++) {
  68.                 rids[i] = i;
  69.  
  70.                 if ((errno = pthread_create(rt + i, NULL, frand, &rids[i])) != 0) {
  71.                         fprintf(stderr, "Thread RAND%02d startup failed: %s\n", i, strerror(errno));
  72.                         return 1;
  73.                 }
  74.         }
  75.  
  76.         sleep(1000);
  77.         fputs("Timed out.\n", stderr);
  78.  
  79.         return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement