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 xrpl {
14namespace test {
15
17{
18 // Used with [validation_seed]
19 std::string const seed = "shUwVw52ofnCUX5m7kPTKzJdr4HEH";
20
21 // Used with [validation_token]
22 std::string const tokenSecretStr = "paQmjZ37pKKPMrgadBLsuf9ab7Y7EUNzh27LQrZqoexpAs31nJi";
23
25 " "
26 "eyJ2YWxpZGF0aW9uX3NlY3JldF9rZXkiOiI5ZWQ0NWY4NjYyNDFjYzE4YTI3NDdiNT\n",
27 " \tQzODdjMDYyNTkwNzk3MmY0ZTcxOTAyMzFmYWE5Mzc0NTdmYTlkYWY2IiwibWFuaWZl "
28 " \n",
29 "\tc3QiOiJKQUFBQUFGeEllMUZ0d21pbXZHdEgyaUNjTUpxQzlnVkZLaWxHZncxL3ZDeE"
30 "\n",
31 "\t "
32 "hYWExwbGMyR25NaEFrRTFhZ3FYeEJ3RHdEYklENk9NU1l1TTBGREFscEFnTms4U0tG\t "
33 "\t\n",
34 "bjdNTzJmZGtjd1JRSWhBT25ndTlzQUtxWFlvdUorbDJWMFcrc0FPa1ZCK1pSUzZQU2\n",
35 "hsSkFmVXNYZkFpQnNWSkdlc2FhZE9KYy9hQVpva1MxdnltR21WcmxIUEtXWDNZeXd1\n",
36 "NmluOEhBU1FLUHVnQkQ2N2tNYVJGR3ZtcEFUSGxHS0pkdkRGbFdQWXk1QXFEZWRGdj\n",
37 "VUSmEydzBpMjFlcTNNWXl3TFZKWm5GT3I3QzBrdzJBaVR6U0NqSXpkaXRROD0ifQ==\n"};
38
40 "JAAAAAFxIe1FtwmimvGtH2iCcMJqC9gVFKilGfw1/vCxHXXLplc2GnMhAkE1agqXxBwD"
41 "wDbID6OMSYuM0FDAlpAgNk8SKFn7MO2fdkcwRQIhAOngu9sAKqXYouJ+l2V0W+sAOkVB"
42 "+ZRS6PShlJAfUsXfAiBsVJGesaadOJc/aAZokS1vymGmVrlHPKWX3Yywu6in8HASQKPu"
43 "gBD67kMaRFGvmpATHlGKJdvDFlWPYy5AqDedFv5TJa2w0i21eq3MYywLVJZnFOr7C0kw"
44 "2AiTzSCjIzditQ8=";
45
46 // Manifest does not match private key
48 "eyJtYW5pZmVzdCI6IkpBQUFBQVZ4SWUyOVVBdzViZFJudHJ1elVkREk4aDNGV1JWZl\n",
49 "k3SXVIaUlKQUhJd3MxdzZzM01oQWtsa1VXQWR2RnFRVGRlSEpvS1pNY0hlS0RzOExo\n",
50 "b3d3bDlHOEdkVGNJbmFka1l3UkFJZ0h2Q01lQU1aSzlqQnV2aFhlaFRLRzVDQ3BBR1\n",
51 "k0bGtvZHRXYW84UGhzR3NDSUREVTA1d1c3bWNiMjlVNkMvTHBpZmgvakZPRGhFR21i\n",
52 "NWF6dTJMVHlqL1pjQkpBbitmNGhtQTQ0U0tYbGtTTUFqak1rSWRyR1Rxa21SNjBzVG\n",
53 "JaTjZOOUYwdk9UV3VYcUZ6eDFoSGIyL0RqWElVZXhDVGlITEcxTG9UdUp1eXdXbk55\n",
54 "RFE9PSIsInZhbGlkYXRpb25fc2VjcmV0X2tleSI6IjkyRDhCNDBGMzYwMTc5MTkwMU\n",
55 "MzQTUzMzI3NzBDMkUwMTA4MDI0NTZFOEM2QkI0NEQ0N0FFREQ0NzJGMDQ2RkYifQ==\n"};
56
57public:
58 void
59 run() override
60 {
61 // We're only using Env for its Journal. That Journal gives better
62 // coverage in unit tests.
64 beast::Journal journal{env.app().journal("ValidatorKeys_test")};
65
66 // Keys/ID when using [validation_seed]
67 SecretKey const seedSecretKey = 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 auto const tokenSecretKey = *parseBase58<SecretKey>(TokenType::NodePrivate, tokenSecretStr);
73
74 auto const tokenPublicKey = derivePublicKey(KeyType::secp256k1, tokenSecretKey);
75
77 BEAST_EXPECT(m);
78 NodeID const tokenNodeID = calcNodeID(m->masterKey);
79
80 {
81 // No config -> no key but valid
82 Config c;
83 ValidatorKeys k{c, journal};
84 BEAST_EXPECT(!k.keys);
85 BEAST_EXPECT(k.manifest.empty());
86 BEAST_EXPECT(!k.configInvalid());
87 }
88 {
89 // validation seed section -> empty manifest and valid seeds
90 Config c;
91 c.section(SECTION_VALIDATION_SEED).append(seed);
92
93 ValidatorKeys k{c, journal};
94 if (BEAST_EXPECT(k.keys))
95 {
96 BEAST_EXPECT(k.keys->publicKey == seedPublicKey);
97 BEAST_EXPECT(k.keys->secretKey == seedSecretKey);
98 }
99 BEAST_EXPECT(k.nodeID == seedNodeID);
100 BEAST_EXPECT(k.manifest.empty());
101 BEAST_EXPECT(!k.configInvalid());
102 }
103
104 {
105 // validation seed bad seed -> invalid
106 Config c;
107 c.section(SECTION_VALIDATION_SEED).append("badseed");
108
109 ValidatorKeys k{c, journal};
110 BEAST_EXPECT(k.configInvalid());
111 BEAST_EXPECT(!k.keys);
112 BEAST_EXPECT(k.manifest.empty());
113 }
114
115 {
116 // validator token
117 Config c;
118 c.section(SECTION_VALIDATOR_TOKEN).append(tokenBlob);
119 ValidatorKeys k{c, journal};
120
121 if (BEAST_EXPECT(k.keys))
122 {
123 BEAST_EXPECT(k.keys->publicKey == tokenPublicKey);
124 BEAST_EXPECT(k.keys->secretKey == tokenSecretKey);
125 }
126 BEAST_EXPECT(k.nodeID == tokenNodeID);
127 BEAST_EXPECT(k.manifest == tokenManifest);
128 BEAST_EXPECT(!k.configInvalid());
129 }
130 {
131 // invalid validator token
132 Config c;
133 c.section(SECTION_VALIDATOR_TOKEN).append("badtoken");
134 ValidatorKeys k{c, journal};
135 BEAST_EXPECT(k.configInvalid());
136 BEAST_EXPECT(!k.keys);
137 BEAST_EXPECT(k.manifest.empty());
138 }
139
140 {
141 // Cannot specify both
142 Config c;
143 c.section(SECTION_VALIDATION_SEED).append(seed);
144 c.section(SECTION_VALIDATOR_TOKEN).append(tokenBlob);
145 ValidatorKeys k{c, journal};
146
147 BEAST_EXPECT(k.configInvalid());
148 BEAST_EXPECT(!k.keys);
149 BEAST_EXPECT(k.manifest.empty());
150 }
151
152 {
153 // Token manifest and private key must match
154 Config c;
155 c.section(SECTION_VALIDATOR_TOKEN).append(invalidTokenBlob);
156 ValidatorKeys k{c, journal};
157
158 BEAST_EXPECT(k.configInvalid());
159 BEAST_EXPECT(!k.keys);
160 BEAST_EXPECT(k.manifest.empty());
161 }
162 }
163}; // namespace test
164
165BEAST_DEFINE_TESTSUITE(ValidatorKeys, app, xrpl);
166
167} // namespace test
168} // 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:97
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Definition envconfig.h:34
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.
Definition Manifest.cpp:35
NodeID calcNodeID(PublicKey const &)
Calculate the 160-bit node ID from a node public key.