diff --git a/node/Buf.hpp b/node/Buf.hpp index 4d8a1e576..af03db126 100644 --- a/node/Buf.hpp +++ b/node/Buf.hpp @@ -250,8 +250,8 @@ public: ii += 2; #ifdef ZT_NO_UNALIGNED_ACCESS return ( - ((uint16_t)data.bytes[s] << 8U) | - (uint16_t)data.bytes[s + 1]); + ((uint16_t)unsafeData[s] << 8U) | + (uint16_t)unsafeData[s + 1]); #else return Utils::ntoh(*reinterpret_cast(unsafeData + s)); #endif @@ -269,10 +269,10 @@ public: ii += 4; #ifdef ZT_NO_UNALIGNED_ACCESS return ( - ((uint32_t)data.bytes[s] << 24U) | - ((uint32_t)data.bytes[s + 1] << 16U) | - ((uint32_t)data.bytes[s + 2] << 8U) | - (uint32_t)data.bytes[s + 3]); + ((uint32_t)unsafeData[s] << 24U) | + ((uint32_t)unsafeData[s + 1] << 16U) | + ((uint32_t)unsafeData[s + 2] << 8U) | + (uint32_t)unsafeData[s + 3]); #else return Utils::ntoh(*reinterpret_cast(unsafeData + s)); #endif @@ -290,14 +290,14 @@ public: ii += 8; #ifdef ZT_NO_UNALIGNED_ACCESS return ( - ((uint64_t)data.bytes[s] << 56U) | - ((uint64_t)data.bytes[s + 1] << 48U) | - ((uint64_t)data.bytes[s + 2] << 40U) | - ((uint64_t)data.bytes[s + 3] << 32U) | - ((uint64_t)data.bytes[s + 4] << 24U) | - ((uint64_t)data.bytes[s + 5] << 16U) | - ((uint64_t)data.bytes[s + 6] << 8U) | - (uint64_t)data.bytes[s + 7]); + ((uint64_t)unsafeData[s] << 56U) | + ((uint64_t)unsafeData[s + 1] << 48U) | + ((uint64_t)unsafeData[s + 2] << 40U) | + ((uint64_t)unsafeData[s + 3] << 32U) | + ((uint64_t)unsafeData[s + 4] << 24U) | + ((uint64_t)unsafeData[s + 5] << 16U) | + ((uint64_t)unsafeData[s + 6] << 8U) | + (uint64_t)unsafeData[s + 7]); #else return Utils::ntoh(*reinterpret_cast(unsafeData + s)); #endif @@ -440,8 +440,8 @@ public: const unsigned int s = (unsigned int)ii & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS return ( - ((uint16_t)data.bytes[s] << 8U) | - (uint16_t)data.bytes[s + 1]); + ((uint16_t)unsafeData[s] << 8U) | + (uint16_t)unsafeData[s + 1]); #else return Utils::ntoh(*reinterpret_cast(unsafeData + s)); #endif @@ -459,10 +459,10 @@ public: const unsigned int s = (unsigned int)ii & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS return ( - ((uint32_t)data.bytes[s] << 24U) | - ((uint32_t)data.bytes[s + 1] << 16U) | - ((uint32_t)data.bytes[s + 2] << 8U) | - (uint32_t)data.bytes[s + 3]); + ((uint32_t)unsafeData[s] << 24U) | + ((uint32_t)unsafeData[s + 1] << 16U) | + ((uint32_t)unsafeData[s + 2] << 8U) | + (uint32_t)unsafeData[s + 3]); #else return Utils::ntoh(*reinterpret_cast(unsafeData + s)); #endif @@ -480,14 +480,14 @@ public: const unsigned int s = (unsigned int)ii & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS return ( - ((uint64_t)data.bytes[s] << 56U) | - ((uint64_t)data.bytes[s + 1] << 48U) | - ((uint64_t)data.bytes[s + 2] << 40U) | - ((uint64_t)data.bytes[s + 3] << 32U) | - ((uint64_t)data.bytes[s + 4] << 24U) | - ((uint64_t)data.bytes[s + 5] << 16U) | - ((uint64_t)data.bytes[s + 6] << 8U) | - (uint64_t)data.bytes[s + 7]); + ((uint64_t)unsafeData[s] << 56U) | + ((uint64_t)unsafeData[s + 1] << 48U) | + ((uint64_t)unsafeData[s + 2] << 40U) | + ((uint64_t)unsafeData[s + 3] << 32U) | + ((uint64_t)unsafeData[s + 4] << 24U) | + ((uint64_t)unsafeData[s + 5] << 16U) | + ((uint64_t)unsafeData[s + 6] << 8U) | + (uint64_t)unsafeData[s + 7]); #else return Utils::ntoh(*reinterpret_cast(unsafeData + s)); #endif @@ -516,8 +516,8 @@ public: const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; ii += 2; #ifdef ZT_NO_UNALIGNED_ACCESS - b[s] = (uint8_t)(n >> 8U); - b[s + 1] = (uint8_t)n; + unsafeData[s] = (uint8_t)(n >> 8U); + unsafeData[s + 1] = (uint8_t)n; #else *reinterpret_cast(unsafeData + s) = Utils::hton(n); #endif @@ -534,10 +534,10 @@ public: const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; ii += 4; #ifdef ZT_NO_UNALIGNED_ACCESS - b[s] = (uint8_t)(n >> 24U); - b[s + 1] = (uint8_t)(n >> 16U); - b[s + 2] = (uint8_t)(n >> 8U); - b[s + 3] = (uint8_t)n; + unsafeData[s] = (uint8_t)(n >> 24U); + unsafeData[s + 1] = (uint8_t)(n >> 16U); + unsafeData[s + 2] = (uint8_t)(n >> 8U); + unsafeData[s + 3] = (uint8_t)n; #else *reinterpret_cast(unsafeData + s) = Utils::hton(n); #endif @@ -554,14 +554,14 @@ public: const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; ii += 8; #ifdef ZT_NO_UNALIGNED_ACCESS - b[s] = (uint8_t)(n >> 56U); - b[s + 1] = (uint8_t)(n >> 48U); - b[s + 2] = (uint8_t)(n >> 40U); - b[s + 3] = (uint8_t)(n >> 32U); - b[s + 4] = (uint8_t)(n >> 24U); - b[s + 5] = (uint8_t)(n >> 16U); - b[s + 6] = (uint8_t)(n >> 8U); - b[s + 7] = (uint8_t)n; + unsafeData[s] = (uint8_t)(n >> 56U); + unsafeData[s + 1] = (uint8_t)(n >> 48U); + unsafeData[s + 2] = (uint8_t)(n >> 40U); + unsafeData[s + 3] = (uint8_t)(n >> 32U); + unsafeData[s + 4] = (uint8_t)(n >> 24U); + unsafeData[s + 5] = (uint8_t)(n >> 16U); + unsafeData[s + 6] = (uint8_t)(n >> 8U); + unsafeData[s + 7] = (uint8_t)n; #else *reinterpret_cast(unsafeData + s) = Utils::hton(n); #endif @@ -635,8 +635,8 @@ public: { const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS - b[s] = (uint8_t)(n >> 8U); - b[s + 1] = (uint8_t)n; + unsafeData[s] = (uint8_t)(n >> 8U); + unsafeData[s + 1] = (uint8_t)n; #else *reinterpret_cast(unsafeData + s) = Utils::hton(n); #endif @@ -649,10 +649,10 @@ public: { const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS - b[s] = (uint8_t)(n >> 24U); - b[s + 1] = (uint8_t)(n >> 16U); - b[s + 2] = (uint8_t)(n >> 8U); - b[s + 3] = (uint8_t)n; + unsafeData[s] = (uint8_t)(n >> 24U); + unsafeData[s + 1] = (uint8_t)(n >> 16U); + unsafeData[s + 2] = (uint8_t)(n >> 8U); + unsafeData[s + 3] = (uint8_t)n; #else *reinterpret_cast(unsafeData + s) = Utils::hton(n); #endif @@ -665,14 +665,14 @@ public: { const unsigned int s = ((unsigned int)ii) & ZT_BUF_MEM_MASK; #ifdef ZT_NO_UNALIGNED_ACCESS - b[s] = (uint8_t)(n >> 56U); - b[s + 1] = (uint8_t)(n >> 48U); - b[s + 2] = (uint8_t)(n >> 40U); - b[s + 3] = (uint8_t)(n >> 32U); - b[s + 4] = (uint8_t)(n >> 24U); - b[s + 5] = (uint8_t)(n >> 16U); - b[s + 6] = (uint8_t)(n >> 8U); - b[s + 7] = (uint8_t)n; + unsafeData[s] = (uint8_t)(n >> 56U); + unsafeData[s + 1] = (uint8_t)(n >> 48U); + unsafeData[s + 2] = (uint8_t)(n >> 40U); + unsafeData[s + 3] = (uint8_t)(n >> 32U); + unsafeData[s + 4] = (uint8_t)(n >> 24U); + unsafeData[s + 5] = (uint8_t)(n >> 16U); + unsafeData[s + 6] = (uint8_t)(n >> 8U); + unsafeData[s + 7] = (uint8_t)n; #else *reinterpret_cast(unsafeData + s) = Utils::hton(n); #endif diff --git a/node/Identity.cpp b/node/Identity.cpp index 9ee0d0954..902e6a880 100644 --- a/node/Identity.cpp +++ b/node/Identity.cpp @@ -95,7 +95,6 @@ bool identityV1ProofOfWorkCriteria(const void *in,const unsigned int len) polykey[2] = b[2]; polykey[3] = b[3]; - // Put bits in hash in LE byte order on BE machines. #if __BYTE_ORDER == __BIG_ENDIAN b[0] = Utils::swapBytes(b[0]); b[1] = Utils::swapBytes(b[1]); @@ -140,7 +139,6 @@ bool identityV1ProofOfWorkCriteria(const void *in,const unsigned int len) } std::sort(b,b + 98304); - // Put bits in little-endian byte order if this is a BE machine. #if __BYTE_ORDER == __BIG_ENDIAN for(unsigned int i=0;i<98304;i+=8) { b[i] = Utils::swapBytes(b[i]); @@ -195,17 +193,21 @@ bool Identity::generate(const Type t) case P384: { for(;;) { + // Loop until we pass the PoW criteria. The nonce is only 8 bits, so generate + // some new key material every time it wraps. The ECC384 generator is slightly + // faster so use that one. _pub.nonce = 0; -v1_pow_new_keys: C25519::generate(_pub.c25519,_priv.c25519); ECC384GenerateKey(_pub.p384,_priv.p384); - for (;;) { + for(;;) { if (identityV1ProofOfWorkCriteria(&_pub,sizeof(_pub))) break; - if (++_pub.nonce == 0) // endian-ness doesn't matter, just change the nonce each time - goto v1_pow_new_keys; + if (++_pub.nonce == 0) + ECC384GenerateKey(_pub.p384,_priv.p384); } + // If we passed PoW then check that the address is valid, otherwise loop + // back around and run the whole process again. _computeHash(); _address.setTo(_fp.hash()); if (!_address.isReserved())