1 /*############################################################################
2 # Copyright 2017 Intel Corporation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 ############################################################################*/
16 /// Implementation of Fq2 math
17 /*! \file */
18
19 #include "epid/member/tiny/math/fq2.h"
20
21 #include "epid/member/tiny/math/fq.h"
22 #include "epid/member/tiny/math/mathtypes.h"
23
Fq2Cp(Fq2Elem * result,Fq2Elem const * in)24 void Fq2Cp(Fq2Elem* result, Fq2Elem const* in) {
25 FqCp(&(result->x0), &(in->x0));
26 FqCp(&(result->x1), &(in->x1));
27 }
28
Fq2Set(Fq2Elem * result,uint32_t in)29 void Fq2Set(Fq2Elem* result, uint32_t in) {
30 FqSet(&(result->x0), in);
31 FqClear(&(result->x1));
32 }
33
Fq2Clear(Fq2Elem * result)34 void Fq2Clear(Fq2Elem* result) {
35 FqClear(&result->x0);
36 FqClear(&result->x1);
37 }
38
Fq2Add(Fq2Elem * result,Fq2Elem const * left,Fq2Elem const * right)39 void Fq2Add(Fq2Elem* result, Fq2Elem const* left, Fq2Elem const* right) {
40 FqAdd(&(result->x0), &(left->x0), &(right->x0));
41 FqAdd(&(result->x1), &(left->x1), &(right->x1));
42 }
43
Fq2Exp(Fq2Elem * result,Fq2Elem const * base,VeryLargeInt const * exp)44 void Fq2Exp(Fq2Elem* result, Fq2Elem const* base, VeryLargeInt const* exp) {
45 int i, j;
46 Fq2Elem tmp;
47 Fq2Elem tmp2;
48 Fq2Elem* temp = &tmp;
49 Fq2Elem* temp2 = &tmp2;
50 FqSet(&(temp->x0), 1);
51 FqClear(&(temp->x1));
52 for (i = NUM_ECC_DIGITS - 1; i >= 0; i--) {
53 for (j = 31; j >= 0; j--) {
54 Fq2Square(temp, temp);
55 Fq2Mul(temp2, temp, base);
56
57 Fq2CondSet(temp, temp2, temp, (int)((exp->word[i] >> j) & (0x1)));
58 }
59 }
60 Fq2Cp(result, temp);
61 }
62
Fq2Sub(Fq2Elem * result,Fq2Elem const * left,Fq2Elem const * right)63 void Fq2Sub(Fq2Elem* result, Fq2Elem const* left, Fq2Elem const* right) {
64 FqSub(&(result->x0), &(left->x0), &(right->x0));
65 FqSub(&(result->x1), &(left->x1), &(right->x1));
66 }
67
Fq2Mul(Fq2Elem * result,Fq2Elem const * left,Fq2Elem const * right)68 void Fq2Mul(Fq2Elem* result, Fq2Elem const* left, Fq2Elem const* right) {
69 FqElem A;
70 FqElem B;
71 FqElem* a = &A;
72 FqElem* b = &B;
73
74 FqAdd(a, &left->x0, &left->x1);
75 FqAdd(b, &right->x0, &right->x1);
76 FqMul(a, a, b);
77 FqMul(&result->x0, &left->x0, &right->x0);
78 FqSub(a, a, &result->x0);
79 FqMul(b, &left->x1, &right->x1);
80 FqSub(&result->x1, a, b);
81 FqNeg(b, b); // b = b*beta
82 FqAdd(&result->x0, &result->x0, b);
83 }
84
Fq2Inv(Fq2Elem * result,Fq2Elem const * in)85 void Fq2Inv(Fq2Elem* result, Fq2Elem const* in) {
86 FqElem tmp;
87 FqElem tmp2;
88 FqElem* temp = &tmp;
89 FqElem* temp2 = &tmp2;
90 FqSquare(temp, &in->x1);
91 FqSquare(temp2, &in->x0);
92 FqAdd(temp, temp, temp2);
93 FqInv(temp, temp);
94 FqMul(&result->x0, temp, &in->x0);
95 FqNeg(temp, temp);
96 FqMul(&result->x1, temp, &in->x1);
97 }
98
Fq2Neg(Fq2Elem * result,Fq2Elem const * in)99 void Fq2Neg(Fq2Elem* result, Fq2Elem const* in) {
100 FqNeg(&(result->x0), &(in->x0));
101 FqNeg(&(result->x1), &(in->x1));
102 }
103
Fq2Conj(Fq2Elem * result,Fq2Elem const * in)104 void Fq2Conj(Fq2Elem* result, Fq2Elem const* in) {
105 FqCp(&result->x0, &in->x0);
106 FqNeg(&result->x1, &in->x1);
107 }
108
Fq2Square(Fq2Elem * result,Fq2Elem const * in)109 void Fq2Square(Fq2Elem* result, Fq2Elem const* in) {
110 FqElem tmpa;
111 FqElem* temp_a = &tmpa;
112 FqElem tmpb;
113 FqElem* temp_b = &tmpb;
114 FqAdd(temp_a, &in->x0, &in->x1);
115 FqMul(temp_b, &in->x0, &in->x1);
116 FqSub(&result->x0, &in->x0, &in->x1);
117 FqMul(&result->x0, temp_a, &result->x0);
118 FqAdd(&result->x1, temp_b, temp_b);
119 }
120
Fq2MulScalar(Fq2Elem * result,Fq2Elem const * left,FqElem const * right)121 void Fq2MulScalar(Fq2Elem* result, Fq2Elem const* left, FqElem const* right) {
122 FqMul(&(result->x0), &(left->x0), right);
123 FqMul(&(result->x1), &(left->x1), right);
124 }
125
Fq2CondSet(Fq2Elem * result,Fq2Elem const * true_val,Fq2Elem const * false_val,int truth_val)126 void Fq2CondSet(Fq2Elem* result, Fq2Elem const* true_val,
127 Fq2Elem const* false_val, int truth_val) {
128 FqCondSet(&(result->x0), &(true_val->x0), &(false_val->x0), truth_val);
129 FqCondSet(&(result->x1), &(true_val->x1), &(false_val->x1), truth_val);
130 }
131
Fq2Eq(Fq2Elem const * left,Fq2Elem const * right)132 int Fq2Eq(Fq2Elem const* left, Fq2Elem const* right) {
133 return FqEq(&(left->x0), &(right->x0)) && FqEq(&(left->x1), &(right->x1));
134 }
135
Fq2MulXi(Fq2Elem * result,Fq2Elem const * in)136 void Fq2MulXi(Fq2Elem* result, Fq2Elem const* in) {
137 // has the same effect as Fq2Mul(result, in, &Fq2xi) with better speed, low
138 // space;
139 FqElem tmp;
140 FqElem* temp = &tmp;
141 FqAdd(temp, &in->x0, &in->x0);
142 FqSub(temp, temp, &in->x1);
143 FqAdd(&result->x1, &in->x1, &in->x1);
144 FqAdd(&result->x1, &result->x1, &in->x0);
145 FqCp(&result->x0, temp);
146 }
147
Fq2IsZero(Fq2Elem const * value)148 int Fq2IsZero(Fq2Elem const* value) {
149 return FqIsZero(&value->x0) && FqIsZero(&value->x1);
150 }
151