diff --git a/node/Identity.cpp b/node/Identity.cpp index 0f3157440..b7836be96 100644 --- a/node/Identity.cpp +++ b/node/Identity.cpp @@ -96,6 +96,10 @@ struct _Identity_generate_cond char *genmem; }; +////////////////////////////////////////////////////////////////////////////// +// This is a memory-hard momentum-like hash used for type 1 addresses + + ////////////////////////////////////////////////////////////////////////////// void Identity::generate(const Type t) diff --git a/node/Identity.hpp b/node/Identity.hpp index 3cffdf9e9..a7e761e00 100644 --- a/node/Identity.hpp +++ b/node/Identity.hpp @@ -75,7 +75,7 @@ public: ~Identity() { Utils::burn(reinterpret_cast(this),sizeof(Identity)); } - inline void zero() { memset(reinterpret_cast(this),0,sizeof(Identity)); } + inline void zero() { Utils::burn(reinterpret_cast(this),sizeof(Identity)); } inline Identity &operator=(const Identity &id) { @@ -165,21 +165,24 @@ public: */ inline unsigned int sign(const void *data,unsigned int len,void *sig,unsigned int siglen) const { - uint8_t h[64]; + uint8_t h[48]; if (!_hasPrivate) return 0; switch(_type) { + case C25519: if (siglen < ZT_C25519_SIGNATURE_LEN) return 0; C25519::sign(_k.t0.priv,_k.t0.pub,data,len,sig); return ZT_C25519_SIGNATURE_LEN; + case P384: if (siglen < ZT_ECC384_SIGNATURE_SIZE) return 0; - SHA512(h,data,len); + SHA384(h,data,len); ECC384ECDSASign(_k.t1.priv,h,(uint8_t *)sig); return ZT_ECC384_SIGNATURE_SIZE; + } return 0; } @@ -195,15 +198,18 @@ public: */ inline bool verify(const void *data,unsigned int len,const void *sig,unsigned int siglen) const { - uint8_t h[64]; switch(_type) { + case C25519: return C25519::verify(_k.t0.pub,data,len,sig,siglen); + case P384: - if (siglen != ZT_ECC384_SIGNATURE_SIZE) - return false; - SHA512(h,data,len); - return ECC384ECDSAVerify(_k.t1.pub,h,(const uint8_t *)sig); + if (siglen == ZT_ECC384_SIGNATURE_SIZE) { + uint8_t h[48]; + SHA384(h,data,len); + return ECC384ECDSAVerify(_k.t1.pub,h,(const uint8_t *)sig); + } + } return false; } @@ -221,24 +227,26 @@ public: inline bool agree(const Identity &id,void *key,unsigned int klen) const { uint8_t ecc384RawSecret[ZT_ECC384_SHARED_SECRET_SIZE]; - uint8_t h[64]; + uint8_t h[48]; if (_hasPrivate) { switch(_type) { + case C25519: C25519::agree(_k.t0.priv,id._k.t0.pub,key,klen); return true; + case P384: ECC384ECDH(id._k.t1.pub,_k.t1.priv,ecc384RawSecret); - SHA512(h,ecc384RawSecret,sizeof(ecc384RawSecret)); - unsigned int hi = 0; - for(unsigned int i=0;i #define ZT_HAVE_NATIVE_SHA512 @@ -64,8 +62,6 @@ void SHA384(void *digest,const void *data,unsigned int len) } #endif -#endif - #ifndef ZT_HAVE_NATIVE_SHA512 namespace ZeroTier { @@ -265,9 +261,5 @@ void SHA384(void *digest,const void *data,unsigned int len) #endif // !ZT_HAVE_NATIVE_SHA512 -// Internally re-export to included C code, which includes some fast crypto code ported in on some platforms. -// This eliminates the need to link against a third party SHA512() from this code -extern "C" void ZT_sha512internal(void *digest,const void *data,unsigned int len) -{ - ZeroTier::SHA512(digest,data,len); -} +extern "C" void ZT_sha512internal(void *digest,const void *data,unsigned int len) { ZeroTier::SHA512(digest,data,len); } +extern "C" void ZT_sha384internal(void *digest,const void *data,unsigned int len) { ZeroTier::SHA384(digest,data,len); }