19#include <test/jtx/TestSuite.h>
20#include <xrpld/rpc/detail/RPCHelpers.h>
21#include <xrpld/rpc/handlers/WalletPropose.h>
22#include <xrpl/json/json_value.h>
23#include <xrpl/json/json_writer.h>
24#include <xrpl/protocol/ErrorCodes.h>
25#include <xrpl/protocol/jss.h>
47 "SCAT BERN ISLE FOR ROIL BUS SOAK AQUA FREE FOR DRAM BRIG";
48static char const*
master_seed =
"snMwVWs2hZzfDUF3p2tHZ3EgmyhFs";
53 "r4Vtj2jrfmTVZGfSP3gH9hQPMqFPQFin8f",
57 "aBQxK2YFNqzmAaXNczYcjqDjfiKkLsJUizsr1UBf44RCF8FHdrmX",
58 "038AAE247B2344B1837FBED8F57389C8C11774510A3F7D784F2A09F0CB6843236C",
59 "1949ECD889EA71324BC7A30C8E81F4E93CB73EE19D59E9082111E78CC3DDABC2",
61 "This wallet was generated using a user-supplied "
62 "passphrase that has low entropy and is vulnerable "
63 "to brute-force attacks.",
67 "r4qV6xTXerqaZav3MJfSY79ynmc1BSBev1",
71 "aKEQmgLMyZPMruJFejUuedp169LgW6DbJt1rej1DJ5hWUMH4pHJ7",
72 "ED54C3F5BEDA8BD588B203D23A27398FAD9D20F88A974007D6994659CD7273FE1D",
73 "77AAED2698D56D6676323629160F4EEF21CFD9EE3D0745CC78FA291461F98278",
75 "This wallet was generated using a user-supplied "
76 "passphrase that has low entropy and is vulnerable "
77 "to brute-force attacks.",
81 "rBcvXmNb7KPkNdMkpckdWPpbvkWgcV3nir",
82 "TED AVON CAVE HOUR BRAG JEFF RIFT NEAL TOLD FAT SEW SAN",
83 "shKdhWka8hS7Es3bpctCZXBiAwfUN",
84 "74BA8389B44F98CF41E795CD91F9C93F",
85 "aBRL2sqVuzrsM6zikPB4v8UBHGn1aKkrsxhYEffhcQxB2LKyywE5",
86 "03BD334FB9E06C58D69603E9922686528B18A754BC2F2E1ADA095FFE67DE952C64",
87 "84262FB16AA25BE407174C7EDAB531220C30FA4D8A28AA9D564673FB3D34502C",
88 "A4yKIRGdzrw0YQ$2%TFKYG9HP*&ok^!sy7E@RwICs",
89 "This wallet was generated using a user-supplied "
90 "passphrase. It may be vulnerable to brute-force "
102 params[jss::key_type] = *keyType;
106 BEAST_EXPECT(result.
isMember(jss::account_id));
107 BEAST_EXPECT(result.
isMember(jss::master_seed));
108 BEAST_EXPECT(result.
isMember(jss::master_seed_hex));
109 BEAST_EXPECT(result.
isMember(jss::public_key));
110 BEAST_EXPECT(result.
isMember(jss::public_key_hex));
111 BEAST_EXPECT(result.
isMember(jss::key_type));
114 result[jss::key_type],
115 params.
isMember(jss::key_type) ? params[jss::key_type]
117 BEAST_EXPECT(!result.
isMember(jss::warning));
124 BEAST_EXPECT(result[jss::master_seed].asString() != seed);
139 result[jss::key_type],
140 params.
isMember(jss::key_type) ? params[jss::key_type]
154 params[jss::key_type] = *keyType;
158 BEAST_EXPECT(!wallet.isMember(jss::warning));
170 params[jss::key_type] = *keyType;
174 BEAST_EXPECT(!wallet.isMember(jss::warning));
185 params[jss::key_type] = *keyType;
186 params[jss::passphrase] = value;
192 BEAST_EXPECT(!wallet.isMember(jss::warning));
213 testcase(keyType ? *keyType :
"no key_type");
222 params[jss::key_type] = *keyType;
238 params[jss::key_type] =
"secp256k1";
239 params[jss::passphrase] = 20160506;
243 result[jss::error_message] ==
244 "Invalid field 'passphrase', not string.");
249 params[jss::key_type] =
"secp256k1";
254 result[jss::error_message] ==
255 "Invalid field 'seed', not string.");
260 params[jss::key_type] =
"ed25519";
265 result[jss::error_message] ==
266 "Invalid field 'seed_hex', not string.");
272 params[jss::key_type] =
"secp256k1";
279 result[jss::error_message] ==
280 "Exactly one of the following must be specified: passphrase, "
287 params[jss::key_type] =
"prime256v1";
291 BEAST_EXPECT(result[jss::error_message] ==
"Invalid parameters.");
301 result[jss::error_message] ==
302 "Invalid field 'key_type', not string.");
312 result[jss::error_message] ==
313 "Invalid field 'key_type', not string.");
323 "keypairForSignature - " + (keyType ? *keyType :
"no key_type"));
325 auto const publicKey = parseBase58<PublicKey>(
327 BEAST_EXPECT(publicKey);
338 if (BEAST_EXPECT(ret))
340 BEAST_EXPECT(ret->first.size() != 0);
341 BEAST_EXPECT(ret->first == publicKey);
352 if (BEAST_EXPECT(ret))
354 BEAST_EXPECT(ret->first.size() != 0);
355 BEAST_EXPECT(ret->first == publicKey);
366 if (BEAST_EXPECT(ret))
368 BEAST_EXPECT(ret->first.size() != 0);
369 BEAST_EXPECT(ret->first == publicKey);
380 params[jss::key_type] = *keyType;
385 if (BEAST_EXPECT(ret))
387 BEAST_EXPECT(ret->first.size() != 0);
388 BEAST_EXPECT(ret->first == publicKey);
396 params[jss::key_type] = *keyType;
401 if (BEAST_EXPECT(ret))
403 BEAST_EXPECT(ret->first.size() != 0);
404 BEAST_EXPECT(ret->first == publicKey);
412 params[jss::key_type] = *keyType;
417 if (BEAST_EXPECT(ret))
419 BEAST_EXPECT(ret->first.size() != 0);
420 BEAST_EXPECT(ret->first == publicKey);
432 params[jss::secret] = 314159265;
437 error[jss::error_message] ==
438 "Invalid field 'secret', not string.");
445 params[jss::secret].
append(
"array:0");
451 error[jss::error_message] ==
452 "Invalid field 'secret', not string.");
459 params[jss::secret][
"string"] =
"string";
460 params[jss::secret][
"number"] = 702;
466 error[jss::error_message] ==
467 "Invalid field 'secret', not string.");
474 params[jss::key_type] =
"ed25519";
481 error[jss::error_message] ==
482 "The secret field is not allowed if key_type is used.");
489 params[jss::key_type] =
"prime256v1";
496 error[jss::error_message] ==
"Invalid field 'key_type'.");
509 error[jss::error_message] ==
510 "Invalid field 'key_type', not string.");
523 error[jss::error_message] ==
524 "Invalid field 'key_type', not string.");
531 params[jss::key_type] =
"secp256k1";
532 params[jss::passphrase] = 1234567890;
538 error[jss::error_message] ==
539 "Invalid field 'passphrase', not string.");
545 params[jss::key_type] =
"secp256k1";
552 error[jss::error_message] ==
553 "Invalid field 'passphrase', not string.");
559 params[jss::key_type] =
"secp256k1";
566 error[jss::error_message] ==
567 "Invalid field 'passphrase', not string.");
573 params[jss::key_type] =
"secp256k1";
574 params[jss::passphrase] =
"";
579 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
586 params[jss::key_type] =
"secp256k1";
587 params[jss::seed] = 443556;
593 error[jss::error_message] ==
594 "Invalid field 'seed', not string.");
600 params[jss::key_type] =
"secp256k1";
607 error[jss::error_message] ==
608 "Invalid field 'seed', not string.");
614 params[jss::key_type] =
"secp256k1";
621 error[jss::error_message] ==
622 "Invalid field 'seed', not string.");
628 params[jss::key_type] =
"secp256k1";
629 params[jss::seed] =
"";
634 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
640 params[jss::key_type] =
"secp256k1";
641 params[jss::seed] =
"s M V s h z D F p t Z E m h s";
646 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
652 params[jss::key_type] =
"secp256k1";
653 params[jss::seed] =
"pnnjkbnobnml43679nbvjdsklnbjs";
658 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
665 params[jss::key_type] =
"secp256k1";
666 params[jss::seed_hex] = 443556;
672 error[jss::error_message] ==
673 "Invalid field 'seed_hex', not string.");
679 params[jss::key_type] =
"secp256k1";
686 error[jss::error_message] ==
687 "Invalid field 'seed_hex', not string.");
693 params[jss::key_type] =
"secp256k1";
700 error[jss::error_message] ==
701 "Invalid field 'seed_hex', not string.");
707 params[jss::key_type] =
"secp256k1";
708 params[jss::seed_hex] =
"";
713 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
719 params[jss::key_type] =
"secp256k1";
720 params[jss::seed_hex] =
"A670A19B";
725 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
731 params[jss::key_type] =
"secp256k1";
737 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
743 params[jss::key_type] =
"secp256k1";
744 params[jss::seed_hex] =
745 "BE6A670A19B209E112146D0A7ED2AAD72567D0FC913";
750 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
757 testcase(
"ripple-lib encoded Ed25519 keys");
759 auto test = [
this](
char const* seed,
char const* addr) {
764 params[jss::passphrase] = seed;
769 if (BEAST_EXPECT(ret))
771 BEAST_EXPECT(ret->first.size() != 0);
780 params[jss::key_type] =
"secp256k1";
781 params[jss::passphrase] = seed;
787 error[jss::error_message] ==
788 "Specified seed is for an Ed25519 wallet.");
795 params[jss::key_type] =
"ed25519";
796 params[jss::seed] = seed;
801 if (BEAST_EXPECT(ret))
803 BEAST_EXPECT(ret->first.size() != 0);
812 params[jss::key_type] =
"secp256k1";
813 params[jss::seed] = seed;
819 error[jss::error_message] ==
820 "Specified seed is for an Ed25519 wallet.");
825 "sEdVWZmeUDgQdMEFKTK9kYVX71FKB7o",
826 "r34XnDB2zS11NZ1wKJzpU1mjWExGVugTaQ");
828 "sEd7zJoVnqg1FxB9EuaHC1AB5UPfHWz",
829 "rDw51qRrBEeMw7Na1Nh79LN7HYZDo7nZFE");
831 "sEdSxVntbihdLyabbfttMCqsaaucVR9",
832 "rwiyBDfAYegXZyaQcN2L1vAbKRYn2wNFMq");
834 "sEdSVwJjEXTYCztqDK4JD9WByH3otDX",
835 "rQJ4hZzNGkLQhLtKPCmu1ywEw1ai2vgUJN");
837 "sEdV3jXjKuUoQTSr1Rb4yw8Kyn9r46U",
838 "rERRw2Pxbau4tevE61V5vZUwD7Rus5Y6vW");
840 "sEdVeUZjuYT47Uy51FQCnzivsuWyiwB",
841 "rszewT5gRjUgWNEmnfMjvVYzJCkhvWY32i");
843 "sEd7MHTewdw4tFYeS7rk7XT4qHiA9jH",
844 "rBB2rvnf4ztwjgNhinFXQJ91nAZjkFgR3p");
846 "sEd7A5jFBSdWbNeKGriQvLr1thBScJh",
847 "rLAXz8Nz7aDivz7PwThsLFqaKrizepNCdA");
849 "sEdVPU9M2uyzVNT4Yb5Dn4tUtYjbFAw",
850 "rHbHRFPCxD5fnn98TBzsQHJ7SsRq7eHkRj");
852 "sEdVfF2zhAmS8gfMYzJ4yWBMeR4BZKc",
853 "r9PsneKHcAE7kUfiTixomM5Mnwi28tCc7h");
855 "sEdTjRtcsQkwthDXUSLi9DHNyJcR8GW",
856 "rM4soF4XS3wZrmLurvE6ZmudG16Lk5Dur5");
858 "sEdVNKeu1Lhpfh7Nf6tRDbxnmMyZ4Dv",
859 "r4ZwJxq6FDtWjapDtCGhjG6mtNm1nWdJcD");
861 "sEd7bK4gf5BHJ1WbaEWx8pKMA9MLHpC",
862 "rD6tnn51m4o1uXeEK9CFrZ3HR7DcFhiYnp");
864 "sEd7jCh3ppnQMsLdGcZ6TZayZaHhBLg",
865 "rTcBkiRQ1EfFQ4FCCwqXNHpn1yUTAACkj");
867 "sEdTFJezurQwSJAbkLygj2gQXBut2wh",
868 "rnXaMacNbRwcJddbbPbqdcpSUQcfzFmrR8");
870 "sEdSWajfQAAWFuDvVZF3AiGucReByLt",
871 "rBJtow6V3GTdsWMamrxetRDwWs6wwTxcKa");
894BEAST_DEFINE_TESTSUITE(WalletPropose, ripple_basics,
ripple);
Value & append(const Value &value)
Append value to array at the end.
std::string asString() const
Returns the unquoted string value.
bool isMember(const char *key) const
Return true if the object has a member named key.
testcase_t testcase
Memberspace for declaring test cases.
void testLegacyPassphrase(std::optional< std::string > const &keyType, key_strings const &strings)
void run() override
Runs the suite.
void testRippleLibEd25519()
void testKeypairForSignature(std::optional< std::string > keyType, key_strings const &strings)
void testLegacyPassphrase(char const *value, std::optional< std::string > const &keyType, key_strings const &strings)
void testSeedHex(std::optional< std::string > const &keyType, key_strings const &strings)
void testKeyType(std::optional< std::string > const &keyType, key_strings const &strings)
void testKeypairForSignatureErrors()
void testRandomWallet(std::optional< std::string > const &keyType)
Json::Value testSecretWallet(Json::Value const ¶ms, key_strings const &s)
void testSeed(std::optional< std::string > const &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 * master_seed_hex
static char const * master_seed
static char const * passphrase
static key_strings const ed25519_strings
bool contains_error(Json::Value const &json)
Returns true if the json contains an rpc error specification.
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)
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.
AccountID calcAccountID(PublicKey const &pk)
Json::Value walletPropose(Json::Value const ¶ms)
char const * passphrase_warning
char const * secret_key_hex
char const * master_seed_hex
char const * public_key_hex