package edwards25519
import (
)
type projP1xP1 struct {
X, Y, Z, T field.Element
}
type projP2 struct {
X, Y, Z field.Element
}
type Point struct {
x, y, z, t field.Element
_ incomparable
}
type incomparable [0]func()
func ( ...*Point) {
for , := range {
if .x == (field.Element{}) && .y == (field.Element{}) {
panic("edwards25519: use of uninitialized Point")
}
}
}
type projCached struct {
YplusX, YminusX, Z, T2d field.Element
}
type affineCached struct {
YplusX, YminusX, T2d field.Element
}
func ( *projP2) () *projP2 {
.X.Zero()
.Y.One()
.Z.One()
return
}
var identity, _ = new(Point).SetBytes([]byte{
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
func () *Point {
return new(Point).Set(identity)
}
var generator, _ = new(Point).SetBytes([]byte{
0x58, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66})
func () *Point {
return new(Point).Set(generator)
}
func ( *projCached) () *projCached {
.YplusX.One()
.YminusX.One()
.Z.One()
.T2d.Zero()
return
}
func ( *affineCached) () *affineCached {
.YplusX.One()
.YminusX.One()
.T2d.Zero()
return
}
func ( *Point) ( *Point) *Point {
* = *
return
}
func ( *Point) () []byte {
var [32]byte
return .bytes(&)
}
func ( *Point) ( *[32]byte) []byte {
checkInitialized()
var , , field.Element
.Invert(&.z)
.Multiply(&.x, &)
.Multiply(&.y, &)
:= copyFieldElement(, &)
[31] |= byte(.IsNegative() << 7)
return
}
var feOne = new(field.Element).One()
func ( *Point) ( []byte) (*Point, error) {
if len() != 32 {
return nil, errors.New("edwards25519: invalid point encoding length")
}
:= new(field.Element).SetBytes()
:= new(field.Element).Square()
:= new(field.Element).Subtract(, feOne)
:= new(field.Element).Multiply(, d)
= .Add(, feOne)
, := new(field.Element).SqrtRatio(, )
if == 0 {
return nil, errors.New("edwards25519: invalid point encoding")
}
:= new(field.Element).Negate()
= .Select(, , int([31]>>7))
.x.Set()
.y.Set()
.z.One()
.t.Multiply(, )
return , nil
}
func ( *[32]byte, *field.Element) []byte {
copy([:], .Bytes())
return [:]
}
func ( *projP2) ( *projP1xP1) *projP2 {
.X.Multiply(&.X, &.T)
.Y.Multiply(&.Y, &.Z)
.Z.Multiply(&.Z, &.T)
return
}
func ( *projP2) ( *Point) *projP2 {
.X.Set(&.x)
.Y.Set(&.y)
.Z.Set(&.z)
return
}
func ( *Point) ( *projP1xP1) *Point {
.x.Multiply(&.X, &.T)
.y.Multiply(&.Y, &.Z)
.z.Multiply(&.Z, &.T)
.t.Multiply(&.X, &.Y)
return
}
func ( *Point) ( *projP2) *Point {
.x.Multiply(&.X, &.Z)
.y.Multiply(&.Y, &.Z)
.z.Square(&.Z)
.t.Multiply(&.X, &.Y)
return
}
var d = new(field.Element).SetBytes([]byte{
0xa3, 0x78, 0x59, 0x13, 0xca, 0x4d, 0xeb, 0x75,
0xab, 0xd8, 0x41, 0x41, 0x4d, 0x0a, 0x70, 0x00,
0x98, 0xe8, 0x79, 0x77, 0x79, 0x40, 0xc7, 0x8c,
0x73, 0xfe, 0x6f, 0x2b, 0xee, 0x6c, 0x03, 0x52})
var d2 = new(field.Element).Add(d, d)
func ( *projCached) ( *Point) *projCached {
.YplusX.Add(&.y, &.x)
.YminusX.Subtract(&.y, &.x)
.Z.Set(&.z)
.T2d.Multiply(&.t, d2)
return
}
func ( *affineCached) ( *Point) *affineCached {
.YplusX.Add(&.y, &.x)
.YminusX.Subtract(&.y, &.x)
.T2d.Multiply(&.t, d2)
var field.Element
.Invert(&.z)
.YplusX.Multiply(&.YplusX, &)
.YminusX.Multiply(&.YminusX, &)
.T2d.Multiply(&.T2d, &)
return
}
func ( *Point) (, *Point) *Point {
checkInitialized(, )
:= new(projCached).FromP3()
:= new(projP1xP1).Add(, )
return .fromP1xP1()
}
func ( *Point) (, *Point) *Point {
checkInitialized(, )
:= new(projCached).FromP3()
:= new(projP1xP1).Sub(, )
return .fromP1xP1()
}
func ( *projP1xP1) ( *Point, *projCached) *projP1xP1 {
var , , , , , field.Element
.Add(&.y, &.x)
.Subtract(&.y, &.x)
.Multiply(&, &.YplusX)
.Multiply(&, &.YminusX)
.Multiply(&.t, &.T2d)
.Multiply(&.z, &.Z)
.Add(&, &)
.X.Subtract(&, &)
.Y.Add(&, &)
.Z.Add(&, &)
.T.Subtract(&, &)
return
}
func ( *projP1xP1) ( *Point, *projCached) *projP1xP1 {
var , , , , , field.Element
.Add(&.y, &.x)
.Subtract(&.y, &.x)
.Multiply(&, &.YminusX)
.Multiply(&, &.YplusX)
.Multiply(&.t, &.T2d)
.Multiply(&.z, &.Z)
.Add(&, &)
.X.Subtract(&, &)
.Y.Add(&, &)
.Z.Subtract(&, &)
.T.Add(&, &)
return
}
func ( *projP1xP1) ( *Point, *affineCached) *projP1xP1 {
var , , , , , field.Element
.Add(&.y, &.x)
.Subtract(&.y, &.x)
.Multiply(&, &.YplusX)
.Multiply(&, &.YminusX)
.Multiply(&.t, &.T2d)
.Add(&.z, &.z)
.X.Subtract(&, &)
.Y.Add(&, &)
.Z.Add(&, &)
.T.Subtract(&, &)
return
}
func ( *projP1xP1) ( *Point, *affineCached) *projP1xP1 {
var , , , , , field.Element
.Add(&.y, &.x)
.Subtract(&.y, &.x)
.Multiply(&, &.YminusX)
.Multiply(&, &.YplusX)
.Multiply(&.t, &.T2d)
.Add(&.z, &.z)
.X.Subtract(&, &)
.Y.Add(&, &)
.Z.Subtract(&, &)
.T.Add(&, &)
return
}
func ( *projP1xP1) ( *projP2) *projP1xP1 {
var , , , field.Element
.Square(&.X)
.Square(&.Y)
.Square(&.Z)
.Add(&, &)
.Add(&.X, &.Y)
.Square(&)
.Y.Add(&, &)
.Z.Subtract(&, &)
.X.Subtract(&, &.Y)
.T.Subtract(&, &.Z)
return
}
func ( *Point) ( *Point) *Point {
checkInitialized()
.x.Negate(&.x)
.y.Set(&.y)
.z.Set(&.z)
.t.Negate(&.t)
return
}
func ( *Point) ( *Point) int {
checkInitialized(, )
var , , , field.Element
.Multiply(&.x, &.z)
.Multiply(&.x, &.z)
.Multiply(&.y, &.z)
.Multiply(&.y, &.z)
return .Equal(&) & .Equal(&)
}
func ( *projCached) (, *projCached, int) *projCached {
.YplusX.Select(&.YplusX, &.YplusX, )
.YminusX.Select(&.YminusX, &.YminusX, )
.Z.Select(&.Z, &.Z, )
.T2d.Select(&.T2d, &.T2d, )
return
}
func ( *affineCached) (, *affineCached, int) *affineCached {
.YplusX.Select(&.YplusX, &.YplusX, )
.YminusX.Select(&.YminusX, &.YminusX, )
.T2d.Select(&.T2d, &.T2d, )
return
}
func ( *projCached) ( int) *projCached {
.YplusX.Swap(&.YminusX, )
.T2d.Select(new(field.Element).Negate(&.T2d), &.T2d, )
return
}
func ( *affineCached) ( int) *affineCached {
.YplusX.Swap(&.YminusX, )
.T2d.Select(new(field.Element).Negate(&.T2d), &.T2d, )
return
}