secure-compare-64.h 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /* Securely compares 64 bytes. Should be resistant to timing attacks. TODO:
  2. * Check */
  3. #define ROUND(idx) success &= (a[idx] == b[idx]);
  4. static __attribute__((optimize("O0"))) gboolean
  5. secure_compare_64(const char *a, const char *b)
  6. {
  7. gboolean success = TRUE;
  8. ROUND(0);
  9. ROUND(1);
  10. ROUND(2);
  11. ROUND(3);
  12. ROUND(4);
  13. ROUND(5);
  14. ROUND(6);
  15. ROUND(7);
  16. ROUND(8);
  17. ROUND(9);
  18. ROUND(10);
  19. ROUND(11);
  20. ROUND(12);
  21. ROUND(13);
  22. ROUND(14);
  23. ROUND(15);
  24. ROUND(16);
  25. ROUND(17);
  26. ROUND(18);
  27. ROUND(19);
  28. ROUND(20);
  29. ROUND(21);
  30. ROUND(22);
  31. ROUND(23);
  32. ROUND(24);
  33. ROUND(25);
  34. ROUND(26);
  35. ROUND(27);
  36. ROUND(28);
  37. ROUND(29);
  38. ROUND(30);
  39. ROUND(31);
  40. ROUND(32);
  41. ROUND(33);
  42. ROUND(34);
  43. ROUND(35);
  44. ROUND(36);
  45. ROUND(37);
  46. ROUND(38);
  47. ROUND(39);
  48. ROUND(40);
  49. ROUND(41);
  50. ROUND(42);
  51. ROUND(43);
  52. ROUND(44);
  53. ROUND(45);
  54. ROUND(46);
  55. ROUND(47);
  56. ROUND(48);
  57. ROUND(49);
  58. ROUND(50);
  59. ROUND(51);
  60. ROUND(52);
  61. ROUND(53);
  62. ROUND(54);
  63. ROUND(55);
  64. ROUND(56);
  65. ROUND(57);
  66. ROUND(58);
  67. ROUND(59);
  68. ROUND(60);
  69. ROUND(61);
  70. ROUND(62);
  71. ROUND(63);
  72. return success;
  73. }
  74. #undef ROUND