This abstraction will add clarity make it possible to use the same code with multiple curves.
The two interfaces will look something like:
type Curve interface {
PointFromXYBase10(string,string) *CurvePoint
PointFromXY(*big.Int,*big.Int) *CurvePoint
PointFromHash() *CurvePoint
Prime() *big.Int
Order() *big.Int
RandomN() *big.Int
RandomP() *big.Int
ScalarBaseMult(*big.Int) *CurvePoint
}
type CurvePoint interface {
Equals() ?
GetXY() (*big.Int,*big.Int)
SetFromXY(*big.Int, *big.Int)
IsOnCurve() bool
ScalarMult(*big.Int)
Add(*CurvePoint)
ParameterPointAdd(*big.Int,*big.Int)
HashPointAdd(*CurvePoint, *big.Int, *big.Int)
}