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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
package _weierstrass
import p256r1 "core:crypto/_fiat/field_p256r1"
import p384r1 "core:crypto/_fiat/field_p384r1"
import subtle "core:crypto/_subtle"
Field_Element_p256r1 :: p256r1.Montgomery_Domain_Field_Element
Field_Element_p384r1 :: p384r1.Montgomery_Domain_Field_Element
FE_SIZE_P256R1 :: 32
FE_SIZE_P384R1 :: 48
fe_clear :: proc {
p256r1.fe_clear,
p384r1.fe_clear,
}
fe_clear_vec :: proc {
p256r1.fe_clear_vec,
p384r1.fe_clear_vec,
}
fe_set_bytes :: proc {
p256r1.fe_from_bytes,
p384r1.fe_from_bytes,
}
fe_bytes :: proc {
p256r1.fe_to_bytes,
p384r1.fe_to_bytes,
}
fe_set :: proc {
p256r1.fe_set,
p384r1.fe_set,
}
fe_zero :: proc {
p256r1.fe_zero,
p384r1.fe_zero,
}
fe_a :: proc {
fe_a_p256r1,
fe_a_p384r1,
}
fe_b :: proc {
fe_b_p256r1,
fe_b_p384r1,
}
fe_gen_x :: proc {
fe_gen_x_p256r1,
fe_gen_x_p384r1,
}
fe_gen_y :: proc {
fe_gen_y_p256r1,
fe_gen_y_p384r1,
}
fe_one :: proc {
p256r1.fe_one,
p384r1.fe_one,
}
fe_add :: proc {
p256r1.fe_add,
p384r1.fe_add,
}
fe_sub :: proc {
p256r1.fe_sub,
p384r1.fe_sub,
}
fe_negate :: proc {
p256r1.fe_opp,
p384r1.fe_opp,
}
fe_mul :: proc {
p256r1.fe_mul,
p384r1.fe_mul,
}
fe_square :: proc {
p256r1.fe_square,
p384r1.fe_square,
}
fe_inv :: proc {
p256r1.fe_inv,
p384r1.fe_inv,
}
fe_sqrt :: proc {
p256r1.fe_sqrt,
p384r1.fe_sqrt,
}
fe_equal :: proc {
p256r1.fe_equal,
p384r1.fe_equal,
}
fe_is_odd :: proc {
p256r1.fe_is_odd,
p384r1.fe_is_odd,
}
fe_is_zero :: proc {
fe_is_zero_p256r1,
fe_is_zero_p384r1,
}
fe_cond_select :: proc {
p256r1.fe_cond_select,
p384r1.fe_cond_select,
}
fe_a_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) {
// a = 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc
// = -3 mod p
fe[0] = 18446744073709551612
fe[1] = 17179869183
fe[2] = 0
fe[3] = 18446744056529682436
}
fe_b_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) {
// b = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b
fe[0] = 15608596021259845087
fe[1] = 12461466548982526096
fe[2] = 16546823903870267094
fe[3] = 15866188208926050356
}
fe_gen_x_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) {
// G_x = 0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296
fe[0] = 8784043285714375740
fe[1] = 8483257759279461889
fe[2] = 8789745728267363600
fe[3] = 1770019616739251654
}
fe_gen_y_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) {
// G_y = 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5
fe[0] = 15992936863339206154
fe[1] = 10037038012062884956
fe[2] = 15197544864945402661
fe[3] = 9615747158586711429
}
fe_a_p384r1 :: proc "contextless" (fe: ^Field_Element_p384r1) {
// a = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc
// = -3 mod p
fe[0] = 17179869180
fe[1] = 18446744056529682432
fe[2] = 18446744073709551611
fe[3] = 18446744073709551615
fe[4] = 18446744073709551615
fe[5] = 18446744073709551615
}
fe_b_p384r1 :: proc "contextless" (fe: ^Field_Element_p384r1) {
// b = 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef
fe[0] = 581395848458481100
fe[1] = 17809957346689692396
fe[2] = 8643006485390950958
fe[3] = 16372638458395724514
fe[4] = 13126622871277412500
fe[5] = 14774077593024970745
}
fe_gen_x_p384r1 :: proc "contextless" (fe: ^Field_Element_p384r1) {
// G_x = 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7
fe[0] = 4454189113653900584
fe[1] = 2369870743683386936
fe[2] = 9771750146904378734
fe[3] = 7229551204834152191
fe[4] = 9308930686126579243
fe[5] = 5564951339003155731
}
fe_gen_y_p384r1 :: proc "contextless" (fe: ^Field_Element_p384r1) {
// G_y = 0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f
fe[0] = 2523209505731486974
fe[1] = 11655219901025790380
fe[2] = 10064955099576512592
fe[3] = 14322381509056856025
fe[4] = 15960759442596276288
fe[5] = 3132442392059561449
}
@(require_results)
fe_is_zero_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) -> int {
return int(subtle.u64_is_zero(p256r1.fe_non_zero(fe)))
}
@(require_results)
fe_is_zero_p384r1 :: proc "contextless" (fe: ^Field_Element_p384r1) -> int {
return int(subtle.u64_is_zero(p384r1.fe_non_zero(fe)))
}
|