func SecUnmarshal(curve elliptic.Curve, data []byte) (*big.Int, *big.Int) {
	Y := big.NewInt(0)
	X := big.NewInt(0)
	curveParams := curve.Params()
	if (data[0] &^ 1) != 2 {
		return nil, nil
	}
	X.SetBytes(data[1:])
	ySquared := big.NewInt(0)
	ySquared.Exp(X, three, nil)
	ySquared.Add(ySquared, curveParams.B)
	Y.ModSqrt(ySquared, curveParams.P)
	if Y.Bit(0) != uint(data[0]&1) {
		Y.Sub(curveParams.P, Y)
	}
	return X, Y
}
SecUnmarshal -- converts a point, serialised by Marshal, into an x, y pair.
On error, x = nil.
As described at https://crypto.stackexchange.com/a/8916.
package secp256k1
import (
	"crypto/elliptic"
	"math/big"
)
func SecMarshal(curve elliptic.Curve, x *big.Int, y *big.Int) []byte {
	byteLen := (curve.Params().BitSize + 7) >> 3
	ret := make([]byte, 1+byteLen)
	format := byte(0x02)
	if y.Bit(0) == 1 {
		format |= 0x01
	}
	ret[0] = format
	xBytes := x.Bytes()
	copy(ret[1+byteLen-len(xBytes):], xBytes)
	return ret
}