/* * RELIC is an Efficient LIbrary for Cryptography * Copyright (c) 2012 RELIC Authors * * This file is part of RELIC. RELIC is legal property of its developers, * whose names are not listed here. Please refer to the COPYRIGHT file * for contact information. * * RELIC is free software; you can redistribute it and/or modify it under the * terms of the version 2.1 (or later) of the GNU Lesser General Public License * as published by the Free Software Foundation; or version 2.0 of the Apache * License as published by the Apache Software Foundation. See the LICENSE files * for more details. * * RELIC is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the LICENSE files for more details. * * You should have received a copy of the GNU Lesser General Public or the * Apache License along with RELIC. If not, see * or . */ /** * @defgroup fbx Binary field extensions. */ /** * @file * * Interface of the module for extension field arithmetic over binary fields. * * @ingroup fbx */ #ifndef RLC_FBX_H #define RLC_FBX_H #include "relic_fb.h" #include "relic_types.h" /*============================================================================*/ /* Type definitions */ /*============================================================================*/ /** * Represents a quadratic extension binary field element. * * This extension field is constructed with the basis {1, s}, where s is a * quadratic non-residue in the binary field. */ typedef fb_t fb2_t[2]; /*============================================================================*/ /* Macro definitions */ /*============================================================================*/ /** * Initializes a quadratic extension binary field with a null value. * * @param[out] A - the quadratic extension element to initialize. */ #define fb2_null(A) \ fb_null(A[0]); fb_null(A[1]); \ /** * Calls a function to allocate a quadratic extension binary field element. * * @param[out] A - the new quadratic extension field element. */ #define fb2_new(A) \ fb_new(A[0]); fb_new(A[1]); \ /** * Calls a function to free a quadratic extension binary field element. * * @param[out] A - the quadratic extension field element to free. */ #define fb2_free(A) \ fb_free(A[0]); fb_free(A[1]); \ /** * Copies the second argument to the first argument. * * @param[out] C - the result. * @param[in] A - the quadratic extension field element to copy. */ #define fb2_copy(C, A) \ fb_copy(C[0], A[0]); fb_copy(C[1], A[1]); \ /** * Negates a quadratic extension field element. * * f@param[out] C - the result. * @param[out] A - the quadratic extension field element to negate. */ #define fb2_neg(C, A) \ fb_neg(C[0], A[0]); fb_neg(C[1], A[1]); \ /** * Assigns zero to a quadratic extension field element. * * @param[out] A - the quadratic extension field element to zero. */ #define fb2_zero(A) \ fb_zero(A[0]); fb_zero(A[1]); \ /** * Tests if a quadratic extension field element is zero or not. * * @param[in] A - the quadratic extension field element to test. * @return 1 if the argument is zero, 0 otherwise. */ #define fb2_is_zero(A) \ (fb_is_zero(A[0]) && fb_is_zero(A[1])) \ /** * Assigns a random value to a quadratic extension field element. * * @param[out] A - the quadratic extension field element to assign. */ #define fb2_rand(A) \ fb_rand(A[0]); fb_rand(A[1]); \ /** * Prints a quadratic extension field element to standard output. * * @param[in] A - the quadratic extension field element to print. */ #define fb2_print(A) \ fb_print(A[0]); fb_print(A[1]); \ /** * Returns the result of a comparison between two quadratic extension field * elements * * @param[in] A - the first quadratic extension field element. * @param[in] B - the second quadratic extension field element. * @return RLC_NE if a != b, RLC_EQ if a == b. */ #define fb2_cmp(A, B) \ ((fb_cmp(A[0], B[0]) == RLC_EQ) && (fb_cmp(A[1], B[1]) == RLC_EQ) \ ? RLC_EQ : RLC_NE) \ /** * Adds two quadratic extension field elements. Computes c = a + b. * * @param[out] C - the result. * @param[in] A - the first quadratic extension field element. * @param[in] B - the second quadratic extension field element. */ #define fb2_add(C, A, B) \ fb_add(C[0], A[0], B[0]); fb_add(C[1], A[1], B[1]); \ /*============================================================================*/ /* Function prototypes */ /*============================================================================*/ /** * Multiples two quadratic extension field elements. Computes c = a * b. * * @param[out] c - the result. * @param[in] a - the quadratic extension binary field element. * @param[in] b - the quadratic extension binary field element. */ void fb2_mul(fb2_t c, fb2_t a, fb2_t b); /** * Multiples a quadratic extension field element by a quadratic non-residue. * Computes c = a * s. * * @param[out] c - the result. * @param[in] a - the quadratic extension binary field element. * @param[in] b - the quadratic extension binary field element. */ void fb2_mul_nor(fb2_t c, fb2_t a); /** * Computes the square of a quadratic extension field element. Computes * c = a * a. * * @param[out] c - the result. * @param[in] a - the binary field element to square. */ void fb2_sqr(fb2_t c, fb2_t a); /** * Solves a quadratic equation for c, Tr(a) = 0. Computes c such that * c^2 + c = a. * * @param[out] c - the result. * @param[in] a - the quadratic extension field element. */ void fb2_slv(fb2_t c, fb2_t a); /** * Inverts a quadratic extension field element. Computes c = a^{-1}. * * @param[out] c - the result. * @param[in] a - the quadratic extension field element to invert. */ void fb2_inv(fb2_t c, fb2_t a); #endif /* !RLC_FBX_H */