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) &&
2373 BEAST_EXPECT(header->message_type == protocol::mtVALIDATORLIST))
2376 detail::parseMessageContent<protocol::TMValidatorList>(
2377 *header, buffers.data());
2383 auto extractProtocolMessage2 = [
this,
2384 &extractHeader](
Message& message) {
2385 auto [header, buffers] = extractHeader(message);
2386 if (BEAST_EXPECT(header) &&
2388 header->message_type ==
2389 protocol::mtVALIDATORLISTCOLLECTION))
2391 auto const msg = detail::parseMessageContent<
2392 protocol::TMValidatorListCollection>(
2393 *header, buffers.data());
2399 auto verifyMessage =
2402 &extractProtocolMessage1,
2403 &extractProtocolMessage2](
2406 auto const& blobInfos,
2407 auto const& messages,
2410 BEAST_EXPECT(messages.size() == expectedInfo.size());
2411 auto msgIter = expectedInfo.begin();
2412 for (
auto const& messageWithHash : messages)
2414 if (!BEAST_EXPECT(msgIter != expectedInfo.end()))
2416 if (!BEAST_EXPECT(messageWithHash.message))
2418 auto const& expectedSeqs = msgIter->second;
2419 auto seqIter = expectedSeqs.begin();
2421 messageWithHash.message
2422 ->getBuffer(compression::Compressed::Off)
2425 BEAST_EXPECT(size == msgIter->first);
2426 if (expectedSeqs.size() == 1)
2429 extractProtocolMessage1(*messageWithHash.message);
2430 auto const expectedVersion = 1;
2431 if (BEAST_EXPECT(msg))
2433 BEAST_EXPECT(msg->version() == expectedVersion);
2434 if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
2436 auto const& expectedBlob = blobInfos.at(*seqIter);
2438 (*seqIter < manifestCutoff) ==
2439 !!expectedBlob.manifest);
2440 auto const expectedManifest =
2441 *seqIter < manifestCutoff &&
2442 expectedBlob.manifest
2443 ? *expectedBlob.manifest
2445 BEAST_EXPECT(msg->manifest() == expectedManifest);
2446 BEAST_EXPECT(msg->blob() == expectedBlob.blob);
2448 msg->signature() == expectedBlob.signature);
2450 BEAST_EXPECT(seqIter == expectedSeqs.end());
2453 messageWithHash.hash ==
2457 expectedBlob.signature,
2464 hashingBlobs.
reserve(msgIter->second.size());
2467 extractProtocolMessage2(*messageWithHash.message);
2468 if (BEAST_EXPECT(msg))
2470 BEAST_EXPECT(msg->version() == version);
2471 BEAST_EXPECT(msg->manifest() ==
manifest);
2472 for (
auto const& blobInfo : msg->blobs())
2475 seqIter != expectedSeqs.end()))
2477 auto const& expectedBlob =
2478 blobInfos.at(*seqIter);
2481 blobInfo.has_manifest() ==
2482 !!expectedBlob.manifest);
2484 blobInfo.has_manifest() ==
2485 (*seqIter < manifestCutoff));
2487 if (*seqIter < manifestCutoff)
2489 blobInfo.manifest() ==
2490 *expectedBlob.manifest);
2492 blobInfo.blob() == expectedBlob.blob);
2494 blobInfo.signature() ==
2495 expectedBlob.signature);
2498 BEAST_EXPECT(seqIter == expectedSeqs.end());
2501 messageWithHash.hash ==
2506 BEAST_EXPECT(msgIter == expectedInfo.end());
2508 auto verifyBuildMessages =
2513 BEAST_EXPECT(result.
first == expectedSequence);
2514 BEAST_EXPECT(result.
second == expectedSize);
2520 auto const blobInfos = [manifestCutoff = manifestCutoff]() {
2523 for (
auto seq : {5, 6, 7, 10, 12})
2527 s <<
"This is not a blob with sequence " <<
seq;
2530 s <<
"This is not a signature for sequence " <<
seq;
2531 b.signature = s.
str();
2532 if (
seq < manifestCutoff)
2536 s <<
"This is not manifest " <<
seq;
2537 b.manifest = s.
str();
2542 auto const maxSequence = blobInfos.
rbegin()->first;
2543 BEAST_EXPECT(maxSequence == 12);
2550 verifyBuildMessages(
2551 ValidatorList::buildValidatorListMessages(
2552 1, 8, maxSequence, version,
manifest, blobInfos, messages),
2555 BEAST_EXPECT(messages.size() == 0);
2561 messages.emplace_back();
2562 verifyBuildMessages(
2563 ValidatorList::buildValidatorListMessages(
2564 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2567 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2571 verifyBuildMessages(
2572 ValidatorList::buildValidatorListMessages(
2573 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2576 if (BEAST_EXPECT(messages.size() == 1) &&
2577 BEAST_EXPECT(messages.front().message))
2579 auto const& messageWithHash = messages.front();
2580 auto const msg = extractProtocolMessage1(*messageWithHash.message);
2582 messageWithHash.message->getBuffer(compression::Compressed::Off)
2585 BEAST_EXPECT(size == 108);
2586 auto const& expected = blobInfos.at(5);
2587 if (BEAST_EXPECT(msg))
2589 BEAST_EXPECT(msg->version() == 1);
2590 BEAST_EXPECT(msg->manifest() == *expected.manifest);
2591 BEAST_EXPECT(msg->blob() == expected.blob);
2592 BEAST_EXPECT(msg->signature() == expected.signature);
2595 messageWithHash.hash ==
2597 *expected.manifest, expected.blob, expected.signature, 1));
2605 verifyBuildMessages(
2606 ValidatorList::buildValidatorListMessages(
2616 BEAST_EXPECT(messages.size() == 0);
2622 messages.emplace_back();
2623 verifyBuildMessages(
2624 ValidatorList::buildValidatorListMessages(
2625 2, 3, maxSequence, version,
manifest, blobInfos, messages),
2628 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2632 verifyBuildMessages(
2633 ValidatorList::buildValidatorListMessages(
2634 2, 5, maxSequence, version,
manifest, blobInfos, messages),
2638 version,
manifest, blobInfos, messages, {{372, {6, 7, 10, 12}}});
2644 verifyBuildMessages(
2645 ValidatorList::buildValidatorListMessages(
2646 2, 5, maxSequence, version,
manifest, blobInfos, messages, 300),
2654 {{212, {6, 7}}, {192, {10, 12}}});
2659 verifyBuildMessages(
2660 ValidatorList::buildValidatorListMessages(
2661 2, 5, maxSequence, version,
manifest, blobInfos, messages, 200),
2669 {{108, {6}}, {108, {7}}, {192, {10, 12}}});
2673 verifyBuildMessages(
2674 ValidatorList::buildValidatorListMessages(
2675 2, 5, maxSequence, version,
manifest, blobInfos, messages, 150),
2683 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2688 verifyBuildMessages(
2689 ValidatorList::buildValidatorListMessages(
2690 2, 5, maxSequence, version,
manifest, blobInfos, messages, 108),
2698 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2704 testcase(
"Test quorum disabled");
2706 std::string const siteUri =
"testQuorumDisabled.test";
2708 auto& app = env.
app();
2713 while (valKeys.
size() != maxKeys)
2730 auto makeValidatorList = [&,
this](
2743 app.config().legacy(
"database_path"),
2750 auto const publisherPublic =
2752 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
2760 pubSigningKeys.first,
2761 pubSigningKeys.second,
2762 i < countRevoked ?
revoked : 1));
2763 publishers.push_back(Publisher{
2775 valManifests.applyManifest(
2777 BEAST_EXPECT(result->load(
2778 self->signingPublic,
2786 result->load({}, emptyCfgKeys, cfgPublishers, threshold));
2791 using namespace std::chrono_literals;
2793 (i == countTotal - 1 ? 60s : 3600s);
2794 auto const blob = makeList(
2797 publishers[i].expiry.time_since_epoch().count());
2798 auto const sig = signList(blob, publishers[i].signingKeys);
2807 .bestDisposition() ==
2808 (publishers[i].
revoked ? ListDisposition::untrusted
2809 : ListDisposition::accepted));
2823 auto const self = randomValidator();
2824 auto const keysTotal = valKeys.
size() + 1;
2825 auto trustedKeys = makeValidatorList(
2833 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2834 for (
auto const& p : publishers)
2835 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2843 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2845 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2849 for (
auto const& val : valKeys)
2851 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2854 BEAST_EXPECT(changes.
added == added);
2855 BEAST_EXPECT(changes.
removed.empty());
2859 changes = trustedKeys->updateTrusted(
2865 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2866 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2869 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2870 for (
auto const& val : valKeys)
2872 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2873 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2876 BEAST_EXPECT(changes.
added.empty());
2877 BEAST_EXPECT(changes.
removed == removed);
2884 auto const keysTotal = valKeys.
size();
2885 auto trustedKeys = makeValidatorList(
2893 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2894 for (
auto const& p : publishers)
2895 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2903 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2905 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2908 for (
auto const& val : valKeys)
2910 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2913 BEAST_EXPECT(changes.
added == added);
2914 BEAST_EXPECT(changes.
removed.empty());
2918 changes = trustedKeys->updateTrusted(
2924 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2925 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
2928 for (
auto const& val : valKeys)
2930 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2931 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2934 BEAST_EXPECT(changes.
added.empty());
2935 BEAST_EXPECT(changes.
removed == removed);
2943 auto const self = valKeys[1];
2944 auto const keysTotal = valKeys.
size();
2945 auto trustedKeys = makeValidatorList(
2953 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
2954 int untrustedCount = 0;
2955 for (
auto const& p : publishers)
2957 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2958 BEAST_EXPECT(p.revoked ^ trusted);
2959 untrustedCount += trusted ? 0 : 1;
2961 BEAST_EXPECT(untrustedCount == 1);
2969 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2971 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2974 for (
auto const& val : valKeys)
2976 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2979 BEAST_EXPECT(changes.
added == added);
2980 BEAST_EXPECT(changes.
removed.empty());
2984 changes = trustedKeys->updateTrusted(
2990 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2991 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2994 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2995 for (
auto const& val : valKeys)
2997 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2998 if (val.masterPublic != self.masterPublic)
3000 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3004 BEAST_EXPECT(changes.
added.empty());
3005 BEAST_EXPECT(changes.
removed == removed);
3013 auto const self = randomValidator();
3014 auto const keysTotal = valKeys.
size() + 1;
3015 auto trustedKeys = makeValidatorList(
3023 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3024 int untrustedCount = 0;
3025 for (
auto const& p : publishers)
3027 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3028 BEAST_EXPECT(p.revoked ^ trusted);
3029 untrustedCount += trusted ? 0 : 1;
3031 BEAST_EXPECT(untrustedCount == 2);
3039 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3041 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3045 for (
auto const& val : valKeys)
3047 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3050 BEAST_EXPECT(changes.
added == added);
3051 BEAST_EXPECT(changes.
removed.empty());
3055 changes = trustedKeys->updateTrusted(
3061 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3062 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3065 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3066 for (
auto const& val : valKeys)
3068 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3069 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3072 BEAST_EXPECT(changes.
added.empty());
3073 BEAST_EXPECT(changes.
removed == removed);
3081 auto const self = valKeys[5];
3082 auto const keysTotal = valKeys.
size();
3083 auto trustedKeys = makeValidatorList(
3091 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3092 int untrustedCount = 0;
3093 for (
auto const& p : publishers)
3095 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3096 BEAST_EXPECT(p.revoked ^ trusted);
3097 untrustedCount += trusted ? 0 : 1;
3099 BEAST_EXPECT(untrustedCount == 2);
3107 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3109 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3112 for (
auto const& val : valKeys)
3114 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3117 BEAST_EXPECT(changes.
added == added);
3118 BEAST_EXPECT(changes.
removed.empty());
3122 changes = trustedKeys->updateTrusted(
3128 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3129 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3132 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3133 for (
auto const& val : valKeys)
3135 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3136 if (val.masterPublic != self.masterPublic)
3138 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3142 BEAST_EXPECT(changes.
added.empty());
3143 BEAST_EXPECT(changes.
removed == removed);
3150 auto const keysTotal = valKeys.
size();
3151 auto trustedKeys = makeValidatorList(
3159 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3160 int untrustedCount = 0;
3161 for (
auto const& p : publishers)
3163 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3164 BEAST_EXPECT(p.revoked ^ trusted);
3165 untrustedCount += trusted ? 0 : 1;
3167 BEAST_EXPECT(untrustedCount == 2);
3175 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3177 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3180 for (
auto const& val : valKeys)
3182 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3185 BEAST_EXPECT(changes.
added == added);
3186 BEAST_EXPECT(changes.
removed.empty());
3190 changes = trustedKeys->updateTrusted(
3196 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3197 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3200 for (
auto const& val : valKeys)
3202 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3203 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3206 BEAST_EXPECT(changes.
added.empty());
3207 BEAST_EXPECT(changes.
removed == removed);
3215 auto const self = randomValidator();
3216 auto const keysTotal = valKeys.
size() + 1;
3217 auto trustedKeys = makeValidatorList(
3225 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3226 int untrustedCount = 0;
3227 for (
auto const& p : publishers)
3229 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3230 BEAST_EXPECT(p.revoked ^ trusted);
3231 untrustedCount += trusted ? 0 : 1;
3233 BEAST_EXPECT(untrustedCount == 1);
3241 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3243 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3247 for (
auto const& val : valKeys)
3249 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3252 BEAST_EXPECT(changes.
added == added);
3253 BEAST_EXPECT(changes.
removed.empty());
3257 changes = trustedKeys->updateTrusted(
3263 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3265 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3267 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3268 for (
auto const& val : valKeys)
3270 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3271 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3273 BEAST_EXPECT(changes.
added.empty());
3274 BEAST_EXPECT(changes.
removed.empty());
3282 auto const self = randomValidator();
3283 auto const keysTotal = valKeys.
size() + 1;
3284 auto trustedKeys = makeValidatorList(
3292 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3293 for (
auto const& p : publishers)
3294 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3302 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3304 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3308 for (
auto const& val : valKeys)
3310 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3313 BEAST_EXPECT(changes.
added == added);
3314 BEAST_EXPECT(changes.
removed.empty());
3318 changes = trustedKeys->updateTrusted(
3324 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3326 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3328 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3329 for (
auto const& val : valKeys)
3331 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3332 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3334 BEAST_EXPECT(changes.
added.empty());
3335 BEAST_EXPECT(changes.
removed.empty());
3343 auto const self = valKeys[7];
3344 auto const keysTotal = valKeys.
size();
3345 auto trustedKeys = makeValidatorList(
3353 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3354 for (
auto const& p : publishers)
3355 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3363 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3365 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3368 for (
auto const& val : valKeys)
3370 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3373 BEAST_EXPECT(changes.
added == added);
3374 BEAST_EXPECT(changes.
removed.empty());
3378 changes = trustedKeys->updateTrusted(
3384 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3386 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3388 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3389 for (
auto const& val : valKeys)
3391 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3392 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3394 BEAST_EXPECT(changes.
added.empty());
3395 BEAST_EXPECT(changes.
removed.empty());
3402 auto const keysTotal = valKeys.
size();
3403 auto trustedKeys = makeValidatorList(
3411 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3412 for (
auto const& p : publishers)
3413 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3421 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3423 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3426 for (
auto const& val : valKeys)
3428 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3431 BEAST_EXPECT(changes.
added == added);
3432 BEAST_EXPECT(changes.
removed.empty());
3436 changes = trustedKeys->updateTrusted(
3442 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3444 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3446 for (
auto const& val : valKeys)
3448 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3449 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3451 BEAST_EXPECT(changes.
added.empty());
3452 BEAST_EXPECT(changes.
removed.empty());
3462 auto const self = randomValidator();
3463 auto const keysTotal = valKeys.
size() + 1;
3464 auto trustedKeys = makeValidatorList(
3472 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3473 int untrustedCount = 0;
3474 for (
auto const& p : publishers)
3476 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3477 BEAST_EXPECT(p.revoked ^ trusted);
3478 untrustedCount += trusted ? 0 : 1;
3480 BEAST_EXPECT(untrustedCount == 1);
3488 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3490 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3494 for (
auto const& val : valKeys)
3496 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3499 BEAST_EXPECT(changes.
added == added);
3500 BEAST_EXPECT(changes.
removed.empty());
3504 changes = trustedKeys->updateTrusted(
3510 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3511 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3514 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3515 for (
auto const& val : valKeys)
3517 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3518 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3521 BEAST_EXPECT(changes.
added.empty());
3522 BEAST_EXPECT(changes.
removed == removed);
3530 auto const self = valKeys[5];
3531 auto const keysTotal = valKeys.
size();
3532 auto trustedKeys = makeValidatorList(
3540 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3541 int untrustedCount = 0;
3542 for (
auto const& p : publishers)
3544 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3545 BEAST_EXPECT(p.revoked ^ trusted);
3546 untrustedCount += trusted ? 0 : 1;
3548 BEAST_EXPECT(untrustedCount == 1);
3556 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3558 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3561 for (
auto const& val : valKeys)
3563 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3566 BEAST_EXPECT(changes.
added == added);
3567 BEAST_EXPECT(changes.
removed.empty());
3571 changes = trustedKeys->updateTrusted(
3577 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3578 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3581 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3582 for (
auto const& val : valKeys)
3584 if (val.masterPublic != self.masterPublic)
3586 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3587 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3591 BEAST_EXPECT(changes.
added.empty());
3592 BEAST_EXPECT(changes.
removed == removed);
3599 auto const keysTotal = valKeys.
size();
3600 auto trustedKeys = makeValidatorList(
3608 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3609 int untrustedCount = 0;
3610 for (
auto const& p : publishers)
3612 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3613 BEAST_EXPECT(p.revoked ^ trusted);
3614 untrustedCount += trusted ? 0 : 1;
3616 BEAST_EXPECT(untrustedCount == 1);
3624 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3626 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3629 for (
auto const& val : valKeys)
3631 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3634 BEAST_EXPECT(changes.
added == added);
3635 BEAST_EXPECT(changes.
removed.empty());
3639 changes = trustedKeys->updateTrusted(
3645 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3646 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3649 for (
auto const& val : valKeys)
3651 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3652 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3655 BEAST_EXPECT(changes.
added.empty());
3656 BEAST_EXPECT(changes.
removed == removed);
3664 auto const self = randomValidator();
3665 auto const keysTotal = valKeys.
size() + 1;
3666 auto trustedKeys = makeValidatorList(
3674 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3675 for (
auto const& p : publishers)
3676 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3684 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3686 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3690 for (
auto const& val : valKeys)
3692 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3695 BEAST_EXPECT(changes.
added == added);
3696 BEAST_EXPECT(changes.
removed.empty());
3700 changes = trustedKeys->updateTrusted(
3706 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3707 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3710 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3711 for (
auto const& val : valKeys)
3713 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3714 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3717 BEAST_EXPECT(changes.
added.empty());
3718 BEAST_EXPECT(changes.
removed == removed);
3726 auto const self = valKeys[5];
3727 auto const keysTotal = valKeys.
size();
3728 auto trustedKeys = makeValidatorList(
3736 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3737 for (
auto const& p : publishers)
3738 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3746 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3748 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3752 for (
auto const& val : valKeys)
3754 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3757 BEAST_EXPECT(changes.
added == added);
3758 BEAST_EXPECT(changes.
removed.empty());
3762 changes = trustedKeys->updateTrusted(
3768 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3769 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3772 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3773 for (
auto const& val : valKeys)
3775 if (val.masterPublic != self.masterPublic)
3777 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3778 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3782 BEAST_EXPECT(changes.
added.empty());
3783 BEAST_EXPECT(changes.
removed == removed);
3790 auto const keysTotal = valKeys.
size();
3791 auto trustedKeys = makeValidatorList(
3799 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3800 for (
auto const& p : publishers)
3801 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3809 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3811 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3814 for (
auto const& val : valKeys)
3816 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3819 BEAST_EXPECT(changes.
added == added);
3820 BEAST_EXPECT(changes.
removed.empty());
3824 changes = trustedKeys->updateTrusted(
3830 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3831 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3834 for (
auto const& val : valKeys)
3836 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3837 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3840 BEAST_EXPECT(changes.
added.empty());
3841 BEAST_EXPECT(changes.
removed == removed);
3851 auto const self = randomValidator();
3852 auto const keysTotal = valKeys.
size() + 1;
3853 auto trustedKeys = makeValidatorList(
3861 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3862 for (
auto const& p : publishers)
3863 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3871 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3873 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3877 for (
auto const& val : valKeys)
3879 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3882 BEAST_EXPECT(changes.
added == added);
3883 BEAST_EXPECT(changes.
removed.empty());
3887 changes = trustedKeys->updateTrusted(
3893 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3894 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3897 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3898 for (
auto const& val : valKeys)
3900 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3901 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3904 BEAST_EXPECT(changes.
added.empty());
3905 BEAST_EXPECT(changes.
removed == removed);
3915 auto const self = valKeys[2];
3916 auto const keysTotal = valKeys.
size();
3917 auto trustedKeys = makeValidatorList(
3925 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3926 for (
auto const& p : publishers)
3927 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3935 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3937 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3940 for (
auto const& val : valKeys)
3942 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3945 BEAST_EXPECT(changes.
added == added);
3946 BEAST_EXPECT(changes.
removed.empty());
3955 auto const keysTotal = valKeys.
size();
3956 auto trustedKeys = makeValidatorList(
3964 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3965 for (
auto const& p : publishers)
3966 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3974 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3976 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3979 for (
auto const& val : valKeys)
3981 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3984 BEAST_EXPECT(changes.
added == added);
3985 BEAST_EXPECT(changes.
removed.empty());
3995 auto const self = randomValidator();
3996 auto const keysTotal = valKeys.
size() + 1;
3997 auto trustedKeys = makeValidatorList(
4005 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
4006 int untrustedCount = 0;
4007 for (
auto const& p : publishers)
4009 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
4010 BEAST_EXPECT(p.revoked ^ trusted);
4011 untrustedCount += trusted ? 0 : 1;
4013 BEAST_EXPECT(untrustedCount == 2);
4021 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
4023 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
4027 for (
auto const& val : valKeys)
4029 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
4032 BEAST_EXPECT(changes.
added == added);
4033 BEAST_EXPECT(changes.
removed.empty());
4037 changes = trustedKeys->updateTrusted(
4043 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
4044 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
4047 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
4048 for (
auto const& val : valKeys)
4050 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
4051 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
4054 BEAST_EXPECT(changes.
added.empty());
4055 BEAST_EXPECT(changes.
removed == removed);
4065 auto const self = valKeys[2];
4066 auto const keysTotal = valKeys.
size();
4067 auto trustedKeys = makeValidatorList(
4075 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
4076 int untrustedCount = 0;
4077 for (
auto const& p : publishers)
4079 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
4080 BEAST_EXPECT(p.revoked ^ trusted);
4081 untrustedCount += trusted ? 0 : 1;
4083 BEAST_EXPECT(untrustedCount == 3);
4091 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
4093 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
4096 for (
auto const& val : valKeys)
4098 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
4101 BEAST_EXPECT(changes.
added == added);
4102 BEAST_EXPECT(changes.
removed.empty());
4106 changes = trustedKeys->updateTrusted(
4112 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
4113 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
4116 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
4117 for (
auto const& val : valKeys)
4119 if (val.masterPublic != self.masterPublic)
4121 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
4122 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
4126 BEAST_EXPECT(changes.
added.empty());
4127 BEAST_EXPECT(changes.
removed == removed);