# curveParamData.h   [plain text]

```/* New ECC curves,

14 Apr 2001 (REC) ensured x1Minus arithmetic & prime point orders
5 Apr 2001 (REC) factored minusorder for NIST-P-192
3 Apr 2001 (REC) first draft

c. 2001 Apple Computer, Inc.

Currently there are 7 (seven) curves, at varying
bit-depth and varying parameter types:

FEE curves (use Montgomery arithmetic and feemod base-prime):
31 bits
127 bits
IEEE curves (use projective arithmetic):
31 bits  (feemod base-prime)
128 bits (feemod base-prime)
161 bits (feemod base-prime) (default preference)
161 bits (general prime)
192 bits (general. prime) (NIST-recommended)

Each curve is given key comments atop the parameters.
For performance considerations,

primeType->Mersenne is faster than primeType->feemod is
faster than primeType->general

curveType->Montgomery is faster than curveType->Weierstrass,

Some choices are not obvious except to cryptographers;
e.g., the two curves given for 161 bits exist because
of cryptographic controversies; probably the curve with
both orders prime is more secure, so it is perhaps
the curve of choice at 161 bits.

The parameters/points have standard meaning, except for our
special entities as listed below.  It is important to note the
principle thgat, without exception, every CryptKit base prime
p is = 3 (mod 4).  This allows simple square-rooting in the field
F_p.  Because of this universal constraint, (-1) is always a
quadratic nonresidue and so twist curves as below can assume
g = -1.

(...)plusOrder :=  The usual elliptic-curve order;
(...)x1Plus := x-coordinate on y^2 = x^3 + c x^2 + a x + b;
(...)x1OrderPlus := Order of x1Plus, always divides plusOrder
(...)minusOrder := Order of the twist curve = 2p+2-plusOrder
(...)x1Minus := x-coordinate chosen on the twist curve
g y^2 = x^3 + c x^2 + a x + b
where g = -1 is the nonresidue, and such that
the special, x-coordinates-only, twofold-ambiguous "add" of
FEED works on the minus curve, using the same curve
parameters a,b,c as for the plus curve.  Note that
x1Minus is to be chosen so that the correct "add" arithmetic
occurs, and also so that the desired point order accrues.
(...)x1OrderMinus := Order of x1Plus, always divides minusOrder.

In each of the curves specified below, the plusOrder (at least)
is prime, while each of the point orders x1OrderPlus/Minus
is always prime.

Note that the older labels Atkin3, Atkin4 have been abolished.

*/

/* FEE CURVE: USE FOR FEE SIG. & FEED ONLY.
* primeType->Mersenne
* curveType->Montgomery
* q = 31;   k = 1;  p = 2^q - k;
* a = 1;   b = 0;   c = 666;
* Both orders composite.
*/
static const arrayDigit ga_31m_x1Plus[]   =
{2, 61780, 6237};
/* 408809812 */
static const arrayDigit ga_31m_x1Minus[]  =
{2,12973,30585};
/* 2004431533 */
static const arrayDigit ga_31m_plusOrder[]  =
{2, 25928, 32768 };
/* 2147509576 = 2^3 * 268438697. */
static const arrayDigit ga_31m_minusOrder[]  =
{2, 39608, 32767 };
/* 2147457720 = 2^3 * 3 * 5 * 17895481. */
static const arrayDigit ga_31m_x1OrderPlus[] =
{2, 3241, 4096};
/* 268438697 */
static const arrayDigit ga_31m_x1OrderMinus[]  =
{2, 4153, 273};
/* 17895481 */
static const arrayDigit ga_31m_x1OrderPlusRecip[]  =
{2, 52572, 16383};
static const arrayDigit ga_31m_lesserX1OrderRecip[]  =
{2, 759, 960};

/* IEEE P1363 COMPATIBLE.
* primeType->Mersenne
* curveType->Weierstrass
* q = 31;   k = 1; p = 2^q-k;
* a = 5824692    b = 2067311435   c = 0
* Both orders prime.
*/
static const arrayDigit ga_31w_x1Plus[]   =
{1, 6 };
static const arrayDigit ga_31w_x1Minus[]  =
{1, 7 };
static const arrayDigit ga_31w_plusOrder[]  =
{2,59003,32766 };
/* 2147411579 */
static const arrayDigit ga_31w_minusOrder[]  =
{2,6533,32769 };
/* 2147555717 */
static const arrayDigit ga_31w_x1OrderPlus[] =
{2,59003,32766};
/* 2147411579 */
static const arrayDigit ga_31w_x1OrderMinus[]  =
{2,6533,32769};
/* 2147555717 */
static const arrayDigit ga_31w_x1OrderPlusRecip[]  =
{2, 6535, 32769};

static const arrayDigit ga_31w_a[]  =
{2,57524,88};
/* 5824692 */
static const arrayDigit ga_31w_b[]  =
{2,43851,31544};
/* 2067311435 */

/* FEE CURVE: USE FOR FEE SIG. & FEED ONLY.
* primeType->Mersenne
* curveType->Montgomery
* q = 127;   k = 1;  p = 2^q - k;
* a = 1;   b = 0;   c = 666;
* Both orders composite.
*/
static const arrayDigit ga_127m_x1Plus[]  =
{8,     24044, 39922, 11050,
24692, 34049, 9793,  1228, 31562};
/* 163879370753099435779911346846180728300 */
static const arrayDigit ga_127m_x1Minus[] =
{8,49015,6682,26772,63672,45560,46133,24769,8366};
/* 43440717976631899041527862406676135799 */
static const arrayDigit ga_127m_plusOrder[]  =
{ 8,     14612, 61088, 34331,
32354, 65535, 65535, 65535,
32767};
/* 170141183460469231722347548493196835092 =
2^2 * 3^4 * 71 * 775627 * 9535713005180210505588285449. */
static const arrayDigit ga_127m_minusOrder[] =
{ 8,     50924, 4447, 31204,
33181, 0,     0,    0,
32768 };
/* 170141183460469231741027058938571376364 =
2^2 * 17 * 743 * 1593440383 * 2113371777483973234080067. */
static const arrayDigit ga_127m_x1OrderPlus[] =
{6,     8201,  61942, 37082,
53787, 49605, 7887 };
/* 9535713005180210505588285449 */
static const arrayDigit ga_127m_x1OrderMinus[] =
{6,    14659, 1977,16924,
7446, 49030, 1};
/* 2113371777483973234080067 */
static const arrayDigit ga_127m_x1OrderPlusRecip[]  =
{6, 21911, 8615, 0, 40960, 64107, 8507};
static const arrayDigit ga_127m_lesserX1OrderRecip[]  =
{6, 44759, 65533, 17695, 61560, 18883, 2};

/* IEEE P1363 COMPATIBLE.
* primeType->feemod
* curveType->Weierstrass
* q = 127;  k = -57675; p = 2^q - k;
* a = 170141183460469025572049133804586627403;
* b = 170105154311605172483148226534443139403;    c = 0;
* Both orders prime.:
*/
static const arrayDigit ga_128w_x1Plus[] =
{1,6};
/* 6 */
static const arrayDigit ga_128w_x1Minus[] =
{1,3};
/* 3 */
static const arrayDigit ga_128w_plusOrder[] =
{8,40455,13788,48100,24190,1,0,0,32768};
/* 170141183460469231756943134065055014407. */
static const arrayDigit ga_128w_minusOrder[] =
{8,9361,51749,17435,41345,65534,65535,65535,32767};
/* 170141183460469231706431473366713312401. */
static const arrayDigit ga_128w_x1OrderPlus[] =
{8,40455,13788,48100,24190,1,0,0,32768};
/* 170141183460469231756943134065055014407. */
static const arrayDigit ga_128w_x1OrderMinus[] =
{8,9361,51749,17435,41345,65534,65535,65535,32767};
/* 170141183460469231706431473366713312401. */
static const arrayDigit ga_128w_x1OrderPlusRecip[] =
{9,34802,10381,4207,34309,65530,65535,65535,65535,1};
static const arrayDigit ga_128w_lesserX1OrderRecip[] =
{8,56178,13786,48100,24190,1,0,0,32768};

static const arrayDigit ga_128w_a[] =
{8,29003,44777,29962,4169,54360,65535,65535,32767};
/* 170141183460469025572049133804586627403; */
static const arrayDigit ga_128w_b[] =
{8,16715,42481,16221,60523,56573,13644,4000,32761};
/* 170105154311605172483148226534443139403. */

/* IEEE P1363 COMPATIBLE.
* primeType->feemod
* curveType->Weierstrass
* q = 160;  k = -5875; p = 2^q - k;
* a = 1461501637330902918203684832716283019448563798259;
* b = 36382017816364032;    c = 0;
* Both orders prime.:
*/
static const arrayDigit ga_161w_x1Plus[] =
{1,7};
/* 7 */
static const arrayDigit ga_161w_x1Minus[] =
{1,4};
/* 4 */
static const arrayDigit ga_161w_plusOrder[] =
{11,50651,30352,49719,403,64085,1,0,0,0,0,1};
/* 1461501637330902918203687223801810245920805144027. */
static const arrayDigit ga_161w_minusOrder[] =
{10,26637,35183,15816,65132,1450,65534,65535,65535,65535,65535};
/* 1461501637330902918203682441630755793391059953677. */
static const arrayDigit ga_161w_x1OrderPlus[] =
{11,50651,30352,49719,403,64085,1,0,0,0,0,1};
/* 1461501637330902918203687223801810245920805144027. */
static const arrayDigit ga_161w_x1OrderMinus[] =
{10,26637,35183,15816,65132,1450,65534,65535,65535,65535,65535};
/* 1461501637330902918203682441630755793391059953677. */
static const arrayDigit ga_161w_x1OrderPlusRecip[] =
{11,59555,9660,63266,63920,5803,65528,65535,65535,65535,65535,3};
/* added by dmitch */
static const arrayDigit ga_161w_lesserX1OrderRecip[] =
{12,38902,30352,49719,403,64085,1,0,0,0,0,1,0};
/* end addenda */

static const arrayDigit ga_161w_a[] =  {10,4339,47068,65487,65535,65535,65535,65535,65535,65535,65535};
/* 1461501637330902918203684832716283019448563798259; */
static const arrayDigit ga_161w_b[] =    {4,1024,41000,16704,129};
/* 36382017816364032. */

/* IEEE P1363 COMPATIBLE.
* primeType->General
* curveType->Weierstrass
* p is a 161-bit random prime (below, ga_161_gen_bp[]);
* a = -152;   b = 722;    c = 0;
* Both orders composite.:
*/
static const arrayDigit ga_161_gen_bp[] =
{11,41419,58349,36408,14563,25486,9098,29127,50972,7281,8647,1};
/* baseprime = 1654338658923174831024422729553880293604080853451 */
static const arrayDigit ga_161_gen_x1Plus[] =
{10,59390,38748,49144,50217,32781,46057,53816,62856,18968,55868};
/* 1245904487553815885170631576005220733978383542270 */
static const arrayDigit ga_161_gen_x1Minus[] =
{10,12140,40021,9852,49578,18446,39468,28773,10952,26720,52624};
/* 1173563507729187954550227059395955904200719019884 */
static const arrayDigit ga_161_gen_plusOrder[] =
{11,41420,58349,36408,14563,25486,9100,29127,50972,7281,8647,1};
/* 1654338658923174831024425147405519522862430265804 =
2^2 * 23 * 359 * 479 * 102107 * 1024120625531724089187207582052247831. */
static const arrayDigit ga_161_gen_minusOrder[] =
{11,41420,58349,36408,14563,25486,9096,29127,50972,7281,8647,1};
/* 1654338658923174831024420311702241064345731441100 =
2^2 * 5^2 * 17^2 * 57243552211874561627142571339177891499852299. */
static const arrayDigit ga_161_gen_x1OrderPlus[] =
{8,59671,64703,58305,55887,34170,37971,15627,197};
/* 1024120625531724089187207582052247831 */
static const arrayDigit ga_161_gen_x1OrderMinus[] =
{10,49675,56911,64364,6281,5543,59511,52057,44604,37151,2};
/* 57243552211874561627142571339177891499852299 */
static const arrayDigit ga_161_gen_x1OrderPlusRecip[] =
{8, 7566, 37898, 14581, 2404, 52670, 23839, 17554, 332};

static const arrayDigit ga_161_gen_a[] =    {-1, 152};	/* a = -152 */
static const arrayDigit ga_161_gen_b[] =    { 1, 722};	/* b = 722 */

/* IEEE P1363 COMPATIBLE.
* (NIST-P-192 RECOMMENDED PRIME)
* primeType->General
* curveType->Weierstrass
* p is a 192-bit prime (with efficient bit structure) (below, ga_192_gen_bp[]);
* a = -3;   b = 2455155546008943817740293915197451784769108058161191238065;    c = 0;
* Plus-order is prime, minus-order is composite.
*/
static const arrayDigit ga_192_gen_bp[] =
{12,65535,65535,65535,65535,65534,65535,65535,65535,65535,65535,65535,65535};
/* baseprime =
6277101735386680763835789423207666416083908700390324961279 */
static const arrayDigit ga_192_gen_x1Plus[] =
{1,3};
/* 3 */
static const arrayDigit ga_192_gen_x1Minus[] =
{12,25754,63413,46363,42413,24848,21836,55473,50853,40413,10264,8715,59556};
/*  5704344264203732742656350325931731344592841761552300598426 */
static const arrayDigit ga_192_gen_plusOrder[] =
{12,10289,46290,51633,5227,63542,39390,65535,65535,65535,65535,65535,65535};
/* 6277101735386680763835789423176059013767194773182842284081 */
static const arrayDigit ga_192_gen_minusOrder[] =
{13,55247,19245,13902,60308,1991,26145,0,0,0,0,0,0,1};
/* 6277101735386680763835789423239273818400622627597807638479 =
23 * 10864375060560251605900677743 *
25120401793443689936479125511   */
static const arrayDigit ga_192_gen_x1OrderPlus[] =
{12,10289,46290,51633,5227,63542,39390,65535,65535,65535,65535,65535,65535};
/* 6277101735386680763835789423176059013767194773182842284081 */
static const arrayDigit ga_192_gen_x1OrderMinus[] =
{12,16649,40728,9152,53911,59923,9684,22795,17096,45590,34192,25644,2849};
/* 272917466755942641905903887966924948626114027286861201673 =
10864375060560251605900677743 * 25120401793443689936479125511
*/
static const arrayDigit ga_192_gen_x1OrderPlusRecip[] =
{13,55247,19245,13902,60308,1993,26145,0,0,0,0,0,0,1};
static const arrayDigit ga_192_gen_lesserX1OrderRecip[] =
{12,57756,63294,44830,2517,2125,63187,65535,65535,65535,65535,65535,5887};

static const arrayDigit ga_192_gen_a[] =    {-1, 3}; /* a = -3. */
static const arrayDigit ga_192_gen_b[] =
{12,47537,49478,57068,65208,12361,29220,59819,4007,32999,58780,1305,25633};
/* b = 2455155546008943817740293915197451784769108058161191238065. */

/***
*** ANSI X9.62/Certicom curves
***/

/*
* secp192r1
*
* p     = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF
*		 = 6277101735386680763835789423207666416083908700390324961279 (d)
* a     = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC
*		 = 6277101735386680763835789423207666416083908700390324961276
* b     = 64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1
*		 = 2455155546008943817740293915197451784769108058161191238065
* x     = 188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012
*		 = 602046282375688656758213480587526111916698976636884684818
* y     = 07192B95FFC8DA78631011ED6B24CDD573F977A11E794811
*		 = 174050332293622031404857552280219410364023488927386650641
* order = FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831
*		 = 6277101735386680763835789423176059013767194773182842284081
* x1OrderRecip = 1000000000000000000000000662107c9eb94364e4b2dd7cf
*/
static const arrayDigit ga_192_secp_bp[] =
{12, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
static const arrayDigit ga_192_secp_x1Plus[] =
{12, 0x1012, 0x82ff, 0xafd, 0xf4ff, 0x8800, 0x43a1, 0x20eb, 0x7cbf, 0x90f6, 0xb030, 0xa80e, 0x188d};
static const arrayDigit ga_192_secp_y1Plus[] =
{12, 0x4811, 0x1e79, 0x77a1, 0x73f9, 0xcdd5, 0x6b24, 0x11ed, 0x6310, 0xda78, 0xffc8, 0x2b95, 0x719};
static const arrayDigit ga_192_secp_plusOrder[] =
{12, 0x2831, 0xb4d2, 0xc9b1, 0x146b, 0xf836, 0x99de, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
/* the curve order is prime, so x1Order = curveOrder */
static const arrayDigit ga_192_secp_x1OrderPlus[] =
{12, 0x2831, 0xb4d2, 0xc9b1, 0x146b, 0xf836, 0x99de, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
static const arrayDigit ga_192_secp_x1OrderPlusRecip[] =
{13, 0xd7cf, 0x4b2d, 0x364e, 0xeb94, 0x7c9, 0x6621, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1};
static const arrayDigit ga_192_secp_a[] =
{12, 0xfffc, 0xffff, 0xffff, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
static const arrayDigit ga_192_secp_b[] =
{12, 0xb9b1, 0xc146, 0xdeec, 0xfeb8, 0x3049, 0x7224, 0xe9ab, 0xfa7, 0x80e7, 0xe59c, 0x519, 0x6421};

/*
* secp256r1
*
* p     = FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF
*		 = 115792089210356248762697446949407573530086143415290314195533631308867097853951
* a     = FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC
*		 = 115792089210356248762697446949407573530086143415290314195533631308867097853948
* b     = 5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B
*		 = 41058363725152142129326129780047268409114441015993725554835256314039467401291
* x     = 6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296
*		 = 48439561293906451759052585252797914202762949526041747995844080717082404635286
* y     = 4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5
*		 = 36134250956749795798585127919587881956611106672985015071877198253568414405109
* order = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551
*		 = 115792089210356248762697446949407573529996955224135760342422259061068512044369
* x1OrderRecip = 100000000fffffffffffffffeffffffff43190552df1a6c21012ffd85eedf9bfe
*/
static const arrayDigit ga_256_secp_bp[] =
{16, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x1, 0x0, 0xffff, 0xffff};
static const arrayDigit ga_256_secp_x1Plus[] =
{16, 0xc296, 0xd898, 0x3945, 0xf4a1, 0x33a0, 0x2deb, 0x7d81, 0x7703, 0x40f2,
0x63a4, 0xe6e5, 0xf8bc, 0x4247, 0xe12c, 0xd1f2, 0x6b17};
static const arrayDigit ga_256_secp_y1Plus[] =
{16, 0x51f5, 0x37bf, 0x4068, 0xcbb6, 0x5ece, 0x6b31, 0x3357, 0x2bce, 0x9e16,
0x7c0f, 0xeb4a, 0x8ee7, 0x7f9b, 0xfe1a, 0x42e2, 0x4fe3};
static const arrayDigit ga_256_secp_plusOrder[] =
{16, 0x2551, 0xfc63, 0xcac2, 0xf3b9, 0x9e84, 0xa717, 0xfaad, 0xbce6, 0xffff,
0xffff, 0xffff, 0xffff, 0x0, 0x0, 0xffff, 0xffff};
static const arrayDigit ga_256_secp_x1OrderPlus[] =
{16, 0x2551, 0xfc63, 0xcac2, 0xf3b9, 0x9e84, 0xa717, 0xfaad, 0xbce6, 0xffff,
0xffff, 0xffff, 0xffff, 0x0, 0x0, 0xffff, 0xffff};
static const arrayDigit ga_256_secp_x1OrderPlusRecip[] =
{17, 0x9bfe, 0xeedf, 0xfd85, 0x12f, 0x6c21, 0xdf1a, 0x552, 0x4319, 0xffff,
0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0x0, 0x0, 0x1};
static const arrayDigit ga_256_secp_a[] =
{16, 0xfffc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x1, 0x0, 0xffff, 0xffff};
static const arrayDigit ga_256_secp_b[] =
{16, 0x604b, 0x27d2, 0x3c3e, 0x3bce, 0xb0f6, 0xcc53, 0x6b0, 0x651d, 0x86bc,
0x7698, 0xbd55, 0xb3eb, 0x93e7, 0xaa3a, 0x35d8, 0x5ac6};

/*
* secp384r1
*
* p     = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF\
*		   0000000000000000FFFFFFFF
*		 = 394020061963944792122790401001436138050797392704654466679482934042457217\
*		   71496870329047266088258938001861606973112319
* a     = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF\
*		   0000000000000000FFFFFFFC
*		 = 394020061963944792122790401001436138050797392704654466679482934042457217\
*		   71496870329047266088258938001861606973112316
* b     = B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D\
*		   8A2ED19D2A85C8EDD3EC2AEF
*		 = 275801935599597058778490118403890480930569058563615685214287073019886892\
*		   41309860865136260764883745107765439761230575
* x     = AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25D\
*		   BF55296C3A545E3872760AB7
*		 = 262470350957996892686231567445669818918529234911092133878156159009255188\
*		   54738050089022388053975719786650872476732087
* y     = 3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE\
*		   1D7E819D7A431D7C90EA0E5F
*		 = 832571096148902998554675128952010817928785304886131559470920590248050319\
*		   9884419224438643760392947333078086511627871
* order = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB2\
*		   48B0A77AECEC196ACCC52973
*		 = 394020061963944792122790401001436138050797392704654466679469052796276593\
*		   99113263569398956308152294913554433653942643
*/
static const arrayDigit ga_384_secp_bp[] =
{24, 0xffff, 0xffff, 0x0, 0x0, 0x0, 0x0, 0xffff, 0xffff, 0xfffe, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
static const arrayDigit ga_384_secp_x1Plus[] =
{24, 0xab7, 0x7276, 0x5e38, 0x3a54, 0x296c, 0xbf55, 0xf25d, 0x5502, 0x2a38,
0x8254, 0x41e0, 0x59f7, 0x9b98, 0x8ba7, 0x3b62, 0x6e1d, 0xad74, 0xf320,
0xc71e, 0x8eb1, 0x537, 0xbe8b, 0xca22, 0xaa87};
static const arrayDigit ga_384_secp_y1Plus[] =
{24, 0xe5f, 0x90ea, 0x1d7c, 0x7a43, 0x819d, 0x1d7e, 0xb1ce, 0xa60, 0xb8c0,
0xb5f0, 0x3113, 0xe9da, 0x147c, 0x289a, 0x1dbd, 0xf8f4, 0xdc29, 0x9292,
0x98bf, 0x5d9e, 0x2c6f, 0x9626, 0xde4a, 0x3617};
static const arrayDigit ga_384_secp_plusOrder[] =
{24, 0x2973, 0xccc5, 0x196a, 0xecec, 0xa77a, 0x48b0, 0xdb2, 0x581a, 0x2ddf,
0xf437, 0x4d81, 0xc763, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
static const arrayDigit ga_384_secp_x1OrderPlus[] =
{24, 0x2973, 0xccc5, 0x196a, 0xecec, 0xa77a, 0x48b0, 0xdb2, 0x581a, 0x2ddf,
0xf437, 0x4d81, 0xc763, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
static const arrayDigit ga_384_secp_x1OrderPlusRecip[] =
{25, 0xd68d, 0x333a, 0xe695, 0x1313, 0x5885, 0xb74f, 0xf24d, 0xa7e5, 0xd220, 0xbc8,
0xb27e, 0x389c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1};
static const arrayDigit ga_384_secp_a[] =
{24, 0xfffc, 0xffff, 0x0, 0x0, 0x0, 0x0, 0xffff, 0xffff, 0xfffe, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
static const arrayDigit ga_384_secp_b[] =
{24, 0x2aef, 0xd3ec, 0xc8ed, 0x2a85, 0xd19d, 0x8a2e, 0x398d, 0xc656, 0x875a,
0x5013, 0x88f, 0x314, 0x4112, 0xfe81, 0x9c6e, 0x181d, 0x2d19, 0xe3f8, 0x56b,
0x988e, 0xe7e4, 0xe23e, 0x2fa7, 0xb331};

/*
* secp521r1
* p     = 01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\
*		   FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
*		 = 686479766013060971498190079908139321726943530014330540939446345918554318\
*		   339765605212255964066145455497729631139148085803712198799971664381257402\
*		   8291115057151
* a     = 01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\
*		   FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC
*		 = 686479766013060971498190079908139321726943530014330540939446345918554318\
*		   339765605212255964066145455497729631139148085803712198799971664381257402\
*		   8291115057148
* b     = 0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E15619\
*		   3951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00
*		 = 109384903807373427451111239076680556993620759895168374899458639449595311\
*		   615073501601370873757375962324859213229670631330943845253159101291214232\
*		   7488478985984
* x     = 00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B\
*		   5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66
*		 = 266174080205021706322876871672336096072985916875697314770667136841880294\
*		   499642780849154508062777190235209424122506555866215711354557091681416163\
*		   7315895999846
* y     = 011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE\
*		 = 375718002577002046354550722449118360359445513476976248669456777961554447\
*		   744055631669123440501294553956214444453728942852258566672919658081012434\
*		   4277578376784
* order = 01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5186\
*		   8783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409
*		 = 686479766013060971498190079908139321726943530014330540939446345918554318\
*		   339765539424505774633321719753296399637136332111386476861244038034037280\
*		   8892707005449
* orderRecip = 200 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000005 \
*					ae79787c 40d06994 8033feb7 08f65a2f c44a3647 7663b851 449048e1 6ec79bf7
* orderRecip = 2000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7
*/
static const arrayDigit ga_521_secp_bp[] =
{33, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x1ff};
static const arrayDigit ga_521_secp_x1Plus[] =
{33, 0xbd66, 0xc2e5, 0x7e31, 0xf97e, 0x429b, 0x856a, 0xb3c1, 0x3348, 0xa8de, 0xa2ff,
0xc127, 0xfe1d, 0x5928, 0xefe7, 0x5e77, 0xa14b, 0x3dba, 0x6b4d, 0xaf60, 0xf828, 0xb521,
0x53f, 0x8139, 0x9c64, 0xb442, 0x2395, 0xcb66, 0x9e3e, 0xe9cd, 0x404, 0x6b7, 0x858e, 0xc6};
static const arrayDigit ga_521_secp_y1Plus[] =
{33, 0x6650, 0x9fd1, 0x9476, 0x88be, 0xc240, 0xa272, 0x7086, 0x353c, 0x761, 0x3fad,
0xb901, 0xc550, 0x2640, 0x5ef4, 0x7299, 0x97ee, 0x662c, 0x273e, 0xbd17, 0x17af, 0x4468,
0x579b, 0x4449, 0x98f5, 0x1bd9, 0x2c7d, 0x5fb4, 0x5c8a, 0xc004, 0x9a3b, 0x6a78, 0x3929,
0x118};
static const arrayDigit ga_521_secp_plusOrder[] =
{33, 0x6409, 0x9138, 0xb71e, 0xbb6f, 0x47ae, 0x899c, 0xc9b8, 0x3bb5, 0xa5d0, 0xf709,
0x148, 0x7fcc, 0x966b, 0xbf2f, 0x8783, 0x5186, 0xfffa, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x1ff};
static const arrayDigit ga_521_secp_x1OrderPlus[] =
{33, 0x6409, 0x9138, 0xb71e, 0xbb6f, 0x47ae, 0x899c, 0xc9b8, 0x3bb5, 0xa5d0, 0xf709,
0x148, 0x7fcc, 0x966b, 0xbf2f, 0x8783, 0x5186, 0xfffa, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x1ff};
static const arrayDigit ga_521_secp_x1OrderPlusRecip[] =
{33, 0x9bf7, 0x6ec7, 0x48e1, 0x4490, 0xb851, 0x7663, 0x3647, 0xc44a, 0x5a2f, 0x8f6, 0xfeb7, 0x8033, 0x6994, 0x40d0, 0x787c, 0xae79, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200};
static const arrayDigit ga_521_secp_a[] =
{33, 0xfffc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x1ff};
static const arrayDigit ga_521_secp_b[] =
{33, 0x3f00, 0x6b50, 0x1fd4, 0xef45, 0x34f1, 0x3d2c, 0xdf88, 0x3573, 0xbf07,
0x3bb1, 0xc0bd, 0x1652, 0x937b, 0xec7e, 0x3951, 0x5619, 0x9e1, 0x8ef1, 0x8991,
0xb8b4, 0x15f3, 0x99b3, 0x725b, 0xa2da, 0x40ee, 0xb685, 0x21a0, 0x929a, 0x9a1f,
0x8e1c, 0xb961, 0x953e, 0x51};
```