Files
Odin/core/crypto/_weierstrass/fe.odin
2026-02-03 18:48:07 +09:00

206 lines
4.3 KiB
Odin

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)))
}