+/* 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.
+ All Rights Reserved.
+
+ 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
+ * FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551
+ * 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\
+ * 72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650
+ * = 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};