1#include <test/jtx/TestSuite.h>
3#include <xrpld/rpc/detail/RPCHelpers.h>
4#include <xrpld/rpc/handlers/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>
31 "SCAT BERN ISLE FOR ROIL BUS SOAK AQUA FREE FOR DRAM BRIG";
32static char const*
master_seed =
"snMwVWs2hZzfDUF3p2tHZ3EgmyhFs";
37 "r4Vtj2jrfmTVZGfSP3gH9hQPMqFPQFin8f",
41 "aBQxK2YFNqzmAaXNczYcjqDjfiKkLsJUizsr1UBf44RCF8FHdrmX",
42 "038AAE247B2344B1837FBED8F57389C8C11774510A3F7D784F2A09F0CB6843236C",
43 "1949ECD889EA71324BC7A30C8E81F4E93CB73EE19D59E9082111E78CC3DDABC2",
45 "This wallet was generated using a user-supplied "
46 "passphrase that has low entropy and is vulnerable "
47 "to brute-force attacks.",
51 "r4qV6xTXerqaZav3MJfSY79ynmc1BSBev1",
55 "aKEQmgLMyZPMruJFejUuedp169LgW6DbJt1rej1DJ5hWUMH4pHJ7",
56 "ED54C3F5BEDA8BD588B203D23A27398FAD9D20F88A974007D6994659CD7273FE1D",
57 "77AAED2698D56D6676323629160F4EEF21CFD9EE3D0745CC78FA291461F98278",
59 "This wallet was generated using a user-supplied "
60 "passphrase that has low entropy and is vulnerable "
61 "to brute-force attacks.",
65 "rBcvXmNb7KPkNdMkpckdWPpbvkWgcV3nir",
66 "TED AVON CAVE HOUR BRAG JEFF RIFT NEAL TOLD FAT SEW SAN",
67 "shKdhWka8hS7Es3bpctCZXBiAwfUN",
68 "74BA8389B44F98CF41E795CD91F9C93F",
69 "aBRL2sqVuzrsM6zikPB4v8UBHGn1aKkrsxhYEffhcQxB2LKyywE5",
70 "03BD334FB9E06C58D69603E9922686528B18A754BC2F2E1ADA095FFE67DE952C64",
71 "84262FB16AA25BE407174C7EDAB531220C30FA4D8A28AA9D564673FB3D34502C",
72 "A4yKIRGdzrw0YQ$2%TFKYG9HP*&ok^!sy7E@RwICs",
73 "This wallet was generated using a user-supplied "
74 "passphrase. It may be vulnerable to brute-force "
86 params[jss::key_type] = *keyType;
90 BEAST_EXPECT(result.
isMember(jss::account_id));
91 BEAST_EXPECT(result.
isMember(jss::master_seed));
92 BEAST_EXPECT(result.
isMember(jss::master_seed_hex));
93 BEAST_EXPECT(result.
isMember(jss::public_key));
94 BEAST_EXPECT(result.
isMember(jss::public_key_hex));
95 BEAST_EXPECT(result.
isMember(jss::key_type));
98 result[jss::key_type],
99 params.
isMember(jss::key_type) ? params[jss::key_type]
101 BEAST_EXPECT(!result.
isMember(jss::warning));
108 BEAST_EXPECT(result[jss::master_seed].asString() != seed);
123 result[jss::key_type],
124 params.
isMember(jss::key_type) ? params[jss::key_type]
138 params[jss::key_type] = *keyType;
142 BEAST_EXPECT(!wallet.isMember(jss::warning));
154 params[jss::key_type] = *keyType;
158 BEAST_EXPECT(!wallet.isMember(jss::warning));
169 params[jss::key_type] = *keyType;
170 params[jss::passphrase] = value;
176 BEAST_EXPECT(!wallet.isMember(jss::warning));
197 testcase(keyType ? *keyType :
"no key_type");
206 params[jss::key_type] = *keyType;
222 params[jss::key_type] =
"secp256k1";
223 params[jss::passphrase] = 20160506;
227 result[jss::error_message] ==
228 "Invalid field 'passphrase', not string.");
233 params[jss::key_type] =
"secp256k1";
238 result[jss::error_message] ==
239 "Invalid field 'seed', not string.");
244 params[jss::key_type] =
"ed25519";
249 result[jss::error_message] ==
250 "Invalid field 'seed_hex', not string.");
256 params[jss::key_type] =
"secp256k1";
263 result[jss::error_message] ==
264 "Exactly one of the following must be specified: passphrase, "
271 params[jss::key_type] =
"prime256v1";
275 BEAST_EXPECT(result[jss::error_message] ==
"Invalid parameters.");
285 result[jss::error_message] ==
286 "Invalid field 'key_type', not string.");
296 result[jss::error_message] ==
297 "Invalid field 'key_type', not string.");
307 "keypairForSignature - " + (keyType ? *keyType :
"no key_type"));
309 auto const publicKey = parseBase58<PublicKey>(
311 BEAST_EXPECT(publicKey);
322 if (BEAST_EXPECT(ret))
324 BEAST_EXPECT(ret->first.size() != 0);
325 BEAST_EXPECT(ret->first == publicKey);
336 if (BEAST_EXPECT(ret))
338 BEAST_EXPECT(ret->first.size() != 0);
339 BEAST_EXPECT(ret->first == publicKey);
350 if (BEAST_EXPECT(ret))
352 BEAST_EXPECT(ret->first.size() != 0);
353 BEAST_EXPECT(ret->first == publicKey);
364 params[jss::key_type] = *keyType;
369 if (BEAST_EXPECT(ret))
371 BEAST_EXPECT(ret->first.size() != 0);
372 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);
416 params[jss::secret] = 314159265;
421 error[jss::error_message] ==
422 "Invalid field 'secret', not string.");
429 params[jss::secret].
append(
"array:0");
435 error[jss::error_message] ==
436 "Invalid field 'secret', not string.");
443 params[jss::secret][
"string"] =
"string";
444 params[jss::secret][
"number"] = 702;
450 error[jss::error_message] ==
451 "Invalid field 'secret', not string.");
458 params[jss::key_type] =
"ed25519";
465 error[jss::error_message] ==
466 "The secret field is not allowed if key_type is used.");
473 params[jss::key_type] =
"prime256v1";
480 error[jss::error_message] ==
"Invalid field 'key_type'.");
493 error[jss::error_message] ==
494 "Invalid field 'key_type', not string.");
507 error[jss::error_message] ==
508 "Invalid field 'key_type', not string.");
515 params[jss::key_type] =
"secp256k1";
516 params[jss::passphrase] = 1234567890;
522 error[jss::error_message] ==
523 "Invalid field 'passphrase', not string.");
529 params[jss::key_type] =
"secp256k1";
536 error[jss::error_message] ==
537 "Invalid field 'passphrase', not string.");
543 params[jss::key_type] =
"secp256k1";
550 error[jss::error_message] ==
551 "Invalid field 'passphrase', not string.");
557 params[jss::key_type] =
"secp256k1";
558 params[jss::passphrase] =
"";
563 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
570 params[jss::key_type] =
"secp256k1";
571 params[jss::seed] = 443556;
577 error[jss::error_message] ==
578 "Invalid field 'seed', not string.");
584 params[jss::key_type] =
"secp256k1";
591 error[jss::error_message] ==
592 "Invalid field 'seed', not string.");
598 params[jss::key_type] =
"secp256k1";
605 error[jss::error_message] ==
606 "Invalid field 'seed', not string.");
612 params[jss::key_type] =
"secp256k1";
613 params[jss::seed] =
"";
618 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
624 params[jss::key_type] =
"secp256k1";
625 params[jss::seed] =
"s M V s h z D F p t Z E m h s";
630 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
636 params[jss::key_type] =
"secp256k1";
637 params[jss::seed] =
"pnnjkbnobnml43679nbvjdsklnbjs";
642 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
649 params[jss::key_type] =
"secp256k1";
650 params[jss::seed_hex] = 443556;
656 error[jss::error_message] ==
657 "Invalid field 'seed_hex', not string.");
663 params[jss::key_type] =
"secp256k1";
670 error[jss::error_message] ==
671 "Invalid field 'seed_hex', not string.");
677 params[jss::key_type] =
"secp256k1";
684 error[jss::error_message] ==
685 "Invalid field 'seed_hex', not string.");
691 params[jss::key_type] =
"secp256k1";
692 params[jss::seed_hex] =
"";
697 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
703 params[jss::key_type] =
"secp256k1";
704 params[jss::seed_hex] =
"A670A19B";
709 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
715 params[jss::key_type] =
"secp256k1";
721 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
727 params[jss::key_type] =
"secp256k1";
728 params[jss::seed_hex] =
729 "BE6A670A19B209E112146D0A7ED2AAD72567D0FC913";
734 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
741 testcase(
"ripple-lib encoded Ed25519 keys");
743 auto test = [
this](
char const* seed,
char const* addr) {
748 params[jss::passphrase] = seed;
753 if (BEAST_EXPECT(ret))
755 BEAST_EXPECT(ret->first.size() != 0);
764 params[jss::key_type] =
"secp256k1";
765 params[jss::passphrase] = seed;
771 error[jss::error_message] ==
772 "Specified seed is for an Ed25519 wallet.");
779 params[jss::key_type] =
"ed25519";
780 params[jss::seed] = seed;
785 if (BEAST_EXPECT(ret))
787 BEAST_EXPECT(ret->first.size() != 0);
796 params[jss::key_type] =
"secp256k1";
797 params[jss::seed] = seed;
803 error[jss::error_message] ==
804 "Specified seed is for an Ed25519 wallet.");
809 "sEdVWZmeUDgQdMEFKTK9kYVX71FKB7o",
810 "r34XnDB2zS11NZ1wKJzpU1mjWExGVugTaQ");
812 "sEd7zJoVnqg1FxB9EuaHC1AB5UPfHWz",
813 "rDw51qRrBEeMw7Na1Nh79LN7HYZDo7nZFE");
815 "sEdSxVntbihdLyabbfttMCqsaaucVR9",
816 "rwiyBDfAYegXZyaQcN2L1vAbKRYn2wNFMq");
818 "sEdSVwJjEXTYCztqDK4JD9WByH3otDX",
819 "rQJ4hZzNGkLQhLtKPCmu1ywEw1ai2vgUJN");
821 "sEdV3jXjKuUoQTSr1Rb4yw8Kyn9r46U",
822 "rERRw2Pxbau4tevE61V5vZUwD7Rus5Y6vW");
824 "sEdVeUZjuYT47Uy51FQCnzivsuWyiwB",
825 "rszewT5gRjUgWNEmnfMjvVYzJCkhvWY32i");
827 "sEd7MHTewdw4tFYeS7rk7XT4qHiA9jH",
828 "rBB2rvnf4ztwjgNhinFXQJ91nAZjkFgR3p");
830 "sEd7A5jFBSdWbNeKGriQvLr1thBScJh",
831 "rLAXz8Nz7aDivz7PwThsLFqaKrizepNCdA");
833 "sEdVPU9M2uyzVNT4Yb5Dn4tUtYjbFAw",
834 "rHbHRFPCxD5fnn98TBzsQHJ7SsRq7eHkRj");
836 "sEdVfF2zhAmS8gfMYzJ4yWBMeR4BZKc",
837 "r9PsneKHcAE7kUfiTixomM5Mnwi28tCc7h");
839 "sEdTjRtcsQkwthDXUSLi9DHNyJcR8GW",
840 "rM4soF4XS3wZrmLurvE6ZmudG16Lk5Dur5");
842 "sEdVNKeu1Lhpfh7Nf6tRDbxnmMyZ4Dv",
843 "r4ZwJxq6FDtWjapDtCGhjG6mtNm1nWdJcD");
845 "sEd7bK4gf5BHJ1WbaEWx8pKMA9MLHpC",
846 "rD6tnn51m4o1uXeEK9CFrZ3HR7DcFhiYnp");
848 "sEd7jCh3ppnQMsLdGcZ6TZayZaHhBLg",
849 "rTcBkiRQ1EfFQ4FCCwqXNHpn1yUTAACkj");
851 "sEdTFJezurQwSJAbkLygj2gQXBut2wh",
852 "rnXaMacNbRwcJddbbPbqdcpSUQcfzFmrR8");
854 "sEdSWajfQAAWFuDvVZF3AiGucReByLt",
855 "rBJtow6V3GTdsWMamrxetRDwWs6wwTxcKa");
878BEAST_DEFINE_TESTSUITE(WalletPropose, rpc,
ripple);
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 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