package fiat
import (
)
type P256Element struct {
x p256MontgomeryDomainFieldElement
}
const p256ElementLen = 32
type p256UntypedFieldElement = [4]uint64
func ( *P256Element) () *P256Element {
p256SetOne(&.x)
return
}
func ( *P256Element) ( *P256Element) int {
:= .Bytes()
:= .Bytes()
return subtle.ConstantTimeCompare(, )
}
func ( *P256Element) () int {
:= make([]byte, p256ElementLen)
:= .Bytes()
return subtle.ConstantTimeCompare(, )
}
func ( *P256Element) ( *P256Element) *P256Element {
.x = .x
return
}
func ( *P256Element) () []byte {
var [p256ElementLen]byte
return .bytes(&)
}
func ( *P256Element) ( *[p256ElementLen]byte) []byte {
var p256NonMontgomeryDomainFieldElement
p256FromMontgomery(&, &.x)
p256ToBytes(, (*p256UntypedFieldElement)(&))
p256InvertEndianness([:])
return [:]
}
func ( *P256Element) ( []byte) (*P256Element, error) {
if len() != p256ElementLen {
return nil, errors.New("invalid P256Element encoding")
}
var = new(P256Element).Sub(
new(P256Element), new(P256Element).One()).Bytes()
for := range {
if [] < [] {
break
}
if [] > [] {
return nil, errors.New("invalid P256Element encoding")
}
}
var [p256ElementLen]byte
copy([:], )
p256InvertEndianness([:])
var p256NonMontgomeryDomainFieldElement
p256FromBytes((*p256UntypedFieldElement)(&), &)
p256ToMontgomery(&.x, &)
return , nil
}
func ( *P256Element) (, *P256Element) *P256Element {
p256Add(&.x, &.x, &.x)
return
}
func ( *P256Element) (, *P256Element) *P256Element {
p256Sub(&.x, &.x, &.x)
return
}
func ( *P256Element) (, *P256Element) *P256Element {
p256Mul(&.x, &.x, &.x)
return
}
func ( *P256Element) ( *P256Element) *P256Element {
p256Square(&.x, &.x)
return
}
func ( *P256Element) (, *P256Element, int) *P256Element {
p256Selectznz((*p256UntypedFieldElement)(&.x), p256Uint1(),
(*p256UntypedFieldElement)(&.x), (*p256UntypedFieldElement)(&.x))
return
}
func ( []byte) {
for := 0; < len()/2; ++ {
[], [len()-1-] = [len()-1-], []
}
}