mirror of
https://github.com/odin-lang/Odin.git
synced 2026-05-27 06:08:13 +00:00
206 lines
4.3 KiB
Odin
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)))
|
|
}
|