From 6635ad9975e2df3ac42b2a95a40b4803628ff68a Mon Sep 17 00:00:00 2001 From: Sad Pencil Date: Fri, 22 Feb 2019 23:31:27 +0000 Subject: [PATCH] bn256: fix String methods when g.p == nil Previously, when g.p == nil, String() crashed. In other method like Add(), a point with g.p == nil is treated as an identity element. Besides, the following code is the only way to get an identity element outside the library: g := bn256.G1{}. In this situation, g.p == nil. For example, the following code will crash: package main import ( "fmt" "golang.org/x/crypto/bn256" ) func main() { g := bn256.G1{} fmt.Println(g.String()) } Change-Id: Ied6f7c8197e7b79b0913c000a9cf1cf68f8188a9 GitHub-Last-Rev: 23246486a982ea54d6023726e048c74f02089f25 GitHub-Pull-Request: golang/crypto#75 Reviewed-on: https://go-review.googlesource.com/c/163118 TryBot-Result: Gobot Gobot Reviewed-by: Filippo Valsorda Run-TryBot: Filippo Valsorda --- bn256/bn256.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/bn256/bn256.go b/bn256/bn256.go index b081c6a..9c99fcd 100644 --- a/bn256/bn256.go +++ b/bn256/bn256.go @@ -56,6 +56,9 @@ func RandomG1(r io.Reader) (*big.Int, *G1, error) { } func (e *G1) String() string { + if e.p == nil { + return "bn256.G1" + newCurvePoint(nil).String() + } return "bn256.G1" + e.p.String() } @@ -178,6 +181,9 @@ func RandomG2(r io.Reader) (*big.Int, *G2, error) { } func (e *G2) String() string { + if e.p == nil { + return "bn256.G2" + newTwistPoint(nil).String() + } return "bn256.G2" + e.p.String() } @@ -281,8 +287,11 @@ type GT struct { p *gfP12 } -func (g *GT) String() string { - return "bn256.GT" + g.p.String() +func (e *GT) String() string { + if e.p == nil { + return "bn256.GT" + newGFp12(nil).String() + } + return "bn256.GT" + e.p.String() } // ScalarMult sets e to a*k and then returns e.