mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-02-02 11:04:00 +01:00
Merge pull request #366 from majestrate/bug_fixes
Squash potential future bugs.
This commit is contained in:
commit
0a5f8527b2
7
Base.cpp
7
Base.cpp
|
@ -328,6 +328,13 @@ namespace data
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// from https://stackoverflow.com/questions/1533113/calculate-the-size-to-a-base-64-encoded-message
|
||||||
|
size_t Base64EncodingBufferSize(const size_t input_size) {
|
||||||
|
const size_t code_size = ((input_size * 4) / 3);
|
||||||
|
const size_t padding_size = (input_size % 3) ? (3 - (input_size % 3)) : 0;
|
||||||
|
return code_size + padding_size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
5
Base.h
5
Base.h
|
@ -17,6 +17,11 @@ namespace data
|
||||||
size_t Base32ToByteStream (const char * inBuf, size_t len, uint8_t * outBuf, size_t outLen);
|
size_t Base32ToByteStream (const char * inBuf, size_t len, uint8_t * outBuf, size_t outLen);
|
||||||
size_t ByteStreamToBase32 (const uint8_t * InBuf, size_t len, char * outBuf, size_t outLen);
|
size_t ByteStreamToBase32 (const uint8_t * InBuf, size_t len, char * outBuf, size_t outLen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Compute the size for a buffer to contain encoded base64 given that the size of the input is input_size bytes
|
||||||
|
*/
|
||||||
|
size_t Base64EncodingBufferSize(const size_t input_size);
|
||||||
|
|
||||||
template<int sz>
|
template<int sz>
|
||||||
class Tag
|
class Tag
|
||||||
{
|
{
|
||||||
|
|
27
Identity.cpp
27
Identity.cpp
|
@ -22,6 +22,10 @@ namespace data
|
||||||
|
|
||||||
size_t Identity::FromBuffer (const uint8_t * buf, size_t len)
|
size_t Identity::FromBuffer (const uint8_t * buf, size_t len)
|
||||||
{
|
{
|
||||||
|
if ( len < DEFAULT_IDENTITY_SIZE ) {
|
||||||
|
// buffer too small, don't overflow
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
memcpy (publicKey, buf, DEFAULT_IDENTITY_SIZE);
|
memcpy (publicKey, buf, DEFAULT_IDENTITY_SIZE);
|
||||||
return DEFAULT_IDENTITY_SIZE;
|
return DEFAULT_IDENTITY_SIZE;
|
||||||
}
|
}
|
||||||
|
@ -229,25 +233,34 @@ namespace data
|
||||||
|
|
||||||
size_t IdentityEx::ToBuffer (uint8_t * buf, size_t len) const
|
size_t IdentityEx::ToBuffer (uint8_t * buf, size_t len) const
|
||||||
{
|
{
|
||||||
|
const size_t fullLen = GetFullLen();
|
||||||
|
if (fullLen > len) {
|
||||||
|
// buffer is too small and may overflow somewhere else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
memcpy (buf, &m_StandardIdentity, DEFAULT_IDENTITY_SIZE);
|
memcpy (buf, &m_StandardIdentity, DEFAULT_IDENTITY_SIZE);
|
||||||
if (m_ExtendedLen > 0 && m_ExtendedBuffer)
|
if (m_ExtendedLen > 0 && m_ExtendedBuffer)
|
||||||
memcpy (buf + DEFAULT_IDENTITY_SIZE, m_ExtendedBuffer, m_ExtendedLen);
|
memcpy (buf + DEFAULT_IDENTITY_SIZE, m_ExtendedBuffer, m_ExtendedLen);
|
||||||
return GetFullLen ();
|
return fullLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t IdentityEx::FromBase64(const std::string& s)
|
size_t IdentityEx::FromBase64(const std::string& s)
|
||||||
{
|
{
|
||||||
uint8_t buf[1024];
|
const size_t slen = s.length();
|
||||||
auto len = Base64ToByteStream (s.c_str(), s.length(), buf, 1024);
|
const size_t bufLen = Base64EncodingBufferSize(slen);
|
||||||
|
uint8_t buf[bufLen];
|
||||||
|
const size_t len = Base64ToByteStream (s.c_str(), slen, buf, bufLen);
|
||||||
return FromBuffer (buf, len);
|
return FromBuffer (buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string IdentityEx::ToBase64 () const
|
std::string IdentityEx::ToBase64 () const
|
||||||
{
|
{
|
||||||
uint8_t buf[1024];
|
const size_t bufLen = GetFullLen();
|
||||||
char str[1536];
|
const size_t strLen = Base64EncodingBufferSize(bufLen);
|
||||||
size_t l = ToBuffer (buf, 1024);
|
uint8_t buf[bufLen];
|
||||||
size_t l1 = i2p::data::ByteStreamToBase64 (buf, l, str, 1536);
|
char str[strLen];
|
||||||
|
size_t l = ToBuffer (buf, bufLen);
|
||||||
|
size_t l1 = i2p::data::ByteStreamToBase64 (buf, l, str, strLen);
|
||||||
str[l1] = 0;
|
str[l1] = 0;
|
||||||
return std::string (str);
|
return std::string (str);
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,6 +134,7 @@ namespace transport
|
||||||
|
|
||||||
void NTCPSession::HandlePhase1Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
void NTCPSession::HandlePhase1Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
||||||
{
|
{
|
||||||
|
(void) bytes_transferred;
|
||||||
if (ecode)
|
if (ecode)
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "NTCP: couldn't send Phase 1 message: ", ecode.message ());
|
LogPrint (eLogInfo, "NTCP: couldn't send Phase 1 message: ", ecode.message ());
|
||||||
|
@ -150,6 +151,7 @@ namespace transport
|
||||||
|
|
||||||
void NTCPSession::HandlePhase1Received (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
void NTCPSession::HandlePhase1Received (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
||||||
{
|
{
|
||||||
|
(void) bytes_transferred;
|
||||||
if (ecode)
|
if (ecode)
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "NTCP: phase 1 read error: ", ecode.message ());
|
LogPrint (eLogInfo, "NTCP: phase 1 read error: ", ecode.message ());
|
||||||
|
@ -205,6 +207,7 @@ namespace transport
|
||||||
|
|
||||||
void NTCPSession::HandlePhase2Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsB)
|
void NTCPSession::HandlePhase2Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsB)
|
||||||
{
|
{
|
||||||
|
(void) bytes_transferred;
|
||||||
if (ecode)
|
if (ecode)
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "NTCP: Couldn't send Phase 2 message: ", ecode.message ());
|
LogPrint (eLogInfo, "NTCP: Couldn't send Phase 2 message: ", ecode.message ());
|
||||||
|
@ -221,6 +224,7 @@ namespace transport
|
||||||
|
|
||||||
void NTCPSession::HandlePhase2Received (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
void NTCPSession::HandlePhase2Received (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
||||||
{
|
{
|
||||||
|
(void) bytes_transferred;
|
||||||
if (ecode)
|
if (ecode)
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "NTCP: Phase 2 read error: ", ecode.message (), ". Wrong ident assumed");
|
LogPrint (eLogInfo, "NTCP: Phase 2 read error: ", ecode.message (), ". Wrong ident assumed");
|
||||||
|
@ -277,7 +281,8 @@ namespace transport
|
||||||
if (paddingSize > 0)
|
if (paddingSize > 0)
|
||||||
{
|
{
|
||||||
paddingSize = 16 - paddingSize;
|
paddingSize = 16 - paddingSize;
|
||||||
// TODO: fill padding with random data
|
// fill padding with random data
|
||||||
|
RAND_bytes(buf, paddingSize);
|
||||||
buf += paddingSize;
|
buf += paddingSize;
|
||||||
len += paddingSize;
|
len += paddingSize;
|
||||||
}
|
}
|
||||||
|
@ -297,6 +302,7 @@ namespace transport
|
||||||
|
|
||||||
void NTCPSession::HandlePhase3Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsA)
|
void NTCPSession::HandlePhase3Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsA)
|
||||||
{
|
{
|
||||||
|
(void) bytes_transferred;
|
||||||
if (ecode)
|
if (ecode)
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "NTCP: Couldn't send Phase 3 message: ", ecode.message ());
|
LogPrint (eLogInfo, "NTCP: Couldn't send Phase 3 message: ", ecode.message ());
|
||||||
|
@ -420,6 +426,7 @@ namespace transport
|
||||||
|
|
||||||
void NTCPSession::HandlePhase4Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
void NTCPSession::HandlePhase4Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred)
|
||||||
{
|
{
|
||||||
|
(void) bytes_transferred;
|
||||||
if (ecode)
|
if (ecode)
|
||||||
{
|
{
|
||||||
LogPrint (eLogWarning, "NTCP: Couldn't send Phase 4 message: ", ecode.message ());
|
LogPrint (eLogWarning, "NTCP: Couldn't send Phase 4 message: ", ecode.message ());
|
||||||
|
@ -645,8 +652,11 @@ namespace transport
|
||||||
}
|
}
|
||||||
int rem = (len + 6) & 0x0F; // %16
|
int rem = (len + 6) & 0x0F; // %16
|
||||||
int padding = 0;
|
int padding = 0;
|
||||||
if (rem > 0) padding = 16 - rem;
|
if (rem > 0) {
|
||||||
// TODO: fill padding
|
padding = 16 - rem;
|
||||||
|
// fill with random padding
|
||||||
|
RAND_bytes(sendBuffer + len + 2, padding);
|
||||||
|
}
|
||||||
htobe32buf (sendBuffer + len + 2 + padding, adler32 (adler32 (0, Z_NULL, 0), sendBuffer, len + 2+ padding));
|
htobe32buf (sendBuffer + len + 2 + padding, adler32 (adler32 (0, Z_NULL, 0), sendBuffer, len + 2+ padding));
|
||||||
|
|
||||||
int l = len + padding + 6;
|
int l = len + padding + 6;
|
||||||
|
@ -667,6 +677,7 @@ namespace transport
|
||||||
|
|
||||||
void NTCPSession::HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred, std::vector<std::shared_ptr<I2NPMessage> > msgs)
|
void NTCPSession::HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred, std::vector<std::shared_ptr<I2NPMessage> > msgs)
|
||||||
{
|
{
|
||||||
|
(void) msgs;
|
||||||
m_IsSending = false;
|
m_IsSending = false;
|
||||||
if (ecode)
|
if (ecode)
|
||||||
{
|
{
|
||||||
|
|
13
SAM.cpp
13
SAM.cpp
|
@ -631,10 +631,15 @@ namespace client
|
||||||
m_SocketType = eSAMSocketTypeStream;
|
m_SocketType = eSAMSocketTypeStream;
|
||||||
if (!m_IsSilent)
|
if (!m_IsSilent)
|
||||||
{
|
{
|
||||||
// send remote peer address
|
// get remote peer address
|
||||||
uint8_t ident[1024];
|
auto ident_ptr = stream->GetRemoteIdentity();
|
||||||
size_t l = stream->GetRemoteIdentity ()->ToBuffer (ident, 1024);
|
const size_t ident_len = ident_ptr->GetFullLen();
|
||||||
size_t l1 = i2p::data::ByteStreamToBase64 (ident, l, (char *)m_StreamBuffer, SAM_SOCKET_BUFFER_SIZE);
|
uint8_t* ident = new uint8_t[ident_len];
|
||||||
|
|
||||||
|
// send remote peer address as base64
|
||||||
|
const size_t l = ident_ptr->ToBuffer (ident, ident_len);
|
||||||
|
const size_t l1 = i2p::data::ByteStreamToBase64 (ident, l, (char *)m_StreamBuffer, SAM_SOCKET_BUFFER_SIZE);
|
||||||
|
delete[] ident;
|
||||||
m_StreamBuffer[l1] = '\n';
|
m_StreamBuffer[l1] = '\n';
|
||||||
HandleI2PReceive (boost::system::error_code (), l1 +1); // we send identity like it has been received from stream
|
HandleI2PReceive (boost::system::error_code (), l1 +1); // we send identity like it has been received from stream
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue