Let us walk on the 3-isogeny graph
Loading...
Searching...
No Matches
p381.h
Go to the documentation of this file.
1// Parameters concerning P381
2
3#ifndef SSEC_PARAMETERS_P381_H
4#define SSEC_PARAMETERS_P381_H
5
6#define FIELD_NAME "p381"
7#define FIELD_BITS 381
8#define FIELD_BYTES 48
9#define FIELD_64BITS_WORDS 6
10#define QFIELD_BYTES 96
11#define MASK_FIELD_ELEMENT 0x1fffffffffffffff
12#define SECURITY_BITS 128
13
14#define BIT_LENGTH_PATH 256
15#define TRITLENGTH_PATH 162
16
17// Field characteristic p
18static const uint64_t FIELD_CHARACTERISTIC[FIELD_64BITS_WORDS] = {
19 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
20 0xFFFFFFFFFFFFFFFF, 0x1B4FFFFFFFFFFFFF
21};
22
23// Neutral multiplicative in Montgomery domain: R = 2ᵉ mod p
24static const uint64_t MONTGOMERY_CONSTANT_ONE[FIELD_64BITS_WORDS] = {
25 0x9, 0x0, 0x0, 0x0,
26 0x0, 0xA30000000000000
27};
28
29// Montgomery constant R² = (2ᵉ)² mod p where e = 0 mod 64 s.t. 2ᵉ⁻⁶⁴ < p < 2ᵉ
30static const uint64_t MONTGOMERY_CONSTANT_R_SQUARED[FIELD_64BITS_WORDS] = {
31 0x532F7367B0545BBA, 0x24520383CECAB0EA, 0x257DF31CB46E21FA, 0xCBDCD9EC1516D8C0,
32 0x1480E0F3B2AC3A94, 0x175CC72D1B887E89
33};
34
35// Exponent constant required for field inversion: p - 2
36static const uint64_t FIELD_INVERSION_EXPONENT[FIELD_64BITS_WORDS] = {
37 0xFFFFFFFFFFFFFFFD, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
38 0xFFFFFFFFFFFFFFFF, 0x1B4FFFFFFFFFFFFF
39};
40
41// Exponent constant required for computing square-roots in GF(p): (p - 1) / 2
42static const uint64_t SQUARE_ROOT_EXPONENT_12[FIELD_64BITS_WORDS] = {
43 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
44 0xFFFFFFFFFFFFFFFF, 0xDA7FFFFFFFFFFFF
45};
46
47// Exponent constant required for computing square-roots in GF(p²): (p - 3) / 4
48static const uint64_t SQUARE_ROOT_EXPONENT_34[FIELD_64BITS_WORDS] = {
49 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
50 0xFFFFFFFFFFFFFFFF, 0x6D3FFFFFFFFFFFF
51};
52
53// Exponent constant required for computing square-roots in GF(p²): (p + 1) / 4
54static const uint64_t SQUARE_ROOT_EXPONENT_14[FIELD_64BITS_WORDS] = {
55 0x0, 0x0, 0x0, 0x0,
56 0x0, 0x6D4000000000000
57};
58
59// Exponent constant required for computing cube-roots
60#define CUBE_ROOT_EXPONENT_BITS 759
61static const uint64_t CUBE_ROOT_EXPONENT[2 * FIELD_64BITS_WORDS] = {
62 0xAAAAAAAAAAAAAAAB, 0xAAAAAAAAAAAAAAAA, 0xAAAAAAAAAAAAAAAA, 0xAAAAAAAAAAAAAAAA,
63 0xAAAAAAAAAAAAAAAA, 0xC10AAAAAAAAAAAAA, 0x1C71C71C71C71C71, 0x71C71C71C71C71C7,
64 0xC71C71C71C71C71C, 0x1C71C71C71C71C71, 0x71C71C71C71C71C7, 0x52E2C71C71C71C
65};
66
67// Cube root of unity in Montgomery domain
68static const uint64_t CUBE_ROOT_OF_UNITY[2 * FIELD_64BITS_WORDS] = {
69 0x1BB300CBD0A722C2, 0x59ABE44B6FF03705, 0xC41B638670BF865C, 0xB69DC6E7ADB4D493,
70 0x8FEC0647B44AD5A9, 0xF626F6109289C5E,
71 0x0, 0x0, 0x0, 0x0,
72 0x0, 0x0
73};
74
75static const uint64_t ONE_HALF[FIELD_64BITS_WORDS] = {
76 0x0000000000000004, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
77 0x0000000000000000, 0x12C0000000000000
78};
79static const uint64_t ONE_THIRD[FIELD_64BITS_WORDS] = {
80 0xAAAAAAAAAAAAAAAD, 0xAAAAAAAAAAAAAAAA, 0xAAAAAAAAAAAAAAAA, 0xAAAAAAAAAAAAAAAA,
81 0xAAAAAAAAAAAAAAAA, 0x159AAAAAAAAAAAAA
82};
83
84static const uint64_t ONE_NINTH[FIELD_64BITS_WORDS] = {
85 0xE38E38E38E38E38F, 0x8E38E38E38E38E38, 0x38E38E38E38E38E3, 0xE38E38E38E38E38E,
86 0x8E38E38E38E38E38, 0x7338E38E38E38E3
87};
88
89static const uint64_t ONE_BY_27[FIELD_64BITS_WORDS] = {
90 0xA12F684BDA12F685, 0x2F684BDA12F684BD, 0x684BDA12F684BDA1, 0x4BDA12F684BDA12F,
91 0xDA12F684BDA12F68, 0x26684BDA12F684B
92};
93
94#endif // SSEC_PARAMETERS_P381_H
#define FIELD_64BITS_WORDS
Definition p254.h:9