xrpld
Loading...
Searching...
No Matches
ValidatorKeys_test.cpp
1#include <test/jtx/Env.h>
2#include <test/jtx/envconfig.h>
3#include <test/unit_test/utils.h>
4
5#include <xrpld/app/misc/ValidatorKeys.h>
6#include <xrpld/core/Config.h>
7
8#include <xrpl/basics/base64.h>
9#include <xrpl/beast/unit_test/suite.h>
10#include <xrpl/beast/utility/Journal.h>
11#include <xrpl/config/Constants.h>
12#include <xrpl/protocol/KeyType.h>
13#include <xrpl/protocol/PublicKey.h>
14#include <xrpl/protocol/SecretKey.h>
15#include <xrpl/protocol/Seed.h>
16#include <xrpl/protocol/UintTypes.h>
17#include <xrpl/protocol/tokens.h>
18#include <xrpl/server/Manifest.h>
19
20#include <string>
21#include <vector>
22
23namespace xrpl::test {
24
26{
27 // Used with [validation_seed]
28 std::string const seed_ = "shUwVw52ofnCUX5m7kPTKzJdr4HEH";
29
30 // Used with [validation_token]
31 std::string const tokenSecretStr_ = "paQmjZ37pKKPMrgadBLsuf9ab7Y7EUNzh27LQrZqoexpAs31nJi";
32
34 " eyJ2YWxpZGF0aW9uX3NlY3JldF9rZXkiOiI5ZWQ0NWY4NjYyNDFjYzE4YTI3NDdiNT\n",
35 " \tQzODdjMDYyNTkwNzk3MmY0ZTcxOTAyMzFmYWE5Mzc0NTdmYTlkYWY2IiwibWFuaWZl \n",
36 "\tc3QiOiJKQUFBQUFGeEllMUZ0d21pbXZHdEgyaUNjTUpxQzlnVkZLaWxHZncxL3ZDeE\n",
37 "\t hYWExwbGMyR25NaEFrRTFhZ3FYeEJ3RHdEYklENk9NU1l1TTBGREFscEFnTms4U0tG\t \t\n",
38 "bjdNTzJmZGtjd1JRSWhBT25ndTlzQUtxWFlvdUorbDJWMFcrc0FPa1ZCK1pSUzZQU2\n",
39 "hsSkFmVXNYZkFpQnNWSkdlc2FhZE9KYy9hQVpva1MxdnltR21WcmxIUEtXWDNZeXd1\n",
40 "NmluOEhBU1FLUHVnQkQ2N2tNYVJGR3ZtcEFUSGxHS0pkdkRGbFdQWXk1QXFEZWRGdj\n",
41 "VUSmEydzBpMjFlcTNNWXl3TFZKWm5GT3I3QzBrdzJBaVR6U0NqSXpkaXRROD0ifQ==\n",
42 };
43
45 "JAAAAAFxIe1FtwmimvGtH2iCcMJqC9gVFKilGfw1/vCxHXXLplc2GnMhAkE1agqXxBwD"
46 "wDbID6OMSYuM0FDAlpAgNk8SKFn7MO2fdkcwRQIhAOngu9sAKqXYouJ+l2V0W+sAOkVB"
47 "+ZRS6PShlJAfUsXfAiBsVJGesaadOJc/aAZokS1vymGmVrlHPKWX3Yywu6in8HASQKPu"
48 "gBD67kMaRFGvmpATHlGKJdvDFlWPYy5AqDedFv5TJa2w0i21eq3MYywLVJZnFOr7C0kw"
49 "2AiTzSCjIzditQ8=";
50
51 // Manifest does not match private key
53 "eyJtYW5pZmVzdCI6IkpBQUFBQVZ4SWUyOVVBdzViZFJudHJ1elVkREk4aDNGV1JWZl\n",
54 "k3SXVIaUlKQUhJd3MxdzZzM01oQWtsa1VXQWR2RnFRVGRlSEpvS1pNY0hlS0RzOExo\n",
55 "b3d3bDlHOEdkVGNJbmFka1l3UkFJZ0h2Q01lQU1aSzlqQnV2aFhlaFRLRzVDQ3BBR1\n",
56 "k0bGtvZHRXYW84UGhzR3NDSUREVTA1d1c3bWNiMjlVNkMvTHBpZmgvakZPRGhFR21i\n",
57 "NWF6dTJMVHlqL1pjQkpBbitmNGhtQTQ0U0tYbGtTTUFqak1rSWRyR1Rxa21SNjBzVG\n",
58 "JaTjZOOUYwdk9UV3VYcUZ6eDFoSGIyL0RqWElVZXhDVGlITEcxTG9UdUp1eXdXbk55\n",
59 "RFE9PSIsInZhbGlkYXRpb25fc2VjcmV0X2tleSI6IjkyRDhCNDBGMzYwMTc5MTkwMU\n",
60 "MzQTUzMzI3NzBDMkUwMTA4MDI0NTZFOEM2QkI0NEQ0N0FFREQ0NzJGMDQ2RkYifQ==\n",
61 };
62
63public:
64 void
65 run() override
66 {
67 // We're only using Env for its Journal. That Journal gives better
68 // coverage in unit tests.
70 beast::Journal const journal{env.app().getJournal("ValidatorKeys_test")};
71
72 // Keys/ID when using [validation_seed]
73 SecretKey const seedSecretKey =
74 // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
76 PublicKey const seedPublicKey = derivePublicKey(KeyType::Secp256k1, seedSecretKey);
77 NodeID const seedNodeID = calcNodeID(seedPublicKey);
78
79 // Keys when using [validation_token]
80 auto const tokenSecretKey =
81 // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
83
84 auto const tokenPublicKey = derivePublicKey(KeyType::Secp256k1, tokenSecretKey);
85
87 BEAST_EXPECT(m);
88
89 // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
90 NodeID const tokenNodeID = calcNodeID(m->masterKey);
91
92 {
93 // No config -> no key but valid
94 Config const c;
95 ValidatorKeys const k{c, journal};
96 BEAST_EXPECT(!k.keys);
97 BEAST_EXPECT(k.manifest.empty());
98 BEAST_EXPECT(!k.configInvalid());
99 }
100 {
101 // validation seed section -> empty manifest and valid seeds
102 Config c;
104
105 ValidatorKeys k{c, journal};
106 if (BEAST_EXPECT(k.keys); k.keys.has_value())
107 {
108 BEAST_EXPECT(k.keys->publicKey == seedPublicKey);
109 BEAST_EXPECT(test::equal(k.keys->secretKey, seedSecretKey));
110 }
111 BEAST_EXPECT(k.nodeID == seedNodeID);
112 BEAST_EXPECT(k.manifest.empty());
113 BEAST_EXPECT(!k.configInvalid());
114 }
115
116 {
117 // validation seed bad seed -> invalid
118 Config c;
120
121 ValidatorKeys const k{c, journal};
122 BEAST_EXPECT(k.configInvalid());
123 BEAST_EXPECT(!k.keys);
124 BEAST_EXPECT(k.manifest.empty());
125 }
126
127 {
128 // validator token
129 Config c;
131 ValidatorKeys k{c, journal};
132
133 if (BEAST_EXPECT(k.keys); k.keys.has_value())
134 {
135 BEAST_EXPECT(k.keys->publicKey == tokenPublicKey);
136 BEAST_EXPECT(test::equal(k.keys->secretKey, tokenSecretKey));
137 }
138 BEAST_EXPECT(k.nodeID == tokenNodeID);
139 BEAST_EXPECT(k.manifest == tokenManifest_);
140 BEAST_EXPECT(!k.configInvalid());
141 }
142 {
143 // invalid validator token
144 Config c;
146 ValidatorKeys const k{c, journal};
147 BEAST_EXPECT(k.configInvalid());
148 BEAST_EXPECT(!k.keys);
149 BEAST_EXPECT(k.manifest.empty());
150 }
151
152 {
153 // Cannot specify both
154 Config c;
157 ValidatorKeys const k{c, journal};
158
159 BEAST_EXPECT(k.configInvalid());
160 BEAST_EXPECT(!k.keys);
161 BEAST_EXPECT(k.manifest.empty());
162 }
163
164 {
165 // Token manifest and private key must match
166 Config c;
168 ValidatorKeys const k{c, journal};
169
170 BEAST_EXPECT(k.configInvalid());
171 BEAST_EXPECT(!k.keys);
172 BEAST_EXPECT(k.manifest.empty());
173 }
174 }
175}; // namespace test
176
178
179} // namespace xrpl::test
A generic endpoint for log messages.
Definition Journal.h:38
A testsuite class.
Definition suite.h:50
Section & section(std::string const &name)
Returns the section with the given name.
A public key.
Definition PublicKey.h:42
A secret key.
Definition SecretKey.h:18
void append(std::vector< std::string > const &lines)
Append a set of lines to this section.
virtual beast::Journal getJournal(std::string const &name)=0
Validator keys and manifest as set in configuration file.
bool configInvalid() const
std::optional< Keys > keys
std::vector< std::string > const invalidTokenBlob_
void run() override
Runs the suite.
std::vector< std::string > const tokenBlob_
A transaction testing environment.
Definition Env.h:143
Application & app()
Definition Env.h:280
T empty(T... args)
bool equal(STAmount const &sa1, STAmount const &sa2)
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Definition envconfig.h:28
BEAST_DEFINE_TESTSUITE(AMMClawback, app, xrpl)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
std::string base64Decode(std::string_view data)
PublicKey derivePublicKey(KeyType type, SecretKey const &sk)
Derive the public key from a secret key.
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
SecretKey generateSecretKey(KeyType type, Seed const &seed)
Generate a new secret key deterministically.
std::optional< Manifest > deserializeManifest(Slice s, beast::Journal journal)
Constructs Manifest from serialized string.
NodeID calcNodeID(PublicKey const &)
Calculate the 160-bit node ID from a node public key.
BaseUInt< 160, detail::NodeIDTag > NodeID
NodeID is a 160-bit hash representing one node.
Definition UintTypes.h:39
static constexpr auto kValidationSeed
Definition Constants.h:66
static constexpr auto kValidatorToken
Definition Constants.h:72