1#include <test/jtx/TestSuite.h>
3#include <xrpld/rpc/detail/RPCHelpers.h>
4#include <xrpld/rpc/handlers/admin/keygen/WalletPropose.h>
6#include <xrpl/json/json_value.h>
7#include <xrpl/json/json_writer.h>
8#include <xrpl/protocol/ErrorCodes.h>
9#include <xrpl/protocol/jss.h>
30static char const*
master_key =
"SCAT BERN ISLE FOR ROIL BUS SOAK AQUA FREE FOR DRAM BRIG";
31static char const*
master_seed =
"snMwVWs2hZzfDUF3p2tHZ3EgmyhFs";
36 "r4Vtj2jrfmTVZGfSP3gH9hQPMqFPQFin8f",
40 "aBQxK2YFNqzmAaXNczYcjqDjfiKkLsJUizsr1UBf44RCF8FHdrmX",
41 "038AAE247B2344B1837FBED8F57389C8C11774510A3F7D784F2A09F0CB6843236C",
42 "1949ECD889EA71324BC7A30C8E81F4E93CB73EE19D59E9082111E78CC3DDABC2",
44 "This wallet was generated using a user-supplied "
45 "passphrase that has low entropy and is vulnerable "
46 "to brute-force attacks.",
50 "r4qV6xTXerqaZav3MJfSY79ynmc1BSBev1",
54 "aKEQmgLMyZPMruJFejUuedp169LgW6DbJt1rej1DJ5hWUMH4pHJ7",
55 "ED54C3F5BEDA8BD588B203D23A27398FAD9D20F88A974007D6994659CD7273FE1D",
56 "77AAED2698D56D6676323629160F4EEF21CFD9EE3D0745CC78FA291461F98278",
58 "This wallet was generated using a user-supplied "
59 "passphrase that has low entropy and is vulnerable "
60 "to brute-force attacks.",
64 "rBcvXmNb7KPkNdMkpckdWPpbvkWgcV3nir",
65 "TED AVON CAVE HOUR BRAG JEFF RIFT NEAL TOLD FAT SEW SAN",
66 "shKdhWka8hS7Es3bpctCZXBiAwfUN",
67 "74BA8389B44F98CF41E795CD91F9C93F",
68 "aBRL2sqVuzrsM6zikPB4v8UBHGn1aKkrsxhYEffhcQxB2LKyywE5",
69 "03BD334FB9E06C58D69603E9922686528B18A754BC2F2E1ADA095FFE67DE952C64",
70 "84262FB16AA25BE407174C7EDAB531220C30FA4D8A28AA9D564673FB3D34502C",
71 "A4yKIRGdzrw0YQ$2%TFKYG9HP*&ok^!sy7E@RwICs",
72 "This wallet was generated using a user-supplied "
73 "passphrase. It may be vulnerable to brute-force "
85 params[jss::key_type] = *keyType;
89 BEAST_EXPECT(result.
isMember(jss::account_id));
90 BEAST_EXPECT(result.
isMember(jss::master_seed));
91 BEAST_EXPECT(result.
isMember(jss::master_seed_hex));
92 BEAST_EXPECT(result.
isMember(jss::public_key));
93 BEAST_EXPECT(result.
isMember(jss::public_key_hex));
94 BEAST_EXPECT(result.
isMember(jss::key_type));
97 result[jss::key_type],
98 params.
isMember(jss::key_type) ? params[jss::key_type] :
"secp256k1");
99 BEAST_EXPECT(!result.
isMember(jss::warning));
106 BEAST_EXPECT(result[jss::master_seed].asString() != seed);
121 result[jss::key_type],
122 params.
isMember(jss::key_type) ? params[jss::key_type] :
"secp256k1");
133 params[jss::key_type] = *keyType;
137 BEAST_EXPECT(!wallet.isMember(jss::warning));
147 params[jss::key_type] = *keyType;
151 BEAST_EXPECT(!wallet.isMember(jss::warning));
162 params[jss::key_type] = *keyType;
163 params[jss::passphrase] = value;
172 BEAST_EXPECT(!wallet.isMember(jss::warning));
190 testcase(keyType ? *keyType :
"no key_type");
199 params[jss::key_type] = *keyType;
215 params[jss::key_type] =
"secp256k1";
216 params[jss::passphrase] = 20160506;
219 BEAST_EXPECT(result[jss::error_message] ==
"Invalid field 'passphrase', not string.");
224 params[jss::key_type] =
"secp256k1";
228 BEAST_EXPECT(result[jss::error_message] ==
"Invalid field 'seed', not string.");
233 params[jss::key_type] =
"ed25519";
237 BEAST_EXPECT(result[jss::error_message] ==
"Invalid field 'seed_hex', not string.");
243 params[jss::key_type] =
"secp256k1";
250 result[jss::error_message] ==
251 "Exactly one of the following must be specified: passphrase, "
258 params[jss::key_type] =
"prime256v1";
262 BEAST_EXPECT(result[jss::error_message] ==
"Invalid parameters.");
271 BEAST_EXPECT(result[jss::error_message] ==
"Invalid field 'key_type', not string.");
280 BEAST_EXPECT(result[jss::error_message] ==
"Invalid field 'key_type', not string.");
287 testcase(
"keypairForSignature - " + (keyType ? *keyType :
"no key_type"));
290 BEAST_EXPECT(publicKey);
301 if (BEAST_EXPECT(ret); ret.has_value())
303 BEAST_EXPECT(ret->first.size() != 0);
304 BEAST_EXPECT(ret->first == publicKey);
315 if (BEAST_EXPECT(ret); ret.has_value())
317 BEAST_EXPECT(ret->first.size() != 0);
318 BEAST_EXPECT(ret->first == publicKey);
329 if (BEAST_EXPECT(ret); ret.has_value())
331 BEAST_EXPECT(ret->first.size() != 0);
332 BEAST_EXPECT(ret->first == publicKey);
343 params[jss::key_type] = *keyType;
348 if (BEAST_EXPECT(ret); ret.has_value())
350 BEAST_EXPECT(ret->first.size() != 0);
351 BEAST_EXPECT(ret->first == publicKey);
359 params[jss::key_type] = *keyType;
364 if (BEAST_EXPECT(ret); ret.has_value())
366 BEAST_EXPECT(ret->first.size() != 0);
367 BEAST_EXPECT(ret->first == publicKey);
375 params[jss::key_type] = *keyType;
380 if (BEAST_EXPECT(ret); ret.has_value())
382 BEAST_EXPECT(ret->first.size() != 0);
383 BEAST_EXPECT(ret->first == publicKey);
395 params[jss::secret] = 314159265;
399 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'secret', not string.");
406 params[jss::secret].
append(
"array:0");
411 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'secret', not string.");
418 params[jss::secret][
"string"] =
"string";
419 params[jss::secret][
"number"] = 702;
424 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'secret', not string.");
431 params[jss::key_type] =
"ed25519";
438 error[jss::error_message] ==
439 "The secret field is not allowed if key_type is used.");
446 params[jss::key_type] =
"prime256v1";
452 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'key_type'.");
464 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'key_type', not string.");
476 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'key_type', not string.");
483 params[jss::key_type] =
"secp256k1";
484 params[jss::passphrase] = 1234567890;
489 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'passphrase', not string.");
495 params[jss::key_type] =
"secp256k1";
501 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'passphrase', not string.");
507 params[jss::key_type] =
"secp256k1";
513 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'passphrase', not string.");
519 params[jss::key_type] =
"secp256k1";
520 params[jss::passphrase] =
"";
525 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
532 params[jss::key_type] =
"secp256k1";
533 params[jss::seed] = 443556;
538 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'seed', not string.");
544 params[jss::key_type] =
"secp256k1";
550 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'seed', not string.");
556 params[jss::key_type] =
"secp256k1";
562 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'seed', not string.");
568 params[jss::key_type] =
"secp256k1";
569 params[jss::seed] =
"";
574 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
580 params[jss::key_type] =
"secp256k1";
581 params[jss::seed] =
"s M V s h z D F p t Z E m h s";
586 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
592 params[jss::key_type] =
"secp256k1";
593 params[jss::seed] =
"pnnjkbnobnml43679nbvjdsklnbjs";
598 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
605 params[jss::key_type] =
"secp256k1";
606 params[jss::seed_hex] = 443556;
611 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'seed_hex', not string.");
617 params[jss::key_type] =
"secp256k1";
623 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'seed_hex', not string.");
629 params[jss::key_type] =
"secp256k1";
635 BEAST_EXPECT(error[jss::error_message] ==
"Invalid field 'seed_hex', not string.");
641 params[jss::key_type] =
"secp256k1";
642 params[jss::seed_hex] =
"";
647 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
653 params[jss::key_type] =
"secp256k1";
654 params[jss::seed_hex] =
"A670A19B";
659 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
665 params[jss::key_type] =
"secp256k1";
671 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
677 params[jss::key_type] =
"secp256k1";
678 params[jss::seed_hex] =
"BE6A670A19B209E112146D0A7ED2AAD72567D0FC913";
683 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
690 testcase(
"ripple-lib encoded Ed25519 keys");
692 auto test = [
this](
char const* seed,
char const* addr) {
697 params[jss::passphrase] = seed;
702 if (BEAST_EXPECT(ret); ret.has_value())
704 BEAST_EXPECT(ret->first.size() != 0);
713 params[jss::key_type] =
"secp256k1";
714 params[jss::passphrase] = seed;
720 error[jss::error_message] ==
"Specified seed is for an Ed25519 wallet.");
727 params[jss::key_type] =
"ed25519";
728 params[jss::seed] = seed;
733 if (BEAST_EXPECT(ret); ret.has_value())
735 BEAST_EXPECT(ret->first.size() != 0);
744 params[jss::key_type] =
"secp256k1";
745 params[jss::seed] = seed;
751 error[jss::error_message] ==
"Specified seed is for an Ed25519 wallet.");
755 test(
"sEdVWZmeUDgQdMEFKTK9kYVX71FKB7o",
"r34XnDB2zS11NZ1wKJzpU1mjWExGVugTaQ");
756 test(
"sEd7zJoVnqg1FxB9EuaHC1AB5UPfHWz",
"rDw51qRrBEeMw7Na1Nh79LN7HYZDo7nZFE");
757 test(
"sEdSxVntbihdLyabbfttMCqsaaucVR9",
"rwiyBDfAYegXZyaQcN2L1vAbKRYn2wNFMq");
758 test(
"sEdSVwJjEXTYCztqDK4JD9WByH3otDX",
"rQJ4hZzNGkLQhLtKPCmu1ywEw1ai2vgUJN");
759 test(
"sEdV3jXjKuUoQTSr1Rb4yw8Kyn9r46U",
"rERRw2Pxbau4tevE61V5vZUwD7Rus5Y6vW");
760 test(
"sEdVeUZjuYT47Uy51FQCnzivsuWyiwB",
"rszewT5gRjUgWNEmnfMjvVYzJCkhvWY32i");
761 test(
"sEd7MHTewdw4tFYeS7rk7XT4qHiA9jH",
"rBB2rvnf4ztwjgNhinFXQJ91nAZjkFgR3p");
762 test(
"sEd7A5jFBSdWbNeKGriQvLr1thBScJh",
"rLAXz8Nz7aDivz7PwThsLFqaKrizepNCdA");
763 test(
"sEdVPU9M2uyzVNT4Yb5Dn4tUtYjbFAw",
"rHbHRFPCxD5fnn98TBzsQHJ7SsRq7eHkRj");
764 test(
"sEdVfF2zhAmS8gfMYzJ4yWBMeR4BZKc",
"r9PsneKHcAE7kUfiTixomM5Mnwi28tCc7h");
765 test(
"sEdTjRtcsQkwthDXUSLi9DHNyJcR8GW",
"rM4soF4XS3wZrmLurvE6ZmudG16Lk5Dur5");
766 test(
"sEdVNKeu1Lhpfh7Nf6tRDbxnmMyZ4Dv",
"r4ZwJxq6FDtWjapDtCGhjG6mtNm1nWdJcD");
767 test(
"sEd7bK4gf5BHJ1WbaEWx8pKMA9MLHpC",
"rD6tnn51m4o1uXeEK9CFrZ3HR7DcFhiYnp");
768 test(
"sEd7jCh3ppnQMsLdGcZ6TZayZaHhBLg",
"rTcBkiRQ1EfFQ4FCCwqXNHpn1yUTAACkj");
769 test(
"sEdTFJezurQwSJAbkLygj2gQXBut2wh",
"rnXaMacNbRwcJddbbPbqdcpSUQcfzFmrR8");
770 test(
"sEdSWajfQAAWFuDvVZF3AiGucReByLt",
"rBJtow6V3GTdsWMamrxetRDwWs6wwTxcKa");
793BEAST_DEFINE_TESTSUITE(WalletPropose, rpc,
xrpl);
Value & append(Value const &value)
Append value to array at the end.
std::string asString() const
Returns the unquoted string value.
bool isMember(char const *key) const
Return true if the object has a member named key.
testcase_t testcase
Memberspace for declaring test cases.
void testSeed(std::optional< std::string > const &keyType, key_strings const &strings)
Json::Value testSecretWallet(Json::Value const ¶ms, key_strings const &s)
void testRippleLibEd25519()
void testKeyType(std::optional< std::string > const &keyType, key_strings const &strings)
void testLegacyPassphrase(std::optional< std::string > const &keyType, key_strings const &strings)
void testLegacyPassphrase(char const *value, std::optional< std::string > const &keyType, key_strings const &strings)
void testRandomWallet(std::optional< std::string > const &keyType)
void run() override
Runs the suite.
void testKeypairForSignatureErrors()
void testSeedHex(std::optional< std::string > const &keyType, key_strings const &strings)
void testKeypairForSignature(std::optional< std::string > keyType, key_strings const &strings)
bool expectEquals(S actual, T expected, std::string const &message="")
@ arrayValue
array value (ordered list)
@ objectValue
object value (collection of name/value pairs).
static char const * master_key
static char const * passphrase
static char const * master_seed_hex
static char const * master_seed
static key_strings const strong_brain_strings
static key_strings const secp256k1_strings
std::optional< std::pair< PublicKey, SecretKey > > keypairForSignature(Json::Value const ¶ms, Json::Value &error, unsigned int apiVersion)
Generates a keypair for signature from RPC parameters.
static key_strings const ed25519_strings
bool contains_error(Json::Value const &json)
Returns true if the json contains an rpc error specification.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Json::Value walletPropose(Json::Value const ¶ms)
AccountID calcAccountID(PublicKey const &pk)
char const * master_seed_hex
char const * public_key_hex
char const * secret_key_hex
char const * passphrase_warning