20 #include <ripple/basics/StringUtilities.h>
21 #include <ripple/json/json_value.h>
22 #include <ripple/json/json_writer.h>
23 #include <ripple/protocol/ErrorCodes.h>
24 #include <ripple/protocol/jss.h>
25 #include <ripple/rpc/handlers/WalletPropose.h>
26 #include <ripple/rpc/impl/RPCHelpers.h>
27 #include <test/jtx/TestSuite.h>
49 "SCAT BERN ISLE FOR ROIL BUS SOAK AQUA FREE FOR DRAM BRIG";
50 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.",
69 "r4qV6xTXerqaZav3MJfSY79ynmc1BSBev1",
73 "aKEQmgLMyZPMruJFejUuedp169LgW6DbJt1rej1DJ5hWUMH4pHJ7",
74 "ED54C3F5BEDA8BD588B203D23A27398FAD9D20F88A974007D6994659CD7273FE1D",
75 "77AAED2698D56D6676323629160F4EEF21CFD9EE3D0745CC78FA291461F98278",
77 "This wallet was generated using a user-supplied "
78 "passphrase that has low entropy and is vulnerable "
79 "to brute-force attacks.",
83 "rBcvXmNb7KPkNdMkpckdWPpbvkWgcV3nir",
84 "TED AVON CAVE HOUR BRAG JEFF RIFT NEAL TOLD FAT SEW SAN",
85 "shKdhWka8hS7Es3bpctCZXBiAwfUN",
86 "74BA8389B44F98CF41E795CD91F9C93F",
87 "aBRL2sqVuzrsM6zikPB4v8UBHGn1aKkrsxhYEffhcQxB2LKyywE5",
88 "03BD334FB9E06C58D69603E9922686528B18A754BC2F2E1ADA095FFE67DE952C64",
89 "84262FB16AA25BE407174C7EDAB531220C30FA4D8A28AA9D564673FB3D34502C",
90 "A4yKIRGdzrw0YQ$2%TFKYG9HP*&ok^!sy7E@RwICs",
91 "This wallet was generated using a user-supplied "
92 "passphrase. It may be vulnerable to brute-force "
104 params[jss::key_type] = *keyType;
108 BEAST_EXPECT(result.
isMember(jss::account_id));
109 BEAST_EXPECT(result.
isMember(jss::master_seed));
110 BEAST_EXPECT(result.
isMember(jss::master_seed_hex));
111 BEAST_EXPECT(result.
isMember(jss::public_key));
112 BEAST_EXPECT(result.
isMember(jss::public_key_hex));
113 BEAST_EXPECT(result.
isMember(jss::key_type));
116 result[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);
141 result[jss::key_type],
142 params.
isMember(jss::key_type) ? params[jss::key_type]
156 params[jss::key_type] = *keyType;
160 BEAST_EXPECT(!wallet.isMember(jss::warning));
168 testcase(
"seed_hex");
172 params[jss::key_type] = *keyType;
176 BEAST_EXPECT(!wallet.isMember(jss::warning));
187 params[jss::key_type] = *keyType;
188 params[jss::passphrase] = value;
194 BEAST_EXPECT(!wallet.isMember(jss::warning));
202 testcase(
"passphrase");
215 testcase(keyType ? *keyType :
"no key_type");
224 params[jss::key_type] = *keyType;
235 testcase(
"Bad inputs");
240 params[jss::key_type] =
"secp256k1";
241 params[jss::passphrase] = 20160506;
245 result[jss::error_message] ==
246 "Invalid field 'passphrase', not string.");
251 params[jss::key_type] =
"secp256k1";
256 result[jss::error_message] ==
257 "Invalid field 'seed', not string.");
262 params[jss::key_type] =
"ed25519";
267 result[jss::error_message] ==
268 "Invalid field 'seed_hex', not string.");
274 params[jss::key_type] =
"secp256k1";
281 result[jss::error_message] ==
282 "Exactly one of the following must be specified: passphrase, "
289 params[jss::key_type] =
"prime256v1";
293 BEAST_EXPECT(result[jss::error_message] ==
"Invalid parameters.");
303 result[jss::error_message] ==
304 "Invalid field 'key_type', not string.");
314 result[jss::error_message] ==
315 "Invalid field 'key_type', not string.");
325 "keypairForSignature - " + (keyType ? *keyType :
"no key_type"));
327 auto const publicKey = parseBase58<PublicKey>(
329 BEAST_EXPECT(publicKey);
340 BEAST_EXPECT(ret.first.size() != 0);
341 BEAST_EXPECT(ret.first == publicKey);
351 BEAST_EXPECT(ret.first.size() != 0);
352 BEAST_EXPECT(ret.first == publicKey);
362 BEAST_EXPECT(ret.first.size() != 0);
363 BEAST_EXPECT(ret.first == publicKey);
366 keyType.emplace(
"secp256k1");
373 params[jss::key_type] = *keyType;
378 BEAST_EXPECT(ret.first.size() != 0);
379 BEAST_EXPECT(ret.first == publicKey);
386 params[jss::key_type] = *keyType;
391 BEAST_EXPECT(ret.first.size() != 0);
392 BEAST_EXPECT(ret.first == publicKey);
399 params[jss::key_type] = *keyType;
404 BEAST_EXPECT(ret.first.size() != 0);
405 BEAST_EXPECT(ret.first == publicKey);
416 params[jss::secret] = 314159265;
420 error[jss::error_message] ==
421 "Invalid field 'secret', not string.");
422 BEAST_EXPECT(ret.first.size() == 0);
429 params[jss::secret].
append(
"array:0");
434 error[jss::error_message] ==
435 "Invalid field 'secret', not string.");
436 BEAST_EXPECT(ret.first.size() == 0);
443 params[jss::secret][
"string"] =
"string";
444 params[jss::secret][
"number"] = 702;
448 BEAST_EXPECT(ret.first.size() == 0);
450 error[jss::error_message] ==
451 "Invalid field 'secret', not string.");
458 params[jss::key_type] =
"ed25519";
464 error[jss::error_message] ==
465 "The secret field is not allowed if key_type is used.");
466 BEAST_EXPECT(ret.first.size() == 0);
473 params[jss::key_type] =
"prime256v1";
479 error[jss::error_message] ==
"Invalid field 'key_type'.");
480 BEAST_EXPECT(ret.first.size() == 0);
492 error[jss::error_message] ==
493 "Invalid field 'key_type', not string.");
494 BEAST_EXPECT(ret.first.size() == 0);
506 error[jss::error_message] ==
507 "Invalid field 'key_type', not string.");
508 BEAST_EXPECT(ret.first.size() == 0);
515 params[jss::key_type] =
"secp256k1";
516 params[jss::passphrase] = 1234567890;
521 error[jss::error_message] ==
522 "Invalid field 'passphrase', not string.");
523 BEAST_EXPECT(ret.first.size() == 0);
529 params[jss::key_type] =
"secp256k1";
535 error[jss::error_message] ==
536 "Invalid field 'passphrase', not string.");
537 BEAST_EXPECT(ret.first.size() == 0);
543 params[jss::key_type] =
"secp256k1";
549 error[jss::error_message] ==
550 "Invalid field 'passphrase', not string.");
551 BEAST_EXPECT(ret.first.size() == 0);
557 params[jss::key_type] =
"secp256k1";
558 params[jss::passphrase] =
"";
562 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
563 BEAST_EXPECT(ret.first.size() == 0);
570 params[jss::key_type] =
"secp256k1";
571 params[jss::seed] = 443556;
576 error[jss::error_message] ==
577 "Invalid field 'seed', not string.");
578 BEAST_EXPECT(ret.first.size() == 0);
584 params[jss::key_type] =
"secp256k1";
590 error[jss::error_message] ==
591 "Invalid field 'seed', not string.");
592 BEAST_EXPECT(ret.first.size() == 0);
598 params[jss::key_type] =
"secp256k1";
604 error[jss::error_message] ==
605 "Invalid field 'seed', not string.");
606 BEAST_EXPECT(ret.first.size() == 0);
612 params[jss::key_type] =
"secp256k1";
613 params[jss::seed] =
"";
617 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
618 BEAST_EXPECT(ret.first.size() == 0);
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";
629 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
630 BEAST_EXPECT(ret.first.size() == 0);
636 params[jss::key_type] =
"secp256k1";
637 params[jss::seed] =
"pnnjkbnobnml43679nbvjdsklnbjs";
641 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
642 BEAST_EXPECT(ret.first.size() == 0);
649 params[jss::key_type] =
"secp256k1";
650 params[jss::seed_hex] = 443556;
655 error[jss::error_message] ==
656 "Invalid field 'seed_hex', not string.");
657 BEAST_EXPECT(ret.first.size() == 0);
663 params[jss::key_type] =
"secp256k1";
669 error[jss::error_message] ==
670 "Invalid field 'seed_hex', not string.");
671 BEAST_EXPECT(ret.first.size() == 0);
677 params[jss::key_type] =
"secp256k1";
683 error[jss::error_message] ==
684 "Invalid field 'seed_hex', not string.");
685 BEAST_EXPECT(ret.first.size() == 0);
691 params[jss::key_type] =
"secp256k1";
692 params[jss::seed_hex] =
"";
696 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
697 BEAST_EXPECT(ret.first.size() == 0);
703 params[jss::key_type] =
"secp256k1";
704 params[jss::seed_hex] =
"A670A19B";
708 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
709 BEAST_EXPECT(ret.first.size() == 0);
715 params[jss::key_type] =
"secp256k1";
720 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
721 BEAST_EXPECT(ret.first.size() == 0);
727 params[jss::key_type] =
"secp256k1";
728 params[jss::seed_hex] =
729 "BE6A670A19B209E112146D0A7ED2AAD72567D0FC913";
733 BEAST_EXPECT(error[jss::error_message] ==
"Disallowed seed.");
734 BEAST_EXPECT(ret.first.size() == 0);
741 testcase(
"ripple-lib encoded Ed25519 keys");
743 auto test = [
this](
char const* seed,
char const* addr) {
748 params[jss::passphrase] = seed;
753 BEAST_EXPECT(ret.first.size() != 0);
761 params[jss::key_type] =
"secp256k1";
762 params[jss::passphrase] = seed;
768 error[jss::error_message] ==
769 "Specified seed is for an Ed25519 wallet.");
776 params[jss::key_type] =
"ed25519";
777 params[jss::seed] = seed;
782 BEAST_EXPECT(ret.first.size() != 0);
790 params[jss::key_type] =
"secp256k1";
791 params[jss::seed] = seed;
797 error[jss::error_message] ==
798 "Specified seed is for an Ed25519 wallet.");
803 "sEdVWZmeUDgQdMEFKTK9kYVX71FKB7o",
804 "r34XnDB2zS11NZ1wKJzpU1mjWExGVugTaQ");
806 "sEd7zJoVnqg1FxB9EuaHC1AB5UPfHWz",
807 "rDw51qRrBEeMw7Na1Nh79LN7HYZDo7nZFE");
809 "sEdSxVntbihdLyabbfttMCqsaaucVR9",
810 "rwiyBDfAYegXZyaQcN2L1vAbKRYn2wNFMq");
812 "sEdSVwJjEXTYCztqDK4JD9WByH3otDX",
813 "rQJ4hZzNGkLQhLtKPCmu1ywEw1ai2vgUJN");
815 "sEdV3jXjKuUoQTSr1Rb4yw8Kyn9r46U",
816 "rERRw2Pxbau4tevE61V5vZUwD7Rus5Y6vW");
818 "sEdVeUZjuYT47Uy51FQCnzivsuWyiwB",
819 "rszewT5gRjUgWNEmnfMjvVYzJCkhvWY32i");
821 "sEd7MHTewdw4tFYeS7rk7XT4qHiA9jH",
822 "rBB2rvnf4ztwjgNhinFXQJ91nAZjkFgR3p");
824 "sEd7A5jFBSdWbNeKGriQvLr1thBScJh",
825 "rLAXz8Nz7aDivz7PwThsLFqaKrizepNCdA");
827 "sEdVPU9M2uyzVNT4Yb5Dn4tUtYjbFAw",
828 "rHbHRFPCxD5fnn98TBzsQHJ7SsRq7eHkRj");
830 "sEdVfF2zhAmS8gfMYzJ4yWBMeR4BZKc",
831 "r9PsneKHcAE7kUfiTixomM5Mnwi28tCc7h");
833 "sEdTjRtcsQkwthDXUSLi9DHNyJcR8GW",
834 "rM4soF4XS3wZrmLurvE6ZmudG16Lk5Dur5");
836 "sEdVNKeu1Lhpfh7Nf6tRDbxnmMyZ4Dv",
837 "r4ZwJxq6FDtWjapDtCGhjG6mtNm1nWdJcD");
839 "sEd7bK4gf5BHJ1WbaEWx8pKMA9MLHpC",
840 "rD6tnn51m4o1uXeEK9CFrZ3HR7DcFhiYnp");
842 "sEd7jCh3ppnQMsLdGcZ6TZayZaHhBLg",
843 "rTcBkiRQ1EfFQ4FCCwqXNHpn1yUTAACkj");
845 "sEdTFJezurQwSJAbkLygj2gQXBut2wh",
846 "rnXaMacNbRwcJddbbPbqdcpSUQcfzFmrR8");
848 "sEdSWajfQAAWFuDvVZF3AiGucReByLt",
849 "rBJtow6V3GTdsWMamrxetRDwWs6wwTxcKa");