mirror of https://github.com/aria2/aria2
Use SocketBuffer::pushBytes instead of pushStr in MSEHandshake.
parent
5e2a8b2d4c
commit
4dad3ded15
|
@ -56,6 +56,7 @@
|
||||||
#include "Option.h"
|
#include "Option.h"
|
||||||
#include "fmt.h"
|
#include "fmt.h"
|
||||||
#include "bittorrent_helper.h"
|
#include "bittorrent_helper.h"
|
||||||
|
#include "array_fun.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -128,14 +129,15 @@ void MSEHandshake::sendPublicKey()
|
||||||
{
|
{
|
||||||
A2_LOG_DEBUG(fmt("CUID#%lld - Sending public key.",
|
A2_LOG_DEBUG(fmt("CUID#%lld - Sending public key.",
|
||||||
cuid_));
|
cuid_));
|
||||||
unsigned char buffer[KEY_LENGTH+MAX_PAD_LENGTH];
|
unsigned char* buf = new unsigned char[KEY_LENGTH+MAX_PAD_LENGTH];
|
||||||
dh_->getPublicKey(buffer, KEY_LENGTH);
|
array_ptr<unsigned char> bufp(buf);
|
||||||
|
dh_->getPublicKey(buf, KEY_LENGTH);
|
||||||
|
|
||||||
size_t padLength =
|
size_t padLength =
|
||||||
SimpleRandomizer::getInstance()->getRandomNumber(MAX_PAD_LENGTH+1);
|
SimpleRandomizer::getInstance()->getRandomNumber(MAX_PAD_LENGTH+1);
|
||||||
dh_->generateNonce(buffer+KEY_LENGTH, padLength);
|
dh_->generateNonce(buf+KEY_LENGTH, padLength);
|
||||||
socketBuffer_.pushStr(std::string(&buffer[0],
|
socketBuffer_.pushBytes(buf, KEY_LENGTH+padLength);
|
||||||
&buffer[KEY_LENGTH+padLength]));
|
bufp.reset(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MSEHandshake::read()
|
void MSEHandshake::read()
|
||||||
|
@ -222,17 +224,11 @@ void MSEHandshake::initCipher(const unsigned char* infoHash)
|
||||||
|
|
||||||
void MSEHandshake::encryptAndSendData(const unsigned char* data, size_t length)
|
void MSEHandshake::encryptAndSendData(const unsigned char* data, size_t length)
|
||||||
{
|
{
|
||||||
unsigned char temp[4096];
|
unsigned char* buf = new unsigned char[length];
|
||||||
const unsigned char* dptr = data;
|
array_ptr<unsigned char> bufp(buf);
|
||||||
size_t s;
|
encryptor_->encrypt(buf, length, data, length);
|
||||||
size_t r = length;
|
socketBuffer_.pushBytes(buf, length);
|
||||||
while(r > 0) {
|
bufp.reset(0);
|
||||||
s = std::min(r, sizeof(temp));
|
|
||||||
encryptor_->encrypt(temp, s, dptr, s);
|
|
||||||
socketBuffer_.pushStr(std::string(&temp[0], &temp[s]));
|
|
||||||
dptr += s;
|
|
||||||
r -= s;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MSEHandshake::createReq1Hash(unsigned char* md) const
|
void MSEHandshake::createReq1Hash(unsigned char* md) const
|
||||||
|
@ -277,50 +273,52 @@ uint16_t MSEHandshake::decodeLength16(const unsigned char* buffer)
|
||||||
void MSEHandshake::sendInitiatorStep2()
|
void MSEHandshake::sendInitiatorStep2()
|
||||||
{
|
{
|
||||||
A2_LOG_DEBUG(fmt("CUID#%lld - Sending negotiation step2.", cuid_));
|
A2_LOG_DEBUG(fmt("CUID#%lld - Sending negotiation step2.", cuid_));
|
||||||
unsigned char md[20];
|
// Assuming no exception
|
||||||
|
unsigned char* md = new unsigned char[20];
|
||||||
createReq1Hash(md);
|
createReq1Hash(md);
|
||||||
socketBuffer_.pushStr(std::string(&md[0], &md[sizeof(md)]));
|
socketBuffer_.pushBytes(md, 20);
|
||||||
|
// Assuming no exception
|
||||||
|
md = new unsigned char[20];
|
||||||
createReq23Hash(md, infoHash_);
|
createReq23Hash(md, infoHash_);
|
||||||
socketBuffer_.pushStr(std::string(&md[0], &md[sizeof(md)]));
|
socketBuffer_.pushBytes(md, 20);
|
||||||
|
|
||||||
// buffer is filled in this order:
|
// buffer is filled in this order:
|
||||||
// VC(VC_LENGTH bytes),
|
// VC(VC_LENGTH bytes),
|
||||||
// crypto_provide(CRYPTO_BITFIELD_LENGTH bytes),
|
// crypto_provide(CRYPTO_BITFIELD_LENGTH bytes),
|
||||||
// len(padC)(2bytes),
|
// len(padC)(2 bytes),
|
||||||
// padC(len(padC)bytes <= MAX_PAD_LENGTH),
|
// padC(len(padC) bytes <= MAX_PAD_LENGTH),
|
||||||
// len(IA)(2bytes)
|
// len(IA)(2 bytes)
|
||||||
unsigned char buffer[VC_LENGTH+CRYPTO_BITFIELD_LENGTH+2+MAX_PAD_LENGTH+2];
|
unsigned char buffer[40+VC_LENGTH+CRYPTO_BITFIELD_LENGTH+2+MAX_PAD_LENGTH+2];
|
||||||
|
unsigned char* ptr = buffer;
|
||||||
// VC
|
// VC
|
||||||
memcpy(buffer, VC, sizeof(VC));
|
memcpy(ptr, VC, sizeof(VC));
|
||||||
|
ptr += sizeof(VC);
|
||||||
// crypto_provide
|
// crypto_provide
|
||||||
unsigned char cryptoProvide[CRYPTO_BITFIELD_LENGTH];
|
memset(ptr, 0, CRYPTO_BITFIELD_LENGTH);
|
||||||
memset(cryptoProvide, 0, sizeof(cryptoProvide));
|
|
||||||
if(option_->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) {
|
if(option_->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) {
|
||||||
cryptoProvide[3] = CRYPTO_PLAIN_TEXT;
|
ptr[3] = CRYPTO_PLAIN_TEXT;
|
||||||
}
|
}
|
||||||
cryptoProvide[3] |= CRYPTO_ARC4;
|
ptr[3] |= CRYPTO_ARC4;
|
||||||
memcpy(buffer+VC_LENGTH, cryptoProvide, sizeof(cryptoProvide));
|
ptr += CRYPTO_BITFIELD_LENGTH;
|
||||||
|
|
||||||
// len(padC)
|
// len(padC)
|
||||||
uint16_t padCLength = SimpleRandomizer::getInstance()->getRandomNumber(MAX_PAD_LENGTH+1);
|
uint16_t padCLength =
|
||||||
|
SimpleRandomizer::getInstance()->getRandomNumber(MAX_PAD_LENGTH+1);
|
||||||
{
|
{
|
||||||
uint16_t padCLengthBE = htons(padCLength);
|
uint16_t padCLengthBE = htons(padCLength);
|
||||||
memcpy(buffer+VC_LENGTH+CRYPTO_BITFIELD_LENGTH, &padCLengthBE,
|
memcpy(ptr, &padCLengthBE, sizeof(padCLengthBE));
|
||||||
sizeof(padCLengthBE));
|
|
||||||
}
|
}
|
||||||
|
ptr += 2;
|
||||||
// padC
|
// padC
|
||||||
memset(buffer+VC_LENGTH+CRYPTO_BITFIELD_LENGTH+2, 0, padCLength);
|
memset(ptr, 0, padCLength);
|
||||||
|
ptr += padCLength;
|
||||||
// len(IA)
|
// len(IA)
|
||||||
// currently, IA is zero-length.
|
// currently, IA is zero-length.
|
||||||
uint16_t iaLength = 0;
|
uint16_t iaLength = 0;
|
||||||
{
|
{
|
||||||
uint16_t iaLengthBE = htons(iaLength);
|
uint16_t iaLengthBE = htons(iaLength);
|
||||||
memcpy(buffer+VC_LENGTH+CRYPTO_BITFIELD_LENGTH+2+padCLength,
|
memcpy(ptr, &iaLengthBE, sizeof(iaLengthBE));
|
||||||
&iaLengthBE,sizeof(iaLengthBE));
|
|
||||||
}
|
}
|
||||||
encryptAndSendData(buffer,
|
ptr += 2;
|
||||||
VC_LENGTH+CRYPTO_BITFIELD_LENGTH+2+padCLength+2);
|
encryptAndSendData(buffer, ptr-buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function reads exactly until the end of VC marker is reached.
|
// This function reads exactly until the end of VC marker is reached.
|
||||||
|
|
|
@ -95,6 +95,11 @@ public:
|
||||||
{
|
{
|
||||||
return array_;
|
return array_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reset(T* array)
|
||||||
|
{
|
||||||
|
array_ = array;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, size_t N>
|
template<typename T, size_t N>
|
||||||
|
|
Loading…
Reference in New Issue