github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/secp256k1/num.go (about)

     1  package secp256k1
     2  
     3  import (
     4  	"encoding/hex"
     5  	"fmt"
     6  	"math/big"
     7  )
     8  
     9  var (
    10  	BigInt1 *big.Int = new(big.Int).SetInt64(1)
    11  )
    12  
    13  type Number struct {
    14  	big.Int
    15  }
    16  
    17  func (a *Number) print(label string) {
    18  	fmt.Println(label, hex.EncodeToString(a.Bytes()))
    19  }
    20  
    21  func (r *Number) mod_mul(a, b, m *Number) {
    22  	r.Mul(&a.Int, &b.Int)
    23  	r.Mod(&r.Int, &m.Int)
    24  	return
    25  }
    26  
    27  func (r *Number) mod_inv(a, b *Number) {
    28  	r.ModInverse(&a.Int, &b.Int)
    29  	return
    30  }
    31  
    32  func (r *Number) mod(a *Number) {
    33  	r.Mod(&r.Int, &a.Int)
    34  	return
    35  }
    36  
    37  func (a *Number) set_hex(s string) {
    38  	a.SetString(s, 16)
    39  }
    40  
    41  func (num *Number) mask_bits(bits uint) {
    42  	mask := new(big.Int).Lsh(BigInt1, bits)
    43  	mask.Sub(mask, BigInt1)
    44  	num.Int.And(&num.Int, mask)
    45  }
    46  
    47  func (a *Number) split_exp(r1, r2 *Number) {
    48  	var bnc1, bnc2, bnn2, bnt1, bnt2 Number
    49  
    50  	bnn2.Int.Rsh(&TheCurve.Order.Int, 1)
    51  
    52  	bnc1.Mul(&a.Int, &TheCurve.a1b2.Int)
    53  	bnc1.Add(&bnc1.Int, &bnn2.Int)
    54  	bnc1.Div(&bnc1.Int, &TheCurve.Order.Int)
    55  
    56  	bnc2.Mul(&a.Int, &TheCurve.b1.Int)
    57  	bnc2.Add(&bnc2.Int, &bnn2.Int)
    58  	bnc2.Div(&bnc2.Int, &TheCurve.Order.Int)
    59  
    60  	bnt1.Mul(&bnc1.Int, &TheCurve.a1b2.Int)
    61  	bnt2.Mul(&bnc2.Int, &TheCurve.a2.Int)
    62  	bnt1.Add(&bnt1.Int, &bnt2.Int)
    63  	r1.Sub(&a.Int, &bnt1.Int)
    64  
    65  	bnt1.Mul(&bnc1.Int, &TheCurve.b1.Int)
    66  	bnt2.Mul(&bnc2.Int, &TheCurve.a1b2.Int)
    67  	r2.Sub(&bnt1.Int, &bnt2.Int)
    68  }
    69  
    70  func (a *Number) split(rl, rh *Number, bits uint) {
    71  	rl.Int.Set(&a.Int)
    72  	rh.Int.Rsh(&rl.Int, bits)
    73  	rl.mask_bits(bits)
    74  }
    75  
    76  func (num *Number) rsh(bits uint) {
    77  	num.Rsh(&num.Int, bits)
    78  }
    79  
    80  func (num *Number) inc() {
    81  	num.Add(&num.Int, BigInt1)
    82  }
    83  
    84  func (num *Number) rsh_x(bits uint) (res int) {
    85  	res = int(new(big.Int).And(&num.Int, new(big.Int).SetUint64((1<<bits)-1)).Uint64())
    86  	num.Rsh(&num.Int, bits)
    87  	return
    88  }
    89  
    90  func (num *Number) is_odd() bool {
    91  	return num.Bit(0) != 0
    92  }
    93  
    94  func (num *Number) get_bin(le int) []byte {
    95  	bts := num.Bytes()
    96  	if len(bts) > le {
    97  		panic("buffer too small")
    98  	}
    99  	if len(bts) == le {
   100  		return bts
   101  	}
   102  	return append(make([]byte, le-len(bts)), bts...)
   103  }
   104  
   105  func (num *Number) sub(a, b *Number) {
   106  	num.Sub(&a.Int, &b.Int)
   107  }
   108  
   109  func (num *Number) add(a, b *Number) {
   110  	num.Add(&a.Int, &b.Int)
   111  }
   112  
   113  func (num *Number) mul(a, b *Number) {
   114  	num.Mul(&a.Int, &b.Int)
   115  }
   116  
   117  func (num *Number) is_zero() bool {
   118  	return num.Sign() == 0
   119  }
   120  
   121  func (num *Number) is_below(a *Number) bool {
   122  	return num.Cmp(&a.Int) == -1
   123  }