VL1.cpp 39 KB

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