225 auto& app = env.
app();
230 auto const localSigningPublicOuter = localSigningKeys.first;
231 auto const localSigningSecret = localSigningKeys.second;
233 auto const localMasterPublic =
239 localSigningPublicOuter,
243 auto format = [](
PublicKey const& publicKey,
244 char const* comment =
nullptr) {
256 while (configList.
size() != 8)
261 {format(configList[0]),
262 format(configList[1],
" Comment"),
263 format(configList[2],
" Multi Word Comment"),
264 format(configList[3],
" Leading Whitespace"),
265 format(configList[4],
" Trailing Whitespace "),
266 format(configList[5],
" Leading & Trailing Whitespace "),
269 " Leading, Trailing & Internal Whitespace "),
270 format(configList[7],
" ")});
278 app.config().legacy(
"database_path"),
283 trustedKeys->load({}, emptyCfgKeys, emptyCfgPublishers));
286 BEAST_EXPECT(trustedKeys->load(
287 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
288 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
291 BEAST_EXPECT(trustedKeys->load(
292 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
294 BEAST_EXPECT(trustedKeys->listed(localMasterPublic));
295 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
304 app.config().legacy(
"database_path"),
307 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, emptyCfgPublishers));
309 for (
auto const& n : configList)
310 BEAST_EXPECT(trustedKeys->listed(n));
317 {format(masterNode1), format(masterNode2,
" Comment")});
319 trustedKeys->load({}, cfgMasterKeys, emptyCfgPublishers));
320 BEAST_EXPECT(trustedKeys->listed(masterNode1));
321 BEAST_EXPECT(trustedKeys->listed(masterNode2));
325 !trustedKeys->load({}, {
"NotAPublicKey"}, emptyCfgPublishers));
326 BEAST_EXPECT(!trustedKeys->load(
327 {}, {format(randomNode(),
"!")}, emptyCfgPublishers));
331 BEAST_EXPECT(!trustedKeys->load(
333 {format(randomNode(),
"!"), format(goodKey)},
334 emptyCfgPublishers));
335 BEAST_EXPECT(!trustedKeys->listed(goodKey));
344 app.config().legacy(
"database_path"),
347 auto const localSigningPublic =
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"),
369 BEAST_EXPECT(trustedKeys->load(
370 localSigningPublic, cfgKeys, emptyCfgPublishers));
372 BEAST_EXPECT(trustedKeys->localPublicKey() == localSigningPublic);
373 BEAST_EXPECT(trustedKeys->listed(localSigningPublic));
374 for (
auto const& n : configList)
375 BEAST_EXPECT(trustedKeys->listed(n));
384 app.config().legacy(
"database_path"),
389 BEAST_EXPECT(trustedKeys->load(
390 localSigningPublicOuter, cfgKeys, emptyCfgPublishers));
392 BEAST_EXPECT(trustedKeys->localPublicKey() == localMasterPublic);
393 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
394 BEAST_EXPECT(trustedKeys->listed(localMasterPublic));
395 for (
auto const& n : configList)
396 BEAST_EXPECT(trustedKeys->listed(n));
404 app.config().legacy(
"database_path"),
409 BEAST_EXPECT(!trustedKeys->load({}, emptyCfgKeys, badPublishers));
415 badPublishers.
clear();
416 for (
auto const& key : keys)
419 BEAST_EXPECT(!trustedKeys->load({}, emptyCfgKeys, badPublishers));
420 for (
auto const& key : keys)
421 BEAST_EXPECT(!trustedKeys->trustedPublisher(key));
425 for (
auto const& key : keys)
428 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
429 for (
auto const& key : keys)
430 BEAST_EXPECT(trustedKeys->trustedPublisher(key));
432 trustedKeys->getListThreshold() == keys.size() / 2 + 1);
440 app.config().legacy(
"database_path"),
449 for (
auto const& key : keys)
453 BEAST_EXPECT(trustedKeys->load(
455 for (
auto const& key : keys)
456 BEAST_EXPECT(trustedKeys->trustedPublisher(key));
457 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
468 app.config().legacy(
"database_path"),
472 auto const pubRevokedPublic =
480 pubRevokedSigning.first,
481 pubRevokedSigning.second,
490 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
492 BEAST_EXPECT(!trustedKeys->trustedPublisher(pubRevokedPublic));
493 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey1));
494 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey2));
496 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
507 app.config().legacy(
"database_path"),
511 auto const pubRevokedPublic =
519 pubRevokedSigning.first,
520 pubRevokedSigning.second,
528 BEAST_EXPECT(trustedKeys->load(
531 BEAST_EXPECT(!trustedKeys->trustedPublisher(pubRevokedPublic));
532 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey));
534 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
542 using namespace std::chrono_literals;
546 auto checkAvailable =
548 auto const& trustedKeys,
549 auto const& hexPublic,
554 auto const available = trustedKeys->getAvailable(hexPublic);
560 BEAST_EXPECT(a[jss::public_key] == hexPublic);
561 BEAST_EXPECT(a[jss::manifest] ==
manifest);
564 BEAST_EXPECT(a[jss::version] == version);
567 BEAST_EXPECT(expected.size() == 1);
568 BEAST_EXPECT(a[jss::blob] == expected[0].first);
569 BEAST_EXPECT(a[jss::signature] == expected[0].second);
570 BEAST_EXPECT(!a.isMember(jss::blobs_v2));
572 else if (BEAST_EXPECT(a.isMember(jss::blobs_v2)))
574 BEAST_EXPECT(!a.isMember(jss::blob));
575 BEAST_EXPECT(!a.isMember(jss::signature));
576 auto const& blobs_v2 = a[jss::blobs_v2];
578 blobs_v2.isArray() &&
579 blobs_v2.size() == expected.size());
581 for (
unsigned int i = 0; i < expected.size(); ++i)
584 blobs_v2[i][jss::blob] == expected[i].first);
586 blobs_v2[i][jss::signature] ==
595 auto& app = env.
app();
600 app.config().legacy(
"database_path"),
605 for (
auto const& val : list)
607 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
608 BEAST_EXPECT(trustedKeys->listed(val.signingPublic));
612 auto expectUntrusted =
614 for (
auto const& val : list)
616 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
617 BEAST_EXPECT(!trustedKeys->listed(val.signingPublic));
622 auto const publisherPublic =
624 auto const hexPublic =
625 strHex(publisherPublic.begin(), publisherPublic.end());
630 pubSigningKeys1.first,
631 pubSigningKeys1.second,
637 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgKeys1));
640 auto constexpr listSize = 20;
641 auto constexpr numLists = 9;
644 for (
auto i = 1; i <= numLists; ++i)
646 auto& list = lists[i];
647 list.reserve(listSize);
648 while (list.size() < listSize)
656 auto const version = 1;
657 auto const sequence1 = 1;
662 auto const expiredSig =
signList(expiredblob, pubSigningKeys1);
665 auto const sequence2 = 2;
668 auto const sig2 =
signList(blob2, pubSigningKeys1);
671 trustedKeys->applyLists(
674 {{expiredblob, expiredSig, {}}, {blob2, sig2, {}}},
680 expectTrusted(lists.at(2));
683 trustedKeys, hexPublic, manifest1, version, {{blob2, sig2}});
686 auto const version2 = 2;
687 auto const sequence7 = 7;
688 auto const effective7 = validUntil - 60s;
689 auto const expiration7 = effective7 + 3600s;
690 auto const blob7 = makeList(
693 expiration7.time_since_epoch().count(),
694 effective7.time_since_epoch().count());
695 auto const sig7 = signList(blob7, pubSigningKeys1);
697 auto const sequence8 = 8;
698 auto const effective8 = expiration7 - 60s;
699 auto const expiration8 = effective8 + 3600s;
700 auto const blob8 = makeList(
703 expiration8.time_since_epoch().count(),
704 effective8.time_since_epoch().count());
705 auto const sig8 = signList(blob8, pubSigningKeys1);
708 trustedKeys->applyLists(
711 {{blob7, sig7, {}}, {blob8, sig8, {}}},
714 ListDisposition::pending,
715 ListDisposition::pending);
717 expectUntrusted(lists.at(7));
718 expectUntrusted(lists.at(8));
721 auto const sequence6 = 6;
722 auto const effective6 = effective7 - 60s;
723 auto const expiration6 = effective6 + 3600s;
724 auto const blob6 = makeList(
727 expiration6.time_since_epoch().count(),
728 effective6.time_since_epoch().count());
729 auto const sig6 = signList(blob6, pubSigningKeys1);
732 auto const sequence6a = 5;
733 auto const effective6a = effective6 + 60s;
734 auto const expiration6a = effective6a + 3600s;
735 auto const blob6a = makeList(
738 expiration6a.time_since_epoch().count(),
739 effective6a.time_since_epoch().count());
740 auto const sig6a = signList(blob6a, pubSigningKeys1);
743 trustedKeys->applyLists(
746 {{blob6a, sig6a, {}}, {blob6, sig6, {}}},
749 ListDisposition::pending,
750 ListDisposition::pending);
752 expectUntrusted(lists.at(6));
753 expectTrusted(lists.at(2));
758 trustedKeys->applyLists(
761 {{blob7, sig7, {}}, {blob6, sig6, {}}},
764 ListDisposition::known_sequence,
765 ListDisposition::known_sequence);
767 expectUntrusted(lists.at(6));
768 expectUntrusted(lists.at(7));
769 expectTrusted(lists.at(2));
773 trustedKeys->applyLists(
774 "", version, {{blob7, sig7, {}}, {blob6, sig6, {}}}, siteUri),
776 ListDisposition::invalid,
777 ListDisposition::invalid);
780 trustedKeys->applyLists(
783 {{blob7, sig7, {}}, {blob6, sig6, {}}},
786 ListDisposition::invalid,
787 ListDisposition::invalid);
790 auto const untrustedManifest =
base64_encode(makeManifestString(
793 pubSigningKeys1.first,
794 pubSigningKeys1.second,
798 trustedKeys->applyLists(
799 untrustedManifest, version, {{blob2, sig2, {}}}, siteUri),
801 ListDisposition::untrusted,
802 ListDisposition::untrusted);
805 auto const badVersion = 666;
807 trustedKeys->applyLists(
808 manifest1, badVersion, {{blob2, sig2, {}}}, siteUri),
810 ListDisposition::unsupported_version,
811 ListDisposition::unsupported_version);
814 auto const sequence3 = 3;
815 auto const blob3 = makeList(
816 lists.at(3), sequence3, validUntil.time_since_epoch().count());
817 auto const sig3 = signList(blob3, pubSigningKeys1);
820 trustedKeys->applyLists(
821 manifest1, version, {{blob3, sig3, {}}}, siteUri),
823 ListDisposition::accepted,
824 ListDisposition::accepted);
826 expectUntrusted(lists.at(1));
827 expectUntrusted(lists.at(2));
828 expectTrusted(lists.at(3));
837 {{blob3, sig3}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
841 trustedKeys->applyLists(
844 {{blob2, sig2, {}}, {blob3, sig3, {}}},
847 ListDisposition::stale,
848 ListDisposition::same_sequence);
852 auto const pubSigningKeys2 =
randomKeyPair(KeyType::secp256k1);
856 pubSigningKeys2.first,
857 pubSigningKeys2.second,
860 auto const sequence4 = 4;
861 auto const blob4 = makeList(
862 lists.at(4), sequence4, validUntil.time_since_epoch().count());
863 auto const sig4 = signList(blob4, pubSigningKeys2);
866 trustedKeys->applyLists(
869 {{blob2, sig2, manifest1},
870 {blob3, sig3, manifest1},
874 ListDisposition::stale,
875 ListDisposition::accepted);
877 expectUntrusted(lists.at(2));
878 expectUntrusted(lists.at(3));
879 expectTrusted(lists.at(4));
886 {{blob4, sig4}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
888 auto const sequence5 = 5;
889 auto const blob5 = makeList(
890 lists.at(5), sequence5, validUntil.time_since_epoch().count());
891 auto const badSig = signList(blob5, pubSigningKeys1);
893 trustedKeys->applyLists(
894 manifest1, version, {{blob5, badSig, {}}}, siteUri),
896 ListDisposition::invalid,
897 ListDisposition::invalid);
899 expectUntrusted(lists.at(2));
900 expectUntrusted(lists.at(3));
901 expectTrusted(lists.at(4));
902 expectUntrusted(lists.at(5));
906 trustedKeys->applyLists(
909 {{blob7, sig7, {}}, {blob8, sig8, {}}},
912 ListDisposition::invalid,
913 ListDisposition::invalid);
915 expectTrusted(lists.at(4));
916 expectUntrusted(lists.at(7));
917 expectUntrusted(lists.at(8));
922 trustedKeys->updateTrusted(
927 env.app().getHashRouter());
929 expectUntrusted(lists.at(3));
930 expectTrusted(lists.at(6));
937 {{blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
943 env.timeKeeper().set(effective8);
944 trustedKeys->updateTrusted(
949 env.app().getHashRouter());
951 expectUntrusted(lists.at(6));
952 expectUntrusted(lists.at(7));
953 expectTrusted(lists.at(8));
955 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
961 auto const sig8_2 = signList(blob8, pubSigningKeys2);
964 trustedKeys->applyLists(
967 {{blob8, sig8, manifest1}, {blob8, sig8_2, {}}},
970 ListDisposition::invalid,
971 ListDisposition::same_sequence);
973 expectTrusted(lists.at(8));
975 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
979 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
981 makeRevocationString(publisherPublic, publisherSecret));
983 auto const sequence9 = 9;
984 auto const blob9 = makeList(
985 lists.at(9), sequence9, validUntil.time_since_epoch().count());
986 auto const sig9 = signList(blob9, signingKeysMax);
989 trustedKeys->applyLists(
990 maxManifest, version, {{blob9, sig9, {}}}, siteUri),
992 ListDisposition::untrusted,
993 ListDisposition::untrusted);
995 BEAST_EXPECT(!trustedKeys->trustedPublisher(publisherPublic));
996 for (
auto const& [num, list] : lists)
999 expectUntrusted(list);
1002 checkAvailable(trustedKeys, hexPublic, manifest2, 0, {});
1144 testcase(
"Update trusted");
1146 std::string const siteUri =
"testUpdateTrusted.test";
1150 auto& app = env.
app();
1155 app.config().legacy(
"database_path"),
1167 while (cfgKeys.
size() != maxKeys)
1169 auto const valKey = randomNode();
1171 if (cfgKeys.
size() <= maxKeys - 5)
1178 trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1182 TrustChanges changes = trustedKeysOuter->updateTrusted(
1183 activeValidatorsOuter,
1189 for (
auto const& val : unseenValidators)
1190 activeValidatorsOuter.
emplace(val);
1192 BEAST_EXPECT(changes.
added == activeValidatorsOuter);
1193 BEAST_EXPECT(changes.
removed.empty());
1195 trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1196 for (
auto const& val : cfgKeys)
1198 if (
auto const valKey =
1199 parseBase58<PublicKey>(TokenType::NodePublic, val))
1201 BEAST_EXPECT(trustedKeysOuter->listed(*valKey));
1202 BEAST_EXPECT(trustedKeysOuter->trusted(*valKey));
1208 changes = trustedKeysOuter->updateTrusted(
1209 activeValidatorsOuter,
1214 BEAST_EXPECT(changes.
added.empty());
1215 BEAST_EXPECT(changes.
removed.empty());
1217 trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1222 auto const masterPublic =
1226 {
toBase58(TokenType::NodePublic, masterPublic)});
1229 trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1231 auto const signingKeys1 =
randomKeyPair(KeyType::secp256k1);
1232 auto const signingPublic1 = signingKeys1.first;
1236 TrustChanges changes = trustedKeysOuter->updateTrusted(
1237 activeValidatorsOuter,
1242 BEAST_EXPECT(changes.
added == asNodeIDs({masterPublic}));
1243 BEAST_EXPECT(changes.
removed.empty());
1245 trustedKeysOuter->quorum() ==
std::ceil((maxKeys + 1) * 0.8f));
1246 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1247 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1248 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1249 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1256 signingKeys1.second,
1261 ManifestDisposition::accepted);
1262 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1263 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1264 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic1));
1265 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic1));
1269 auto const signingKeys2 =
randomKeyPair(KeyType::secp256k1);
1270 auto const signingPublic2 = signingKeys2.first;
1275 signingKeys2.second,
1279 ManifestDisposition::accepted);
1280 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1281 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1282 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic2));
1283 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic2));
1284 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1285 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1288 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
1289 auto const signingPublicMax = signingKeysMax.first;
1292 makeRevocationString(masterPublic, masterPrivate));
1294 BEAST_EXPECT(mMax->revoked());
1297 ManifestDisposition::accepted);
1299 manifestsOuter.
getSigningKey(masterPublic) == masterPublic);
1300 BEAST_EXPECT(manifestsOuter.
revoked(masterPublic));
1303 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1304 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1306 changes = trustedKeysOuter->updateTrusted(
1307 activeValidatorsOuter,
1312 BEAST_EXPECT(changes.
removed == asNodeIDs({masterPublic}));
1313 BEAST_EXPECT(changes.
added.empty());
1315 trustedKeysOuter->quorum() ==
std::ceil(maxKeys * 0.8f));
1316 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1317 BEAST_EXPECT(!trustedKeysOuter->trusted(masterPublic));
1318 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublicMax));
1319 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublicMax));
1320 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic2));
1321 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic2));
1322 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1323 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1332 app.config().legacy(
"database_path"),
1335 auto const publisherPublic =
1341 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1344 activeValidatorsOuter,
1349 BEAST_EXPECT(changes.
removed.empty());
1350 BEAST_EXPECT(changes.
added.empty());
1352 trustedKeys->quorum() ==
1362 app.config().legacy(
"database_path"),
1365 auto const masterPublic =
1368 {
toBase58(TokenType::NodePublic, masterPublic)});
1371 auto const publisher1Public =
1374 auto const publisher2Public =
1380 trustedKeys->load({}, cfgKeys, cfgPublishers,
std::size_t(2)));
1383 activeValidatorsOuter,
1388 BEAST_EXPECT(changes.
removed.empty());
1389 BEAST_EXPECT(changes.
added.size() == 1);
1390 BEAST_EXPECT(trustedKeys->listed(masterPublic));
1391 BEAST_EXPECT(trustedKeys->trusted(masterPublic));
1401 app.config().legacy(
"database_path"),
1412 while (cfgKeys.
size() < n)
1414 auto const valKey = randomNode();
1423 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishersOuter));
1431 BEAST_EXPECT(changes.
removed.empty());
1432 BEAST_EXPECT(changes.
added == expectedTrusted);
1433 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1436 activeValidators.
emplace(toBeSeen);
1437 changes = trustedKeys->updateTrusted(
1443 BEAST_EXPECT(changes.
removed.empty());
1444 BEAST_EXPECT(changes.
added.empty());
1445 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1453 app.config().legacy(
"database_path"),
1457 auto const publisherKeys =
randomKeyPair(KeyType::secp256k1);
1458 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1460 publisherKeys.first,
1461 publisherKeys.second,
1462 pubSigningKeys.first,
1463 pubSigningKeys.second,
1468 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgKeys));
1472 asNodeIDs({list[0].masterPublic, list[1].masterPublic}));
1475 auto const version = 1;
1476 auto const sequence = 1;
1477 using namespace std::chrono_literals;
1482 auto const sig = signList(blob, pubSigningKeys);
1485 ListDisposition::accepted ==
1487 ->applyLists(
manifest, version, {{blob,
sig, {}}}, siteUri)
1488 .bestDisposition());
1496 BEAST_EXPECT(changes.
removed.empty());
1497 BEAST_EXPECT(changes.
added == activeValidators);
1500 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1501 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1503 BEAST_EXPECT(trustedKeys->quorum() == 2);
1506 changes = trustedKeys->updateTrusted(
1512 BEAST_EXPECT(changes.
removed == activeValidators);
1513 BEAST_EXPECT(changes.
added.empty());
1514 BEAST_EXPECT(!trustedKeys->trusted(list[0].masterPublic));
1515 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1517 trustedKeys->quorum() ==
1523 auto const sequence2 = 2;
1526 auto const blob2 = makeList(
1528 auto const sig2 = signList(blob2, pubSigningKeys);
1531 ListDisposition::accepted ==
1534 manifest, version, {{blob2, sig2, {}}}, siteUri)
1535 .bestDisposition());
1537 changes = trustedKeys->updateTrusted(
1543 BEAST_EXPECT(changes.
removed.empty());
1546 asNodeIDs({list2[0].masterPublic, list2[1].masterPublic}));
1549 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1550 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1552 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1553 BEAST_EXPECT(!trustedKeys->trusted(list[1].signingPublic));
1554 BEAST_EXPECT(trustedKeys->quorum() == 2);
1562 app.config().legacy(
"database_path"),
1574 auto const valKey = randomNode();
1578 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers));
1585 BEAST_EXPECT(changes.
removed.empty());
1586 BEAST_EXPECT(changes.
added == asNodeIDs({valKey}));
1589 for (
auto const& key : activeKeys)
1590 BEAST_EXPECT(trustedKeys->trusted(key));
1599 app.config().legacy(
"database_path"),
1602 auto const localKey = randomNode();
1607 toBase58(TokenType::NodePublic, localKey)};
1610 while (cfgKeys.size() < cfgKeys.capacity())
1612 auto const valKey = randomNode();
1613 cfgKeys.push_back(
toBase58(TokenType::NodePublic, valKey));
1618 trustedKeys->load(localKey, cfgKeys, cfgPublishers));
1625 BEAST_EXPECT(changes.
removed.empty());
1626 if (cfgKeys.size() > 2)
1627 BEAST_EXPECT(changes.
added == asNodeIDs({valKey}));
1630 changes.
added == asNodeIDs({localKey, valKey}));
1633 trustedKeys->quorum() ==
std::ceil(cfgKeys.size() * 0.8f));
1635 for (
auto const& key : activeKeys)
1636 BEAST_EXPECT(trustedKeys->trusted(key));
1646 app.config().legacy(
"database_path"),
1653 while (valKeys.
size() != maxKeys)
1663 constexpr static int publishers = 3;
1666 decltype(valKeys)::const_iterator,
1675 auto addPublishedList = [&,
this](
int i) {
1677 auto const publisherPublic =
1679 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1683 pubSigningKeys.first,
1684 pubSigningKeys.second,
1688 {
strHex(publisherPublic)});
1692 BEAST_EXPECT(trustedKeys->load(
1693 {}, emptyCfgKeys, cfgPublishers,
std::size_t(1)));
1695 auto const version = 1;
1696 auto const sequence = 1;
1697 using namespace std::chrono_literals;
1701 locals[i].first, locals[i].second};
1702 auto const blob = makeList(
1704 auto const sig = signList(blob, pubSigningKeys);
1707 ListDisposition::accepted ==
1711 .bestDisposition());
1715 for (
auto i = 0; i < publishers; ++i)
1716 addPublishedList(i);
1717 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
1730 for (
auto const& val : valKeys)
1732 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1735 BEAST_EXPECT(changes.
added == added);
1736 BEAST_EXPECT(changes.
removed.empty());
1745 app.config().legacy(
"database_path"),
1752 while (valKeys.
size() != maxKeys)
1764 constexpr static int publishers = 3;
1767 decltype(valKeys)::const_iterator,
1776 auto addPublishedList = [&,
this](
1781 auto const publisherPublic =
1783 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1787 pubSigningKeys.first,
1788 pubSigningKeys.second,
1792 {
strHex(publisherPublic)});
1796 trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1798 auto const version = 1;
1799 auto const sequence = 1;
1800 using namespace std::chrono_literals;
1807 validUntil1 = validUntil;
1809 validUntil2 = validUntil;
1811 locals[i].first, locals[i].second};
1812 auto const blob = makeList(
1814 auto const sig = signList(blob, pubSigningKeys);
1817 ListDisposition::accepted ==
1821 .bestDisposition());
1827 for (
auto i = 0; i < publishers; ++i)
1828 addPublishedList(i, validUntil1, validUntil2);
1829 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
1839 trustedKeys->quorum() ==
1842 for (
auto const& val : valKeys)
1843 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1848 auto const& val = valKeys[i];
1849 if (i >= 1 && i < maxKeys - 2)
1851 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1855 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1857 BEAST_EXPECT(changes.
added == added);
1858 BEAST_EXPECT(changes.
removed.empty());
1862 changes = trustedKeys->updateTrusted(
1870 trustedKeys->quorum() ==
1873 for (
auto const& val : valKeys)
1874 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1879 auto const& val = valKeys[i];
1880 if (i >= 2 && i < maxKeys - 4)
1881 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1884 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1885 if (i >= 1 && i < maxKeys - 2)
1890 BEAST_EXPECT(changes.
added.empty());
1891 BEAST_EXPECT(changes.
removed == removed);
1895 changes = trustedKeys->updateTrusted(
1903 trustedKeys->quorum() ==
1909 auto const& val = valKeys[i];
1910 if (i < maxKeys - 4)
1911 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1913 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
1915 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1916 if (i >= 2 && i < maxKeys - 4)
1920 BEAST_EXPECT(changes.
added.empty());
1921 BEAST_EXPECT(changes.
removed == removed);
2366 testcase(
"Build and split messages");
2369 auto extractHeader = [
this](
Message& message) {
2370 auto const& buffer =
2371 message.getBuffer(compression::Compressed::Off);
2373 boost::beast::multi_buffer buffers;
2376 auto start = buffer.begin();
2377 auto end = buffer.end();
2379 buffers.commit(boost::asio::buffer_copy(
2380 buffers.prepare(slice.
size()), boost::asio::buffer(slice)));
2382 boost::system::error_code ec;
2384 detail::parseMessageHeader(ec, buffers.data(), buffers.size());
2388 auto extractProtocolMessage1 = [
this,
2389 &extractHeader](
Message& message) {
2390 auto [header, buffers] = extractHeader(message);
2391 if (BEAST_EXPECT(header) &&
2392 BEAST_EXPECT(header->message_type == protocol::mtVALIDATORLIST))
2395 detail::parseMessageContent<protocol::TMValidatorList>(
2396 *header, buffers.data());
2402 auto extractProtocolMessage2 = [
this,
2403 &extractHeader](
Message& message) {
2404 auto [header, buffers] = extractHeader(message);
2405 if (BEAST_EXPECT(header) &&
2407 header->message_type ==
2408 protocol::mtVALIDATORLISTCOLLECTION))
2410 auto const msg = detail::parseMessageContent<
2411 protocol::TMValidatorListCollection>(
2412 *header, buffers.data());
2418 auto verifyMessage =
2421 &extractProtocolMessage1,
2422 &extractProtocolMessage2](
2425 auto const& blobInfos,
2426 auto const& messages,
2429 BEAST_EXPECT(messages.size() == expectedInfo.size());
2430 auto msgIter = expectedInfo.begin();
2431 for (
auto const& messageWithHash : messages)
2433 if (!BEAST_EXPECT(msgIter != expectedInfo.end()))
2435 if (!BEAST_EXPECT(messageWithHash.message))
2437 auto const& expectedSeqs = msgIter->second;
2438 auto seqIter = expectedSeqs.begin();
2440 messageWithHash.message
2441 ->getBuffer(compression::Compressed::Off)
2444 BEAST_EXPECT(size == msgIter->first);
2445 if (expectedSeqs.size() == 1)
2448 extractProtocolMessage1(*messageWithHash.message);
2449 auto const expectedVersion = 1;
2450 if (BEAST_EXPECT(msg))
2452 BEAST_EXPECT(msg->version() == expectedVersion);
2453 if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
2455 auto const& expectedBlob = blobInfos.at(*seqIter);
2457 (*seqIter < manifestCutoff) ==
2458 !!expectedBlob.manifest);
2459 auto const expectedManifest =
2460 *seqIter < manifestCutoff &&
2461 expectedBlob.manifest
2462 ? *expectedBlob.manifest
2464 BEAST_EXPECT(msg->manifest() == expectedManifest);
2465 BEAST_EXPECT(msg->blob() == expectedBlob.blob);
2467 msg->signature() == expectedBlob.signature);
2469 BEAST_EXPECT(seqIter == expectedSeqs.end());
2472 messageWithHash.hash ==
2476 expectedBlob.signature,
2483 hashingBlobs.
reserve(msgIter->second.size());
2486 extractProtocolMessage2(*messageWithHash.message);
2487 if (BEAST_EXPECT(msg))
2489 BEAST_EXPECT(msg->version() == version);
2490 BEAST_EXPECT(msg->manifest() ==
manifest);
2491 for (
auto const& blobInfo : msg->blobs())
2494 seqIter != expectedSeqs.end()))
2496 auto const& expectedBlob =
2497 blobInfos.at(*seqIter);
2500 blobInfo.has_manifest() ==
2501 !!expectedBlob.manifest);
2503 blobInfo.has_manifest() ==
2504 (*seqIter < manifestCutoff));
2506 if (*seqIter < manifestCutoff)
2508 blobInfo.manifest() ==
2509 *expectedBlob.manifest);
2511 blobInfo.blob() == expectedBlob.blob);
2513 blobInfo.signature() ==
2514 expectedBlob.signature);
2517 BEAST_EXPECT(seqIter == expectedSeqs.end());
2520 messageWithHash.hash ==
2525 BEAST_EXPECT(msgIter == expectedInfo.end());
2527 auto verifyBuildMessages =
2532 BEAST_EXPECT(result.
first == expectedSequence);
2533 BEAST_EXPECT(result.
second == expectedSize);
2539 auto const blobInfos = [manifestCutoff = manifestCutoff]() {
2542 for (
auto seq : {5, 6, 7, 10, 12})
2546 s <<
"This is not a blob with sequence " <<
seq;
2549 s <<
"This is not a signature for sequence " <<
seq;
2550 b.signature = s.
str();
2551 if (
seq < manifestCutoff)
2555 s <<
"This is not manifest " <<
seq;
2556 b.manifest = s.
str();
2561 auto const maxSequence = blobInfos.
rbegin()->first;
2562 BEAST_EXPECT(maxSequence == 12);
2569 verifyBuildMessages(
2570 ValidatorList::buildValidatorListMessages(
2571 1, 8, maxSequence, version,
manifest, blobInfos, messages),
2574 BEAST_EXPECT(messages.size() == 0);
2580 messages.emplace_back();
2581 verifyBuildMessages(
2582 ValidatorList::buildValidatorListMessages(
2583 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2586 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2590 verifyBuildMessages(
2591 ValidatorList::buildValidatorListMessages(
2592 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2595 if (BEAST_EXPECT(messages.size() == 1) &&
2596 BEAST_EXPECT(messages.front().message))
2598 auto const& messageWithHash = messages.front();
2599 auto const msg = extractProtocolMessage1(*messageWithHash.message);
2601 messageWithHash.message->getBuffer(compression::Compressed::Off)
2604 BEAST_EXPECT(size == 108);
2605 auto const& expected = blobInfos.at(5);
2606 if (BEAST_EXPECT(msg))
2608 BEAST_EXPECT(msg->version() == 1);
2609 BEAST_EXPECT(msg->manifest() == *expected.manifest);
2610 BEAST_EXPECT(msg->blob() == expected.blob);
2611 BEAST_EXPECT(msg->signature() == expected.signature);
2614 messageWithHash.hash ==
2616 *expected.manifest, expected.blob, expected.signature, 1));
2624 verifyBuildMessages(
2625 ValidatorList::buildValidatorListMessages(
2635 BEAST_EXPECT(messages.size() == 0);
2641 messages.emplace_back();
2642 verifyBuildMessages(
2643 ValidatorList::buildValidatorListMessages(
2644 2, 3, maxSequence, version,
manifest, blobInfos, messages),
2647 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2651 verifyBuildMessages(
2652 ValidatorList::buildValidatorListMessages(
2653 2, 5, maxSequence, version,
manifest, blobInfos, messages),
2657 version,
manifest, blobInfos, messages, {{372, {6, 7, 10, 12}}});
2663 verifyBuildMessages(
2664 ValidatorList::buildValidatorListMessages(
2665 2, 5, maxSequence, version,
manifest, blobInfos, messages, 300),
2673 {{212, {6, 7}}, {192, {10, 12}}});
2678 verifyBuildMessages(
2679 ValidatorList::buildValidatorListMessages(
2680 2, 5, maxSequence, version,
manifest, blobInfos, messages, 200),
2688 {{108, {6}}, {108, {7}}, {192, {10, 12}}});
2692 verifyBuildMessages(
2693 ValidatorList::buildValidatorListMessages(
2694 2, 5, maxSequence, version,
manifest, blobInfos, messages, 150),
2702 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2707 verifyBuildMessages(
2708 ValidatorList::buildValidatorListMessages(
2709 2, 5, maxSequence, version,
manifest, blobInfos, messages, 108),
2717 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2723 testcase(
"Test quorum disabled");
2725 std::string const siteUri =
"testQuorumDisabled.test";
2727 auto& app = env.
app();
2732 while (valKeys.
size() != maxKeys)
2749 auto makeValidatorList = [&,
this](
2762 app.config().legacy(
"database_path"),
2769 auto const publisherPublic =
2771 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
2779 pubSigningKeys.first,
2780 pubSigningKeys.second,
2781 i < countRevoked ?
revoked : 1));
2782 publishers.push_back(Publisher{
2794 valManifests.applyManifest(
2796 BEAST_EXPECT(result->load(
2797 self->signingPublic,
2805 result->load({}, emptyCfgKeys, cfgPublishers, threshold));
2810 using namespace std::chrono_literals;
2812 (i == countTotal - 1 ? 60s : 3600s);
2813 auto const blob = makeList(
2816 publishers[i].expiry.time_since_epoch().count());
2817 auto const sig = signList(blob, publishers[i].signingKeys);
2826 .bestDisposition() ==
2827 (publishers[i].
revoked ? ListDisposition::untrusted
2828 : ListDisposition::accepted));
2842 auto const self = randomValidator();
2843 auto const keysTotal = valKeys.
size() + 1;
2844 auto trustedKeys = makeValidatorList(
2852 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2853 for (
auto const& p : publishers)
2854 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2862 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2864 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2868 for (
auto const& val : valKeys)
2870 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2873 BEAST_EXPECT(changes.
added == added);
2874 BEAST_EXPECT(changes.
removed.empty());
2878 changes = trustedKeys->updateTrusted(
2884 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2885 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2888 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2889 for (
auto const& val : valKeys)
2891 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2892 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2895 BEAST_EXPECT(changes.
added.empty());
2896 BEAST_EXPECT(changes.
removed == removed);
2903 auto const keysTotal = valKeys.
size();
2904 auto trustedKeys = makeValidatorList(
2912 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2913 for (
auto const& p : publishers)
2914 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2922 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2924 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2927 for (
auto const& val : valKeys)
2929 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2932 BEAST_EXPECT(changes.
added == added);
2933 BEAST_EXPECT(changes.
removed.empty());
2937 changes = trustedKeys->updateTrusted(
2943 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2944 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
2947 for (
auto const& val : valKeys)
2949 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2950 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2953 BEAST_EXPECT(changes.
added.empty());
2954 BEAST_EXPECT(changes.
removed == removed);
2962 auto const self = valKeys[1];
2963 auto const keysTotal = valKeys.
size();
2964 auto trustedKeys = makeValidatorList(
2972 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
2973 int untrustedCount = 0;
2974 for (
auto const& p : publishers)
2976 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2977 BEAST_EXPECT(p.revoked ^ trusted);
2978 untrustedCount += trusted ? 0 : 1;
2980 BEAST_EXPECT(untrustedCount == 1);
2988 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2990 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2993 for (
auto const& val : valKeys)
2995 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2998 BEAST_EXPECT(changes.
added == added);
2999 BEAST_EXPECT(changes.
removed.empty());
3003 changes = trustedKeys->updateTrusted(
3009 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3010 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3013 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3014 for (
auto const& val : valKeys)
3016 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3017 if (val.masterPublic != self.masterPublic)
3019 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3023 BEAST_EXPECT(changes.
added.empty());
3024 BEAST_EXPECT(changes.
removed == removed);
3032 auto const self = randomValidator();
3033 auto const keysTotal = valKeys.
size() + 1;
3034 auto trustedKeys = makeValidatorList(
3042 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3043 int untrustedCount = 0;
3044 for (
auto const& p : publishers)
3046 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3047 BEAST_EXPECT(p.revoked ^ trusted);
3048 untrustedCount += trusted ? 0 : 1;
3050 BEAST_EXPECT(untrustedCount == 2);
3058 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3060 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3064 for (
auto const& val : valKeys)
3066 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3069 BEAST_EXPECT(changes.
added == added);
3070 BEAST_EXPECT(changes.
removed.empty());
3074 changes = trustedKeys->updateTrusted(
3080 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3081 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3084 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3085 for (
auto const& val : valKeys)
3087 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3088 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3091 BEAST_EXPECT(changes.
added.empty());
3092 BEAST_EXPECT(changes.
removed == removed);
3100 auto const self = valKeys[5];
3101 auto const keysTotal = valKeys.
size();
3102 auto trustedKeys = makeValidatorList(
3110 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3111 int untrustedCount = 0;
3112 for (
auto const& p : publishers)
3114 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3115 BEAST_EXPECT(p.revoked ^ trusted);
3116 untrustedCount += trusted ? 0 : 1;
3118 BEAST_EXPECT(untrustedCount == 2);
3126 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3128 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3131 for (
auto const& val : valKeys)
3133 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3136 BEAST_EXPECT(changes.
added == added);
3137 BEAST_EXPECT(changes.
removed.empty());
3141 changes = trustedKeys->updateTrusted(
3147 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3148 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3151 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3152 for (
auto const& val : valKeys)
3154 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3155 if (val.masterPublic != self.masterPublic)
3157 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3161 BEAST_EXPECT(changes.
added.empty());
3162 BEAST_EXPECT(changes.
removed == removed);
3169 auto const keysTotal = valKeys.
size();
3170 auto trustedKeys = makeValidatorList(
3178 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3179 int untrustedCount = 0;
3180 for (
auto const& p : publishers)
3182 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3183 BEAST_EXPECT(p.revoked ^ trusted);
3184 untrustedCount += trusted ? 0 : 1;
3186 BEAST_EXPECT(untrustedCount == 2);
3194 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3196 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3199 for (
auto const& val : valKeys)
3201 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3204 BEAST_EXPECT(changes.
added == added);
3205 BEAST_EXPECT(changes.
removed.empty());
3209 changes = trustedKeys->updateTrusted(
3215 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3216 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3219 for (
auto const& val : valKeys)
3221 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3222 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3225 BEAST_EXPECT(changes.
added.empty());
3226 BEAST_EXPECT(changes.
removed == removed);
3234 auto const self = randomValidator();
3235 auto const keysTotal = valKeys.
size() + 1;
3236 auto trustedKeys = makeValidatorList(
3244 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3245 int untrustedCount = 0;
3246 for (
auto const& p : publishers)
3248 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3249 BEAST_EXPECT(p.revoked ^ trusted);
3250 untrustedCount += trusted ? 0 : 1;
3252 BEAST_EXPECT(untrustedCount == 1);
3260 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3262 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3266 for (
auto const& val : valKeys)
3268 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3271 BEAST_EXPECT(changes.
added == added);
3272 BEAST_EXPECT(changes.
removed.empty());
3276 changes = trustedKeys->updateTrusted(
3282 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3284 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3286 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3287 for (
auto const& val : valKeys)
3289 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3290 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3292 BEAST_EXPECT(changes.
added.empty());
3293 BEAST_EXPECT(changes.
removed.empty());
3301 auto const self = randomValidator();
3302 auto const keysTotal = valKeys.
size() + 1;
3303 auto trustedKeys = makeValidatorList(
3311 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3312 for (
auto const& p : publishers)
3313 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3321 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3323 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3327 for (
auto const& val : valKeys)
3329 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3332 BEAST_EXPECT(changes.
added == added);
3333 BEAST_EXPECT(changes.
removed.empty());
3337 changes = trustedKeys->updateTrusted(
3343 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3345 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3347 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3348 for (
auto const& val : valKeys)
3350 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3351 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3353 BEAST_EXPECT(changes.
added.empty());
3354 BEAST_EXPECT(changes.
removed.empty());
3362 auto const self = valKeys[7];
3363 auto const keysTotal = valKeys.
size();
3364 auto trustedKeys = makeValidatorList(
3372 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3373 for (
auto const& p : publishers)
3374 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3382 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3384 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3387 for (
auto const& val : valKeys)
3389 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3392 BEAST_EXPECT(changes.
added == added);
3393 BEAST_EXPECT(changes.
removed.empty());
3397 changes = trustedKeys->updateTrusted(
3403 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3405 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3407 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3408 for (
auto const& val : valKeys)
3410 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3411 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3413 BEAST_EXPECT(changes.
added.empty());
3414 BEAST_EXPECT(changes.
removed.empty());
3421 auto const keysTotal = valKeys.
size();
3422 auto trustedKeys = makeValidatorList(
3430 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3431 for (
auto const& p : publishers)
3432 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3440 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3442 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3445 for (
auto const& val : valKeys)
3447 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3450 BEAST_EXPECT(changes.
added == added);
3451 BEAST_EXPECT(changes.
removed.empty());
3455 changes = trustedKeys->updateTrusted(
3461 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3463 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3465 for (
auto const& val : valKeys)
3467 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3468 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3470 BEAST_EXPECT(changes.
added.empty());
3471 BEAST_EXPECT(changes.
removed.empty());
3481 auto const self = randomValidator();
3482 auto const keysTotal = valKeys.
size() + 1;
3483 auto trustedKeys = makeValidatorList(
3491 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3492 int untrustedCount = 0;
3493 for (
auto const& p : publishers)
3495 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3496 BEAST_EXPECT(p.revoked ^ trusted);
3497 untrustedCount += trusted ? 0 : 1;
3499 BEAST_EXPECT(untrustedCount == 1);
3507 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3509 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3513 for (
auto const& val : valKeys)
3515 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3518 BEAST_EXPECT(changes.
added == added);
3519 BEAST_EXPECT(changes.
removed.empty());
3523 changes = trustedKeys->updateTrusted(
3529 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3530 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3533 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3534 for (
auto const& val : valKeys)
3536 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3537 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3540 BEAST_EXPECT(changes.
added.empty());
3541 BEAST_EXPECT(changes.
removed == removed);
3549 auto const self = valKeys[5];
3550 auto const keysTotal = valKeys.
size();
3551 auto trustedKeys = makeValidatorList(
3559 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3560 int untrustedCount = 0;
3561 for (
auto const& p : publishers)
3563 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3564 BEAST_EXPECT(p.revoked ^ trusted);
3565 untrustedCount += trusted ? 0 : 1;
3567 BEAST_EXPECT(untrustedCount == 1);
3575 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3577 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3580 for (
auto const& val : valKeys)
3582 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3585 BEAST_EXPECT(changes.
added == added);
3586 BEAST_EXPECT(changes.
removed.empty());
3590 changes = trustedKeys->updateTrusted(
3596 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3597 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3600 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3601 for (
auto const& val : valKeys)
3603 if (val.masterPublic != self.masterPublic)
3605 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3606 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3610 BEAST_EXPECT(changes.
added.empty());
3611 BEAST_EXPECT(changes.
removed == removed);
3618 auto const keysTotal = valKeys.
size();
3619 auto trustedKeys = makeValidatorList(
3627 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3628 int untrustedCount = 0;
3629 for (
auto const& p : publishers)
3631 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3632 BEAST_EXPECT(p.revoked ^ trusted);
3633 untrustedCount += trusted ? 0 : 1;
3635 BEAST_EXPECT(untrustedCount == 1);
3643 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3645 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3648 for (
auto const& val : valKeys)
3650 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3653 BEAST_EXPECT(changes.
added == added);
3654 BEAST_EXPECT(changes.
removed.empty());
3658 changes = trustedKeys->updateTrusted(
3664 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3665 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3668 for (
auto const& val : valKeys)
3670 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3671 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3674 BEAST_EXPECT(changes.
added.empty());
3675 BEAST_EXPECT(changes.
removed == removed);
3683 auto const self = randomValidator();
3684 auto const keysTotal = valKeys.
size() + 1;
3685 auto trustedKeys = makeValidatorList(
3693 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3694 for (
auto const& p : publishers)
3695 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3703 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3705 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3709 for (
auto const& val : valKeys)
3711 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3714 BEAST_EXPECT(changes.
added == added);
3715 BEAST_EXPECT(changes.
removed.empty());
3719 changes = trustedKeys->updateTrusted(
3725 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3726 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3729 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3730 for (
auto const& val : valKeys)
3732 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3733 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3736 BEAST_EXPECT(changes.
added.empty());
3737 BEAST_EXPECT(changes.
removed == removed);
3745 auto const self = valKeys[5];
3746 auto const keysTotal = valKeys.
size();
3747 auto trustedKeys = makeValidatorList(
3755 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3756 for (
auto const& p : publishers)
3757 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3765 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3767 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3771 for (
auto const& val : valKeys)
3773 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3776 BEAST_EXPECT(changes.
added == added);
3777 BEAST_EXPECT(changes.
removed.empty());
3781 changes = trustedKeys->updateTrusted(
3787 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3788 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3791 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3792 for (
auto const& val : valKeys)
3794 if (val.masterPublic != self.masterPublic)
3796 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3797 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3801 BEAST_EXPECT(changes.
added.empty());
3802 BEAST_EXPECT(changes.
removed == removed);
3809 auto const keysTotal = valKeys.
size();
3810 auto trustedKeys = makeValidatorList(
3818 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3819 for (
auto const& p : publishers)
3820 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3828 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3830 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3833 for (
auto const& val : valKeys)
3835 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3838 BEAST_EXPECT(changes.
added == added);
3839 BEAST_EXPECT(changes.
removed.empty());
3843 changes = trustedKeys->updateTrusted(
3849 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3850 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3853 for (
auto const& val : valKeys)
3855 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3856 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3859 BEAST_EXPECT(changes.
added.empty());
3860 BEAST_EXPECT(changes.
removed == removed);
3870 auto const self = randomValidator();
3871 auto const keysTotal = valKeys.
size() + 1;
3872 auto trustedKeys = makeValidatorList(
3880 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3881 for (
auto const& p : publishers)
3882 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3890 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3892 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3896 for (
auto const& val : valKeys)
3898 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3901 BEAST_EXPECT(changes.
added == added);
3902 BEAST_EXPECT(changes.
removed.empty());
3906 changes = trustedKeys->updateTrusted(
3912 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3913 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3916 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3917 for (
auto const& val : valKeys)
3919 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3920 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3923 BEAST_EXPECT(changes.
added.empty());
3924 BEAST_EXPECT(changes.
removed == removed);
3934 auto const self = valKeys[2];
3935 auto const keysTotal = valKeys.
size();
3936 auto trustedKeys = makeValidatorList(
3944 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3945 for (
auto const& p : publishers)
3946 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3954 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3956 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3959 for (
auto const& val : valKeys)
3961 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3964 BEAST_EXPECT(changes.
added == added);
3965 BEAST_EXPECT(changes.
removed.empty());
3974 auto const keysTotal = valKeys.
size();
3975 auto trustedKeys = makeValidatorList(
3983 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3984 for (
auto const& p : publishers)
3985 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3993 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3995 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3998 for (
auto const& val : valKeys)
4000 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
4003 BEAST_EXPECT(changes.
added == added);
4004 BEAST_EXPECT(changes.
removed.empty());
4014 auto const self = randomValidator();
4015 auto const keysTotal = valKeys.
size() + 1;
4016 auto trustedKeys = makeValidatorList(
4024 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
4025 int untrustedCount = 0;
4026 for (
auto const& p : publishers)
4028 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
4029 BEAST_EXPECT(p.revoked ^ trusted);
4030 untrustedCount += trusted ? 0 : 1;
4032 BEAST_EXPECT(untrustedCount == 2);
4040 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
4042 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
4046 for (
auto const& val : valKeys)
4048 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
4051 BEAST_EXPECT(changes.
added == added);
4052 BEAST_EXPECT(changes.
removed.empty());
4056 changes = trustedKeys->updateTrusted(
4062 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
4063 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
4066 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
4067 for (
auto const& val : valKeys)
4069 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
4070 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
4073 BEAST_EXPECT(changes.
added.empty());
4074 BEAST_EXPECT(changes.
removed == removed);
4084 auto const self = valKeys[2];
4085 auto const keysTotal = valKeys.
size();
4086 auto trustedKeys = makeValidatorList(
4094 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
4095 int untrustedCount = 0;
4096 for (
auto const& p : publishers)
4098 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
4099 BEAST_EXPECT(p.revoked ^ trusted);
4100 untrustedCount += trusted ? 0 : 1;
4102 BEAST_EXPECT(untrustedCount == 3);
4110 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
4112 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
4115 for (
auto const& val : valKeys)
4117 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
4120 BEAST_EXPECT(changes.
added == added);
4121 BEAST_EXPECT(changes.
removed.empty());
4125 changes = trustedKeys->updateTrusted(
4131 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
4132 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
4135 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
4136 for (
auto const& val : valKeys)
4138 if (val.masterPublic != self.masterPublic)
4140 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
4141 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
4145 BEAST_EXPECT(changes.
added.empty());
4146 BEAST_EXPECT(changes.
removed == removed);