366 lines
9.3 KiB
C
366 lines
9.3 KiB
C
|
/*
|
||
|
* Copyright (c) 2012-2020 MIRACL UK Ltd.
|
||
|
*
|
||
|
* This file is part of MIRACL Core
|
||
|
* (see https://github.com/miracl/core).
|
||
|
*
|
||
|
* 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.
|
||
|
*/
|
||
|
|
||
|
#ifndef FP8_BLS48581_H
|
||
|
#define FP8_BLS48581_H
|
||
|
|
||
|
#include "fp4_BLS48581.h"
|
||
|
#include "config_curve_BLS48581.h"
|
||
|
|
||
|
using namespace core;
|
||
|
|
||
|
namespace BLS48581 {
|
||
|
|
||
|
/**
|
||
|
@brief FP8 Structure - towered over two FP4
|
||
|
*/
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
FP4 a; /**< real part of FP8 */
|
||
|
FP4 b; /**< imaginary part of FP8 */
|
||
|
} FP8;
|
||
|
|
||
|
|
||
|
/* FP8 prototypes */
|
||
|
/** @brief Tests for FP8 equal to zero
|
||
|
*
|
||
|
@param x FP8 number to be tested
|
||
|
@return 1 if zero, else returns 0
|
||
|
*/
|
||
|
extern int FP8_iszilch(FP8 *x);
|
||
|
|
||
|
/** @brief Tests for lexically larger
|
||
|
*
|
||
|
@param x FP8 number to be tested if larger than -x
|
||
|
@return 1 if larger, else returns 0
|
||
|
*/
|
||
|
extern int FP8_islarger(FP8 *x);
|
||
|
|
||
|
/** @brief Serialize in FP8
|
||
|
*
|
||
|
@param b buffer for output
|
||
|
@param x FP8 number to be serialized
|
||
|
*/
|
||
|
extern void FP8_toBytes(char *b,FP8 *x);
|
||
|
/** @brief Serialize out FP8
|
||
|
*
|
||
|
@param x FP8 number to be serialized
|
||
|
@param b buffer for input
|
||
|
*/
|
||
|
extern void FP8_fromBytes(FP8 *x,char *b);
|
||
|
|
||
|
|
||
|
/** @brief Tests for FP8 equal to unity
|
||
|
*
|
||
|
@param x FP8 number to be tested
|
||
|
@return 1 if unity, else returns 0
|
||
|
*/
|
||
|
extern int FP8_isunity(FP8 *x);
|
||
|
/** @brief Tests for equality of two FP8s
|
||
|
*
|
||
|
@param x FP8 instance to be compared
|
||
|
@param y FP8 instance to be compared
|
||
|
@return 1 if x=y, else returns 0
|
||
|
*/
|
||
|
extern int FP8_equals(FP8 *x, FP8 *y);
|
||
|
/** @brief Tests for FP8 having only a real part and no imaginary part
|
||
|
*
|
||
|
@param x FP8 number to be tested
|
||
|
@return 1 if real, else returns 0
|
||
|
*/
|
||
|
extern int FP8_isreal(FP8 *x);
|
||
|
/** @brief Initialise FP8 from two FP4s
|
||
|
*
|
||
|
@param x FP8 instance to be initialised
|
||
|
@param a FP4 to form real part of FP8
|
||
|
@param b FP4 to form imaginary part of FP8
|
||
|
*/
|
||
|
extern void FP8_from_FP4s(FP8 *x, FP4 *a, FP4 *b);
|
||
|
/** @brief Initialise FP8 from single FP4
|
||
|
*
|
||
|
Imaginary part is set to zero
|
||
|
@param x FP8 instance to be initialised
|
||
|
@param a FP4 to form real part of FP8
|
||
|
*/
|
||
|
extern void FP8_from_FP4(FP8 *x, FP4 *a);
|
||
|
|
||
|
/** @brief Initialise FP8 from single FP4
|
||
|
*
|
||
|
real part is set to zero
|
||
|
@param x FP8 instance to be initialised
|
||
|
@param a FP4 to form imaginary part of FP8
|
||
|
*/
|
||
|
extern void FP8_from_FP4H(FP8 *x, FP4 *a);
|
||
|
|
||
|
/** @brief Initialise FP8 from single FP
|
||
|
*
|
||
|
@param x FP8 instance to be initialised
|
||
|
@param a FP to form real part of FP8
|
||
|
*/
|
||
|
extern void FP8_from_FP(FP8 *x, FP *a);
|
||
|
|
||
|
/** @brief Copy FP8 to another FP8
|
||
|
*
|
||
|
@param x FP8 instance, on exit = y
|
||
|
@param y FP8 instance to be copied
|
||
|
*/
|
||
|
extern void FP8_copy(FP8 *x, FP8 *y);
|
||
|
|
||
|
/** @brief Set FP8 to zero
|
||
|
*
|
||
|
@param x FP8 instance to be set to zero
|
||
|
*/
|
||
|
extern void FP8_zero(FP8 *x);
|
||
|
/** @brief Set FP8 to unity
|
||
|
*
|
||
|
@param x FP8 instance to be set to one
|
||
|
*/
|
||
|
extern void FP8_one(FP8 *x);
|
||
|
|
||
|
/** @brief Sign of FP8
|
||
|
*
|
||
|
@param x FP8 instance
|
||
|
@return "sign" of FP8
|
||
|
*/
|
||
|
extern int FP8_sign(FP8 *x);
|
||
|
|
||
|
/** @brief Negation of FP8
|
||
|
*
|
||
|
@param x FP8 instance, on exit = -y
|
||
|
@param y FP8 instance
|
||
|
*/
|
||
|
extern void FP8_neg(FP8 *x, FP8 *y);
|
||
|
/** @brief Conjugation of FP8
|
||
|
*
|
||
|
If y=(a,b) on exit x=(a,-b)
|
||
|
@param x FP8 instance, on exit = conj(y)
|
||
|
@param y FP8 instance
|
||
|
*/
|
||
|
extern void FP8_conj(FP8 *x, FP8 *y);
|
||
|
/** @brief Negative conjugation of FP8
|
||
|
*
|
||
|
If y=(a,b) on exit x=(-a,b)
|
||
|
@param x FP8 instance, on exit = -conj(y)
|
||
|
@param y FP8 instance
|
||
|
*/
|
||
|
extern void FP8_nconj(FP8 *x, FP8 *y);
|
||
|
/** @brief addition of two FP8s
|
||
|
*
|
||
|
@param x FP8 instance, on exit = y+z
|
||
|
@param y FP8 instance
|
||
|
@param z FP8 instance
|
||
|
*/
|
||
|
extern void FP8_add(FP8 *x, FP8 *y, FP8 *z);
|
||
|
/** @brief subtraction of two FP8s
|
||
|
*
|
||
|
@param x FP8 instance, on exit = y-z
|
||
|
@param y FP8 instance
|
||
|
@param z FP8 instance
|
||
|
*/
|
||
|
extern void FP8_sub(FP8 *x, FP8 *y, FP8 *z);
|
||
|
/** @brief Multiplication of an FP8 by an FP4
|
||
|
*
|
||
|
@param x FP8 instance, on exit = y*a
|
||
|
@param y FP8 instance
|
||
|
@param a FP4 multiplier
|
||
|
*/
|
||
|
extern void FP8_pmul(FP8 *x, FP8 *y, FP4 *a);
|
||
|
|
||
|
/** @brief Multiplication of an FP8 by an FP2
|
||
|
*
|
||
|
@param x FP8 instance, on exit = y*a
|
||
|
@param y FP8 instance
|
||
|
@param a FP2 multiplier
|
||
|
*/
|
||
|
extern void FP8_qmul(FP8 *x, FP8 *y, FP2 *a);
|
||
|
|
||
|
/** @brief Multiplication of an FP8 by an FP
|
||
|
*
|
||
|
@param x FP8 instance, on exit = y*a
|
||
|
@param y FP8 instance
|
||
|
@param a FP multiplier
|
||
|
*/
|
||
|
extern void FP8_tmul(FP8 *x, FP8 *y, FP *a);
|
||
|
|
||
|
|
||
|
|
||
|
/** @brief Multiplication of an FP8 by a small integer
|
||
|
*
|
||
|
@param x FP8 instance, on exit = y*i
|
||
|
@param y FP8 instance
|
||
|
@param i an integer
|
||
|
*/
|
||
|
extern void FP8_imul(FP8 *x, FP8 *y, int i);
|
||
|
/** @brief Squaring an FP8
|
||
|
*
|
||
|
@param x FP8 instance, on exit = y^2
|
||
|
@param y FP8 instance
|
||
|
*/
|
||
|
extern void FP8_sqr(FP8 *x, FP8 *y);
|
||
|
/** @brief Multiplication of two FP8s
|
||
|
*
|
||
|
@param x FP8 instance, on exit = y*z
|
||
|
@param y FP8 instance
|
||
|
@param z FP8 instance
|
||
|
*/
|
||
|
extern void FP8_mul(FP8 *x, FP8 *y, FP8 *z);
|
||
|
/** @brief Inverting an FP8
|
||
|
*
|
||
|
@param x FP8 instance, on exit = 1/y
|
||
|
@param y FP8 instance
|
||
|
@param h optional input hint
|
||
|
*/
|
||
|
extern void FP8_inv(FP8 *x, FP8 *y, FP *h);
|
||
|
/** @brief Formats and outputs an FP8 to the console
|
||
|
*
|
||
|
@param x FP8 instance to be printed
|
||
|
*/
|
||
|
extern void FP8_output(FP8 *x);
|
||
|
/** @brief Divide an FP8 by 2
|
||
|
*
|
||
|
@param x FP8 instance, on exit = y/2
|
||
|
@param y FP8 instance
|
||
|
*/
|
||
|
extern void FP8_div2(FP8 *x, FP8 *y);
|
||
|
|
||
|
/** @brief Formats and outputs an FP8 to the console in raw form (for debugging)
|
||
|
*
|
||
|
@param x FP8 instance to be printed
|
||
|
*/
|
||
|
extern void FP8_rawoutput(FP8 *x);
|
||
|
/** @brief multiplies an FP8 instance by irreducible polynomial sqrt(1+sqrt(-1))
|
||
|
*
|
||
|
@param x FP8 instance, on exit = sqrt(1+sqrt(-1)*x
|
||
|
*/
|
||
|
extern void FP8_times_i(FP8 *x);
|
||
|
/** @brief multiplies an FP8 instance by irreducible polynomial (1+sqrt(-1))
|
||
|
*
|
||
|
@param x FP8 instance, on exit = (1+sqrt(-1)*x
|
||
|
*/
|
||
|
extern void FP8_times_i2(FP8 *x);
|
||
|
|
||
|
/** @brief Normalises the components of an FP8
|
||
|
*
|
||
|
@param x FP8 instance to be normalised
|
||
|
*/
|
||
|
extern void FP8_norm(FP8 *x);
|
||
|
/** @brief Reduces all components of possibly unreduced FP8 mod Modulus
|
||
|
*
|
||
|
@param x FP8 instance, on exit reduced mod Modulus
|
||
|
*/
|
||
|
extern void FP8_reduce(FP8 *x);
|
||
|
/** @brief Raises an FP8 to the power of a BIG
|
||
|
*
|
||
|
@param x FP8 instance, on exit = y^b
|
||
|
@param y FP8 instance
|
||
|
@param b BIG number
|
||
|
*/
|
||
|
extern void FP8_pow(FP8 *x, FP8 *y, B584_60::BIG b);
|
||
|
/** @brief Raises an FP8 to the power of the internal modulus p, using the Frobenius
|
||
|
*
|
||
|
@param x FP8 instance, on exit = x^p
|
||
|
@param f FP2 precalculated Frobenius constant
|
||
|
*/
|
||
|
extern void FP8_frob(FP8 *x, FP2 *f);
|
||
|
/** @brief Calculates the XTR addition function r=w*x-conj(x)*y+z
|
||
|
*
|
||
|
@param r FP8 instance, on exit = w*x-conj(x)*y+z
|
||
|
@param w FP8 instance
|
||
|
@param x FP8 instance
|
||
|
@param y FP8 instance
|
||
|
@param z FP8 instance
|
||
|
*/
|
||
|
extern void FP8_xtr_A(FP8 *r, FP8 *w, FP8 *x, FP8 *y, FP8 *z);
|
||
|
/** @brief Calculates the XTR doubling function r=x^2-2*conj(x)
|
||
|
*
|
||
|
@param r FP8 instance, on exit = x^2-2*conj(x)
|
||
|
@param x FP8 instance
|
||
|
*/
|
||
|
extern void FP8_xtr_D(FP8 *r, FP8 *x);
|
||
|
/** @brief Calculates FP8 trace of an FP12 raised to the power of a BIG number
|
||
|
*
|
||
|
XTR single exponentiation
|
||
|
@param r FP8 instance, on exit = trace(w^b)
|
||
|
@param x FP8 instance, trace of an FP12 w
|
||
|
@param b BIG number
|
||
|
*/
|
||
|
extern void FP8_xtr_pow(FP8 *r, FP8 *x, B584_60::BIG b);
|
||
|
/** @brief Calculates FP8 trace of c^a.d^b, where c and d are derived from FP8 traces of FP12s
|
||
|
*
|
||
|
XTR double exponentiation
|
||
|
Assumes c=tr(x^m), d=tr(x^n), e=tr(x^(m-n)), f=tr(x^(m-2n))
|
||
|
@param r FP8 instance, on exit = trace(c^a.d^b)
|
||
|
@param c FP8 instance, trace of an FP12
|
||
|
@param d FP8 instance, trace of an FP12
|
||
|
@param e FP8 instance, trace of an FP12
|
||
|
@param f FP8 instance, trace of an FP12
|
||
|
@param a BIG number
|
||
|
@param b BIG number
|
||
|
*/
|
||
|
extern void FP8_xtr_pow2(FP8 *r, FP8 *c, FP8 *d, FP8 *e, FP8 *f, B584_60::BIG a, B584_60::BIG b);
|
||
|
|
||
|
/** @brief Test FP8 for QR
|
||
|
*
|
||
|
Square root
|
||
|
@param r FP8 instance
|
||
|
@param h optional generated hint
|
||
|
@return 1 r is a QR, otherwise 0
|
||
|
*/
|
||
|
extern int FP8_qr(FP8 *r, FP *h);
|
||
|
|
||
|
|
||
|
/** @brief Calculate square root of an FP8
|
||
|
*
|
||
|
Square root
|
||
|
@param r FP8 instance, on exit = sqrt(x)
|
||
|
@param x FP8 instance
|
||
|
@param h optional input hint
|
||
|
*/
|
||
|
extern void FP8_sqrt(FP8 *r, FP8 *x, FP *h);
|
||
|
|
||
|
|
||
|
/** @brief Conditional copy of FP8 number
|
||
|
*
|
||
|
Conditionally copies second parameter to the first (without branching)
|
||
|
@param x FP8 instance, set to y if s!=0
|
||
|
@param y another FP8 instance
|
||
|
@param s copy only takes place if not equal to 0
|
||
|
*/
|
||
|
extern void FP8_cmove(FP8 *x, FP8 *y, int s);
|
||
|
|
||
|
|
||
|
/** @brief Divide FP8 number by QNR
|
||
|
*
|
||
|
Divide FP8 by the QNR
|
||
|
@param x FP8 instance
|
||
|
*/
|
||
|
extern void FP8_div_i(FP8 *x);
|
||
|
|
||
|
/** @brief Generate random FP8
|
||
|
*
|
||
|
@param x random FP8 number
|
||
|
@param rng random number generator
|
||
|
*/
|
||
|
extern void FP8_rand(FP8 *x, core::csprng *rng);
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|