rippled
Loading...
Searching...
No Matches
ValidatorKeys_test.cpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright 2017 Ripple Labs Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#include <test/jtx/Env.h>
21
22#include <xrpld/app/misc/Manifest.h>
23#include <xrpld/app/misc/ValidatorKeys.h>
24#include <xrpld/core/Config.h>
25#include <xrpld/core/ConfigSections.h>
26
27#include <xrpl/basics/base64.h>
28#include <xrpl/beast/unit_test.h>
29
30#include <string>
31
32namespace ripple {
33namespace test {
34
36{
37 // Used with [validation_seed]
38 std::string const seed = "shUwVw52ofnCUX5m7kPTKzJdr4HEH";
39
40 // Used with [validation_token]
42 "paQmjZ37pKKPMrgadBLsuf9ab7Y7EUNzh27LQrZqoexpAs31nJi";
43
45 " "
46 "eyJ2YWxpZGF0aW9uX3NlY3JldF9rZXkiOiI5ZWQ0NWY4NjYyNDFjYzE4YTI3NDdiNT\n",
47 " \tQzODdjMDYyNTkwNzk3MmY0ZTcxOTAyMzFmYWE5Mzc0NTdmYTlkYWY2IiwibWFuaWZl "
48 " \n",
49 "\tc3QiOiJKQUFBQUFGeEllMUZ0d21pbXZHdEgyaUNjTUpxQzlnVkZLaWxHZncxL3ZDeE"
50 "\n",
51 "\t "
52 "hYWExwbGMyR25NaEFrRTFhZ3FYeEJ3RHdEYklENk9NU1l1TTBGREFscEFnTms4U0tG\t "
53 "\t\n",
54 "bjdNTzJmZGtjd1JRSWhBT25ndTlzQUtxWFlvdUorbDJWMFcrc0FPa1ZCK1pSUzZQU2\n",
55 "hsSkFmVXNYZkFpQnNWSkdlc2FhZE9KYy9hQVpva1MxdnltR21WcmxIUEtXWDNZeXd1\n",
56 "NmluOEhBU1FLUHVnQkQ2N2tNYVJGR3ZtcEFUSGxHS0pkdkRGbFdQWXk1QXFEZWRGdj\n",
57 "VUSmEydzBpMjFlcTNNWXl3TFZKWm5GT3I3QzBrdzJBaVR6U0NqSXpkaXRROD0ifQ==\n"};
58
60 "JAAAAAFxIe1FtwmimvGtH2iCcMJqC9gVFKilGfw1/vCxHXXLplc2GnMhAkE1agqXxBwD"
61 "wDbID6OMSYuM0FDAlpAgNk8SKFn7MO2fdkcwRQIhAOngu9sAKqXYouJ+l2V0W+sAOkVB"
62 "+ZRS6PShlJAfUsXfAiBsVJGesaadOJc/aAZokS1vymGmVrlHPKWX3Yywu6in8HASQKPu"
63 "gBD67kMaRFGvmpATHlGKJdvDFlWPYy5AqDedFv5TJa2w0i21eq3MYywLVJZnFOr7C0kw"
64 "2AiTzSCjIzditQ8=";
65
66 // Manifest does not match private key
68 "eyJtYW5pZmVzdCI6IkpBQUFBQVZ4SWUyOVVBdzViZFJudHJ1elVkREk4aDNGV1JWZl\n",
69 "k3SXVIaUlKQUhJd3MxdzZzM01oQWtsa1VXQWR2RnFRVGRlSEpvS1pNY0hlS0RzOExo\n",
70 "b3d3bDlHOEdkVGNJbmFka1l3UkFJZ0h2Q01lQU1aSzlqQnV2aFhlaFRLRzVDQ3BBR1\n",
71 "k0bGtvZHRXYW84UGhzR3NDSUREVTA1d1c3bWNiMjlVNkMvTHBpZmgvakZPRGhFR21i\n",
72 "NWF6dTJMVHlqL1pjQkpBbitmNGhtQTQ0U0tYbGtTTUFqak1rSWRyR1Rxa21SNjBzVG\n",
73 "JaTjZOOUYwdk9UV3VYcUZ6eDFoSGIyL0RqWElVZXhDVGlITEcxTG9UdUp1eXdXbk55\n",
74 "RFE9PSIsInZhbGlkYXRpb25fc2VjcmV0X2tleSI6IjkyRDhCNDBGMzYwMTc5MTkwMU\n",
75 "MzQTUzMzI3NzBDMkUwMTA4MDI0NTZFOEM2QkI0NEQ0N0FFREQ0NzJGMDQ2RkYifQ==\n"};
76
77public:
78 void
79 run() override
80 {
81 // We're only using Env for its Journal. That Journal gives better
82 // coverage in unit tests.
84 *this,
86 nullptr,
88 beast::Journal journal{env.app().journal("ValidatorKeys_test")};
89
90 // Keys/ID when using [validation_seed]
91 SecretKey const seedSecretKey =
92 generateSecretKey(KeyType::secp256k1, *parseBase58<Seed>(seed));
93 PublicKey const seedPublicKey =
94 derivePublicKey(KeyType::secp256k1, seedSecretKey);
95 NodeID const seedNodeID = calcNodeID(seedPublicKey);
96
97 // Keys when using [validation_token]
98 auto const tokenSecretKey =
99 *parseBase58<SecretKey>(TokenType::NodePrivate, tokenSecretStr);
100
101 auto const tokenPublicKey =
102 derivePublicKey(KeyType::secp256k1, tokenSecretKey);
103
105 BEAST_EXPECT(m);
106 NodeID const tokenNodeID = calcNodeID(m->masterKey);
107
108 {
109 // No config -> no key but valid
110 Config c;
111 ValidatorKeys k{c, journal};
112 BEAST_EXPECT(!k.keys);
113 BEAST_EXPECT(k.manifest.empty());
114 BEAST_EXPECT(!k.configInvalid());
115 }
116 {
117 // validation seed section -> empty manifest and valid seeds
118 Config c;
119 c.section(SECTION_VALIDATION_SEED).append(seed);
120
121 ValidatorKeys k{c, journal};
122 if (BEAST_EXPECT(k.keys))
123 {
124 BEAST_EXPECT(k.keys->publicKey == seedPublicKey);
125 BEAST_EXPECT(k.keys->secretKey == seedSecretKey);
126 }
127 BEAST_EXPECT(k.nodeID == seedNodeID);
128 BEAST_EXPECT(k.manifest.empty());
129 BEAST_EXPECT(!k.configInvalid());
130 }
131
132 {
133 // validation seed bad seed -> invalid
134 Config c;
135 c.section(SECTION_VALIDATION_SEED).append("badseed");
136
137 ValidatorKeys k{c, journal};
138 BEAST_EXPECT(k.configInvalid());
139 BEAST_EXPECT(!k.keys);
140 BEAST_EXPECT(k.manifest.empty());
141 }
142
143 {
144 // validator token
145 Config c;
146 c.section(SECTION_VALIDATOR_TOKEN).append(tokenBlob);
147 ValidatorKeys k{c, journal};
148
149 if (BEAST_EXPECT(k.keys))
150 {
151 BEAST_EXPECT(k.keys->publicKey == tokenPublicKey);
152 BEAST_EXPECT(k.keys->secretKey == tokenSecretKey);
153 }
154 BEAST_EXPECT(k.nodeID == tokenNodeID);
155 BEAST_EXPECT(k.manifest == tokenManifest);
156 BEAST_EXPECT(!k.configInvalid());
157 }
158 {
159 // invalid validator token
160 Config c;
161 c.section(SECTION_VALIDATOR_TOKEN).append("badtoken");
162 ValidatorKeys k{c, journal};
163 BEAST_EXPECT(k.configInvalid());
164 BEAST_EXPECT(!k.keys);
165 BEAST_EXPECT(k.manifest.empty());
166 }
167
168 {
169 // Cannot specify both
170 Config c;
171 c.section(SECTION_VALIDATION_SEED).append(seed);
172 c.section(SECTION_VALIDATOR_TOKEN).append(tokenBlob);
173 ValidatorKeys k{c, journal};
174
175 BEAST_EXPECT(k.configInvalid());
176 BEAST_EXPECT(!k.keys);
177 BEAST_EXPECT(k.manifest.empty());
178 }
179
180 {
181 // Token manifest and private key must match
182 Config c;
183 c.section(SECTION_VALIDATOR_TOKEN).append(invalidTokenBlob);
184 ValidatorKeys k{c, journal};
185
186 BEAST_EXPECT(k.configInvalid());
187 BEAST_EXPECT(!k.keys);
188 BEAST_EXPECT(k.manifest.empty());
189 }
190 }
191}; // namespace test
192
193BEAST_DEFINE_TESTSUITE(ValidatorKeys, app, ripple);
194
195} // namespace test
196} // namespace ripple
A generic endpoint for log messages.
Definition: Journal.h:60
A testsuite class.
Definition: suite.h:55
Section & section(std::string const &name)
Returns the section with the given name.
A public key.
Definition: PublicKey.h:61
A secret key.
Definition: SecretKey.h:38
void append(std::vector< std::string > const &lines)
Append a set of lines to this section.
Definition: BasicConfig.cpp:47
Validator keys and manifest as set in configuration file.
Definition: ValidatorKeys.h:38
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:121
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Definition: envconfig.h:54
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:25
std::optional< Manifest > deserializeManifest(Slice s, beast::Journal journal)
Constructs Manifest from serialized string.
Definition: Manifest.cpp:54
std::string base64_decode(std::string_view data)
PublicKey derivePublicKey(KeyType type, SecretKey const &sk)
Derive the public key from a secret key.
Definition: SecretKey.cpp:331
SecretKey generateSecretKey(KeyType type, Seed const &seed)
Generate a new secret key deterministically.
Definition: SecretKey.cpp:309
NodeID calcNodeID(PublicKey const &)
Calculate the 160-bit node ID from a node public key.
Definition: PublicKey.cpp:319