summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
Diffstat (limited to 'node')
-rw-r--r--node/Identity.cpp32
-rw-r--r--node/Node.cpp13
-rw-r--r--node/Trace.cpp129
-rw-r--r--node/Trace.hpp4
-rw-r--r--node/Utils.hpp18
5 files changed, 75 insertions, 121 deletions
diff --git a/node/Identity.cpp b/node/Identity.cpp
index dba27d1c..a972d60d 100644
--- a/node/Identity.cpp
+++ b/node/Identity.cpp
@@ -157,44 +157,58 @@ char *Identity::toString(bool includePrivate,char buf[ZT_IDENTITY_STRING_BUFFER_
bool Identity::fromString(const char *str)
{
- if (!str)
+ if (!str) {
+ _address.zero();
return false;
-
- char *saveptr = (char *)0;
+ }
char tmp[ZT_IDENTITY_STRING_BUFFER_LENGTH];
- if (!Utils::scopy(tmp,sizeof(tmp),str))
+ if (!Utils::scopy(tmp,sizeof(tmp),str)) {
+ _address.zero();
return false;
+ }
delete _privateKey;
_privateKey = (C25519::Private *)0;
int fno = 0;
+ char *saveptr = (char *)0;
for(char *f=Utils::stok(tmp,":",&saveptr);(f);f=Utils::stok((char *)0,":",&saveptr)) {
switch(fno++) {
case 0:
_address = Address(Utils::hexStrToU64(f));
- if (_address.isReserved())
+ if (_address.isReserved()) {
+ _address.zero();
return false;
+ }
break;
case 1:
- if ((f[0] != '0')||(f[1]))
+ if ((f[0] != '0')||(f[1])) {
+ _address.zero();
return false;
+ }
break;
case 2:
- if (Utils::unhex(f,_publicKey.data,(unsigned int)_publicKey.size()) != _publicKey.size())
+ if (Utils::unhex(f,_publicKey.data,(unsigned int)_publicKey.size()) != _publicKey.size()) {
+ _address.zero();
return false;
+ }
break;
case 3:
_privateKey = new C25519::Private();
- if (Utils::unhex(f,_privateKey->data,(unsigned int)_privateKey->size()) != _privateKey->size())
+ if (Utils::unhex(f,_privateKey->data,(unsigned int)_privateKey->size()) != _privateKey->size()) {
+ _address.zero();
return false;
+ }
break;
default:
+ _address.zero();
return false;
}
}
- if (fno < 3)
+ if (fno < 3) {
+ _address.zero();
return false;
+ }
return true;
}
diff --git a/node/Node.cpp b/node/Node.cpp
index 073af4bd..ff3acfc2 100644
--- a/node/Node.cpp
+++ b/node/Node.cpp
@@ -78,7 +78,7 @@ Node::Node(void *uptr,void *tptr,const struct ZT_Node_Callbacks *callbacks,uint6
uint64_t idtmp[2];
idtmp[0] = 0; idtmp[1] = 0;
- char tmp[1024];
+ char tmp[2048];
int n = stateObjectGet(tptr,ZT_STATE_OBJECT_IDENTITY_SECRET,idtmp,tmp,sizeof(tmp) - 1);
if (n > 0) {
tmp[n] = (char)0;
@@ -92,21 +92,18 @@ Node::Node(void *uptr,void *tptr,const struct ZT_Node_Callbacks *callbacks,uint6
if (n <= 0) {
RR->identity.generate();
- idtmp[0] = RR->identity.address().toInt(); idtmp[1] = 0;
RR->identity.toString(false,RR->publicIdentityStr);
RR->identity.toString(true,RR->secretIdentityStr);
+ idtmp[0] = RR->identity.address().toInt(); idtmp[1] = 0;
stateObjectPut(tptr,ZT_STATE_OBJECT_IDENTITY_SECRET,idtmp,RR->secretIdentityStr,(unsigned int)strlen(RR->secretIdentityStr));
stateObjectPut(tptr,ZT_STATE_OBJECT_IDENTITY_PUBLIC,idtmp,RR->publicIdentityStr,(unsigned int)strlen(RR->publicIdentityStr));
} else {
idtmp[0] = RR->identity.address().toInt(); idtmp[1] = 0;
n = stateObjectGet(tptr,ZT_STATE_OBJECT_IDENTITY_PUBLIC,idtmp,tmp,sizeof(tmp) - 1);
- if (n > 0) {
- tmp[n] = (char)0;
- if (RR->publicIdentityStr != tmp)
- n = -1;
+ if ((n > 0)&&(n < sizeof(RR->publicIdentityStr))&&(n < sizeof(tmp))) {
+ if (memcmp(tmp,RR->publicIdentityStr,n))
+ stateObjectPut(tptr,ZT_STATE_OBJECT_IDENTITY_PUBLIC,idtmp,RR->publicIdentityStr,(unsigned int)strlen(RR->publicIdentityStr));
}
- if (n <= 0)
- stateObjectPut(tptr,ZT_STATE_OBJECT_IDENTITY_PUBLIC,idtmp,RR->publicIdentityStr,(unsigned int)strlen(RR->publicIdentityStr));
}
try {
diff --git a/node/Trace.cpp b/node/Trace.cpp
index dc5ecf19..21d06228 100644
--- a/node/Trace.cpp
+++ b/node/Trace.cpp
@@ -39,101 +39,6 @@
namespace ZeroTier {
-// Defining ZT_TRACE causes debug tracing messages to be dumped to stderr
-#ifdef ZT_TRACE
-
-static const char *packetVerbString(Packet::Verb v)
-{
- switch(v) {
- case Packet::VERB_NOP: return "NOP";
- case Packet::VERB_HELLO: return "HELLO";
- case Packet::VERB_ERROR: return "ERROR";
- case Packet::VERB_OK: return "OK";
- case Packet::VERB_WHOIS: return "WHOIS";
- case Packet::VERB_RENDEZVOUS: return "RENDEZVOUS";
- case Packet::VERB_FRAME: return "FRAME";
- case Packet::VERB_EXT_FRAME: return "EXT_FRAME";
- case Packet::VERB_ECHO: return "ECHO";
- case Packet::VERB_MULTICAST_LIKE: return "MULTICAST_LIKE";
- case Packet::VERB_NETWORK_CREDENTIALS: return "NETWORK_CREDENTIALS";
- case Packet::VERB_NETWORK_CONFIG_REQUEST: return "NETWORK_CONFIG_REQUEST";
- case Packet::VERB_NETWORK_CONFIG: return "NETWORK_CONFIG";
- case Packet::VERB_MULTICAST_GATHER: return "MULTICAST_GATHER";
- case Packet::VERB_MULTICAST_FRAME: return "MULTICAST_FRAME";
- case Packet::VERB_PUSH_DIRECT_PATHS: return "PUSH_DIRECT_PATHS";
- case Packet::VERB_USER_MESSAGE: return "USER_MESSAGE";
- case Packet::VERB_REMOTE_TRACE: return "REMOTE_TRACE";
- }
- return "(unknown)";
-}
-
-static const char *packetErrorString(Packet::ErrorCode e)
-{
- switch(e) {
- case Packet::ERROR_NONE: return "NONE";
- case Packet::ERROR_INVALID_REQUEST: return "INVALID_REQUEST";
- case Packet::ERROR_BAD_PROTOCOL_VERSION: return "BAD_PROTOCOL_VERSION";
- case Packet::ERROR_OBJ_NOT_FOUND: return "OBJECT_NOT_FOUND";
- case Packet::ERROR_IDENTITY_COLLISION: return "IDENTITY_COLLISION";
- case Packet::ERROR_UNSUPPORTED_OPERATION: return "UNSUPPORTED_OPERATION";
- case Packet::ERROR_NEED_MEMBERSHIP_CERTIFICATE: return "NEED_MEMBERSHIP_CERTIFICATE";
- case Packet::ERROR_NETWORK_ACCESS_DENIED_: return "NETWORK_ACCESS_DENIED";
- case Packet::ERROR_UNWANTED_MULTICAST: return "UNWANTED_MULTICAST";
- }
- return "(unknown)";
-}
-
-#define TRprintf(f,...) { fprintf(stderr,(f),__VA_ARGS__); fflush(stderr); }
-
-#else
-
-#define TRprintf(f,...)
-
-#endif // ZT_TRACE
-
-#define ZT_REMOTE_TRACE_FIELD__EVENT "E"
-#define ZT_REMOTE_TRACE_FIELD__PACKET_ID "pid"
-#define ZT_REMOTE_TRACE_FIELD__PACKET_VERB "pv"
-#define ZT_REMOTE_TRACE_FIELD__PACKET_TRUSTED_PATH_ID "ptpid"
-#define ZT_REMOTE_TRACE_FIELD__PACKET_TRUSTED_PATH_APPROVED "ptpok"
-#define ZT_REMOTE_TRACE_FIELD__PACKET_HOPS "phops"
-#define ZT_REMOTE_TRACE_FIELD__OLD_REMOTE_PHYADDR "oldrphy"
-#define ZT_REMOTE_TRACE_FIELD__REMOTE_ZTADDR "rzt"
-#define ZT_REMOTE_TRACE_FIELD__REMOTE_PHYADDR "rphy"
-#define ZT_REMOTE_TRACE_FIELD__LOCAL_ZTADDR "lzt"
-#define ZT_REMOTE_TRACE_FIELD__LOCAL_PHYADDR "lphy"
-#define ZT_REMOTE_TRACE_FIELD__LOCAL_SOCKET "ls"
-#define ZT_REMOTE_TRACE_FIELD__IP_SCOPE "ipsc"
-#define ZT_REMOTE_TRACE_FIELD__NETWORK_ID "nwid"
-#define ZT_REMOTE_TRACE_FIELD__SOURCE_MAC "seth"
-#define ZT_REMOTE_TRACE_FIELD__DEST_MAC "deth"
-#define ZT_REMOTE_TRACE_FIELD__ETHERTYPE "et"
-#define ZT_REMOTE_TRACE_FIELD__VLAN_ID "vlan"
-#define ZT_REMOTE_TRACE_FIELD__FRAME_LENGTH "fl"
-#define ZT_REMOTE_TRACE_FIELD__FRAME_DATA "fd"
-#define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE "credtype"
-#define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID "credid"
-#define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP "credts"
-#define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_INFO "credinfo"
-#define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO "crediss"
-#define ZT_REMOTE_TRACE_FIELD__CREDENTIAL_REVOCATION_TARGET "credRt"
-#define ZT_REMOTE_TRACE_FIELD__REASON "reason"
-
-#define ZT_REMOTE_TRACE_EVENT__RESETTING_PATHS_IN_SCOPE_S "1000"
-#define ZT_REMOTE_TRACE_EVENT__TX_TIMED_OUT_S "1001"
-#define ZT_REMOTE_TRACE_EVENT__PEER_CONFIRMING_UNKNOWN_PATH_S "1002"
-#define ZT_REMOTE_TRACE_EVENT__PEER_LEARNED_NEW_PATH_S "1003"
-#define ZT_REMOTE_TRACE_EVENT__PEER_REDIRECTED_S "1004"
-#define ZT_REMOTE_TRACE_EVENT__PACKET_MAC_FAILURE_S "1005"
-#define ZT_REMOTE_TRACE_EVENT__PACKET_INVALID_S "1006"
-#define ZT_REMOTE_TRACE_EVENT__DROPPED_HELLO_S "1006"
-
-#define ZT_REMOTE_TRACE_EVENT__OUTGOING_NETWORK_FRAME_DROPPED_S "2000"
-#define ZT_REMOTE_TRACE_EVENT__INCOMING_NETWORK_ACCESS_DENIED_S "2001"
-#define ZT_REMOTE_TRACE_EVENT__INCOMING_NETWORK_FRAME_DROPPED_S "2002"
-#define ZT_REMOTE_TRACE_EVENT__CREDENTIAL_REJECTED_S "2003"
-#define ZT_REMOTE_TRACE_EVENT__CREDENTIAL_ACCEPTED_S "2004"
-
void Trace::resettingPathsInScope(void *const tPtr,const Address &reporter,const InetAddress &reporterPhysicalAddress,const InetAddress &myPhysicalAddress,const InetAddress::IpScope scope)
{
char tmp[128];
@@ -328,6 +233,7 @@ void Trace::credentialRejected(void *const tPtr,const CertificateOfMembership &c
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
if (reason)
d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
+ _send(tPtr,d,0);
}
void Trace::credentialRejected(void *const tPtr,const CertificateOfOwnership &c,const char *reason)
@@ -341,6 +247,7 @@ void Trace::credentialRejected(void *const tPtr,const CertificateOfOwnership &c,
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
if (reason)
d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
+ _send(tPtr,d,0);
}
void Trace::credentialRejected(void *const tPtr,const CertificateOfRepresentation &c,const char *reason)
@@ -352,6 +259,7 @@ void Trace::credentialRejected(void *const tPtr,const CertificateOfRepresentatio
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
if (reason)
d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
+ _send(tPtr,d,0);
}
void Trace::credentialRejected(void *const tPtr,const Capability &c,const char *reason)
@@ -365,6 +273,7 @@ void Trace::credentialRejected(void *const tPtr,const Capability &c,const char *
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
if (reason)
d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
+ _send(tPtr,d,0);
}
void Trace::credentialRejected(void *const tPtr,const Tag &c,const char *reason)
@@ -379,6 +288,7 @@ void Trace::credentialRejected(void *const tPtr,const Tag &c,const char *reason)
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_INFO,(uint64_t)c.value());
if (reason)
d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
+ _send(tPtr,d,0);
}
void Trace::credentialRejected(void *const tPtr,const Revocation &c,const char *reason)
@@ -391,6 +301,7 @@ void Trace::credentialRejected(void *const tPtr,const Revocation &c,const char *
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_REVOCATION_TARGET,c.target());
if (reason)
d.add(ZT_REMOTE_TRACE_FIELD__REASON,reason);
+ _send(tPtr,d,0);
}
void Trace::credentialAccepted(void *const tPtr,const CertificateOfMembership &c)
@@ -402,6 +313,7 @@ void Trace::credentialAccepted(void *const tPtr,const CertificateOfMembership &c
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
+ _send(tPtr,d,0);
}
void Trace::credentialAccepted(void *const tPtr,const CertificateOfOwnership &c)
@@ -413,6 +325,7 @@ void Trace::credentialAccepted(void *const tPtr,const CertificateOfOwnership &c)
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
+ _send(tPtr,d,0);
}
void Trace::credentialAccepted(void *const tPtr,const CertificateOfRepresentation &c)
@@ -422,6 +335,7 @@ void Trace::credentialAccepted(void *const tPtr,const CertificateOfRepresentatio
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
+ _send(tPtr,d,0);
}
void Trace::credentialAccepted(void *const tPtr,const Capability &c)
@@ -433,6 +347,7 @@ void Trace::credentialAccepted(void *const tPtr,const Capability &c)
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
+ _send(tPtr,d,0);
}
void Trace::credentialAccepted(void *const tPtr,const Tag &c)
@@ -445,6 +360,7 @@ void Trace::credentialAccepted(void *const tPtr,const Tag &c)
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TIMESTAMP,c.timestamp());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ISSUED_TO,c.issuedTo());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_INFO,(uint64_t)c.value());
+ _send(tPtr,d,0);
}
void Trace::credentialAccepted(void *const tPtr,const Revocation &c)
@@ -455,10 +371,33 @@ void Trace::credentialAccepted(void *const tPtr,const Revocation &c)
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_TYPE,(uint64_t)c.credentialType());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_ID,(uint64_t)c.id());
d.add(ZT_REMOTE_TRACE_FIELD__CREDENTIAL_REVOCATION_TARGET,c.target());
+ _send(tPtr,d,0);
}
void Trace::_send(void *const tPtr,const Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> &d)
{
+#ifdef ZT_TRACE
+ unsigned int i = 0;
+ while (i < (unsigned int)(sizeof(_traceMsgBuf) - 1)) {
+ const char c = d.data()[i];
+ if (c == 0) {
+ break;
+ } else if (c == '\n') {
+ _traceMsgBuf[i++] = ' ';
+ } else if ((c >= 32)&&(c <= 126)) {
+ _traceMsgBuf[i++] = c;
+ } else {
+ if ((i + 3) < (unsigned int)(sizeof(_traceMsgBuf) - 1)) {
+ _traceMsgBuf[i++] = '\\';
+ Utils::hex((uint8_t)c,_traceMsgBuf + i);
+ }
+ }
+ }
+ _traceMsgBuf[i] = (char)0;
+ //printf("%s\n",_traceMsgBuf);
+ RR->node->postEvent(tPtr,ZT_EVENT_TRACE,_traceMsgBuf);
+#endif
+
const Address rtt(RR->node->remoteTraceTarget());
if (rtt) {
Packet outp(rtt,RR->identity.address(),Packet::VERB_REMOTE_TRACE);
diff --git a/node/Trace.hpp b/node/Trace.hpp
index eefd5359..dae67e28 100644
--- a/node/Trace.hpp
+++ b/node/Trace.hpp
@@ -155,6 +155,10 @@ private:
void _send(void *const tPtr,const Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> &d);
void _send(void *const tPtr,const Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> &d,const uint64_t networkId);
void _send(void *const tPtr,const Dictionary<ZT_MAX_REMOTE_TRACE_SIZE> &d,const SharedPtr<Network> &network);
+
+#ifdef ZT_TRACE
+ char _traceMsgBuf[4096];
+#endif
};
} // namespace ZeroTier
diff --git a/node/Utils.hpp b/node/Utils.hpp
index 1139c9f1..8f61d396 100644
--- a/node/Utils.hpp
+++ b/node/Utils.hpp
@@ -150,8 +150,8 @@ public:
{
char *save = s;
for(unsigned int i=0;i<l;++i) {
- unsigned int b = reinterpret_cast<const uint8_t *>(d)[i];
- *(s++) = HEXCHARS[(b >> 4) & 0xf];
+ const unsigned int b = reinterpret_cast<const uint8_t *>(d)[i];
+ *(s++) = HEXCHARS[b >> 4];
*(s++) = HEXCHARS[b & 0xf];
}
*s = (char)0;
@@ -162,18 +162,18 @@ public:
{
unsigned int l = 0;
while (l < buflen) {
- uint8_t hc = (uint8_t)*(h++);
+ uint8_t hc = *(reinterpret_cast<const uint8_t *>(h++));
if (!hc) break;
uint8_t c = 0;
- if ((hc >= 48)&&(hc <= 57))
+ if ((hc >= 48)&&(hc <= 57)) // 0..9
c = hc - 48;
- else if ((hc >= 97)&&(hc <= 102))
+ else if ((hc >= 97)&&(hc <= 102)) // a..f
c = hc - 87;
- else if ((hc >= 65)&&(hc <= 70))
+ else if ((hc >= 65)&&(hc <= 70)) // A..F
c = hc - 55;
- hc = (uint8_t)*(h++);
+ hc = *(reinterpret_cast<const uint8_t *>(h++));
if (!hc) break;
c <<= 4;
@@ -195,7 +195,7 @@ public:
const char *hend = h + hlen;
while (l < buflen) {
if (h == hend) break;
- uint8_t hc = (uint8_t)*(h++);
+ uint8_t hc = *(reinterpret_cast<const uint8_t *>(h++));
if (!hc) break;
uint8_t c = 0;
@@ -207,7 +207,7 @@ public:
c = hc - 55;
if (h == hend) break;
- hc = (uint8_t)*(h++);
+ hc = *(reinterpret_cast<const uint8_t *>(h++));
if (!hc) break;
c <<= 4;