forked from cloudflare/circl
-
Notifications
You must be signed in to change notification settings - Fork 1
/
twist_basemult.go
62 lines (53 loc) · 1.42 KB
/
twist_basemult.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package goldilocks
import (
"crypto/subtle"
mlsb "github.com/ReallyMeLabs/circl/math/mlsbset"
)
const (
// MLSBRecoding parameters
fxT = 448
fxV = 2
fxW = 3
fx2w1 = 1 << (uint(fxW) - 1)
)
// ScalarBaseMult returns kG where G is the generator point.
func (e twistCurve) ScalarBaseMult(k *Scalar) *twistPoint {
m, err := mlsb.New(fxT, fxV, fxW)
if err != nil {
panic(err)
}
if m.IsExtended() {
panic("not extended")
}
var isZero int
if k.IsZero() {
isZero = 1
}
subtle.ConstantTimeCopy(isZero, k[:], order[:])
minusK := *k
isEven := 1 - int(k[0]&0x1)
minusK.Neg()
subtle.ConstantTimeCopy(isEven, k[:], minusK[:])
c, err := m.Encode(k[:])
if err != nil {
panic(err)
}
gP := c.Exp(groupMLSB{})
P := gP.(*twistPoint)
P.cneg(uint(isEven))
return P
}
type groupMLSB struct{}
func (e groupMLSB) ExtendedEltP() mlsb.EltP { return nil }
func (e groupMLSB) Sqr(x mlsb.EltG) { x.(*twistPoint).Double() }
func (e groupMLSB) Mul(x mlsb.EltG, y mlsb.EltP) { x.(*twistPoint).mixAddZ1(y.(*preTwistPointAffine)) }
func (e groupMLSB) Identity() mlsb.EltG { return twistCurve{}.Identity() }
func (e groupMLSB) NewEltP() mlsb.EltP { return &preTwistPointAffine{} }
func (e groupMLSB) Lookup(a mlsb.EltP, v uint, s, u int32) {
Tabj := &tabFixMult[v]
P := a.(*preTwistPointAffine)
for k := range Tabj {
P.cmov(&Tabj[k], uint(subtle.ConstantTimeEq(int32(k), u)))
}
P.cneg(int(s >> 31))
}