github.com/guiltylotus/go-ethereum@v1.9.7/crypto/secp256k1/libsecp256k1/src/scalar_low_impl.h (about)

     1  /**********************************************************************
     2   * Copyright (c) 2015 Andrew Poelstra                                 *
     3   * Distributed under the MIT software license, see the accompanying   *
     4   * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
     5   **********************************************************************/
     6  
     7  #ifndef _SECP256K1_SCALAR_REPR_IMPL_H_
     8  #define _SECP256K1_SCALAR_REPR_IMPL_H_
     9  
    10  #include "scalar.h"
    11  
    12  #include <string.h>
    13  
    14  SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) {
    15      return !(*a & 1);
    16  }
    17  
    18  SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { *r = 0; }
    19  SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { *r = v; }
    20  
    21  SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {
    22      if (offset < 32)
    23          return ((*a >> offset) & ((((uint32_t)1) << count) - 1));
    24      else
    25          return 0;
    26  }
    27  
    28  SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {
    29      return secp256k1_scalar_get_bits(a, offset, count);
    30  }
    31  
    32  SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { return *a >= EXHAUSTIVE_TEST_ORDER; }
    33  
    34  static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {
    35      *r = (*a + *b) % EXHAUSTIVE_TEST_ORDER;
    36      return *r < *b;
    37  }
    38  
    39  static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) {
    40      if (flag && bit < 32)
    41          *r += (1 << bit);
    42  #ifdef VERIFY
    43      VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0);
    44  #endif
    45  }
    46  
    47  static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) {
    48      const int base = 0x100 % EXHAUSTIVE_TEST_ORDER;
    49      int i;
    50      *r = 0;
    51      for (i = 0; i < 32; i++) {
    52         *r = ((*r * base) + b32[i]) % EXHAUSTIVE_TEST_ORDER;
    53      }
    54      /* just deny overflow, it basically always happens */
    55      if (overflow) *overflow = 0;
    56  }
    57  
    58  static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) {
    59      memset(bin, 0, 32);
    60      bin[28] = *a >> 24; bin[29] = *a >> 16; bin[30] = *a >> 8; bin[31] = *a;
    61  }
    62  
    63  SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) {
    64      return *a == 0;
    65  }
    66  
    67  static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) {
    68      if (*a == 0) {
    69          *r = 0;
    70      } else {
    71          *r = EXHAUSTIVE_TEST_ORDER - *a;
    72      }
    73  }
    74  
    75  SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) {
    76      return *a == 1;
    77  }
    78  
    79  static int secp256k1_scalar_is_high(const secp256k1_scalar *a) {
    80      return *a > EXHAUSTIVE_TEST_ORDER / 2;
    81  }
    82  
    83  static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {
    84      if (flag) secp256k1_scalar_negate(r, r);
    85      return flag ? -1 : 1;
    86  }
    87  
    88  static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {
    89      *r = (*a * *b) % EXHAUSTIVE_TEST_ORDER;
    90  }
    91  
    92  static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) {
    93      int ret;
    94      VERIFY_CHECK(n > 0);
    95      VERIFY_CHECK(n < 16);
    96      ret = *r & ((1 << n) - 1);
    97      *r >>= n;
    98      return ret;
    99  }
   100  
   101  static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) {
   102      *r = (*a * *a) % EXHAUSTIVE_TEST_ORDER;
   103  }
   104  
   105  static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) {
   106      *r1 = *a;
   107      *r2 = 0;
   108  }
   109  
   110  SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) {
   111      return *a == *b;
   112  }
   113  
   114  #endif