20 #include <ripple/app/misc/ValidatorList.h>
21 #include <ripple/basics/base64.h>
22 #include <ripple/basics/Slice.h>
23 #include <ripple/basics/strHex.h>
25 #include <ripple/protocol/digest.h>
26 #include <ripple/protocol/HashPrefix.h>
27 #include <ripple/protocol/PublicKey.h>
28 #include <ripple/protocol/SecretKey.h>
29 #include <ripple/protocol/Sign.h>
109 auto const masterPublic =
112 return { masterPublic, signingKeys.first,
114 masterPublic, secret, signingKeys.first, signingKeys.second, 1)) };
128 for (
auto const& val : validators)
130 data +=
"{\"validation_public_key\":\"" +
strHex(val.masterPublic) +
131 "\",\"manifest\":\"" + val.manifest +
"\"},";
154 for (
auto const& pk : pks)
162 testcase (
"Genesis Quorum");
166 auto& app = env.
app();
168 auto trustedKeys = std::make_unique <ValidatorList> (
170 app.config().legacy(
"database_path"),
172 BEAST_EXPECT(trustedKeys->quorum () == 1);
176 auto trustedKeys = std::make_unique <ValidatorList> (
178 app.config().legacy(
"database_path"),
180 BEAST_EXPECT(trustedKeys->quorum () == minQuorum);
187 testcase (
"Config Load");
190 auto& app = env.
app();
196 auto const localSigningPublicOuter = localSigningKeys.first;
197 auto const localSigningSecret = localSigningKeys.second;
203 localMasterPublic, localMasterSecret,
204 localSigningPublicOuter, localSigningSecret, 1));
208 char const* comment =
nullptr)
221 while (configList.
size () != 8)
226 format (configList[0]),
227 format (configList[1],
" Comment"),
228 format (configList[2],
" Multi Word Comment"),
229 format (configList[3],
" Leading Whitespace"),
230 format (configList[4],
" Trailing Whitespace "),
231 format (configList[5],
" Leading & Trailing Whitespace "),
232 format (configList[6],
" Leading, Trailing & Internal Whitespace "),
233 format (configList[7],
" ")
238 auto trustedKeys = std::make_unique <ValidatorList> (
240 app.config().legacy(
"database_path"),
244 BEAST_EXPECT(trustedKeys->load (
245 emptyLocalKey, emptyCfgKeys, emptyCfgPublishers));
248 BEAST_EXPECT(trustedKeys->load (
249 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
250 BEAST_EXPECT(trustedKeys->listed (localSigningPublicOuter));
253 BEAST_EXPECT(trustedKeys->load (
254 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
256 BEAST_EXPECT(trustedKeys->listed (localMasterPublic));
257 BEAST_EXPECT(trustedKeys->listed (localSigningPublicOuter));
262 auto trustedKeys = std::make_unique <ValidatorList> (
264 app.config().legacy(
"database_path"),
267 BEAST_EXPECT(trustedKeys->load (
268 emptyLocalKey, cfgKeys, emptyCfgPublishers));
270 for (
auto const& n : configList)
271 BEAST_EXPECT(trustedKeys->listed (n));
278 format (masterNode1),
279 format (masterNode2,
" Comment")
281 BEAST_EXPECT(trustedKeys->load (
282 emptyLocalKey, cfgMasterKeys, emptyCfgPublishers));
283 BEAST_EXPECT(trustedKeys->listed (masterNode1));
284 BEAST_EXPECT(trustedKeys->listed (masterNode2));
287 BEAST_EXPECT(!trustedKeys->load (emptyLocalKey,
288 {
"NotAPublicKey" }, emptyCfgPublishers));
289 BEAST_EXPECT(!trustedKeys->load (emptyLocalKey,
290 { format (randomNode(),
"!") }, emptyCfgPublishers));
294 BEAST_EXPECT(!trustedKeys->load (emptyLocalKey,
295 { format (randomNode(),
"!"), format (goodKey) },
296 emptyCfgPublishers));
297 BEAST_EXPECT(!trustedKeys->listed (goodKey));
302 auto trustedKeys = std::make_unique <ValidatorList> (
304 app.config().legacy(
"database_path"),
307 auto const localSigningPublic = parseBase58<PublicKey> (
310 BEAST_EXPECT(trustedKeys->load (
311 *localSigningPublic, cfgKeys, emptyCfgPublishers));
313 BEAST_EXPECT(trustedKeys->localPublicKey() == localSigningPublic);
314 BEAST_EXPECT(trustedKeys->listed (*localSigningPublic));
315 for (
auto const& n : configList)
316 BEAST_EXPECT(trustedKeys->listed (n));
321 auto trustedKeys = std::make_unique <ValidatorList> (
323 app.config().legacy(
"database_path"),
327 BEAST_EXPECT(trustedKeys->load (
328 localSigningPublic, cfgKeys, emptyCfgPublishers));
330 BEAST_EXPECT(trustedKeys->localPublicKey() == localSigningPublic);
331 BEAST_EXPECT(trustedKeys->listed (localSigningPublic));
332 for (
auto const& n : configList)
333 BEAST_EXPECT(trustedKeys->listed (n));
338 auto trustedKeys = std::make_unique <ValidatorList> (
340 app.config().legacy(
"database_path"),
345 BEAST_EXPECT(trustedKeys->load (
346 localSigningPublicOuter, cfgKeys, emptyCfgPublishers));
348 BEAST_EXPECT(trustedKeys->localPublicKey() == localMasterPublic);
349 BEAST_EXPECT(trustedKeys->listed (localSigningPublicOuter));
350 BEAST_EXPECT(trustedKeys->listed (localMasterPublic));
351 for (
auto const& n : configList)
352 BEAST_EXPECT(trustedKeys->listed (n));
356 auto trustedKeys = std::make_unique <ValidatorList> (
358 app.config().legacy(
"database_path"),
364 BEAST_EXPECT(!trustedKeys->load (
365 emptyLocalKey, emptyCfgKeys, badPublishers));
370 badPublishers.
clear();
371 for (
auto const& key : keys)
372 badPublishers.push_back (
375 BEAST_EXPECT(! trustedKeys->load (
376 emptyLocalKey, emptyCfgKeys, badPublishers));
377 for (
auto const& key : keys)
378 BEAST_EXPECT(!trustedKeys->trustedPublisher (key));
382 for (
auto const& key : keys)
385 BEAST_EXPECT(trustedKeys->load (
386 emptyLocalKey, emptyCfgKeys, cfgPublishers));
387 for (
auto const& key : keys)
388 BEAST_EXPECT(trustedKeys->trustedPublisher (key));
395 auto trustedKeys = std::make_unique <ValidatorList> (
397 app.config().legacy(
"database_path"),
401 auto const pubRevokedPublic =
410 pubRevokedSigning.first,
411 pubRevokedSigning.second,
420 BEAST_EXPECT(trustedKeys->load (
421 emptyLocalKey, emptyCfgKeys, cfgPublishers));
423 BEAST_EXPECT(!trustedKeys->trustedPublisher (pubRevokedPublic));
424 BEAST_EXPECT(trustedKeys->trustedPublisher (legitKey));
431 testcase (
"Apply list");
437 auto& app = env.
app();
438 auto trustedKeys = std::make_unique<ValidatorList> (
440 app.config().legacy(
"database_path"),
444 auto const publisherPublic =
448 publisherPublic, publisherSecret,
449 pubSigningKeys1.first, pubSigningKeys1.second, 1));
452 strHex(publisherPublic)});
456 BEAST_EXPECT(trustedKeys->load (
457 emptyLocalKey, emptyCfgKeys, cfgKeys1));
459 auto constexpr listSize = 20;
462 while (list1.
size () < listSize)
467 while (list2.
size () < listSize)
471 auto const version = 1;
472 auto const sequence = 1;
474 list1, sequence, env.
timeKeeper().
now().time_since_epoch().count());
475 auto const expiredSig =
signList (expiredblob, pubSigningKeys1);
478 trustedKeys->applyList (
479 manifest1, expiredblob, expiredSig,
480 version, siteUri).disposition);
483 using namespace std::chrono_literals;
487 list1, sequence,
expiration.time_since_epoch().count());
488 auto const sig1 =
signList (blob1, pubSigningKeys1);
491 trustedKeys->applyList ( manifest1, blob1,
492 sig1, version, siteUri).disposition);
494 for (
auto const& val : list1)
496 BEAST_EXPECT(trustedKeys->listed (val.masterPublic));
497 BEAST_EXPECT(trustedKeys->listed (val.signingPublic));
504 pubSigningKeys1.first, pubSigningKeys1.second, 1));
507 untrustedManifest, blob1, sig1, version, siteUri).disposition);
510 auto const badVersion = 666;
512 trustedKeys->applyList (
513 manifest1, blob1, sig1, badVersion, siteUri).disposition);
516 auto const sequence2 = 2;
518 list2, sequence2,
expiration.time_since_epoch().count());
519 auto const sig2 =
signList (blob2, pubSigningKeys1);
522 trustedKeys->applyList (
523 manifest1, blob2, sig2, version, siteUri).disposition);
525 for (
auto const& val : list1)
527 BEAST_EXPECT(! trustedKeys->listed (val.masterPublic));
528 BEAST_EXPECT(! trustedKeys->listed (val.signingPublic));
531 for (
auto const& val : list2)
533 BEAST_EXPECT(trustedKeys->listed (val.masterPublic));
534 BEAST_EXPECT(trustedKeys->listed (val.signingPublic));
539 trustedKeys->applyList (
540 manifest1, blob1, sig1, version, siteUri).disposition);
543 trustedKeys->applyList (
544 manifest1, blob2, sig2, version, siteUri).disposition);
549 publisherPublic, publisherSecret,
550 pubSigningKeys2.first, pubSigningKeys2.second, 2));
552 auto const sequence3 = 3;
554 list1, sequence3,
expiration.time_since_epoch().count());
555 auto const sig3 =
signList (blob3, pubSigningKeys2);
558 trustedKeys->applyList (
559 manifest2, blob3, sig3, version, siteUri).disposition);
561 auto const sequence4 = 4;
563 list1, sequence4,
expiration.time_since_epoch().count());
564 auto const badSig =
signList (blob4, pubSigningKeys1);
566 trustedKeys->applyList (
567 manifest1, blob4, badSig, version, siteUri).disposition);
573 publisherPublic, publisherSecret));
575 auto const sequence5 = 5;
577 list1, sequence5,
expiration.time_since_epoch().count());
578 auto const sig5 =
signList (blob5, signingKeysMax);
581 trustedKeys->applyList (
582 maxManifest, blob5, sig5, version, siteUri).disposition);
584 BEAST_EXPECT(! trustedKeys->trustedPublisher(publisherPublic));
585 for (
auto const& val : list1)
587 BEAST_EXPECT(! trustedKeys->listed (val.masterPublic));
588 BEAST_EXPECT(! trustedKeys->listed (val.signingPublic));
595 testcase (
"Update trusted");
597 std::string const siteUri =
"testUpdateTrusted.test";
602 auto& app = env.
app();
603 auto trustedKeysOuter = std::make_unique <ValidatorList> (
604 manifestsOuter, manifestsOuter, env.
timeKeeper(),
605 app.config().legacy(
"database_path"),
617 while (cfgKeys.
size () != maxKeys)
622 if (cfgKeys.
size () <= maxKeys - 5)
628 BEAST_EXPECT(trustedKeysOuter->load (
629 emptyLocalKeyOuter, cfgKeys, cfgPublishersOuter));
634 trustedKeysOuter->updateTrusted(activeValidatorsOuter);
636 for (
auto const& val : unseenValidators)
637 activeValidatorsOuter.
emplace (val);
639 BEAST_EXPECT(changes.
added == activeValidatorsOuter);
640 BEAST_EXPECT(changes.
removed.empty());
641 BEAST_EXPECT(trustedKeysOuter->quorum () ==
643 for (
auto const& val : cfgKeys)
645 if (
auto const valKey = parseBase58<PublicKey>(
648 BEAST_EXPECT(trustedKeysOuter->listed (*valKey));
649 BEAST_EXPECT(trustedKeysOuter->trusted (*valKey));
656 trustedKeysOuter->updateTrusted(activeValidatorsOuter);
657 BEAST_EXPECT(changes.
added.empty());
658 BEAST_EXPECT(changes.
removed.empty());
659 BEAST_EXPECT(trustedKeysOuter->quorum () ==
665 auto const masterPublic =
671 BEAST_EXPECT(trustedKeysOuter->load (
672 emptyLocalKeyOuter, cfgKeys, cfgPublishersOuter));
675 auto const signingPublic1 = signingKeys1.first;
680 trustedKeysOuter->updateTrusted(activeValidatorsOuter);
682 BEAST_EXPECT(changes.
removed.empty());
683 BEAST_EXPECT(trustedKeysOuter->quorum () ==
std::ceil((maxKeys + 1) * 0.8f));
684 BEAST_EXPECT(trustedKeysOuter->listed (masterPublic));
685 BEAST_EXPECT(trustedKeysOuter->trusted (masterPublic));
686 BEAST_EXPECT(!trustedKeysOuter->listed (signingPublic1));
687 BEAST_EXPECT(!trustedKeysOuter->trusted (signingPublic1));
691 masterPublic, masterPrivate,
692 signingPublic1, signingKeys1.second, 1));
697 BEAST_EXPECT(trustedKeysOuter->listed (masterPublic));
698 BEAST_EXPECT(trustedKeysOuter->trusted (masterPublic));
699 BEAST_EXPECT(trustedKeysOuter->listed (signingPublic1));
700 BEAST_EXPECT(trustedKeysOuter->trusted (signingPublic1));
705 auto const signingPublic2 = signingKeys2.first;
707 masterPublic, masterPrivate,
708 signingPublic2, signingKeys2.second, 2));
712 BEAST_EXPECT(trustedKeysOuter->listed (masterPublic));
713 BEAST_EXPECT(trustedKeysOuter->trusted (masterPublic));
714 BEAST_EXPECT(trustedKeysOuter->listed (signingPublic2));
715 BEAST_EXPECT(trustedKeysOuter->trusted (signingPublic2));
716 BEAST_EXPECT(!trustedKeysOuter->listed (signingPublic1));
717 BEAST_EXPECT(!trustedKeysOuter->trusted (signingPublic1));
721 auto const signingPublicMax = signingKeysMax.first;
724 masterPublic, masterPrivate));
726 BEAST_EXPECT(mMax->revoked ());
730 BEAST_EXPECT(manifestsOuter.
getSigningKey (masterPublic) == masterPublic);
731 BEAST_EXPECT(manifestsOuter.
revoked (masterPublic));
734 BEAST_EXPECT(trustedKeysOuter->listed (masterPublic));
735 BEAST_EXPECT(trustedKeysOuter->trusted (masterPublic));
737 changes = trustedKeysOuter->updateTrusted (activeValidatorsOuter);
739 BEAST_EXPECT(changes.
added.empty());
740 BEAST_EXPECT(trustedKeysOuter->quorum () ==
std::ceil(maxKeys * 0.8f));
741 BEAST_EXPECT(trustedKeysOuter->listed (masterPublic));
742 BEAST_EXPECT(!trustedKeysOuter->trusted (masterPublic));
743 BEAST_EXPECT(!trustedKeysOuter->listed (signingPublicMax));
744 BEAST_EXPECT(!trustedKeysOuter->trusted (signingPublicMax));
745 BEAST_EXPECT(!trustedKeysOuter->listed (signingPublic2));
746 BEAST_EXPECT(!trustedKeysOuter->trusted (signingPublic2));
747 BEAST_EXPECT(!trustedKeysOuter->listed (signingPublic1));
748 BEAST_EXPECT(!trustedKeysOuter->trusted (signingPublic1));
752 auto trustedKeys = std::make_unique <ValidatorList> (
753 manifestsOuter, manifestsOuter, env.
timeKeeper(),
754 app.config().legacy(
"database_path"),
757 auto const publisherPublic =
761 strHex(publisherPublic)});
764 BEAST_EXPECT(trustedKeys->load (
765 emptyLocalKeyOuter, emptyCfgKeys, cfgPublishers));
768 trustedKeys->updateTrusted(activeValidatorsOuter);
769 BEAST_EXPECT(changes.
removed.empty());
770 BEAST_EXPECT(changes.
added.empty());
771 BEAST_EXPECT(trustedKeys->quorum () ==
778 auto trustedKeys = std::make_unique <ValidatorList> (
780 app.config().legacy(
"database_path"),
790 while (cfgKeys.
size () < n)
802 BEAST_EXPECT(trustedKeys->load (
803 emptyLocalKeyOuter, cfgKeys, cfgPublishersOuter));
806 trustedKeys->updateTrusted(activeValidators);
807 BEAST_EXPECT(changes.
removed.empty());
808 BEAST_EXPECT(changes.
added == expectedTrusted);
809 BEAST_EXPECT(trustedKeys->quorum () == minQuorum);
812 activeValidators.
emplace (toBeSeen);
813 changes = trustedKeys->updateTrusted(activeValidators);
814 BEAST_EXPECT(changes.
removed.empty());
815 BEAST_EXPECT(changes.
added.empty());
816 BEAST_EXPECT(trustedKeys->quorum () ==
std::ceil(n * 0.8f));
820 auto trustedKeys = std::make_unique<ValidatorList> (
822 app.config().legacy(
"database_path"),
831 publisherKeys.first, publisherKeys.second,
832 pubSigningKeys.first, pubSigningKeys.second, 1));
835 strHex(publisherKeys.first)});
837 BEAST_EXPECT(trustedKeys->load (
838 emptyLocalKey, emptyCfgKeys, cfgKeys));
842 asNodeIDs({list[0].masterPublic, list[1].masterPublic}));
845 auto const version = 1;
846 auto const sequence = 1;
847 using namespace std::chrono_literals;
851 list, sequence,
expiration.time_since_epoch().count());
855 trustedKeys->applyList (
856 manifest, blob,
sig, version, siteUri).disposition);
859 trustedKeys->updateTrusted(activeValidators);
860 BEAST_EXPECT(changes.
removed.empty());
861 BEAST_EXPECT(changes.
added == activeValidators);
864 BEAST_EXPECT(trustedKeys->trusted (val.masterPublic));
865 BEAST_EXPECT(trustedKeys->trusted (val.signingPublic));
867 BEAST_EXPECT(trustedKeys->quorum () == 2);
870 changes = trustedKeys->updateTrusted (activeValidators);
871 BEAST_EXPECT(changes.
removed == activeValidators);
872 BEAST_EXPECT(changes.
added.empty());
873 BEAST_EXPECT(! trustedKeys->trusted (list[0].masterPublic));
874 BEAST_EXPECT(! trustedKeys->trusted (list[1].masterPublic));
875 BEAST_EXPECT(trustedKeys->quorum () ==
881 auto const sequence2 = 2;
886 auto const sig2 =
signList (blob2, pubSigningKeys);
889 trustedKeys->applyList (
890 manifest, blob2, sig2, version, siteUri).disposition);
892 changes = trustedKeys->updateTrusted (activeValidators);
893 BEAST_EXPECT(changes.
removed.empty());
896 asNodeIDs({list2[0].masterPublic, list2[1].masterPublic}));
899 BEAST_EXPECT(trustedKeys->trusted (val.masterPublic));
900 BEAST_EXPECT(trustedKeys->trusted (val.signingPublic));
902 BEAST_EXPECT(! trustedKeys->trusted (list[1].masterPublic));
903 BEAST_EXPECT(! trustedKeys->trusted (list[1].signingPublic));
904 BEAST_EXPECT(trustedKeys->quorum () == 2);
908 auto trustedKeys = std::make_unique <ValidatorList> (
909 manifestsOuter, manifestsOuter, env.
timeKeeper(),
910 app.config().legacy(
"database_path"),
927 BEAST_EXPECT(trustedKeys->load (
928 emptyLocalKeyOuter, cfgKeys, cfgPublishers));
930 trustedKeys->updateTrusted(activeValidators);
931 BEAST_EXPECT(changes.
removed.empty());
933 BEAST_EXPECT(trustedKeys->quorum () ==
935 for (
auto const& key : activeKeys)
936 BEAST_EXPECT(trustedKeys->trusted (key));
941 auto trustedKeys = std::make_unique <ValidatorList> (
942 manifestsOuter, manifestsOuter, env.
timeKeeper(),
943 app.config().legacy(
"database_path"),
954 while (cfgKeys.size() < cfgKeys.capacity())
962 BEAST_EXPECT(trustedKeys->load (
963 localKey, cfgKeys, cfgPublishers));
965 trustedKeys->updateTrusted(activeValidators);
966 BEAST_EXPECT(changes.
removed.empty());
967 if (cfgKeys.size() > 2)
973 BEAST_EXPECT(trustedKeys->quorum () ==
976 for (
auto const& key : activeKeys)
977 BEAST_EXPECT(trustedKeys->trusted (key));
983 auto trustedKeys = std::make_unique <ValidatorList> (
985 app.config().legacy(
"database_path"),
992 while (valKeys.
size () != maxKeys)
999 auto addPublishedList = [
this, &env, &trustedKeys, &valKeys, &siteUri]()
1002 auto const publisherPublic =
1006 publisherPublic, publisherSecret,
1007 pubSigningKeys.first, pubSigningKeys.second, 1));
1010 strHex(publisherPublic)});
1014 BEAST_EXPECT(trustedKeys->load (
1015 emptyLocalKey, emptyCfgKeys, cfgPublishers));
1017 auto const version = 1;
1018 auto const sequence = 1;
1019 using namespace std::chrono_literals;
1023 valKeys, sequence,
expiration.time_since_epoch().count());
1027 trustedKeys->applyList (
manifest, blob,
sig, version,
1028 siteUri).disposition);
1032 for (
auto i = 0; i < 3; ++i)
1036 trustedKeys->updateTrusted(activeValidators);
1038 BEAST_EXPECT(trustedKeys->quorum () ==
1042 for (
auto const& val : valKeys)
1044 BEAST_EXPECT(trustedKeys->trusted (val.masterPublic));
1047 BEAST_EXPECT(changes.
added == added);
1048 BEAST_EXPECT(changes.
removed.empty());
1055 testcase(
"Expires");
1060 auto& app = env.
app();
1062 auto toStr = [](
PublicKey const& publicKey) {
1069 auto trustedKeys = std::make_unique<ValidatorList>(
1071 app.config().legacy(
"database_path"),
1075 BEAST_EXPECT(trustedKeys->expires() == boost::none);
1080 trustedKeys->load(emptyLocalKey, {toStr(localCfgListed)}, {});
1082 trustedKeys->expires() &&
1084 BEAST_EXPECT(trustedKeys->listed(localCfgListed));
1090 auto trustedKeys = std::make_unique<ValidatorList>(
1092 app.config().legacy(
"database_path"),
1109 using namespace std::chrono_literals;
1110 auto addPublishedList = [
this, &env, &trustedKeys, &validators]()
1113 auto const publisherPublic =
1117 publisherPublic, publisherSecret,
1118 pubSigningKeys.first, pubSigningKeys.second, 1));
1121 strHex(publisherPublic)});
1125 BEAST_EXPECT(trustedKeys->load (
1126 emptyLocalKey, emptyCfgKeys, cfgPublishers));
1128 auto const version = 1;
1129 auto const sequence = 1;
1143 PreparedList prep1 = addPublishedList();
1145 PreparedList prep2 = addPublishedList();
1148 BEAST_EXPECT(trustedKeys->expires() == boost::none);
1153 prep1.manifest, prep1.blob, prep1.sig,
1154 prep1.version, siteUri).disposition);
1157 BEAST_EXPECT(trustedKeys->expires() == boost::none);
1162 prep2.manifest, prep2.blob, prep2.sig,
1163 prep2.version, siteUri).disposition);
1167 trustedKeys->expires() &&
1168 trustedKeys->expires().get() == prep1.expiration);
1173 trustedKeys->updateTrusted(activeValidators);
1175 trustedKeys->expires() &&
1176 trustedKeys->expires().get() == prep1.expiration);