rippled
Loading...
Searching...
No Matches
ValidatorKeys_test.cpp
1#include <test/jtx/Env.h>
2#include <test/unit_test/utils.h>
3
4#include <xrpld/app/misc/ValidatorKeys.h>
5#include <xrpld/core/Config.h>
6#include <xrpld/core/ConfigSections.h>
7
8#include <xrpl/basics/base64.h>
9#include <xrpl/beast/unit_test.h>
10#include <xrpl/server/Manifest.h>
11
12#include <string>
13
14namespace xrpl {
15namespace test {
16
18{
19 // Used with [validation_seed]
20 std::string const seed = "shUwVw52ofnCUX5m7kPTKzJdr4HEH";
21
22 // Used with [validation_token]
23 std::string const tokenSecretStr = "paQmjZ37pKKPMrgadBLsuf9ab7Y7EUNzh27LQrZqoexpAs31nJi";
24
26 " eyJ2YWxpZGF0aW9uX3NlY3JldF9rZXkiOiI5ZWQ0NWY4NjYyNDFjYzE4YTI3NDdiNT\n",
27 " \tQzODdjMDYyNTkwNzk3MmY0ZTcxOTAyMzFmYWE5Mzc0NTdmYTlkYWY2IiwibWFuaWZl \n",
28 "\tc3QiOiJKQUFBQUFGeEllMUZ0d21pbXZHdEgyaUNjTUpxQzlnVkZLaWxHZncxL3ZDeE\n",
29 "\t hYWExwbGMyR25NaEFrRTFhZ3FYeEJ3RHdEYklENk9NU1l1TTBGREFscEFnTms4U0tG\t \t\n",
30 "bjdNTzJmZGtjd1JRSWhBT25ndTlzQUtxWFlvdUorbDJWMFcrc0FPa1ZCK1pSUzZQU2\n",
31 "hsSkFmVXNYZkFpQnNWSkdlc2FhZE9KYy9hQVpva1MxdnltR21WcmxIUEtXWDNZeXd1\n",
32 "NmluOEhBU1FLUHVnQkQ2N2tNYVJGR3ZtcEFUSGxHS0pkdkRGbFdQWXk1QXFEZWRGdj\n",
33 "VUSmEydzBpMjFlcTNNWXl3TFZKWm5GT3I3QzBrdzJBaVR6U0NqSXpkaXRROD0ifQ==\n",
34 };
35
37 "JAAAAAFxIe1FtwmimvGtH2iCcMJqC9gVFKilGfw1/vCxHXXLplc2GnMhAkE1agqXxBwD"
38 "wDbID6OMSYuM0FDAlpAgNk8SKFn7MO2fdkcwRQIhAOngu9sAKqXYouJ+l2V0W+sAOkVB"
39 "+ZRS6PShlJAfUsXfAiBsVJGesaadOJc/aAZokS1vymGmVrlHPKWX3Yywu6in8HASQKPu"
40 "gBD67kMaRFGvmpATHlGKJdvDFlWPYy5AqDedFv5TJa2w0i21eq3MYywLVJZnFOr7C0kw"
41 "2AiTzSCjIzditQ8=";
42
43 // Manifest does not match private key
45 "eyJtYW5pZmVzdCI6IkpBQUFBQVZ4SWUyOVVBdzViZFJudHJ1elVkREk4aDNGV1JWZl\n",
46 "k3SXVIaUlKQUhJd3MxdzZzM01oQWtsa1VXQWR2RnFRVGRlSEpvS1pNY0hlS0RzOExo\n",
47 "b3d3bDlHOEdkVGNJbmFka1l3UkFJZ0h2Q01lQU1aSzlqQnV2aFhlaFRLRzVDQ3BBR1\n",
48 "k0bGtvZHRXYW84UGhzR3NDSUREVTA1d1c3bWNiMjlVNkMvTHBpZmgvakZPRGhFR21i\n",
49 "NWF6dTJMVHlqL1pjQkpBbitmNGhtQTQ0U0tYbGtTTUFqak1rSWRyR1Rxa21SNjBzVG\n",
50 "JaTjZOOUYwdk9UV3VYcUZ6eDFoSGIyL0RqWElVZXhDVGlITEcxTG9UdUp1eXdXbk55\n",
51 "RFE9PSIsInZhbGlkYXRpb25fc2VjcmV0X2tleSI6IjkyRDhCNDBGMzYwMTc5MTkwMU\n",
52 "MzQTUzMzI3NzBDMkUwMTA4MDI0NTZFOEM2QkI0NEQ0N0FFREQ0NzJGMDQ2RkYifQ==\n",
53 };
54
55public:
56 void
57 run() override
58 {
59 // We're only using Env for its Journal. That Journal gives better
60 // coverage in unit tests.
62 beast::Journal const journal{env.app().getJournal("ValidatorKeys_test")};
63
64 // Keys/ID when using [validation_seed]
65 SecretKey const seedSecretKey =
66 // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
67 generateSecretKey(KeyType::secp256k1, *parseBase58<Seed>(seed));
68 PublicKey const seedPublicKey = derivePublicKey(KeyType::secp256k1, seedSecretKey);
69 NodeID const seedNodeID = calcNodeID(seedPublicKey);
70
71 // Keys when using [validation_token]
72 // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
73 auto const tokenSecretKey = *parseBase58<SecretKey>(TokenType::NodePrivate, tokenSecretStr);
74
75 auto const tokenPublicKey = derivePublicKey(KeyType::secp256k1, tokenSecretKey);
76
78 BEAST_EXPECT(m);
79
80 // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
81 NodeID const tokenNodeID = calcNodeID(m->masterKey);
82
83 {
84 // No config -> no key but valid
85 Config const c;
86 ValidatorKeys const k{c, journal};
87 BEAST_EXPECT(!k.keys);
88 BEAST_EXPECT(k.manifest.empty());
89 BEAST_EXPECT(!k.configInvalid());
90 }
91 {
92 // validation seed section -> empty manifest and valid seeds
93 Config c;
94 c.section(SECTION_VALIDATION_SEED).append(seed);
95
96 ValidatorKeys k{c, journal};
97 if (BEAST_EXPECT(k.keys); k.keys.has_value())
98 {
99 BEAST_EXPECT(k.keys->publicKey == seedPublicKey);
100 BEAST_EXPECT(test::equal(k.keys->secretKey, seedSecretKey));
101 }
102 BEAST_EXPECT(k.nodeID == seedNodeID);
103 BEAST_EXPECT(k.manifest.empty());
104 BEAST_EXPECT(!k.configInvalid());
105 }
106
107 {
108 // validation seed bad seed -> invalid
109 Config c;
110 c.section(SECTION_VALIDATION_SEED).append("badseed");
111
112 ValidatorKeys const k{c, journal};
113 BEAST_EXPECT(k.configInvalid());
114 BEAST_EXPECT(!k.keys);
115 BEAST_EXPECT(k.manifest.empty());
116 }
117
118 {
119 // validator token
120 Config c;
121 c.section(SECTION_VALIDATOR_TOKEN).append(tokenBlob);
122 ValidatorKeys k{c, journal};
123
124 if (BEAST_EXPECT(k.keys); k.keys.has_value())
125 {
126 BEAST_EXPECT(k.keys->publicKey == tokenPublicKey);
127 BEAST_EXPECT(test::equal(k.keys->secretKey, tokenSecretKey));
128 }
129 BEAST_EXPECT(k.nodeID == tokenNodeID);
130 BEAST_EXPECT(k.manifest == tokenManifest);
131 BEAST_EXPECT(!k.configInvalid());
132 }
133 {
134 // invalid validator token
135 Config c;
136 c.section(SECTION_VALIDATOR_TOKEN).append("badtoken");
137 ValidatorKeys const k{c, journal};
138 BEAST_EXPECT(k.configInvalid());
139 BEAST_EXPECT(!k.keys);
140 BEAST_EXPECT(k.manifest.empty());
141 }
142
143 {
144 // Cannot specify both
145 Config c;
146 c.section(SECTION_VALIDATION_SEED).append(seed);
147 c.section(SECTION_VALIDATOR_TOKEN).append(tokenBlob);
148 ValidatorKeys const k{c, journal};
149
150 BEAST_EXPECT(k.configInvalid());
151 BEAST_EXPECT(!k.keys);
152 BEAST_EXPECT(k.manifest.empty());
153 }
154
155 {
156 // Token manifest and private key must match
157 Config c;
158 c.section(SECTION_VALIDATOR_TOKEN).append(invalidTokenBlob);
159 ValidatorKeys const k{c, journal};
160
161 BEAST_EXPECT(k.configInvalid());
162 BEAST_EXPECT(!k.keys);
163 BEAST_EXPECT(k.manifest.empty());
164 }
165 }
166}; // namespace test
167
168BEAST_DEFINE_TESTSUITE(ValidatorKeys, app, xrpl);
169
170} // namespace test
171} // namespace xrpl
A generic endpoint for log messages.
Definition Journal.h:40
A testsuite class.
Definition suite.h:51
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.
Validator keys and manifest as set in configuration file.
std::vector< std::string > const tokenBlob
void run() override
Runs the suite.
std::vector< std::string > const invalidTokenBlob
A transaction testing environment.
Definition Env.h:122
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Definition envconfig.h:34
bool equal(std::unique_ptr< Step > const &s1, DirectStepInfo const &dsi)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
PublicKey derivePublicKey(KeyType type, SecretKey const &sk)
Derive the public key from a secret key.
std::string base64_decode(std::string_view data)
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.