From 4e94c35f7d21a2956d2bf2f4a9b474bdd0244914 Mon Sep 17 00:00:00 2001 From: Vlad Krasnov Date: Fri, 1 Sep 2023 09:51:45 -0400 Subject: [PATCH] ec: implement P521 signature verification This code almost entirely reuses the P384 code, and only implements the dedicated inversion routines. --- Cargo.toml | 1 + build.rs | 9 + crypto/fipsmodule/ec/ecp_nistz.inl | 2 +- crypto/fipsmodule/ec/gfp_p521.c | 124 ++++ .../fipsmodule/ecdsa/ecdsa_verify_tests.txt | 668 ++++++++++++++++++ src/ec.rs | 2 +- src/ec/suite_b/ecdsa/digest_scalar.rs | 25 +- src/ec/suite_b/ecdsa/verification.rs | 53 ++ src/ec/suite_b/ops.rs | 16 +- src/ec/suite_b/ops/elem.rs | 2 +- src/ec/suite_b/ops/p256.rs | 1 + src/ec/suite_b/ops/p384.rs | 2 + src/ec/suite_b/ops/p521.rs | 317 +++++++++ .../suite_b/ops/p521_point_mul_base_tests.txt | 516 ++++++++++++++ src/signature.rs | 3 +- 15 files changed, 1726 insertions(+), 15 deletions(-) create mode 100644 crypto/fipsmodule/ec/gfp_p521.c create mode 100644 src/ec/suite_b/ops/p521.rs create mode 100644 src/ec/suite_b/ops/p521_point_mul_base_tests.txt diff --git a/Cargo.toml b/Cargo.toml index f8a6f61027..31f63b4fa4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -72,6 +72,7 @@ include = [ "crypto/fipsmodule/ec/ecp_nistz.inl", "crypto/fipsmodule/ec/gfp_p256.c", "crypto/fipsmodule/ec/gfp_p384.c", + "crypto/fipsmodule/ec/gfp_p521.c", "crypto/fipsmodule/ec/p256.c", "crypto/fipsmodule/ec/p256-nistz-table.h", "crypto/fipsmodule/ec/p256-nistz.c", diff --git a/build.rs b/build.rs index 5898beb2cd..4374056b38 100644 --- a/build.rs +++ b/build.rs @@ -41,6 +41,7 @@ const RING_SRCS: &[(&[&str], &str)] = &[ (&[], "crypto/fipsmodule/ec/ecp_nistz.c"), (&[], "crypto/fipsmodule/ec/gfp_p256.c"), (&[], "crypto/fipsmodule/ec/gfp_p384.c"), + (&[], "crypto/fipsmodule/ec/gfp_p521.c"), (&[], "crypto/fipsmodule/ec/p256.c"), (&[], "crypto/limbs/limbs.c"), (&[], "crypto/mem.c"), @@ -983,6 +984,9 @@ fn prefix_all_symbols(pp: char, prefix_prefix: &str, prefix: &str) -> String { "nistz384_point_add", "nistz384_point_double", "nistz384_point_mul", + "nistz521_point_add", + "nistz521_point_double", + "nistz521_point_mul", "p256_mul_mont", "p256_point_add", "p256_point_add_affine", @@ -997,6 +1001,11 @@ fn prefix_all_symbols(pp: char, prefix_prefix: &str, prefix: &str) -> String { "p384_elem_neg", "p384_elem_sub", "p384_scalar_mul_mont", + "p521_elem_div_by_2", + "p521_elem_mul_mont", + "p521_elem_neg", + "p521_elem_sub", + "p521_scalar_mul_mont", "openssl_poly1305_neon2_addmulmod", "openssl_poly1305_neon2_blocks", "sha256_block_data_order", diff --git a/crypto/fipsmodule/ec/ecp_nistz.inl b/crypto/fipsmodule/ec/ecp_nistz.inl index f7f2c19c7b..d21bc4faed 100644 --- a/crypto/fipsmodule/ec/ecp_nistz.inl +++ b/crypto/fipsmodule/ec/ecp_nistz.inl @@ -362,7 +362,7 @@ void point_mul(BITS)(NIST_POINT *r, const BN_ULONG p_scalar[FE_LIMBS], } static const size_t ROUND_SIZE = (BITS + W_BITS - 1) / W_BITS * W_BITS; - static const size_t START_INDEX = ROUND_SIZE == BITS + 1 ? ROUND_SIZE - W_BITS: ROUND_SIZE; + size_t START_INDEX = ROUND_SIZE == BITS + 1 ? ROUND_SIZE - W_BITS: ROUND_SIZE; size_t index = START_INDEX; BN_ULONG recoded_is_negative; diff --git a/crypto/fipsmodule/ec/gfp_p521.c b/crypto/fipsmodule/ec/gfp_p521.c new file mode 100644 index 0000000000..4a57ff2ebf --- /dev/null +++ b/crypto/fipsmodule/ec/gfp_p521.c @@ -0,0 +1,124 @@ +/* Copyright 2016 Brian Smith. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#include "../../limbs/limbs.h" + +#include "../bn/internal.h" +#include "../../internal.h" + +#include "../../limbs/limbs.inl" + +#define P521_LIMBS ((521u + LIMB_BITS - 1u)/ LIMB_BITS) +#if defined(OPENSSL_64_BIT) + +static const BN_ULONG Q[P521_LIMBS] = { + 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0x00000000000001ff +}; + +static const BN_ULONG N[P521_LIMBS] = { + 0xbb6fb71e91386409, 0x3bb5c9b8899c47ae, 0x7fcc0148f709a5d0, + 0x51868783bf2f966b, 0xfffffffffffffffa, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0x00000000000001ff +}; + +static const BN_ULONG ONE[P521_LIMBS] = { + 0x0080000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 +}; + +/* This is just 2**520 */ +static const BN_ULONG Q_PLUS_1_SHR_1[P521_LIMBS] = { + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000100 +}; + +#elif defined(OPENSSL_32_BIT) + +static const BN_ULONG Q[P521_LIMBS] = { + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x000001ff +}; + +static const BN_ULONG N[P521_LIMBS] = { + 0x91386409, 0xbb6fb71e, 0x899c47ae, 0x3bb5c9b8, 0xf709a5d0, 0x7fcc0148, + 0xbf2f966b, 0x51868783, 0xfffffffa, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x000001ff +}; + +static const BN_ULONG ONE[P521_LIMBS] = { + 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 +}; + +static const BN_ULONG Q_PLUS_1_SHR_1[P521_LIMBS] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100 +}; + +#else +#error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT" +#endif + + + +static const BN_ULONG Q_N0[] = { + BN_MONT_CTX_N0(0x0, 0x1) +}; + +/* XXX: MSVC for x86 warns when it fails to inline these functions it should + * probably inline. */ +#if defined(_MSC_VER) && !defined(__clang__) && defined(OPENSSL_X86) +#define INLINE_IF_POSSIBLE __forceinline +#else +#define INLINE_IF_POSSIBLE inline +#endif + +#define BITS 521 +/* Window values that are Ok for p521 (look at `ecp_nistz.h`): 4 */ +#define W_BITS 4 +#define FE_LIMBS P521_LIMBS + +#include "ecp_nistz.inl" + +void p521_elem_sub(Elem r, const Elem a, const Elem b) { + elem_sub(r, a, b); +} + +void p521_elem_div_by_2(Elem r, const Elem a) { + elem_div_by_2(r, a); +} + +void p521_elem_mul_mont(Elem r, const Elem a, const Elem b) { + elem_mul_mont(r, a, b); +} + +void p521_elem_neg(Elem r, const Elem a) { + elem_neg(r, a); +} + +void p521_scalar_mul_mont(ScalarMont r, const ScalarMont a, + const ScalarMont b) { + static const BN_ULONG N_N0[] = { + BN_MONT_CTX_N0(0x1d2f5ccd, 0x79a995c7) + }; + /* XXX: Inefficient. TODO: Add dedicated multiplication routine. */ + bn_mul_mont(r, a, b, N, N_N0, FE_LIMBS); +} diff --git a/crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt b/crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt index c00af6c9e9..10f3a45aca 100644 --- a/crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt +++ b/crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt @@ -1175,6 +1175,592 @@ R = 575f87a8a7980555a198cfdec279cbb2f89551b5271d242397c29f6bc4bf413dc30312a7e626 S = f0b7d759246ad36ba8240c537b1eeb5d148c38d324f48028c598eaef6e49d79ff3f6cfe3a32fbbf6f3ed3aaaec31d572 Invalid = Y +Curve = P-521 +X = 01939b25d13ee8e04203643ba3709526a92912b0e98f06962fb217ed18d1ba52bff192640f980d3f7f92c116b5d94dfd48c25a26b72acb9425e316b3d2ac130a6943 +Y = 0122d0809c5de123c6e5373c1680a4d566c565408b6750d942c024d56c0d6761807adf9dab454b84254671dc68f6917f09a442643e6db1bb35e6796816dd3e5c6a7a +Digest = 6f89ccb8daf6d4ee583b04786812da9e2960a6e5 +R = 0144c1a1e075aced5e10f50ab7ab0f795bac07439c953ca0c749dc12d50a7e4dce21850dac1fd773e46576335a555f20d266842a8bb47fb464fe3fe297e9ee356e48 +S = 0125f3b6f1cf7eb704bd37391a43034df9260c4d5fdccd583bf65dd5ab4b007c8f837a31a0b7c5a0be3743a187b2569841fc4c69f816c8234d8ae845b92fb9263242 +Invalid = Y + +Curve = P-521 +X = 00882e2cfed1286668e62699ab20c6c40068b460917b306e51ce7f72a4d760e19b3f6cb5897de599cfd84ae70c26d1a39144772b90f8ba1ec2d0f09395265f0308cf +Y = 0020b80b99778dcdd3dc47da42b279cc289eaae369b9e2c4b0322d2eee9b1a76eed6b5b70d03d83f1db81a67ad6bea98ce71b120e9f83f0178cd6fa3f109a87b1fa9 +Digest = 838b0206f0df827b5aa38abedc972a8ed59611fa +R = 013ec7124331d896832b77440854c043cb605ae9cc7d20cb358513a5bab26371903c6abc6e4860a0b4940bc5429755341a10251195e5f8af42494c002340ccc57bc9 +S = 01460bda2fd76ef05dcbe1cd17b9c5663b03551cce586c56e103179069fbef6ecae47f6555db755860f0b06eb1bf247312ae0f9d64c5cf13fbc42b923d6bee151b5f +Invalid = Y + +Curve = P-521 +X = 011a5a6f7166fe435c5cc4238daf92a2d1af483543b7f505785ec4e2d93b2ca1d1eed3bccc31761aa60f7dadc97629475d2712998c2eccb82a78d6da7b0524662e9f +Y = 00c66d54768f5daf947cd414a1296a54c90e2b65a14cb94aecf0ba51c280676c160c39539955f2a8194357a983a1311845f8cac51cdca1e209bbac32cc809f0e4e10 +Digest = b14bfba79b3a36303dd4c5c7e6bb6981cf37bcc8 +R = 010f45ccf0b4de7d2af890d65395c715043dc5ca1489c79b820347d51848f599ebd4aa558c62ce8769c5d5a294679f9aa74414ca6a1b82f183f23558b0a8dc6cce68 +S = 01adaf876dc35310ac592d1e3ba89f148c3b76417799f43aa1b24c1d2e3f544c018f066ed7baef480f7488820593bcbb25ce08183fc14c6c12fce0c118743f04e281 +Invalid = Y + +Curve = P-521 +X = 00f3bd2590cbf620991d990b84efee86073f6c789deb07b89a1f278e6cc9ea573d8586ac395958ce4e1b09bda73af1b1e6f2a8c09ecc697c021974c024564ed87165 +Y = 00514871935c187e57d1aac376aeb018acf57c4d005d85cc939a6c83256f38b2c9ecb1a0ec8d132e0f5169843faca4ae664459124bf5f30309fa86f87a2604058150 +Digest = d9cba47d31015f5fe70b1bf0c2a7ce40676bd1e8 +R = 0083e6155dd97bf9ba7c60dbcdcba7824b125a73df1433fcb46f57c51f63ae161ce67393d327d174aec7f0b552decb8131a192ae940deb84acc3b45be61917fc580c +S = 001fbfe61d75dc3fd814eeabdececf361a0a066b8c06c40f0e057faf8e4e7b206dfbbd3a99ef55df67234a29fb1a618620d2e27636d35bb98eb7535d1749c4b7e7d2 +Invalid = Y + +Curve = P-521 +X = 013136c4e5dee983f761955bce7c196a000cb26863a1dea762884bb041e45363a1ab1665c0ca69d1167e555bd63bceba08f6ee14571acd06eea3e1e5d9c11a036984 +Y = 011c830e1fd29ee4e10d7c6db7e90d6c1319c9858f87a944542c28679d83680747eaf71a29362ea2c22a89d78e2ce020dfbba74448d2f46b3f84b99f22604075b22e +Digest = eb4d89e3ce396c525fdbb67e4620ca99d9585d31 +R = 0124b3bcdae17413de84721e6ebe64409d80ac07a3b6c9a603ef19c5162566076108d30ec79426d24c72ac12af6fa1caa4830d55b4e6fcee900b0e4b20cdae0eaf70 +S = 003e0724d156c3fe5cb799a17972fbb891f0e11cfb650a1c524f6f2aab134c70fb114084a7821e0e12054fe071c516cbfb393fe9d98c840e1cc9e8475d3add81e0c7 +Invalid = Y + +Curve = P-521 +X = 019eb73393f070160d871cc396cd8d6973d828d6f3c17bcec7168843f0342c1b54f3c02a1b11348da1035833df6fa469d75692ecaa2feddce9210a813bdb0e1f9936 +Y = 00e030c5a11e2317ba10a20ec373cf69c96660b434445235efff0a9d23904c5d3ef49efdf0897222e51624f047b567ed61814f3f9e8c62f16ac27160897d5a09f476 +Digest = 43a5c6621edef91f6938507b2dc2092c6b17fc9e +R = 00ca41bcf9e80780687ba70d7f5ffec7da25542dc22144d9f6843889e941cad2fd8d8771755f38c0ef77909416371726b066464d1d41f888efa39456dee859f0ce98 +S = 01770961a369ca70f9d73b61aec34662735cf228299a7c668aa24afbc9d7f621cb3acff79cee19d107361614c1e71ff1f32ae4f02b7bf94486f0fcd61b6f76f304e4 +Invalid = Y + +Curve = P-521 +X = 000c12d47011ed272aaabcb0fb6c12d8627f33bda02b2b3c3ec7b5ed60eaa577add4205d222b8ba0485b1d98ade9df18ee1e1ad9e0a9e78242322201e3c664bf8c9f +Y = 00d1b86d4a1171bc80822e0e1094a96bdf7e031201ec212ab7d0e7b55394cad8335050701327a0a1a17181b586b89ff24a658e4b0ee16b8418dfcac122f2457f67b1 +Digest = 35802e4fd349e7cdff4b85c76a417977c3e40b65 +R = 00e4678311d0c068eab2118fc0a59014ec32c89cfd1e0273b966634b87783011b58a99204d266014d0236bd6f276f49c693a4d62b0601c307c936252cf718e239dfc +S = 0149f5cc02a6aaa126a99a59b83ae34f405f8076b597540625fa76e27dd29a85b6a4b0fc3e73a245a91d64a8f2b13ac345553b7a40835af76a9528cb48ac8d0be364 +Invalid = Y + +Curve = P-521 +X = 00f50a08703250c15f043c8c46e99783435245cf98f4f2694b0e2f8d029a514dd6f0b086d4ed892000cd5590107aae69c4c0a7a95f7cf74e5770a07d5db55bce4ab4 +Y = 00f2c770bab8b9be4cdb6ecd3dc26c698da0d2599cebf3d904f7f9ca3a55e64731810d73cd317264e50baba4bc2860857e16d6cbb79501bc9e3a32bd172ea8a71dee +Digest = ca6b94a2773e9b7392b2a6b2863efb113fea8bba +R = 001e7cbb20c9a66abf149c79d11859051d35cfddd04f420dd23bd3206c82b29e782453cabfefe792e4e3e68c9bf6bf50d5a00ba5dd73b41378fb46e91ca797dbb250 +S = 00f1e9252573c003cb77f22c8c6d56f2149f7e8d88d699983da9250c8edfd4b9f864a46c48819524651886e3fd56492f4b6c75fb50a1d59e8bfc25f9fd42dc4e1d37 + +Curve = P-521 +X = 00fc6486a5cc9a366b2c25d57f3f1caadf93659223c7eb38c310916cd44bc49d3ecf1cfbd429b57e329e1eab5f552abaf828ad9cfbc2f7534dc8c87f54d252e7b69b +Y = 01c0010af6c5cdfe26b068990cf44b1bcf324d0940bce1e953f7366c757aadaf25ff7dee4947879f305d3deb1e9a849db3cffb83bc1c7e5e82777be140931d58d177 +Digest = adb7456d405053624755076f2654f24f2bb521d6 +R = 00a58843085162864b2246c619d6cd38626657eb8f13ed5921b73071b6bddd56640ec9a55e7f2190481ef5e356425749e626a4b988b811cc12dd21c61cea89640095 +S = 019fbd1f9b108aad0208d1a27735ead4685f04d01882ed18c217d8e0e0fc71d8a98d3c45c471327e4dfa631cf4b826ead3bd5fd4bc0426fcc95b58bd354d012cfcd2 +Invalid = Y + +Curve = P-521 +X = 000933ee70d1470acaea66626394023020ed521d5b9a52e068b827d23af283bdbbbf3999b0c2ced0abf607b467fa86ef89bee3852d4e993df3c2c73a49488740cabf +Y = 010231bba67cba896274e7af7f9c65403e48c56356fba772120aa8781611239d0f50b8958ec8709a301078379b59123b47c5edb87bc2327cf607f876154904b93e92 +Digest = 40d6902c8bdedd45f6f6789f8657e8716c66d6d3 +R = 016f79df89a498ac65bb39d62e1ce82e5578eaf778084ec5926a638d50ee5943c87955c8255340a90f800fd43d4dca125b68dfe957d148533126d5761d711412bcb9 +S = 0175198228ce2eb0222d64eeaa403c0571989046e638419ef96612a90094a26fb819ff1addd823f8912e07ff32ac72790c38c601505b45dbb9cafd1b46f352aaea0e +Invalid = Y + +Curve = P-521 +X = 0007a5694d537eea406d753532b307c5b86e8823d31e81f6e7371e6def61f31c8f706c1b89f8655e54f68e6821096e6b96a7c3752e47d8d3ef5da135f881927ed92a +Y = 005810620b7d83d3e7e48f7338b18e03c2e97dde5dacdd5d54e4c7e75d736f159dc45431d5d3c07153a334fa60567307271bfb85cb0fcae142cbd7baaddcbdfdc018 +Digest = 6067b9f7fd22c43c4a91550c461201318220cd1d +R = 002cba23e78a1f9c6c18bd26321cec0c26db4f1100b986d37a0f24fc42c75ce4731a2876e8865ae21700289734ad5bae3611418ea37a13fae67db2d1a58a86f85422 +S = 00c438e76249b5016e0b83ddef5447420fd13aee6f099a0b9ffafcba4e7227f70cc5dd5abba03532ebc50424fefdd4f6d258ffe044573aa51b8a5d1d5c6e5dbf318a + +Curve = P-521 +X = 00a00f34f4572450d93607d3ffb1fffe7c86334426ad60fda27aa647e67c34b2cb1f0a12f4707336f1f708b3ba1f3cdd599ae92a2be92f9ae5526eba9d4adc052fa4 +Y = 0166808273466ec1ef2865e92b263b897131c5ea97fce1adb1ef88c8ac2e63eab97567d82db9c0825510812db1b2e4cba705ba64d33ffdce676b7f3aa2e343f7834e +Digest = 3d0012d4148fc6bf2e703ddfec9293c27a9fc4fd +R = 018ada7d95f4d05350ae95494b7c81e233168ec88c5ebffa2d2a3ac74cf90b6d9f80407276f92bd9b3ca949e5d5cd51166e29678aae58a284b9e6ceda3a550b08c15 +S = 01ff12f5e9b12efd941e8a445ac036d735e7bf64237972002568e8eeb0dbb887709b53cfa67186f4df215e2a9f7b9feb045270c72196e19335a9c554a19cee0a8397 +Invalid = Y + +Curve = P-521 +X = 0013a5c825a9ffe6179cd106b4a2343fd3318d83cf3be58d971704d0328486738f7536041cc69e6f9548851cf591ba080c4a1c4b4f5d95d216138d72bc56eb63779d +Y = 00e79075f5acb9f52b67f8411f310c02aac5a98dcce0275438e59f8a2a3754ebe57815247a00d3506fd342d3d43607ba67d4cb608da3a9296d57619223c02e0c4f8e +Digest = 4ee72ed3337db64795f3b859021c9b6b405bfaef +R = 01ad988418099c6483e6a8d62fc16a9fe571ad35c8cf111c3f35e680541a2f5ed96896715efa4943f8b46d20a0abb228852bdd5cfce1787c150d01231abc065718e3 +S = 0095c1e7dcd09375d1760700c5351ab23618b1fdf1b2b02e918c0ec341e5156300b602f7960e0eee2c027aa0076b194080e63155dc56a81699e8aea36ddfe703b94f +Invalid = Y + +Curve = P-521 +X = 0092bf4245f0ece3a8c3a723de152c6413526c333a64f4f2455e7b45396c1614c473460246f49c65e957dcf779af0b675eaf5ed7800539d3619a6fb131f1bc610968 +Y = 0047689692e52baa835ee9c49793bca7b01ed3bc4d4c396a54eaefe0520840a31fa3c35cc0d2317ce367881a15a3c06e7c26b192e90fe16c10e84c92233910d7df7d +Digest = 8f0ab491cf25b8526f8da76e329bf886a84c279a +R = 0141f936c6a5ca580e5a18caeb85fc13e9ff57d50d89b8447c8645ff66202e71eff4303d57c28ee6b68915de6767a124f3652c22940656f4227d61ff30b17c2b9aeb +S = 01c7bb4c22e68920bc6b9df0626b09ac79e5b76ba29d0b632c0b892c8661087461c4131771a2b3a9834ea4b3d3bddac9910331774643ae22b613bd0b2464a12cfabb +Invalid = Y + +Curve = P-521 +X = 0194cc7f51d9caff692137190541f5aea160977bedb0d3b67c3deed6669bff160696a96550934b3dba4129e204f068901c84c821523bec91ec40336dce0d2673e794 +Y = 00709279f85ef54164fd7347afcdbfe42d8d14e6808002b3e0b59bcbed80ce0c16e2db1b320c1d98ccdd75efc50fcd6ce91df6baaa99ecbee6df41da9c142a74386c +Digest = 4eab87203ae54fe6b3c0913cb865266d7be8bda4 +R = 00d2542223b0a5322249e8f1af6d559a87c39aa5c3c7e595b07fb7be4d3bd0184a419651f96811f3e8c9c578a4be68188a8a3a1ff0ccba4af5429ef95c64f34d645b +S = 01ee3123fd300cceabe2ad99bd1975c4594005ac9ec31d44ee4b9fe325d39049a5a83b4ac2a7f0b603c82dd88d136507bca2d383c7e8375c36eda82a169b3e4b4034 + +Curve = P-521 +X = 0145896c96ede10f5b049edc0475870c0c6a09ab9cc47667146deca1729d98c124bbe009e5e161b88c7ff61e79d6f85b9c4673c0664e039dab852e8f99fb0ae70a64 +Y = 005afb810a0a9c7f008850e8ecc67d907a74ff9e58f6d60ed14b3ed31e4751077a60de444a43d4d9a9b944905b79ff0c0ab431b21e0fb160cce8f08784677fb58bbf +Digest = 7cbce9271d00009eab429db9025bb4edc9ff7151ec964873f74a5277 +R = 012f63284068bb815ba935833f382ee2a8a5f64e2dbc9869be281ec7d3a28e2d7d2a84e214d79598213f82217d95ba9868da4dc3a3ec7fcfd7c8c457a053e8b0ce5e +S = 012b62183c893455324b94b7cea2fa2e1c912362f99e5159e229ce67a80f45c7c0d27340e57b4a8f40b80a4d572345df083061d311b578a73c8faaba4e6a194b4726 +Invalid = Y + +Curve = P-521 +X = 0113a72cee148a7428065d8f8e89dce2dc7e1bffad46a130af8f6fc8d0fabf26ad76bb64ee078ee66fbf0212987e363e176f0106369eb1e43297851ff409e935e216 +Y = 01a723ee3f44aa68e1b43185a50bfca99f349ad47d848dba8f9dfbd773f9f53bc0298bf43130e19ccb8021be39ed70c7b1f7295cfd034e713878f47d7508059a4f81 +Digest = 0068909a03ecb0947b2d585eea1f5496a6b3e50861089cdeb75b516f +R = 0010b883cb3b76612b6cd8f9288459d373d58c2e0366f300623ff6b28224036ad1df47d1d9df8037a18e774e0bcb42910e96dc7d7fee0b53686d5d3af13485453c66 +S = 00a29c87d9be8e91da4333089043693425892f50333c7f93ab27dabfa5cf89697f366573621a86d523e850caf31a4c26051e76b91ad3e20a391ba724d4e58641cc00 +Invalid = Y + +Curve = P-521 +X = 005766da7e6d9ebbe7cbb5b9bcdd657edf36fc4a7d4a173b99bd1caa804e35e937289e05cec2cedf86f0f7a8de42958e6052500c8a63b496ebea88252cf1b44ee5da +Y = 00ad35038ce07b53148cd7d0b4ee8c8ad6d89a2c68c0458d0d694036120893ba24a52792e0c8097f86591dce015151659908829f323a5dfaecfc51470779f8e5a5fb +Digest = f743f4bafec75012878f74c39b30bcdfe1a0d0e4da1ba84ba8320796 +R = 011c5357042c1d98133e76f0a696e27a22738c78ff17c903d8a5190b3c5fb186374fce58fe47d9933c2b361cb20546d730bb5602fab6c8d14e0114a64f9d2b1d892c +S = 0115ece7d8ab1b578b0e870faa8139d009f6cc3cdacf3172c047bffc1a31e2c66b198ac1ab8c90e826af291de58990e32b18e71b26fe01b6bcbaf86db6b1a726f51b +Invalid = Y + +Curve = P-521 +X = 00ea4254c3111118d3d859c704474251fa951b0cfbfd2f249bd32f70cecd80526e8fb72c1258c994d8067539e478890d5637ad925ef43e2caf297fd1eb49d9acac77 +Y = 01ed78a277869d8bf7f2d5eb9c2753aedd89197fbfcaf36a633a4f3b2bdb5e706983641156f0aa6e13d38e907546a2603bb1cec785bc334fb03033600a77fed391f2 +Digest = e2a441ca0e946139960943cb42fd6a1d6b6d6fbfb9739d8fba72ead7 +R = 0127570a0c0141bb4c2ababef5fa879e55c1637407686b49535fd17b3b911452650e302e9186d539782cde4d48ee43c258572ec299ee63d961def2333a4f1f8d2af9 +S = 012ed61b0b4c889bb36ff9ba648318a2b11604be6fcff858adbba8e59fa49fa30e2e20df5f2d26a8b9e6d989ab4e50586732adfdd4ca49ddee11cd889f0176a59ca9 + +Curve = P-521 +X = 00549a23bf1b24fba2e921c5c2ba78809d6b0623fb1b92a506690b668c946daa393ec42ddb113f10a34f1b11475ac1250f119e83149d5211791dbf6cfe4f591b6f44 +Y = 01ecdd45de1ee27f6abc1270fe11f770d4e26d5dd12d0a7baae6f3fc9c7f074541bb05ff0137c3923e1f858d643ec63f7c50f776f45009f2998a0b4f37c192210ce3 +Digest = c063ab8a65966f0b7d6c4127d45ad56f57e5922f5bb0537f71ec51d3 +R = 012bf2daa304f162454686f98330f526a21d066b430969547ccb0ace347cadb4af7bf62b473e33aa1f62b5959b7c431451913d5b1ad297b4c1f6bc5f3afc9e052794 +S = 008c7c58e4703f46fe0885f353f97bfefbecf5f10b95a02d4ac7764a0a713919004a153ff443ce417d24db60d325357408b59dbe7ad043e7fc7c1c23cda14a867d83 +Invalid = Y + +Curve = P-521 +X = 0087784b171cb62451eec46449a2a1ab769225288a092d833aeb823c99de8542ebef8c290f96636a45e2a9cab678a2c55e10283ceea6780c8d61d341952643903f51 +Y = 014a9315a888dc2f774633ed1c5ba95e09b6898764dc5a9d568d727b56fb50d3b288eb77c9db3b1cd31aa204ebf0f2402fa513b782527ce5c5652a97df6bb05e35c8 +Digest = 4a06dfd0dc3fe089a1081066ae40a7297c9bf929dca9a6b6f2a41a49 +R = 0137a47e2f3e1c2916a4a590adea04e93b4d18f2d548a3cf832401bcc42b1b35ad820e88a7efbc15d1462f518342cf81d41a40abd68651bef73816f58d1ace55e338 +S = 0101e3233d8da91e092a6ed4db279c594494f73bd8d6d7bf5f6a8437146a29b1ba78fe3694502ca987cf108af9f461b6341735b8c2a21653d1b52010bf2ee02e02b6 +Invalid = Y + +Curve = P-521 +X = 00b97948459489a548f94459fdbcff544e87f5b93c3ffd8baaa997f616eba75187f7a8fb13d848ddf427aaefc3cd001553c213bd1b1c5d892847eaff2d2663d90637 +Y = 000eb07b08b69af1f15260ab6a8eb84f9337d9d3f99148e61f5ee06c5a031f1eb467e897b65c0d14773018929d9da129d3cd66b8f9c11ddede32bf9f339e3de57b13 +Digest = ab236a98d4f9487b888cfd01d52f7d3746ffc189207b6eb31d4eac5e +R = 01a31ea52171394839ce630bb1c2912b42b045c5143c3bb1c04a5b97a738887f8367c9607971b00964d5d9fc5d921877cd6b099a84e19024cd77249d263e729e7f7e +S = 007600944031efbf27face352b6267349f3cb72eca5679d74d4a0d47fa6e84b391f4743cf2f4704afcbb9dcf7b522d812d268a1ff393d0ff1b44b11b6d75fb84d750 +Invalid = Y + +Curve = P-521 +X = 00edc8ee8d40918ab15122d92522bd862e9d46bbb6550ef22a52de0e4fbb6e4a4635be48406bf54bfb24dc385f506086c0a6e1297cea60ec847007e798a632867cab +Y = 003e92534bf025440635fcd4d40e4b97c5396f33eb16fb1e3390830f24737b6b1645262b0336fe74284afdb99ed6b8551f82a449d80911b0c0f02592c7d210958b94 +Digest = d8704904fd8939d7a1017495a039883a8b07f371eba096b2a54d3057 +R = 00a1f835da9b892687201294cf15769d7390e62e46efe1f61ce7ddc80fc47dc83c86db35a5096cee41289d66d7803f7e8e11fb9c9ca867123027af343fddf2b1b89d +S = 000b5b9653b2533da8e52292f37b86aaef201743c6d12352470656ca165092d74a8f97ab1772299c62b93d61ec097c957ae231d3c80ef1b9dad1f40b06e0c92ece2d +Invalid = Y + +Curve = P-521 +X = 01f1464035dcc9c6dbc5e32c318b6b3e9def33cd2feb02b7d4b7249155078915034ef823a4d55fcefecfe6a10603891a4a9c3e6ccc1a05809bc510032d5fd30030e5 +Y = 00ec160b9da57cd8e55630ab9524301ae7f0f53be5d55f7e7b99270272f6e6a33d6fa5fba73195d242e7ababa5cb69f6bfe9165ae3fcc1645df5ca4b6254460029b7 +Digest = a824681278f1dcdd937c6d7d97e5c028106277a07c3926150c7bfd39 +R = 013489e2917236dce23e929f8c1ed0057b0d70c68762073c7b1787bd3cbdd084174f24aef0af10d09c77530c3f76099ce53b63598c0d8f8ce53df83a9af11b7e173d +S = 0111e1868e71f5e83eb5e38f97fbc466a9e729e19165169ad81cfd214a1ad1e56fa47bc97ef47a93511397c849e9da3f7cee68bccfca4c5c60762d99b8c41393b879 +Invalid = Y + +Curve = P-521 +X = 001248e0953894616aa4b5573644bf4c0b1f45a5c0a47a193c3ebd2215b29dcd387d76ac98183894bed359f06c6de7bb94e975c3e6f9c1be3fbe3b763e2501b524cb +Y = 01971e69438e24b67baa6203ac5904159763202c16d6afa91298fb43eafc867bead0e61be1601a3fd70219af962f7140cd0a29cc26ebf765c22b895ad0f91aca7500 +Digest = 4d9ded4947fe2a964a6d54f6262292162a14b054b5d8606342d32523 +R = 00215d8b547b0fcb9d18eeb5acf277f90d97ab6371aaa6e8a3c1dfe66d2c6ba5fef45260028d25cf600bb24560e599238b285a823a0dec5e014db4cddfb89ce64aaa +S = 00bc5c4dba8bea55b73866c0b4bf739c764ba67121b9b1fb261b282fc1882f22eeaecb5c89edbedf90318ae8537554dd8604930bb893d21ba36ea445d0cfeaa28664 + +Curve = P-521 +X = 00bb34185d844a096f7f673f86b317c27e84fbd6938c1e22e4afb1120489c38508dc643a92ecc963b694dd6f2c7d0958966d49b20883daad4b00a8d0107f2b8ea2ed +Y = 01e5d3adceda7ed7c7177040b1845fa8064e187a16b9336294c1402ea2eb89e6c14bdd392bbdd2ab516aa7ff3987bc44f6dda8109452db403b39cba9536a39f1ddeb +Digest = 2f2a916d2c907ab764986fb1ee972907379a8b66a281ff6996e1d158 +R = 00d1f2dd7534f9f093a281fb538660324fef9cec2dbabd3527b1482f980dc08cc84de25f83b062ee5cfe1d3372555b7bcf618c71fc464caeef5a8bb141f39531f15c +S = 01a1be81c9379abd578ae9663cad8fdc892ff46144f77da469b832fec4e5eee8a6465be3f211f26e3b72de5a9e45aafa064e24d501fc1963733388af20c7b9c9959f +Invalid = Y + +Curve = P-521 +X = 012918b48baedcb53edc782cef70d772232d1d9e1f5e995f70c76b510f3effcd5c239625e3ec5e37d202b37e4e6047a28d70b489b44bf5bfc2b2cf03c8abaabcc4fa +Y = 015ada9031e346257778a7b6a7d8285b9d66cbb27b1686ce3de3490c08a3d0a64495906f0ed6e1e4b7edf1ff657091f97bcc383e16f2ddb3c723c53d559fa0c5ffac +Digest = b1e5176dee3fe3678e36e8471f4e5769b366271eaee73858e53d22fc +R = 0074cc58e3fdbee1b3b09fd82621bd593118fd4fb372adfedf8895f1775add9bb38fceefb42298c16cacff33af75e38443388b448ae251ff8c049a09fc7af3cf6ad6 +S = 00c51622876dadca150cb6be19dd5de70446cffd2bcaacfb8dfae4e1c7d58c41defa4589668b45958cb5f164bec71353ee57817e0a882c8643fa7bc6339dd88480ac +Invalid = Y + +Curve = P-521 +X = 015f8a3371c14a76d932a83f242c56097843ca370385db632fd91e05939ce0f87a94028f9f197c435e89525da4624db332ab1b36a1a59cca8c1ebba281ef5ea48bd0 +Y = 01bdd578714cab38b3d07f28f286a55659cb4de6bdbf13ffc149f0cdf71be6be2d11ef800614a1ab97731886179f50360bb98a8c74ec5a222dbc9b6762a4f56734e7 +Digest = 3f9668946bb66d9f63774aa4bd7f15c9dc94da241867b13570e7e4aa +R = 00c15e0d1c06abac899b90c86ba6e37c8b8cc982780262e303c94a0c9a1ac52554423257dfaedb70760e6ecd66f9b74913a283a2e44d05dc8eb85e5aaee5a4323015 +S = 0014783e744895c7b6084d536a58e9d05a1a53a4ab96321d09cc4c89a908f75f01515c45df3c471ea02cca0bf9f07d1873bb3404d3ba5b51dcccf30e9a5ea0bb151f +Invalid = Y + +Curve = P-521 +X = 00af896543430ecf3b22534a1a3c1c84fa0ae28f1cc659432417426fcfa814faef9397801f16da3bd610206c2ad62f775ca01ebaf380fe64e928cfcb48213a268cdd +Y = 01bf669b84b415f99e8e997b4e67d0b9f359823e0df92688c760ca99c08350f0375b301c404eee80d86af5de31e95d64ca95d9494e2d8622edda97282732e7e2757d +Digest = 5d90c46baf8cfe5541ab3ee8f3aa02e881db1d12692dc16b0d013420 +R = 0191e914f1520532b8b3ccc536b103e4eaf2aceda838117b7090de8b3c2ea03fbfc1f54d15d6fe8e6d2cbb794d0206ae3387e808661518bf5c6dd608b5a40756e24b +S = 0152e95ec2ba49b5e4d65a3f50a29d140b144f10d2eeba729e439f34ecd7b97dbe672dcc25647446a49e43f5710280d79fe01c0a7b7956fd80bf35cb6d7e560cc983 +Invalid = Y + +Curve = P-521 +X = 01ccee36646013645ac83b532106a9d78828cb387819bdec3f7d982ad2744292281a00d59cd4c1290365d5b821cfeccdbaa8ebd5f10aa1b4b1342bbca27e7619023e +Y = 0171cfb6c2a95aae42458b6bb582d8efbeaf7219594dca5904b2b3c22a203eac193068e603acf1afd10125306595d0056e2bdee05aeef2d4b774498619cd5f1a3664 +Digest = e201f8ff4c18ef73b7ee6ea2ab3cc482e785bc77b71badf828d9ef29 +R = 004347e5389a6b4a3de2e543d7474c28e5fa284f5268e474f8998395a7dd154fd0c09253b8160f9bae840189161bc3c85db268d500d6aa82a3c383aa025553fc25c9 +S = 010623dda9d2c39d5e6d463d96dc1ae91f0c3f34df698dec0de2e1840467aa54a5bdbe7815426b175f6c19d1a5f09cec6f5270658a80ccbfcf58a30e10cb342e9e01 + +Curve = P-521 +X = 015bd9bf7a35cc60147b32b64e0e4e54bf9ac2173cc6784b3d4ebd076aa5d45c1e3d0846b20b61d6342341a8801a2f63028c991831318245c2fe31f8acde6bf2003e +Y = 01afb67c9c700ed332b47a2d148e6ddd3571e138f02a81c3cfe6d4dee0f512d92e76574fe5797c5566c05b3239fabb212c735615e719e718fb40fa6783c964357f72 +Digest = 3dfb0c771418d4f1ffd092de8aae7a563af2c9e559ad0b53a5b61090ea77eacd +R = 01a341d0e8906239faace79554b90d1445bd28f703d7c7cc8eb163337ad3d4bfb3725cb06e618991491534d399866df5c5bdef897c889947b21148d89c657e64124d +S = 005c5b728837d44b7b6935efb2b721b4f45c1675d803d87f70158e451434176d9682034c9b356b5f9181e07599bdcb55e5bc808fdd36fef9c19ddb6342c975262024 +Invalid = Y + +Curve = P-521 +X = 009f21a6e7295b183656709089b3c647140c81f71b0b3812e6de22c52245335599ade6a3116cb70277dc2485f91c7b1f46d62afb60fc17a110358c9a02e02e010960 +Y = 01e914284cea47dd6836e7ce899d0c9a88d67fc9d039ffa9fa5bee58d247e0d0dc9251be8b82afd3add327f98c5570bdcd8ad8827820032774d19db09232aeba190a +Digest = 6b7b1a121d5e8f4d3d0294abbb62ae16561f37b6fbdd6d519209c6663669323b +R = 00ce4b2ac68afd071531027b90d4b92d9b0e1044b824ccebb2c9ab241d5b909ead1ffa2dc3d330f57187efbea7374bc77c4f7ce7ee689aa5a1e27aa78abc3cc1e751 +S = 00aa85d84f9c7fecd25064dbae69c16d6fcff38040027bf476c7f913746272b5d4b9bd34d2482e27730522df724895b99253aed86011139928fa9a272892f8c99d8f +Invalid = Y + +Curve = P-521 +X = 01098be00de7b2ee7390f26eff82ba5b6de8f04d7f11909193923866d2feefad9b01c5d78b699ce0a6900dc2a3073a03505ae946aa6f384ab0573ec9d17fa775dacd +Y = 0106e122e7148b547a0314da646b6f834e66c2ff7f64f39da9dc7983e80e84063e23c8ce12994e8495b7786c2b3180d7f22bd2d2becf1e1ba2029cbbe8d4801b65b1 +Digest = a1aa4766ee9db4cb7bcc31a333214b096fa608623acf5a246ba0de66067d61de +R = 01092e5ccfc4f966c3281a3924cd527606ce8e64cfd78f57373cfd702f528368beb71eb1a2cd64005bb172cb35b4ea61af88cb06bc8f1a38e2d75b235d23947dc209 +S = 01aff29a28d935d0e10bf8015f38ec128e0ec047f04020d1474366807b140e4d4a6d069aefc8dce723fcb4fc803df30b3880cc6d0dfc75c291d848d89e06ab7e24d1 +Invalid = Y + +Curve = P-521 +X = 001ec67de63455605b31a460d4faa664697cc505885577c0844472842dee78fa6d522e4b942d3c7e2de684e6399f6a44a328ccaab5e678cd99d49f015e35a934cdd9 +Y = 019b41da41e7506cbcb7c31d39751669cda166fd045c86e1fac68d39d2ebb0f1ed50b8a923511e1306952888e068092b19130181c2de5f25c5e1fc4fd9ea202258d6 +Digest = f00b9327fbfba5a3fdd7bd9331582822b7bf8bd8f2fc97f0af5ba207fcc92b71 +R = 01e1882a3d98c236189a35ffddc9fecdb7cb5fc5e3d0784eabb69d9c37862dbb38eed6c5567a0abc4f74099329681b9a0921515f1df83ba8948b51d3871866a8f7ce +S = 0025ff707889678f7cd05665c941a2bbe13622a1e75ab986cc86778658c62e527f55804ab27d0643f6bb8adaab0614eac47f33f0e1fba109c63b28fa6732a5afbe49 +Invalid = Y + +Curve = P-521 +X = 00defff5ef7cc5de0e1ac32261e7a74e8c434c0b51f76df7566b612cc5b8201e7b38c51aa6118b6307f436394bf452a72224c977e37e410eae9525df2ee00a8123bf +Y = 00263b7db73558ddc783824f0b19776802aaf5e46ccb1b1d1dda07d2d6c5843f5036ae8d381b235ccd2ed04eb90c5d51e32cbd7acdc7031cae63c06797556fb66fe3 +Digest = 63c7b65f78581fc15992ac54b1221f16545a6e50a0c740e3f3a1685f09f358a8 +R = 0089bd129a537840a52ef434d5a8ba4add952f72f22a84ac4523ea0bc02cbfa8b681ab0ed3fa2bca24ae575f23fce7efbb9bfd28e465174158a5ad2b08fd9e0b7132 +S = 0004ed533337791e05f8d097eabdf4be96b3fcc9f876d47fb8c5c7a05cbddba398cded2edf5ec9b7dbb4e32c1374b46953d66a193c211ef12de4b9d73adc369d5e95 +Invalid = Y + +Curve = P-521 +X = 0180f1e933054473e81ac82aa458094b7cb95d4b8d399600420cfb082e37980414909a133d5e42ebb7d2defddb34a9fb51fe4ab72e88526fc28608e152aaaba3ee5b +Y = 01c5cee9fd322d1c3af1726366e8a1e3f22099d9246d4bb02708eed89ecef1fc73926dc97a5c263afa235edb39a9e63d9690608846abc482397a2d8673c5d472c970 +Digest = 1f2f2957156270593c0998ba0d12c6d2adfe8728ccacf3332f9e6c936c33c805 +R = 017f1fd4df519ef432f68b5f426ff23a8f36b5729fdf7c8363d73f4e707d9800c7b50174fc3d66d89813a5265f8734602e5c998c2d7b51bdef6e90ee5a527e1357e0 +S = 010560ed68f152d649493c02c1e32bf4138aacb5f2d7f449e7685336edde24e5ce1cfaa2c54530f1419593614971896f1a877dda7bc5d56ccdbab18e770647287979 +Invalid = Y + +Curve = P-521 +X = 006d8c16536b17cab6ff41f5df4038fe416c05ccb601710909708dc561b02ceed9cf020441d9daa075e8fd604531ff58084035b1c19a498b82582f5b20f9cedf61f9 +Y = 00e89d71c66e55c4f5bf245413388bfe9de83944b11d1abdb4692db7da8a086442965ee512f7089f89464dda5d7786e52cc26a8a30bc8824cc56a289fefcd42bdfd2 +Digest = 2e139493b5db177dd536c562e0c90445b59a686eeb27e0a7b7cd93d72fa4ab7d +R = 0087f86cf4bd36e8253097ac1bc8500dedafdbccbe5767ec25e53c73c4f053f3b37acd1d5ea4c16e4058919b61d2a67393220ffefe07535d53923ace6815463c4c31 +S = 01def2582fd0df89fa28c9ce882f5c3846135f51bdf7f4b2497b190136ef04618eaa22a8c5a117b0adfc6425eac3111b6558df145a8b14ad39524b98659e01d51c21 +Invalid = Y + +Curve = P-521 +X = 01c7fb4747a409a3723177c38c9943b81b2d0aee867b8f424e227f3a664f1877c560d37953e7cc09390e05599292bde1ea345073ec365834d99ac59332f6e5bd29d7 +Y = 01b7485b454d5ed5d581c7897a7e68f425d8c23cd89b934747d90765a5fda1cfc3d997af61728f328cc8bdfca8a3ae1b3b90be13cf164c343d199b8e16b0400f3e33 +Digest = 8ba31656449e19607c84d9a8d689193f30a6111aa87b8f978b9cff5abac9f827 +R = 01552ac2dfbe67c6abad8d3325713c1e28537eae620d805a73dbaa4e5e04acff6ae0498346d6e41df1cbdb20b70d8e548564da8fa239fe6c6f28b6c2a6ef57973097 +S = 00cc9e60b694d792f36cbe9adff8dc79f0f75b3ec11ff2d54419227c7566e0bd441655eb30b558c78a55ac613c1bf3c3058ea7a4bb70adbf5b49fcae15e54defd6db +Invalid = Y + +Curve = P-521 +X = 016c0e1d1fc81e5069e9c02794fdfe1f5a8ac5008305d9ac2234eb0117e565203acc6777c570f41661c5db1adb26097d7f5f2a1762c4f8039f1b68caad75915baab8 +Y = 000b3690995d6d881dc1564f792ab174cdc1a0fc6f12d69a21088d5e82de4a7d56947a2dad0ce64d9ad0675e72b6da755e3ef82c9cc6d532378c23112210236889d6 +Digest = 4d3c537785e9dc1d434091ddd3be8a48b86a02df7e6ffa269642d44cf8f32c25 +R = 01316e9a934cad1aa0f7dbade1c9ad942d61bbe1bf41b7b95e3b25b761b9899f6125790369277aa09fa57340a2b8c3c609a08ae7be5a3c09dd4d081e6cb54d9f3061 +S = 00d6b285f91c3c8d6192af624336caf793ad5300d96262f5e25228dfb60896c4e28e61be22e92ca7d6e11a02f36655441032bf291f895aaa117f6bfdfb422286f255 +Invalid = Y + +Curve = P-521 +X = 006194b1780a2416dde8c9402e3ddbf310c51ed87fc40530ad5c97931b99336c00098337fcca7b01c634e56a7874309177364e6d4c24c2ab33d6a1a09a84689ad0b5 +Y = 00c5bfcdf640c0a7573ecf4a9dc1aa75db298ddf1a679609e0669182a594b9b9a8186ee961b902d84fe998e3b380c304a0be98974514966965bfef9971f05a57c162 +Digest = 23e932281d4fb08520bb7c563808e6b9ff43e83fc59977df1ff2c00ab5a0f7b5 +R = 018051118c2d8b841c6d78e2e5068c7305039cbae1f8b5a479b9bba559ebc45d8c8ac18d1f6033713871e656fa4eba9c1c0892e7263bb22c46ec3c72aae92afe2c79 +S = 00de0db6a6ba5e6a953a126be3b87d6c895f4bc2db27be223109dc67cf115bbc8c566e1c9a1bdf1a87e632f8a0e4b31331a086caeb60793e87f03b404140aba206ae +Invalid = Y + +Curve = P-521 +X = 00397714abcc503eaa0c18abd1fd26586d28ec1b1035d37ac710f2823911ec9afa429b41ea89cec13d5bcae9d6d7147794407e409f3b267cf4dd27e8c77e7ccf4d36 +Y = 00a3a4b749d19b84708e42b59e9faa5a99ac0f0a01121655fab87785fca38c8cd4277c8c2c9a0024ff608c3cce954596315dfe0e3b133aeab08bb5389eb2a4f1fb42 +Digest = 61bcad3941eeb4005c391745635dbca42b451c3222b6123af2cd1279f89f3b2d +R = 019da96a866db12948e0aec7231f797061f345739d439bdaaba63e4d03e0bb52c3fea2fb593347d983f24a3afa6a77f476e6bb49a5de843b4c4755cddce97b8b909e +S = 001bb442f428b2ca445a75ad88ed49d965d6659d748d02cebf78faa1ecc187b606f284d11d47791d585dc371c2d91848a55ca7b092f06d561efcf64e0de0814e1db4 + +Curve = P-521 +X = 01af06b10d357fc3c807854b4be235f81d5036da4df1af6a054a03ff800c1aa2d59c2ad5c0e25ed25c002057cae4b4adb92b95c36cf422a46c8833fd8968e0f32441 +Y = 018432172be0e535a3f3a5f6d6927dfbf6a00051cc1983ba25410ee3598a60dd1f7c38526de7ee23f8e9ee973ffddff49eb3edb28adc7d094cd95b63d52ba45ecb58 +Digest = 006e84c19a348fd59fd011cfc5c189d0bbb68bdd2ad30448e13ce2e01f2cdde0 +R = 01396b4f044919d0ba5ad43004cd37b8bb0626ea5549d57c532339358ee1794988a7c9eab91a9340dc2aa0f18e89b236a6c20d03a6e98f35c011430fc4213cd65dbd +S = 0101e5a788a867d9b5a4444554c9651173f9f8e15c0f39f9adb66c18ef8075243f23b95d5229ccf5f56b87f5c50920b01b22ab7476ecf4c865a3d6d8f2242d422d8d +Invalid = Y + +Curve = P-521 +X = 0176f1276918fed24a098d6d03077f3c33ae543316df1b6b06ce877e74b69b2cd4131fdf797e77e5f6391b0b32411120d03c0c59ba1721a7187d18708121d6f3a86f +Y = 010f9d38b30a2da1a745840de7c9994578e32bb10f9334b46f533b6eab550aa55048e4ac601889564ac8314e01b61613fc7b8e2bd3f1a188c5c5e869af16a8d61d9b +Digest = c11b8b03fcd4f2ae25f60af2ec2ccc9afcbf760f61782fad21a02d69b1024cdb +R = 019cb5639a321e95214c90a612d29c9ffd5ae5aaa2a814ee2d66ac1ce1d2ab3229009129ec9d472061444cbfbf50c7e4cba09aab65299a42740bce7af3fddf2a1f46 +S = 00082ce6bf1d809d3bb4f9f09a95590bb64b0c41bcee5fcdd332947a9b59618da5da897fff44968d92635e7833dec1e91d8d99bd8b527609393b446c83d109a32243 + +Curve = P-521 +X = 0089565cf5838658fd36b70cf5246cbe999a394562c46e9d8057928e0aa9e04ade6002cfb83f315e06790e58ea833b3bd64fba8e93c5fdba8319c5d38be7cf25a21a +Y = 008faeff531e683d28d817045a03b2dd22e50e6168f1e5fda5b5abc71859effc5e5c45b88705b62ca090e3362a8313dc472ec2ed970bbb5029200318e7582643d613 +Digest = ae3204e3df3b8aa0265cfeec6b0facd4b3025af6af26fab931ee5f2188fb4864 +R = 006b5237ad17da6037aef116532b3aaa70172d0ca0eebdc478c35e6f8bd0f9a6472d052c5a18a23dcced7be6e5e7b6d0bcb5b3cea707000e7d114b6f41084d6f5620 +S = 005e2556425b35e6495b137f7dab522c7e7b812004c87a002f6ce4f4b6cc5f967b8f5b7d3786a17d5f717d3ac467b73e176e90cdd8c5151a6e62fc4604cbeab7e717 +Invalid = Y + +Curve = P-521 +X = 00aa42473f80d9d81f6d41ed05c8ba35c005f90e2690f71dfdb12555b7590c7a8e95b618368c39f4e84d6cba25f522c9bdd256c60d3f8c8425ad313701225a9cc9c4 +Y = 01992b7966b925f42c91f810eb05d602b804301849ea278466a68e5b616e3a0bce110fc9250db14f9c8f5929347e1bb8727bcf8072c6aebc26958954fe96df04e139 +Digest = b7e0d79517efe3d961ca5bbdc0916bab7a32743f5150d53cd60300b3edceff49 +R = 00cbb35513420f206bd26b568712503b66e159a54e154c8d4e9c661aa954e0bf425871275fff5e8f368c8ccc77ffe6adf84ba88a84483d8ba5cc862bd408f6a192c1 +S = 002ffb4e461e3161c801ad217a0483045181013deed29eec29cca94776139ddf5fe9d7771e5ac7b637a4bf7e5276940489bd8ae36f41ef6be93cff4b96bd0e1f3e59 + +Curve = P-521 +X = 00984cf3de2bbaf1b37ad4e9121a1294a0128d8a031ddfac7a8c5d7c9db83699de26c50012d42223d902cbd4be7e6fb611f4502ce8444d43d3eb0685aee07349d0c5 +Y = 017165e8feaada26cc599ee394dfb5de7e2201004f755ebecb92ffda0a24be55aba88ab9b3c7a575884ffa7b78b631806f54e01ef875c5819fd2d52dd6369d649615 +Digest = a0f94fba76704fb2749e4cd454312e47f7606ece0b2013748096de2ff30626c3c7c7aaa855f33908ed60fc8943101625 +R = 0036c8554602661d9d8f4bfecbb099f01e9e314136e50c6d026de2297bbaf66213ea72fce13b73bb07e6e333523f19d3910983ea5842a1b634b3e3ec8157d270b496 +S = 0129b439d3ba2d66c89c34be2a674013128dccfcef33f5d3844c4465381453c361ce80e1b52b6a611749bc70933655caa56da2c5dd6b04defcd8baeb2d9be06f3caf +Invalid = Y + +Curve = P-521 +X = 00f976d58a015d3015a14997fa3f59ca8d762a6541861be923d6110c9e742a0a2a77d59a6a9335c67f13a626d9545b27c072349c3d20b80c35b0a9490f3e6c5c1b3c +Y = 00425c22ac0755c58fe3497c1f1a9f537d5e26127d9b031359c2378fd4b13f83691a854444eac3fa346bb5a63bb9567c122945ce99d2aeb0bb1b956ad348f7c9c461 +Digest = dd84b1706091da5e5e27099894e439027b9f45c56e0f31ea0cc528dd587f13a45b9dc87aeb90bb2003e16f56c60b8ad8 +R = 01ca7346a2efe39e03e627ee9480a9b7c925a6677dc80932ffd67ca52b7e46acd2063402545d678d218ac579a64cf1fa4eff4f32f92d3fa4510eea22472dbd3daa72 +S = 00893d86a6502d5973f6c766413e7c7ecbc4583577c58672ef36a76c83755a0ab65af0e0af0ad0f3e6cb8f9ef67669132ce7e996d6122cbbe1dec710a7ba9c9d1ff9 +Invalid = Y + +Curve = P-521 +X = 0066ad5c073425bbbe3a1d97ce6e1a9f2c298392c5afb95c60eee1393f7cd5c9a12c283258b1a53f2ed4abd13ba1287f3a1b051a09cb0f337cb6cf616dffd16aacc2 +Y = 009d2b2afc181bd82043b13b8222cd206b9264d73b229c71d9abcf74a478a7f7088bc8c7bb1e54882fee693340a3cf1aa56ccc2fb81d2675b19bba754dae0c2f00c3 +Digest = 89990b6ae2d21961eba4f7c9efd2e910ecf1c7809e1171d219236f2a8a38bceaefb553bbef7083114af5ea891fe44e89 +R = 004e6f08380c43f225169acb0e9f3ff61cdd2e9b713d149f63b5b6a4510d381409648fc1d442fa1bbbce2a8fe1ff7d1de0597f72d7681c79d3a876db6d3ef89ed192 +S = 011745ab4dec3542cbf37d10090d6038bd1ef9cce8216a4069b21e4a08075e7e8502ec97b99d3b18fd314d6ab6826bbbfaa2343ada1abc7c3b551c0b854dc45ffa75 +Invalid = Y + +Curve = P-521 +X = 0068801cdbb1e07f4b72218c52aa24bda872f1b2ab4e0c13b686cb8b10096ff88018e82196769359227192752a1c4c884f08cfa7f947ac428651f528bd41d1034073 +Y = 01aeb335cb89ecae3cbc05681e2170870dcf40d486db4011c4d7bd84c58c6b3204161d9ca3516760b0c42466605077c96c0540939c635bf5d7d11e1407b6da30c094 +Digest = ad6637c97ce73a8476c08eab09a8e98f42ae6253517f9abed3b3527942075dac7132122d96978a68324ca4dc11193d47 +R = 01ce67a3509d59f8a0f171b86559f1d84589ff2693ff7d3ad3ae64b0e5af85db2fd99bfd7eda6e8f984a87f16767231cbd9026bed0a9a49d74ea5047201227c98f41 +S = 0032b0e4c043df8e81ff22c9bead36f704c992ec160d6be7764640200e1307002421b5d73154eccde012b463aeefd11138c5b9b705623c2c849736da23c122df06f9 + +Curve = P-521 +X = 001dd34056fd2ff3009bca2d0bbfa70ea0fb678597d41dc545358263ce2cef9a2efc016622c12099c2a50257609d6a14f3c5ffac8a52661e4a34689a3aebdbe86163 +Y = 017926740659acf72f7c7a147a3a320d501efadef8519bb289ebc33e348d6b9efd65fa516048101678548898619d311b8ef2a0d4a6f59f86810e9e6534176a24faf9 +Digest = 1cd3273e0dd337d53131614aaab0b6ffaba8d4c17863a1ddf1e7cf4965bc548628e7230f7331e1ae72b1ed9d1d2f8ae8 +R = 019043db42f44b957784a0e1f09d2e0a0dd548b865947f93b516f249ef1757402544ce5dc402cf8c1f180e9a3be01657258a1dfc14b25ef564805651763d6f609d43 +S = 01e0b45e00bde9c4e8dfe094f9bcd7af5a19b631db850a69bf0b6291fd3df6e26f4c712e3b5d4b7b8572f637874057d5652fa2bcd1977065a695d26a80669a23f0e9 +Invalid = Y + +Curve = P-521 +X = 016e5b4f4ff81c1b1e7956103c5cde951c56b37259fb8bf735b386e4d8b3d44063ef062d6e179f618a506ec8ad9773cfe99044748e2c8ae229a51bca6262aaefe2f5 +Y = 000069bfdb9123885d8ce4ce67c63311055aa9a1a5150197717a853d0549bd17d2683e427fc90a0b78af5dc96465ea3f2862cf98e8f3ee2a07089e8837aa8d09d97f +Digest = 9949e2a22eee8ae6aa35dae08f3c81a11e0e2c546ccc11428133c65c43d36686c40b17bfb6ecdb47f3279c01defec943 +R = 011550cb365daec01901b5a5cabe7930c10d79128c5e510d58b7593c88647eee811e6fa736b26351558cbe7f17d7c882bfd1ffa72ca3bf4bc1cf1c05f31f5e8bc057 +S = 00d6fc97ad14639a5157c92b39cfd1315d7e940a454f1289c8e95c8cbbce8731ad37180554e7a91565d86cffb3f5caf4ef883184d717e03eb776af714a32234e3f5f +Invalid = Y + +Curve = P-521 +X = 00202896ccf6710cf780bef8908a2783b3c8d5b8356f1546a1b6b909b0d65ffd7999a16112d8d68c837597656e520a56c2f6578e322df6dd794d2c08bc5d8f9f4c37 +Y = 00576152d30218c941e83080a502cdfbf9de7ca2c394969e779b76c359ffcb84902ff89e37125dea7dcdea0ba928ce2305c619b1906955e6be5ce40d087c5245eb45 +Digest = 90de70a32a54280bcf6acec4f4d2ff996855de0a224f538e2002106c06b695c8d9d143cfe0c90a1679a2fca7a15bf3ed +R = 00bc6a7f5d77cb6ebb36a261e80d739f42b67ddc7a6496acc0ba7804d14b4850cf3fe4d8b56cdd8c019ef9f0d33aa26746018fbb4c69f4587b6da1adcf2feee2b438 +S = 00f09c6a94a8550a2781e70b4542096407fc07617f537cd27f1a1ddd15c599d5a9e3fa41da57094456277b44b89d40b26f2cc054fbe657788fa9d71659008d0d698c + +Curve = P-521 +X = 006ee95783b768c895e2af569bb84b0b1b00c8b72eec022df255892527987ffecdd81bd8afe267408a8912cce80982bad79c30610571a37d2a0e027e73ad23923b8d +Y = 01ca3f60a37b18bd8b08529da1e39f93d518ae3feead5d00e07150d80d641b20e887c62e8e910ca1c2f64cdcfa678c89b2e3012e3d9b96088ae31dd660dfe6369cb6 +Digest = 8a27d78796a750bf11f75bbed9fa9807633adb4d907125004f69d29b881ec79d14feac2f0e0ed5f113932563eb38c63f +R = 006823e8f6514e42e79d50a112f0f320ecd53963729038ef0d66d5fb59e1c664fda493027678a02b139fcf290657fffd7a529f4f38ac73542f316e1b0b25b3b88cfd +S = 01b3bf9e54b0f48bfcc7289d187e831d94d165949db3c660cb63106be1b933e10614e3673bb8078bd8b80ba052c63d566899e618ea31e2a37e0c9c10da111ad11560 +Invalid = Y + +Curve = P-521 +X = 01ba73e2af308df78d4f2a9e552c3b9fd35d35bf20126fdf751d8ad9917cc58d734fb9de27553cd07c02eabc077f16ad4532871a8aeb59bbec82e46ef1581e4abac0 +Y = 00cf888c75582fb50bd0de724a9f4834ea127a1eea437b9a05935d1ec06815bace3464c230314b7f796423ba9fa983b2e6d1eb0260a32cf2f163a5ff46a9623ff149 +Digest = c9a34291213a5edc7474aee794f9de901be35159890bb660f9596efaf8ae7b02118457dfc3d8d2649cfd0bf5c7eea0eb +R = 01df7e724658f1666aee8d5d75609e3f5215228ac32b978ea53434b7d154dd4edf661c688083d0937e43836c3611526c75f6f26b08f7844a95113ea4a6f1ab824a0b +S = 019d40a7e03bd69ca568f70a066a4a57c0e6ab82dc8c2c8aa52b00c3ee4c327a87eeb7d837b0c4de68e25f7ac7cf6c0d8bbe0393b98dd61ac4961c7f8c70b40082e0 +Invalid = Y + +Curve = P-521 +X = 01419bc65174998ac21026f81e6807d8b42f0477396e7ff8a330e17c1d84bdc9b39b2a310767b46c41711f3f2fe503504350c86bf3d2b39473b64822ee32dec526e4 +Y = 0184c968f6ad79bf0da00520e5339751cd9c50e41e7cd21ef37756bd0e36e23a8071e5f0240988b73acb3bb2b6002002e09bc7ef70ffcfc7cf42d6b7c65110f54ae0 +Digest = c1c0b91842d461d466e94b411c673069d3737c898435972eda2f6ba1118ce9db013d57d3970b137071446a1fa2477930 +R = 00d785b38c5283466f796988242aba08398ed2493aaabf959ed0e8b7b915cbb711d7694f94206db74641a518642d43c843ea7f43b8354a956a3695764021cc5d2774 +S = 012c20c6ab988ae911c7cdea0549de2e40e3e68c47cfe58fb777ebc204641bbb44f2c8b6a0196d330ea2ffa1d8cdc1dd9be353f1c657e43f7fe3c094898a569c45b6 +Invalid = Y + +Curve = P-521 +X = 010f3bb1c96a753d278ddf6435e7a79a53bc2855d26d9f8d5c1337b0fd7d70bccf204377a02a1cbe95cb63e21a9e8a3ce8ee7c8d4ade16ff4083dcacbc6c4b2a350e +Y = 01f98a0273c48fa78a91c0f8c1a43f59c7bccb74780fa38b08989d334f2ba0353a3619e6d4a1072e4e052720ed10e4f2c07e12d0c81a062fe912708dc51d4cdba97c +Digest = 38688d539ee5c3792c29a505d8f8c01ad86efeb2fa3292e49cb921a76eca20dc536ae3feddf2e473dbe798926eb73fa9 +R = 014c4b9e23f51df21b4e02ed7611a8530466d1ed799b50b34b5fcac3bd1d63fa345925122414119cca76d22c167c18ad0fa8e1b47b53ab0f201bd4ca7ea25e011965 +S = 00ce91a050938119f80b5f584a9d9515c998212f6e122780f1607cebdb9b538dceb2d4039ab5e1b13736f4166e73d86c720516f20ad8f24e4b9fadd459c2988534ed +Invalid = Y + +Curve = P-521 +X = 00819178ace7bf1e6e942fd6ed69193386f6c90cf65b42e9204d34ec96a0ce8fb92552ca57a7ba658422dc8b53bee150170362e6e74bdda24fb458271602aaa9b832 +Y = 014af772624921f61b3d1275591ec2d68702fbf348382e9e552a9b6c110eebf6e93f20c8bff287d504fa08ae3628e611fc1262736916fa9edd87db1c78ed2426cab2 +Digest = dda4a591219b9762f682a9c9a626f172b9cb78ce191cf8acacf137ebbd3e28857e768a9e4f2407c990b192f07c5cf5ed +R = 012c45d6ac0b5dbd9647211f770c3cca4411666aa39b6988a968bab345129237597b6c9b3bd788c5f9f39a38463a8afb159ad72f19e7e33e7f9ce8d67d611c3d9b46 +S = 01684000b3d7381aded85b18576832c4a89b4faeea0515454677e29e3f072097e786fef11f72f229b63defa1c2fd3c07090b34f9147647035854cf2950c12a8b16d8 +Invalid = Y + +Curve = P-521 +X = 011f8e50ed6905b029ce4b16c8acb8ed9136b1c5adf6f11bfb5f3dd8bb1e208ca8329a0aff9bf286e3be90e4d61d5147bcaf2293f934862cca6aead51d6e0a083093 +Y = 01963e84a2f06a9cb273a424ee5fa1ae5900fef348371cc91c99323f58bbcd8742a4495a4f7ef52677501a4d5d663658c1f6c8f6edef8b7880e6894ff9e52bb617da +Digest = c55e6d3091b6eb8f48794749ae0c7e9394ca3cb7b083ad65177f8f8db938a76ed6d3c1286a3d51b333c74d1c0f8032b7 +R = 012fc3e0c18c4edbcda4f82b5136c893a6307c3f60affa15d0d99fc0e4a3576b7daefa363b3a362014d14f631c35619f6861bdff9a7b503825bf9f027fcb9a31fd8a +S = 01a138d6b02fd2a7ba45f7f952b2f329ba6a8e25697379330dddd91d1d6e865d3df1541bc4717d3e09b10a57cf38dcef587ac31b4a8abedef43e4f6cdf6ec3f49eea +Invalid = Y + +Curve = P-521 +X = 01efc81c1efc7a9bc36ed49a5ef6fa1ba641360fa5c0f96cc1e4a3f4d973c95e86935d979fc2101370777637ab210a56fc4173a50a758725d60e9f925f2066d2bc00 +Y = 0108225fc94ab33c74aff785dcc68c45cfc3cbbdfa3481fd2a3f97308be671fb32fc8d268c129d97f140210def188dceecc9d712ac397793dbc39c5cac332671ec54 +Digest = 5fe56235e4684bd7419e321db508565d30cd351086ef67d943aa5b932f93efdce875be295920ce5210b7d3f092f401e6 +R = 00480c48a24e7a7ef832547d107769254fcdb4e7982d0e6abd16822837fd4f3b66d81e1d4a018606881abebd220ed8ca865d7e00499ac9651a98c65502baebf34a98 +S = 00ccd22d1b44a1701c99f662535aea9abff7e27f73628101f42708737db8b07effdc2b0b05d4ef233c5910b6261ae9d9c540115f27d2af766c0494c33d31bd56b3db +Invalid = Y + +Curve = P-521 +X = 00a15c8040f94235b8b444f7a74ca293ed1b718449911eefbdb74332687850a644395394c690aa98e8064f6eca600fc3f659208c0f8a21a1e7113bed0c6e00e3176e +Y = 004bebea7037b731d175043dec3630b2ee85c680a81256921a89407c14507c10ac043deb5d474602211ad58cb569a8b805686bdac3ef7ff62a4d25b27200706b603d +Digest = d27a626bc9154bfc85b03724329b8a06454d5dc005997bd565f64a80134c865e73a2e123d2b433927efcbdfa3eafa827 +R = 00c1a70919025aceb29dbabdfc2a43715192cc60fc3d1ceababb40f91e3110b2cdd8f6e9c1bafe7415a26fa4179f8fc261b143ddb094fe61117afb13adae9db8943d +S = 00197d7f87aea8d6ccd2178614b147b290ec780c8075f8439137803c0e9a589e415d84fa23f5f31d61c1674f87142d4ba4f8473fc92d7715c281dcf3f1ee5c2f1390 + +Curve = P-521 +X = 012a593f568ca2571e543e00066ecd3a3272a57e1c94fe311e5df96afc1b792e5862720fc730e62052bbf3e118d3a078f0144fc00c9d8baaaa8298ff63981d09d911 +Y = 017cea5ae75a74100ee03cdf2468393eef55ddabfe8fd5718e88903eb9fd241e8cbf9c68ae16f4a1db26c6352afcb1894a9812da6d32cb862021c86cd8aa483afc26 +Digest = 7679eaaf0495725fa99c51a2dd0c35c8882b840e1c2340ba793013b1e2567471cba35c0dd6247cc2c2ca14f6556912a5687023fb2f0ee02114393bed4c598742 +R = 01aac7692baf3aa94a97907307010895efc1337cdd686f9ef2fd8404796a74701e55b03ceef41f3e6f50a0eeea11869c4789a3e8ab5b77324961d081e1a3377ccc91 +S = 0009c1e7d93d056b5a97759458d58c49134a45071854b8a6b8272f9fe7e78e1f3d8097e8a6e731f7ab4851eb26d5aa4fdadba6296dc7af835fe3d1b6dba4b031d5f3 +Invalid = Y + +Curve = P-521 +X = 01d6aef44370325a8a5882f4667c21172cdc8fa41d712562883ececff53883ac8ee276124e825088c79d6c9d96323cb7b8c0b7ea44d3f0026e2538f4b62d785bb1af +Y = 0027203959a6e944b91fe6306debe74dc5dde9831fd0ec27e8be2d0b56807d63151b15f6495b8632e919e1e6b015f5ae5f2b6fb8cf75b5f848f00cf4ee457cebed3a +Digest = b99c410653ce928e365d3613331b5df067020e92f634696279d5cee80f1f4a82f7d976a059e318b36eb25314b56f8765a81070d0944f4c86e8407d9c3e2aa7da +R = 004417ff74889dde6bb1820b5d13da5c81dcf9b0723ee89bb1ff0d3faa90d497685709f315b2cbe55481dee43ebb6d25b1501ae69494dd69e7bffb72f987d1573b93 +S = 00fd7aa027c665458c7ac11d54d4f32cb4a1e727b499ce27b08d3d647c636cc3222a4f0a6057732249ddc22574d7cb80c3769c3ea9de3d33db3edd8ea90cb3f8dc8a +Invalid = Y + +Curve = P-521 +X = 0153eb2be05438e5c1effb41b413efc2843b927cbf19f0bc9cc14b693eee26394a0d8880dc946a06656bcd09871544a5f15c7a1fa68e00cdc728c7cfb9c448034867 +Y = 0143ae8eecbce8fcf6b16e6159b2970a9ceb32c17c1d878c09317311b7519ed5ece3374e7929f338ddd0ec0522d81f2fa4fa47033ef0c0872dc049bb89233eef9bc1 +Digest = 97ff5a81fc88f7ddd3bc58154ffd2695912fe50ce7c63b62bd798fb673c6aa49f54bc7301fb7bddc6edc51b7e0d0b4dec9f80851fff02a33671ad9a406bbabe5 +R = 00dd633947446d0d51a96a0173c01125858abb2bece670af922a92dedcec067136c1fa92e5fa73d7116ac9c1a42b9cb642e4ac19310b049e48c53011ffc6e7461c36 +S = 00efbdc6a414bb8d663bb5cdb7c586bccfe7589049076f98cee82cdb5d203fddb2e0ffb77954959dfa5ed0de850e42a86f5a63c5a6592e9b9b8bd1b40557b9cd0cc0 + +Curve = P-521 +X = 01184b27a48e223891cbd1f4a0255747d078f82768157e5adcc8e78355a2ff17d8363dfa39bcdb48e2fae759ea3bd6a8909ce1b2e7c20653915b7cd7b94d8f110349 +Y = 003bd6e273ee4278743f1bb71ff7aefe1f2c52954d674c96f268f3985e69727f22adbe31e0dbe01da91e3e6d19baf8efa4dcb4d1cacd06a8efe1b617bd681839e6b9 +Digest = ee21776d7174103b7fb65f03fd5d78744d2706c6726ece81e3943cf90f60fad6d8978af6cae9bc059aee2412ef86d0600694447a10b9d21079b9ca77500634a9 +R = 004c1d88d03878f967133eb56714945d3c89c3200fad08bd2d3b930190246bf8d43e453643c94fdab9c646c5a11271c800d5df25c11927c000263e785251d62acd59 +S = 012e31766af5c605a1a67834702052e7e56bbd9e2381163a9bf16b579912a98bebabb70587da58bec621c1e779a8a21c193dda0785018fd58034f9a6ac3e297e3790 +Invalid = Y + +Curve = P-521 +X = 01d9020b8e6717254eebe619d46dd5a9dda7ba5491a7d1b6820fba888e236fafd71179200437f4d61284fb5a3dfbada66bac3e6909ccbeee03c2b93a8bebe41a73f4 +Y = 0048a5f09174fda12704acdd8ed560695dec42864b6300a030768a0be7f09d25f82d7b126125e41417a145641937807ed8d1af7a53f5bc3fc3c57427d755dcce3e25 +Digest = cc4e8efb1e9061500bd2dcc5233c2bfa3d3bd89067c26cfee4fff4a5a7c9c9b15151aec1fa91e78b67cfe3efd966ce65681dd3daf36b887d844033a473be592d +R = 0092df2dcb457fc7578eaacc98ffd73ade07d764e9553506f3dc958cdb3f65d37665528cb2f5f8bded0db0a57e6fa73bfad1aaf94718379d1655db4f32d4c505a785 +S = 010e0c31479c2b29dc2726fe9f75b397d9e37a17619e96bc631c62e9ece71f05b199804cc803940d43ddee41171dd7787668c7db05049dd5b63e4f63562aa700ca81 +Invalid = Y + +Curve = P-521 +X = 0007067d2cf7b7619b9fcff2c898246ae0950439b8bab92d809624970eda18456cb99953ce1ae45ee5d36ef02fcd5caa4d951de8581f0c21e572caad56d6dce60da3 +Y = 01913c59007a309005f226b6a30122828d60b4d0390359e1977f88b5347dacf2056dd362648e8b1d6fc038a3bd3fde6f1140c740efa9075ab8b4a64b334c5cd43f09 +Digest = 996010910456dee59309f1631f30e3dbf7ac2da7d5d7f69223c8a18f491cb18f7e11d0ca09352b715354a071e6d392a8c1dc0751569bdfcf36c158c8b07a5ba6 +R = 012aa4a532c108aa3cfb1753f95ca626bb72bd96a423d727656d4ebdc3f406d6cc6c44d3718f9abae8a0b46be9b57f8fd3a540326b63d0d4a8a93165715920437787 +S = 001badaf38e16efd75915f4806f054d40abd2d11e402039bd48c832f66cbfd145e4dac93357d476b7e608d7b75a017374ae76eee86c505f2cc16eaa19075827ccd60 +Invalid = Y + +Curve = P-521 +X = 00365388d9589c18ae608124b4cf746ff488183a912e07d26b6e867c5defb552a5a0df5a16b6342014dd1b0b6760072bcd60045d6a9a514fc74d16047c2e8765636d +Y = 01a5319b26fd555f2a12e557418f6aa65a3461aeaea5c0c6d8698ceaa5495eed7a7d2fed0b76e77b5be11834f36e413d5288e47231c0eb0e9007d4b042bb7a1b6014 +Digest = f8e150be2f657c8266fadc9bdb04648fc5a51f3c3f7521022aaf58d24165f8af4ad66319d8aa2dab48fe8a2f773c8d0e6c8c4f732e0fdfbae4b91918530c1f91 +R = 01d9ef377063a592cf81e27815a2c20789ff9b60f7f125e618b52d90b35abdd41cd7f437cfad337953ab0314fe8e79a2f2d27fa08597d4b28313358f714a737321fb +S = 00f01d4f150e0a174674a6a61a58a4ba781406024f6dd1b5252e04807b8a807a4ff8d52883eaa258286e506ef4b04ca890e6f81a79ed9a0cd5ed585094fea0bc5c43 + +Curve = P-521 +X = 00fd0cac24aeb75ca50c50a72340256b43649050e0fa155f72342877bf49c3d57ac2b51b828385ee6aea94bae38587e63390f5ef4ac5540a9e6fc6f1c1e79b524693 +Y = 0107b227bdd307efd7a8d4034f733d150c41601215e76eea2bac62ad2427dff52f75f46da3d5fe31bfaedf071d2a8bb5e3c82bf6c84ecdf89ca233c92d599d376309 +Digest = d0d8c24bc5b6f34bf35b08f25dc2d6ebcd36b565f96bee9c1b47030428f10c3ad2904de19247b29650690c08517404e8ca55f366ab176e5089a4c9c661f90eb2 +R = 01c00196aa5dcbc4c4404fa76504a5eacbc96aa66c3ba531a3a679f3fb675ce58f863e08b0d2bdeae74d96ad93a39a78ed4bb3749e26567d0ca5c48a71079925b617 +S = 00f1188eba4f0943f4003ddad6a54606c13af26014db2eb8e60534fad3dae8f07c021cea0990987f1e02dce03fe53360472c3dee3c305bb3ef4b0b53ea6625bf152a +Invalid = Y + +Curve = P-521 +X = 0104a96beea09d88ea6789a9925880c8a9ece8d764be931675640c1bf847ac8e7a8b14f408ba6722c2bf6295db9132d6ad2fe287fa6e6855f7c58ed238148a896944 +Y = 01b5e8e643fae552261427ea7d521f380adf605579462315c75e9203203ebdc9ee33dd7ba885b6cccccbd2327462988223c4b31485311c935a341ee87ba1ee820ce0 +Digest = e9ea3c8aeae3133be537da09b98c096b9a9eb287a02b3542efd30f0026ea9cb3f242b842b2cedbf02e70b44ff8a0b1bcf6f31956eaf6c0dd9a023bea36440068 +R = 00ba2c57827baae684d2c637590275c782a6db263a5358c8e1a08b5460ca3cf0f5ff8d4119a6b0d55fc68a75c793098e0a5622a0b4e2fcb0f17943440138d751797b +S = 01594beb73b2ebb7c573ff07b5c43e722dc05979df0eef53587e9fe06a920f61d2efcc7671e6cb875df4e4d92cd4d37cc3eadcb9b6aee8f2097790ce24d6dcda8706 +Invalid = Y + +Curve = P-521 +X = 010d587aa82a4d8e690672c00e3fd71826d892862d14dc4fbad4935aaab86924dc7ee6f7fd3e2bbe86a8652589448494dab83d363d1d623cbae59f6c2670706a0576 +Y = 01a9734c99b6ff21267050738937c30971d0f6fe07e29794748a5017ea1036c975c9a52e6d3739ca0e8d70e784529cc1a7437aac5d75c69121b69020a95356137f1d +Digest = 8814a9dbef9e6d9b8322bdf8d471b207388bb7bf831d9fba8ad29da52d528d5d5108c01e4459f5ca13e26bf5da3c848195558828d7a00f53abb9fce47ef35091 +R = 0188dcb840dfc573a97117009226d58dbb930ba8ec848931786abc770611f3519c8ba73cceb5b489170805bcf04974672fe66c908ba379aca99fa67fec81a994c2d1 +S = 000b1a185512dc6a65e454ea2bdb8049ef8f012a53ae87b759fb5d9edba51ea32e254e80545a99eb4b7c58af96b7c433535fa3f009cc644b1c97666d88355af9fc19 + +Curve = P-521 +X = 0182c957a62e2e27aa28acee2e2f7b1ed6aef81c68001d2648da47d2b621e8b8bd18d991cd1e3fb9afb84f639fbed1050584428cd2a1d50f877532ffdefdd4e6f7ba +Y = 005fadeef58cc0d79362b599e94636f9c70e3e5580c085b7ea52a5fd24fe4a892120b8f28ba53ec249c42d6d3b36268b8ca8464e54b72d37327d7504d9b7ce534d95 +Digest = e1838cf6ab5daf5ed28dc1b3365eb03466e01cc30f6fec9756c966cc7b89ef5ddb32754302a33b5aa309c871f98de082a21cf734ba8a368794d89b0cde1cfcf7 +R = 01e3a78e973fef6b6de8a0356401e89f435ae5f49c0173f073c4dbb9c91463e420f5265eade8305f11d30fa8d97e5b4c5ab33975f73385aea81fbdde2f7ddf7fdf16 +S = 00efeca10b5362e05a8f2e3df6661d0d536b32ca1e0a62515df2d94eb314aadb5eb40468483e24b16efe85c503d6c231ef860aabe674b72ed1ddd93853338e5e4e50 +Invalid = Y + +Curve = P-521 +X = 009911b41f9af525c874e05bfdf050331bf830296911bcb18eec16275027d63fa106c8989b07921c7e58b02711b5b5880cc4e6d9174e0d31060548cf643bf7ed4f0c +Y = 0184fc0fac3c2c80c69c1c0293f4e5e22fa08c267b1f36ac5ad6dfdf4da1754f7942f48cb56f56cba05e22b91508fe4db3703066e8f697aca56f974f3fe530c9640c +Digest = 365868aac67d82cc0510bcfb012f9035f99b5841329344f1b45f0489463cfe22c2f3641f7d6c59a3703aa2804323db8fec4fb3804f521149e5f7d38c9e1e94f2 +R = 017b8a22fd8f73112310867909f234fad6aa82999c28ea5a2e74b4b4bc79b2f89008b4d361ef7e797c7656f7d9317eff3e5a4982799b8cc0db82618bd2aa3959f617 +S = 01edacc6d1c0004b2090d2025d615de1fd53a96e826a3930c7cafaf3c87f34b2583997534cfa127485600a7ae04e6af4a2e98c77fd04507195e520e80014aa982a3c +Invalid = Y + +Curve = P-521 +X = 006da3b694e3123ef96b3fd2ab964f85a36110590720dc1724a5d50d3050498957211c6a1535032cf1f31240bfab967cc0cf3b442c35a1bfa3e72470df1863d2593a +Y = 017d0a5dc460c85d0365c7bdc2e9300e276b8aa97368af9972744f4422442afc601ecfe7903a33b0354c901c7b61f29d2d3c5610192cd188291c5651754b385b87a8 +Digest = 4e992e9e5403eb9822958f2737b70fa8096474a845a0f37244af744a6009e3b6e6e008faa7192fc01755bb785e03e4e3d2caef03eeadfe32a7fbc7e3bda49f5e +R = 01f9cb1f4e2e65282a929acd8b685ab34da176f5c73bcb374fd1b09bc995385ce3902d6c5496b02916fd5a28f6f8bb662828a76aa0ad14b01bc24a63b328c7bb949b +S = 001d6b3a2f34e3b7bf63d06b11ace172ca61ac5a911a4b408d766eb586c9ab820d42f555e546d892643e12a6752465427c213e3839e4f8cb3a7e4fd83642843e8544 +Invalid = Y + +Curve = P-521 +X = 00b7e03f0d623a0998add5360dfb0bfe836fcb0a46b0d6f697ba6b3766bd8698ac8c7af62f50511c6aa5e613f4a99fa28f70b220ba1cddb22482be74c969953ae6e5 +Y = 00d4ee40ee4441dc85356760f87ba32e2e7c269a2e53a2e8425d5ff02f5e4fe8d65cefe20e162c3915d2eb9ad1354bd28595a86dbdc94a5d40c5b44b1e3aa3965455 +Digest = 8ebb37c7b60ba4622070391864a70b5e797dc2464151304b1d9614b77f0bcb92fce230f42cf98f9b2612f481c21f70564f5cbfc4e81e48e08ae27b466f717e02 +R = 01fcba4781de6506f7c3f26521f0e036b5225f651e69e115d6784b2176a666edf69d759627468400a73a136f599fb8db4643fcc16bdeeef6384a1875e1c81c36b962 +S = 00a21cfaa7e1ee0eff7efc3d7e936378500283b00687363070974483ad474c58c6b55b77f678d78e7cb44d9745f79394659bdd26b72663608384b5ae9cac1c888d13 +Invalid = Y + +Curve = P-521 +X = 001bb7c623fde41beec7ddfb96f65848c2f52b50b39576bf06de6ccf157b8ec49889528728480928236300447da7171f58c8f0e0ba8fd3e2cf378b88619aa6c1e0bc +Y = 01f8b20a1a7df319bf78c2cee03581a1ffe8ca5107fbfd40760fbd5ef5247e2df1092d5caf504a9ee653ded2995f0cdd841d6af29c9f720770056ebbc128705f68e6 +Digest = c18be2e3f935561d1ad1cacf6ae06e733a463c7e5063cbb0cfaf162a579522786755dff879d2bb0b63d4eea9120a2ed648d601a5cb2dee936dbada679bcc134b +R = 0000db4c31f316912295c5b9506aabc24b0b2dc2b2358e6b023148889d9200bcf44762e88575e359b4868b2d93ba7bdb24800b09fc22eade0744b9832b71ee784e9c +S = 018c84437fac7cd82099a2a4230084ac27ec7ea9c92e1c9d9a71290df9b37dc881f9ba59ed331c22dca4b2cbb837cd916e0a78398d2b7aaf8e88f113a942beac48c0 +Invalid = Y + + # The following tests use digests equal to the order and 2^n - 1, where n is # the number of bits in the order. This is to test the truncated digest not # being fully reduced. @@ -1207,6 +1793,20 @@ Digest = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff R = 9d923e199d98272e44b8fba382bf3c19660ecb4a9aae3513ff6802a73fef510c15c202807c3f9334b0bce7d6c6a80839 S = 520784e6290d04d9b61993ee5ebc6fa8ff527fb0777c43cdefc7586701e60edb399005a5648ff852de80208232849fbd +Curve = P-521 +X = 00056cc489982829b728978193d047596325a91ee2e2c9110f7da605fd2d1b78424e87d85500f391fe9f54209c42e582ca3284484afc6edfe2acdc69c3591f6c47cf +Y = 010e91be6632da7afd03caedebdb572fd41cb1a7221e9c2d984016bac4693b3d10c5b1d76ba32b89f5fadd157df122be9cd85151977b99176998cfccbd3f9a03ba3f +Digest = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 +R = 00bd5e59a9bc97de61588d143990ad7fd5405ac53aa8e6332a085a301138b23beaba126b41549db1167df47362a9de77c73b1bfaa14b31114644b4db8d35179f706a +S = 000cbb560f68b7240e309301ed4e6dc20d329f7e2098bcae26a07dd364e6177bb408eb5d0b47a3fcf36def98b951af9a55a47d24d95cd66cc11973269694e2f6f8d1 + +Curve = P-521 +X = 002aca58eeac43152b292f42a6a677d327386337409ba7de17acae1978e097f21e49d47f707c6ed6045c66551c93df9ef9bcc442db804e62fcac9f0574876d6d7fea +Y = 01862ed4f9d235afcc4e6b45e491da363104d4db7b97f12d869c40ab09a3c8c72519a9712ca733ddf046ad039842e8caed2425ecaf42d5171b3e236c11fee8699684 +Digest = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +R = 00ec0b91fa4386a8acdc0e46dd9c1d1775abbe0da8ead424aa4ace58e284a5be00e2c1ef95b6f4d861615564e1e7305656567f95275ce63b534420eae77ec37492c2 +S = 01e1099fb389db498ab4cf23b4f06a74b9326878ae3c76ea13832e50702b30fe8303093a59cc9a0995f1dfc15e6f7dabca8a2acaf03ec005447d29fb429a252064ec + # The following tests are intended to stress the final comparison in ECDSA. # ECDSA verification computes some curve point (x, y), picking the fully-reduced # representive of x mod p, and checking that x mod n is r. (n is the order of @@ -1360,3 +1960,71 @@ Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9 R = 000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 Invalid = Y + +# r = 1, x = 1 is valid. +Curve = P-521 +X = 00f07e0b593332d09ec4fd0bae93f648a3da04dd224faae3f64cc490ec8fce3a6fe53d1b2c9e326be076cafb921b7e3f8b2288db491819522d65472870668c3808c9 +Y = 018e42509aca542a8de421589c38ba653e8cfd69322336217042a9dc0f67f6d7ae2cd4e385f480ffaf8981f715c7ca3765d9867dfd5a02947b0895f82eaf8b257e88 +Digest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9 +R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +S = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 + +# r = 1 + n, x = 1 is invalid. r must already be reduced. +Curve = P-521 +X = 00f07e0b593332d09ec4fd0bae93f648a3da04dd224faae3f64cc490ec8fce3a6fe53d1b2c9e326be076cafb921b7e3f8b2288db491819522d65472870668c3808c9 +Y = 018e42509aca542a8de421589c38ba653e8cfd69322336217042a9dc0f67f6d7ae2cd4e385f480ffaf8981f715c7ca3765d9867dfd5a02947b0895f82eaf8b257e88 +Digest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9 +R = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a +S = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 +Invalid = Y + +# r = n-2, x = n-2 is the largest x without a reduction. +Curve = P-521 +X = 002a61afb982e49f030dd4e6ba0e495703abe0442b1283ee693fffc1b558f49f0a4cb4f138ea0604e667958495b86c61f358dce7e7f170da47372be3e4168408a260 +Y = 01baa19e8929fc8e7208e854e706a3d7f21479d1f6922a65ae3490fd5f52ae6580513b1fdd5bee927d002a9608abbb925b6727bdc110a3145fc8622d1fa8154c82d8 +Digest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9 +R = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407 +S = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 + +# r = n-3, x = n-2 is incorrect. +Curve = P-521 +X = 002a61afb982e49f030dd4e6ba0e495703abe0442b1283ee693fffc1b558f49f0a4cb4f138ea0604e667958495b86c61f358dce7e7f170da47372be3e4168408a260 +Y = 01baa19e8929fc8e7208e854e706a3d7f21479d1f6922a65ae3490fd5f52ae6580513b1fdd5bee927d002a9608abbb925b6727bdc110a3145fc8622d1fa8154c82d8 +Digest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9 +R = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 +S = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 +Invalid = Y + +# r = 1, x = n+1 is the smallest x with a reduction. +Curve = P-521 +X = 0049bbb2d3267a6eab2c59fac5b138b9e9c383db6637fcfe5d9f430e4c4c2ba0332340975448bd86c92a55c1a8288adf7f774096022419aa8c497499dafee7b93257 +Y = 00bb52fd444ec497ce228135f2498d40fb84eb6f674df1245d3aaac3c75b55ff5fff8e90b6f0189a3132cb9fd8d6e74fda5866fe2b9fc7484c628fde97e0b00f2b67 +Digest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9 +R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +S = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 + +# r = 2, x = n+1 is incorrect. +Curve = P-521 +X = 0049bbb2d3267a6eab2c59fac5b138b9e9c383db6637fcfe5d9f430e4c4c2ba0332340975448bd86c92a55c1a8288adf7f774096022419aa8c497499dafee7b93257 +Y = 00bb52fd444ec497ce228135f2498d40fb84eb6f674df1245d3aaac3c75b55ff5fff8e90b6f0189a3132cb9fd8d6e74fda5866fe2b9fc7484c628fde97e0b00f2b67 +Digest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9 +R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 +S = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 +Invalid = Y + +# r = p-1-n, x = p-1 is the largest valid x. +Curve = P-521 +X = 00f651d53d45bf6fd55a5f184e580d11259bc65200387dbc1bf7fb867d2d12a207d2962204ccf38e9d37d23ed95bd01ec576c457127766ecb8ad00342a476ea82078 +Y = 0196caedf64fbaa9a12c16836e0564e36f733957375706edb5f32911991a994c2d6a1ea5db2ee764835a9d6aff379e195f722b48e8d2b60fc50de2a5160c77c3f06c +Digest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9 +R = 00000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf5 +S = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 + +# r = p-n+1, x = 1 is incorrect. r is too large to compare r+n with x. +Curve = P-521 +X = 009eeb7f956230c3744ca5b683f413009363107aad18a027fa7af6ac07a699911e94143d3ef00c0062d4187c2ea74dc9322c05431a6b7fed51ee71b047ce3a0e967c +Y = 007d2c089a6720f7c7886ce8aa6aeb9b821adde0eb025ef63c62d37c32b2d6823c857ce7743b8181c35c8f34e6aeb4487dd693e01d69dfe883c07c25ebe89bdc4d56 +Digest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9 +R = 00000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7 +S = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 +Invalid = Y diff --git a/src/ec.rs b/src/ec.rs index 56c823e13f..ab8d91471a 100644 --- a/src/ec.rs +++ b/src/ec.rs @@ -42,7 +42,7 @@ pub enum CurveID { P384, } -const ELEM_MAX_BITS: usize = 384; +const ELEM_MAX_BITS: usize = 521; pub const ELEM_MAX_BYTES: usize = (ELEM_MAX_BITS + 7) / 8; pub const SCALAR_MAX_BYTES: usize = ELEM_MAX_BYTES; diff --git a/src/ec/suite_b/ecdsa/digest_scalar.rs b/src/ec/suite_b/ecdsa/digest_scalar.rs index ed95d4e9b7..7cf52bb15f 100644 --- a/src/ec/suite_b/ecdsa/digest_scalar.rs +++ b/src/ec/suite_b/ecdsa/digest_scalar.rs @@ -14,11 +14,7 @@ //! ECDSA Signatures using the P-256 and P-384 curves. -use crate::{ - digest, - ec::suite_b::ops::*, - limb::{self, LIMB_BYTES}, -}; +use crate::{digest, ec::suite_b::ops::*, limb}; /// Calculate the digest of `msg` using the digest algorithm `digest_alg`. Then /// convert the digest to a scalar in the range [0, n) as described in @@ -58,14 +54,27 @@ pub(crate) fn digest_bytes_scalar(ops: &ScalarOps, digest: &[u8]) -> Scalar { // This is a separate function solely so that we can test specific digest // values like all-zero values and values larger than `n`. fn digest_scalar_(ops: &ScalarOps, digest: &[u8]) -> Scalar { + let mut digest_shift = [0u8; MAX_LIMBS * 8]; let cops = ops.common; - let num_limbs = cops.num_limbs; - let digest = if digest.len() > num_limbs * LIMB_BYTES { - &digest[..(num_limbs * LIMB_BYTES)] + let num_bytes = (cops.order_bits + 7) / 8; + let mut digest = if digest.len() > num_bytes { + &digest[..num_bytes] } else { digest }; + let shift = (digest.len() * 8).saturating_sub(cops.order_bits); + if shift > 0 { + debug_assert!(shift < 8); + // If the digest is too long after byte trancation + // shift right to get the proper number of bits + digest_shift[0] = digest[0] >> shift; + for i in 1..num_bytes { + digest_shift[i] = digest[i] >> shift | digest[i - 1] << (8 - shift); + } + digest = &digest_shift[..num_bytes]; + } + scalar_parse_big_endian_partially_reduced_variable_consttime( cops, limb::AllowZero::Yes, diff --git a/src/ec/suite_b/ecdsa/verification.rs b/src/ec/suite_b/ecdsa/verification.rs index 2e9f50127d..3a3899353e 100644 --- a/src/ec/suite_b/ecdsa/verification.rs +++ b/src/ec/suite_b/ecdsa/verification.rs @@ -45,6 +45,10 @@ enum AlgorithmID { ECDSA_P384_SHA256_ASN1, ECDSA_P384_SHA384_ASN1, ECDSA_P384_SHA384_FIXED, + ECDSA_P521_SHA384_FIXED, + ECDSA_P521_SHA512_FIXED, + ECDSA_P521_SHA384_ASN1, + ECDSA_P521_SHA512_ASN1, } derive_debug_via_id!(EcdsaVerificationAlgorithm); @@ -229,6 +233,30 @@ pub static ECDSA_P384_SHA384_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificati id: AlgorithmID::ECDSA_P384_SHA384_FIXED, }; +/// Verification of fixed-length (PKCS#11 style) ECDSA signatures using the +/// P-521 curve and SHA-384. +/// +/// See "`ECDSA_*_FIXED` Details" in `ring::signature`'s module-level +/// documentation for more details. +pub static ECDSA_P521_SHA384_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { + ops: &p521::PUBLIC_SCALAR_OPS, + digest_alg: &digest::SHA384, + split_rs: split_rs_fixed, + id: AlgorithmID::ECDSA_P521_SHA384_FIXED, +}; + +/// Verification of fixed-length (PKCS#11 style) ECDSA signatures using the +/// P-521 curve and SHA-512. +/// +/// See "`ECDSA_*_FIXED` Details" in `ring::signature`'s module-level +/// documentation for more details. +pub static ECDSA_P521_SHA512_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { + ops: &p521::PUBLIC_SCALAR_OPS, + digest_alg: &digest::SHA512, + split_rs: split_rs_fixed, + id: AlgorithmID::ECDSA_P521_SHA512_FIXED, +}; + /// Verification of ASN.1 DER-encoded ECDSA signatures using the P-256 curve /// and SHA-256. /// @@ -287,6 +315,30 @@ pub static ECDSA_P384_SHA384_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificatio id: AlgorithmID::ECDSA_P384_SHA384_ASN1, }; +/// Verification of ASN.1 DER-encoded ECDSA signatures using the P-521 curve +/// and SHA-384. +/// +/// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level +/// documentation for more details. +pub static ECDSA_P521_SHA384_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { + ops: &p521::PUBLIC_SCALAR_OPS, + digest_alg: &digest::SHA384, + split_rs: split_rs_asn1, + id: AlgorithmID::ECDSA_P521_SHA384_ASN1, +}; + +/// Verification of ASN.1 DER-encoded ECDSA signatures using the P-521 curve +/// and SHA-512. +/// +/// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level +/// documentation for more details. +pub static ECDSA_P521_SHA512_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { + ops: &p521::PUBLIC_SCALAR_OPS, + digest_alg: &digest::SHA512, + split_rs: split_rs_asn1, + id: AlgorithmID::ECDSA_P521_SHA512_ASN1, +}; + #[cfg(test)] mod tests { extern crate alloc; @@ -324,6 +376,7 @@ mod tests { let alg = match curve_name.as_str() { "P-256" => &ECDSA_P256_SHA256_FIXED, "P-384" => &ECDSA_P384_SHA384_FIXED, + "P-521" => &ECDSA_P521_SHA512_FIXED, _ => { panic!("Unsupported curve: {}", curve_name); } diff --git a/src/ec/suite_b/ops.rs b/src/ec/suite_b/ops.rs index b42b958efa..bfaed3c7a8 100644 --- a/src/ec/suite_b/ops.rs +++ b/src/ec/suite_b/ops.rs @@ -55,6 +55,7 @@ const ONE: Elem = Elem::from_hex("1"); /// Operations and values needed by all curve operations. pub struct CommonOps { pub num_limbs: usize, + pub order_bits: usize, q: Modulus, pub n: Elem, @@ -214,7 +215,7 @@ impl PublicKeyOps { // implements NIST SP 800-56A Step 2: "Verify that xQ and yQ are integers // in the interval [0, p-1] in the case that q is an odd prime p[.]" pub fn elem_parse(&self, input: &mut untrusted::Reader) -> Result, error::Unspecified> { - let encoded_value = input.read_bytes(self.common.num_limbs * LIMB_BYTES)?; + let encoded_value = input.read_bytes((self.common.order_bits + 7) / 8)?; let parsed = elem_parse_big_endian_fixed_consttime(self.common, encoded_value)?; let mut r = Elem::zero(); // Montgomery encode (elem_to_mont). @@ -242,7 +243,7 @@ pub struct ScalarOps { impl ScalarOps { // The (maximum) length of a scalar, not including any padding. pub fn scalar_bytes_len(&self) -> usize { - self.common.num_limbs * LIMB_BYTES + (self.common.order_bits + 7) / 8 } /// Returns the modular inverse of `a` (mod `n`). Panics of `a` is zero, @@ -403,7 +404,7 @@ fn parse_big_endian_fixed_consttime( allow_zero: AllowZero, max_exclusive: &[Limb], ) -> Result, error::Unspecified> { - if bytes.len() != ops.num_limbs * LIMB_BYTES { + if bytes.len() != (ops.order_bits + 7) / 8 { return Err(error::Unspecified); } let mut r = elem::Elem::zero(); @@ -981,6 +982,14 @@ mod tests { ); } + #[test] + fn p521_point_mul_base_test() { + point_mul_base_tests( + &p521::PRIVATE_KEY_OPS, + test_file!("ops/p521_point_mul_base_tests.txt"), + ); + } + fn point_mul_base_tests(ops: &PrivateKeyOps, test_file: test::File) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); @@ -1169,3 +1178,4 @@ mod tests { mod elem; pub mod p256; pub mod p384; +pub mod p521; diff --git a/src/ec/suite_b/ops/elem.rs b/src/ec/suite_b/ops/elem.rs index d9c424fb28..eef1c0ee15 100644 --- a/src/ec/suite_b/ops/elem.rs +++ b/src/ec/suite_b/ops/elem.rs @@ -128,4 +128,4 @@ pub fn unary_op_from_binary_op_assign( unsafe { f(a.limbs.as_mut_ptr(), a.limbs.as_ptr(), a.limbs.as_ptr()) } } -pub const MAX_LIMBS: usize = (384 + (LIMB_BITS - 1)) / LIMB_BITS; +pub const MAX_LIMBS: usize = (521 + (LIMB_BITS - 1)) / LIMB_BITS; diff --git a/src/ec/suite_b/ops/p256.rs b/src/ec/suite_b/ops/p256.rs index b6e27f4025..5da179d6a6 100644 --- a/src/ec/suite_b/ops/p256.rs +++ b/src/ec/suite_b/ops/p256.rs @@ -19,6 +19,7 @@ use super::{ pub static COMMON_OPS: CommonOps = CommonOps { num_limbs: 256 / LIMB_BITS, + order_bits: 256, q: Modulus { p: limbs_from_hex("ffffffff00000001000000000000000000000000ffffffffffffffffffffffff"), diff --git a/src/ec/suite_b/ops/p384.rs b/src/ec/suite_b/ops/p384.rs index 65c76e6d00..8525b88bfc 100644 --- a/src/ec/suite_b/ops/p384.rs +++ b/src/ec/suite_b/ops/p384.rs @@ -21,6 +21,7 @@ use super::{ pub static COMMON_OPS: CommonOps = CommonOps { num_limbs: 384 / LIMB_BITS, + order_bits: 384, q: Modulus { p: limbs_from_hex("fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"), @@ -286,6 +287,7 @@ prefixed_extern! { a: *const Limb, // [3][COMMON_OPS.num_limbs] b: *const Limb, // [3][COMMON_OPS.num_limbs] ); + fn nistz384_point_mul( r: *mut Limb, // [3][COMMON_OPS.num_limbs] p_scalar: *const Limb, // [COMMON_OPS.num_limbs] diff --git a/src/ec/suite_b/ops/p521.rs b/src/ec/suite_b/ops/p521.rs new file mode 100644 index 0000000000..9d9b103ffe --- /dev/null +++ b/src/ec/suite_b/ops/p521.rs @@ -0,0 +1,317 @@ +// Copyright 2023 Brian Smith. +// Copyright 2023 Cloudflare +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +use super::{ + elem::{binary_op, binary_op_assign}, + elem_sqr_mul, Modulus, *, +}; + +pub static COMMON_OPS: CommonOps = CommonOps { + num_limbs: (521 + LIMB_BITS - 1) / LIMB_BITS, + order_bits: 521, + + q: Modulus { + p: limbs_from_hex("1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), + #[cfg(target_pointer_width = "64")] + rr: limbs_from_hex("4000000000000000000000000000"), + #[cfg(target_pointer_width = "32")] + rr: limbs_from_hex("400000000000"), + }, + n: Elem::from_hex("1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"), + + #[cfg(target_pointer_width = "64")] + a: Elem::from_hex("1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffff"), + #[cfg(target_pointer_width = "32")] + a: Elem::from_hex("1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffff"), + #[cfg(target_pointer_width = "64")] + b: Elem::from_hex("4d0fc94d10d05b42a077516d392dccd98af9dc5a44c8c77884f0ab0c9ca8f63f49bd8b29605e9dd8df839ab9efc41e961a78f7a28fea35a81f8014654fae586387"), + #[cfg(target_pointer_width = "32")] + b: Elem::from_hex("15cb0c70e4d0fc94d10d05b42a077516d392dccd98af9dc5a44c8c77884f0ab0c9ca8f63f49bd8b29605e9dd8df839ab9efc41e961a78f7a28fea35a81f8014654f"), + + elem_mul_mont: p521_elem_mul_mont, + elem_sqr_mont: p521_elem_sqr_mont, + + point_add_jacobian_impl: nistz521_point_add, +}; + +pub static PRIVATE_KEY_OPS: PrivateKeyOps = PrivateKeyOps { + common: &COMMON_OPS, + elem_inv_squared: p521_elem_inv_squared, + point_mul_base_impl: p521_point_mul_base_impl, + point_mul_impl: nistz521_point_mul, +}; + +fn p521_elem_inv_squared(a: &Elem) -> Elem { + // Calculate a**-2 (mod q) == a**(q - 3) (mod q) + // + // The exponent (q - 3) is: + // + // 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ + // ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ + // ffc + + #[inline] + fn sqr_mul(a: &Elem, squarings: usize, b: &Elem) -> Elem { + elem_sqr_mul(&COMMON_OPS, a, squarings, b) + } + + let b_1 = &a; + let b_11 = sqr_mul(b_1, 1, b_1); + let f = sqr_mul(&b_11, 2, &b_11); + let ff = sqr_mul(&f, 4, &f); + let ffff = sqr_mul(&ff, 8, &ff); + let ffff_ffff = sqr_mul(&ffff, 16, &ffff); + let ffff_ffff_ffff_ffff = sqr_mul(&ffff_ffff, 32, &ffff_ffff); + let fx32 = sqr_mul(&ffff_ffff_ffff_ffff, 64, &ffff_ffff_ffff_ffff); + let fx64 = sqr_mul(&fx32, 128, &fx32); + let fx128 = sqr_mul(&fx64, 256, &fx64); + let fx129 = sqr_mul(&fx128, 4, &f); + let fx129_11 = sqr_mul(&fx129, 2, &b_11); + let mut acc = sqr_mul(&fx129_11, 1, b_1); + + COMMON_OPS.elem_square(&mut acc); + COMMON_OPS.elem_square(&mut acc); + + acc +} + +fn p521_point_mul_base_impl(a: &Scalar) -> Point { + // XXX: Not efficient. TODO: Precompute multiples of the generator. + #[cfg(target_pointer_width = "64")] + const GENERATOR: (Elem, Elem) = ( + Elem::from_hex("74e6cf1f65b311cada214e32409c829fda90fc1457b035a69edd50a5af3bf7f3ac947f0ee093d17fd46f19a459e0c2b5214dfcbf3f18e172deb331a16381adc101"), + Elem::from_hex("1e0022e452fda163e8deccc7aa224abcda2340bd7de8b939f33164bf7394caf7a132062a85c809fd683b09a9e384351396120445f4a3b4fe8b328460e4a5a9e268e"), + ); + + #[cfg(target_pointer_width = "32")] + const GENERATOR: (Elem, Elem) = ( + Elem::from_hex("1035b820274e6cf1f65b311cada214e32409c829fda90fc1457b035a69edd50a5af3bf7f3ac947f0ee093d17fd46f19a459e0c2b5214dfcbf3f18e172deb331a163"), + Elem::from_hex("b53c4d1de0022e452fda163e8deccc7aa224abcda2340bd7de8b939f33164bf7394caf7a132062a85c809fd683b09a9e384351396120445f4a3b4fe8b328460e4a"), + ); + + PRIVATE_KEY_OPS.point_mul(a, &GENERATOR) +} + +pub static PUBLIC_KEY_OPS: PublicKeyOps = PublicKeyOps { + common: &COMMON_OPS, +}; + +pub static SCALAR_OPS: ScalarOps = ScalarOps { + common: &COMMON_OPS, + scalar_inv_to_mont_impl: p521_scalar_inv_to_mont, + scalar_mul_mont: p521_scalar_mul_mont, +}; + +pub static PUBLIC_SCALAR_OPS: PublicScalarOps = PublicScalarOps { + scalar_ops: &SCALAR_OPS, + public_key_ops: &PUBLIC_KEY_OPS, + private_key_ops: &PRIVATE_KEY_OPS, + + q_minus_n: Elem::from_hex("5ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf6"), +}; + +#[allow(dead_code)] +pub static PRIVATE_SCALAR_OPS: PrivateScalarOps = PrivateScalarOps { + scalar_ops: &SCALAR_OPS, + oneRR_mod_n: Scalar::from_hex(N_RR_HEX), +}; + +fn p521_scalar_inv_to_mont(a: &Scalar) -> Scalar { + // Calculate the modular inverse of scalar |a| using Fermat's Little + // Theorem: + // + // a**-1 (mod n) == a**(n - 2) (mod n) + // + // The exponent (n - 2) is: + // + // 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ + // ffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386\ + // 407 + fn mul(a: &Scalar, b: &Scalar) -> Scalar { + binary_op(p521_scalar_mul_mont, a, b) + } + + fn sqr(a: &Scalar) -> Scalar { + binary_op(p521_scalar_mul_mont, a, a) + } + + fn sqr_mut(a: &mut Scalar) { + unary_op_from_binary_op_assign(p521_scalar_mul_mont, a); + } + + // Returns (`a` squared `squarings` times) * `b`. + fn sqr_mul(a: &Scalar, squarings: usize, b: &Scalar) -> Scalar { + debug_assert!(squarings >= 1); + let mut tmp = sqr(a); + for _ in 1..squarings { + sqr_mut(&mut tmp); + } + mul(&tmp, b) + } + + // Sets `acc` = (`acc` squared `squarings` times) * `b`. + fn sqr_mul_acc(acc: &mut Scalar, squarings: usize, b: &Scalar) { + debug_assert!(squarings >= 1); + for _ in 0..squarings { + sqr_mut(acc); + } + binary_op_assign(p521_scalar_mul_mont, acc, b) + } + + fn to_mont(a: &Scalar) -> Scalar { + const N_RR: Scalar = Scalar::from_hex(N_RR_HEX); + binary_op(p521_scalar_mul_mont, a, &N_RR) + } + + // Indexes into `d`. + const B_1: usize = 0; + const B_11: usize = 1; + const B_101: usize = 2; + const B_111: usize = 3; + const B_1001: usize = 4; + const B_1011: usize = 5; + const B_1101: usize = 6; + const B_1111: usize = 7; + const DIGIT_COUNT: usize = 8; + + let mut d = [Scalar::zero(); DIGIT_COUNT]; + d[B_1] = to_mont(a); + let b_10 = sqr(&d[B_1]); + for i in B_11..DIGIT_COUNT { + d[i] = mul(&d[i - 1], &b_10); + } + + let ff = sqr_mul(&d[B_1111], 0 + 4, &d[B_1111]); + let ffff = sqr_mul(&ff, 0 + 8, &ff); + let ffffffff = sqr_mul(&ffff, 0 + 16, &ffff); + let ffffffffffffffff = sqr_mul(&ffffffff, 0 + 32, &ffffffff); + let fx32 = sqr_mul(&ffffffffffffffff, 0 + 64, &ffffffffffffffff); + let mut acc = sqr_mul(&fx32, 0 + 128, &fx32); + + // After the first 256 bits, the remaining 265 bits are: + // 1fa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407 + + // The rest of the exponent, in binary, is: + // + // 1111110100101000110000110100001111000001110111111001011111001011 + // 0011010110111111111001100000000010100100011110111000010011010010 + // 1110100000011101110110101110010011011100010001001100111000100011 + // 110101110101110110110111110110111000111101001000100111000011001 + // 0000000111 + + static REMAINING_WINDOWS: [(u8, u8); 54] = [ + (4, B_1111 as u8), + (0 + 4, B_1101 as u8), + (2 + 3, B_101 as u8), + (3 + 2, B_11 as u8), + (4 + 4, B_1101 as u8), + (4 + 4, B_1111 as u8), + (5 + 3, B_111 as u8), + (1 + 4, B_1111 as u8), + (0 + 2, B_11 as u8), + (2 + 4, B_1011 as u8), + (0 + 3, B_111 as u8), + (2 + 4, B_1011 as u8), + (2 + 4, B_1101 as u8), + (1 + 4, B_1101 as u8), + (0 + 4, B_1111 as u8), + (0 + 4, B_1111 as u8), + (2 + 2, B_11 as u8), + (9 + 3, B_101 as u8), + (2 + 1, B_1 as u8), + (3 + 4, B_1111 as u8), + (1 + 3, B_111 as u8), + (4 + 4, B_1001 as u8), + (0 + 3, B_101 as u8), + (2 + 4, B_1011 as u8), + (0 + 3, B_101 as u8), + (6 + 3, B_111 as u8), + (1 + 3, B_111 as u8), + (1 + 4, B_1101 as u8), + (1 + 3, B_111 as u8), + (2 + 4, B_1001 as u8), + (0 + 4, B_1011 as u8), + (0 + 1, B_1 as u8), + (3 + 1, B_1 as u8), + (3 + 1, B_1 as u8), + (2 + 2, B_11 as u8), + (2 + 3, B_111 as u8), + (3 + 1, B_1 as u8), + (3 + 4, B_1111 as u8), + (1 + 4, B_1011 as u8), + (0 + 3, B_101 as u8), + (1 + 3, B_111 as u8), + (1 + 4, B_1101 as u8), + (0 + 4, B_1011 as u8), + (0 + 3, B_111 as u8), + (1 + 4, B_1101 as u8), + (0 + 2, B_11 as u8), + (3 + 4, B_1111 as u8), + (1 + 1, B_1 as u8), + (2 + 1, B_1 as u8), + (3 + 4, B_1001 as u8), + (0 + 2, B_11 as u8), + (4 + 2, B_11 as u8), + (2 + 1, B_1 as u8), + (7 + 3, B_111 as u8), + ]; + + for &(squarings, digit) in &REMAINING_WINDOWS[..] { + sqr_mul_acc(&mut acc, usize::from(squarings), &d[usize::from(digit)]); + } + + acc +} + +unsafe extern "C" fn p521_elem_sqr_mont( + r: *mut Limb, // [COMMON_OPS.num_limbs] + a: *const Limb, // [COMMON_OPS.num_limbs] +) { + // XXX: Inefficient. TODO: Make a dedicated squaring routine. + p521_elem_mul_mont(r, a, a); +} + +#[cfg(target_pointer_width = "64")] +const N_RR_HEX: &str = "3d2d8e03d1492d0d455bcc6d61a8e567bccff3d142b7756e3edd6e23d82e49c7dbd3721ef557f75e0612a78d38794573fff707badce5547ea3137cd04dcf15dd04"; + +#[cfg(target_pointer_width = "32")] +const N_RR_HEX: &str = "19a5b5a3afe8c44383d2d8e03d1492d0d455bcc6d61a8e567bccff3d142b7756e3a4fb35b72d34027055d4dd6d30791d9dc18354a564374a6421163115a61c64ca7"; + +prefixed_extern! { + fn p521_elem_mul_mont( + r: *mut Limb, // [COMMON_OPS.num_limbs] + a: *const Limb, // [COMMON_OPS.num_limbs] + b: *const Limb, // [COMMON_OPS.num_limbs] + ); + + fn nistz521_point_add( + r: *mut Limb, // [3][COMMON_OPS.num_limbs] + a: *const Limb, // [3][COMMON_OPS.num_limbs] + b: *const Limb, // [3][COMMON_OPS.num_limbs] + ); + + fn nistz521_point_mul( + r: *mut Limb, // [3][COMMON_OPS.num_limbs] + p_scalar: *const Limb, // [COMMON_OPS.num_limbs] + p_x: *const Limb, // [COMMON_OPS.num_limbs] + p_y: *const Limb, // [COMMON_OPS.num_limbs] + ); + + fn p521_scalar_mul_mont( + r: *mut Limb, // [COMMON_OPS.num_limbs] + a: *const Limb, // [COMMON_OPS.num_limbs] + b: *const Limb, // [COMMON_OPS.num_limbs] + ); +} diff --git a/src/ec/suite_b/ops/p521_point_mul_base_tests.txt b/src/ec/suite_b/ops/p521_point_mul_base_tests.txt new file mode 100644 index 0000000000..37f4239729 --- /dev/null +++ b/src/ec/suite_b/ops/p521_point_mul_base_tests.txt @@ -0,0 +1,516 @@ +# N = -64 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863c9 +r = 017668a79ebe01c97f61533f5eddd40c305dd65b0a5ce67c4396938df5e9e2f7ed1bb9d3e0160b01f3800efad55c014d027ea0da9ee1c671907ba16ae6a85f738444, 00fd462af7ef41d42353c9322719ba682711f179ce22e4b0bc2a3a29f4d22f57b95a7785ac230e28353fde1f1f2d122fcd6115d28747d3ad03905262dca3c51edc5b + +# N = -63 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863ca +r = 0022bff417bccd658537470e510dad7fd06ee0f3faa7f26a8d84229d74cb309847092f631ccb423ac3132f3ad7be812bb8564687adf5b7e7444472f04c9d4ed91903, 0163f4493f29bb26fd1434f2b0fb66bcdf5ffcd350b9e562aeee3ffd16121189f3b4a1f604383e87fc76be284d425204cdaea98b175296afe122f52b2e079ef9a17e + +# N = -62 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863cb +r = 004570107b76a4f93b9a711bc585bde0bbd757ca1d72cac0eeac42d1c5f9237f628b7e909f9ff195fea70cf85464b8f7950b4b4b13ff1888a6e42f7d8176b694d317, 01967d2eed69c2da0e3ae406a7a814b6505aaad78cbd19974daeefcebdabe704a6b48a9a754a48c4c70a42912e940fc6ad43ae73077feeedaad4252c01a49f659d21 + +# N = -61 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863cc +r = 01a12e49653e39950e3ec7c5b668beadb3068d266b9258df458b8bb8c9e08d3bee059cd2f3fe72cd3d996bca95d68b38aa1e20e5a9ec67e7e1bb50c5551312804501, 01bd267c33496ae331bc69c3285bd0085ee9a009fb42e289539caffe043955a405562babe5804fe282fe6a5486e88b1e00d0eda38803995af44fda3ab0818e4fd4e6 + +# N = -60 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863cd +r = 00f7fb665c15ab176997f91b799e577a96f4fefbcc1b71bddf08c1c9340b30d6e3c362bfdb5fc96825a17e028e1fb030e1293a4fe8bffdfe522dee00e29423a5510d, 01596a9242c63323670c74b2789838e422af8b3341072d6b54fad2d09270c2cfd2a017da719902cbe6bd25945b846433060d1583dcda963778b56edc909e09d38610 + +# N = -59 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863ce +r = 01b3b9831e301a16f94f56e3911e2ecc480cccd572e149a611149002ab49e4d89a26348d481a16b21b9d4565d4292761a3904431df4513758b34358d6bad152b4c61, 00de25927a79afa80722c0752db9264cfb7e058ee868861a48815d239839dda1be17a39b01501114d8009e013e9e3982800d72985aafe1d63f02e8f9e04d04fae060 + +# N = -58 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863cf +r = 00d5c96a9db56c10da8135f309c2e400fa93be4c38daa633b269fedcb539456ab632869a1501f0ba5188352a3ce9e6582323d687ac19086c0d5b86a2f11b7c702614, 015caec2d9d395fa0278fa44d7c607032c672ad6a560d80cbcf65808c3da09b81abf2c623a9e2dd1af244c9909cb737a03594702fba6b6b69f6fd009adc01b61ec59 + +# N = -57 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863d0 +r = 0081702231ed3af7d92ffd2d46f7f39736dfc2f79e36bbd290dcfc2579805def488c597b37eade325c529041b9647ffcae42281a3a9985274d09f13714f0f9ff3cf2, 01336a4bfc608c9d958384276179169a83133b24e8c0a63790060ae5bed679796213cadae03efd4ab6b0462b5b67379cead566e6294040131dedb862c5dc0ccac090 + +# N = -56 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863d1 +r = 0195d7bf482b74ad865f7bb1c6091cc725c580ce614d9a1adf4bfb009bc7129ff7a8e92b9872b133d665120ef8275174b60c2059fb9cead716fccc0f35dd40e149fc, 01d274478f2e54f01e0f6e6a7de78f7584c2e341f0d255b3c05aeba56ac641a2af802e9de73ce1f2b9a0750a2cf82513a5c6e11f79347c85fbe1a2e1d9020c2f7da8 + +# N = -55 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863d2 +r = 0073e25aa8f20aae36d654be581f4fece853ceb2396a014746d0d0c66549c8be5693f35f0ba4358f05aa4d3ff4d5a5ed4b56274256be675ea387af12d4bf12db4c43, 0128ef63d0ac37c2f2c268cf305de772f4afa4ff82775ac1228f5577aabd3b51d2fbd994b4fb0e5d25653c82fe2ee7fcafb48ac2f34996e7ae4886f29e86ac05fae7 + +# N = -54 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863d3 +r = 004ce320a4cbf4cc7071f0e584b94430f509c7e36c337ee364c2829c9e7aacc1228e4bed6210a726df8295fb83e55b19147efe7ad710245067080664e3997ca9039a, 00c358b1ebcbacb68bb12035e5bd73c8efc58beee8f893300ada179cfcb02bff4123a09b46a3308f9401a1f84fc14c45b6cd3202dc233a239725f7270aaa48bdaf8c + +# N = -53 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863d4 +r = 0149fbbd9e87fe9881836ffc3445f48b44afdb93f417b7ca40806227108731b904d3c769d7ac0fdd27f095840a9ed4e4c4040b3142b426665b4c8350fdb8924657b9, 006ac59d4f72fed4577b3c411c60110de9ef4b655e40bfd61779a758104d857e186226784ac2b10e259839fdfae1021daa08ca8149129115f9c3cf3eb05c0cda79c5 + +# N = -52 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863d5 +r = 00f36a61cd2ada8c3a48ac526d701f060da5a52c577b5f3b4f8349dc92c9aa6e7719d27803c2188db72cc9caa88a7957e55bd0c30bbf1b4594fb7987ccba1d739974, 0173fa3b50aba6e88f2c81e9a0362228f85a95af9f6c96739e343770c62fcf23fb3ab7776d4444b1944086a14a5d033b06b692b67f33695bf27c03e970dc624121ed + +# N = -51 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863d6 +r = 000ad1012ec9db40a2f9e67efcfadef1a7f4dd1dd18b65fcdf75136176ff357839c86f8990d70d882a65e07dd344f78ebdf16ed46c8b7ffde64a825a0e56e94789e1, 00edd4e31356735e96054356913c386f1dbf98ed8d2745a90a3261b421ea4ba2924ff9bdb1e4fb48e28a2d7cffaaa0962bb0f3b8a31dd09151fbc2638cfbc30d7ef9 + +# N = -50 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863d7 +r = 01bd0905d786dd8d51fce52989594971a5067dec1c2678df1b2de34240255936c27f01128542cdf56769f9ab5b6ed5ac9d75f9a9c33b9ef426a3b35c5d881255d89e, 00f7733e0fc0ad04bba7e1167e6962b5d7a579d1087125bd3257d9a839f66f2249b9502936168d23178c5664eb38ef363047d86074a9ca911bd83814e3b0a8f4013c + +# N = -49 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863d8 +r = 000eabe5d20531ddd5d069cea2e1a3d724cc1cfac0dc5888ef54f5b5e1516fa97b142148ec6427171a2fd4392c6d58d626026506465a2824f7e056a972e63e8f02e3, 00423475fb27f20468f57245b08dcc3c40d240a7c69e31312ba03e511344555e15451ef9f786988a246a25da34e02027a3ba717a3205cae9bbbda5fa88daa6afdbca + +# N = -48 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863d9 +r = 00315640ac72e576316466573eb6b339081619a59e6452c01f397a16d04c079fb7dfd66f6e10d887f84773320ba95e90a5751643813eb0956c3cd6fecd778ec8555d, 0169092bd52309da26051f4486c01b597b0e99bc76b584c99e8f228cef594daf1340e4241f5e8f8278e1ebd3486dbfdbdf1a8c27353f3616d495ca1cb2d694fa9e19 + +# N = -47 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863da +r = 017eafce7a841f661ac41672727f138a019ffc4b919883638ee8591c0c32505cf491564e773ad1d4e26eb3052b509868f65db397ed31e4d5eace88abf8c7e241c122, 0100b125eb79a2255804b2cfd07c365b6fb03b898ac066c487cdb436c4fbfa37db3eac8a244f85c393ed0c771adf533077cc62167cd16871378f14fb41a88de6a362 + +# N = -46 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863db +r = 0088010ccc7168a799d4628d4e7dcd34d47e2b84fba9d578e26924536edab132a07c0e83e04918e9760aa4fb395b695eabe917b279574049f39c52aef6c58b60a12a, 00880ff00b1c1aa1f7a7faa3f1b02134c5f5b16898deda43c849e46af3e7776855f669416285e91b9940f42409bfa7b02d3078de9f5ebb534f6d32b11e43ca9b7b7a + +# N = -45 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863dc +r = 0129dc3cacb5c7ff95e0103d2c7bf9460a3e603d96faf1f8cb9433bc8c4dbefc50f96cee4750d672b81f87e14aa303db35b8625196f63007e4ae0d125a7461ab2827, 003dc1594a9ef0675b01c2753ceadee6c7bbdf6553daf221925fab239526bfe8a928bd0c8930bc320e6b8f65ce05137a6454d835b3ac197ffb7e2b05f84d92bcc9cb + +# N = -44 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863dd +r = 014da42f86245026650b67f0e765f4feabfb283e1e7e5f7c464467bb0f1f39f3284f63f3bffff4896959b3d92d501658e99d29bc7929e6e6f39c694ff6d477c47c2c, 01ac7e58d84d2617e6384cc2a9b7ba63298631b0a091fdd6a41e86addcff3caaeec716544660aee146bdabaf6e5ed8332efa56dee5e251a282ccf28bacdcf9ed6375 + +# N = -43 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863de +r = 00727f6aa8116c82a26c503833c551760a0cd7c7787ca21c7f51cb7e3356bd76be9beed1d3a73d4d9ec2e528f85b17ef703e90389f18419127a4bf63005228597b16, 01bcb28a042be1c2ae206decc40b7127175d9942e7e43f3072fa09cc014fb3bc32718736694fea55c18f42b589236844a4bb96bb53eb7cc4be29203d5115783d9861 + +# N = -42 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863df +r = 011f69bd050e0550a37c8c43a7a395152ef3797ab199b24bcf05ed14347d42caebc121f5106a741e39182f2105f5fd1bb3ee6a5bc8130954a48c2ad86583735ef5c9, 014cbad1ca8f977e721f6f2ff8caca5397089de92cfe87f19de240846b94c1d8e310bce6d9a2cae9d998fbdf58114a9417c6ee63ad78e56a956f08254f8c08af31fa + +# N = -41 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863e0 +r = 011253b1f5fece94418412a95291f25944cc5342dc2f91c32530640b5c98f57a4ae667260461eee414bdfd6efed0d29166157b4700674a93121c0f5d68503b5e7a17, 0095896486f65e1ae3320c2a530d3f8b08d4e6ee10bef26e9bef772630f8f709866c12fd6ac8d5702eb8a1045114538c062e098a0a44f89f7eb89813da5a4a39ea87 + +# N = -40 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863e1 +r = 00a22a9d0633fa0c4356cb4fb3c41b3ca048116256b04850b4dacb7c2ec196e4bb3d95da89f5a68680f0c7833fffdad629ede7d7a2b52bc1264ec98bbf7be5f91b35, 0136949d9eadcbc0cd2cabee001cf7c9003484522675f179057480dcad65426f11eedfd8588430ddaab426e9f7f009c513f0fb2537064c63a8b8d1c9dc747008b5f2 + +# N = -39 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863e2 +r = 00b03aa9320931ab524c814f4b30d24dadc8391c6cfeb11ace375392b58662c31350f15605fa1a72fd18bcada7d0ea4041d7b385b8208cf719dbbe49282e3d047eeb, 01118e4feab2dfca216331cbb6422abc34f55991fa76df9cb7925bf391d300a34bed2aae1a86df535d8c4e86f68c5a4b38dfaa139191cf6eba4f2cfbf5a7a448e332 + +# N = -38 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863e3 +r = 01950c4912b1eb8f7b73a2483c103db086163bb4840ade77c798938c209c11f6c6a5d0895617664ea73441a37890658cd74b2ec298146b952fa545e56bac54c31f64, 01efff9f89fb453bda27e7bcf713a15b24fb7afc9d2104178f55dbd70322d34eb708708e0e1b2ffea433d22eb0d71736247f0f9bc0f29943421767c7cef4b0cfdb36 + +# N = -37 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863e4 +r = 015b389cf3cc1a96f6ac33e1ae2eab60eacf2114f6857357ceaba4dea22bb1d1442b02072c7137704c06f9463273b5723c0139f8d626acdaabd1b7a513d929b0860c, 00a45f79da34ed86c9a73680d8c806f3cd03d36ce7412ca433767d11a121edc71be03f23d1d4db352fd41e672da0dfd4b3beb4e76a033e35826afe2bd204793f7f5d + +# N = -36 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863e5 +r = 00f04128a6af38c4a620bd9512d7f238f5c56cf40d48ed640cc554f9c2ed4e633cddcb7392339410dac2f02991dee410f2c2f6d72b65fbcc5eb7786b607261966f48, 001d8c4f2892d47d261f839ac05c55df6ec2344f6bd21c91b87f2872857a7a275fff62c51234e13cb3f6f1169da2f4532b3a5e29c47683dd51b30837a3f6464c1c64 + +# N = -35 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863e6 +r = 01853c1cc5b1034f05d1c95133d3215ac9f05fe253c05ab7cb9c95da4036427ed3a011f72530c3047b59675497fb0a5aee646c6e081ce4e66beb8c3770c01d5d5258, 001d19f23e5e7079e792202d77b649a513d2185cec34d372e71257b2a7743a169c7f5ed1ef6d6e88cb0c3410a2d925eecdfad960a716086df0fc05cf90b4be0254e0 + +# N = -34 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863e7 +r = 01daca2462c4b17adbe09875c6d9358a6dfc5f873ec272c42c0e6f543354c5b4bea19660f8fc4c9ed90b9daad6021adc18bd46eff55929eaa726c3c8bd991474210f, 0166861f076f5f288f563aae4605288fabb2db9654141fdb4d27d757b46b60d83c2cadf673d9320b8ab75fca2ad6ee1245472192b122be8132fc91904bb211af76d9 + +# N = -33 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863e8 +r = 00b4f3463b75a71e3b7ac7290436a415f49309f9c0a10d3a11b6f855edf53f15bbf78d74d28cd2bd529d6152f62c8c35976896af5170fe324f98468a10657c25e3ee, 01ce4a4242e21bcb7d4962ed95762a0fce1cce30ff4c4b4f5a9d068c4d489a061763a07fa146f49f490a62bb880151eeba53864a0b52e1160f71d9606f053dce6a48 + +# N = -32 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863e9 +r = 01234a21b83d7ca5d0ad9a1f1f0b32a703401c6dd3f677dcf2f5eb750251aee39acb7633eb4deb5d2e8fca4e7ba3ae6b62e3c123c8ad5c3b72b54f59ae8d65b4828e, 00a3f774e50c50060fbecb804213a05007f34c1f107f1cd1e914410efd9923f39914a324590f1c0af8649019339b4d2a34f4e4b51ab2b375af54aaee213c02cb9afd + +# N = -31 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863ea +r = 00330a80352c66db983dbedaba2c4b2be15330b930541e52f3b9366b2aa1d48264ea14fe0a60d604e6b59106e7daf244712409112be87060b54401b63a64833cc3c3, 00e33c107b1f62ef5ae789ba55fce6b8779bfcfa882469a0972ae7844a39e6dd975c37f632bcb9a8d99ece2af21341c255e73a9adcc41c634369733613f712aead66 + +# N = -30 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863eb +r = 019b5d85b489930ab853599e780af0fc89d30875296de5d7151f221aab9f9ae8a3aa631a93ab660b4f5635fbecd8878d857acab08bfd5b97625840b421f5c34441d2, 01f4e4bf7142352ca9e918a190f1935a8212160dc7f54cf96b07565595233171415a9286c30808d13cfa0b7cb0915c807f181c24d94a84d43120964ecbe01cf0d408 + +# N = -29 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863ec +r = 00143ed9e0fdfe5b2d042ffcfa2898f43132f6145f79c7bb3250982e54de0343b6b948a001d5c7423ffdcf799ec2caea8fb6cb161c93b0c76d12ee5d319135b252da, 0130cbfd299b525f24243efee608381a4ddf01a51850a4352965a420f8ef35698f937a579ec66947c967e07cc336c1ec8a202173c2221dbef2f9e7b943160f41e02f + +# N = -28 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863ed +r = 012fb7f62e14b216eb468d4c45dc146c4af6ae88b6bfc3819099f14a4ed361cab9c29a5c99107f15683f85948d6e49219f716f70b0384f6ccc2d866465591bbffb63, 00b06098eba5c6d83e585b4fc96065cd4ad68855de1d136f4a8e3ba65d23eb9ba7b2ea68db5186a91914a53bc85909745f5ed29e71be6a2c588963a214cab13fcd83 + +# N = -27 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863ee +r = 00db53b1526a75c44f3237c39ca9ae8727c31619f9a8c3f09ac2a6c059091ed38cea41a89a9d76d0698b1e590ab022497622b41abb2180b8016b45d80dcfb7e0863e, 000f1d0d3ebdff29fcae02b017361d18569e225ad48438f2f26eff7082db709368a1d5f623c585aba25468dce000c7b15d29a6060ca89ad137a45fc3a9a3ebffac8c + +# N = -26 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863ef +r = 0199116cc2bdd86026e68998d01203f4d42bb304de165f7d08eb577b435fe13ac9db8b8038816aee81c76bb46e94e08639f208306cf4d3f46342e35ed86f557322d4, 00e220aff349fcbea0dce61ba5a9c3052eb22e9a11c6dc7b0f05eca59123adf372dcdb945a526a9e5c1766523a0049fd3805468c5aa99d2325bdda0f2c97e856d188 + +# N = -25 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f0 +r = 010c1a51ac3a537aeffce90039881328d883d88e3b96462a4ccca5548c2b48be1b7726ab743f1553247f93f20f0758e12e9fd89fc612305fb85670553a131b5716a6, 01dc628eeaeb83fa24f960752b6e0a7feeaf9c04c9ebbbf574ccac908e55e546821f2f970ee47acad346850890ead5cc68ca495e6d218dfd9c3ee7ccbc08c5ba39bb + +# N = -24 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f1 +r = 00a92eda23e72ea4985f678724d073762039b3489c8d44316166bfc9d6bd4d968727b337ef7d525437b2ace38841c7d0520cc7a250c6145b4de77925a3a6344023a7, 0177418dddc4cd3ae56aac2d5519684daea7e6a5996a3f3bfaab4eadb85b698617c564be3d0fb02f6584367d4518cd114113013afa5642fa5dcc6b079605a435b022 + +# N = -23 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f2 +r = 00c9bb6d8e56762faa3dc7773d1cdd3c2fd941248691a6866ea2880fb7c1fe4d7ad857f4f1fc74d2f629f103f0f8d613572c0350e352f67157a9ae6b82c9d75ca405, 0163fccbaebd381fcbdc71c1453003b797d3e6a5e74dc3dd9e91f8f7bde64f08b40185e1ec26c227c1179eef625dd7ab96e3d493f51e56482f97ffc34da15f686b1e + +# N = -22 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f3 +r = 01b652f8fb7336e0f57310d3fd66518cea5bd55ef189104b62044fba65ff080c7fe6a056fffe654594650fc8259d09657057c9a71c3285db7ad2b0a5c033986431b4, 0054a7cf1c38294ef7ff7da0dab96d8df5031f350f817c9d25cbed85fa9b192900febae86e89f6689758d1d1de5ec080acef794de732952d6529a90121df607b2a5b + +# N = -21 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f4 +r = 01e97d9e642a842cf69d881345dcc61768af4c0ca91f3ace233fd4a312bf5726b15184eca4bf576c13ebad9bd64901c9d23696a1779ccb49e464f6e872ecb0469d0a, 00615be9f692c1d0df98ce8be1ffd31d7360c9f3faeb484a282c041045f2d612dbe6b520a5e2e469ce089d41b278744db19a4f0cfa1de1b1a2d9053977d8a0ac1c45 + +# N = -20 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f5 +r = 0052329ef7571ce637c6615ebb3e15586c9fd8974b47df69a15a8b84a8319ce58824e588eea45cded9e6ae56bc9721dba70b6c71301dfd88d81a27e2f75fc6e22566, 00d24a4b7beb4b53207a83b08c056a5f7a35ddd5c9d57b5696776fd92e21111c958a8c090289f7e792b883e419a6e888b181b59166bc0097b37835ce9549067025cd + +# N = -19 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f6 +r = 001a43e07ca4616ad0d03922dbbf03aaefaa3f7ff8566d9bc873f8fd1d984b1b1334b3c9192abebd22cb86ff67a18f392ddef23c7f85920c6b50cda6637339219067, 0109519e35edb456526dd14c16ba88ea42185a99d7888e4d5d446c462934e0068a39832789e33374e71e44052d93b0ab0200ddab7b72cb52017d45320a897e7657f7 + +# N = -18 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f7 +r = 01bcf565976e62db1e8940fbf436de3dfccd3d5e867f1b3ef23336b76ddc292dfff2911783816184b6f60442672b97ad0ae211fefa2680eecce30eef0cd0979ca849, 0056510e0c5966130ce17ed827c18f973486d569b8daffa9bd9fddee5a8a6ff042b7663751725a5d6fb2312c300f527303d8176513df0e93832bcabcbe45999de927 + +# N = -17 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f8 +r = 016d09d05c3a322c91c8354cf74f134fd159da6b3292793492842c3b0534f33a7f0143efa73ccdab409c07fc6182157868d2083b7c0bd4298885706c0376dc1fc4c3, 0144921f77158da891177ca433565984b377ab394ba9ea6eaf66e10312d4d884917a079684c54074a905ef8cb7d5359ea4550565231a41c78cdcdc5ea5f038a093a6 + +# N = -16 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f9 +r = 01682eed4bed13563a1d859543fb30c97e9f9eeb197c69058c45294a1ff8c430e5005072cb2ed3cc2b186f86dfae4003ee6e299d362847c0d42017f45f44362a2722, 007ff01c75a7396160cb46f6650d9e23ff95789c1ae79b5a4a3e9f1f3e8f6339255c2afa67c529b1333bd6b0e7fd96b973ce66568ec683b21c62a0e17232f0e9f4a2 + +# N = -15 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863fa +r = 0032f820aac7e2a36a1807dc7de6185a0504296b4bda996f894708dc8e6713ede807ff3c3ade8e47e0198ecdc6cb4c0f1fc95ef4d7f19bde5c6daa9adab626af2e49, 01714ac18cd96e6609204e107db4ab2296f9a2da4ef7cb345bd09540b7ce9bb35c7abfef5b8eee69b49b36dc813799ddcaa11354e5e5bfaf5c55cd12e5c9763aa3b1 + +# N = -14 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863fb +r = 01b2d4f0dc667d57c26f68cac5a00a4a08b517ea7d85d5f0598cccba7e03645c4b9116bcef9f25bde3a25533b3fb5c0977dfae964f3416e9a196ba61d6f1f71546c6, 00521694ceb7a22a25a1023dc7f6ea38d73ecafbdc18b23c94094e97c43f27258653d9f70bb207176611f9524b78562bc1bda0df4cb03d6c7f955ae8d6db72a2894d + +# N = -13 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863fc +r = 0156ce6bc32e95a492430d49fb9b66f0da611c2776e95f57adc33099622c84701e4cb51aa852f3cd5c4774a5f61d80559c77fc0c43c246997de6d39f8fa63e6130e5, 00092b72f36c92ae0952fb98957ae3c955ef1cb1c2cc28d1f0ef6a9f215153e3a1c4e06c90116571a0221e4f330aa837740b046b72ff027eeac71b3dc469c524a1f8 + +# N = -12 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863fd +r = 010e2ef27d74ba4e3fef0f40c3a0abcac22bdb083e7bd2cb3b89d3227485be1fdc0d98a3bff74d30749c009bba63ae29849458bdf34ab8dfc216c67036773b24fe08, 001f80e18f177e2cbe9adc4e00cd2a475b592dd0dfdaa04af41fb414973bde13c8192499f7ac83572324e7bbda2c6eed8528c9c30c272e6bf27407afedd29ae56db6 + +# N = -11 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863fe +r = 00ffaa378d1cab9da18ae7f6aee3f6be0bc24aa1f7962a794c8b2979ede2999331ed0de8cd8d75f18c884280ae0127d264d48176607016ed066dcd229d6104967f7b, 016b3db179abc47d5826eb629154cef7a17db60968b5158fa323ea721bab78ba5eadaa63b6e67375ab566491a9bf8e05bf325153bc583698db9bfbda4133f00d1177 + +# N = -10 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863ff +r = 01940efe7f3ddb390f6266c80ec3cd604d63e1a54923588d6d44885163e0bc7e613194ced526d4c21049f9be17208f8d4740cd43ff84d027979990643ae3c8af6987, 01a2b1228aa6279aea2c4f9e88a6f5ded726fa2b40143ace884e96a0565b15d933cda256484f4e11d40a08064bb4e346302af46b55a1b3f6509c5305289a51edba7a + +# N = -9 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386400 +r = 010c13517adf8ab8ab6a44769a2a0dcc43a34c962558a2dc635b32ba14f09cb09a6d1af9e2ab6fb92d18c7a7a85d5ec2e694330fa2b13cb3e5f103d614e278d67878, 0106307a555542ec28b638e7bbacd588f18a249bed22ece1125dc8f94b0d454fd429bdf80548985aa013c14649ea8b6bbbf865e2af8abca3296ad8f574679cd95d44 + +# N = -8 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386401 +r = 01b931541a41cb5808712dea714ec54d801f0545c51d82fc1314c7adff52dc2bcfa4f845acc60de46bcf0d5ab144dad37a0202c37cf52a553c67340208b103ed8c07, 01dbefdb812a48c3bd6232dd83890b0e9fc75257be10cf7cc42b873b0b1faad37725a007a2f907cd1d43cb30622b5ffb5c76563a94de8770743ff1a7339bb8aaaf40 + +# N = -7 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386402 +r = 01b1a3775b2fed05839d062f9170747aa41914780c69617b88a62ec61846855fe34c6c64d36f986e71dde237ca9fa87ee130cd00e756c4140b766a15b574766756df, 00af779713e742e314bdc3a51d3e97ebed87914712133aec9a10d54a1786b61909b0ea356e2e5d3718f2d030c4c76ad11081c251ca3a1b7d6d6d7270b4b920991557 + +# N = -6 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386403 +r = 010ca9977f9a7ca24068cab11e984bbfeb8e79cc0a8356f25580a92fde650b0a9fb9ca70393d11ca98df4617b374ab2bf9c05711b98df6fbc9035cfb915a75b36d64, 0053ca8e916c7d5c8e27776aaa224612d2bfb8c6dfab6ceff2bab49aa46978d4cdb9b10349b3d90ec586efe11c23a551af9290f0a99943d395d874087f6a94bcce6c + +# N = -5 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386404 +r = 0019639ede19c8e027585fbd2cb77eda9f86926781ed5c78bbd6721c1e0636af180a11b8897f5789bf3cd194ebf0f36c498b9c6ad5a84b7647983c194afcf14a49e9, 011489baea46775abf76b7719380b8bc68ffd70913f41b2fe5c7bc224bb41b7c698645e7755fef718500431707fc6d46558403f4619e0b90a7b79a2906443908a67f + +# N = -4 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386405 +r = 010261aa5a41a43e483866e30e448e2ff9cd7e0362eaaaa0e9e756432cf1257f1e83a8745c474f83c5783350ea812d8472d2f17de43a09438c81798d6d77d92b8ab0, 0116a4c60ff438a7a5aa24d56f28848c8e68f2528ce00e87337c06c306be0d5a2e3d5fd6ed8457ab523d08a2402887dcb317130ef05c01e5c8d9795f7da41ef67b61 + +# N = -3 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 +r = 008caeec8eb5325acaca3cda95372d891ecd5cf2d6bd0896bd46e8d69f8b251d2419028ed35e8b5acff10dd75a484316197502d2c8ce976f1bd6bee9cf4d4910f78a, 00911334303c9c9aa3f5868755402beab17e741683aa702e551889e8e91598391d4527e9529897109e1c79877d1b21b62d37ded053b9af08bc9f8d30593f11a08167 + +# N = -2 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407 +r = 013f3417e59440a461413a3a0193cd8e66031a96372a82ebb4df4bd9d9026d377aaa83d508251d1ae2d7a0e797d1b26b07ecb3fa1f1c99dd36bc1e90cf08640909df, 00cc7fac060988889607a51ca577c1d92b445faa6f2eb37c9de922260e4410b06d704a3636402b32e6db858a81a0b5091f8584720e5494cf05f27ec2d11cce01e493 + +# N = -1 +g_scalar = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408 +r = 0074e6cf1f65b311cada214e32409c829fda90fc1457b035a69edd50a5af3bf7f3ac947f0ee093d17fd46f19a459e0c2b5214dfcbf3f18e172deb331a16381adc101, 001ffdd1bad025e9c1721333855ddb54325dcbf42821746c60cce9b408c6b35085ecdf9d57a37f60297c4f6561c7bcaec69edfbba0b5c4b0174cd7b9f1b5a561d971 + +# N = 0 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +r = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +# N = 1 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +r = 0074e6cf1f65b311cada214e32409c829fda90fc1457b035a69edd50a5af3bf7f3ac947f0ee093d17fd46f19a459e0c2b5214dfcbf3f18e172deb331a16381adc101, 01e0022e452fda163e8deccc7aa224abcda2340bd7de8b939f33164bf7394caf7a132062a85c809fd683b09a9e384351396120445f4a3b4fe8b328460e4a5a9e268e + +# N = 2 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 +r = 013f3417e59440a461413a3a0193cd8e66031a96372a82ebb4df4bd9d9026d377aaa83d508251d1ae2d7a0e797d1b26b07ecb3fa1f1c99dd36bc1e90cf08640909df, 01338053f9f6777769f85ae35a883e26d4bba05590d14c836216ddd9f1bbef4f928fb5c9c9bfd4cd19247a757e5f4af6e07a7b8df1ab6b30fa0d813d2ee331fe1b6c + +# N = 3 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003 +r = 008caeec8eb5325acaca3cda95372d891ecd5cf2d6bd0896bd46e8d69f8b251d2419028ed35e8b5acff10dd75a484316197502d2c8ce976f1bd6bee9cf4d4910f78a, 016eeccbcfc363655c0a7978aabfd4154e818be97c558fd1aae7761716ea67c6e2bad816ad6768ef61e3867882e4de49d2c8212fac4650f7436072cfa6c0ee5f7e98 + +# N = 4 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 +r = 010261aa5a41a43e483866e30e448e2ff9cd7e0362eaaaa0e9e756432cf1257f1e83a8745c474f83c5783350ea812d8472d2f17de43a09438c81798d6d77d92b8ab0, 00e95b39f00bc7585a55db2a90d77b7371970dad731ff178cc83f93cf941f2a5d1c2a029127ba854adc2f75dbfd778234ce8ecf10fa3fe1a372686a0825be109849e + +# N = 5 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005 +r = 0019639ede19c8e027585fbd2cb77eda9f86926781ed5c78bbd6721c1e0636af180a11b8897f5789bf3cd194ebf0f36c498b9c6ad5a84b7647983c194afcf14a49e9, 00eb764515b988a54089488e6c7f4743970028f6ec0be4d01a3843ddb44be4839679ba188aa0108e7affbce8f80392b9aa7bfc0b9e61f46f584865d6f9bbc6f75980 + +# N = 6 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006 +r = 010ca9977f9a7ca24068cab11e984bbfeb8e79cc0a8356f25580a92fde650b0a9fb9ca70393d11ca98df4617b374ab2bf9c05711b98df6fbc9035cfb915a75b36d64, 01ac35716e9382a371d8889555ddb9ed2d404739205493100d454b655b96872b32464efcb64c26f13a79101ee3dc5aae506d6f0f5666bc2c6a278bf780956b433193 + +# N = 7 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007 +r = 01b1a3775b2fed05839d062f9170747aa41914780c69617b88a62ec61846855fe34c6c64d36f986e71dde237ca9fa87ee130cd00e756c4140b766a15b574766756df, 01508868ec18bd1ceb423c5ae2c1681412786eb8edecc51365ef2ab5e87949e6f64f15ca91d1a2c8e70d2fcf3b38952eef7e3dae35c5e48292928d8f4b46df66eaa8 + +# N = 8 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008 +r = 01b931541a41cb5808712dea714ec54d801f0545c51d82fc1314c7adff52dc2bcfa4f845acc60de46bcf0d5ab144dad37a0202c37cf52a553c67340208b103ed8c07, 002410247ed5b73c429dcd227c76f4f16038ada841ef30833bd478c4f4e0552c88da5ff85d06f832e2bc34cf9dd4a004a389a9c56b21788f8bc00e58cc64475550bf + +# N = 9 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009 +r = 010c13517adf8ab8ab6a44769a2a0dcc43a34c962558a2dc635b32ba14f09cb09a6d1af9e2ab6fb92d18c7a7a85d5ec2e694330fa2b13cb3e5f103d614e278d67878, 00f9cf85aaaabd13d749c71844532a770e75db6412dd131eeda23706b4f2bab02bd64207fab767a55fec3eb9b615749444079a1d5075435cd695270a8b986326a2bb + +# N = 10 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a +r = 01940efe7f3ddb390f6266c80ec3cd604d63e1a54923588d6d44885163e0bc7e613194ced526d4c21049f9be17208f8d4740cd43ff84d027979990643ae3c8af6987, 005d4edd7559d86515d3b06177590a2128d905d4bfebc53177b1695fa9a4ea26cc325da9b7b0b1ee2bf5f7f9b44b1cb9cfd50b94aa5e4c09af63acfad765ae124585 + +# N = 11 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b +r = 00ffaa378d1cab9da18ae7f6aee3f6be0bc24aa1f7962a794c8b2979ede2999331ed0de8cd8d75f18c884280ae0127d264d48176607016ed066dcd229d6104967f7b, 0094c24e86543b82a7d9149d6eab31085e8249f6974aea705cdc158de4548745a152559c49198c8a54a99b6e564071fa40cdaeac43a7c96724640425becc0ff2ee88 + +# N = 12 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c +r = 010e2ef27d74ba4e3fef0f40c3a0abcac22bdb083e7bd2cb3b89d3227485be1fdc0d98a3bff74d30749c009bba63ae29849458bdf34ab8dfc216c67036773b24fe08, 01e07f1e70e881d3416523b1ff32d5b8a4a6d22f20255fb50be04beb68c421ec37e6db6608537ca8dcdb184425d391127ad7363cf3d8d1940d8bf850122d651a9249 + +# N = 13 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d +r = 0156ce6bc32e95a492430d49fb9b66f0da611c2776e95f57adc33099622c84701e4cb51aa852f3cd5c4774a5f61d80559c77fc0c43c246997de6d39f8fa63e6130e5, 01f6d48d0c936d51f6ad04676a851c36aa10e34e3d33d72e0f109560deaeac1c5e3b1f936fee9a8e5fdde1b0ccf557c88bf4fb948d00fd811538e4c23b963adb5e07 + +# N = 14 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e +r = 01b2d4f0dc667d57c26f68cac5a00a4a08b517ea7d85d5f0598cccba7e03645c4b9116bcef9f25bde3a25533b3fb5c0977dfae964f3416e9a196ba61d6f1f71546c6, 01ade96b31485dd5da5efdc2380915c728c1350423e74dc36bf6b1683bc0d8da79ac2608f44df8e899ee06adb487a9d43e425f20b34fc293806aa51729248d5d76b2 + +# N = 15 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f +r = 0032f820aac7e2a36a1807dc7de6185a0504296b4bda996f894708dc8e6713ede807ff3c3ade8e47e0198ecdc6cb4c0f1fc95ef4d7f19bde5c6daa9adab626af2e49, 008eb53e73269199f6dfb1ef824b54dd69065d25b10834cba42f6abf4831644ca3854010a47111964b64c9237ec86622355eecab1a1a4050a3aa32ed1a3689c55c4e + +# N = 16 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010 +r = 01682eed4bed13563a1d859543fb30c97e9f9eeb197c69058c45294a1ff8c430e5005072cb2ed3cc2b186f86dfae4003ee6e299d362847c0d42017f45f44362a2722, 01800fe38a58c69e9f34b9099af261dc006a8763e51864a5b5c160e0c1709cc6daa3d505983ad64eccc4294f180269468c3199a971397c4de39d5f1e8dcd0f160b5d + +# N = 17 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011 +r = 016d09d05c3a322c91c8354cf74f134fd159da6b3292793492842c3b0534f33a7f0143efa73ccdab409c07fc6182157868d2083b7c0bd4298885706c0376dc1fc4c3, 00bb6de088ea72576ee8835bcca9a67b4c8854c6b456159150991efced2b277b6e85f8697b3abf8b56fa1073482aca615baafa9adce5be38732323a15a0fc75f6c59 + +# N = 18 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012 +r = 01bcf565976e62db1e8940fbf436de3dfccd3d5e867f1b3ef23336b76ddc292dfff2911783816184b6f60442672b97ad0ae211fefa2680eecce30eef0cd0979ca849, 01a9aef1f3a699ecf31e8127d83e7068cb792a964725005642602211a575900fbd4899c8ae8da5a2904dced3cff0ad8cfc27e89aec20f16c7cd4354341ba666216d8 + +# N = 19 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013 +r = 001a43e07ca4616ad0d03922dbbf03aaefaa3f7ff8566d9bc873f8fd1d984b1b1334b3c9192abebd22cb86ff67a18f392ddef23c7f85920c6b50cda6637339219067, 00f6ae61ca124ba9ad922eb3e9457715bde7a566287771b2a2bb93b9d6cb1ff975c67cd8761ccc8b18e1bbfad26c4f54fdff2254848d34adfe82bacdf5768189a808 + +# N = 20 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014 +r = 0052329ef7571ce637c6615ebb3e15586c9fd8974b47df69a15a8b84a8319ce58824e588eea45cded9e6ae56bc9721dba70b6c71301dfd88d81a27e2f75fc6e22566, 012db5b48414b4acdf857c4f73fa95a085ca222a362a84a969889026d1deeee36a7573f6fd7608186d477c1be65917774e7e4a6e9943ff684c87ca316ab6f98fda32 + +# N = 21 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015 +r = 01e97d9e642a842cf69d881345dcc61768af4c0ca91f3ace233fd4a312bf5726b15184eca4bf576c13ebad9bd64901c9d23696a1779ccb49e464f6e872ecb0469d0a, 019ea416096d3e2f206731741e002ce28c9f360c0514b7b5d7d3fbefba0d29ed24194adf5a1d1b9631f762be4d878bb24e65b0f305e21e4e5d26fac688275f53e3ba + +# N = 22 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016 +r = 01b652f8fb7336e0f57310d3fd66518cea5bd55ef189104b62044fba65ff080c7fe6a056fffe654594650fc8259d09657057c9a71c3285db7ad2b0a5c033986431b4, 01ab5830e3c7d6b10800825f254692720afce0caf07e8362da34127a0564e6d6ff0145179176099768a72e2e21a13f7f531086b218cd6ad29ad656fede209f84d5a4 + +# N = 23 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017 +r = 00c9bb6d8e56762faa3dc7773d1cdd3c2fd941248691a6866ea2880fb7c1fe4d7ad857f4f1fc74d2f629f103f0f8d613572c0350e352f67157a9ae6b82c9d75ca405, 009c03345142c7e034238e3ebacffc48682c195a18b23c22616e07084219b0f74bfe7a1e13d93dd83ee861109da22854691c2b6c0ae1a9b7d068003cb25ea09794e1 + +# N = 24 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018 +r = 00a92eda23e72ea4985f678724d073762039b3489c8d44316166bfc9d6bd4d968727b337ef7d525437b2ace38841c7d0520cc7a250c6145b4de77925a3a6344023a7, 0088be72223b32c51a9553d2aae697b25158195a6695c0c40554b15247a49679e83a9b41c2f04fd09a7bc982bae732eebeecfec505a9bd05a23394f869fa5bca4fdd + +# N = 25 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019 +r = 010c1a51ac3a537aeffce90039881328d883d88e3b96462a4ccca5548c2b48be1b7726ab743f1553247f93f20f0758e12e9fd89fc612305fb85670553a131b5716a6, 00239d7115147c05db069f8ad491f580115063fb3614440a8b33536f71aa1ab97de0d068f11b85352cb97af76f152a339735b6a192de720263c1183343f73a45c644 + +# N = 26 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a +r = 0199116cc2bdd86026e68998d01203f4d42bb304de165f7d08eb577b435fe13ac9db8b8038816aee81c76bb46e94e08639f208306cf4d3f46342e35ed86f557322d4, 011ddf500cb603415f2319e45a563cfad14dd165ee392384f0fa135a6edc520c8d23246ba5ad9561a3e899adc5ffb602c7fab973a55662dcda4225f0d36817a92e77 + +# N = 27 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b +r = 00db53b1526a75c44f3237c39ca9ae8727c31619f9a8c3f09ac2a6c059091ed38cea41a89a9d76d0698b1e590ab022497622b41abb2180b8016b45d80dcfb7e0863e, 01f0e2f2c14200d60351fd4fe8c9e2e7a961dda52b7bc70d0d91008f7d248f6c975e2a09dc3a7a545dab97231fff384ea2d659f9f357652ec85ba03c565c14005373 + +# N = 28 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c +r = 012fb7f62e14b216eb468d4c45dc146c4af6ae88b6bfc3819099f14a4ed361cab9c29a5c99107f15683f85948d6e49219f716f70b0384f6ccc2d866465591bbffb63, 014f9f67145a3927c1a7a4b0369f9a32b52977aa21e2ec90b571c459a2dc1464584d159724ae7956e6eb5ac437a6f68ba0a12d618e4195d3a7769c5deb354ec0327c + +# N = 29 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d +r = 00143ed9e0fdfe5b2d042ffcfa2898f43132f6145f79c7bb3250982e54de0343b6b948a001d5c7423ffdcf799ec2caea8fb6cb161c93b0c76d12ee5d319135b252da, 00cf3402d664ada0dbdbc10119f7c7e5b220fe5ae7af5bcad69a5bdf0710ca96706c85a8613996b836981f833cc93e1375dfde8c3ddde2410d061846bce9f0be1fd0 + +# N = 30 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e +r = 019b5d85b489930ab853599e780af0fc89d30875296de5d7151f221aab9f9ae8a3aa631a93ab660b4f5635fbecd8878d857acab08bfd5b97625840b421f5c34441d2, 000b1b408ebdcad35616e75e6f0e6ca57dede9f2380ab30694f8a9aa6adcce8ebea56d793cf7f72ec305f4834f6ea37f80e7e3db26b57b2bcedf69b1341fe30f2bf7 + +# N = 31 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f +r = 00330a80352c66db983dbedaba2c4b2be15330b930541e52f3b9366b2aa1d48264ea14fe0a60d604e6b59106e7daf244712409112be87060b54401b63a64833cc3c3, 011cc3ef84e09d10a5187645aa0319478864030577db965f68d5187bb5c6192268a3c809cd434657266131d50decbe3daa18c565233be39cbc968cc9ec08ed515299 + +# N = 32 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020 +r = 01234a21b83d7ca5d0ad9a1f1f0b32a703401c6dd3f677dcf2f5eb750251aee39acb7633eb4deb5d2e8fca4e7ba3ae6b62e3c123c8ad5c3b72b54f59ae8d65b4828e, 015c088b1af3aff9f041347fbdec5faff80cb3e0ef80e32e16ebbef10266dc0c66eb5cdba6f0e3f5079b6fe6cc64b2d5cb0b1b4ae54d4c8a50ab5511dec3fd346502 + +# N = 33 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021 +r = 00b4f3463b75a71e3b7ac7290436a415f49309f9c0a10d3a11b6f855edf53f15bbf78d74d28cd2bd529d6152f62c8c35976896af5170fe324f98468a10657c25e3ee, 0031b5bdbd1de43482b69d126a89d5f031e331cf00b3b4b0a562f973b2b765f9e89c5f805eb90b60b6f59d4477feae1145ac79b5f4ad1ee9f08e269f90fac23195b7 + +# N = 34 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022 +r = 01daca2462c4b17adbe09875c6d9358a6dfc5f873ec272c42c0e6f543354c5b4bea19660f8fc4c9ed90b9daad6021adc18bd46eff55929eaa726c3c8bd991474210f, 009979e0f890a0d770a9c551b9fad770544d2469abebe024b2d828a84b949f27c3d352098c26cdf47548a035d52911edbab8de6d4edd417ecd036e6fb44dee508926 + +# N = 35 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023 +r = 01853c1cc5b1034f05d1c95133d3215ac9f05fe253c05ab7cb9c95da4036427ed3a011f72530c3047b59675497fb0a5aee646c6e081ce4e66beb8c3770c01d5d5258, 01e2e60dc1a18f86186ddfd28849b65aec2de7a313cb2c8d18eda84d588bc5e96380a12e1092917734f3cbef5d26da113205269f58e9f7920f03fa306f4b41fdab1f + +# N = 36 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024 +r = 00f04128a6af38c4a620bd9512d7f238f5c56cf40d48ed640cc554f9c2ed4e633cddcb7392339410dac2f02991dee410f2c2f6d72b65fbcc5eb7786b607261966f48, 01e273b0d76d2b82d9e07c653fa3aa20913dcbb0942de36e4780d78d7a8585d8a0009d3aedcb1ec34c090ee9625d0bacd4c5a1d63b897c22ae4cf7c85c09b9b3e39b + +# N = 37 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025 +r = 015b389cf3cc1a96f6ac33e1ae2eab60eacf2114f6857357ceaba4dea22bb1d1442b02072c7137704c06f9463273b5723c0139f8d626acdaabd1b7a513d929b0860c, 015ba08625cb12793658c97f2737f90c32fc2c9318bed35bcc8982ee5ede1238e41fc0dc2e2b24cad02be198d25f202b4c414b1895fcc1ca7d9501d42dfb86c080a2 + +# N = 38 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026 +r = 01950c4912b1eb8f7b73a2483c103db086163bb4840ade77c798938c209c11f6c6a5d0895617664ea73441a37890658cd74b2ec298146b952fa545e56bac54c31f64, 001000607604bac425d8184308ec5ea4db04850362defbe870aa2428fcdd2cb148f78f71f1e4d0015bcc2dd14f28e8c9db80f0643f0d66bcbde89838310b4f3024c9 + +# N = 39 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027 +r = 00b03aa9320931ab524c814f4b30d24dadc8391c6cfeb11ace375392b58662c31350f15605fa1a72fd18bcada7d0ea4041d7b385b8208cf719dbbe49282e3d047eeb, 00ee71b0154d2035de9cce3449bdd543cb0aa66e05892063486da40c6e2cff5cb412d551e57920aca273b1790973a5b4c72055ec6e6e309145b0d3040a585bb71ccd + +# N = 40 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028 +r = 00a22a9d0633fa0c4356cb4fb3c41b3ca048116256b04850b4dacb7c2ec196e4bb3d95da89f5a68680f0c7833fffdad629ede7d7a2b52bc1264ec98bbf7be5f91b35, 00c96b626152343f32d35411ffe30836ffcb7badd98a0e86fa8b7f23529abd90ee112027a77bcf22554bd916080ff63aec0f04dac8f9b39c57472e36238b8ff74a0d + +# N = 41 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029 +r = 011253b1f5fece94418412a95291f25944cc5342dc2f91c32530640b5c98f57a4ae667260461eee414bdfd6efed0d29166157b4700674a93121c0f5d68503b5e7a17, 016a769b7909a1e51ccdf3d5acf2c074f72b1911ef410d91641088d9cf0708f67993ed0295372a8fd1475efbaeebac73f9d1f675f5bb0760814767ec25a5b5c61578 + +# N = 42 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a +r = 011f69bd050e0550a37c8c43a7a395152ef3797ab199b24bcf05ed14347d42caebc121f5106a741e39182f2105f5fd1bb3ee6a5bc8130954a48c2ad86583735ef5c9, 00b3452e357068818de090d0073535ac68f76216d301780e621dbf7b946b3e271cef4319265d351626670420a7eeb56be839119c52871a956a90f7dab073f750ce05 + +# N = 43 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b +r = 00727f6aa8116c82a26c503833c551760a0cd7c7787ca21c7f51cb7e3356bd76be9beed1d3a73d4d9ec2e528f85b17ef703e90389f18419127a4bf63005228597b16, 00434d75fbd41e3d51df92133bf48ed8e8a266bd181bc0cf8d05f633feb04c43cd8e78c996b015aa3e70bd4a76dc97bb5b446944ac14833b41d6dfc2aeea87c2679e + +# N = 44 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c +r = 014da42f86245026650b67f0e765f4feabfb283e1e7e5f7c464467bb0f1f39f3284f63f3bffff4896959b3d92d501658e99d29bc7929e6e6f39c694ff6d477c47c2c, 005381a727b2d9e819c7b33d5648459cd679ce4f5f6e02295be179522300c3551138e9abb99f511eb942545091a127ccd105a9211a1dae5d7d330d74532306129c8a + +# N = 45 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d +r = 0129dc3cacb5c7ff95e0103d2c7bf9460a3e603d96faf1f8cb9433bc8c4dbefc50f96cee4750d672b81f87e14aa303db35b8625196f63007e4ae0d125a7461ab2827, 01c23ea6b5610f98a4fe3d8ac31521193844209aac250dde6da054dc6ad9401756d742f376cf43cdf194709a31faec859bab27ca4c53e6800481d4fa07b26d433634 + +# N = 46 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e +r = 0088010ccc7168a799d4628d4e7dcd34d47e2b84fba9d578e26924536edab132a07c0e83e04918e9760aa4fb395b695eabe917b279574049f39c52aef6c58b60a12a, 0177f00ff4e3e55e0858055c0e4fdecb3a0a4e97672125bc37b61b950c188897aa0996be9d7a16e466bf0bdbf640584fd2cf872160a144acb092cd4ee1bc35648485 + +# N = 47 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f +r = 017eafce7a841f661ac41672727f138a019ffc4b919883638ee8591c0c32505cf491564e773ad1d4e26eb3052b509868f65db397ed31e4d5eace88abf8c7e241c122, 00ff4eda14865ddaa7fb4d302f83c9a4904fc476753f993b78324bc93b0405c824c15375dbb07a3c6c12f388e520accf88339de9832e978ec870eb04be5772195c9d + +# N = 48 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030 +r = 00315640ac72e576316466573eb6b339081619a59e6452c01f397a16d04c079fb7dfd66f6e10d887f84773320ba95e90a5751643813eb0956c3cd6fecd778ec8555d, 0096f6d42adcf625d9fae0bb793fe4a684f16643894a7b366170dd7310a6b250ecbf1bdbe0a1707d871e142cb792402420e573d8cac0c9e92b6a35e34d296b0561e6 + +# N = 49 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031 +r = 000eabe5d20531ddd5d069cea2e1a3d724cc1cfac0dc5888ef54f5b5e1516fa97b142148ec6427171a2fd4392c6d58d626026506465a2824f7e056a972e63e8f02e3, 01bdcb8a04d80dfb970a8dba4f7233c3bf2dbf583961ceced45fc1aeecbbaaa1eabae10608796775db95da25cb1fdfd85c458e85cdfa351644425a05772559502435 + +# N = 50 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032 +r = 01bd0905d786dd8d51fce52989594971a5067dec1c2678df1b2de34240255936c27f01128542cdf56769f9ab5b6ed5ac9d75f9a9c33b9ef426a3b35c5d881255d89e, 01088cc1f03f52fb44581ee981969d4a285a862ef78eda42cda82657c60990ddb646afd6c9e972dce873a99b14c710c9cfb8279f8b56356ee427c7eb1c4f570bfec3 + +# N = 51 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033 +r = 000ad1012ec9db40a2f9e67efcfadef1a7f4dd1dd18b65fcdf75136176ff357839c86f8990d70d882a65e07dd344f78ebdf16ed46c8b7ffde64a825a0e56e94789e1, 01122b1ceca98ca169fabca96ec3c790e240671272d8ba56f5cd9e4bde15b45d6db006424e1b04b71d75d28300555f69d44f0c475ce22f6eae043d9c73043cf28106 + +# N = 52 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034 +r = 00f36a61cd2ada8c3a48ac526d701f060da5a52c577b5f3b4f8349dc92c9aa6e7719d27803c2188db72cc9caa88a7957e55bd0c30bbf1b4594fb7987ccba1d739974, 008c05c4af54591770d37e165fc9ddd707a56a506093698c61cbc88f39d030dc04c5488892bbbb4e6bbf795eb5a2fcc4f9496d4980cc96a40d83fc168f239dbede12 + +# N = 53 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035 +r = 0149fbbd9e87fe9881836ffc3445f48b44afdb93f417b7ca40806227108731b904d3c769d7ac0fdd27f095840a9ed4e4c4040b3142b426665b4c8350fdb8924657b9, 01953a62b08d012ba884c3bee39feef21610b49aa1bf4029e88658a7efb27a81e79dd987b53d4ef1da67c602051efde255f7357eb6ed6eea063c30c14fa3f325863a + +# N = 54 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036 +r = 004ce320a4cbf4cc7071f0e584b94430f509c7e36c337ee364c2829c9e7aacc1228e4bed6210a726df8295fb83e55b19147efe7ad710245067080664e3997ca9039a, 013ca74e14345349744edfca1a428c37103a741117076ccff525e863034fd400bedc5f64b95ccf706bfe5e07b03eb3ba4932cdfd23dcc5dc68da08d8f555b7425073 + +# N = 55 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037 +r = 0073e25aa8f20aae36d654be581f4fece853ceb2396a014746d0d0c66549c8be5693f35f0ba4358f05aa4d3ff4d5a5ed4b56274256be675ea387af12d4bf12db4c43, 00d7109c2f53c83d0d3d9730cfa2188d0b505b007d88a53edd70aa885542c4ae2d04266b4b04f1a2da9ac37d01d11803504b753d0cb6691851b7790d617953fa0518 + +# N = 56 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038 +r = 0195d7bf482b74ad865f7bb1c6091cc725c580ce614d9a1adf4bfb009bc7129ff7a8e92b9872b133d665120ef8275174b60c2059fb9cead716fccc0f35dd40e149fc, 002d8bb870d1ab0fe1f091958218708a7b3d1cbe0f2daa4c3fa5145a9539be5d507fd16218c31e0d465f8af5d307daec5a391ee086cb837a041e5d1e26fdf3d08257 + +# N = 57 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039 +r = 0081702231ed3af7d92ffd2d46f7f39736dfc2f79e36bbd290dcfc2579805def488c597b37eade325c529041b9647ffcae42281a3a9985274d09f13714f0f9ff3cf2, 00cc95b4039f73626a7c7bd89e86e9657cecc4db173f59c86ff9f51a412986869dec35251fc102b5494fb9d4a498c863152a9919d6bfbfece212479d3a23f3353f6f + +# N = 58 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a +r = 00d5c96a9db56c10da8135f309c2e400fa93be4c38daa633b269fedcb539456ab632869a1501f0ba5188352a3ce9e6582323d687ac19086c0d5b86a2f11b7c702614, 00a3513d262c6a05fd8705bb2839f8fcd398d5295a9f27f34309a7f73c25f647e540d39dc561d22e50dbb366f6348c85fca6b8fd0459494960902ff6523fe49e13a6 + +# N = 59 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b +r = 01b3b9831e301a16f94f56e3911e2ecc480cccd572e149a611149002ab49e4d89a26348d481a16b21b9d4565d4292761a3904431df4513758b34358d6bad152b4c61, 0121da6d85865057f8dd3f8ad246d9b30481fa71179779e5b77ea2dc67c6225e41e85c64feafeeeb27ff61fec161c67d7ff28d67a5501e29c0fd17061fb2fb051f9f + +# N = 60 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c +r = 00f7fb665c15ab176997f91b799e577a96f4fefbcc1b71bddf08c1c9340b30d6e3c362bfdb5fc96825a17e028e1fb030e1293a4fe8bffdfe522dee00e29423a5510d, 00a6956dbd39ccdc98f38b4d8767c71bdd5074ccbef8d294ab052d2f6d8f3d302d5fe8258e66fd341942da6ba47b9bccf9f2ea7c232569c8874a91236f61f62c79ef + +# N = 61 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d +r = 01a12e49653e39950e3ec7c5b668beadb3068d266b9258df458b8bb8c9e08d3bee059cd2f3fe72cd3d996bca95d68b38aa1e20e5a9ec67e7e1bb50c5551312804501, 0042d983ccb6951cce43963cd7a42ff7a1165ff604bd1d76ac635001fbc6aa5bfaa9d4541a7fb01d7d0195ab791774e1ff2f125c77fc66a50bb025c54f7e71b02b19 + +# N = 62 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e +r = 004570107b76a4f93b9a711bc585bde0bbd757ca1d72cac0eeac42d1c5f9237f628b7e909f9ff195fea70cf85464b8f7950b4b4b13ff1888a6e42f7d8176b694d317, 006982d112963d25f1c51bf95857eb49afa555287342e668b2511031425418fb594b75658ab5b73b38f5bd6ed16bf03952bc518cf8801112552bdad3fe5b609a62de + +# N = 63 +g_scalar = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f +r = 0022bff417bccd658537470e510dad7fd06ee0f3faa7f26a8d84229d74cb309847092f631ccb423ac3132f3ad7be812bb8564687adf5b7e7444472f04c9d4ed91903, 009c0bb6c0d644d902ebcb0d4f04994320a0032caf461a9d5111c002e9edee760c4b5e09fbc7c178038941d7b2bdadfb32515674e8ad69501edd0ad4d1f861065e81 + +# N = 64 +g_scalar = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040 +r = 017668a79ebe01c97f61533f5eddd40c305dd65b0a5ce67c4396938df5e9e2f7ed1bb9d3e0160b01f3800efad55c014d027ea0da9ee1c671907ba16ae6a85f738444, 0102b9d50810be2bdcac36cdd8e64597d8ee0e8631dd1b4f43d5c5d60b2dd0a846a5887a53dcf1d7cac021e0e0d2edd0329eea2d78b82c52fc6fad9d235c3ae123a4 + diff --git a/src/signature.rs b/src/signature.rs index 64f7d08934..5ccec5bf13 100644 --- a/src/signature.rs +++ b/src/signature.rs @@ -272,7 +272,8 @@ pub use crate::ec::{ verification::{ EcdsaVerificationAlgorithm, ECDSA_P256_SHA256_ASN1, ECDSA_P256_SHA256_FIXED, ECDSA_P256_SHA384_ASN1, ECDSA_P384_SHA256_ASN1, ECDSA_P384_SHA384_ASN1, - ECDSA_P384_SHA384_FIXED, + ECDSA_P384_SHA384_FIXED, ECDSA_P521_SHA384_ASN1, ECDSA_P521_SHA384_FIXED, + ECDSA_P521_SHA512_ASN1, ECDSA_P521_SHA512_FIXED, }, }, };