crypto/cloudflare/bn256: fix in-place addition and unmarshalling (#23419)

This commit is contained in:
Guillaume Ballet 2021-08-25 17:33:09 +02:00 committed by GitHub
parent d16214228f
commit 887902ea4d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 6 deletions

View File

@ -92,6 +92,19 @@ func TestTripartiteDiffieHellman(t *testing.T) {
} }
} }
func TestG2SelfAddition(t *testing.T) {
s, _ := rand.Int(rand.Reader, Order)
p := new(G2).ScalarBaseMult(s)
if !p.p.IsOnCurve() {
t.Fatal("p isn't on curve")
}
m := p.Add(p, p).Marshal()
if _, err := p.Unmarshal(m); err != nil {
t.Fatalf("p.Add(p, p) ∉ G₂: %v", err)
}
}
func BenchmarkG1(b *testing.B) { func BenchmarkG1(b *testing.B) {
x, _ := rand.Int(rand.Reader, Order) x, _ := rand.Int(rand.Reader, Order)
b.ResetTimer() b.ResetTimer()

View File

@ -171,15 +171,15 @@ func (c *curvePoint) Double(a *curvePoint) {
gfpAdd(t, d, d) gfpAdd(t, d, d)
gfpSub(&c.x, f, t) gfpSub(&c.x, f, t)
gfpMul(&c.z, &a.y, &a.z)
gfpAdd(&c.z, &c.z, &c.z)
gfpAdd(t, C, C) gfpAdd(t, C, C)
gfpAdd(t2, t, t) gfpAdd(t2, t, t)
gfpAdd(t, t2, t2) gfpAdd(t, t2, t2)
gfpSub(&c.y, d, &c.x) gfpSub(&c.y, d, &c.x)
gfpMul(t2, e, &c.y) gfpMul(t2, e, &c.y)
gfpSub(&c.y, t2, t) gfpSub(&c.y, t2, t)
gfpMul(t, &a.y, &a.z)
gfpAdd(&c.z, t, t)
} }
func (c *curvePoint) Mul(a *curvePoint, scalar *big.Int) { func (c *curvePoint) Mul(a *curvePoint, scalar *big.Int) {

View File

@ -61,6 +61,7 @@ func (e *gfP) Marshal(out []byte) {
func (e *gfP) Unmarshal(in []byte) error { func (e *gfP) Unmarshal(in []byte) error {
// Unmarshal the bytes into little endian form // Unmarshal the bytes into little endian form
for w := uint(0); w < 4; w++ { for w := uint(0); w < 4; w++ {
e[3-w] = 0
for b := uint(0); b < 8; b++ { for b := uint(0); b < 8; b++ {
e[3-w] += uint64(in[8*w+b]) << (56 - 8*b) e[3-w] += uint64(in[8*w+b]) << (56 - 8*b)
} }

View File

@ -150,15 +150,15 @@ func (c *twistPoint) Double(a *twistPoint) {
t.Add(d, d) t.Add(d, d)
c.x.Sub(f, t) c.x.Sub(f, t)
c.z.Mul(&a.y, &a.z)
c.z.Add(&c.z, &c.z)
t.Add(C, C) t.Add(C, C)
t2.Add(t, t) t2.Add(t, t)
t.Add(t2, t2) t.Add(t2, t2)
c.y.Sub(d, &c.x) c.y.Sub(d, &c.x)
t2.Mul(e, &c.y) t2.Mul(e, &c.y)
c.y.Sub(t2, t) c.y.Sub(t2, t)
t.Mul(&a.y, &a.z)
c.z.Add(t, t)
} }
func (c *twistPoint) Mul(a *twistPoint, scalar *big.Int) { func (c *twistPoint) Mul(a *twistPoint, scalar *big.Int) {