206 auto& app = env.
app();
211 auto const localSigningPublicOuter = localSigningKeys.first;
212 auto const localSigningSecret = localSigningKeys.second;
214 auto const localMasterPublic =
220 localSigningPublicOuter,
224 auto format = [](
PublicKey const& publicKey,
225 char const* comment =
nullptr) {
237 while (configList.
size() != 8)
242 {format(configList[0]),
243 format(configList[1],
" Comment"),
244 format(configList[2],
" Multi Word Comment"),
245 format(configList[3],
" Leading Whitespace"),
246 format(configList[4],
" Trailing Whitespace "),
247 format(configList[5],
" Leading & Trailing Whitespace "),
250 " Leading, Trailing & Internal Whitespace "),
251 format(configList[7],
" ")});
259 app.config().legacy(
"database_path"),
264 trustedKeys->load({}, emptyCfgKeys, emptyCfgPublishers));
267 BEAST_EXPECT(trustedKeys->load(
268 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
269 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
272 BEAST_EXPECT(trustedKeys->load(
273 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
275 BEAST_EXPECT(trustedKeys->listed(localMasterPublic));
276 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
285 app.config().legacy(
"database_path"),
288 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, emptyCfgPublishers));
290 for (
auto const& n : configList)
291 BEAST_EXPECT(trustedKeys->listed(n));
298 {format(masterNode1), format(masterNode2,
" Comment")});
300 trustedKeys->load({}, cfgMasterKeys, emptyCfgPublishers));
301 BEAST_EXPECT(trustedKeys->listed(masterNode1));
302 BEAST_EXPECT(trustedKeys->listed(masterNode2));
306 !trustedKeys->load({}, {
"NotAPublicKey"}, emptyCfgPublishers));
307 BEAST_EXPECT(!trustedKeys->load(
308 {}, {format(randomNode(),
"!")}, emptyCfgPublishers));
312 BEAST_EXPECT(!trustedKeys->load(
314 {format(randomNode(),
"!"), format(goodKey)},
315 emptyCfgPublishers));
316 BEAST_EXPECT(!trustedKeys->listed(goodKey));
325 app.config().legacy(
"database_path"),
328 auto const localSigningPublic =
331 BEAST_EXPECT(trustedKeys->load(
332 *localSigningPublic, cfgKeys, emptyCfgPublishers));
334 BEAST_EXPECT(trustedKeys->localPublicKey() == localSigningPublic);
335 BEAST_EXPECT(trustedKeys->listed(*localSigningPublic));
336 for (
auto const& n : configList)
337 BEAST_EXPECT(trustedKeys->listed(n));
346 app.config().legacy(
"database_path"),
350 BEAST_EXPECT(trustedKeys->load(
351 localSigningPublic, cfgKeys, emptyCfgPublishers));
353 BEAST_EXPECT(trustedKeys->localPublicKey() == localSigningPublic);
354 BEAST_EXPECT(trustedKeys->listed(localSigningPublic));
355 for (
auto const& n : configList)
356 BEAST_EXPECT(trustedKeys->listed(n));
365 app.config().legacy(
"database_path"),
370 BEAST_EXPECT(trustedKeys->load(
371 localSigningPublicOuter, cfgKeys, emptyCfgPublishers));
373 BEAST_EXPECT(trustedKeys->localPublicKey() == localMasterPublic);
374 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
375 BEAST_EXPECT(trustedKeys->listed(localMasterPublic));
376 for (
auto const& n : configList)
377 BEAST_EXPECT(trustedKeys->listed(n));
385 app.config().legacy(
"database_path"),
390 BEAST_EXPECT(!trustedKeys->load({}, emptyCfgKeys, badPublishers));
396 badPublishers.
clear();
397 for (
auto const& key : keys)
400 BEAST_EXPECT(!trustedKeys->load({}, emptyCfgKeys, badPublishers));
401 for (
auto const& key : keys)
402 BEAST_EXPECT(!trustedKeys->trustedPublisher(key));
406 for (
auto const& key : keys)
409 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
410 for (
auto const& key : keys)
411 BEAST_EXPECT(trustedKeys->trustedPublisher(key));
413 trustedKeys->getListThreshold() == keys.size() / 2 + 1);
421 app.config().legacy(
"database_path"),
430 for (
auto const& key : keys)
434 BEAST_EXPECT(trustedKeys->load(
436 for (
auto const& key : keys)
437 BEAST_EXPECT(trustedKeys->trustedPublisher(key));
438 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
449 app.config().legacy(
"database_path"),
453 auto const pubRevokedPublic =
461 pubRevokedSigning.first,
462 pubRevokedSigning.second,
471 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
473 BEAST_EXPECT(!trustedKeys->trustedPublisher(pubRevokedPublic));
474 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey1));
475 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey2));
477 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
488 app.config().legacy(
"database_path"),
492 auto const pubRevokedPublic =
500 pubRevokedSigning.first,
501 pubRevokedSigning.second,
509 BEAST_EXPECT(trustedKeys->load(
512 BEAST_EXPECT(!trustedKeys->trustedPublisher(pubRevokedPublic));
513 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey));
515 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
523 using namespace std::chrono_literals;
527 auto checkAvailable =
529 auto const& trustedKeys,
530 auto const& hexPublic,
535 auto const available = trustedKeys->getAvailable(hexPublic);
541 BEAST_EXPECT(a[jss::public_key] == hexPublic);
542 BEAST_EXPECT(a[jss::manifest] ==
manifest);
545 BEAST_EXPECT(a[jss::version] == version);
548 BEAST_EXPECT(expected.size() == 1);
549 BEAST_EXPECT(a[jss::blob] == expected[0].first);
550 BEAST_EXPECT(a[jss::signature] == expected[0].second);
551 BEAST_EXPECT(!a.isMember(jss::blobs_v2));
553 else if (BEAST_EXPECT(a.isMember(jss::blobs_v2)))
555 BEAST_EXPECT(!a.isMember(jss::blob));
556 BEAST_EXPECT(!a.isMember(jss::signature));
557 auto const& blobs_v2 = a[jss::blobs_v2];
559 blobs_v2.isArray() &&
560 blobs_v2.size() == expected.size());
562 for (
unsigned int i = 0; i < expected.size(); ++i)
565 blobs_v2[i][jss::blob] == expected[i].first);
567 blobs_v2[i][jss::signature] ==
576 auto& app = env.
app();
581 app.config().legacy(
"database_path"),
586 for (
auto const& val : list)
588 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
589 BEAST_EXPECT(trustedKeys->listed(val.signingPublic));
593 auto expectUntrusted =
595 for (
auto const& val : list)
597 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
598 BEAST_EXPECT(!trustedKeys->listed(val.signingPublic));
603 auto const publisherPublic =
605 auto const hexPublic =
606 strHex(publisherPublic.begin(), publisherPublic.end());
611 pubSigningKeys1.first,
612 pubSigningKeys1.second,
618 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgKeys1));
621 auto constexpr listSize = 20;
622 auto constexpr numLists = 9;
625 for (
auto i = 1; i <= numLists; ++i)
627 auto& list = lists[i];
628 list.reserve(listSize);
629 while (list.size() < listSize)
637 auto const version = 1;
638 auto const sequence1 = 1;
643 auto const expiredSig =
signList(expiredblob, pubSigningKeys1);
646 auto const sequence2 = 2;
649 auto const sig2 =
signList(blob2, pubSigningKeys1);
652 trustedKeys->applyLists(
655 {{expiredblob, expiredSig, {}}, {blob2, sig2, {}}},
661 expectTrusted(lists.at(2));
664 trustedKeys, hexPublic, manifest1, version, {{blob2, sig2}});
667 auto const version2 = 2;
668 auto const sequence7 = 7;
669 auto const effective7 = validUntil - 60s;
670 auto const expiration7 = effective7 + 3600s;
671 auto const blob7 = makeList(
674 expiration7.time_since_epoch().count(),
675 effective7.time_since_epoch().count());
676 auto const sig7 = signList(blob7, pubSigningKeys1);
678 auto const sequence8 = 8;
679 auto const effective8 = expiration7 - 60s;
680 auto const expiration8 = effective8 + 3600s;
681 auto const blob8 = makeList(
684 expiration8.time_since_epoch().count(),
685 effective8.time_since_epoch().count());
686 auto const sig8 = signList(blob8, pubSigningKeys1);
689 trustedKeys->applyLists(
692 {{blob7, sig7, {}}, {blob8, sig8, {}}},
695 ListDisposition::pending,
696 ListDisposition::pending);
698 expectUntrusted(lists.at(7));
699 expectUntrusted(lists.at(8));
702 auto const sequence6 = 6;
703 auto const effective6 = effective7 - 60s;
704 auto const expiration6 = effective6 + 3600s;
705 auto const blob6 = makeList(
708 expiration6.time_since_epoch().count(),
709 effective6.time_since_epoch().count());
710 auto const sig6 = signList(blob6, pubSigningKeys1);
713 auto const sequence6a = 5;
714 auto const effective6a = effective6 + 60s;
715 auto const expiration6a = effective6a + 3600s;
716 auto const blob6a = makeList(
719 expiration6a.time_since_epoch().count(),
720 effective6a.time_since_epoch().count());
721 auto const sig6a = signList(blob6a, pubSigningKeys1);
724 trustedKeys->applyLists(
727 {{blob6a, sig6a, {}}, {blob6, sig6, {}}},
730 ListDisposition::pending,
731 ListDisposition::pending);
733 expectUntrusted(lists.at(6));
734 expectTrusted(lists.at(2));
739 trustedKeys->applyLists(
742 {{blob7, sig7, {}}, {blob6, sig6, {}}},
745 ListDisposition::known_sequence,
746 ListDisposition::known_sequence);
748 expectUntrusted(lists.at(6));
749 expectUntrusted(lists.at(7));
750 expectTrusted(lists.at(2));
754 trustedKeys->applyLists(
755 "", version, {{blob7, sig7, {}}, {blob6, sig6, {}}}, siteUri),
757 ListDisposition::invalid,
758 ListDisposition::invalid);
761 trustedKeys->applyLists(
764 {{blob7, sig7, {}}, {blob6, sig6, {}}},
767 ListDisposition::invalid,
768 ListDisposition::invalid);
771 auto const untrustedManifest =
base64_encode(makeManifestString(
774 pubSigningKeys1.first,
775 pubSigningKeys1.second,
779 trustedKeys->applyLists(
780 untrustedManifest, version, {{blob2, sig2, {}}}, siteUri),
782 ListDisposition::untrusted,
783 ListDisposition::untrusted);
786 auto const badVersion = 666;
788 trustedKeys->applyLists(
789 manifest1, badVersion, {{blob2, sig2, {}}}, siteUri),
791 ListDisposition::unsupported_version,
792 ListDisposition::unsupported_version);
795 auto const sequence3 = 3;
796 auto const blob3 = makeList(
797 lists.at(3), sequence3, validUntil.time_since_epoch().count());
798 auto const sig3 = signList(blob3, pubSigningKeys1);
801 trustedKeys->applyLists(
802 manifest1, version, {{blob3, sig3, {}}}, siteUri),
804 ListDisposition::accepted,
805 ListDisposition::accepted);
807 expectUntrusted(lists.at(1));
808 expectUntrusted(lists.at(2));
809 expectTrusted(lists.at(3));
818 {{blob3, sig3}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
822 trustedKeys->applyLists(
825 {{blob2, sig2, {}}, {blob3, sig3, {}}},
828 ListDisposition::stale,
829 ListDisposition::same_sequence);
833 auto const pubSigningKeys2 =
randomKeyPair(KeyType::secp256k1);
837 pubSigningKeys2.first,
838 pubSigningKeys2.second,
841 auto const sequence4 = 4;
842 auto const blob4 = makeList(
843 lists.at(4), sequence4, validUntil.time_since_epoch().count());
844 auto const sig4 = signList(blob4, pubSigningKeys2);
847 trustedKeys->applyLists(
850 {{blob2, sig2, manifest1},
851 {blob3, sig3, manifest1},
855 ListDisposition::stale,
856 ListDisposition::accepted);
858 expectUntrusted(lists.at(2));
859 expectUntrusted(lists.at(3));
860 expectTrusted(lists.at(4));
867 {{blob4, sig4}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
869 auto const sequence5 = 5;
870 auto const blob5 = makeList(
871 lists.at(5), sequence5, validUntil.time_since_epoch().count());
872 auto const badSig = signList(blob5, pubSigningKeys1);
874 trustedKeys->applyLists(
875 manifest1, version, {{blob5, badSig, {}}}, siteUri),
877 ListDisposition::invalid,
878 ListDisposition::invalid);
880 expectUntrusted(lists.at(2));
881 expectUntrusted(lists.at(3));
882 expectTrusted(lists.at(4));
883 expectUntrusted(lists.at(5));
887 trustedKeys->applyLists(
890 {{blob7, sig7, {}}, {blob8, sig8, {}}},
893 ListDisposition::invalid,
894 ListDisposition::invalid);
896 expectTrusted(lists.at(4));
897 expectUntrusted(lists.at(7));
898 expectUntrusted(lists.at(8));
903 trustedKeys->updateTrusted(
908 env.app().getHashRouter());
910 expectUntrusted(lists.at(3));
911 expectTrusted(lists.at(6));
918 {{blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
924 env.timeKeeper().set(effective8);
925 trustedKeys->updateTrusted(
930 env.app().getHashRouter());
932 expectUntrusted(lists.at(6));
933 expectUntrusted(lists.at(7));
934 expectTrusted(lists.at(8));
936 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
942 auto const sig8_2 = signList(blob8, pubSigningKeys2);
945 trustedKeys->applyLists(
948 {{blob8, sig8, manifest1}, {blob8, sig8_2, {}}},
951 ListDisposition::invalid,
952 ListDisposition::same_sequence);
954 expectTrusted(lists.at(8));
956 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
960 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
962 makeRevocationString(publisherPublic, publisherSecret));
964 auto const sequence9 = 9;
965 auto const blob9 = makeList(
966 lists.at(9), sequence9, validUntil.time_since_epoch().count());
967 auto const sig9 = signList(blob9, signingKeysMax);
970 trustedKeys->applyLists(
971 maxManifest, version, {{blob9, sig9, {}}}, siteUri),
973 ListDisposition::untrusted,
974 ListDisposition::untrusted);
976 BEAST_EXPECT(!trustedKeys->trustedPublisher(publisherPublic));
977 for (
auto const& [num, list] : lists)
980 expectUntrusted(list);
983 checkAvailable(trustedKeys, hexPublic, manifest2, 0, {});
1125 testcase(
"Update trusted");
1127 std::string const siteUri =
"testUpdateTrusted.test";
1131 auto& app = env.
app();
1136 app.config().legacy(
"database_path"),
1148 while (cfgKeys.
size() != maxKeys)
1150 auto const valKey = randomNode();
1152 if (cfgKeys.
size() <= maxKeys - 5)
1159 trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1163 TrustChanges changes = trustedKeysOuter->updateTrusted(
1164 activeValidatorsOuter,
1170 for (
auto const& val : unseenValidators)
1171 activeValidatorsOuter.
emplace(val);
1173 BEAST_EXPECT(changes.
added == activeValidatorsOuter);
1174 BEAST_EXPECT(changes.
removed.empty());
1176 trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1177 for (
auto const& val : cfgKeys)
1179 if (
auto const valKey =
1180 parseBase58<PublicKey>(TokenType::NodePublic, val))
1182 BEAST_EXPECT(trustedKeysOuter->listed(*valKey));
1183 BEAST_EXPECT(trustedKeysOuter->trusted(*valKey));
1189 changes = trustedKeysOuter->updateTrusted(
1190 activeValidatorsOuter,
1195 BEAST_EXPECT(changes.
added.empty());
1196 BEAST_EXPECT(changes.
removed.empty());
1198 trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1203 auto const masterPublic =
1207 {
toBase58(TokenType::NodePublic, masterPublic)});
1210 trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1212 auto const signingKeys1 =
randomKeyPair(KeyType::secp256k1);
1213 auto const signingPublic1 = signingKeys1.first;
1217 TrustChanges changes = trustedKeysOuter->updateTrusted(
1218 activeValidatorsOuter,
1223 BEAST_EXPECT(changes.
added == asNodeIDs({masterPublic}));
1224 BEAST_EXPECT(changes.
removed.empty());
1226 trustedKeysOuter->quorum() ==
std::ceil((maxKeys + 1) * 0.8f));
1227 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1228 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1229 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1230 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1237 signingKeys1.second,
1242 ManifestDisposition::accepted);
1243 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1244 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1245 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic1));
1246 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic1));
1250 auto const signingKeys2 =
randomKeyPair(KeyType::secp256k1);
1251 auto const signingPublic2 = signingKeys2.first;
1256 signingKeys2.second,
1260 ManifestDisposition::accepted);
1261 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1262 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1263 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic2));
1264 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic2));
1265 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1266 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1269 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
1270 auto const signingPublicMax = signingKeysMax.first;
1273 makeRevocationString(masterPublic, masterPrivate));
1275 BEAST_EXPECT(mMax->revoked());
1278 ManifestDisposition::accepted);
1280 manifestsOuter.
getSigningKey(masterPublic) == masterPublic);
1281 BEAST_EXPECT(manifestsOuter.
revoked(masterPublic));
1284 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1285 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1287 changes = trustedKeysOuter->updateTrusted(
1288 activeValidatorsOuter,
1293 BEAST_EXPECT(changes.
removed == asNodeIDs({masterPublic}));
1294 BEAST_EXPECT(changes.
added.empty());
1296 trustedKeysOuter->quorum() ==
std::ceil(maxKeys * 0.8f));
1297 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1298 BEAST_EXPECT(!trustedKeysOuter->trusted(masterPublic));
1299 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublicMax));
1300 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublicMax));
1301 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic2));
1302 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic2));
1303 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1304 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1313 app.config().legacy(
"database_path"),
1316 auto const publisherPublic =
1322 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1325 activeValidatorsOuter,
1330 BEAST_EXPECT(changes.
removed.empty());
1331 BEAST_EXPECT(changes.
added.empty());
1333 trustedKeys->quorum() ==
1343 app.config().legacy(
"database_path"),
1346 auto const masterPublic =
1349 {
toBase58(TokenType::NodePublic, masterPublic)});
1352 auto const publisher1Public =
1355 auto const publisher2Public =
1361 trustedKeys->load({}, cfgKeys, cfgPublishers,
std::size_t(2)));
1364 activeValidatorsOuter,
1369 BEAST_EXPECT(changes.
removed.empty());
1370 BEAST_EXPECT(changes.
added.size() == 1);
1371 BEAST_EXPECT(trustedKeys->listed(masterPublic));
1372 BEAST_EXPECT(trustedKeys->trusted(masterPublic));
1382 app.config().legacy(
"database_path"),
1393 while (cfgKeys.
size() < n)
1395 auto const valKey = randomNode();
1404 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishersOuter));
1412 BEAST_EXPECT(changes.
removed.empty());
1413 BEAST_EXPECT(changes.
added == expectedTrusted);
1414 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1417 activeValidators.
emplace(toBeSeen);
1418 changes = trustedKeys->updateTrusted(
1424 BEAST_EXPECT(changes.
removed.empty());
1425 BEAST_EXPECT(changes.
added.empty());
1426 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1434 app.config().legacy(
"database_path"),
1438 auto const publisherKeys =
randomKeyPair(KeyType::secp256k1);
1439 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1441 publisherKeys.first,
1442 publisherKeys.second,
1443 pubSigningKeys.first,
1444 pubSigningKeys.second,
1449 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgKeys));
1453 asNodeIDs({list[0].masterPublic, list[1].masterPublic}));
1456 auto const version = 1;
1457 auto const sequence = 1;
1458 using namespace std::chrono_literals;
1463 auto const sig = signList(blob, pubSigningKeys);
1466 ListDisposition::accepted ==
1468 ->applyLists(
manifest, version, {{blob,
sig, {}}}, siteUri)
1469 .bestDisposition());
1477 BEAST_EXPECT(changes.
removed.empty());
1478 BEAST_EXPECT(changes.
added == activeValidators);
1481 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1482 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1484 BEAST_EXPECT(trustedKeys->quorum() == 2);
1487 changes = trustedKeys->updateTrusted(
1493 BEAST_EXPECT(changes.
removed == activeValidators);
1494 BEAST_EXPECT(changes.
added.empty());
1495 BEAST_EXPECT(!trustedKeys->trusted(list[0].masterPublic));
1496 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1498 trustedKeys->quorum() ==
1504 auto const sequence2 = 2;
1507 auto const blob2 = makeList(
1509 auto const sig2 = signList(blob2, pubSigningKeys);
1512 ListDisposition::accepted ==
1515 manifest, version, {{blob2, sig2, {}}}, siteUri)
1516 .bestDisposition());
1518 changes = trustedKeys->updateTrusted(
1524 BEAST_EXPECT(changes.
removed.empty());
1527 asNodeIDs({list2[0].masterPublic, list2[1].masterPublic}));
1530 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1531 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1533 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1534 BEAST_EXPECT(!trustedKeys->trusted(list[1].signingPublic));
1535 BEAST_EXPECT(trustedKeys->quorum() == 2);
1543 app.config().legacy(
"database_path"),
1555 auto const valKey = randomNode();
1559 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers));
1566 BEAST_EXPECT(changes.
removed.empty());
1567 BEAST_EXPECT(changes.
added == asNodeIDs({valKey}));
1570 for (
auto const& key : activeKeys)
1571 BEAST_EXPECT(trustedKeys->trusted(key));
1580 app.config().legacy(
"database_path"),
1583 auto const localKey = randomNode();
1588 toBase58(TokenType::NodePublic, localKey)};
1591 while (cfgKeys.size() < cfgKeys.capacity())
1593 auto const valKey = randomNode();
1594 cfgKeys.push_back(
toBase58(TokenType::NodePublic, valKey));
1599 trustedKeys->load(localKey, cfgKeys, cfgPublishers));
1606 BEAST_EXPECT(changes.
removed.empty());
1607 if (cfgKeys.size() > 2)
1608 BEAST_EXPECT(changes.
added == asNodeIDs({valKey}));
1611 changes.
added == asNodeIDs({localKey, valKey}));
1614 trustedKeys->quorum() ==
std::ceil(cfgKeys.size() * 0.8f));
1616 for (
auto const& key : activeKeys)
1617 BEAST_EXPECT(trustedKeys->trusted(key));
1627 app.config().legacy(
"database_path"),
1634 while (valKeys.
size() != maxKeys)
1644 constexpr static int publishers = 3;
1647 decltype(valKeys)::const_iterator,
1656 auto addPublishedList = [&,
this](
int i) {
1658 auto const publisherPublic =
1660 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1664 pubSigningKeys.first,
1665 pubSigningKeys.second,
1669 {
strHex(publisherPublic)});
1673 BEAST_EXPECT(trustedKeys->load(
1674 {}, emptyCfgKeys, cfgPublishers,
std::size_t(1)));
1676 auto const version = 1;
1677 auto const sequence = 1;
1678 using namespace std::chrono_literals;
1682 locals[i].first, locals[i].second};
1683 auto const blob = makeList(
1685 auto const sig = signList(blob, pubSigningKeys);
1688 ListDisposition::accepted ==
1692 .bestDisposition());
1696 for (
auto i = 0; i < publishers; ++i)
1697 addPublishedList(i);
1698 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
1711 for (
auto const& val : valKeys)
1713 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1716 BEAST_EXPECT(changes.
added == added);
1717 BEAST_EXPECT(changes.
removed.empty());
1726 app.config().legacy(
"database_path"),
1733 while (valKeys.
size() != maxKeys)
1745 constexpr static int publishers = 3;
1748 decltype(valKeys)::const_iterator,
1757 auto addPublishedList = [&,
this](
1762 auto const publisherPublic =
1764 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1768 pubSigningKeys.first,
1769 pubSigningKeys.second,
1773 {
strHex(publisherPublic)});
1777 trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1779 auto const version = 1;
1780 auto const sequence = 1;
1781 using namespace std::chrono_literals;
1788 validUntil1 = validUntil;
1790 validUntil2 = validUntil;
1792 locals[i].first, locals[i].second};
1793 auto const blob = makeList(
1795 auto const sig = signList(blob, pubSigningKeys);
1798 ListDisposition::accepted ==
1802 .bestDisposition());
1808 for (
auto i = 0; i < publishers; ++i)
1809 addPublishedList(i, validUntil1, validUntil2);
1810 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
1820 trustedKeys->quorum() ==
1823 for (
auto const& val : valKeys)
1824 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1829 auto const& val = valKeys[i];
1830 if (i >= 1 && i < maxKeys - 2)
1832 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1836 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1838 BEAST_EXPECT(changes.
added == added);
1839 BEAST_EXPECT(changes.
removed.empty());
1843 changes = trustedKeys->updateTrusted(
1851 trustedKeys->quorum() ==
1854 for (
auto const& val : valKeys)
1855 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1860 auto const& val = valKeys[i];
1861 if (i >= 2 && i < maxKeys - 4)
1862 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1865 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1866 if (i >= 1 && i < maxKeys - 2)
1871 BEAST_EXPECT(changes.
added.empty());
1872 BEAST_EXPECT(changes.
removed == removed);
1876 changes = trustedKeys->updateTrusted(
1884 trustedKeys->quorum() ==
1890 auto const& val = valKeys[i];
1891 if (i < maxKeys - 4)
1892 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1894 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
1896 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1897 if (i >= 2 && i < maxKeys - 4)
1901 BEAST_EXPECT(changes.
added.empty());
1902 BEAST_EXPECT(changes.
removed == removed);
2347 testcase(
"Build and split messages");
2350 auto extractHeader = [
this](
Message& message) {
2351 auto const& buffer =
2352 message.getBuffer(compression::Compressed::Off);
2354 boost::beast::multi_buffer buffers;
2357 auto start = buffer.begin();
2358 auto end = buffer.end();
2360 buffers.commit(boost::asio::buffer_copy(
2361 buffers.prepare(slice.
size()), boost::asio::buffer(slice)));
2363 boost::system::error_code ec;
2365 detail::parseMessageHeader(ec, buffers.data(), buffers.size());
2369 auto extractProtocolMessage1 = [
this,
2370 &extractHeader](
Message& message) {
2371 auto [header, buffers] = extractHeader(message);
2372 if (BEAST_EXPECT(header) &&
2374 header->message_type == protocol::mtVALIDATOR_LIST))
2377 detail::parseMessageContent<protocol::TMValidatorList>(
2378 *header, buffers.data());
2384 auto extractProtocolMessage2 = [
this,
2385 &extractHeader](
Message& message) {
2386 auto [header, buffers] = extractHeader(message);
2387 if (BEAST_EXPECT(header) &&
2389 header->message_type ==
2390 protocol::mtVALIDATOR_LIST_COLLECTION))
2392 auto const msg = detail::parseMessageContent<
2393 protocol::TMValidatorListCollection>(
2394 *header, buffers.data());
2400 auto verifyMessage =
2403 &extractProtocolMessage1,
2404 &extractProtocolMessage2](
2407 auto const& blobInfos,
2408 auto const& messages,
2411 BEAST_EXPECT(messages.size() == expectedInfo.size());
2412 auto msgIter = expectedInfo.begin();
2413 for (
auto const& messageWithHash : messages)
2415 if (!BEAST_EXPECT(msgIter != expectedInfo.end()))
2417 if (!BEAST_EXPECT(messageWithHash.message))
2419 auto const& expectedSeqs = msgIter->second;
2420 auto seqIter = expectedSeqs.begin();
2422 messageWithHash.message
2423 ->getBuffer(compression::Compressed::Off)
2426 BEAST_EXPECT(size == msgIter->first);
2427 if (expectedSeqs.size() == 1)
2430 extractProtocolMessage1(*messageWithHash.message);
2431 auto const expectedVersion = 1;
2432 if (BEAST_EXPECT(msg))
2434 BEAST_EXPECT(msg->version() == expectedVersion);
2435 if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
2437 auto const& expectedBlob = blobInfos.at(*seqIter);
2439 (*seqIter < manifestCutoff) ==
2440 !!expectedBlob.manifest);
2441 auto const expectedManifest =
2442 *seqIter < manifestCutoff &&
2443 expectedBlob.manifest
2444 ? *expectedBlob.manifest
2446 BEAST_EXPECT(msg->manifest() == expectedManifest);
2447 BEAST_EXPECT(msg->blob() == expectedBlob.blob);
2449 msg->signature() == expectedBlob.signature);
2451 BEAST_EXPECT(seqIter == expectedSeqs.end());
2454 messageWithHash.hash ==
2458 expectedBlob.signature,
2465 hashingBlobs.
reserve(msgIter->second.size());
2468 extractProtocolMessage2(*messageWithHash.message);
2469 if (BEAST_EXPECT(msg))
2471 BEAST_EXPECT(msg->version() == version);
2472 BEAST_EXPECT(msg->manifest() ==
manifest);
2473 for (
auto const& blobInfo : msg->blobs())
2476 seqIter != expectedSeqs.end()))
2478 auto const& expectedBlob =
2479 blobInfos.at(*seqIter);
2482 blobInfo.has_manifest() ==
2483 !!expectedBlob.manifest);
2485 blobInfo.has_manifest() ==
2486 (*seqIter < manifestCutoff));
2488 if (*seqIter < manifestCutoff)
2490 blobInfo.manifest() ==
2491 *expectedBlob.manifest);
2493 blobInfo.blob() == expectedBlob.blob);
2495 blobInfo.signature() ==
2496 expectedBlob.signature);
2499 BEAST_EXPECT(seqIter == expectedSeqs.end());
2502 messageWithHash.hash ==
2507 BEAST_EXPECT(msgIter == expectedInfo.end());
2509 auto verifyBuildMessages =
2514 BEAST_EXPECT(result.
first == expectedSequence);
2515 BEAST_EXPECT(result.
second == expectedSize);
2521 auto const blobInfos = [manifestCutoff = manifestCutoff]() {
2524 for (
auto seq : {5, 6, 7, 10, 12})
2528 s <<
"This is not a blob with sequence " <<
seq;
2531 s <<
"This is not a signature for sequence " <<
seq;
2532 b.signature = s.
str();
2533 if (
seq < manifestCutoff)
2537 s <<
"This is not manifest " <<
seq;
2538 b.manifest = s.
str();
2543 auto const maxSequence = blobInfos.
rbegin()->first;
2544 BEAST_EXPECT(maxSequence == 12);
2551 verifyBuildMessages(
2552 ValidatorList::buildValidatorListMessages(
2553 1, 8, maxSequence, version,
manifest, blobInfos, messages),
2556 BEAST_EXPECT(messages.size() == 0);
2562 messages.emplace_back();
2563 verifyBuildMessages(
2564 ValidatorList::buildValidatorListMessages(
2565 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2568 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2572 verifyBuildMessages(
2573 ValidatorList::buildValidatorListMessages(
2574 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2577 if (BEAST_EXPECT(messages.size() == 1) &&
2578 BEAST_EXPECT(messages.front().message))
2580 auto const& messageWithHash = messages.front();
2581 auto const msg = extractProtocolMessage1(*messageWithHash.message);
2583 messageWithHash.message->getBuffer(compression::Compressed::Off)
2586 BEAST_EXPECT(size == 108);
2587 auto const& expected = blobInfos.at(5);
2588 if (BEAST_EXPECT(msg))
2590 BEAST_EXPECT(msg->version() == 1);
2591 BEAST_EXPECT(msg->manifest() == *expected.manifest);
2592 BEAST_EXPECT(msg->blob() == expected.blob);
2593 BEAST_EXPECT(msg->signature() == expected.signature);
2596 messageWithHash.hash ==
2598 *expected.manifest, expected.blob, expected.signature, 1));
2606 verifyBuildMessages(
2607 ValidatorList::buildValidatorListMessages(
2617 BEAST_EXPECT(messages.size() == 0);
2623 messages.emplace_back();
2624 verifyBuildMessages(
2625 ValidatorList::buildValidatorListMessages(
2626 2, 3, maxSequence, version,
manifest, blobInfos, messages),
2629 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2633 verifyBuildMessages(
2634 ValidatorList::buildValidatorListMessages(
2635 2, 5, maxSequence, version,
manifest, blobInfos, messages),
2639 version,
manifest, blobInfos, messages, {{372, {6, 7, 10, 12}}});
2645 verifyBuildMessages(
2646 ValidatorList::buildValidatorListMessages(
2647 2, 5, maxSequence, version,
manifest, blobInfos, messages, 300),
2655 {{212, {6, 7}}, {192, {10, 12}}});
2660 verifyBuildMessages(
2661 ValidatorList::buildValidatorListMessages(
2662 2, 5, maxSequence, version,
manifest, blobInfos, messages, 200),
2670 {{108, {6}}, {108, {7}}, {192, {10, 12}}});
2674 verifyBuildMessages(
2675 ValidatorList::buildValidatorListMessages(
2676 2, 5, maxSequence, version,
manifest, blobInfos, messages, 150),
2684 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2689 verifyBuildMessages(
2690 ValidatorList::buildValidatorListMessages(
2691 2, 5, maxSequence, version,
manifest, blobInfos, messages, 108),
2699 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2705 testcase(
"Test quorum disabled");
2707 std::string const siteUri =
"testQuorumDisabled.test";
2709 auto& app = env.
app();
2714 while (valKeys.
size() != maxKeys)
2731 auto makeValidatorList = [&,
this](
2744 app.config().legacy(
"database_path"),
2751 auto const publisherPublic =
2753 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
2761 pubSigningKeys.first,
2762 pubSigningKeys.second,
2763 i < countRevoked ?
revoked : 1));
2764 publishers.push_back(Publisher{
2776 valManifests.applyManifest(
2778 BEAST_EXPECT(result->load(
2779 self->signingPublic,
2787 result->load({}, emptyCfgKeys, cfgPublishers, threshold));
2792 using namespace std::chrono_literals;
2794 (i == countTotal - 1 ? 60s : 3600s);
2795 auto const blob = makeList(
2798 publishers[i].expiry.time_since_epoch().count());
2799 auto const sig = signList(blob, publishers[i].signingKeys);
2808 .bestDisposition() ==
2809 (publishers[i].
revoked ? ListDisposition::untrusted
2810 : ListDisposition::accepted));
2824 auto const self = randomValidator();
2825 auto const keysTotal = valKeys.
size() + 1;
2826 auto trustedKeys = makeValidatorList(
2834 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2835 for (
auto const& p : publishers)
2836 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2844 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2846 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2850 for (
auto const& val : valKeys)
2852 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2855 BEAST_EXPECT(changes.
added == added);
2856 BEAST_EXPECT(changes.
removed.empty());
2860 changes = trustedKeys->updateTrusted(
2866 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2867 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2870 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2871 for (
auto const& val : valKeys)
2873 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2874 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2877 BEAST_EXPECT(changes.
added.empty());
2878 BEAST_EXPECT(changes.
removed == removed);
2885 auto const keysTotal = valKeys.
size();
2886 auto trustedKeys = makeValidatorList(
2894 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2895 for (
auto const& p : publishers)
2896 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2904 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2906 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2909 for (
auto const& val : valKeys)
2911 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2914 BEAST_EXPECT(changes.
added == added);
2915 BEAST_EXPECT(changes.
removed.empty());
2919 changes = trustedKeys->updateTrusted(
2925 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2926 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
2929 for (
auto const& val : valKeys)
2931 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2932 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2935 BEAST_EXPECT(changes.
added.empty());
2936 BEAST_EXPECT(changes.
removed == removed);
2944 auto const self = valKeys[1];
2945 auto const keysTotal = valKeys.
size();
2946 auto trustedKeys = makeValidatorList(
2954 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
2955 int untrustedCount = 0;
2956 for (
auto const& p : publishers)
2958 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2959 BEAST_EXPECT(p.revoked ^ trusted);
2960 untrustedCount += trusted ? 0 : 1;
2962 BEAST_EXPECT(untrustedCount == 1);
2970 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2972 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2975 for (
auto const& val : valKeys)
2977 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2980 BEAST_EXPECT(changes.
added == added);
2981 BEAST_EXPECT(changes.
removed.empty());
2985 changes = trustedKeys->updateTrusted(
2991 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2992 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2995 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2996 for (
auto const& val : valKeys)
2998 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2999 if (val.masterPublic != self.masterPublic)
3001 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3005 BEAST_EXPECT(changes.
added.empty());
3006 BEAST_EXPECT(changes.
removed == removed);
3014 auto const self = randomValidator();
3015 auto const keysTotal = valKeys.
size() + 1;
3016 auto trustedKeys = makeValidatorList(
3024 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3025 int untrustedCount = 0;
3026 for (
auto const& p : publishers)
3028 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3029 BEAST_EXPECT(p.revoked ^ trusted);
3030 untrustedCount += trusted ? 0 : 1;
3032 BEAST_EXPECT(untrustedCount == 2);
3040 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3042 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3046 for (
auto const& val : valKeys)
3048 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3051 BEAST_EXPECT(changes.
added == added);
3052 BEAST_EXPECT(changes.
removed.empty());
3056 changes = trustedKeys->updateTrusted(
3062 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3063 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3066 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3067 for (
auto const& val : valKeys)
3069 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3070 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3073 BEAST_EXPECT(changes.
added.empty());
3074 BEAST_EXPECT(changes.
removed == removed);
3082 auto const self = valKeys[5];
3083 auto const keysTotal = valKeys.
size();
3084 auto trustedKeys = makeValidatorList(
3092 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3093 int untrustedCount = 0;
3094 for (
auto const& p : publishers)
3096 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3097 BEAST_EXPECT(p.revoked ^ trusted);
3098 untrustedCount += trusted ? 0 : 1;
3100 BEAST_EXPECT(untrustedCount == 2);
3108 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3110 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3113 for (
auto const& val : valKeys)
3115 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3118 BEAST_EXPECT(changes.
added == added);
3119 BEAST_EXPECT(changes.
removed.empty());
3123 changes = trustedKeys->updateTrusted(
3129 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3130 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3133 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3134 for (
auto const& val : valKeys)
3136 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3137 if (val.masterPublic != self.masterPublic)
3139 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3143 BEAST_EXPECT(changes.
added.empty());
3144 BEAST_EXPECT(changes.
removed == removed);
3151 auto const keysTotal = valKeys.
size();
3152 auto trustedKeys = makeValidatorList(
3160 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3161 int untrustedCount = 0;
3162 for (
auto const& p : publishers)
3164 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3165 BEAST_EXPECT(p.revoked ^ trusted);
3166 untrustedCount += trusted ? 0 : 1;
3168 BEAST_EXPECT(untrustedCount == 2);
3176 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3178 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3181 for (
auto const& val : valKeys)
3183 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3186 BEAST_EXPECT(changes.
added == added);
3187 BEAST_EXPECT(changes.
removed.empty());
3191 changes = trustedKeys->updateTrusted(
3197 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3198 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3201 for (
auto const& val : valKeys)
3203 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3204 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3207 BEAST_EXPECT(changes.
added.empty());
3208 BEAST_EXPECT(changes.
removed == removed);
3216 auto const self = randomValidator();
3217 auto const keysTotal = valKeys.
size() + 1;
3218 auto trustedKeys = makeValidatorList(
3226 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3227 int untrustedCount = 0;
3228 for (
auto const& p : publishers)
3230 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3231 BEAST_EXPECT(p.revoked ^ trusted);
3232 untrustedCount += trusted ? 0 : 1;
3234 BEAST_EXPECT(untrustedCount == 1);
3242 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3244 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3248 for (
auto const& val : valKeys)
3250 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3253 BEAST_EXPECT(changes.
added == added);
3254 BEAST_EXPECT(changes.
removed.empty());
3258 changes = trustedKeys->updateTrusted(
3264 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3266 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3268 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3269 for (
auto const& val : valKeys)
3271 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3272 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3274 BEAST_EXPECT(changes.
added.empty());
3275 BEAST_EXPECT(changes.
removed.empty());
3283 auto const self = randomValidator();
3284 auto const keysTotal = valKeys.
size() + 1;
3285 auto trustedKeys = makeValidatorList(
3293 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3294 for (
auto const& p : publishers)
3295 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3303 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3305 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3309 for (
auto const& val : valKeys)
3311 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3314 BEAST_EXPECT(changes.
added == added);
3315 BEAST_EXPECT(changes.
removed.empty());
3319 changes = trustedKeys->updateTrusted(
3325 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3327 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3329 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3330 for (
auto const& val : valKeys)
3332 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3333 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3335 BEAST_EXPECT(changes.
added.empty());
3336 BEAST_EXPECT(changes.
removed.empty());
3344 auto const self = valKeys[7];
3345 auto const keysTotal = valKeys.
size();
3346 auto trustedKeys = makeValidatorList(
3354 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3355 for (
auto const& p : publishers)
3356 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3364 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3366 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3369 for (
auto const& val : valKeys)
3371 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3374 BEAST_EXPECT(changes.
added == added);
3375 BEAST_EXPECT(changes.
removed.empty());
3379 changes = trustedKeys->updateTrusted(
3385 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3387 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3389 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3390 for (
auto const& val : valKeys)
3392 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3393 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3395 BEAST_EXPECT(changes.
added.empty());
3396 BEAST_EXPECT(changes.
removed.empty());
3403 auto const keysTotal = valKeys.
size();
3404 auto trustedKeys = makeValidatorList(
3412 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3413 for (
auto const& p : publishers)
3414 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3422 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3424 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3427 for (
auto const& val : valKeys)
3429 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3432 BEAST_EXPECT(changes.
added == added);
3433 BEAST_EXPECT(changes.
removed.empty());
3437 changes = trustedKeys->updateTrusted(
3443 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3445 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3447 for (
auto const& val : valKeys)
3449 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3450 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3452 BEAST_EXPECT(changes.
added.empty());
3453 BEAST_EXPECT(changes.
removed.empty());
3463 auto const self = randomValidator();
3464 auto const keysTotal = valKeys.
size() + 1;
3465 auto trustedKeys = makeValidatorList(
3473 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3474 int untrustedCount = 0;
3475 for (
auto const& p : publishers)
3477 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3478 BEAST_EXPECT(p.revoked ^ trusted);
3479 untrustedCount += trusted ? 0 : 1;
3481 BEAST_EXPECT(untrustedCount == 1);
3489 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3491 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3495 for (
auto const& val : valKeys)
3497 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3500 BEAST_EXPECT(changes.
added == added);
3501 BEAST_EXPECT(changes.
removed.empty());
3505 changes = trustedKeys->updateTrusted(
3511 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3512 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3515 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3516 for (
auto const& val : valKeys)
3518 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3519 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3522 BEAST_EXPECT(changes.
added.empty());
3523 BEAST_EXPECT(changes.
removed == removed);
3531 auto const self = valKeys[5];
3532 auto const keysTotal = valKeys.
size();
3533 auto trustedKeys = makeValidatorList(
3541 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3542 int untrustedCount = 0;
3543 for (
auto const& p : publishers)
3545 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3546 BEAST_EXPECT(p.revoked ^ trusted);
3547 untrustedCount += trusted ? 0 : 1;
3549 BEAST_EXPECT(untrustedCount == 1);
3557 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3559 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3562 for (
auto const& val : valKeys)
3564 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3567 BEAST_EXPECT(changes.
added == added);
3568 BEAST_EXPECT(changes.
removed.empty());
3572 changes = trustedKeys->updateTrusted(
3578 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3579 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3582 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3583 for (
auto const& val : valKeys)
3585 if (val.masterPublic != self.masterPublic)
3587 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3588 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3592 BEAST_EXPECT(changes.
added.empty());
3593 BEAST_EXPECT(changes.
removed == removed);
3600 auto const keysTotal = valKeys.
size();
3601 auto trustedKeys = makeValidatorList(
3609 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3610 int untrustedCount = 0;
3611 for (
auto const& p : publishers)
3613 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3614 BEAST_EXPECT(p.revoked ^ trusted);
3615 untrustedCount += trusted ? 0 : 1;
3617 BEAST_EXPECT(untrustedCount == 1);
3625 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3627 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3630 for (
auto const& val : valKeys)
3632 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3635 BEAST_EXPECT(changes.
added == added);
3636 BEAST_EXPECT(changes.
removed.empty());
3640 changes = trustedKeys->updateTrusted(
3646 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3647 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3650 for (
auto const& val : valKeys)
3652 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3653 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3656 BEAST_EXPECT(changes.
added.empty());
3657 BEAST_EXPECT(changes.
removed == removed);
3665 auto const self = randomValidator();
3666 auto const keysTotal = valKeys.
size() + 1;
3667 auto trustedKeys = makeValidatorList(
3675 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3676 for (
auto const& p : publishers)
3677 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3685 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3687 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3691 for (
auto const& val : valKeys)
3693 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3696 BEAST_EXPECT(changes.
added == added);
3697 BEAST_EXPECT(changes.
removed.empty());
3701 changes = trustedKeys->updateTrusted(
3707 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3708 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3711 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3712 for (
auto const& val : valKeys)
3714 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3715 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3718 BEAST_EXPECT(changes.
added.empty());
3719 BEAST_EXPECT(changes.
removed == removed);
3727 auto const self = valKeys[5];
3728 auto const keysTotal = valKeys.
size();
3729 auto trustedKeys = makeValidatorList(
3737 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3738 for (
auto const& p : publishers)
3739 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3747 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3749 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3753 for (
auto const& val : valKeys)
3755 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3758 BEAST_EXPECT(changes.
added == added);
3759 BEAST_EXPECT(changes.
removed.empty());
3763 changes = trustedKeys->updateTrusted(
3769 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3770 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3773 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3774 for (
auto const& val : valKeys)
3776 if (val.masterPublic != self.masterPublic)
3778 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3779 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3783 BEAST_EXPECT(changes.
added.empty());
3784 BEAST_EXPECT(changes.
removed == removed);
3791 auto const keysTotal = valKeys.
size();
3792 auto trustedKeys = makeValidatorList(
3800 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3801 for (
auto const& p : publishers)
3802 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3810 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3812 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3815 for (
auto const& val : valKeys)
3817 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3820 BEAST_EXPECT(changes.
added == added);
3821 BEAST_EXPECT(changes.
removed.empty());
3825 changes = trustedKeys->updateTrusted(
3831 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3832 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3835 for (
auto const& val : valKeys)
3837 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3838 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3841 BEAST_EXPECT(changes.
added.empty());
3842 BEAST_EXPECT(changes.
removed == removed);
3852 auto const self = randomValidator();
3853 auto const keysTotal = valKeys.
size() + 1;
3854 auto trustedKeys = makeValidatorList(
3862 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3863 for (
auto const& p : publishers)
3864 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3872 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3874 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3878 for (
auto const& val : valKeys)
3880 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3883 BEAST_EXPECT(changes.
added == added);
3884 BEAST_EXPECT(changes.
removed.empty());
3888 changes = trustedKeys->updateTrusted(
3894 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3895 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3898 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3899 for (
auto const& val : valKeys)
3901 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3902 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3905 BEAST_EXPECT(changes.
added.empty());
3906 BEAST_EXPECT(changes.
removed == removed);
3916 auto const self = valKeys[2];
3917 auto const keysTotal = valKeys.
size();
3918 auto trustedKeys = makeValidatorList(
3926 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3927 for (
auto const& p : publishers)
3928 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3936 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3938 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3941 for (
auto const& val : valKeys)
3943 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3946 BEAST_EXPECT(changes.
added == added);
3947 BEAST_EXPECT(changes.
removed.empty());
3956 auto const keysTotal = valKeys.
size();
3957 auto trustedKeys = makeValidatorList(
3965 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3966 for (
auto const& p : publishers)
3967 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3975 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3977 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3980 for (
auto const& val : valKeys)
3982 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3985 BEAST_EXPECT(changes.
added == added);
3986 BEAST_EXPECT(changes.
removed.empty());
3996 auto const self = randomValidator();
3997 auto const keysTotal = valKeys.
size() + 1;
3998 auto trustedKeys = makeValidatorList(
4006 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
4007 int untrustedCount = 0;
4008 for (
auto const& p : publishers)
4010 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
4011 BEAST_EXPECT(p.revoked ^ trusted);
4012 untrustedCount += trusted ? 0 : 1;
4014 BEAST_EXPECT(untrustedCount == 2);
4022 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
4024 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
4028 for (
auto const& val : valKeys)
4030 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
4033 BEAST_EXPECT(changes.
added == added);
4034 BEAST_EXPECT(changes.
removed.empty());
4038 changes = trustedKeys->updateTrusted(
4044 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
4045 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
4048 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
4049 for (
auto const& val : valKeys)
4051 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
4052 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
4055 BEAST_EXPECT(changes.
added.empty());
4056 BEAST_EXPECT(changes.
removed == removed);
4066 auto const self = valKeys[2];
4067 auto const keysTotal = valKeys.
size();
4068 auto trustedKeys = makeValidatorList(
4076 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
4077 int untrustedCount = 0;
4078 for (
auto const& p : publishers)
4080 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
4081 BEAST_EXPECT(p.revoked ^ trusted);
4082 untrustedCount += trusted ? 0 : 1;
4084 BEAST_EXPECT(untrustedCount == 3);
4092 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
4094 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
4097 for (
auto const& val : valKeys)
4099 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
4102 BEAST_EXPECT(changes.
added == added);
4103 BEAST_EXPECT(changes.
removed.empty());
4107 changes = trustedKeys->updateTrusted(
4113 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
4114 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
4117 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
4118 for (
auto const& val : valKeys)
4120 if (val.masterPublic != self.masterPublic)
4122 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
4123 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
4127 BEAST_EXPECT(changes.
added.empty());
4128 BEAST_EXPECT(changes.
removed == removed);