|
|
// +build !amd64
// Copyright 2020 ConsenSys AG
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by goff (v0.2.0) DO NOT EDIT
// Package ff contains field arithmetic operations
package ff
// /!\ WARNING /!\
// this code has not been audited and is provided as-is. In particular,
// there is no security guarantees such as constant time implementation
// or side-channel attack resistance
// /!\ WARNING /!\
import "math/bits"
// Square z = x * x mod q
// see https://hackmd.io/@zkteam/modular_multiplication
func (z *Element) Square(x *Element) *Element {
var p [4]uint64
var u, v uint64 { // round 0
u, p[0] = bits.Mul64(x[0], x[0]) m := p[0] * 14042775128853446655 C := madd0(m, 4891460686036598785, p[0]) var t uint64 t, u, v = madd1sb(x[0], x[1], u) C, p[0] = madd2(m, 2896914383306846353, v, C) t, u, v = madd1s(x[0], x[2], t, u) C, p[1] = madd2(m, 13281191951274694749, v, C) _, u, v = madd1s(x[0], x[3], t, u) p[3], p[2] = madd3(m, 3486998266802970665, v, C, u) } { // round 1
m := p[0] * 14042775128853446655 C := madd0(m, 4891460686036598785, p[0]) u, v = madd1(x[1], x[1], p[1]) C, p[0] = madd2(m, 2896914383306846353, v, C) var t uint64 t, u, v = madd2sb(x[1], x[2], p[2], u) C, p[1] = madd2(m, 13281191951274694749, v, C) _, u, v = madd2s(x[1], x[3], p[3], t, u) p[3], p[2] = madd3(m, 3486998266802970665, v, C, u) } { // round 2
m := p[0] * 14042775128853446655 C := madd0(m, 4891460686036598785, p[0]) C, p[0] = madd2(m, 2896914383306846353, p[1], C) u, v = madd1(x[2], x[2], p[2]) C, p[1] = madd2(m, 13281191951274694749, v, C) _, u, v = madd2sb(x[2], x[3], p[3], u) p[3], p[2] = madd3(m, 3486998266802970665, v, C, u) } { // round 3
m := p[0] * 14042775128853446655 C := madd0(m, 4891460686036598785, p[0]) C, z[0] = madd2(m, 2896914383306846353, p[1], C) C, z[1] = madd2(m, 13281191951274694749, p[2], C) u, v = madd1(x[3], x[3], p[3]) z[3], z[2] = madd3(m, 3486998266802970665, v, C, u) }
// if z > q --> z -= q
// note: this is NOT constant time
if !(z[3] < 3486998266802970665 || (z[3] == 3486998266802970665 && (z[2] < 13281191951274694749 || (z[2] == 13281191951274694749 && (z[1] < 2896914383306846353 || (z[1] == 2896914383306846353 && (z[0] < 4891460686036598785))))))) { var b uint64 z[0], b = bits.Sub64(z[0], 4891460686036598785, 0) z[1], b = bits.Sub64(z[1], 2896914383306846353, b) z[2], b = bits.Sub64(z[2], 13281191951274694749, b) z[3], _ = bits.Sub64(z[3], 3486998266802970665, b) } return z
}
|