Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

116 строки
2.5 KiB

  1. // Those tests work only with Clang and Memory Sanitizer
  2. #include <gtest/gtest.h>
  3. #include <common/ct_check.h>
  4. #include <common/utils.h>
  5. TEST(ConstantTime, CtCheck_Negative) {
  6. unsigned char a[16], b[16];
  7. unsigned i;
  8. memset(a, 42, 16);
  9. memset(b, 42, 16);
  10. ct_poison(a, 16);
  11. for (i = 0; i < 16; i++) {
  12. ct_expect_uum();
  13. if (a[i] != b[i]) {
  14. break;
  15. }
  16. ct_require_uum();
  17. }
  18. ct_purify(a, 16);
  19. // Ensure buffers are not optimized-out
  20. ASSERT_EQ(a[0], b[0]);
  21. }
  22. TEST(ConstantTime, CtCheck_Positive_NoAccess) {
  23. unsigned i;
  24. char result = 0;
  25. unsigned char a[16], b[16];
  26. memset(a, 42, sizeof(a));
  27. memset(b, 42, sizeof(b));
  28. ct_poison(a, 16);
  29. for (i = 0; i < 16; i++) {
  30. result |= a[i] ^ b[i];
  31. }
  32. ct_purify(a, 16);
  33. // Purify result, to allow check that otherwise
  34. // would be not constant-time.
  35. ct_purify(&result, 1);
  36. ASSERT_EQ(result, 0);
  37. }
  38. TEST(ConstantTime, CtCheck_Negative_UseSecretAsIndex) {
  39. static const unsigned char tab[2] = {1, 0};
  40. unsigned char a[16];
  41. unsigned char result;
  42. memset(a, 42, sizeof(a));
  43. ct_poison(a, 16);
  44. ct_expect_uum();
  45. result = tab[a[0] & 1];
  46. ct_require_uum();
  47. ct_purify(a, 16);
  48. // Ensure variables are not optimized-out
  49. ct_purify(&result, 1);
  50. ASSERT_EQ(result, 1);
  51. }
  52. TEST(ConstantTime, CtCheck_memcmp) {
  53. unsigned char a[16], b[16];
  54. memset(a, 42, sizeof(a));
  55. memset(b, 42, sizeof(b));
  56. uint8_t ret;
  57. ct_poison(a, 16);
  58. ret = ct_memcmp(a,b,16);
  59. ct_expect_uum();
  60. // Doesn't matter what we check. It's just to
  61. // enusre UMR is triggered.
  62. if (!ret) ASSERT_EQ(ret, 0);
  63. ct_require_uum();
  64. ct_purify(&ret, 1);
  65. b[1] = 0;
  66. ct_expect_uum();
  67. ret = ct_memcmp(a,b,16);
  68. if (ret) ASSERT_EQ(ret,1);
  69. ct_require_uum();
  70. ct_purify(&ret, 1);
  71. }
  72. TEST(ConstantTime, CtCheck_memcmp_chained) {
  73. unsigned char a[16], b[16], c[16], d[16];
  74. memset(a, 42, sizeof(a));
  75. memset(b, 42, sizeof(b));
  76. memset(d, 42, sizeof(b));
  77. memset(c, 41, sizeof(c));
  78. uint8_t ret;
  79. ct_poison(a, 16);
  80. ct_expect_uum();
  81. // obviously must generate UMR if first check fails
  82. // and second is not done
  83. ret = (ct_memcmp(a,c,16)==0) && (ct_memcmp(a,b,16)==0);
  84. ct_require_uum();
  85. ct_purify(&ret, 1);
  86. ASSERT_EQ(ret,0);
  87. ct_expect_uum();
  88. // it's still UMR even if both checks are OK
  89. ret = (ct_memcmp(a,d,16)==0) && (ct_memcmp(a,b,16)==0);
  90. ct_require_uum();
  91. ct_purify(&ret, 1);
  92. ASSERT_EQ(ret,1);
  93. }