verify.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include <stddef.h>
  2. #include <stdint.h>
  3. #include "crypto_verify_16.h"
  4. #include "crypto_verify_32.h"
  5. #include "crypto_verify_64.h"
  6. size_t
  7. crypto_verify_16_bytes(void)
  8. {
  9. return crypto_verify_16_BYTES;
  10. }
  11. size_t
  12. crypto_verify_32_bytes(void)
  13. {
  14. return crypto_verify_32_BYTES;
  15. }
  16. size_t
  17. crypto_verify_64_bytes(void)
  18. {
  19. return crypto_verify_64_BYTES;
  20. }
  21. #if defined(HAVE_EMMINTRIN_H) && defined(__SSE2__)
  22. # ifdef __GNUC__
  23. # pragma GCC target("sse2")
  24. # endif
  25. # include <emmintrin.h>
  26. static inline int
  27. crypto_verify_n(const unsigned char *x_, const unsigned char *y_,
  28. const int n)
  29. {
  30. const __m128i zero = _mm_setzero_si128();
  31. volatile __m128i v1, v2, z;
  32. volatile int m;
  33. int i;
  34. const volatile __m128i *volatile x =
  35. (const volatile __m128i *volatile) (const void *) x_;
  36. const volatile __m128i *volatile y =
  37. (const volatile __m128i *volatile) (const void *) y_;
  38. v1 = _mm_loadu_si128((const __m128i *) &x[0]);
  39. v2 = _mm_loadu_si128((const __m128i *) &y[0]);
  40. z = _mm_xor_si128(v1, v2);
  41. for (i = 1; i < n / 16; i++) {
  42. v1 = _mm_loadu_si128((const __m128i *) &x[i]);
  43. v2 = _mm_loadu_si128((const __m128i *) &y[i]);
  44. z = _mm_or_si128(z, _mm_xor_si128(v1, v2));
  45. }
  46. m = _mm_movemask_epi8(_mm_cmpeq_epi32(z, zero));
  47. v1 = zero; v2 = zero; z = zero;
  48. return (int) (((uint32_t) m + 1U) >> 16) - 1;
  49. }
  50. #else
  51. static inline int
  52. crypto_verify_n(const unsigned char *x_, const unsigned char *y_,
  53. const int n)
  54. {
  55. const volatile unsigned char *volatile x =
  56. (const volatile unsigned char *volatile) x_;
  57. const volatile unsigned char *volatile y =
  58. (const volatile unsigned char *volatile) y_;
  59. volatile uint_fast16_t d = 0U;
  60. int i;
  61. for (i = 0; i < n; i++) {
  62. d |= x[i] ^ y[i];
  63. }
  64. return (1 & ((d - 1) >> 8)) - 1;
  65. }
  66. #endif
  67. int
  68. crypto_verify_16(const unsigned char *x, const unsigned char *y)
  69. {
  70. return crypto_verify_n(x, y, crypto_verify_16_BYTES);
  71. }
  72. int
  73. crypto_verify_32(const unsigned char *x, const unsigned char *y)
  74. {
  75. return crypto_verify_n(x, y, crypto_verify_32_BYTES);
  76. }
  77. int
  78. crypto_verify_64(const unsigned char *x, const unsigned char *y)
  79. {
  80. return crypto_verify_n(x, y, crypto_verify_64_BYTES);
  81. }