123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- /*
- * File: dclxvi-20130329/fp2e.h
- * Author: Ruben Niederhagen, Peter Schwabe
- * Public Domain
- */
- #ifndef FP2E_H
- #define FP2E_H
- #include <stdio.h>
- #include "fpe.h"
- #include "mydouble.h"
- // Elements from F_{p^2}= F_p[X] / (x^2 - alpha)F_p[X] are represented as aX + b
- typedef struct fp2e_struct
- {
- // Arrangement in memory: (b0, a0, b1, a1, ... b11,a11)
- mydouble v[24];
- } __attribute__ ((aligned (16))) fp2e_struct_t;
- typedef fp2e_struct_t fp2e_t[1];
- void fp2e_to_2fpe(fpe_t ropa, fpe_t ropb, const fp2e_t op);
- void _2fpe_to_fp2e(fp2e_t rop, const fpe_t opa, const fpe_t opb);
- #ifdef QHASM
- #define fp2e_short_coeffred fp2e_short_coeffred_qhasm
- #else
- #define fp2e_short_coeffred fp2e_short_coeffred_c
- #endif
- void fp2e_short_coeffred(fp2e_t rop);
- // Set fp2e_t rop to given value:
- void fp2e_set(fp2e_t rop, const fp2e_t op);
- /* Communicate the fact that the fp2e is reduced (and that we don't know anything more about it) */
- void fp2e_isreduced(fp2e_t rop);
- // Set fp2e_t rop to given value contained in the subfield F_p:
- void fp2e_set_fpe(fp2e_t rop, const fpe_t op);
- // Set rop to one
- void fp2e_setone(fp2e_t rop);
- // Set rop to zero
- void fp2e_setzero(fp2e_t rop);
- // Compare for equality:
- int fp2e_iseq(const fp2e_t op1, const fp2e_t op2);
- int fp2e_isone(const fp2e_t op);
- int fp2e_iszero(const fp2e_t op);
- void fp2e_cmov(fp2e_t rop, const fp2e_t op, int c);
- #ifdef QHASM
- #define fp2e_double fp2e_double_qhasm
- #else
- #define fp2e_double fp2e_double_c
- #endif
- // Double an fp2e:
- void fp2e_double(fp2e_t rop, const fp2e_t op);
- // Double an fp2e:
- #ifdef QHASM
- #define fp2e_double2 fp2e_double2_qhasm
- #else
- #define fp2e_double2 fp2e_double2_c
- #endif
- void fp2e_double2(fp2e_t rop);
- #ifdef QHASM
- #define fp2e_triple fp2e_triple_qhasm
- #else
- #define fp2e_triple fp2e_triple_c
- #endif
- // Triple an fp2e:
- void fp2e_triple(fp2e_t rop, const fp2e_t op);
- // Triple an fp2e:
- #ifdef QHASM
- #define fp2e_triple2 fp2e_triple2_qhasm
- #else
- #define fp2e_triple2 fp2e_triple2_c
- #endif
- void fp2e_triple2(fp2e_t rop);
- void fp2e_mul_scalar(fp2e_t rop, const fp2e_t op, const int s);
- #ifdef QHASM
- #define fp2e_add fp2e_add_qhasm
- #else
- #define fp2e_add fp2e_add_c
- #endif
- // Add two fp2e, store result in rop:
- void fp2e_add(fp2e_t rop, const fp2e_t op1, const fp2e_t op2);
- // Add rop to up, store result in rop:
- #ifdef QHASM
- #define fp2e_add2 fp2e_add2_qhasm
- #else
- #define fp2e_add2 fp2e_add2_c
- #endif
- void fp2e_add2(fp2e_t rop, const fp2e_t op);
- // Load from mem
- void fp2e_load(fp2e_struct_t *rop, const fp2e_t op);
- //void fp2e_load(fp2e_t rop, const fp2e_t op);
- // store to mem
- void fp2e_store(fp2e_struct_t *rop, const fp2e_t op);
- //void fp2e_store(fp2e_t rop, const fp2e_t op);
- #ifdef QHASM
- #define fp2e_sub fp2e_sub_qhasm
- #else
- #define fp2e_sub fp2e_sub_c
- #endif
- // Subtract op2 from op1, store result in rop:
- void fp2e_sub(fp2e_t rop, const fp2e_t op1, const fp2e_t op2);
- #ifdef QHASM
- #define fp2e_sub2 fp2e_sub2_qhasm
- #else
- #define fp2e_sub2 fp2e_sub2_c
- #endif
- // Subtract op from rop, store result in rop:
- void fp2e_sub2(fp2e_t rop, const fp2e_t op);
- #ifdef QHASM
- #define fp2e_neg2 fp2e_neg2_qhasm
- #else
- #define fp2e_neg2 fp2e_neg2_c
- #endif
- void fp2e_neg2(fp2e_t op);
- #ifdef QHASM
- #define fp2e_neg fp2e_neg_qhasm
- #else
- #define fp2e_neg fp2e_neg_c
- #endif
- void fp2e_neg(fp2e_t rop, const fp2e_t op);
- #ifdef QHASM
- #define fp2e_conjugate fp2e_conjugate_qhasm
- #else
- #define fp2e_conjugate fp2e_conjugate_c
- #endif
- // Conjugates: aX+b to -aX+b
- void fp2e_conjugate(fp2e_t rop, const fp2e_t op);
- #ifdef QHASM
- #define fp2e_mul fp2e_mul_qhasm
- #else
- #define fp2e_mul fp2e_mul_c
- #endif
- // Multiply two fp2e, store result in rop:
- void fp2e_mul(fp2e_t rop, const fp2e_t op1, const fp2e_t op2);
- // Square an fp2e, store result in rop:
- #ifdef QHASM
- #define fp2e_square fp2e_square_qhasm
- #else
- #define fp2e_square fp2e_square_c
- #endif
- void fp2e_square(fp2e_t rop, const fp2e_t op);
- // Multiply by xi which is used to construct F_p^6
- #ifdef QHASM
- #ifdef NEW_PARAMETERS
- #define fp2e_mulxi fp2e_mulxi_qhasm_512
- #else
- #define fp2e_mulxi fp2e_mulxi_qhasm
- #endif
- #else
- #ifdef NEW_PARAMETERS
- #define fp2e_mulxi fp2e_mulxi_c_512
- #else
- #define fp2e_mulxi fp2e_mulxi_c
- #endif
- #endif
-
- void fp2e_mulxi(fp2e_t rop, const fp2e_t op);
- // Multiple of an fp2e, store result in rop:
- #ifdef QHASM
- #define fp2e_mul_fpe fp2e_mul_fpe_qhasm
- #else
- #define fp2e_mul_fpe fp2e_mul_fpe_c
- #endif
- void fp2e_mul_fpe(fp2e_t rop, const fp2e_t op1, const fpe_t op2);
- #ifdef QHASM
- #define fp2e_parallel_coeffmul fp2e_parallel_coeffmul_qhasm
- #else
- #define fp2e_parallel_coeffmul fp2e_parallel_coeffmul_c
- #endif
- /* computes (op1->m_a*op2->m_a, op1->m_b*op2->m_b) */
- void fp2e_parallel_coeffmul(fp2e_t rop, const fp2e_t op1, const fp2e_t op2);
- // Inverse multiple of an fp2e, store result in rop:
- void fp2e_invert(fp2e_t rop, const fp2e_t op1);
- // Print the element to stdout:
- void fp2e_print(FILE * outfile, const fp2e_t op);
- #endif // ifndef FP2E_H
|