package fiat
import (
)
type P224Element struct {
x p224MontgomeryDomainFieldElement
}
const p224ElementLen = 28
type p224UntypedFieldElement = [4]uint64
func ( *P224Element) () *P224Element {
p224SetOne(&.x)
return
}
func ( *P224Element) ( *P224Element) int {
:= .Bytes()
:= .Bytes()
return subtle.ConstantTimeCompare(, )
}
var p224ZeroEncoding = new(P224Element).Bytes()
func ( *P224Element) () int {
:= .Bytes()
return subtle.ConstantTimeCompare(, p224ZeroEncoding)
}
func ( *P224Element) ( *P224Element) *P224Element {
.x = .x
return
}
func ( *P224Element) () []byte {
var [p224ElementLen]byte
return .bytes(&)
}
func ( *P224Element) ( *[p224ElementLen]byte) []byte {
var p224NonMontgomeryDomainFieldElement
p224FromMontgomery(&, &.x)
p224ToBytes(, (*p224UntypedFieldElement)(&))
p224InvertEndianness([:])
return [:]
}
var p224MinusOneEncoding = new(P224Element).Sub(
new(P224Element), new(P224Element).One()).Bytes()
func ( *P224Element) ( []byte) (*P224Element, error) {
if len() != p224ElementLen {
return nil, errors.New("invalid P224Element encoding")
}
for := range {
if [] < p224MinusOneEncoding[] {
break
}
if [] > p224MinusOneEncoding[] {
return nil, errors.New("invalid P224Element encoding")
}
}
var [p224ElementLen]byte
copy([:], )
p224InvertEndianness([:])
var p224NonMontgomeryDomainFieldElement
p224FromBytes((*p224UntypedFieldElement)(&), &)
p224ToMontgomery(&.x, &)
return , nil
}
func ( *P224Element) (, *P224Element) *P224Element {
p224Add(&.x, &.x, &.x)
return
}
func ( *P224Element) (, *P224Element) *P224Element {
p224Sub(&.x, &.x, &.x)
return
}
func ( *P224Element) (, *P224Element) *P224Element {
p224Mul(&.x, &.x, &.x)
return
}
func ( *P224Element) ( *P224Element) *P224Element {
p224Square(&.x, &.x)
return
}
func ( *P224Element) (, *P224Element, int) *P224Element {
p224Selectznz((*p224UntypedFieldElement)(&.x), p224Uint1(),
(*p224UntypedFieldElement)(&.x), (*p224UntypedFieldElement)(&.x))
return
}
func ( []byte) {
for := 0; < len()/2; ++ {
[], [len()-1-] = [len()-1-], []
}
}