20 #include <ripple/basics/StringUtilities.h>
21 #include <test/jtx/TestSuite.h>
22 #include <ripple/json/json_value.h>
23 #include <ripple/json/json_writer.h>
24 #include <ripple/protocol/ErrorCodes.h>
25 #include <ripple/protocol/jss.h>
26 #include <ripple/rpc/handlers/WalletPropose.h>
27 #include <ripple/rpc/impl/RPCHelpers.h>
48 static char const*
master_key =
"SCAT BERN ISLE FOR ROIL BUS SOAK AQUA FREE FOR DRAM BRIG";
49 static char const*
master_seed =
"snMwVWs2hZzfDUF3p2tHZ3EgmyhFs";
55 "r4Vtj2jrfmTVZGfSP3gH9hQPMqFPQFin8f",
59 "aBQxK2YFNqzmAaXNczYcjqDjfiKkLsJUizsr1UBf44RCF8FHdrmX",
60 "038AAE247B2344B1837FBED8F57389C8C11774510A3F7D784F2A09F0CB6843236C",
61 "1949ECD889EA71324BC7A30C8E81F4E93CB73EE19D59E9082111E78CC3DDABC2",
63 "This wallet was generated using a user-supplied "
64 "passphrase that has low entropy and is vulnerable "
65 "to brute-force attacks.",
70 "r4qV6xTXerqaZav3MJfSY79ynmc1BSBev1",
74 "aKEQmgLMyZPMruJFejUuedp169LgW6DbJt1rej1DJ5hWUMH4pHJ7",
75 "ED54C3F5BEDA8BD588B203D23A27398FAD9D20F88A974007D6994659CD7273FE1D",
76 "77AAED2698D56D6676323629160F4EEF21CFD9EE3D0745CC78FA291461F98278",
78 "This wallet was generated using a user-supplied "
79 "passphrase that has low entropy and is vulnerable "
80 "to brute-force attacks.",
85 "rBcvXmNb7KPkNdMkpckdWPpbvkWgcV3nir",
86 "TED AVON CAVE HOUR BRAG JEFF RIFT NEAL TOLD FAT SEW SAN",
87 "shKdhWka8hS7Es3bpctCZXBiAwfUN",
88 "74BA8389B44F98CF41E795CD91F9C93F",
89 "aBRL2sqVuzrsM6zikPB4v8UBHGn1aKkrsxhYEffhcQxB2LKyywE5",
90 "03BD334FB9E06C58D69603E9922686528B18A754BC2F2E1ADA095FFE67DE952C64",
91 "84262FB16AA25BE407174C7EDAB531220C30FA4D8A28AA9D564673FB3D34502C",
92 "A4yKIRGdzrw0YQ$2%TFKYG9HP*&ok^!sy7E@RwICs",
93 "This wallet was generated using a user-supplied "
94 "passphrase. It may be vulnerable to brute-force "
105 params[jss::key_type] = *keyType;
109 BEAST_EXPECT(result.
isMember (jss::account_id));
110 BEAST_EXPECT(result.
isMember (jss::master_seed));
111 BEAST_EXPECT(result.
isMember (jss::master_seed_hex));
112 BEAST_EXPECT(result.
isMember (jss::public_key));
113 BEAST_EXPECT(result.
isMember (jss::public_key_hex));
114 BEAST_EXPECT(result.
isMember (jss::key_type));
117 params.
isMember (jss::key_type) ? params[jss::key_type]
119 BEAST_EXPECT(!result.
isMember(jss::warning));
126 BEAST_EXPECT(result[jss::master_seed].asString() != seed);
140 params.
isMember (jss::key_type) ? params[jss::key_type]
145 void testSeed (boost::optional<std::string>
const& keyType,
152 params[jss::key_type] = *keyType;
156 BEAST_EXPECT(!wallet.isMember(jss::warning));
162 testcase (
"seed_hex");
166 params[jss::key_type] = *keyType;
170 BEAST_EXPECT(!wallet.isMember(jss::warning));
174 boost::optional<std::string>
const& keyType,
179 params[jss::key_type] = *keyType;
180 params[jss::passphrase] = value;
186 BEAST_EXPECT(!wallet.isMember(jss::warning));
192 testcase (
"passphrase");
203 testcase (keyType ? *keyType :
"no key_type");
212 params[jss::key_type] = *keyType;
222 testcase (
"Bad inputs");
227 params[jss::key_type] =
"secp256k1";
228 params[jss::passphrase] = 20160506;
231 BEAST_EXPECT(result[jss::error_message] ==
232 "Invalid field 'passphrase', not string.");
237 params[jss::key_type] =
"secp256k1";
241 BEAST_EXPECT(result[jss::error_message] ==
242 "Invalid field 'seed', not string.");
247 params[jss::key_type] =
"ed25519";
251 BEAST_EXPECT(result[jss::error_message] ==
252 "Invalid field 'seed_hex', not string.");
258 params[jss::key_type] =
"secp256k1";
264 BEAST_EXPECT(result[jss::error_message] ==
265 "Exactly one of the following must be specified: passphrase, seed or seed_hex");
271 params[jss::key_type] =
"prime256v1";
275 BEAST_EXPECT(result[jss::error_message] ==
276 "Invalid parameters.");
285 BEAST_EXPECT(result[jss::error_message] ==
286 "Invalid field 'key_type', not string.");
295 BEAST_EXPECT(result[jss::error_message] ==
296 "Invalid field 'key_type', not string.");
301 boost::optional<std::string> keyType,
304 testcase (
"keypairForSignature - " +
305 (keyType ? *keyType :
"no key_type"));
307 auto const publicKey = parseBase58<PublicKey>(
309 BEAST_EXPECT(publicKey);
320 BEAST_EXPECT(ret.first.size() != 0);
321 BEAST_EXPECT(ret.first == publicKey);
331 BEAST_EXPECT(ret.first.size() != 0);
332 BEAST_EXPECT(ret.first == publicKey);
342 BEAST_EXPECT(ret.first.size() != 0);
343 BEAST_EXPECT(ret.first == publicKey);
346 keyType.emplace (
"secp256k1");
353 params[jss::key_type] = *keyType;
358 BEAST_EXPECT(ret.first.size() != 0);
359 BEAST_EXPECT(ret.first == publicKey);
366 params[jss::key_type] = *keyType;
371 BEAST_EXPECT(ret.first.size() != 0);
372 BEAST_EXPECT(ret.first == publicKey);
379 params[jss::key_type] = *keyType;
384 BEAST_EXPECT(ret.first.size() != 0);
385 BEAST_EXPECT(ret.first == publicKey);
395 params[jss::secret] = 314159265;
398 BEAST_EXPECT(error[jss::error_message] ==
399 "Invalid field 'secret', not string.");
400 BEAST_EXPECT(ret.first.size() == 0);
407 params[jss::secret].
append (
"array:0");
411 BEAST_EXPECT(error[jss::error_message] ==
412 "Invalid field 'secret', not string.");
413 BEAST_EXPECT(ret.first.size() == 0);
420 params[jss::secret][
"string"] =
"string";
421 params[jss::secret][
"number"] = 702;
425 BEAST_EXPECT(ret.first.size() == 0);
426 BEAST_EXPECT(error[jss::error_message] ==
427 "Invalid field 'secret', not string.");
434 params[jss::key_type] =
"ed25519";
439 BEAST_EXPECT(error[jss::error_message] ==
440 "The secret field is not allowed if key_type is used.");
441 BEAST_EXPECT(ret.first.size() == 0);
448 params[jss::key_type] =
"prime256v1";
453 BEAST_EXPECT(error[jss::error_message] ==
454 "Invalid field 'key_type'.");
455 BEAST_EXPECT(ret.first.size() == 0);
466 BEAST_EXPECT(error[jss::error_message] ==
467 "Invalid field 'key_type', not string.");
468 BEAST_EXPECT(ret.first.size() == 0);
479 BEAST_EXPECT(error[jss::error_message] ==
480 "Invalid field 'key_type', not string.");
481 BEAST_EXPECT(ret.first.size() == 0);
488 params[jss::key_type] =
"secp256k1";
489 params[jss::passphrase] = 1234567890;
493 BEAST_EXPECT(error[jss::error_message] ==
494 "Invalid field 'passphrase', not string.");
495 BEAST_EXPECT(ret.first.size() == 0);
501 params[jss::key_type] =
"secp256k1";
506 BEAST_EXPECT(error[jss::error_message] ==
507 "Invalid field 'passphrase', not string.");
508 BEAST_EXPECT(ret.first.size() == 0);
514 params[jss::key_type] =
"secp256k1";
519 BEAST_EXPECT(error[jss::error_message] ==
520 "Invalid field 'passphrase', not string.");
521 BEAST_EXPECT(ret.first.size() == 0);
527 params[jss::key_type] =
"secp256k1";
528 params[jss::passphrase] =
"";
532 BEAST_EXPECT(error[jss::error_message] ==
534 BEAST_EXPECT(ret.first.size() == 0);
542 params[jss::key_type] =
"secp256k1";
543 params[jss::seed] = 443556;
547 BEAST_EXPECT(error[jss::error_message] ==
548 "Invalid field 'seed', not string.");
549 BEAST_EXPECT(ret.first.size() == 0);
555 params[jss::key_type] =
"secp256k1";
560 BEAST_EXPECT(error[jss::error_message] ==
561 "Invalid field 'seed', not string.");
562 BEAST_EXPECT(ret.first.size() == 0);
568 params[jss::key_type] =
"secp256k1";
573 BEAST_EXPECT(error[jss::error_message] ==
574 "Invalid field 'seed', not string.");
575 BEAST_EXPECT(ret.first.size() == 0);
581 params[jss::key_type] =
"secp256k1";
582 params[jss::seed] =
"";
586 BEAST_EXPECT(error[jss::error_message] ==
588 BEAST_EXPECT(ret.first.size() == 0);
594 params[jss::key_type] =
"secp256k1";
595 params[jss::seed] =
"s M V s h z D F p t Z E m h s";
599 BEAST_EXPECT(error[jss::error_message] ==
601 BEAST_EXPECT(ret.first.size() == 0);
607 params[jss::key_type] =
"secp256k1";
608 params[jss::seed] =
"pnnjkbnobnml43679nbvjdsklnbjs";
612 BEAST_EXPECT(error[jss::error_message] ==
614 BEAST_EXPECT(ret.first.size() == 0);
621 params[jss::key_type] =
"secp256k1";
622 params[jss::seed_hex] = 443556;
626 BEAST_EXPECT(error[jss::error_message] ==
627 "Invalid field 'seed_hex', not string.");
628 BEAST_EXPECT(ret.first.size() == 0);
634 params[jss::key_type] =
"secp256k1";
639 BEAST_EXPECT(error[jss::error_message] ==
640 "Invalid field 'seed_hex', not string.");
641 BEAST_EXPECT(ret.first.size() == 0);
647 params[jss::key_type] =
"secp256k1";
652 BEAST_EXPECT(error[jss::error_message] ==
653 "Invalid field 'seed_hex', not string.");
654 BEAST_EXPECT(ret.first.size() == 0);
660 params[jss::key_type] =
"secp256k1";
661 params[jss::seed_hex] =
"";
665 BEAST_EXPECT(error[jss::error_message] ==
667 BEAST_EXPECT(ret.first.size() == 0);
673 params[jss::key_type] =
"secp256k1";
674 params[jss::seed_hex] =
"A670A19B";
678 BEAST_EXPECT(error[jss::error_message] ==
680 BEAST_EXPECT(ret.first.size() == 0);
686 params[jss::key_type] =
"secp256k1";
691 BEAST_EXPECT(error[jss::error_message] ==
693 BEAST_EXPECT(ret.first.size() == 0);
699 params[jss::key_type] =
"secp256k1";
700 params[jss::seed_hex] =
"BE6A670A19B209E112146D0A7ED2AAD72567D0FC913";
704 BEAST_EXPECT(error[jss::error_message] ==
706 BEAST_EXPECT(ret.first.size() == 0);
712 testcase (
"ripple-lib encoded Ed25519 keys");
714 auto test = [
this](
char const* seed,
char const* addr)
720 params[jss::passphrase] = seed;
725 BEAST_EXPECT(ret.first.size() != 0);
733 params[jss::key_type] =
"secp256k1";
734 params[jss::passphrase] = seed;
739 BEAST_EXPECT(error[jss::error_message] ==
740 "Specified seed is for an Ed25519 wallet.");
747 params[jss::key_type] =
"ed25519";
748 params[jss::seed] = seed;
753 BEAST_EXPECT(ret.first.size() != 0);
761 params[jss::key_type] =
"secp256k1";
762 params[jss::seed] = seed;
767 BEAST_EXPECT(error[jss::error_message] ==
768 "Specified seed is for an Ed25519 wallet.");
772 test(
"sEdVWZmeUDgQdMEFKTK9kYVX71FKB7o",
"r34XnDB2zS11NZ1wKJzpU1mjWExGVugTaQ");
773 test(
"sEd7zJoVnqg1FxB9EuaHC1AB5UPfHWz",
"rDw51qRrBEeMw7Na1Nh79LN7HYZDo7nZFE");
774 test(
"sEdSxVntbihdLyabbfttMCqsaaucVR9",
"rwiyBDfAYegXZyaQcN2L1vAbKRYn2wNFMq");
775 test(
"sEdSVwJjEXTYCztqDK4JD9WByH3otDX",
"rQJ4hZzNGkLQhLtKPCmu1ywEw1ai2vgUJN");
776 test(
"sEdV3jXjKuUoQTSr1Rb4yw8Kyn9r46U",
"rERRw2Pxbau4tevE61V5vZUwD7Rus5Y6vW");
777 test(
"sEdVeUZjuYT47Uy51FQCnzivsuWyiwB",
"rszewT5gRjUgWNEmnfMjvVYzJCkhvWY32i");
778 test(
"sEd7MHTewdw4tFYeS7rk7XT4qHiA9jH",
"rBB2rvnf4ztwjgNhinFXQJ91nAZjkFgR3p");
779 test(
"sEd7A5jFBSdWbNeKGriQvLr1thBScJh",
"rLAXz8Nz7aDivz7PwThsLFqaKrizepNCdA");
780 test(
"sEdVPU9M2uyzVNT4Yb5Dn4tUtYjbFAw",
"rHbHRFPCxD5fnn98TBzsQHJ7SsRq7eHkRj");
781 test(
"sEdVfF2zhAmS8gfMYzJ4yWBMeR4BZKc",
"r9PsneKHcAE7kUfiTixomM5Mnwi28tCc7h");
782 test(
"sEdTjRtcsQkwthDXUSLi9DHNyJcR8GW",
"rM4soF4XS3wZrmLurvE6ZmudG16Lk5Dur5");
783 test(
"sEdVNKeu1Lhpfh7Nf6tRDbxnmMyZ4Dv",
"r4ZwJxq6FDtWjapDtCGhjG6mtNm1nWdJcD");
784 test(
"sEd7bK4gf5BHJ1WbaEWx8pKMA9MLHpC",
"rD6tnn51m4o1uXeEK9CFrZ3HR7DcFhiYnp");
785 test(
"sEd7jCh3ppnQMsLdGcZ6TZayZaHhBLg",
"rTcBkiRQ1EfFQ4FCCwqXNHpn1yUTAACkj");
786 test(
"sEdTFJezurQwSJAbkLygj2gQXBut2wh",
"rnXaMacNbRwcJddbbPbqdcpSUQcfzFmrR8");
787 test(
"sEdSWajfQAAWFuDvVZF3AiGucReByLt",
"rBJtow6V3GTdsWMamrxetRDwWs6wwTxcKa");