diff --git a/Identity.cpp b/Identity.cpp index 6d37d34e..0a3eeffb 100644 --- a/Identity.cpp +++ b/Identity.cpp @@ -35,11 +35,12 @@ namespace data } IdentityEx::IdentityEx (): - m_ExtendedLen (0), m_ExtendedBuffer (nullptr) + m_IsVerifierCreated (false), m_ExtendedLen (0), m_ExtendedBuffer (nullptr) { } - IdentityEx::IdentityEx(const uint8_t * publicKey, const uint8_t * signingKey, SigningKeyType type) + IdentityEx::IdentityEx(const uint8_t * publicKey, const uint8_t * signingKey, SigningKeyType type): + m_IsVerifierCreated (false) { memcpy (m_StandardIdentity.publicKey, publicKey, sizeof (m_StandardIdentity.publicKey)); if (type != SIGNING_KEY_TYPE_DSA_SHA1) @@ -135,19 +136,19 @@ namespace data } IdentityEx::IdentityEx (const uint8_t * buf, size_t len): - m_ExtendedLen (0), m_ExtendedBuffer (nullptr) + m_IsVerifierCreated (false), m_ExtendedLen (0), m_ExtendedBuffer (nullptr) { FromBuffer (buf, len); } IdentityEx::IdentityEx (const IdentityEx& other): - m_ExtendedLen (0), m_ExtendedBuffer (nullptr) + m_IsVerifierCreated (false), m_ExtendedLen (0), m_ExtendedBuffer (nullptr) { *this = other; } IdentityEx::IdentityEx (const Identity& standard): - m_ExtendedLen (0), m_ExtendedBuffer (nullptr) + m_IsVerifierCreated (false), m_ExtendedLen (0), m_ExtendedBuffer (nullptr) { *this = standard; } @@ -173,6 +174,7 @@ namespace data m_ExtendedBuffer = nullptr; m_Verifier = nullptr; + m_IsVerifierCreated = false; return *this; } @@ -187,6 +189,7 @@ namespace data m_ExtendedLen = 0; m_Verifier = nullptr; + m_IsVerifierCreated = false; return *this; } @@ -374,7 +377,13 @@ namespace data void IdentityEx::UpdateVerifier (i2p::crypto::Verifier * verifier) const { if (!m_Verifier || !verifier) - m_Verifier.reset (verifier); + { + auto created = m_IsVerifierCreated.exchange (true); + if (!created) + m_Verifier.reset (verifier); + else + delete verifier; + } else delete verifier; } @@ -457,8 +466,8 @@ namespace data void PrivateKeys::Sign (const uint8_t * buf, int len, uint8_t * signature) const { if (!m_Signer) - CreateSigner(); - m_Signer->Sign (buf, len, signature); + CreateSigner(); + m_Signer->Sign (buf, len, signature); } void PrivateKeys::CreateSigner () const diff --git a/Identity.h b/Identity.h index 8f3e9e9d..49dada48 100644 --- a/Identity.h +++ b/Identity.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "Base.h" #include "Signature.h" @@ -104,6 +105,7 @@ namespace data Identity m_StandardIdentity; IdentHash m_IdentHash; mutable std::unique_ptr m_Verifier; + mutable std::atomic_bool m_IsVerifierCreated; // make sure we don't create twice size_t m_ExtendedLen; uint8_t * m_ExtendedBuffer; };