VL1.cpp 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
  1. /*
  2. * Copyright (c)2013-2020 ZeroTier, Inc.
  3. *
  4. * Use of this software is governed by the Business Source License included
  5. * in the LICENSE.TXT file in the project's root directory.
  6. *
  7. * Change Date: 2024-01-01
  8. *
  9. * On the date above, in accordance with the Business Source License, use
  10. * of this software will be governed by version 2.0 of the Apache License.
  11. */
  12. /****/
  13. #include "VL1.hpp"
  14. #include "RuntimeEnvironment.hpp"
  15. #include "Node.hpp"
  16. #include "Topology.hpp"
  17. #include "VL2.hpp"
  18. #include "Salsa20.hpp"
  19. #include "LZ4.hpp"
  20. #include "Poly1305.hpp"
  21. #include "Identity.hpp"
  22. #include "SelfAwareness.hpp"
  23. #include "SHA512.hpp"
  24. #include "Peer.hpp"
  25. #include "Path.hpp"
  26. #include "Expect.hpp"
  27. namespace ZeroTier {
  28. namespace {
  29. ZT_INLINE const Identity &identityFromPeerPtr(const SharedPtr<Peer> &p)
  30. {
  31. return (p) ? p->identity() : Identity::NIL;
  32. }
  33. struct p_SalsaPolyCopyFunction
  34. {
  35. Salsa20 s20;
  36. Poly1305 poly1305;
  37. unsigned int hdrRemaining;
  38. ZT_INLINE p_SalsaPolyCopyFunction(const void *salsaKey, const void *salsaIv) :
  39. s20(salsaKey, salsaIv),
  40. poly1305(),
  41. hdrRemaining(ZT_PROTO_PACKET_ENCRYPTED_SECTION_START)
  42. {
  43. uint8_t macKey[ZT_POLY1305_KEY_SIZE];
  44. s20.crypt12(Utils::ZERO256, macKey, ZT_POLY1305_KEY_SIZE);
  45. poly1305.init(macKey);
  46. }
  47. ZT_INLINE void operator()(void *dest, const void *src, unsigned int len) noexcept
  48. {
  49. if (hdrRemaining != 0) {
  50. unsigned int hdrBytes = (len > hdrRemaining) ? hdrRemaining : len;
  51. Utils::copy(dest, src, hdrBytes);
  52. hdrRemaining -= hdrBytes;
  53. dest = reinterpret_cast<uint8_t *>(dest) + hdrBytes;
  54. src = reinterpret_cast<const uint8_t *>(src) + hdrBytes;
  55. len -= hdrBytes;
  56. }
  57. poly1305.update(src, len);
  58. s20.crypt12(src, dest, len);
  59. }
  60. };
  61. struct p_PolyCopyFunction
  62. {
  63. Poly1305 poly1305;
  64. unsigned int hdrRemaining;
  65. ZT_INLINE p_PolyCopyFunction(const void *salsaKey, const void *salsaIv) :
  66. poly1305(),
  67. hdrRemaining(ZT_PROTO_PACKET_ENCRYPTED_SECTION_START)
  68. {
  69. uint8_t macKey[ZT_POLY1305_KEY_SIZE];
  70. Salsa20(salsaKey, salsaIv).crypt12(Utils::ZERO256, macKey, ZT_POLY1305_KEY_SIZE);
  71. poly1305.init(macKey);
  72. }
  73. ZT_INLINE void operator()(void *dest, const void *src, unsigned int len) noexcept
  74. {
  75. if (hdrRemaining != 0) {
  76. unsigned int hdrBytes = (len > hdrRemaining) ? hdrRemaining : len;
  77. Utils::copy(dest, src, hdrBytes);
  78. hdrRemaining -= hdrBytes;
  79. dest = reinterpret_cast<uint8_t *>(dest) + hdrBytes;
  80. src = reinterpret_cast<const uint8_t *>(src) + hdrBytes;
  81. len -= hdrBytes;
  82. }
  83. poly1305.update(src, len);
  84. Utils::copy(dest, src, len);
  85. }
  86. };
  87. } // anonymous namespace
  88. VL1::VL1(const RuntimeEnvironment *renv) :
  89. RR(renv)
  90. {
  91. }
  92. void VL1::onRemotePacket(void *const tPtr, const int64_t localSocket, const InetAddress &fromAddr, SharedPtr<Buf> &data, const unsigned int len)
  93. {
  94. const SharedPtr<Path> path(RR->topology->path(localSocket, fromAddr));
  95. const int64_t now = RR->node->now();
  96. ZT_SPEW("%u bytes from %s (local socket %lld)", len, fromAddr.toString().c_str(), localSocket);
  97. path->received(now, len);
  98. // NOTE: likely/unlikely are used here to highlight the most common code path
  99. // for valid data packets. This may allow the compiler to generate very slightly
  100. // faster code for that path.
  101. /*
  102. * Packet format:
  103. * <[8] 64-bit packet ID / crypto IV>
  104. * <[5] destination ZT address>
  105. * <[5] source ZT address>
  106. * <[1] outer visible flags, cipher, and hop count (bits: FFCCHHH)>
  107. * <[8] 64-bit MAC (or trusted path ID in trusted path mode)>
  108. * [... -- begin encryption envelope -- ...]
  109. * <[1] inner envelope flags (MS 3 bits) and verb (LS 5 bits)>
  110. * [... verb-specific payload ...]
  111. */
  112. try {
  113. if (unlikely(len < ZT_PROTO_MIN_FRAGMENT_LENGTH))
  114. return;
  115. static_assert((ZT_PROTO_PACKET_ID_INDEX + sizeof(uint64_t)) < ZT_PROTO_MIN_FRAGMENT_LENGTH, "overflow");
  116. const uint64_t packetId = Utils::loadAsIsEndian<uint64_t>(data->unsafeData + ZT_PROTO_PACKET_ID_INDEX);
  117. static_assert((ZT_PROTO_PACKET_DESTINATION_INDEX + ZT_ADDRESS_LENGTH) < ZT_PROTO_MIN_FRAGMENT_LENGTH, "overflow");
  118. Address destination(data->unsafeData + ZT_PROTO_PACKET_DESTINATION_INDEX);
  119. if (destination != RR->identity.address()) {
  120. m_relay(tPtr, path, destination, data, len);
  121. return;
  122. }
  123. // ----------------------------------------------------------------------------------------------------------------
  124. // If we made it this far, the packet is at least MIN_FRAGMENT_LENGTH and is addressed to this node's ZT address
  125. // ----------------------------------------------------------------------------------------------------------------
  126. Buf::PacketVector pktv;
  127. static_assert(ZT_PROTO_PACKET_FRAGMENT_INDICATOR_INDEX <= ZT_PROTO_MIN_FRAGMENT_LENGTH, "overflow");
  128. if (data->unsafeData[ZT_PROTO_PACKET_FRAGMENT_INDICATOR_INDEX] == ZT_PROTO_PACKET_FRAGMENT_INDICATOR) {
  129. // This looks like a fragment (excluding the head) of a larger packet.
  130. static_assert(ZT_PROTO_PACKET_FRAGMENT_COUNTS < ZT_PROTO_MIN_FRAGMENT_LENGTH, "overflow");
  131. const unsigned int totalFragments = (data->unsafeData[ZT_PROTO_PACKET_FRAGMENT_COUNTS] >> 4U) & 0x0fU;
  132. const unsigned int fragmentNo = data->unsafeData[ZT_PROTO_PACKET_FRAGMENT_COUNTS] & 0x0fU;
  133. switch (m_inputPacketAssembler.assemble(
  134. packetId,
  135. pktv,
  136. data,
  137. ZT_PROTO_PACKET_FRAGMENT_PAYLOAD_START_AT,
  138. len - ZT_PROTO_PACKET_FRAGMENT_PAYLOAD_START_AT,
  139. fragmentNo,
  140. totalFragments,
  141. now,
  142. path)) {
  143. case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::COMPLETE:
  144. break;
  145. default:
  146. //case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::OK:
  147. //case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::ERR_DUPLICATE_FRAGMENT:
  148. //case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::ERR_INVALID_FRAGMENT:
  149. //case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::ERR_TOO_MANY_FRAGMENTS_FOR_PATH:
  150. //case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::ERR_OUT_OF_MEMORY:
  151. return;
  152. }
  153. } else {
  154. if (unlikely(len < ZT_PROTO_MIN_PACKET_LENGTH))
  155. return;
  156. static_assert(ZT_PROTO_PACKET_FLAGS_INDEX < ZT_PROTO_MIN_PACKET_LENGTH, "overflow");
  157. if ((data->unsafeData[ZT_PROTO_PACKET_FLAGS_INDEX] & ZT_PROTO_FLAG_FRAGMENTED) != 0) {
  158. // This is the head of a series of fragments that we may or may not already have.
  159. switch (m_inputPacketAssembler.assemble(
  160. packetId,
  161. pktv,
  162. data,
  163. 0, // fragment index is 0 since this is the head
  164. len,
  165. 0, // always the zero'eth fragment
  166. 0, // this is specified in fragments, not in the head
  167. now,
  168. path)) {
  169. case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::COMPLETE:
  170. break;
  171. default:
  172. //case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::OK:
  173. //case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::ERR_DUPLICATE_FRAGMENT:
  174. //case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::ERR_INVALID_FRAGMENT:
  175. //case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::ERR_TOO_MANY_FRAGMENTS_FOR_PATH:
  176. //case Defragmenter<ZT_MAX_PACKET_FRAGMENTS>::ERR_OUT_OF_MEMORY:
  177. return;
  178. }
  179. } else {
  180. // This is a single whole packet with no fragments.
  181. Buf::Slice s = pktv.push();
  182. s.b.swap(data);
  183. s.s = 0;
  184. s.e = len;
  185. }
  186. }
  187. // ----------------------------------------------------------------------------------------------------------------
  188. // If we made it this far without returning, a packet is fully assembled and ready to process.
  189. // ----------------------------------------------------------------------------------------------------------------
  190. const uint8_t *const hdr = pktv[0].b->unsafeData + pktv[0].s;
  191. static_assert((ZT_PROTO_PACKET_SOURCE_INDEX + ZT_ADDRESS_LENGTH) < ZT_PROTO_MIN_PACKET_LENGTH, "overflow");
  192. const Address source(hdr + ZT_PROTO_PACKET_SOURCE_INDEX);
  193. static_assert(ZT_PROTO_PACKET_FLAGS_INDEX < ZT_PROTO_MIN_PACKET_LENGTH, "overflow");
  194. const uint8_t hops = hdr[ZT_PROTO_PACKET_FLAGS_INDEX] & ZT_PROTO_FLAG_FIELD_HOPS_MASK;
  195. const uint8_t cipher = (hdr[ZT_PROTO_PACKET_FLAGS_INDEX] >> 3U) & 3U;
  196. SharedPtr<Buf> pkt(new Buf());
  197. int pktSize = 0;
  198. static_assert(ZT_PROTO_PACKET_VERB_INDEX < ZT_PROTO_MIN_PACKET_LENGTH, "overflow");
  199. if (unlikely(((cipher == ZT_PROTO_CIPHER_SUITE__POLY1305_NONE) || (cipher == ZT_PROTO_CIPHER_SUITE__NONE)) && ((hdr[ZT_PROTO_PACKET_VERB_INDEX] & ZT_PROTO_VERB_MASK) == Protocol::VERB_HELLO))) {
  200. // Handle unencrypted HELLO packets.
  201. pktSize = pktv.mergeCopy(*pkt);
  202. if (unlikely(pktSize < ZT_PROTO_MIN_PACKET_LENGTH)) {
  203. ZT_SPEW("discarding packet %.16llx from %s(%s): assembled packet size: %d", packetId, source.toString().c_str(), fromAddr.toString().c_str(), pktSize);
  204. return;
  205. }
  206. const SharedPtr<Peer> peer(m_HELLO(tPtr, path, *pkt, pktSize));
  207. if (likely(peer))
  208. peer->received(tPtr, path, hops, packetId, pktSize - ZT_PROTO_PACKET_PAYLOAD_START, Protocol::VERB_HELLO, Protocol::VERB_NOP);
  209. return;
  210. }
  211. // This remains zero if authentication fails. Otherwise it gets set to a bit mask
  212. // indicating authentication and other security flags like encryption and forward
  213. // secrecy status.
  214. unsigned int auth = 0;
  215. SharedPtr<Peer> peer(RR->topology->peer(tPtr, source));
  216. if (likely(peer)) {
  217. switch (cipher) {
  218. case ZT_PROTO_CIPHER_SUITE__POLY1305_NONE: {
  219. uint8_t perPacketKey[ZT_SALSA20_KEY_SIZE];
  220. Protocol::salsa2012DeriveKey(peer->rawIdentityKey(), perPacketKey, *pktv[0].b, pktv.totalSize());
  221. p_PolyCopyFunction s20cf(perPacketKey, &packetId);
  222. pktSize = pktv.mergeMap<p_PolyCopyFunction &>(*pkt, ZT_PROTO_PACKET_ENCRYPTED_SECTION_START, s20cf);
  223. if (unlikely(pktSize < ZT_PROTO_MIN_PACKET_LENGTH)) {
  224. ZT_SPEW("discarding packet %.16llx from %s(%s): assembled packet size: %d", packetId, source.toString().c_str(), fromAddr.toString().c_str(), pktSize);
  225. return;
  226. }
  227. uint64_t mac[2];
  228. s20cf.poly1305.finish(mac);
  229. static_assert((ZT_PROTO_PACKET_MAC_INDEX + 8) < ZT_PROTO_MIN_PACKET_LENGTH, "overflow");
  230. if (unlikely(Utils::loadAsIsEndian<uint64_t>(hdr + ZT_PROTO_PACKET_MAC_INDEX) != mac[0])) {
  231. ZT_SPEW("discarding packet %.16llx from %s(%s): packet MAC failed (none/poly1305)", packetId, source.toString().c_str(), fromAddr.toString().c_str());
  232. RR->t->incomingPacketDropped(tPtr, 0xcc89c812, packetId, 0, peer->identity(), path->address(), hops, Protocol::VERB_NOP, ZT_TRACE_PACKET_DROP_REASON_MAC_FAILED);
  233. return;
  234. }
  235. auth = ZT_VL1_AUTH_RESULT_FLAG_AUTHENTICATED;
  236. } break;
  237. case ZT_PROTO_CIPHER_SUITE__POLY1305_SALSA2012: {
  238. uint8_t perPacketKey[ZT_SALSA20_KEY_SIZE];
  239. Protocol::salsa2012DeriveKey(peer->rawIdentityKey(), perPacketKey, *pktv[0].b, pktv.totalSize());
  240. p_SalsaPolyCopyFunction s20cf(perPacketKey, &packetId);
  241. pktSize = pktv.mergeMap<p_SalsaPolyCopyFunction &>(*pkt, ZT_PROTO_PACKET_ENCRYPTED_SECTION_START, s20cf);
  242. if (unlikely(pktSize < ZT_PROTO_MIN_PACKET_LENGTH)) {
  243. ZT_SPEW("discarding packet %.16llx from %s(%s): assembled packet size: %d", packetId, source.toString().c_str(), fromAddr.toString().c_str(), pktSize);
  244. return;
  245. }
  246. uint64_t mac[2];
  247. s20cf.poly1305.finish(mac);
  248. static_assert((ZT_PROTO_PACKET_MAC_INDEX + 8) < ZT_PROTO_MIN_PACKET_LENGTH, "overflow");
  249. if (unlikely(Utils::loadAsIsEndian<uint64_t>(hdr + ZT_PROTO_PACKET_MAC_INDEX) != mac[0])) {
  250. ZT_SPEW("discarding packet %.16llx from %s(%s): packet MAC failed (salsa/poly1305)", packetId, source.toString().c_str(), fromAddr.toString().c_str());
  251. RR->t->incomingPacketDropped(tPtr, 0xcc89c812, packetId, 0, peer->identity(), path->address(), hops, Protocol::VERB_NOP, ZT_TRACE_PACKET_DROP_REASON_MAC_FAILED);
  252. return;
  253. }
  254. auth = ZT_VL1_AUTH_RESULT_FLAG_AUTHENTICATED | ZT_VL1_AUTH_RESULT_FLAG_ENCRYPTED;
  255. } break;
  256. case ZT_PROTO_CIPHER_SUITE__NONE: {
  257. // TODO
  258. } break;
  259. case ZT_PROTO_CIPHER_SUITE__AES_GMAC_SIV: {
  260. // TODO
  261. } break;
  262. default:
  263. RR->t->incomingPacketDropped(tPtr, 0x5b001099, packetId, 0, identityFromPeerPtr(peer), path->address(), hops, Protocol::VERB_NOP, ZT_TRACE_PACKET_DROP_REASON_INVALID_OBJECT);
  264. return;
  265. }
  266. }
  267. if (likely(auth != 0)) {
  268. // If authentication was successful go on and process the packet.
  269. if (unlikely(pktSize < ZT_PROTO_MIN_PACKET_LENGTH)) {
  270. ZT_SPEW("discarding packet %.16llx from %s(%s): assembled packet size %d is smaller than minimum packet length", packetId, source.toString().c_str(), fromAddr.toString().c_str(), pktSize);
  271. return;
  272. }
  273. // TODO: should take instance ID into account here once that is fully implemented.
  274. if (unlikely(peer->deduplicateIncomingPacket(packetId))) {
  275. ZT_SPEW("discarding packet %.16llx from %s(%s): duplicate!", packetId, source.toString().c_str(), fromAddr.toString().c_str());
  276. return;
  277. }
  278. static_assert(ZT_PROTO_PACKET_VERB_INDEX < ZT_PROTO_MIN_PACKET_LENGTH, "overflow");
  279. const uint8_t verbFlags = pkt->unsafeData[ZT_PROTO_PACKET_VERB_INDEX];
  280. const Protocol::Verb verb = (Protocol::Verb) (verbFlags & ZT_PROTO_VERB_MASK);
  281. // Decompress packet payload if compressed. For additional safety decompression is
  282. // only performed on packets whose MACs have already been validated. (Only HELLO is
  283. // sent without this, and HELLO doesn't benefit from compression.)
  284. if (((verbFlags & ZT_PROTO_VERB_FLAG_COMPRESSED) != 0) && (pktSize > ZT_PROTO_PACKET_PAYLOAD_START)) {
  285. SharedPtr<Buf> dec(new Buf());
  286. Utils::copy<ZT_PROTO_PACKET_PAYLOAD_START>(dec->unsafeData, pkt->unsafeData);
  287. const int uncompressedLen = LZ4_decompress_safe(
  288. reinterpret_cast<const char *>(pkt->unsafeData + ZT_PROTO_PACKET_PAYLOAD_START),
  289. reinterpret_cast<char *>(dec->unsafeData + ZT_PROTO_PACKET_PAYLOAD_START),
  290. pktSize - ZT_PROTO_PACKET_PAYLOAD_START,
  291. ZT_BUF_MEM_SIZE - ZT_PROTO_PACKET_PAYLOAD_START);
  292. if (likely((uncompressedLen >= 0) && (uncompressedLen <= (ZT_BUF_MEM_SIZE - ZT_PROTO_PACKET_PAYLOAD_START)))) {
  293. pkt.swap(dec);
  294. ZT_SPEW("decompressed packet: %d -> %d", pktSize, ZT_PROTO_PACKET_PAYLOAD_START + uncompressedLen);
  295. pktSize = ZT_PROTO_PACKET_PAYLOAD_START + uncompressedLen;
  296. } else {
  297. RR->t->incomingPacketDropped(tPtr, 0xee9e4392, packetId, 0, identityFromPeerPtr(peer), path->address(), hops, verb, ZT_TRACE_PACKET_DROP_REASON_INVALID_COMPRESSED_DATA);
  298. return;
  299. }
  300. }
  301. ZT_SPEW("%s from %s(%s) (%d bytes)", Protocol::verbName(verb), source.toString().c_str(), fromAddr.toString().c_str(), pktSize);
  302. // NOTE: HELLO is normally sent in the clear (in terms of our usual AEAD modes) and is handled
  303. // above. We will try to process it here, but if so it'll still get re-authenticated via HELLO's
  304. // own internal authentication logic as usual. It would be abnormal to make it here with HELLO
  305. // but not invalid.
  306. Protocol::Verb inReVerb = Protocol::VERB_NOP;
  307. bool ok = true;
  308. switch (verb) {
  309. case Protocol::VERB_NOP:
  310. break;
  311. case Protocol::VERB_HELLO:
  312. ok = (bool) (m_HELLO(tPtr, path, *pkt, pktSize));
  313. break;
  314. case Protocol::VERB_ERROR:
  315. ok = m_ERROR(tPtr, packetId, auth, path, peer, *pkt, pktSize, inReVerb);
  316. break;
  317. case Protocol::VERB_OK:
  318. ok = m_OK(tPtr, packetId, auth, path, peer, *pkt, pktSize, inReVerb);
  319. break;
  320. case Protocol::VERB_WHOIS:
  321. ok = m_WHOIS(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  322. break;
  323. case Protocol::VERB_RENDEZVOUS:
  324. ok = m_RENDEZVOUS(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  325. break;
  326. case Protocol::VERB_FRAME:
  327. ok = RR->vl2->m_FRAME(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  328. break;
  329. case Protocol::VERB_EXT_FRAME:
  330. ok = RR->vl2->m_EXT_FRAME(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  331. break;
  332. case Protocol::VERB_ECHO:
  333. ok = m_ECHO(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  334. break;
  335. case Protocol::VERB_MULTICAST_LIKE:
  336. ok = RR->vl2->m_MULTICAST_LIKE(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  337. break;
  338. case Protocol::VERB_NETWORK_CREDENTIALS:
  339. ok = RR->vl2->m_NETWORK_CREDENTIALS(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  340. break;
  341. case Protocol::VERB_NETWORK_CONFIG_REQUEST:
  342. ok = RR->vl2->m_NETWORK_CONFIG_REQUEST(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  343. break;
  344. case Protocol::VERB_NETWORK_CONFIG:
  345. ok = RR->vl2->m_NETWORK_CONFIG(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  346. break;
  347. case Protocol::VERB_MULTICAST_GATHER:
  348. ok = RR->vl2->m_MULTICAST_GATHER(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  349. break;
  350. case Protocol::VERB_MULTICAST_FRAME_deprecated:
  351. ok = RR->vl2->m_MULTICAST_FRAME_deprecated(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  352. break;
  353. case Protocol::VERB_PUSH_DIRECT_PATHS:
  354. ok = m_PUSH_DIRECT_PATHS(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  355. break;
  356. case Protocol::VERB_USER_MESSAGE:
  357. ok = m_USER_MESSAGE(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  358. break;
  359. case Protocol::VERB_MULTICAST:
  360. ok = RR->vl2->m_MULTICAST(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  361. break;
  362. case Protocol::VERB_ENCAP:
  363. ok = m_ENCAP(tPtr, packetId, auth, path, peer, *pkt, pktSize);
  364. break;
  365. default:
  366. RR->t->incomingPacketDropped(tPtr, 0xeeeeeff0, packetId, 0, identityFromPeerPtr(peer), path->address(), hops, verb, ZT_TRACE_PACKET_DROP_REASON_UNRECOGNIZED_VERB);
  367. break;
  368. }
  369. if (likely(ok))
  370. peer->received(tPtr, path, hops, packetId, pktSize - ZT_PROTO_PACKET_PAYLOAD_START, verb, inReVerb);
  371. } else {
  372. // If decryption and authentication were not successful, try to look up identities.
  373. // This is rate limited by virtue of the retry rate limit timer.
  374. if (pktSize <= 0)
  375. pktSize = pktv.mergeCopy(*pkt);
  376. if (pktSize >= ZT_PROTO_MIN_PACKET_LENGTH) {
  377. ZT_SPEW("authentication failed or no peers match, queueing WHOIS for %s", source.toString().c_str());
  378. bool sendPending;
  379. {
  380. Mutex::Lock wl(m_whoisQueue_l);
  381. p_WhoisQueueItem &wq = m_whoisQueue[source];
  382. const unsigned int wpidx = wq.waitingPacketCount++ % ZT_VL1_MAX_WHOIS_WAITING_PACKETS;
  383. wq.waitingPacketSize[wpidx] = (unsigned int) pktSize;
  384. wq.waitingPacket[wpidx] = pkt;
  385. sendPending = (now - wq.lastRetry) >= ZT_WHOIS_RETRY_DELAY;
  386. }
  387. if (sendPending)
  388. m_sendPendingWhois(tPtr, now);
  389. }
  390. }
  391. } catch (...) {
  392. RR->t->unexpectedError(tPtr, 0xea1b6dea, "unexpected exception in onRemotePacket() parsing packet from %s", path->address().toString().c_str());
  393. }
  394. }
  395. void VL1::m_relay(void *tPtr, const SharedPtr<Path> &path, Address destination, SharedPtr<Buf> &pkt, int pktSize)
  396. {
  397. }
  398. void VL1::m_sendPendingWhois(void *tPtr, int64_t now)
  399. {
  400. const SharedPtr<Peer> root(RR->topology->root());
  401. if (unlikely(!root))
  402. return;
  403. const SharedPtr<Path> rootPath(root->path(now));
  404. if (unlikely(!rootPath))
  405. return;
  406. Vector<Address> toSend;
  407. {
  408. Mutex::Lock wl(m_whoisQueue_l);
  409. for (Map<Address, p_WhoisQueueItem>::iterator wi(m_whoisQueue.begin());wi != m_whoisQueue.end();++wi) {
  410. if ((now - wi->second.lastRetry) >= ZT_WHOIS_RETRY_DELAY) {
  411. wi->second.lastRetry = now;
  412. ++wi->second.retries;
  413. toSend.push_back(wi->first);
  414. }
  415. }
  416. }
  417. if (toSend.empty())
  418. return;
  419. const SharedPtr<SymmetricKey> key(root->key());
  420. uint8_t outp[ZT_DEFAULT_UDP_MTU - ZT_PROTO_MIN_PACKET_LENGTH];
  421. Vector<Address>::iterator a(toSend.begin());
  422. while (a != toSend.end()) {
  423. const uint64_t packetId = key->nextMessage(RR->identity.address(), root->address());
  424. int p = Protocol::newPacket(outp, packetId, root->address(), RR->identity.address(), Protocol::VERB_WHOIS);
  425. while ((a != toSend.end()) && (p < (sizeof(outp) - ZT_ADDRESS_LENGTH))) {
  426. a->copyTo(outp + p);
  427. ++a;
  428. p += ZT_ADDRESS_LENGTH;
  429. }
  430. Protocol::armor(outp, p, key, root->cipher());
  431. RR->expect->sending(packetId, now);
  432. root->send(tPtr, now, outp, p, rootPath);
  433. }
  434. }
  435. SharedPtr<Peer> VL1::m_HELLO(void *tPtr, const SharedPtr<Path> &path, Buf &pkt, int packetSize)
  436. {
  437. const uint64_t packetId = Utils::loadAsIsEndian<uint64_t>(pkt.unsafeData + ZT_PROTO_PACKET_ID_INDEX);
  438. const uint64_t mac = Utils::loadAsIsEndian<uint64_t>(pkt.unsafeData + ZT_PROTO_PACKET_MAC_INDEX);
  439. const uint8_t hops = pkt.unsafeData[ZT_PROTO_PACKET_FLAGS_INDEX] & ZT_PROTO_FLAG_FIELD_HOPS_MASK;
  440. const uint8_t protoVersion = pkt.lI8<ZT_PROTO_PACKET_PAYLOAD_START>();
  441. if (unlikely(protoVersion < ZT_PROTO_VERSION_MIN)) {
  442. RR->t->incomingPacketDropped(tPtr, 0x907a9891, packetId, 0, Identity::NIL, path->address(), hops, Protocol::VERB_HELLO, ZT_TRACE_PACKET_DROP_REASON_PEER_TOO_OLD);
  443. return SharedPtr<Peer>();
  444. }
  445. const unsigned int versionMajor = pkt.lI8<ZT_PROTO_PACKET_PAYLOAD_START + 1>();
  446. const unsigned int versionMinor = pkt.lI8<ZT_PROTO_PACKET_PAYLOAD_START + 2>();
  447. const unsigned int versionRev = pkt.lI16<ZT_PROTO_PACKET_PAYLOAD_START + 3>();
  448. const uint64_t timestamp = pkt.lI64<ZT_PROTO_PACKET_PAYLOAD_START + 5>();
  449. int ii = ZT_PROTO_PACKET_PAYLOAD_START + 13;
  450. // Get identity and verify that it matches the sending address in the packet.
  451. Identity id;
  452. if (unlikely(pkt.rO(ii, id) < 0)) {
  453. RR->t->incomingPacketDropped(tPtr, 0x707a9810, packetId, 0, Identity::NIL, path->address(), hops, Protocol::VERB_HELLO, ZT_TRACE_PACKET_DROP_REASON_INVALID_OBJECT);
  454. return SharedPtr<Peer>();
  455. }
  456. if (unlikely(id.address() != Address(pkt.unsafeData + ZT_PROTO_PACKET_SOURCE_INDEX))) {
  457. RR->t->incomingPacketDropped(tPtr, 0x707a9010, packetId, 0, Identity::NIL, path->address(), hops, Protocol::VERB_HELLO, ZT_TRACE_PACKET_DROP_REASON_MAC_FAILED);
  458. return SharedPtr<Peer>();
  459. }
  460. // Get the peer that matches this identity, or learn a new one if we don't know it.
  461. SharedPtr<Peer> peer(RR->topology->peer(tPtr, id.address(), true));
  462. if (peer) {
  463. if (unlikely(peer->identity() != id)) {
  464. RR->t->incomingPacketDropped(tPtr, 0x707a9891, packetId, 0, identityFromPeerPtr(peer), path->address(), hops, Protocol::VERB_HELLO, ZT_TRACE_PACKET_DROP_REASON_MAC_FAILED);
  465. return SharedPtr<Peer>();
  466. }
  467. if (unlikely(peer->deduplicateIncomingPacket(packetId))) {
  468. ZT_SPEW("discarding packet %.16llx from %s(%s): duplicate!", packetId, id.address().toString().c_str(), path->address().toString().c_str());
  469. return SharedPtr<Peer>();
  470. }
  471. } else {
  472. if (unlikely(!id.locallyValidate())) {
  473. RR->t->incomingPacketDropped(tPtr, 0x707a9892, packetId, 0, identityFromPeerPtr(peer), path->address(), hops, Protocol::VERB_HELLO, ZT_TRACE_PACKET_DROP_REASON_INVALID_OBJECT);
  474. return SharedPtr<Peer>();
  475. }
  476. peer.set(new Peer(RR));
  477. if (unlikely(!peer->init(id))) {
  478. RR->t->incomingPacketDropped(tPtr, 0x707a9893, packetId, 0, identityFromPeerPtr(peer), path->address(), hops, Protocol::VERB_HELLO, ZT_TRACE_PACKET_DROP_REASON_UNSPECIFIED);
  479. return SharedPtr<Peer>();
  480. }
  481. peer = RR->topology->add(tPtr, peer);
  482. }
  483. // ------------------------------------------------------------------------------------------------------------------
  484. // If we made it this far, peer is non-NULL and the identity is valid and matches it.
  485. // ------------------------------------------------------------------------------------------------------------------
  486. if (protoVersion >= 11) {
  487. // V2.x and newer use HMAC-SHA384 for HELLO, which offers a larger security margin
  488. // to guard key exchange and connection setup than typical AEAD. The packet MAC
  489. // field is ignored, and eventually it'll be undefined.
  490. uint8_t hmac[ZT_HMACSHA384_LEN];
  491. if (unlikely(packetSize < ZT_HMACSHA384_LEN)) {
  492. RR->t->incomingPacketDropped(tPtr, 0xab9c9891, packetId, 0, identityFromPeerPtr(peer), path->address(), hops, Protocol::VERB_HELLO, ZT_TRACE_PACKET_DROP_REASON_MAC_FAILED);
  493. return SharedPtr<Peer>();
  494. }
  495. packetSize -= ZT_HMACSHA384_LEN;
  496. pkt.unsafeData[ZT_PROTO_PACKET_FLAGS_INDEX] &= ~ZT_PROTO_FLAG_FIELD_HOPS_MASK; // mask hops to 0
  497. Utils::storeAsIsEndian<uint64_t>(pkt.unsafeData + ZT_PROTO_PACKET_MAC_INDEX, 0); // set MAC field to 0
  498. HMACSHA384(peer->identityHelloHmacKey(), pkt.unsafeData, packetSize, hmac);
  499. if (unlikely(!Utils::secureEq(hmac, pkt.unsafeData + packetSize, ZT_HMACSHA384_LEN))) {
  500. RR->t->incomingPacketDropped(tPtr, 0x707a9891, packetId, 0, identityFromPeerPtr(peer), path->address(), hops, Protocol::VERB_HELLO, ZT_TRACE_PACKET_DROP_REASON_MAC_FAILED);
  501. return SharedPtr<Peer>();
  502. }
  503. } else {
  504. // Older versions use Poly1305 MAC (but no whole packet encryption) for HELLO.
  505. if (likely(packetSize > ZT_PROTO_PACKET_ENCRYPTED_SECTION_START)) {
  506. uint8_t perPacketKey[ZT_SALSA20_KEY_SIZE];
  507. Protocol::salsa2012DeriveKey(peer->rawIdentityKey(), perPacketKey, pkt, packetSize);
  508. uint8_t macKey[ZT_POLY1305_KEY_SIZE];
  509. Salsa20(perPacketKey, &packetId).crypt12(Utils::ZERO256, macKey, ZT_POLY1305_KEY_SIZE);
  510. Poly1305 poly1305(macKey);
  511. poly1305.update(pkt.unsafeData + ZT_PROTO_PACKET_ENCRYPTED_SECTION_START, packetSize - ZT_PROTO_PACKET_ENCRYPTED_SECTION_START);
  512. uint64_t polyMac[2];
  513. poly1305.finish(polyMac);
  514. if (unlikely(mac != polyMac[0])) {
  515. RR->t->incomingPacketDropped(tPtr, 0x11bfff82, packetId, 0, id, path->address(), hops, Protocol::VERB_NOP, ZT_TRACE_PACKET_DROP_REASON_MAC_FAILED);
  516. return SharedPtr<Peer>();
  517. }
  518. } else {
  519. RR->t->incomingPacketDropped(tPtr, 0x11bfff81, packetId, 0, id, path->address(), hops, Protocol::VERB_NOP, ZT_TRACE_PACKET_DROP_REASON_MAC_FAILED);
  520. return SharedPtr<Peer>();
  521. }
  522. }
  523. // ------------------------------------------------------------------------------------------------------------------
  524. // This far means we passed MAC (Poly1305 or HMAC-SHA384 for newer peers)
  525. // ------------------------------------------------------------------------------------------------------------------
  526. InetAddress sentTo;
  527. if (unlikely(pkt.rO(ii, sentTo) < 0)) {
  528. RR->t->incomingPacketDropped(tPtr, 0x707a9811, packetId, 0, identityFromPeerPtr(peer), path->address(), hops, Protocol::VERB_HELLO, ZT_TRACE_PACKET_DROP_REASON_INVALID_OBJECT);
  529. return SharedPtr<Peer>();
  530. }
  531. const SharedPtr<SymmetricKey> key(peer->identityKey());
  532. if (protoVersion >= 11) {
  533. // V2.x and newer supports an encrypted section and has a new OK format.
  534. ii += 4; // skip reserved field
  535. if (likely((ii + 12) < packetSize)) {
  536. AES::CTR ctr(peer->identityHelloDictionaryEncryptionCipher());
  537. const uint8_t *const ctrNonce = pkt.unsafeData + ii;
  538. ii += 12;
  539. ctr.init(ctrNonce, 0, pkt.unsafeData + ii);
  540. ctr.crypt(pkt.unsafeData + ii, packetSize - ii);
  541. ctr.finish();
  542. ii += 2; // skip reserved field
  543. const unsigned int dictSize = pkt.rI16(ii);
  544. if (unlikely((ii + dictSize) > packetSize)) {
  545. RR->t->incomingPacketDropped(tPtr, 0x707a9815, packetId, 0, identityFromPeerPtr(peer), path->address(), hops, Protocol::VERB_HELLO, ZT_TRACE_PACKET_DROP_REASON_INVALID_OBJECT);
  546. return peer;
  547. }
  548. Dictionary md;
  549. if (!md.decode(pkt.unsafeData + ii, dictSize)) {
  550. RR->t->incomingPacketDropped(tPtr, 0x707a9816, packetId, 0, identityFromPeerPtr(peer), path->address(), hops, Protocol::VERB_HELLO, ZT_TRACE_PACKET_DROP_REASON_INVALID_OBJECT);
  551. return peer;
  552. }
  553. if (!md.empty()) {
  554. // TODO
  555. }
  556. }
  557. }
  558. Protocol::newPacket(pkt, key->nextMessage(RR->identity.address(), peer->address()), peer->address(), RR->identity.address(), Protocol::VERB_OK);
  559. ii = ZT_PROTO_PACKET_PAYLOAD_START;
  560. pkt.wI8(ii, Protocol::VERB_HELLO);
  561. pkt.wI64(ii, packetId);
  562. pkt.wI64(ii, timestamp);
  563. pkt.wI8(ii, ZT_PROTO_VERSION);
  564. pkt.wI8(ii, ZEROTIER_VERSION_MAJOR);
  565. pkt.wI8(ii, ZEROTIER_VERSION_MINOR);
  566. pkt.wI16(ii, ZEROTIER_VERSION_REVISION);
  567. pkt.wO(ii, path->address());
  568. pkt.wI16(ii, 0); // reserved, specifies no "moons" for older versions
  569. if (protoVersion >= 11) {
  570. FCV<uint8_t, 1024> okmd;
  571. pkt.wI16(ii, (uint16_t) okmd.size());
  572. pkt.wB(ii, okmd.data(), okmd.size());
  573. if (unlikely((ii + ZT_HMACSHA384_LEN) > ZT_BUF_MEM_SIZE)) // sanity check, should be impossible
  574. return SharedPtr<Peer>();
  575. HMACSHA384(peer->identityHelloHmacKey(), pkt.unsafeData, ii, pkt.unsafeData + ii);
  576. ii += ZT_HMACSHA384_LEN;
  577. }
  578. peer->setRemoteVersion(protoVersion, versionMajor, versionMinor, versionRev);
  579. peer->send(tPtr, RR->node->now(), pkt.unsafeData, ii, path);
  580. return peer;
  581. }
  582. bool VL1::m_ERROR(void *tPtr, const uint64_t packetId, const unsigned int auth, const SharedPtr<Path> &path, const SharedPtr<Peer> &peer, Buf &pkt, int packetSize, Protocol::Verb &inReVerb)
  583. {
  584. #if 0
  585. if (packetSize < (int)sizeof(Protocol::ERROR::Header)) {
  586. RR->t->incomingPacketDropped(tPtr,0x3beb1947,0,0,identityFromPeerPtr(peer),path->address(),0,Protocol::VERB_ERROR,ZT_TRACE_PACKET_DROP_REASON_MALFORMED_PACKET);
  587. return false;
  588. }
  589. Protocol::ERROR::Header &eh = pkt.as<Protocol::ERROR::Header>();
  590. inReVerb = (Protocol::Verb)eh.inReVerb;
  591. const int64_t now = RR->node->now();
  592. if (!RR->expect->expecting(eh.inRePacketId,now)) {
  593. RR->t->incomingPacketDropped(tPtr,0x4c1f1ff7,0,0,identityFromPeerPtr(peer),path->address(),0,Protocol::VERB_OK,ZT_TRACE_PACKET_DROP_REASON_REPLY_NOT_EXPECTED);
  594. return false;
  595. }
  596. switch(eh.error) {
  597. //case Protocol::ERROR_INVALID_REQUEST:
  598. //case Protocol::ERROR_BAD_PROTOCOL_VERSION:
  599. //case Protocol::ERROR_CANNOT_DELIVER:
  600. default:
  601. break;
  602. case Protocol::ERROR_OBJ_NOT_FOUND:
  603. if (eh.inReVerb == Protocol::VERB_NETWORK_CONFIG_REQUEST) {
  604. }
  605. break;
  606. case Protocol::ERROR_UNSUPPORTED_OPERATION:
  607. if (eh.inReVerb == Protocol::VERB_NETWORK_CONFIG_REQUEST) {
  608. }
  609. break;
  610. case Protocol::ERROR_NEED_MEMBERSHIP_CERTIFICATE:
  611. break;
  612. case Protocol::ERROR_NETWORK_ACCESS_DENIED_:
  613. if (eh.inReVerb == Protocol::VERB_NETWORK_CONFIG_REQUEST) {
  614. }
  615. break;
  616. }
  617. return true;
  618. #endif
  619. }
  620. bool VL1::m_OK(void *tPtr, const uint64_t packetId, const unsigned int auth, const SharedPtr<Path> &path, const SharedPtr<Peer> &peer, Buf &pkt, int packetSize, Protocol::Verb &inReVerb)
  621. {
  622. int ii = ZT_PROTO_PACKET_PAYLOAD_START + 13;
  623. inReVerb = (Protocol::Verb) pkt.rI8(ii);
  624. const uint64_t inRePacketId = pkt.rI64(ii);
  625. if (unlikely(Buf::readOverflow(ii, packetSize))) {
  626. RR->t->incomingPacketDropped(tPtr, 0x4c1f1ff7, packetId, 0, identityFromPeerPtr(peer), path->address(), 0, Protocol::VERB_OK, ZT_TRACE_PACKET_DROP_REASON_MALFORMED_PACKET);
  627. return false;
  628. }
  629. const int64_t now = RR->node->now();
  630. if (!RR->expect->expecting(inRePacketId, now)) {
  631. RR->t->incomingPacketDropped(tPtr, 0x4c1f1ff8, packetId, 0, identityFromPeerPtr(peer), path->address(), 0, Protocol::VERB_OK, ZT_TRACE_PACKET_DROP_REASON_REPLY_NOT_EXPECTED);
  632. return false;
  633. }
  634. ZT_SPEW("got OK in-re %s (packet ID %.16llx) from %s(%s)", Protocol::verbName(inReVerb), inRePacketId, peer->address().toString().c_str(), path->address().toString().c_str());
  635. switch (inReVerb) {
  636. case Protocol::VERB_HELLO:
  637. break;
  638. case Protocol::VERB_WHOIS:
  639. break;
  640. case Protocol::VERB_NETWORK_CONFIG_REQUEST:
  641. break;
  642. case Protocol::VERB_MULTICAST_GATHER:
  643. break;
  644. }
  645. return true;
  646. }
  647. bool VL1::m_WHOIS(void *tPtr, const uint64_t packetId, const unsigned int auth, const SharedPtr<Path> &path, const SharedPtr<Peer> &peer, Buf &pkt, int packetSize)
  648. {
  649. #if 0
  650. if (packetSize < (int)sizeof(Protocol::OK::Header)) {
  651. RR->t->incomingPacketDropped(tPtr,0x4c1f1ff7,0,0,identityFromPeerPtr(peer),path->address(),0,Protocol::VERB_OK,ZT_TRACE_PACKET_DROP_REASON_MALFORMED_PACKET);
  652. return false;
  653. }
  654. Protocol::Header &ph = pkt.as<Protocol::Header>();
  655. if (!peer->rateGateInboundWhoisRequest(RR->node->now())) {
  656. RR->t->incomingPacketDropped(tPtr,0x19f7194a,ph.packetId,0,peer->identity(),path->address(),Protocol::packetHops(ph),Protocol::VERB_WHOIS,ZT_TRACE_PACKET_DROP_REASON_RATE_LIMIT_EXCEEDED);
  657. return true;
  658. }
  659. Buf outp;
  660. Protocol::OK::WHOIS &outh = outp.as<Protocol::OK::WHOIS>();
  661. int ptr = sizeof(Protocol::Header);
  662. while ((ptr + ZT_ADDRESS_LENGTH) <= packetSize) {
  663. outh.h.h.packetId = Protocol::getPacketId();
  664. peer->address().copyTo(outh.h.h.destination);
  665. RR->identity.address().copyTo(outh.h.h.source);
  666. outh.h.h.flags = 0;
  667. outh.h.h.verb = Protocol::VERB_OK;
  668. outh.h.inReVerb = Protocol::VERB_WHOIS;
  669. outh.h.inRePacketId = ph.packetId;
  670. int outl = sizeof(Protocol::OK::WHOIS);
  671. while ( ((ptr + ZT_ADDRESS_LENGTH) <= packetSize) && ((outl + ZT_IDENTITY_MARSHAL_SIZE_MAX + ZT_LOCATOR_MARSHAL_SIZE_MAX) < ZT_PROTO_MAX_PACKET_LENGTH) ) {
  672. const SharedPtr<Peer> &wp(RR->topology->peer(tPtr,Address(pkt.unsafeData + ptr)));
  673. if (wp) {
  674. outp.wO(outl,wp->identity());
  675. if (peer->remoteVersionProtocol() >= 11) { // older versions don't know what a locator is
  676. const Locator loc(wp->locator());
  677. outp.wO(outl,loc);
  678. }
  679. if (Buf::writeOverflow(outl)) { // sanity check, shouldn't be possible
  680. RR->t->unexpectedError(tPtr,0xabc0f183,"Buf write overflow building OK(WHOIS) to reply to %s",Trace::str(peer->address(),path).s);
  681. return false;
  682. }
  683. }
  684. ptr += ZT_ADDRESS_LENGTH;
  685. }
  686. if (outl > (int)sizeof(Protocol::OK::WHOIS)) {
  687. Protocol::armor(outp,outl,peer->key(),peer->cipher());
  688. path->send(RR,tPtr,outp.unsafeData,outl,RR->node->now());
  689. }
  690. }
  691. return true;
  692. #endif
  693. }
  694. bool VL1::m_RENDEZVOUS(void *tPtr, const uint64_t packetId, const unsigned int auth, const SharedPtr<Path> &path, const SharedPtr<Peer> &peer, Buf &pkt, int packetSize)
  695. {
  696. #if 0
  697. if (RR->topology->isRoot(peer->identity())) {
  698. if (packetSize < (int)sizeof(Protocol::RENDEZVOUS)) {
  699. RR->t->incomingPacketDropped(tPtr,0x43e90ab3,Protocol::packetId(pkt,packetSize),0,peer->identity(),path->address(),Protocol::packetHops(pkt,packetSize),Protocol::VERB_RENDEZVOUS,ZT_TRACE_PACKET_DROP_REASON_MALFORMED_PACKET);
  700. return false;
  701. }
  702. Protocol::RENDEZVOUS &rdv = pkt.as<Protocol::RENDEZVOUS>();
  703. const SharedPtr<Peer> with(RR->topology->peer(tPtr,Address(rdv.peerAddress)));
  704. if (with) {
  705. const int64_t now = RR->node->now();
  706. const unsigned int port = Utils::ntoh(rdv.port);
  707. if (port != 0) {
  708. switch(rdv.addressLength) {
  709. case 4:
  710. case 16:
  711. if ((int)(sizeof(Protocol::RENDEZVOUS) + rdv.addressLength) <= packetSize) {
  712. const InetAddress atAddr(pkt.unsafeData + sizeof(Protocol::RENDEZVOUS),rdv.addressLength,port);
  713. peer->tryToContactAt(tPtr,Endpoint(atAddr),now,false);
  714. RR->t->tryingNewPath(tPtr,0x55a19aaa,with->identity(),atAddr,path->address(),Protocol::packetId(pkt,packetSize),Protocol::VERB_RENDEZVOUS,peer->identity(),ZT_TRACE_TRYING_NEW_PATH_REASON_RENDEZVOUS);
  715. }
  716. break;
  717. case 255: {
  718. Endpoint ep;
  719. int p = sizeof(Protocol::RENDEZVOUS);
  720. int epl = pkt.rO(p,ep);
  721. if ((epl > 0) && (ep) && (!Buf::readOverflow(p,packetSize))) {
  722. switch (ep.type()) {
  723. case Endpoint::TYPE_INETADDR_V4:
  724. case Endpoint::TYPE_INETADDR_V6:
  725. peer->tryToContactAt(tPtr,ep,now,false);
  726. RR->t->tryingNewPath(tPtr,0x55a19aab,with->identity(),ep.inetAddr(),path->address(),Protocol::packetId(pkt,packetSize),Protocol::VERB_RENDEZVOUS,peer->identity(),ZT_TRACE_TRYING_NEW_PATH_REASON_RENDEZVOUS);
  727. break;
  728. default:
  729. break;
  730. }
  731. }
  732. } break;
  733. }
  734. }
  735. }
  736. }
  737. return true;
  738. #endif
  739. }
  740. bool VL1::m_ECHO(void *tPtr, const uint64_t packetId, const unsigned int auth, const SharedPtr<Path> &path, const SharedPtr<Peer> &peer, Buf &pkt, int packetSize)
  741. {
  742. #if 0
  743. const uint64_t packetId = Protocol::packetId(pkt,packetSize);
  744. const uint64_t now = RR->node->now();
  745. if (packetSize < (int)sizeof(Protocol::Header)) {
  746. RR->t->incomingPacketDropped(tPtr,0x14d70bb0,packetId,0,peer->identity(),path->address(),Protocol::packetHops(pkt,packetSize),Protocol::VERB_ECHO,ZT_TRACE_PACKET_DROP_REASON_MALFORMED_PACKET);
  747. return false;
  748. }
  749. if (peer->rateGateEchoRequest(now)) {
  750. Buf outp;
  751. Protocol::OK::ECHO &outh = outp.as<Protocol::OK::ECHO>();
  752. outh.h.h.packetId = Protocol::getPacketId();
  753. peer->address().copyTo(outh.h.h.destination);
  754. RR->identity.address().copyTo(outh.h.h.source);
  755. outh.h.h.flags = 0;
  756. outh.h.h.verb = Protocol::VERB_OK;
  757. outh.h.inReVerb = Protocol::VERB_ECHO;
  758. outh.h.inRePacketId = packetId;
  759. int outl = sizeof(Protocol::OK::ECHO);
  760. outp.wB(outl,pkt.unsafeData + sizeof(Protocol::Header),packetSize - sizeof(Protocol::Header));
  761. if (Buf::writeOverflow(outl)) {
  762. RR->t->incomingPacketDropped(tPtr,0x14d70bb0,packetId,0,peer->identity(),path->address(),Protocol::packetHops(pkt,packetSize),Protocol::VERB_ECHO,ZT_TRACE_PACKET_DROP_REASON_MALFORMED_PACKET);
  763. return false;
  764. }
  765. Protocol::armor(outp,outl,peer->key(),peer->cipher());
  766. path->send(RR,tPtr,outp.unsafeData,outl,now);
  767. } else {
  768. RR->t->incomingPacketDropped(tPtr,0x27878bc1,packetId,0,peer->identity(),path->address(),Protocol::packetHops(pkt,packetSize),Protocol::VERB_ECHO,ZT_TRACE_PACKET_DROP_REASON_RATE_LIMIT_EXCEEDED);
  769. }
  770. return true;
  771. #endif
  772. }
  773. bool VL1::m_PUSH_DIRECT_PATHS(void *tPtr, const uint64_t packetId, const unsigned int auth, const SharedPtr<Path> &path, const SharedPtr<Peer> &peer, Buf &pkt, int packetSize)
  774. {
  775. #if 0
  776. if (packetSize < (int)sizeof(Protocol::PUSH_DIRECT_PATHS)) {
  777. RR->t->incomingPacketDropped(tPtr,0x1bb1bbb1,Protocol::packetId(pkt,packetSize),0,peer->identity(),path->address(),Protocol::packetHops(pkt,packetSize),Protocol::VERB_PUSH_DIRECT_PATHS,ZT_TRACE_PACKET_DROP_REASON_MALFORMED_PACKET);
  778. return false;
  779. }
  780. Protocol::PUSH_DIRECT_PATHS &pdp = pkt.as<Protocol::PUSH_DIRECT_PATHS>();
  781. int ptr = sizeof(Protocol::PUSH_DIRECT_PATHS);
  782. const unsigned int numPaths = Utils::ntoh(pdp.numPaths);
  783. InetAddress a;
  784. Endpoint ep;
  785. for(unsigned int pi=0;pi<numPaths;++pi) {
  786. /*const uint8_t flags = pkt.rI8(ptr);*/ ++ptr; // flags are not presently used
  787. const int xas = (int)pkt.rI16(ptr);
  788. //const uint8_t *const extendedAttrs = pkt.rBnc(ptr,xas);
  789. ptr += xas;
  790. const unsigned int addrType = pkt.rI8(ptr);
  791. const unsigned int addrRecordLen = pkt.rI8(ptr);
  792. if (addrRecordLen == 0) {
  793. RR->t->incomingPacketDropped(tPtr,0xaed00118,pdp.h.packetId,0,peer->identity(),path->address(),Protocol::packetHops(pdp.h),Protocol::VERB_PUSH_DIRECT_PATHS,ZT_TRACE_PACKET_DROP_REASON_MALFORMED_PACKET);
  794. return false;
  795. }
  796. if (Buf::readOverflow(ptr,packetSize)) {
  797. RR->t->incomingPacketDropped(tPtr,0xb450e10f,pdp.h.packetId,0,peer->identity(),path->address(),Protocol::packetHops(pdp.h),Protocol::VERB_PUSH_DIRECT_PATHS,ZT_TRACE_PACKET_DROP_REASON_MALFORMED_PACKET);
  798. return false;
  799. }
  800. const void *addrBytes = nullptr;
  801. unsigned int addrLen = 0;
  802. unsigned int addrPort = 0;
  803. switch(addrType) {
  804. case 0:
  805. addrBytes = pkt.rBnc(ptr,addrRecordLen);
  806. addrLen = addrRecordLen;
  807. break;
  808. case 4:
  809. addrBytes = pkt.rBnc(ptr,4);
  810. addrLen = 4;
  811. addrPort = pkt.rI16(ptr);
  812. break;
  813. case 6:
  814. addrBytes = pkt.rBnc(ptr,16);
  815. addrLen = 16;
  816. addrPort = pkt.rI16(ptr);
  817. break;
  818. //case 200:
  819. // TODO: this would be a WebRTC SDP offer contained in the extended attrs field
  820. //break;
  821. default: break;
  822. }
  823. if (Buf::readOverflow(ptr,packetSize)) {
  824. RR->t->incomingPacketDropped(tPtr,0xb4d0f10f,pdp.h.packetId,0,peer->identity(),path->address(),Protocol::packetHops(pdp.h),Protocol::VERB_PUSH_DIRECT_PATHS,ZT_TRACE_PACKET_DROP_REASON_MALFORMED_PACKET);
  825. return false;
  826. }
  827. if (addrPort) {
  828. a.set(addrBytes,addrLen,addrPort);
  829. } else if (addrLen) {
  830. if (ep.unmarshal(reinterpret_cast<const uint8_t *>(addrBytes),(int)addrLen) <= 0) {
  831. RR->t->incomingPacketDropped(tPtr,0x00e0f00d,pdp.h.packetId,0,peer->identity(),path->address(),Protocol::packetHops(pdp.h),Protocol::VERB_PUSH_DIRECT_PATHS,ZT_TRACE_PACKET_DROP_REASON_MALFORMED_PACKET);
  832. return false;
  833. }
  834. switch(ep.type()) {
  835. case Endpoint::TYPE_INETADDR_V4:
  836. case Endpoint::TYPE_INETADDR_V6:
  837. a = ep.inetAddr();
  838. break;
  839. default: // other types are not supported yet
  840. break;
  841. }
  842. }
  843. if (a) {
  844. RR->t->tryingNewPath(tPtr,0xa5ab1a43,peer->identity(),a,path->address(),Protocol::packetId(pkt,packetSize),Protocol::VERB_RENDEZVOUS,peer->identity(),ZT_TRACE_TRYING_NEW_PATH_REASON_RECEIVED_PUSH_DIRECT_PATHS);
  845. }
  846. ptr += (int)addrRecordLen;
  847. }
  848. // TODO: add to a peer try-queue
  849. return true;
  850. #endif
  851. }
  852. bool VL1::m_USER_MESSAGE(void *tPtr, const uint64_t packetId, const unsigned int auth, const SharedPtr<Path> &path, const SharedPtr<Peer> &peer, Buf &pkt, int packetSize)
  853. {
  854. // TODO
  855. return true;
  856. }
  857. bool VL1::m_ENCAP(void *tPtr, const uint64_t packetId, const unsigned int auth, const SharedPtr<Path> &path, const SharedPtr<Peer> &peer, Buf &pkt, int packetSize)
  858. {
  859. // TODO: not implemented yet
  860. return true;
  861. }
  862. } // namespace ZeroTier