aboutsummaryrefslogtreecommitdiff
path: root/core/crypto/_weierstrass/fe.odin
blob: 8ff6fe346ab2bcf75bd03bcdf708e468dfcce943 (plain)
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)))
}