|
|
@ -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
|
|
|
|