|
|
|
@ -19,6 +19,9 @@ namespace client
|
|
|
|
|
m_Keys (keys), m_IsPublic (isPublic), m_PublishReplyToken (0),
|
|
|
|
|
m_DatagramDestination (nullptr), m_PublishConfirmationTimer (m_Service), m_CleanupTimer (m_Service)
|
|
|
|
|
{
|
|
|
|
|
if (m_IsPublic)
|
|
|
|
|
PersistTemporaryKeys ();
|
|
|
|
|
else
|
|
|
|
|
i2p::crypto::GenerateElGamalKeyPair(m_EncryptionPrivateKey, m_EncryptionPublicKey);
|
|
|
|
|
int inboundTunnelLen = DEFAULT_INBOUND_TUNNEL_LENGTH;
|
|
|
|
|
int outboundTunnelLen = DEFAULT_OUTBOUND_TUNNEL_LENGTH;
|
|
|
|
@ -670,5 +673,33 @@ namespace client
|
|
|
|
|
it++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientDestination::PersistTemporaryKeys ()
|
|
|
|
|
{
|
|
|
|
|
auto path = i2p::util::filesystem::GetDefaultDataDir() / "destinations";
|
|
|
|
|
auto filename = path / (GetIdentHash ().ToBase32 () + ".dat");
|
|
|
|
|
std::ifstream f(filename.string (), std::ifstream::binary);
|
|
|
|
|
if (f)
|
|
|
|
|
{
|
|
|
|
|
f.read ((char *)m_EncryptionPublicKey, 256);
|
|
|
|
|
f.read ((char *)m_EncryptionPrivateKey, 256);
|
|
|
|
|
}
|
|
|
|
|
if (!f)
|
|
|
|
|
{
|
|
|
|
|
LogPrint (eLogInfo, "Creating new temporary keys for address ", GetIdentHash ().ToBase32 ());
|
|
|
|
|
i2p::crypto::GenerateElGamalKeyPair(m_EncryptionPrivateKey, m_EncryptionPublicKey);
|
|
|
|
|
if (!boost::filesystem::exists (path))
|
|
|
|
|
{
|
|
|
|
|
if (!boost::filesystem::create_directory (path))
|
|
|
|
|
LogPrint (eLogError, "Failed to create destinations directory");
|
|
|
|
|
}
|
|
|
|
|
std::ofstream f1 (filename.string (), std::ofstream::binary | std::ofstream::out);
|
|
|
|
|
if (f1)
|
|
|
|
|
{
|
|
|
|
|
f1.write ((char *)m_EncryptionPublicKey, 256);
|
|
|
|
|
f1.write ((char *)m_EncryptionPrivateKey, 256);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|