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