package fiat
import (
)
type P384Element struct {
x p384MontgomeryDomainFieldElement
}
const p384ElementLen = 48
type p384UntypedFieldElement = [6]uint64
func ( *P384Element) () *P384Element {
p384SetOne(&.x)
return
}
func ( *P384Element) ( *P384Element) int {
:= .Bytes()
:= .Bytes()
return subtle.ConstantTimeCompare(, )
}
var p384ZeroEncoding = new(P384Element).Bytes()
func ( *P384Element) () int {
:= .Bytes()
return subtle.ConstantTimeCompare(, p384ZeroEncoding)
}
func ( *P384Element) ( *P384Element) *P384Element {
.x = .x
return
}
func ( *P384Element) () []byte {
var [p384ElementLen]byte
return .bytes(&)
}
func ( *P384Element) ( *[p384ElementLen]byte) []byte {
var p384NonMontgomeryDomainFieldElement
p384FromMontgomery(&, &.x)
p384ToBytes(, (*p384UntypedFieldElement)(&))
p384InvertEndianness([:])
return [:]
}
var p384MinusOneEncoding = new(P384Element).Sub(
new(P384Element), new(P384Element).One()).Bytes()
func ( *P384Element) ( []byte) (*P384Element, error) {
if len() != p384ElementLen {
return nil, errors.New("invalid P384Element encoding")
}
for := range {
if [] < p384MinusOneEncoding[] {
break
}
if [] > p384MinusOneEncoding[] {
return nil, errors.New("invalid P384Element encoding")
}
}
var [p384ElementLen]byte
copy([:], )
p384InvertEndianness([:])
var p384NonMontgomeryDomainFieldElement
p384FromBytes((*p384UntypedFieldElement)(&), &)
p384ToMontgomery(&.x, &)
return , nil
}
func ( *P384Element) (, *P384Element) *P384Element {
p384Add(&.x, &.x, &.x)
return
}
func ( *P384Element) (, *P384Element) *P384Element {
p384Sub(&.x, &.x, &.x)
return
}
func ( *P384Element) (, *P384Element) *P384Element {
p384Mul(&.x, &.x, &.x)
return
}
func ( *P384Element) ( *P384Element) *P384Element {
p384Square(&.x, &.x)
return
}
func ( *P384Element) (, *P384Element, int) *P384Element {
p384Selectznz((*p384UntypedFieldElement)(&.x), p384Uint1(),
(*p384UntypedFieldElement)(&.x), (*p384UntypedFieldElement)(&.x))
return
}
func ( []byte) {
for := 0; < len()/2; ++ {
[], [len()-1-] = [len()-1-], []
}
}