mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Add unit tests for wallet keypair generation:
* Allow `passphrase` to be a seed encoded in any of three formats or a
literal passphrase.
* Recognize the absence of `passphrase` as requesting a random seed.
Extract walletPropose() and keypairForSignature() as separately factored
functions (from doWalletPropose() and transactionSign() respectively) to
facilitate unit testing.
This commit is contained in:
committed by
Tom Ritchford
parent
3ec88b3665
commit
436ded68b7
@@ -2705,6 +2705,8 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\rpc\handlers\WalletPropose.cpp">
|
<ClCompile Include="..\..\src\ripple\rpc\handlers\WalletPropose.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\ripple\rpc\handlers\WalletPropose.h">
|
||||||
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\rpc\handlers\WalletSeed.cpp">
|
<ClCompile Include="..\..\src\ripple\rpc\handlers\WalletSeed.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -2743,6 +2745,11 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\rpc\impl\JsonWriter.h">
|
<ClInclude Include="..\..\src\ripple\rpc\impl\JsonWriter.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\ripple\rpc\impl\KeypairForSignature.cpp">
|
||||||
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\ripple\rpc\impl\KeypairForSignature.h">
|
||||||
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\rpc\impl\LegacyPathFind.cpp">
|
<ClCompile Include="..\..\src\ripple\rpc\impl\LegacyPathFind.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -2814,6 +2821,9 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\rpc\tests\JsonWriter.test.cpp">
|
<ClCompile Include="..\..\src\ripple\rpc\tests\JsonWriter.test.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\ripple\rpc\tests\KeyGeneration.test.cpp">
|
||||||
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple\rpc\tests\Status.test.cpp">
|
<ClCompile Include="..\..\src\ripple\rpc\tests\Status.test.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|||||||
@@ -3762,6 +3762,9 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\rpc\handlers\WalletPropose.cpp">
|
<ClCompile Include="..\..\src\ripple\rpc\handlers\WalletPropose.cpp">
|
||||||
<Filter>ripple\rpc\handlers</Filter>
|
<Filter>ripple\rpc\handlers</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\ripple\rpc\handlers\WalletPropose.h">
|
||||||
|
<Filter>ripple\rpc\handlers</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\rpc\handlers\WalletSeed.cpp">
|
<ClCompile Include="..\..\src\ripple\rpc\handlers\WalletSeed.cpp">
|
||||||
<Filter>ripple\rpc\handlers</Filter>
|
<Filter>ripple\rpc\handlers</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -3807,6 +3810,12 @@
|
|||||||
<ClInclude Include="..\..\src\ripple\rpc\impl\JsonWriter.h">
|
<ClInclude Include="..\..\src\ripple\rpc\impl\JsonWriter.h">
|
||||||
<Filter>ripple\rpc\impl</Filter>
|
<Filter>ripple\rpc\impl</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\ripple\rpc\impl\KeypairForSignature.cpp">
|
||||||
|
<Filter>ripple\rpc\impl</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\ripple\rpc\impl\KeypairForSignature.h">
|
||||||
|
<Filter>ripple\rpc\impl</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\rpc\impl\LegacyPathFind.cpp">
|
<ClCompile Include="..\..\src\ripple\rpc\impl\LegacyPathFind.cpp">
|
||||||
<Filter>ripple\rpc\impl</Filter>
|
<Filter>ripple\rpc\impl</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -3891,6 +3900,9 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\rpc\tests\JsonWriter.test.cpp">
|
<ClCompile Include="..\..\src\ripple\rpc\tests\JsonWriter.test.cpp">
|
||||||
<Filter>ripple\rpc\tests</Filter>
|
<Filter>ripple\rpc\tests</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\ripple\rpc\tests\KeyGeneration.test.cpp">
|
||||||
|
<Filter>ripple\rpc\tests</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple\rpc\tests\Status.test.cpp">
|
<ClCompile Include="..\..\src\ripple\rpc\tests\Status.test.cpp">
|
||||||
<Filter>ripple\rpc\tests</Filter>
|
<Filter>ripple\rpc\tests</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
#include <BeastConfig.h>
|
#include <BeastConfig.h>
|
||||||
|
#include <ripple/rpc/handlers/WalletPropose.h>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
|
|
||||||
@@ -25,14 +26,19 @@ namespace ripple {
|
|||||||
// passphrase: <string>
|
// passphrase: <string>
|
||||||
// }
|
// }
|
||||||
Json::Value doWalletPropose (RPC::Context& context)
|
Json::Value doWalletPropose (RPC::Context& context)
|
||||||
|
{
|
||||||
|
return walletPropose (context.params);
|
||||||
|
}
|
||||||
|
|
||||||
|
Json::Value walletPropose (Json::Value const& params)
|
||||||
{
|
{
|
||||||
RippleAddress naSeed;
|
RippleAddress naSeed;
|
||||||
RippleAddress naAccount;
|
RippleAddress naAccount;
|
||||||
|
|
||||||
if (!context.params.isMember ("passphrase"))
|
if (!params.isMember ("passphrase"))
|
||||||
naSeed.setSeedRandom ();
|
naSeed.setSeedRandom ();
|
||||||
|
|
||||||
else if (!naSeed.setSeedGeneric (context.params["passphrase"].asString ()))
|
else if (!naSeed.setSeedGeneric (params["passphrase"].asString ()))
|
||||||
return rpcError(rpcBAD_SEED);
|
return rpcError(rpcBAD_SEED);
|
||||||
|
|
||||||
RippleAddress naGenerator = RippleAddress::createGeneratorPublic (naSeed);
|
RippleAddress naGenerator = RippleAddress::createGeneratorPublic (naSeed);
|
||||||
|
|||||||
31
src/ripple/rpc/handlers/WalletPropose.h
Normal file
31
src/ripple/rpc/handlers/WalletPropose.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of rippled: https://github.com/ripple/rippled
|
||||||
|
Copyright (c) 2015 Ripple Labs Inc.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#ifndef RIPPLED_RIPPLE_RPC_HANDLERS_WALLETPROPOSE_H
|
||||||
|
#define RIPPLED_RIPPLE_RPC_HANDLERS_WALLETPROPOSE_H
|
||||||
|
|
||||||
|
#include <ripple/rpc/impl/JsonObject.h>
|
||||||
|
|
||||||
|
namespace ripple {
|
||||||
|
|
||||||
|
Json::Value walletPropose (Json::Value const& params);
|
||||||
|
|
||||||
|
} // ripple
|
||||||
|
|
||||||
|
#endif
|
||||||
55
src/ripple/rpc/impl/KeypairForSignature.cpp
Normal file
55
src/ripple/rpc/impl/KeypairForSignature.cpp
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of rippled: https://github.com/ripple/rippled
|
||||||
|
Copyright (c) 2012-2015 Ripple Labs Inc.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#include <BeastConfig.h>
|
||||||
|
#include <ripple/rpc/impl/KeypairForSignature.h>
|
||||||
|
|
||||||
|
namespace ripple {
|
||||||
|
namespace RPC {
|
||||||
|
|
||||||
|
KeyPair keypairForSignature (Json::Value const& params, Json::Value& error)
|
||||||
|
{
|
||||||
|
if (! params.isMember ("secret"))
|
||||||
|
{
|
||||||
|
error = RPC::missing_field_error ("secret");
|
||||||
|
|
||||||
|
return KeyPair();
|
||||||
|
}
|
||||||
|
|
||||||
|
RippleAddress seed;
|
||||||
|
|
||||||
|
if (! seed.setSeedGeneric (params["secret"].asString ()))
|
||||||
|
{
|
||||||
|
error = RPC::make_error (rpcBAD_SEED,
|
||||||
|
RPC::invalid_field_message ("secret"));
|
||||||
|
|
||||||
|
return KeyPair();
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyPair result;
|
||||||
|
|
||||||
|
RippleAddress generator = RippleAddress::createGeneratorPublic (seed);
|
||||||
|
result.secretKey.setAccountPrivate (generator, seed, 0);
|
||||||
|
result.publicKey.setAccountPublic (generator, 0);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // RPC
|
||||||
|
} // ripple
|
||||||
40
src/ripple/rpc/impl/KeypairForSignature.h
Normal file
40
src/ripple/rpc/impl/KeypairForSignature.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of rippled: https://github.com/ripple/rippled
|
||||||
|
Copyright (c) 2015 Ripple Labs Inc.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#ifndef RIPPLE_RPC_SIGNATUREKEYPAIR_H_INCLUDED
|
||||||
|
#define RIPPLE_RPC_SIGNATUREKEYPAIR_H_INCLUDED
|
||||||
|
|
||||||
|
#include <ripple/json/json_reader.h>
|
||||||
|
#include <ripple/protocol/RippleAddress.h>
|
||||||
|
|
||||||
|
namespace ripple {
|
||||||
|
namespace RPC {
|
||||||
|
|
||||||
|
struct KeyPair
|
||||||
|
{
|
||||||
|
RippleAddress secretKey;
|
||||||
|
RippleAddress publicKey;
|
||||||
|
};
|
||||||
|
|
||||||
|
KeyPair keypairForSignature (Json::Value const& params, Json::Value& error);
|
||||||
|
|
||||||
|
} // RPC
|
||||||
|
} // ripple
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
#include <ripple/basics/StringUtilities.h>
|
#include <ripple/basics/StringUtilities.h>
|
||||||
#include <ripple/json/json_reader.h>
|
#include <ripple/json/json_reader.h>
|
||||||
#include <ripple/protocol/TxFlags.h>
|
#include <ripple/protocol/TxFlags.h>
|
||||||
|
#include <ripple/rpc/impl/KeypairForSignature.h>
|
||||||
#include <ripple/rpc/impl/TransactionSign.h>
|
#include <ripple/rpc/impl/TransactionSign.h>
|
||||||
#include <beast/unit_test/suite.h>
|
#include <beast/unit_test/suite.h>
|
||||||
|
|
||||||
@@ -335,18 +336,16 @@ transactionSign (
|
|||||||
|
|
||||||
WriteLog (lsDEBUG, RPCHandler) << "transactionSign: " << params;
|
WriteLog (lsDEBUG, RPCHandler) << "transactionSign: " << params;
|
||||||
|
|
||||||
if (! params.isMember ("secret"))
|
KeyPair const keypair = keypairForSignature (params, jvResult);
|
||||||
return RPC::missing_field_error ("secret");
|
|
||||||
|
if (contains_error (jvResult))
|
||||||
|
{
|
||||||
|
return jvResult;
|
||||||
|
}
|
||||||
|
|
||||||
if (! params.isMember ("tx_json"))
|
if (! params.isMember ("tx_json"))
|
||||||
return RPC::missing_field_error ("tx_json");
|
return RPC::missing_field_error ("tx_json");
|
||||||
|
|
||||||
RippleAddress naSeed;
|
|
||||||
|
|
||||||
if (! naSeed.setSeedGeneric (params["secret"].asString ()))
|
|
||||||
return RPC::make_error (rpcBAD_SEED,
|
|
||||||
RPC::invalid_field_message ("secret"));
|
|
||||||
|
|
||||||
Json::Value& tx_json (params ["tx_json"]);
|
Json::Value& tx_json (params ["tx_json"]);
|
||||||
|
|
||||||
if (! tx_json.isObject ())
|
if (! tx_json.isObject ())
|
||||||
@@ -426,20 +425,13 @@ transactionSign (
|
|||||||
return rpcError (rpcSRC_ACT_NOT_FOUND);
|
return rpcError (rpcSRC_ACT_NOT_FOUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
RippleAddress secret = RippleAddress::createSeedGeneric (
|
|
||||||
params["secret"].asString ());
|
|
||||||
RippleAddress masterGenerator = RippleAddress::createGeneratorPublic (
|
|
||||||
secret);
|
|
||||||
RippleAddress masterAccountPublic = RippleAddress::createAccountPublic (
|
|
||||||
masterGenerator, 0);
|
|
||||||
|
|
||||||
if (verify)
|
if (verify)
|
||||||
{
|
{
|
||||||
WriteLog (lsTRACE, RPCHandler) <<
|
WriteLog (lsTRACE, RPCHandler) <<
|
||||||
"verify: " << masterAccountPublic.humanAccountID () <<
|
"verify: " << keypair.publicKey.humanAccountID() <<
|
||||||
" : " << raSrcAddressID.humanAccountID ();
|
" : " << raSrcAddressID.humanAccountID ();
|
||||||
|
|
||||||
auto const secretAccountID = masterAccountPublic.getAccountID();
|
auto const secretAccountID = keypair.publicKey.getAccountID();
|
||||||
if (raSrcAddressID.getAccountID () == secretAccountID)
|
if (raSrcAddressID.getAccountID () == secretAccountID)
|
||||||
{
|
{
|
||||||
if (ledgerFacade.accountMasterDisabled ())
|
if (ledgerFacade.accountMasterDisabled ())
|
||||||
@@ -462,7 +454,7 @@ transactionSign (
|
|||||||
std::unique_ptr<STObject> sopTrans = std::move(parsed.object);
|
std::unique_ptr<STObject> sopTrans = std::move(parsed.object);
|
||||||
sopTrans->setFieldVL (
|
sopTrans->setFieldVL (
|
||||||
sfSigningPubKey,
|
sfSigningPubKey,
|
||||||
masterAccountPublic.getAccountPublic ());
|
keypair.publicKey.getAccountPublic());
|
||||||
|
|
||||||
STTx::pointer stpTrans;
|
STTx::pointer stpTrans;
|
||||||
|
|
||||||
@@ -489,10 +481,8 @@ transactionSign (
|
|||||||
|
|
||||||
// FIXME: For performance, transactions should not be signed in this code
|
// FIXME: For performance, transactions should not be signed in this code
|
||||||
// path.
|
// path.
|
||||||
RippleAddress naAccountPrivate = RippleAddress::createAccountPrivate (
|
|
||||||
masterGenerator, secret, 0);
|
|
||||||
|
|
||||||
stpTrans->sign (naAccountPrivate);
|
stpTrans->sign (keypair.secretKey);
|
||||||
|
|
||||||
Transaction::pointer tpTrans;
|
Transaction::pointer tpTrans;
|
||||||
|
|
||||||
|
|||||||
178
src/ripple/rpc/tests/KeyGeneration.test.cpp
Normal file
178
src/ripple/rpc/tests/KeyGeneration.test.cpp
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of rippled: https://github.com/ripple/rippled
|
||||||
|
Copyright (c) 2015 Ripple Labs Inc.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#include <BeastConfig.h>
|
||||||
|
#include <ripple/basics/StringUtilities.h>
|
||||||
|
#include <ripple/basics/TestSuite.h>
|
||||||
|
#include <ripple/rpc/handlers/WalletPropose.h>
|
||||||
|
#include <ripple/rpc/impl/KeypairForSignature.h>
|
||||||
|
|
||||||
|
namespace ripple {
|
||||||
|
|
||||||
|
namespace RPC {
|
||||||
|
|
||||||
|
struct key_strings
|
||||||
|
{
|
||||||
|
char const* account_id;
|
||||||
|
char const* master_key;
|
||||||
|
char const* master_seed;
|
||||||
|
char const* master_seed_hex;
|
||||||
|
char const* public_key;
|
||||||
|
char const* public_key_hex;
|
||||||
|
char const* secret_key_hex;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace common {
|
||||||
|
static char const* passphrase = "REINDEER FLOTILLA";
|
||||||
|
static char const* master_key = "SCAT BERN ISLE FOR ROIL BUS SOAK AQUA FREE FOR DRAM BRIG";
|
||||||
|
static char const* master_seed = "snMwVWs2hZzfDUF3p2tHZ3EgmyhFs";
|
||||||
|
static char const* master_seed_hex = "BE6A670A19B209E112146D0A7ED2AAD7";
|
||||||
|
}
|
||||||
|
|
||||||
|
static key_strings const secp256k1_strings =
|
||||||
|
{
|
||||||
|
"r4Vtj2jrfmTVZGfSP3gH9hQPMqFPQFin8f",
|
||||||
|
common::master_key,
|
||||||
|
common::master_seed,
|
||||||
|
common::master_seed_hex,
|
||||||
|
"aBQxK2YFNqzmAaXNczYcjqDjfiKkLsJUizsr1UBf44RCF8FHdrmX",
|
||||||
|
"038AAE247B2344B1837FBED8F57389C8C11774510A3F7D784F2A09F0CB6843236C",
|
||||||
|
"1949ECD889EA71324BC7A30C8E81F4E93CB73EE19D59E9082111E78CC3DDABC2",
|
||||||
|
};
|
||||||
|
|
||||||
|
class WalletPropose_test : public ripple::TestSuite
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void testRandomWallet()
|
||||||
|
{
|
||||||
|
Json::Value params;
|
||||||
|
Json::Value result = walletPropose (params);
|
||||||
|
|
||||||
|
expect (! contains_error (result));
|
||||||
|
expect (result.isMember ("account_id"));
|
||||||
|
expect (result.isMember ("master_key"));
|
||||||
|
expect (result.isMember ("master_seed"));
|
||||||
|
expect (result.isMember ("master_seed_hex"));
|
||||||
|
expect (result.isMember ("public_key"));
|
||||||
|
expect (result.isMember ("public_key_hex"));
|
||||||
|
|
||||||
|
std::string seed = result["master_seed"].asString();
|
||||||
|
|
||||||
|
result = walletPropose (params);
|
||||||
|
|
||||||
|
// We asked for two random seeds, so they shouldn't match.
|
||||||
|
expect (result["master_seed"].asString() != seed, seed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testSecretWallet (Json::Value const& params, key_strings const& s)
|
||||||
|
{
|
||||||
|
Json::Value result = walletPropose (params);
|
||||||
|
|
||||||
|
expect (! contains_error (result));
|
||||||
|
expectEquals (result["account_id"], s.account_id);
|
||||||
|
expectEquals (result["master_key"], s.master_key);
|
||||||
|
expectEquals (result["master_seed"], s.master_seed);
|
||||||
|
expectEquals (result["master_seed_hex"], s.master_seed_hex);
|
||||||
|
expectEquals (result["public_key"], s.public_key);
|
||||||
|
expectEquals (result["public_key_hex"], s.public_key_hex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testLegacyPassphrase (char const* value)
|
||||||
|
{
|
||||||
|
testcase (value);
|
||||||
|
|
||||||
|
Json::Value params;
|
||||||
|
params["passphrase"] = value;
|
||||||
|
|
||||||
|
testSecretWallet (params, secp256k1_strings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testLegacyPassphrase()
|
||||||
|
{
|
||||||
|
testLegacyPassphrase (common::passphrase);
|
||||||
|
testLegacyPassphrase (secp256k1_strings.master_key);
|
||||||
|
testLegacyPassphrase (secp256k1_strings.master_seed);
|
||||||
|
testLegacyPassphrase (secp256k1_strings.master_seed_hex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void run()
|
||||||
|
{
|
||||||
|
testRandomWallet();
|
||||||
|
testLegacyPassphrase();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class KeypairForSignature_test : public ripple::TestSuite
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void testEmpty()
|
||||||
|
{
|
||||||
|
Json::Value params;
|
||||||
|
Json::Value error;
|
||||||
|
|
||||||
|
(void) keypairForSignature (params, error);
|
||||||
|
|
||||||
|
expect (contains_error (error) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void testSecretWallet (Json::Value const& params, key_strings const& s)
|
||||||
|
{
|
||||||
|
Json::Value error;
|
||||||
|
KeyPair keypair = keypairForSignature (params, error);
|
||||||
|
|
||||||
|
uint256 secret_key = keypair.secretKey.getAccountPrivate();
|
||||||
|
Blob public_key = keypair.publicKey.getAccountPublic();
|
||||||
|
|
||||||
|
std::string secret_key_hex = strHex (secret_key.data(), secret_key.size());
|
||||||
|
std::string public_key_hex = strHex (public_key.data(), public_key.size());
|
||||||
|
|
||||||
|
expectEquals (secret_key_hex, s.secret_key_hex);
|
||||||
|
expectEquals (public_key_hex, s.public_key_hex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testLegacySecret (char const* value)
|
||||||
|
{
|
||||||
|
testcase (value);
|
||||||
|
|
||||||
|
Json::Value params;
|
||||||
|
params["secret"] = value;
|
||||||
|
|
||||||
|
testSecretWallet (params, secp256k1_strings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testLegacySecret()
|
||||||
|
{
|
||||||
|
testLegacySecret (common::passphrase);
|
||||||
|
testLegacySecret (secp256k1_strings.master_key);
|
||||||
|
testLegacySecret (secp256k1_strings.master_seed);
|
||||||
|
testLegacySecret (secp256k1_strings.master_seed_hex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void run()
|
||||||
|
{
|
||||||
|
testEmpty();
|
||||||
|
testLegacySecret();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
BEAST_DEFINE_TESTSUITE(WalletPropose,ripple_basics,ripple);
|
||||||
|
BEAST_DEFINE_TESTSUITE(KeypairForSignature,ripple_basics,ripple);
|
||||||
|
|
||||||
|
} // RPC
|
||||||
|
} // ripple
|
||||||
@@ -99,6 +99,7 @@
|
|||||||
#include <ripple/rpc/impl/Accounts.cpp>
|
#include <ripple/rpc/impl/Accounts.cpp>
|
||||||
#include <ripple/rpc/impl/GetMasterGenerator.cpp>
|
#include <ripple/rpc/impl/GetMasterGenerator.cpp>
|
||||||
#include <ripple/rpc/impl/Handler.cpp>
|
#include <ripple/rpc/impl/Handler.cpp>
|
||||||
|
#include <ripple/rpc/impl/KeypairForSignature.cpp>
|
||||||
#include <ripple/rpc/impl/LegacyPathFind.cpp>
|
#include <ripple/rpc/impl/LegacyPathFind.cpp>
|
||||||
#include <ripple/rpc/impl/LookupLedger.cpp>
|
#include <ripple/rpc/impl/LookupLedger.cpp>
|
||||||
#include <ripple/rpc/impl/ParseAccountIds.cpp>
|
#include <ripple/rpc/impl/ParseAccountIds.cpp>
|
||||||
@@ -109,6 +110,7 @@
|
|||||||
#include <ripple/rpc/tests/JsonObject.test.cpp>
|
#include <ripple/rpc/tests/JsonObject.test.cpp>
|
||||||
#include <ripple/rpc/tests/JSONRPC.test.cpp>
|
#include <ripple/rpc/tests/JSONRPC.test.cpp>
|
||||||
#include <ripple/rpc/tests/JsonWriter.test.cpp>
|
#include <ripple/rpc/tests/JsonWriter.test.cpp>
|
||||||
|
#include <ripple/rpc/tests/KeyGeneration.test.cpp>
|
||||||
#include <ripple/rpc/tests/Status.test.cpp>
|
#include <ripple/rpc/tests/Status.test.cpp>
|
||||||
#include <ripple/rpc/tests/WriteJson.test.cpp>
|
#include <ripple/rpc/tests/WriteJson.test.cpp>
|
||||||
#include <ripple/rpc/tests/Yield.test.cpp>
|
#include <ripple/rpc/tests/Yield.test.cpp>
|
||||||
|
|||||||
Reference in New Issue
Block a user