xcrcgen.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * Produce a "generalized CRC" table. Assumes a platform with
  3. * /dev/urandom -- otherwise reimplement get_random_byte().
  4. */
  5. #include <errno.h>
  6. #include <fcntl.h>
  7. #include <inttypes.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <unistd.h>
  12. static uint8_t get_random_byte(void)
  13. {
  14. static int fd = -1;
  15. uint8_t buf;
  16. int rv;
  17. if (fd < 0)
  18. fd = open("/dev/urandom", O_RDONLY);
  19. do {
  20. errno = 0;
  21. rv = read(fd, &buf, 1);
  22. if (rv < 1 && errno != EAGAIN)
  23. abort();
  24. } while (rv < 1);
  25. return buf;
  26. }
  27. static void random_permute(uint8_t *buf)
  28. {
  29. int i, j, k;
  30. int m;
  31. for (i = 0; i < 256; i++)
  32. buf[i] = i;
  33. m = 255;
  34. for (i = 255; i > 0; i--) {
  35. if (i <= (m >> 1))
  36. m >>= 1;
  37. do {
  38. j = get_random_byte() & m;
  39. } while (j > i);
  40. k = buf[i];
  41. buf[i] = buf[j];
  42. buf[j] = k;
  43. }
  44. }
  45. static void xcrc_table(uint64_t *buf)
  46. {
  47. uint8_t perm[256];
  48. int i, j;
  49. memset(buf, 0, 8*256); /* Make static checkers happy */
  50. for (i = 0; i < 8; i++) {
  51. random_permute(perm);
  52. for (j = 0; j < 256; j++)
  53. buf[j] = (buf[j] << 8) | perm[j];
  54. }
  55. }
  56. int main(void)
  57. {
  58. int i;
  59. uint64_t buf[256];
  60. xcrc_table(buf);
  61. for (i = 0; i < 256; i++) {
  62. printf("%016"PRIx64"\n", buf[i]);
  63. }
  64. return 0;
  65. }