mirror of
https://github.com/emmansun/gmsm.git
synced 2025-04-27 04:36:19 +08:00
32 lines
854 B
Go
32 lines
854 B
Go
package bigmod
|
|
|
|
func (x *Nat) Set(y *Nat) *Nat {
|
|
return x.set(y)
|
|
}
|
|
|
|
// SetOverflowedBytes assigns x = (b mode (m-1)) + 1, where b is a slice of big-endian bytes.
|
|
//
|
|
// The output will be resized to the size of m and overwritten.
|
|
//
|
|
//go:norace
|
|
func (x *Nat) SetOverflowedBytes(b []byte, m *Modulus) *Nat {
|
|
mMinusOne := NewNat().set(m.nat)
|
|
mMinusOne.limbs[0]-- // due to m is odd, so we can safely subtract 1
|
|
mMinusOneM, _ := NewModulus(mMinusOne.Bytes(m))
|
|
one := NewNat().resetFor(m)
|
|
one.limbs[0] = 1
|
|
x.resetToBytes(b)
|
|
x = NewNat().Mod(x, mMinusOneM) // x = x mod (m-1)
|
|
x.add(one) // we can safely add 1, no need to check overflow
|
|
return x
|
|
}
|
|
|
|
// CmpGeq returns 1 if x >= y, and 0 otherwise.
|
|
//
|
|
// Both operands must have the same announced length.
|
|
//
|
|
//go:norace
|
|
func (x *Nat) CmpGeq(y *Nat) choice {
|
|
return x.cmpGeq(y)
|
|
}
|