diff --git a/babyjub/babyjub.go b/babyjub/babyjub.go index d7d9ca3..4174c42 100644 --- a/babyjub/babyjub.go +++ b/babyjub/babyjub.go @@ -222,13 +222,26 @@ func (p *Point) Compress() [32]byte { // Decompress a compressed Point into p, and also returns the decompressed // Point. Returns error if the compressed Point is invalid. func (p *Point) Decompress(leBuf [32]byte) (*Point, error) { + var sign bool + sign, p.Y = CompressedPointToSignAndY(leBuf) + return PointFromSignAndY(sign, p.Y) +} + +// CompressedPointToSignAndY returns the sign and coordinate Y from a given +// compressed point. This method does not check that the Point belongs to the +// BabyJubJub curve, thus does not return error in such case. This method is +// intended to obtain the sign and the Y coordinate without checking if the +// point belongs to the curve, if the objective is to uncompress a point +// Decompress method should be used instead. +func CompressedPointToSignAndY(leBuf [32]byte) (bool, *big.Int) { sign := false + y := big.NewInt(0) if (leBuf[31] & 0x80) != 0x00 { //nolint:gomnd sign = true leBuf[31] = leBuf[31] & 0x7F //nolint:gomnd } - utils.SetBigIntFromLEBytes(p.Y, leBuf[:]) - return PointFromSignAndY(sign, p.Y) + utils.SetBigIntFromLEBytes(y, leBuf[:]) + return sign, y } // PointFromSignAndY returns a Point from a Sign and the Y coordinate