package fiat
import (
)
type P521Element struct {
x p521MontgomeryDomainFieldElement
}
const p521ElementLen = 66
type p521UntypedFieldElement = [9]uint64
func ( *P521Element) () *P521Element {
p521SetOne(&.x)
return
}
func ( *P521Element) ( *P521Element) int {
:= .Bytes()
:= .Bytes()
return subtle.ConstantTimeCompare(, )
}
var p521ZeroEncoding = new(P521Element).Bytes()
func ( *P521Element) () int {
:= .Bytes()
return subtle.ConstantTimeCompare(, p521ZeroEncoding)
}
func ( *P521Element) ( *P521Element) *P521Element {
.x = .x
return
}
func ( *P521Element) () []byte {
var [p521ElementLen]byte
return .bytes(&)
}
func ( *P521Element) ( *[p521ElementLen]byte) []byte {
var p521NonMontgomeryDomainFieldElement
p521FromMontgomery(&, &.x)
p521ToBytes(, (*p521UntypedFieldElement)(&))
p521InvertEndianness([:])
return [:]
}
var p521MinusOneEncoding = new(P521Element).Sub(
new(P521Element), new(P521Element).One()).Bytes()
func ( *P521Element) ( []byte) (*P521Element, error) {
if len() != p521ElementLen {
return nil, errors.New("invalid P521Element encoding")
}
for := range {
if [] < p521MinusOneEncoding[] {
break
}
if [] > p521MinusOneEncoding[] {
return nil, errors.New("invalid P521Element encoding")
}
}
var [p521ElementLen]byte
copy([:], )
p521InvertEndianness([:])
var p521NonMontgomeryDomainFieldElement
p521FromBytes((*p521UntypedFieldElement)(&), &)
p521ToMontgomery(&.x, &)
return , nil
}
func ( *P521Element) (, *P521Element) *P521Element {
p521Add(&.x, &.x, &.x)
return
}
func ( *P521Element) (, *P521Element) *P521Element {
p521Sub(&.x, &.x, &.x)
return
}
func ( *P521Element) (, *P521Element) *P521Element {
p521Mul(&.x, &.x, &.x)
return
}
func ( *P521Element) ( *P521Element) *P521Element {
p521Square(&.x, &.x)
return
}
func ( *P521Element) (, *P521Element, int) *P521Element {
p521Selectznz((*p521UntypedFieldElement)(&.x), p521Uint1(),
(*p521UntypedFieldElement)(&.x), (*p521UntypedFieldElement)(&.x))
return
}
func ( []byte) {
for := 0; < len()/2; ++ {
[], [len()-1-] = [len()-1-], []
}
}