/** Copyright (c)2019 ZeroTier, Inc.** Use of this software is governed by the Business Source License included* in the LICENSE.TXT file in the project's root directory.** Change Date: 2025年01月01日** On the date above, in accordance with the Business Source License, use* of this software will be governed by version 2.0 of the Apache License.*//****/#include "Capability.hpp"#include "RuntimeEnvironment.hpp"#include "Identity.hpp"#include "Topology.hpp"#include "Switch.hpp"#include "Network.hpp"#include "Node.hpp"namespace ZeroTier {int Capability::verify(const RuntimeEnvironment *RR,void *tPtr) const{try {// There must be at least one entry, and sanity check for bad chain max lengthif ((_maxCustodyChainLength < 1)||(_maxCustodyChainLength > ZT_MAX_CAPABILITY_CUSTODY_CHAIN_LENGTH))return -1;// Validate all entries in chain of custodyBuffer<(sizeof(Capability) * 2)> tmp;this->serialize(tmp,true);for(unsigned int c=0;c<_maxCustodyChainLength;++c) {if (c == 0) {if ((!_custody[c].to)||(!_custody[c].from)||(_custody[c].from != Network::controllerFor(_nwid)))return -1; // the first entry must be present and from the network's controller} else {if (!_custody[c].to)return 0; // all previous entries were valid, so we are validelse if ((!_custody[c].from)||(_custody[c].from != _custody[c-1].to))return -1; // otherwise if we have another entry it must be from the previous holder in the chain}const Identity id(RR->topology->getIdentity(tPtr,_custody[c].from));if (id) {if (!id.verify(tmp.data(),tmp.size(),_custody[c].signature))return -1;} else {RR->sw->requestWhois(tPtr,RR->node->now(),_custody[c].from);return 1;}}// We reached max custody chain length and everything was validreturn 0;} catch ( ... ) {}return -1;}} // namespace ZeroTier
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。