-
Notifications
You must be signed in to change notification settings - Fork 3
/
twistpoint_fp2.c
141 lines (128 loc) · 3.98 KB
/
twistpoint_fp2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
* File: dclxvi-20110718/twistpoint_fp2.c
* Author: Ruben Niederhagen, Peter Schwabe
* Public Domain
*/
#include "twistpoint_fp2.h"
void twistpoint_fp2_set(twistpoint_fp2_t rop, const twistpoint_fp2_t op)
{
fp2e_set(rop->m_x, op->m_x);
fp2e_set(rop->m_y, op->m_y);
fp2e_set(rop->m_z, op->m_z);
fp2e_setzero(rop->m_t);
}
void twistpoint_fp2_setneutral(twistpoint_fp2_t rop)
{
fp2e_setone(rop->m_x);
fp2e_setone(rop->m_y);
fp2e_setzero(rop->m_z);
fp2e_setzero(rop->m_t);
}
void twistpoint_fp2_neg(twistpoint_fp2_t rop, const twistpoint_fp2_t op)
{
fp2e_set(rop->m_x, op->m_x);
fp2e_neg(rop->m_y, op->m_y);
fp2e_set(rop->m_z, op->m_z);
fp2e_setzero(rop->m_t);
}
void twistpoint_fp2_set_fp2e(twistpoint_fp2_t rop, const fp2e_t x, const fp2e_t y, const fp2e_t z)
{
fp2e_set(rop->m_x, x);
fp2e_set(rop->m_y, y);
fp2e_set(rop->m_z, z);
fp2e_setzero(rop->m_t);
}
void twistpoint_fp2_affineset_fp2e(twistpoint_fp2_t rop, const fp2e_t x, const fp2e_t y)
{
fp2e_set(rop->m_x, x);
fp2e_set(rop->m_y, y);
fp2e_setone(rop->m_z);
fp2e_setzero(rop->m_t);
}
void twistpoint_fp2_mixadd(twistpoint_fp2_t rop, const twistpoint_fp2_t op1, const twistpoint_fp2_t op2)
{
fp2e_t tfp2e1, tfp2e2, tfp2e3, tfp2e4, tfp2e5, tfp2e6, tfp2e7, tfp2e8, tfp2e9; // Temporary variables needed for intermediary results
fp2e_square(tfp2e1, op1->m_z);
fp2e_mul(tfp2e2, op1->m_z, tfp2e1);
fp2e_mul(tfp2e3, op2->m_x, tfp2e1);
fp2e_mul(tfp2e4, op2->m_y, tfp2e2);
fp2e_sub(tfp2e5, tfp2e3, op1->m_x);
fp2e_short_coeffred(tfp2e5);
fp2e_sub(tfp2e6, tfp2e4, op1->m_y);
fp2e_short_coeffred(tfp2e6);
fp2e_square(tfp2e7, tfp2e5);
fp2e_mul(tfp2e8, tfp2e7, tfp2e5);
fp2e_mul(tfp2e9, op1->m_x, tfp2e7);
fp2e_double(tfp2e1, tfp2e9);
fp2e_add(tfp2e1, tfp2e1, tfp2e8);
fp2e_square(rop->m_x, tfp2e6);
fp2e_sub(rop->m_x, rop->m_x, tfp2e1);
fp2e_short_coeffred(rop->m_x);
fp2e_sub(tfp2e1, tfp2e9, rop->m_x);
fp2e_short_coeffred(tfp2e1);
fp2e_mul(tfp2e2, tfp2e1, tfp2e6);
fp2e_mul(tfp2e3, op1->m_y, tfp2e8);
fp2e_sub(rop->m_y, tfp2e2, tfp2e3);
fp2e_short_coeffred(rop->m_y);
fp2e_mul(rop->m_z, op1->m_z, tfp2e5);
}
void twistpoint_fp2_double(twistpoint_fp2_t rop, const twistpoint_fp2_t op)
{
fp2e_t tfp2e1, tfp2e2, tfp2e3, tfp2e4; // Temporary variables needed for intermediary results
fp2e_square(tfp2e1, op->m_y);
fp2e_mul(tfp2e2, tfp2e1, op->m_x);
fp2e_double(tfp2e2, tfp2e2);
fp2e_double(tfp2e2, tfp2e2);
fp2e_square(tfp2e3, tfp2e1);
fp2e_double(tfp2e3, tfp2e3);
fp2e_double(tfp2e3, tfp2e3);
fp2e_double(tfp2e3, tfp2e3);
fp2e_square(tfp2e4, op->m_x);
fp2e_triple(tfp2e4, tfp2e4);
fp2e_short_coeffred(tfp2e4);
fp2e_square(rop->m_x, tfp2e4);
fp2e_double(tfp2e1, tfp2e2);
fp2e_sub(rop->m_x, rop->m_x, tfp2e1);
fp2e_short_coeffred(rop->m_x);
fp2e_sub(tfp2e1, tfp2e2, rop->m_x);
fp2e_short_coeffred(tfp2e1);
fp2e_mul(rop->m_z, op->m_y, op->m_z);
fp2e_double(rop->m_z, rop->m_z);
fp2e_short_coeffred(rop->m_z);
fp2e_mul(rop->m_y, tfp2e4, tfp2e1);
fp2e_sub(rop->m_y, rop->m_y, tfp2e3);
fp2e_short_coeffred(rop->m_y);
}
void twistpoint_fp2_mul(twistpoint_fp2_t rop, const twistpoint_fp2_t op, const scalar_t scalar, const unsigned int scalar_bitsize)
{
size_t i;
twistpoint_fp2_t r;
twistpoint_fp2_set(r, op);
for (i = scalar_bitsize - 1; i > 0; i--) {
twistpoint_fp2_double(r, r);
if (scalar_getbit(scalar, i - 1))
twistpoint_fp2_mixadd(r, r, op);
}
twistpoint_fp2_set(rop, r);
}
void twistpoint_fp2_makeaffine(twistpoint_fp2_t op)
{
if (fp2e_isone(op->m_z))
return;
fp2e_invert(op->m_z, op->m_z);
fp2e_mul(op->m_y, op->m_y, op->m_z);
fp2e_square(op->m_z, op->m_z);
fp2e_mul(op->m_x, op->m_x, op->m_z);
fp2e_mul(op->m_y, op->m_y, op->m_z);
fp2e_setone(op->m_z);
}
void twistpoint_fp2_print(FILE * outfile, const twistpoint_fp2_t op)
{
fprintf(outfile, "[");
fp2e_print(outfile, op->m_x);
fprintf(outfile, ", ");
fp2e_print(outfile, op->m_y);
fprintf(outfile, ", ");
fp2e_print(outfile, op->m_z);
fprintf(outfile, "]");
}