code: func expandPublicKey(key []byte) (*big.Int, *big.Int) {
  	Y := big.NewInt(0)
  	X := big.NewInt(0)
  	X.SetBytes(key[1:])
  
  	// y^2 = x^3 + ax^2 + b
  	// a = 0
  	// => y^2 = x^3 + b
  	ySquared := big.NewInt(0)
  	ySquared.Exp(X, big.NewInt(3), nil)
  	ySquared.Add(ySquared, curveParams.B)
  
  	Y.ModSqrt(ySquared, curveParams.P)
  
  	Ymod2 := big.NewInt(0)
  	Ymod2.Mod(Y, big.NewInt(2))
  
  	signY := uint64(key[0]) - 2
  	if signY != Ymod2.Uint64() {
  		Y.Sub(curveParams.P, Y)
  	}
  
  	return X, Y
  }
docs: // As described at https://crypto.stackexchange.com/a/8916