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