github.com/ethereum/go-ethereum@v1.16.1/crypto/secp256k1/libsecp256k1/src/field_5x52_impl.h (about)

     1  /***********************************************************************
     2   * Copyright (c) 2013, 2014 Pieter Wuille                              *
     3   * Distributed under the MIT software license, see the accompanying    *
     4   * file COPYING or https://www.opensource.org/licenses/mit-license.php.*
     5   ***********************************************************************/
     6  
     7  #ifndef SECP256K1_FIELD_REPR_IMPL_H
     8  #define SECP256K1_FIELD_REPR_IMPL_H
     9  
    10  #include "checkmem.h"
    11  #include "util.h"
    12  #include "field.h"
    13  #include "modinv64_impl.h"
    14  
    15  #include "field_5x52_int128_impl.h"
    16  
    17  #ifdef VERIFY
    18  static void secp256k1_fe_impl_verify(const secp256k1_fe *a) {
    19      const uint64_t *d = a->n;
    20      int m = a->normalized ? 1 : 2 * a->magnitude;
    21     /* secp256k1 'p' value defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */
    22      VERIFY_CHECK(d[0] <= 0xFFFFFFFFFFFFFULL * m);
    23      VERIFY_CHECK(d[1] <= 0xFFFFFFFFFFFFFULL * m);
    24      VERIFY_CHECK(d[2] <= 0xFFFFFFFFFFFFFULL * m);
    25      VERIFY_CHECK(d[3] <= 0xFFFFFFFFFFFFFULL * m);
    26      VERIFY_CHECK(d[4] <= 0x0FFFFFFFFFFFFULL * m);
    27      if (a->normalized) {
    28          if ((d[4] == 0x0FFFFFFFFFFFFULL) && ((d[3] & d[2] & d[1]) == 0xFFFFFFFFFFFFFULL)) {
    29              VERIFY_CHECK(d[0] < 0xFFFFEFFFFFC2FULL);
    30          }
    31      }
    32  }
    33  #endif
    34  
    35  static void secp256k1_fe_impl_get_bounds(secp256k1_fe *r, int m) {
    36      r->n[0] = 0xFFFFFFFFFFFFFULL * 2 * m;
    37      r->n[1] = 0xFFFFFFFFFFFFFULL * 2 * m;
    38      r->n[2] = 0xFFFFFFFFFFFFFULL * 2 * m;
    39      r->n[3] = 0xFFFFFFFFFFFFFULL * 2 * m;
    40      r->n[4] = 0x0FFFFFFFFFFFFULL * 2 * m;
    41  }
    42  
    43  static void secp256k1_fe_impl_normalize(secp256k1_fe *r) {
    44      uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4];
    45  
    46      /* Reduce t4 at the start so there will be at most a single carry from the first pass */
    47      uint64_t m;
    48      uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL;
    49  
    50      /* The first pass ensures the magnitude is 1, ... */
    51      t0 += x * 0x1000003D1ULL;
    52      t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;
    53      t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1;
    54      t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2;
    55      t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3;
    56  
    57      /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */
    58      VERIFY_CHECK(t4 >> 49 == 0);
    59  
    60      /* At most a single final reduction is needed; check if the value is >= the field characteristic */
    61      x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL)
    62          & (t0 >= 0xFFFFEFFFFFC2FULL));
    63  
    64      /* Apply the final reduction (for constant-time behaviour, we do it always) */
    65      t0 += x * 0x1000003D1ULL;
    66      t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;
    67      t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL;
    68      t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL;
    69      t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL;
    70  
    71      /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */
    72      VERIFY_CHECK(t4 >> 48 == x);
    73  
    74      /* Mask off the possible multiple of 2^256 from the final reduction */
    75      t4 &= 0x0FFFFFFFFFFFFULL;
    76  
    77      r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4;
    78  }
    79  
    80  static void secp256k1_fe_impl_normalize_weak(secp256k1_fe *r) {
    81      uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4];
    82  
    83      /* Reduce t4 at the start so there will be at most a single carry from the first pass */
    84      uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL;
    85  
    86      /* The first pass ensures the magnitude is 1, ... */
    87      t0 += x * 0x1000003D1ULL;
    88      t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;
    89      t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL;
    90      t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL;
    91      t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL;
    92  
    93      /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */
    94      VERIFY_CHECK(t4 >> 49 == 0);
    95  
    96      r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4;
    97  }
    98  
    99  static void secp256k1_fe_impl_normalize_var(secp256k1_fe *r) {
   100      uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4];
   101  
   102      /* Reduce t4 at the start so there will be at most a single carry from the first pass */
   103      uint64_t m;
   104      uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL;
   105  
   106      /* The first pass ensures the magnitude is 1, ... */
   107      t0 += x * 0x1000003D1ULL;
   108      t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;
   109      t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1;
   110      t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2;
   111      t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3;
   112  
   113      /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */
   114      VERIFY_CHECK(t4 >> 49 == 0);
   115  
   116      /* At most a single final reduction is needed; check if the value is >= the field characteristic */
   117      x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL)
   118          & (t0 >= 0xFFFFEFFFFFC2FULL));
   119  
   120      if (x) {
   121          t0 += 0x1000003D1ULL;
   122          t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;
   123          t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL;
   124          t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL;
   125          t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL;
   126  
   127          /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */
   128          VERIFY_CHECK(t4 >> 48 == x);
   129  
   130          /* Mask off the possible multiple of 2^256 from the final reduction */
   131          t4 &= 0x0FFFFFFFFFFFFULL;
   132      }
   133  
   134      r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4;
   135  }
   136  
   137  static int secp256k1_fe_impl_normalizes_to_zero(const secp256k1_fe *r) {
   138      uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4];
   139  
   140      /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */
   141      uint64_t z0, z1;
   142  
   143      /* Reduce t4 at the start so there will be at most a single carry from the first pass */
   144      uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL;
   145  
   146      /* The first pass ensures the magnitude is 1, ... */
   147      t0 += x * 0x1000003D1ULL;
   148      t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; z0  = t0; z1  = t0 ^ 0x1000003D0ULL;
   149      t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1;
   150      t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2;
   151      t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3;
   152                                                  z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL;
   153  
   154      /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */
   155      VERIFY_CHECK(t4 >> 49 == 0);
   156  
   157      return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL);
   158  }
   159  
   160  static int secp256k1_fe_impl_normalizes_to_zero_var(const secp256k1_fe *r) {
   161      uint64_t t0, t1, t2, t3, t4;
   162      uint64_t z0, z1;
   163      uint64_t x;
   164  
   165      t0 = r->n[0];
   166      t4 = r->n[4];
   167  
   168      /* Reduce t4 at the start so there will be at most a single carry from the first pass */
   169      x = t4 >> 48;
   170  
   171      /* The first pass ensures the magnitude is 1, ... */
   172      t0 += x * 0x1000003D1ULL;
   173  
   174      /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */
   175      z0 = t0 & 0xFFFFFFFFFFFFFULL;
   176      z1 = z0 ^ 0x1000003D0ULL;
   177  
   178      /* Fast return path should catch the majority of cases */
   179      if ((z0 != 0ULL) & (z1 != 0xFFFFFFFFFFFFFULL)) {
   180          return 0;
   181      }
   182  
   183      t1 = r->n[1];
   184      t2 = r->n[2];
   185      t3 = r->n[3];
   186  
   187      t4 &= 0x0FFFFFFFFFFFFULL;
   188  
   189      t1 += (t0 >> 52);
   190      t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1;
   191      t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2;
   192      t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3;
   193                                                  z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL;
   194  
   195      /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */
   196      VERIFY_CHECK(t4 >> 49 == 0);
   197  
   198      return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL);
   199  }
   200  
   201  SECP256K1_INLINE static void secp256k1_fe_impl_set_int(secp256k1_fe *r, int a) {
   202      r->n[0] = a;
   203      r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0;
   204  }
   205  
   206  SECP256K1_INLINE static int secp256k1_fe_impl_is_zero(const secp256k1_fe *a) {
   207      const uint64_t *t = a->n;
   208      return (t[0] | t[1] | t[2] | t[3] | t[4]) == 0;
   209  }
   210  
   211  SECP256K1_INLINE static int secp256k1_fe_impl_is_odd(const secp256k1_fe *a) {
   212      return a->n[0] & 1;
   213  }
   214  
   215  static int secp256k1_fe_impl_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) {
   216      int i;
   217      for (i = 4; i >= 0; i--) {
   218          if (a->n[i] > b->n[i]) {
   219              return 1;
   220          }
   221          if (a->n[i] < b->n[i]) {
   222              return -1;
   223          }
   224      }
   225      return 0;
   226  }
   227  
   228  static void secp256k1_fe_impl_set_b32_mod(secp256k1_fe *r, const unsigned char *a) {
   229      r->n[0] = (uint64_t)a[31]
   230              | ((uint64_t)a[30] << 8)
   231              | ((uint64_t)a[29] << 16)
   232              | ((uint64_t)a[28] << 24)
   233              | ((uint64_t)a[27] << 32)
   234              | ((uint64_t)a[26] << 40)
   235              | ((uint64_t)(a[25] & 0xF)  << 48);
   236      r->n[1] = (uint64_t)((a[25] >> 4) & 0xF)
   237              | ((uint64_t)a[24] << 4)
   238              | ((uint64_t)a[23] << 12)
   239              | ((uint64_t)a[22] << 20)
   240              | ((uint64_t)a[21] << 28)
   241              | ((uint64_t)a[20] << 36)
   242              | ((uint64_t)a[19] << 44);
   243      r->n[2] = (uint64_t)a[18]
   244              | ((uint64_t)a[17] << 8)
   245              | ((uint64_t)a[16] << 16)
   246              | ((uint64_t)a[15] << 24)
   247              | ((uint64_t)a[14] << 32)
   248              | ((uint64_t)a[13] << 40)
   249              | ((uint64_t)(a[12] & 0xF) << 48);
   250      r->n[3] = (uint64_t)((a[12] >> 4) & 0xF)
   251              | ((uint64_t)a[11] << 4)
   252              | ((uint64_t)a[10] << 12)
   253              | ((uint64_t)a[9]  << 20)
   254              | ((uint64_t)a[8]  << 28)
   255              | ((uint64_t)a[7]  << 36)
   256              | ((uint64_t)a[6]  << 44);
   257      r->n[4] = (uint64_t)a[5]
   258              | ((uint64_t)a[4] << 8)
   259              | ((uint64_t)a[3] << 16)
   260              | ((uint64_t)a[2] << 24)
   261              | ((uint64_t)a[1] << 32)
   262              | ((uint64_t)a[0] << 40);
   263  }
   264  
   265  static int secp256k1_fe_impl_set_b32_limit(secp256k1_fe *r, const unsigned char *a) {
   266      secp256k1_fe_impl_set_b32_mod(r, a);
   267      return !((r->n[4] == 0x0FFFFFFFFFFFFULL) & ((r->n[3] & r->n[2] & r->n[1]) == 0xFFFFFFFFFFFFFULL) & (r->n[0] >= 0xFFFFEFFFFFC2FULL));
   268  }
   269  
   270  /** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */
   271  static void secp256k1_fe_impl_get_b32(unsigned char *r, const secp256k1_fe *a) {
   272      r[0] = (a->n[4] >> 40) & 0xFF;
   273      r[1] = (a->n[4] >> 32) & 0xFF;
   274      r[2] = (a->n[4] >> 24) & 0xFF;
   275      r[3] = (a->n[4] >> 16) & 0xFF;
   276      r[4] = (a->n[4] >> 8) & 0xFF;
   277      r[5] = a->n[4] & 0xFF;
   278      r[6] = (a->n[3] >> 44) & 0xFF;
   279      r[7] = (a->n[3] >> 36) & 0xFF;
   280      r[8] = (a->n[3] >> 28) & 0xFF;
   281      r[9] = (a->n[3] >> 20) & 0xFF;
   282      r[10] = (a->n[3] >> 12) & 0xFF;
   283      r[11] = (a->n[3] >> 4) & 0xFF;
   284      r[12] = ((a->n[2] >> 48) & 0xF) | ((a->n[3] & 0xF) << 4);
   285      r[13] = (a->n[2] >> 40) & 0xFF;
   286      r[14] = (a->n[2] >> 32) & 0xFF;
   287      r[15] = (a->n[2] >> 24) & 0xFF;
   288      r[16] = (a->n[2] >> 16) & 0xFF;
   289      r[17] = (a->n[2] >> 8) & 0xFF;
   290      r[18] = a->n[2] & 0xFF;
   291      r[19] = (a->n[1] >> 44) & 0xFF;
   292      r[20] = (a->n[1] >> 36) & 0xFF;
   293      r[21] = (a->n[1] >> 28) & 0xFF;
   294      r[22] = (a->n[1] >> 20) & 0xFF;
   295      r[23] = (a->n[1] >> 12) & 0xFF;
   296      r[24] = (a->n[1] >> 4) & 0xFF;
   297      r[25] = ((a->n[0] >> 48) & 0xF) | ((a->n[1] & 0xF) << 4);
   298      r[26] = (a->n[0] >> 40) & 0xFF;
   299      r[27] = (a->n[0] >> 32) & 0xFF;
   300      r[28] = (a->n[0] >> 24) & 0xFF;
   301      r[29] = (a->n[0] >> 16) & 0xFF;
   302      r[30] = (a->n[0] >> 8) & 0xFF;
   303      r[31] = a->n[0] & 0xFF;
   304  }
   305  
   306  SECP256K1_INLINE static void secp256k1_fe_impl_negate_unchecked(secp256k1_fe *r, const secp256k1_fe *a, int m) {
   307      /* For all legal values of m (0..31), the following properties hold: */
   308      VERIFY_CHECK(0xFFFFEFFFFFC2FULL * 2 * (m + 1) >= 0xFFFFFFFFFFFFFULL * 2 * m);
   309      VERIFY_CHECK(0xFFFFFFFFFFFFFULL * 2 * (m + 1) >= 0xFFFFFFFFFFFFFULL * 2 * m);
   310      VERIFY_CHECK(0x0FFFFFFFFFFFFULL * 2 * (m + 1) >= 0x0FFFFFFFFFFFFULL * 2 * m);
   311  
   312      /* Due to the properties above, the left hand in the subtractions below is never less than
   313       * the right hand. */
   314      r->n[0] = 0xFFFFEFFFFFC2FULL * 2 * (m + 1) - a->n[0];
   315      r->n[1] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[1];
   316      r->n[2] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[2];
   317      r->n[3] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[3];
   318      r->n[4] = 0x0FFFFFFFFFFFFULL * 2 * (m + 1) - a->n[4];
   319  }
   320  
   321  SECP256K1_INLINE static void secp256k1_fe_impl_mul_int_unchecked(secp256k1_fe *r, int a) {
   322      r->n[0] *= a;
   323      r->n[1] *= a;
   324      r->n[2] *= a;
   325      r->n[3] *= a;
   326      r->n[4] *= a;
   327  }
   328  
   329  SECP256K1_INLINE static void secp256k1_fe_impl_add_int(secp256k1_fe *r, int a) {
   330      r->n[0] += a;
   331  }
   332  
   333  SECP256K1_INLINE static void secp256k1_fe_impl_add(secp256k1_fe *r, const secp256k1_fe *a) {
   334      r->n[0] += a->n[0];
   335      r->n[1] += a->n[1];
   336      r->n[2] += a->n[2];
   337      r->n[3] += a->n[3];
   338      r->n[4] += a->n[4];
   339  }
   340  
   341  SECP256K1_INLINE static void secp256k1_fe_impl_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) {
   342      secp256k1_fe_mul_inner(r->n, a->n, b->n);
   343  }
   344  
   345  SECP256K1_INLINE static void secp256k1_fe_impl_sqr(secp256k1_fe *r, const secp256k1_fe *a) {
   346      secp256k1_fe_sqr_inner(r->n, a->n);
   347  }
   348  
   349  SECP256K1_INLINE static void secp256k1_fe_impl_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) {
   350      uint64_t mask0, mask1;
   351      volatile int vflag = flag;
   352      SECP256K1_CHECKMEM_CHECK_VERIFY(r->n, sizeof(r->n));
   353      mask0 = vflag + ~((uint64_t)0);
   354      mask1 = ~mask0;
   355      r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1);
   356      r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1);
   357      r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);
   358      r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);
   359      r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1);
   360  }
   361  
   362  static SECP256K1_INLINE void secp256k1_fe_impl_half(secp256k1_fe *r) {
   363      uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4];
   364      uint64_t one = (uint64_t)1;
   365      uint64_t mask = -(t0 & one) >> 12;
   366  
   367      /* Bounds analysis (over the rationals).
   368       *
   369       * Let m = r->magnitude
   370       *     C = 0xFFFFFFFFFFFFFULL * 2
   371       *     D = 0x0FFFFFFFFFFFFULL * 2
   372       *
   373       * Initial bounds: t0..t3 <= C * m
   374       *                     t4 <= D * m
   375       */
   376  
   377      t0 += 0xFFFFEFFFFFC2FULL & mask;
   378      t1 += mask;
   379      t2 += mask;
   380      t3 += mask;
   381      t4 += mask >> 4;
   382  
   383      VERIFY_CHECK((t0 & one) == 0);
   384  
   385      /* t0..t3: added <= C/2
   386       *     t4: added <= D/2
   387       *
   388       * Current bounds: t0..t3 <= C * (m + 1/2)
   389       *                     t4 <= D * (m + 1/2)
   390       */
   391  
   392      r->n[0] = (t0 >> 1) + ((t1 & one) << 51);
   393      r->n[1] = (t1 >> 1) + ((t2 & one) << 51);
   394      r->n[2] = (t2 >> 1) + ((t3 & one) << 51);
   395      r->n[3] = (t3 >> 1) + ((t4 & one) << 51);
   396      r->n[4] = (t4 >> 1);
   397  
   398      /* t0..t3: shifted right and added <= C/4 + 1/2
   399       *     t4: shifted right
   400       *
   401       * Current bounds: t0..t3 <= C * (m/2 + 1/2)
   402       *                     t4 <= D * (m/2 + 1/4)
   403       *
   404       * Therefore the output magnitude (M) has to be set such that:
   405       *     t0..t3: C * M >= C * (m/2 + 1/2)
   406       *         t4: D * M >= D * (m/2 + 1/4)
   407       *
   408       * It suffices for all limbs that, for any input magnitude m:
   409       *     M >= m/2 + 1/2
   410       *
   411       * and since we want the smallest such integer value for M:
   412       *     M == floor(m/2) + 1
   413       */
   414  }
   415  
   416  static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) {
   417      uint64_t mask0, mask1;
   418      volatile int vflag = flag;
   419      SECP256K1_CHECKMEM_CHECK_VERIFY(r->n, sizeof(r->n));
   420      mask0 = vflag + ~((uint64_t)0);
   421      mask1 = ~mask0;
   422      r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1);
   423      r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1);
   424      r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);
   425      r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);
   426  }
   427  
   428  static void secp256k1_fe_impl_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) {
   429      r->n[0] = a->n[0] | a->n[1] << 52;
   430      r->n[1] = a->n[1] >> 12 | a->n[2] << 40;
   431      r->n[2] = a->n[2] >> 24 | a->n[3] << 28;
   432      r->n[3] = a->n[3] >> 36 | a->n[4] << 16;
   433  }
   434  
   435  static SECP256K1_INLINE void secp256k1_fe_impl_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) {
   436      r->n[0] = a->n[0] & 0xFFFFFFFFFFFFFULL;
   437      r->n[1] = a->n[0] >> 52 | ((a->n[1] << 12) & 0xFFFFFFFFFFFFFULL);
   438      r->n[2] = a->n[1] >> 40 | ((a->n[2] << 24) & 0xFFFFFFFFFFFFFULL);
   439      r->n[3] = a->n[2] >> 28 | ((a->n[3] << 36) & 0xFFFFFFFFFFFFFULL);
   440      r->n[4] = a->n[3] >> 16;
   441  }
   442  
   443  static void secp256k1_fe_from_signed62(secp256k1_fe *r, const secp256k1_modinv64_signed62 *a) {
   444      const uint64_t M52 = UINT64_MAX >> 12;
   445      const uint64_t a0 = a->v[0], a1 = a->v[1], a2 = a->v[2], a3 = a->v[3], a4 = a->v[4];
   446  
   447      /* The output from secp256k1_modinv64{_var} should be normalized to range [0,modulus), and
   448       * have limbs in [0,2^62). The modulus is < 2^256, so the top limb must be below 2^(256-62*4).
   449       */
   450      VERIFY_CHECK(a0 >> 62 == 0);
   451      VERIFY_CHECK(a1 >> 62 == 0);
   452      VERIFY_CHECK(a2 >> 62 == 0);
   453      VERIFY_CHECK(a3 >> 62 == 0);
   454      VERIFY_CHECK(a4 >> 8 == 0);
   455  
   456      r->n[0] =  a0                   & M52;
   457      r->n[1] = (a0 >> 52 | a1 << 10) & M52;
   458      r->n[2] = (a1 >> 42 | a2 << 20) & M52;
   459      r->n[3] = (a2 >> 32 | a3 << 30) & M52;
   460      r->n[4] = (a3 >> 22 | a4 << 40);
   461  }
   462  
   463  static void secp256k1_fe_to_signed62(secp256k1_modinv64_signed62 *r, const secp256k1_fe *a) {
   464      const uint64_t M62 = UINT64_MAX >> 2;
   465      const uint64_t a0 = a->n[0], a1 = a->n[1], a2 = a->n[2], a3 = a->n[3], a4 = a->n[4];
   466  
   467      r->v[0] = (a0       | a1 << 52) & M62;
   468      r->v[1] = (a1 >> 10 | a2 << 42) & M62;
   469      r->v[2] = (a2 >> 20 | a3 << 32) & M62;
   470      r->v[3] = (a3 >> 30 | a4 << 22) & M62;
   471      r->v[4] =  a4 >> 40;
   472  }
   473  
   474  static const secp256k1_modinv64_modinfo secp256k1_const_modinfo_fe = {
   475      {{-0x1000003D1LL, 0, 0, 0, 256}},
   476      0x27C7F6E22DDACACFLL
   477  };
   478  
   479  static void secp256k1_fe_impl_inv(secp256k1_fe *r, const secp256k1_fe *x) {
   480      secp256k1_fe tmp = *x;
   481      secp256k1_modinv64_signed62 s;
   482  
   483      secp256k1_fe_normalize(&tmp);
   484      secp256k1_fe_to_signed62(&s, &tmp);
   485      secp256k1_modinv64(&s, &secp256k1_const_modinfo_fe);
   486      secp256k1_fe_from_signed62(r, &s);
   487  }
   488  
   489  static void secp256k1_fe_impl_inv_var(secp256k1_fe *r, const secp256k1_fe *x) {
   490      secp256k1_fe tmp = *x;
   491      secp256k1_modinv64_signed62 s;
   492  
   493      secp256k1_fe_normalize_var(&tmp);
   494      secp256k1_fe_to_signed62(&s, &tmp);
   495      secp256k1_modinv64_var(&s, &secp256k1_const_modinfo_fe);
   496      secp256k1_fe_from_signed62(r, &s);
   497  }
   498  
   499  static int secp256k1_fe_impl_is_square_var(const secp256k1_fe *x) {
   500      secp256k1_fe tmp;
   501      secp256k1_modinv64_signed62 s;
   502      int jac, ret;
   503  
   504      tmp = *x;
   505      secp256k1_fe_normalize_var(&tmp);
   506      /* secp256k1_jacobi64_maybe_var cannot deal with input 0. */
   507      if (secp256k1_fe_is_zero(&tmp)) return 1;
   508      secp256k1_fe_to_signed62(&s, &tmp);
   509      jac = secp256k1_jacobi64_maybe_var(&s, &secp256k1_const_modinfo_fe);
   510      if (jac == 0) {
   511          /* secp256k1_jacobi64_maybe_var failed to compute the Jacobi symbol. Fall back
   512           * to computing a square root. This should be extremely rare with random
   513           * input (except in VERIFY mode, where a lower iteration count is used). */
   514          secp256k1_fe dummy;
   515          ret = secp256k1_fe_sqrt(&dummy, &tmp);
   516      } else {
   517          ret = jac >= 0;
   518      }
   519      return ret;
   520  }
   521  
   522  #endif /* SECP256K1_FIELD_REPR_IMPL_H */