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

     1  /***********************************************************************
     2   * Copyright (c) 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_SCALAR_IMPL_H
     8  #define SECP256K1_SCALAR_IMPL_H
     9  
    10  #ifdef VERIFY
    11  #include <string.h>
    12  #endif
    13  
    14  #include "scalar.h"
    15  #include "util.h"
    16  
    17  #if defined(EXHAUSTIVE_TEST_ORDER)
    18  #include "scalar_low_impl.h"
    19  #elif defined(SECP256K1_WIDEMUL_INT128)
    20  #include "scalar_4x64_impl.h"
    21  #elif defined(SECP256K1_WIDEMUL_INT64)
    22  #include "scalar_8x32_impl.h"
    23  #else
    24  #error "Please select wide multiplication implementation"
    25  #endif
    26  
    27  static const secp256k1_scalar secp256k1_scalar_one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
    28  static const secp256k1_scalar secp256k1_scalar_zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
    29  
    30  SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) {
    31      secp256k1_memclear(r, sizeof(secp256k1_scalar));
    32  }
    33  
    34  static int secp256k1_scalar_set_b32_seckey(secp256k1_scalar *r, const unsigned char *bin) {
    35      int overflow;
    36      secp256k1_scalar_set_b32(r, bin, &overflow);
    37  
    38      SECP256K1_SCALAR_VERIFY(r);
    39      return (!overflow) & (!secp256k1_scalar_is_zero(r));
    40  }
    41  
    42  static void secp256k1_scalar_verify(const secp256k1_scalar *r) {
    43      VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0);
    44  
    45      (void)r;
    46  }
    47  
    48  #if defined(EXHAUSTIVE_TEST_ORDER)
    49  /* Begin of section generated by sage/gen_exhaustive_groups.sage. */
    50  #  if EXHAUSTIVE_TEST_ORDER == 7
    51  #    define EXHAUSTIVE_TEST_LAMBDA 2
    52  #  elif EXHAUSTIVE_TEST_ORDER == 13
    53  #    define EXHAUSTIVE_TEST_LAMBDA 9
    54  #  elif EXHAUSTIVE_TEST_ORDER == 199
    55  #    define EXHAUSTIVE_TEST_LAMBDA 92
    56  #  else
    57  #    error No known lambda for the specified exhaustive test group order.
    58  #  endif
    59  /* End of section generated by sage/gen_exhaustive_groups.sage. */
    60  
    61  /**
    62   * Find r1 and r2 given k, such that r1 + r2 * lambda == k mod n; unlike in the
    63   * full case we don't bother making r1 and r2 be small, we just want them to be
    64   * nontrivial to get full test coverage for the exhaustive tests. We therefore
    65   * (arbitrarily) set r2 = k + 5 (mod n) and r1 = k - r2 * lambda (mod n).
    66   */
    67  static void secp256k1_scalar_split_lambda(secp256k1_scalar * SECP256K1_RESTRICT r1, secp256k1_scalar * SECP256K1_RESTRICT r2, const secp256k1_scalar * SECP256K1_RESTRICT k) {
    68      SECP256K1_SCALAR_VERIFY(k);
    69      VERIFY_CHECK(r1 != k);
    70      VERIFY_CHECK(r2 != k);
    71      VERIFY_CHECK(r1 != r2);
    72  
    73      *r2 = (*k + 5) % EXHAUSTIVE_TEST_ORDER;
    74      *r1 = (*k + (EXHAUSTIVE_TEST_ORDER - *r2) * EXHAUSTIVE_TEST_LAMBDA) % EXHAUSTIVE_TEST_ORDER;
    75  
    76      SECP256K1_SCALAR_VERIFY(r1);
    77      SECP256K1_SCALAR_VERIFY(r2);
    78  }
    79  #else
    80  /**
    81   * The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where
    82   * lambda is: */
    83  static const secp256k1_scalar secp256k1_const_lambda = SECP256K1_SCALAR_CONST(
    84      0x5363AD4CUL, 0xC05C30E0UL, 0xA5261C02UL, 0x8812645AUL,
    85      0x122E22EAUL, 0x20816678UL, 0xDF02967CUL, 0x1B23BD72UL
    86  );
    87  
    88  #ifdef VERIFY
    89  static void secp256k1_scalar_split_lambda_verify(const secp256k1_scalar *r1, const secp256k1_scalar *r2, const secp256k1_scalar *k);
    90  #endif
    91  
    92  /*
    93   * Both lambda and beta are primitive cube roots of unity.  That is lambda^3 == 1 mod n and
    94   * beta^3 == 1 mod p, where n is the curve order and p is the field order.
    95   *
    96   * Furthermore, because (X^3 - 1) = (X - 1)(X^2 + X + 1), the primitive cube roots of unity are
    97   * roots of X^2 + X + 1.  Therefore lambda^2 + lambda == -1 mod n and beta^2 + beta == -1 mod p.
    98   * (The other primitive cube roots of unity are lambda^2 and beta^2 respectively.)
    99   *
   100   * Let l = -1/2 + i*sqrt(3)/2, the complex root of X^2 + X + 1. We can define a ring
   101   * homomorphism phi : Z[l] -> Z_n where phi(a + b*l) == a + b*lambda mod n. The kernel of phi
   102   * is a lattice over Z[l] (considering Z[l] as a Z-module). This lattice is generated by a
   103   * reduced basis {a1 + b1*l, a2 + b2*l} where
   104   *
   105   * - a1 =      {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15}
   106   * - b1 =     -{0xe4,0x43,0x7e,0xd6,0x01,0x0e,0x88,0x28,0x6f,0x54,0x7f,0xa9,0x0a,0xbf,0xe4,0xc3}
   107   * - a2 = {0x01,0x14,0xca,0x50,0xf7,0xa8,0xe2,0xf3,0xf6,0x57,0xc1,0x10,0x8d,0x9d,0x44,0xcf,0xd8}
   108   * - b2 =      {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15}
   109   *
   110   * "Guide to Elliptic Curve Cryptography" (Hankerson, Menezes, Vanstone) gives an algorithm
   111   * (algorithm 3.74) to find k1 and k2 given k, such that k1 + k2 * lambda == k mod n, and k1
   112   * and k2 are small in absolute value.
   113   *
   114   * The algorithm computes c1 = round(b2 * k / n) and c2 = round((-b1) * k / n), and gives
   115   * k1 = k - (c1*a1 + c2*a2) and k2 = -(c1*b1 + c2*b2). Instead, we use modular arithmetic, and
   116   * compute r2 = k2 mod n, and r1 = k1 mod n = (k - r2 * lambda) mod n, avoiding the need for
   117   * the constants a1 and a2.
   118   *
   119   * g1, g2 are precomputed constants used to replace division with a rounded multiplication
   120   * when decomposing the scalar for an endomorphism-based point multiplication.
   121   *
   122   * The possibility of using precomputed estimates is mentioned in "Guide to Elliptic Curve
   123   * Cryptography" (Hankerson, Menezes, Vanstone) in section 3.5.
   124   *
   125   * The derivation is described in the paper "Efficient Software Implementation of Public-Key
   126   * Cryptography on Sensor Networks Using the MSP430X Microcontroller" (Gouvea, Oliveira, Lopez),
   127   * Section 4.3 (here we use a somewhat higher-precision estimate):
   128   * d = a1*b2 - b1*a2
   129   * g1 = round(2^384 * b2/d)
   130   * g2 = round(2^384 * (-b1)/d)
   131   *
   132   * (Note that d is also equal to the curve order, n, here because [a1,b1] and [a2,b2]
   133   * can be found as outputs of the Extended Euclidean Algorithm on inputs n and lambda).
   134   *
   135   * The function below splits k into r1 and r2, such that
   136   * - r1 + lambda * r2 == k (mod n)
   137   * - either r1 < 2^128 or -r1 mod n < 2^128
   138   * - either r2 < 2^128 or -r2 mod n < 2^128
   139   *
   140   * See proof below.
   141   */
   142  static void secp256k1_scalar_split_lambda(secp256k1_scalar * SECP256K1_RESTRICT r1, secp256k1_scalar * SECP256K1_RESTRICT r2, const secp256k1_scalar * SECP256K1_RESTRICT k) {
   143      secp256k1_scalar c1, c2;
   144      static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST(
   145          0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
   146          0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C3UL
   147      );
   148      static const secp256k1_scalar minus_b2 = SECP256K1_SCALAR_CONST(
   149          0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL,
   150          0x8A280AC5UL, 0x0774346DUL, 0xD765CDA8UL, 0x3DB1562CUL
   151      );
   152      static const secp256k1_scalar g1 = SECP256K1_SCALAR_CONST(
   153          0x3086D221UL, 0xA7D46BCDUL, 0xE86C90E4UL, 0x9284EB15UL,
   154          0x3DAA8A14UL, 0x71E8CA7FUL, 0xE893209AUL, 0x45DBB031UL
   155      );
   156      static const secp256k1_scalar g2 = SECP256K1_SCALAR_CONST(
   157          0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C4UL,
   158          0x221208ACUL, 0x9DF506C6UL, 0x1571B4AEUL, 0x8AC47F71UL
   159      );
   160      SECP256K1_SCALAR_VERIFY(k);
   161      VERIFY_CHECK(r1 != k);
   162      VERIFY_CHECK(r2 != k);
   163      VERIFY_CHECK(r1 != r2);
   164  
   165      /* these _var calls are constant time since the shift amount is constant */
   166      secp256k1_scalar_mul_shift_var(&c1, k, &g1, 384);
   167      secp256k1_scalar_mul_shift_var(&c2, k, &g2, 384);
   168      secp256k1_scalar_mul(&c1, &c1, &minus_b1);
   169      secp256k1_scalar_mul(&c2, &c2, &minus_b2);
   170      secp256k1_scalar_add(r2, &c1, &c2);
   171      secp256k1_scalar_mul(r1, r2, &secp256k1_const_lambda);
   172      secp256k1_scalar_negate(r1, r1);
   173      secp256k1_scalar_add(r1, r1, k);
   174  
   175      SECP256K1_SCALAR_VERIFY(r1);
   176      SECP256K1_SCALAR_VERIFY(r2);
   177  #ifdef VERIFY
   178      secp256k1_scalar_split_lambda_verify(r1, r2, k);
   179  #endif
   180  }
   181  
   182  #ifdef VERIFY
   183  /*
   184   * Proof for secp256k1_scalar_split_lambda's bounds.
   185   *
   186   * Let
   187   *  - epsilon1 = 2^256 * |g1/2^384 - b2/d|
   188   *  - epsilon2 = 2^256 * |g2/2^384 - (-b1)/d|
   189   *  - c1 = round(k*g1/2^384)
   190   *  - c2 = round(k*g2/2^384)
   191   *
   192   * Lemma 1: |c1 - k*b2/d| < 2^-1 + epsilon1
   193   *
   194   *    |c1 - k*b2/d|
   195   *  =
   196   *    |c1 - k*g1/2^384 + k*g1/2^384 - k*b2/d|
   197   * <=   {triangle inequality}
   198   *    |c1 - k*g1/2^384| + |k*g1/2^384 - k*b2/d|
   199   *  =
   200   *    |c1 - k*g1/2^384| + k*|g1/2^384 - b2/d|
   201   * <    {rounding in c1 and 0 <= k < 2^256}
   202   *    2^-1 + 2^256 * |g1/2^384 - b2/d|
   203   *  =   {definition of epsilon1}
   204   *    2^-1 + epsilon1
   205   *
   206   * Lemma 2: |c2 - k*(-b1)/d| < 2^-1 + epsilon2
   207   *
   208   *    |c2 - k*(-b1)/d|
   209   *  =
   210   *    |c2 - k*g2/2^384 + k*g2/2^384 - k*(-b1)/d|
   211   * <=   {triangle inequality}
   212   *    |c2 - k*g2/2^384| + |k*g2/2^384 - k*(-b1)/d|
   213   *  =
   214   *    |c2 - k*g2/2^384| + k*|g2/2^384 - (-b1)/d|
   215   * <    {rounding in c2 and 0 <= k < 2^256}
   216   *    2^-1 + 2^256 * |g2/2^384 - (-b1)/d|
   217   *  =   {definition of epsilon2}
   218   *    2^-1 + epsilon2
   219   *
   220   * Let
   221   *  - k1 = k - c1*a1 - c2*a2
   222   *  - k2 = - c1*b1 - c2*b2
   223   *
   224   * Lemma 3: |k1| < (a1 + a2 + 1)/2 < 2^128
   225   *
   226   *    |k1|
   227   *  =   {definition of k1}
   228   *    |k - c1*a1 - c2*a2|
   229   *  =   {(a1*b2 - b1*a2)/n = 1}
   230   *    |k*(a1*b2 - b1*a2)/n - c1*a1 - c2*a2|
   231   *  =
   232   *    |a1*(k*b2/n - c1) + a2*(k*(-b1)/n - c2)|
   233   * <=   {triangle inequality}
   234   *    a1*|k*b2/n - c1| + a2*|k*(-b1)/n - c2|
   235   * <    {Lemma 1 and Lemma 2}
   236   *    a1*(2^-1 + epsilon1) + a2*(2^-1 + epsilon2)
   237   * <    {rounding up to an integer}
   238   *    (a1 + a2 + 1)/2
   239   * <    {rounding up to a power of 2}
   240   *    2^128
   241   *
   242   * Lemma 4: |k2| < (-b1 + b2)/2 + 1 < 2^128
   243   *
   244   *    |k2|
   245   *  =   {definition of k2}
   246   *    |- c1*a1 - c2*a2|
   247   *  =   {(b1*b2 - b1*b2)/n = 0}
   248   *    |k*(b1*b2 - b1*b2)/n - c1*b1 - c2*b2|
   249   *  =
   250   *    |b1*(k*b2/n - c1) + b2*(k*(-b1)/n - c2)|
   251   * <=   {triangle inequality}
   252   *    (-b1)*|k*b2/n - c1| + b2*|k*(-b1)/n - c2|
   253   * <    {Lemma 1 and Lemma 2}
   254   *    (-b1)*(2^-1 + epsilon1) + b2*(2^-1 + epsilon2)
   255   * <    {rounding up to an integer}
   256   *    (-b1 + b2)/2 + 1
   257   * <    {rounding up to a power of 2}
   258   *    2^128
   259   *
   260   * Let
   261   *  - r2 = k2 mod n
   262   *  - r1 = k - r2*lambda mod n.
   263   *
   264   * Notice that r1 is defined such that r1 + r2 * lambda == k (mod n).
   265   *
   266   * Lemma 5: r1 == k1 mod n.
   267   *
   268   *    r1
   269   * ==   {definition of r1 and r2}
   270   *    k - k2*lambda
   271   * ==   {definition of k2}
   272   *    k - (- c1*b1 - c2*b2)*lambda
   273   * ==
   274   *    k + c1*b1*lambda + c2*b2*lambda
   275   * ==  {a1 + b1*lambda == 0 mod n and a2 + b2*lambda == 0 mod n}
   276   *    k - c1*a1 - c2*a2
   277   * ==  {definition of k1}
   278   *    k1
   279   *
   280   * From Lemma 3, Lemma 4, Lemma 5 and the definition of r2, we can conclude that
   281   *
   282   *  - either r1 < 2^128 or -r1 mod n < 2^128
   283   *  - either r2 < 2^128 or -r2 mod n < 2^128.
   284   *
   285   * Q.E.D.
   286   */
   287  static void secp256k1_scalar_split_lambda_verify(const secp256k1_scalar *r1, const secp256k1_scalar *r2, const secp256k1_scalar *k) {
   288      secp256k1_scalar s;
   289      unsigned char buf1[32];
   290      unsigned char buf2[32];
   291  
   292      /* (a1 + a2 + 1)/2 is 0xa2a8918ca85bafe22016d0b917e4dd77 */
   293      static const unsigned char k1_bound[32] = {
   294          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   295          0xa2, 0xa8, 0x91, 0x8c, 0xa8, 0x5b, 0xaf, 0xe2, 0x20, 0x16, 0xd0, 0xb9, 0x17, 0xe4, 0xdd, 0x77
   296      };
   297  
   298      /* (-b1 + b2)/2 + 1 is 0x8a65287bd47179fb2be08846cea267ed */
   299      static const unsigned char k2_bound[32] = {
   300          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   301          0x8a, 0x65, 0x28, 0x7b, 0xd4, 0x71, 0x79, 0xfb, 0x2b, 0xe0, 0x88, 0x46, 0xce, 0xa2, 0x67, 0xed
   302      };
   303  
   304      secp256k1_scalar_mul(&s, &secp256k1_const_lambda, r2);
   305      secp256k1_scalar_add(&s, &s, r1);
   306      VERIFY_CHECK(secp256k1_scalar_eq(&s, k));
   307  
   308      secp256k1_scalar_negate(&s, r1);
   309      secp256k1_scalar_get_b32(buf1, r1);
   310      secp256k1_scalar_get_b32(buf2, &s);
   311      VERIFY_CHECK(secp256k1_memcmp_var(buf1, k1_bound, 32) < 0 || secp256k1_memcmp_var(buf2, k1_bound, 32) < 0);
   312  
   313      secp256k1_scalar_negate(&s, r2);
   314      secp256k1_scalar_get_b32(buf1, r2);
   315      secp256k1_scalar_get_b32(buf2, &s);
   316      VERIFY_CHECK(secp256k1_memcmp_var(buf1, k2_bound, 32) < 0 || secp256k1_memcmp_var(buf2, k2_bound, 32) < 0);
   317  }
   318  #endif /* VERIFY */
   319  #endif /* !defined(EXHAUSTIVE_TEST_ORDER) */
   320  
   321  #endif /* SECP256K1_SCALAR_IMPL_H */