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