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 }