mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 04:04:16 +00:00
elimimated cast to ClearText
This commit is contained in:
parent
ac17f116be
commit
37a374000c
@ -284,45 +284,8 @@ namespace i2p
|
|||||||
FillI2NPMessageHeader (m, eI2NPDatabaseStore);
|
FillI2NPMessageHeader (m, eI2NPDatabaseStore);
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
I2NPBuildRequestRecordClearText CreateBuildRequestRecord (
|
|
||||||
const uint8_t * ourIdent, uint32_t receiveTunnelID,
|
|
||||||
const uint8_t * nextIdent, uint32_t nextTunnelID,
|
|
||||||
const uint8_t * layerKey,const uint8_t * ivKey,
|
|
||||||
const uint8_t * replyKey, const uint8_t * replyIV, uint32_t nextMessageID,
|
|
||||||
bool isGateway, bool isEndpoint)
|
|
||||||
{
|
|
||||||
I2NPBuildRequestRecordClearText clearText;
|
|
||||||
clearText.receiveTunnel = htobe32 (receiveTunnelID);
|
|
||||||
clearText.nextTunnel = htobe32(nextTunnelID);
|
|
||||||
memcpy (clearText.layerKey, layerKey, 32);
|
|
||||||
memcpy (clearText.ivKey, ivKey, 32);
|
|
||||||
memcpy (clearText.replyKey, replyKey, 32);
|
|
||||||
memcpy (clearText.replyIV, replyIV, 16);
|
|
||||||
clearText.flag = 0;
|
|
||||||
if (isGateway) clearText.flag |= 0x80;
|
|
||||||
if (isEndpoint) clearText.flag |= 0x40;
|
|
||||||
memcpy (clearText.ourIdent, ourIdent, 32);
|
|
||||||
memcpy (clearText.nextIdent, nextIdent, 32);
|
|
||||||
clearText.requestTime = htobe32 (i2p::util::GetHoursSinceEpoch ());
|
|
||||||
clearText.nextMessageID = htobe32(nextMessageID);
|
|
||||||
return clearText;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EncryptBuildRequestRecord (const i2p::data::RouterInfo& router,
|
|
||||||
const I2NPBuildRequestRecordClearText& clearText, uint8_t * record)
|
|
||||||
{
|
|
||||||
router.GetElGamalEncryption ()->Encrypt ((uint8_t *)&clearText, sizeof(clearText), record + BUILD_REQUEST_RECORD_ENCRYPTED_OFFSET);
|
|
||||||
memcpy (record + BUILD_REQUEST_RECORD_TO_PEER_OFFSET, (const uint8_t *)router.GetIdentHash (), 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EncryptBuildRequestRecord (const i2p::data::RouterInfo& router, const uint8_t * clearText, uint8_t * record)
|
|
||||||
{
|
|
||||||
router.GetElGamalEncryption ()->Encrypt (clearText, BUILD_REQUEST_RECORD_CLEAR_TEXT_SIZE, record + BUILD_REQUEST_RECORD_ENCRYPTED_OFFSET);
|
|
||||||
memcpy (record + BUILD_REQUEST_RECORD_TO_PEER_OFFSET, (const uint8_t *)router.GetIdentHash (), 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HandleBuildRequestRecords (int num, uint8_t * records, I2NPBuildRequestRecordClearText& clearText)
|
bool HandleBuildRequestRecords (int num, uint8_t * records, uint8_t * clearText)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < num; i++)
|
for (int i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
@ -331,16 +294,19 @@ namespace i2p
|
|||||||
{
|
{
|
||||||
LogPrint ("Record ",i," is ours");
|
LogPrint ("Record ",i," is ours");
|
||||||
|
|
||||||
i2p::crypto::ElGamalDecrypt (i2p::context.GetEncryptionPrivateKey (), record + BUILD_REQUEST_RECORD_ENCRYPTED_OFFSET, (uint8_t *)&clearText);
|
i2p::crypto::ElGamalDecrypt (i2p::context.GetEncryptionPrivateKey (), record + BUILD_REQUEST_RECORD_ENCRYPTED_OFFSET, clearText);
|
||||||
// replace record to reply
|
// replace record to reply
|
||||||
if (i2p::context.AcceptsTunnels ())
|
if (i2p::context.AcceptsTunnels ())
|
||||||
{
|
{
|
||||||
i2p::tunnel::TransitTunnel * transitTunnel =
|
i2p::tunnel::TransitTunnel * transitTunnel =
|
||||||
i2p::tunnel::CreateTransitTunnel (
|
i2p::tunnel::CreateTransitTunnel (
|
||||||
be32toh (clearText.receiveTunnel),
|
bufbe32toh (clearText + BUILD_REQUEST_RECORD_RECEIVE_TUNNEL_OFFSET),
|
||||||
clearText.nextIdent, be32toh (clearText.nextTunnel),
|
clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
||||||
clearText.layerKey, clearText.ivKey,
|
bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET),
|
||||||
clearText.flag & 0x80, clearText.flag & 0x40);
|
clearText + BUILD_REQUEST_RECORD_LAYER_KEY_OFFSET,
|
||||||
|
clearText + BUILD_REQUEST_RECORD_IV_KEY_OFFSET,
|
||||||
|
clearText[BUILD_REQUEST_RECORD_FLAG_OFFSET] & 0x80,
|
||||||
|
clearText[BUILD_REQUEST_RECORD_FLAG_OFFSET ] & 0x40);
|
||||||
i2p::tunnel::tunnels.AddTransitTunnel (transitTunnel);
|
i2p::tunnel::tunnels.AddTransitTunnel (transitTunnel);
|
||||||
record[BUILD_RESPONSE_RECORD_RET_OFFSET] = 0;
|
record[BUILD_RESPONSE_RECORD_RET_OFFSET] = 0;
|
||||||
}
|
}
|
||||||
@ -354,8 +320,8 @@ namespace i2p
|
|||||||
i2p::crypto::CBCEncryption encryption;
|
i2p::crypto::CBCEncryption encryption;
|
||||||
for (int j = 0; j < num; j++)
|
for (int j = 0; j < num; j++)
|
||||||
{
|
{
|
||||||
encryption.SetKey (clearText.replyKey);
|
encryption.SetKey (clearText + BUILD_REQUEST_RECORD_REPLY_KEY_OFFSET);
|
||||||
encryption.SetIV (clearText.replyIV);
|
encryption.SetIV (clearText + BUILD_REQUEST_RECORD_REPLY_IV_OFFSET);
|
||||||
uint8_t * reply = records + j*TUNNEL_BUILD_RECORD_SIZE;
|
uint8_t * reply = records + j*TUNNEL_BUILD_RECORD_SIZE;
|
||||||
encryption.Encrypt(reply, TUNNEL_BUILD_RECORD_SIZE, reply);
|
encryption.Encrypt(reply, TUNNEL_BUILD_RECORD_SIZE, reply);
|
||||||
}
|
}
|
||||||
@ -389,40 +355,42 @@ namespace i2p
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
I2NPBuildRequestRecordClearText clearText;
|
uint8_t clearText[BUILD_REQUEST_RECORD_CLEAR_TEXT_SIZE];
|
||||||
if (HandleBuildRequestRecords (num, buf + 1, clearText))
|
if (HandleBuildRequestRecords (num, buf + 1, clearText))
|
||||||
{
|
{
|
||||||
if (clearText.flag & 0x40) // we are endpoint of outboud tunnel
|
if (clearText[BUILD_REQUEST_RECORD_FLAG_OFFSET] & 0x40) // we are endpoint of outboud tunnel
|
||||||
{
|
{
|
||||||
// so we send it to reply tunnel
|
// so we send it to reply tunnel
|
||||||
transports.SendMessage (clearText.nextIdent,
|
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
||||||
CreateTunnelGatewayMsg (be32toh (clearText.nextTunnel),
|
CreateTunnelGatewayMsg (bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET),
|
||||||
eI2NPVariableTunnelBuildReply, buf, len,
|
eI2NPVariableTunnelBuildReply, buf, len,
|
||||||
be32toh (clearText.nextMessageID)));
|
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
transports.SendMessage (clearText.nextIdent,
|
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
||||||
CreateI2NPMessage (eI2NPVariableTunnelBuild, buf, len, be32toh (clearText.nextMessageID)));
|
CreateI2NPMessage (eI2NPVariableTunnelBuild, buf, len,
|
||||||
|
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleTunnelBuildMsg (uint8_t * buf, size_t len)
|
void HandleTunnelBuildMsg (uint8_t * buf, size_t len)
|
||||||
{
|
{
|
||||||
I2NPBuildRequestRecordClearText clearText;
|
uint8_t clearText[BUILD_REQUEST_RECORD_CLEAR_TEXT_SIZE];
|
||||||
if (HandleBuildRequestRecords (NUM_TUNNEL_BUILD_RECORDS, buf, clearText))
|
if (HandleBuildRequestRecords (NUM_TUNNEL_BUILD_RECORDS, buf, clearText))
|
||||||
{
|
{
|
||||||
if (clearText.flag & 0x40) // we are endpoint of outbound tunnel
|
if (clearText[BUILD_REQUEST_RECORD_FLAG_OFFSET] & 0x40) // we are endpoint of outbound tunnel
|
||||||
{
|
{
|
||||||
// so we send it to reply tunnel
|
// so we send it to reply tunnel
|
||||||
transports.SendMessage (clearText.nextIdent,
|
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
||||||
CreateTunnelGatewayMsg (be32toh (clearText.nextTunnel),
|
CreateTunnelGatewayMsg (bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET),
|
||||||
eI2NPTunnelBuildReply, buf, len,
|
eI2NPTunnelBuildReply, buf, len,
|
||||||
be32toh (clearText.nextMessageID)));
|
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
transports.SendMessage (clearText.nextIdent,
|
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
||||||
CreateI2NPMessage (eI2NPTunnelBuild, buf, len, be32toh (clearText.nextMessageID)));
|
CreateI2NPMessage (eI2NPTunnelBuild, buf, len,
|
||||||
|
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,26 +68,6 @@ namespace i2p
|
|||||||
const size_t BUILD_RESPONSE_RECORD_PADDING_OFFSET = 32;
|
const size_t BUILD_RESPONSE_RECORD_PADDING_OFFSET = 32;
|
||||||
const size_t BUILD_RESPONSE_RECORD_PADDING_SIZE = 495;
|
const size_t BUILD_RESPONSE_RECORD_PADDING_SIZE = 495;
|
||||||
const size_t BUILD_RESPONSE_RECORD_RET_OFFSET = BUILD_RESPONSE_RECORD_PADDING_OFFSET + BUILD_RESPONSE_RECORD_PADDING_SIZE;
|
const size_t BUILD_RESPONSE_RECORD_RET_OFFSET = BUILD_RESPONSE_RECORD_PADDING_OFFSET + BUILD_RESPONSE_RECORD_PADDING_SIZE;
|
||||||
|
|
||||||
#pragma pack (1)
|
|
||||||
|
|
||||||
struct I2NPBuildRequestRecordClearText
|
|
||||||
{
|
|
||||||
uint32_t receiveTunnel;
|
|
||||||
uint8_t ourIdent[32];
|
|
||||||
uint32_t nextTunnel;
|
|
||||||
uint8_t nextIdent[32];
|
|
||||||
uint8_t layerKey[32];
|
|
||||||
uint8_t ivKey[32];
|
|
||||||
uint8_t replyKey[32];
|
|
||||||
uint8_t replyIV[16];
|
|
||||||
uint8_t flag;
|
|
||||||
uint32_t requestTime;
|
|
||||||
uint32_t nextMessageID;
|
|
||||||
uint8_t filler[29];
|
|
||||||
};
|
|
||||||
|
|
||||||
#pragma pack ()
|
|
||||||
|
|
||||||
enum I2NPMessageType
|
enum I2NPMessageType
|
||||||
{
|
{
|
||||||
@ -220,18 +200,8 @@ namespace tunnel
|
|||||||
|
|
||||||
I2NPMessage * CreateDatabaseStoreMsg (const i2p::data::RouterInfo * router = nullptr);
|
I2NPMessage * CreateDatabaseStoreMsg (const i2p::data::RouterInfo * router = nullptr);
|
||||||
I2NPMessage * CreateDatabaseStoreMsg (const i2p::data::LeaseSet * leaseSet, uint32_t replyToken = 0);
|
I2NPMessage * CreateDatabaseStoreMsg (const i2p::data::LeaseSet * leaseSet, uint32_t replyToken = 0);
|
||||||
|
|
||||||
I2NPBuildRequestRecordClearText CreateBuildRequestRecord (
|
bool HandleBuildRequestRecords (int num, uint8_t * records, uint8_t * clearText);
|
||||||
const uint8_t * ourIdent, uint32_t receiveTunnelID,
|
|
||||||
const uint8_t * nextIdent, uint32_t nextTunnelID,
|
|
||||||
const uint8_t * layerKey,const uint8_t * ivKey,
|
|
||||||
const uint8_t * replyKey, const uint8_t * replyIV, uint32_t nextMessageID,
|
|
||||||
bool isGateway, bool isEndpoint);
|
|
||||||
void EncryptBuildRequestRecord (const i2p::data::RouterInfo& router,
|
|
||||||
const I2NPBuildRequestRecordClearText& clearText, uint8_t * record);
|
|
||||||
void EncryptBuildRequestRecord (const i2p::data::RouterInfo& router, const uint8_t * clearText, uint8_t * record);
|
|
||||||
|
|
||||||
bool HandleBuildRequestRecords (int num, uint8_t * records, I2NPBuildRequestRecordClearText& clearText);
|
|
||||||
void HandleVariableTunnelBuildMsg (uint32_t replyMsgID, uint8_t * buf, size_t len);
|
void HandleVariableTunnelBuildMsg (uint32_t replyMsgID, uint8_t * buf, size_t len);
|
||||||
void HandleVariableTunnelBuildReplyMsg (uint32_t replyMsgID, uint8_t * buf, size_t len);
|
void HandleVariableTunnelBuildReplyMsg (uint32_t replyMsgID, uint8_t * buf, size_t len);
|
||||||
void HandleTunnelBuildMsg (uint8_t * buf, size_t len);
|
void HandleTunnelBuildMsg (uint8_t * buf, size_t len);
|
||||||
|
@ -48,9 +48,8 @@ namespace tunnel
|
|||||||
while (hop)
|
while (hop)
|
||||||
{
|
{
|
||||||
int idx = recordIndicies[i];
|
int idx = recordIndicies[i];
|
||||||
uint8_t clearText[BUILD_REQUEST_RECORD_CLEAR_TEXT_SIZE];
|
hop->CreateBuildRequestRecord (records + idx*TUNNEL_BUILD_RECORD_SIZE,
|
||||||
hop->CreateBuildRequestRecord (clearText, hop->next ? rnd.GenerateWord32 () : replyMsgID); // we set replyMsgID for last hop only
|
hop->next ? rnd.GenerateWord32 () : replyMsgID); // we set replyMsgID for last hop only
|
||||||
EncryptBuildRequestRecord (*hop->router, clearText, records + idx*TUNNEL_BUILD_RECORD_SIZE);
|
|
||||||
hop->recordIndex = idx;
|
hop->recordIndex = idx;
|
||||||
i++;
|
i++;
|
||||||
hop = hop->next;
|
hop = hop->next;
|
||||||
|
@ -86,21 +86,24 @@ namespace tunnel
|
|||||||
|
|
||||||
void CreateBuildRequestRecord (uint8_t * record, uint32_t replyMsgID)
|
void CreateBuildRequestRecord (uint8_t * record, uint32_t replyMsgID)
|
||||||
{
|
{
|
||||||
htobe32buf (record + BUILD_REQUEST_RECORD_RECEIVE_TUNNEL_OFFSET, tunnelID);
|
uint8_t clearText[BUILD_REQUEST_RECORD_CLEAR_TEXT_SIZE];
|
||||||
memcpy (record + BUILD_REQUEST_RECORD_OUR_IDENT_OFFSET, router->GetIdentHash (), 32);
|
htobe32buf (clearText + BUILD_REQUEST_RECORD_RECEIVE_TUNNEL_OFFSET, tunnelID);
|
||||||
htobe32buf (record + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET, nextTunnelID);
|
memcpy (clearText + BUILD_REQUEST_RECORD_OUR_IDENT_OFFSET, router->GetIdentHash (), 32);
|
||||||
memcpy (record + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET, nextRouter->GetIdentHash (), 32);
|
htobe32buf (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET, nextTunnelID);
|
||||||
memcpy (record + BUILD_REQUEST_RECORD_LAYER_KEY_OFFSET, layerKey, 32);
|
memcpy (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET, nextRouter->GetIdentHash (), 32);
|
||||||
memcpy (record + BUILD_REQUEST_RECORD_IV_KEY_OFFSET, ivKey, 32);
|
memcpy (clearText + BUILD_REQUEST_RECORD_LAYER_KEY_OFFSET, layerKey, 32);
|
||||||
memcpy (record + BUILD_REQUEST_RECORD_REPLY_KEY_OFFSET, replyKey, 32);
|
memcpy (clearText + BUILD_REQUEST_RECORD_IV_KEY_OFFSET, ivKey, 32);
|
||||||
memcpy (record + BUILD_REQUEST_RECORD_REPLY_IV_OFFSET, replyIV, 16);
|
memcpy (clearText + BUILD_REQUEST_RECORD_REPLY_KEY_OFFSET, replyKey, 32);
|
||||||
|
memcpy (clearText + BUILD_REQUEST_RECORD_REPLY_IV_OFFSET, replyIV, 16);
|
||||||
uint8_t flag = 0;
|
uint8_t flag = 0;
|
||||||
if (isGateway) flag |= 0x80;
|
if (isGateway) flag |= 0x80;
|
||||||
if (isEndpoint) flag |= 0x40;
|
if (isEndpoint) flag |= 0x40;
|
||||||
record[BUILD_REQUEST_RECORD_FLAG_OFFSET] = flag;
|
clearText[BUILD_REQUEST_RECORD_FLAG_OFFSET] = flag;
|
||||||
htobe32buf (record + BUILD_REQUEST_RECORD_REQUEST_TIME_OFFSET, i2p::util::GetHoursSinceEpoch ());
|
htobe32buf (clearText + BUILD_REQUEST_RECORD_REQUEST_TIME_OFFSET, i2p::util::GetHoursSinceEpoch ());
|
||||||
htobe32buf (record + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET, replyMsgID);
|
htobe32buf (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET, replyMsgID);
|
||||||
// TODO: fill padding
|
// TODO: fill padding
|
||||||
|
router->GetElGamalEncryption ()->Encrypt (clearText, BUILD_REQUEST_RECORD_CLEAR_TEXT_SIZE, record + BUILD_REQUEST_RECORD_ENCRYPTED_OFFSET);
|
||||||
|
memcpy (record + BUILD_REQUEST_RECORD_TO_PEER_OFFSET, (const uint8_t *)router->GetIdentHash (), 16);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user