forked from premiere/premiere-libtorrent
using span in crypto_plugin encrypt/decrypt (#934)
This commit is contained in:
parent
f57612b82d
commit
ddb274751f
|
@ -161,8 +161,8 @@ namespace libtorrent
|
||||||
#if !defined(TORRENT_DISABLE_ENCRYPTION) && !defined(TORRENT_DISABLE_EXTENSIONS)
|
#if !defined(TORRENT_DISABLE_ENCRYPTION) && !defined(TORRENT_DISABLE_EXTENSIONS)
|
||||||
// next_barrier, buffers-to-prepend
|
// next_barrier, buffers-to-prepend
|
||||||
virtual
|
virtual
|
||||||
std::tuple<int, span<boost::asio::const_buffer>>
|
std::tuple<int, span<aux::const_buffer>>
|
||||||
hit_send_barrier(span<boost::asio::mutable_buffer> iovec) override;
|
hit_send_barrier(span<aux::mutable_buffer> iovec) override;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
virtual void get_specific_peer_info(peer_info& p) const override;
|
virtual void get_specific_peer_info(peer_info& p) const override;
|
||||||
|
|
|
@ -59,6 +59,13 @@ namespace libtorrent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: eventually move this file to aux_ or create a new one
|
||||||
|
namespace aux
|
||||||
|
{
|
||||||
|
using mutable_buffer = span<char>;
|
||||||
|
using const_buffer = span<char const>;
|
||||||
|
}
|
||||||
|
|
||||||
// the buffer is allocated once and cannot be resized. The size() may be
|
// the buffer is allocated once and cannot be resized. The size() may be
|
||||||
// larger than requested, in case the underlying allocator over allocated. In
|
// larger than requested, in case the underlying allocator over allocated. In
|
||||||
// order to "grow" an allocation, create a new buffer and initialize it by
|
// order to "grow" an allocation, create a new buffer and initialize it by
|
||||||
|
@ -241,4 +248,3 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // BTORRENT_BUFFER_HPP_INCLUDED
|
#endif // BTORRENT_BUFFER_HPP_INCLUDED
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/config.hpp"
|
#include "libtorrent/config.hpp"
|
||||||
#include "libtorrent/disk_io_job.hpp" // for block_cache_reference
|
#include "libtorrent/disk_io_job.hpp" // for block_cache_reference
|
||||||
#include "libtorrent/debug.hpp"
|
#include "libtorrent/debug.hpp"
|
||||||
|
#include "libtorrent/buffer.hpp"
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
||||||
|
|
||||||
|
@ -110,7 +111,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
void build_mutable_iovec(int bytes, std::vector<boost::asio::mutable_buffer>& vec);
|
void build_mutable_iovec(int bytes, std::vector<aux::mutable_buffer>& vec);
|
||||||
|
|
||||||
~chained_buffer();
|
~chained_buffer();
|
||||||
|
|
||||||
|
@ -142,4 +143,3 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -160,12 +160,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
|
||||||
|
|
||||||
#include <boost/weak_ptr.hpp>
|
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "libtorrent/config.hpp"
|
#include "libtorrent/config.hpp"
|
||||||
#include "libtorrent/buffer.hpp"
|
#include "libtorrent/buffer.hpp"
|
||||||
|
@ -509,8 +503,8 @@ namespace libtorrent
|
||||||
// send buffer, must be owned by the crypto plugin and guaranteed to stay
|
// send buffer, must be owned by the crypto plugin and guaranteed to stay
|
||||||
// alive until the crypto_plugin is destructed or this function is called
|
// alive until the crypto_plugin is destructed or this function is called
|
||||||
// again.
|
// again.
|
||||||
virtual std::tuple<int, span<boost::asio::const_buffer>>
|
virtual std::tuple<int, span<span<char const>>>
|
||||||
encrypt(span<boost::asio::mutable_buffer> /*send_vec*/) = 0;
|
encrypt(span<span<char>> /*send_vec*/) = 0;
|
||||||
|
|
||||||
// decrypt the provided buffers.
|
// decrypt the provided buffers.
|
||||||
// consume is set to the number of bytes which should be trimmed from the
|
// consume is set to the number of bytes which should be trimmed from the
|
||||||
|
@ -521,7 +515,7 @@ namespace libtorrent
|
||||||
//
|
//
|
||||||
// packet_size is set to the minimum number of bytes which must be read to
|
// packet_size is set to the minimum number of bytes which must be read to
|
||||||
// advance the next step of decryption. default is 0
|
// advance the next step of decryption. default is 0
|
||||||
virtual void decrypt(span<boost::asio::mutable_buffer> /*receive_vec*/
|
virtual void decrypt(span<span<char>> /*receive_vec*/
|
||||||
, int& /* consume */, int& /*produce*/, int& /*packet_size*/) = 0;
|
, int& /* consume */, int& /*produce*/, int& /*packet_size*/) = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -529,4 +523,3 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // TORRENT_EXTENSIONS_HPP_INCLUDED
|
#endif // TORRENT_EXTENSIONS_HPP_INCLUDED
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/config.hpp"
|
#include "libtorrent/config.hpp"
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
||||||
#include <boost/asio/buffer.hpp>
|
|
||||||
#include <boost/multiprecision/cpp_int.hpp>
|
#include <boost/multiprecision/cpp_int.hpp>
|
||||||
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
||||||
|
|
||||||
|
@ -47,6 +46,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/extensions.hpp"
|
#include "libtorrent/extensions.hpp"
|
||||||
#include "libtorrent/assert.hpp"
|
#include "libtorrent/assert.hpp"
|
||||||
#include "libtorrent/span.hpp"
|
#include "libtorrent/span.hpp"
|
||||||
|
#include "libtorrent/buffer.hpp"
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
@ -56,7 +56,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
namespace mp = boost::multiprecision;
|
namespace mp = boost::multiprecision;
|
||||||
|
|
||||||
using key_t = mp::number<mp::cpp_int_backend<768, 768, mp::unsigned_magnitude, mp::unchecked, void> >;
|
using key_t = mp::number<mp::cpp_int_backend<768, 768, mp::unsigned_magnitude, mp::unchecked, void>>;
|
||||||
|
|
||||||
// RC4 state from libtomcrypt
|
// RC4 state from libtomcrypt
|
||||||
struct rc4 {
|
struct rc4 {
|
||||||
|
@ -99,8 +99,8 @@ namespace libtorrent
|
||||||
|
|
||||||
struct encryption_handler
|
struct encryption_handler
|
||||||
{
|
{
|
||||||
std::tuple<int, span<boost::asio::const_buffer>>
|
std::tuple<int, span<aux::const_buffer>>
|
||||||
encrypt(span<boost::asio::mutable_buffer> iovec);
|
encrypt(span<aux::mutable_buffer> iovec);
|
||||||
|
|
||||||
int decrypt(crypto_receive_buffer& recv_buffer
|
int decrypt(crypto_receive_buffer& recv_buffer
|
||||||
, std::size_t& bytes_transferred);
|
, std::size_t& bytes_transferred);
|
||||||
|
@ -144,10 +144,10 @@ namespace libtorrent
|
||||||
void set_incoming_key(unsigned char const* key, int len) override;
|
void set_incoming_key(unsigned char const* key, int len) override;
|
||||||
void set_outgoing_key(unsigned char const* key, int len) override;
|
void set_outgoing_key(unsigned char const* key, int len) override;
|
||||||
|
|
||||||
std::tuple<int, span<boost::asio::const_buffer>>
|
std::tuple<int, span<aux::const_buffer>>
|
||||||
encrypt(span<boost::asio::mutable_buffer> buf) override;
|
encrypt(span<aux::mutable_buffer> buf) override;
|
||||||
|
|
||||||
void decrypt(span<boost::asio::mutable_buffer> buf
|
void decrypt(span<aux::mutable_buffer> buf
|
||||||
, int& consume
|
, int& consume
|
||||||
, int& produce
|
, int& produce
|
||||||
, int& packet_size) override;
|
, int& packet_size) override;
|
||||||
|
@ -165,4 +165,3 @@ namespace libtorrent
|
||||||
|
|
||||||
#endif // TORRENT_PE_CRYPTO_HPP_INCLUDED
|
#endif // TORRENT_PE_CRYPTO_HPP_INCLUDED
|
||||||
#endif // TORRENT_DISABLE_ENCRYPTION
|
#endif // TORRENT_DISABLE_ENCRYPTION
|
||||||
|
|
||||||
|
|
|
@ -749,11 +749,11 @@ namespace libtorrent
|
||||||
void send_piece_suggestions(int num);
|
void send_piece_suggestions(int num);
|
||||||
|
|
||||||
virtual
|
virtual
|
||||||
std::tuple<int, span<boost::asio::const_buffer>>
|
std::tuple<int, span<aux::const_buffer>>
|
||||||
hit_send_barrier(span<boost::asio::mutable_buffer> /* iovec */)
|
hit_send_barrier(span<aux::mutable_buffer> /* iovec */)
|
||||||
{
|
{
|
||||||
return std::make_tuple(INT_MAX
|
return std::make_tuple(INT_MAX
|
||||||
, span<boost::asio::const_buffer>());
|
, span<aux::const_buffer>());
|
||||||
}
|
}
|
||||||
|
|
||||||
void attach_to_torrent(sha1_hash const& ih);
|
void attach_to_torrent(sha1_hash const& ih);
|
||||||
|
|
|
@ -92,7 +92,7 @@ struct TORRENT_EXTRA_EXPORT receive_buffer
|
||||||
buffer::interval mutable_buffer();
|
buffer::interval mutable_buffer();
|
||||||
|
|
||||||
// returns the last 'bytes' from the receive buffer
|
// returns the last 'bytes' from the receive buffer
|
||||||
boost::asio::mutable_buffer mutable_buffer(int bytes);
|
aux::mutable_buffer mutable_buffer(int bytes);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// the purpose of this function is to free up and cut off all messages
|
// the purpose of this function is to free up and cut off all messages
|
||||||
|
@ -158,7 +158,7 @@ private:
|
||||||
// Wraps a receive_buffer to provide the ability to inject
|
// Wraps a receive_buffer to provide the ability to inject
|
||||||
// possibly authenticated crypto beneath the bittorrent protocol.
|
// possibly authenticated crypto beneath the bittorrent protocol.
|
||||||
// When authenticated crypto is in use the wrapped receive_buffer
|
// When authenticated crypto is in use the wrapped receive_buffer
|
||||||
// holds the receive state of the crpyto layer while this class
|
// holds the receive state of the crypto layer while this class
|
||||||
// tracks the state of the bittorrent protocol.
|
// tracks the state of the bittorrent protocol.
|
||||||
struct crypto_receive_buffer
|
struct crypto_receive_buffer
|
||||||
{
|
{
|
||||||
|
@ -200,7 +200,7 @@ struct crypto_receive_buffer
|
||||||
|
|
||||||
buffer::const_interval get() const;
|
buffer::const_interval get() const;
|
||||||
|
|
||||||
boost::asio::mutable_buffer mutable_buffer(std::size_t bytes);
|
aux::mutable_buffer mutable_buffer(std::size_t bytes);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// explicitly disallow assignment, to silence msvc warning
|
// explicitly disallow assignment, to silence msvc warning
|
||||||
|
@ -215,4 +215,3 @@ private:
|
||||||
} // namespace libtorrent
|
} // namespace libtorrent
|
||||||
|
|
||||||
#endif // #ifndef TORRENT_RECEIVE_BUFFER_HPP_INCLUDED
|
#endif // #ifndef TORRENT_RECEIVE_BUFFER_HPP_INCLUDED
|
||||||
|
|
||||||
|
|
|
@ -603,7 +603,7 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
write_pe_vc_cryptofield(ptr, encrypt_size, crypto_provide, pad_size);
|
write_pe_vc_cryptofield(ptr, encrypt_size, crypto_provide, pad_size);
|
||||||
boost::asio::mutable_buffer vec(ptr, encrypt_size);
|
aux::mutable_buffer vec(ptr, encrypt_size);
|
||||||
m_rc4->encrypt(vec);
|
m_rc4->encrypt(vec);
|
||||||
send_buffer(msg, sizeof(msg) - 512 + pad_size);
|
send_buffer(msg, sizeof(msg) - 512 + pad_size);
|
||||||
}
|
}
|
||||||
|
@ -624,7 +624,7 @@ namespace libtorrent
|
||||||
char msg[512 + 8 + 4 + 2];
|
char msg[512 + 8 + 4 + 2];
|
||||||
write_pe_vc_cryptofield(msg, sizeof(msg), crypto_select, pad_size);
|
write_pe_vc_cryptofield(msg, sizeof(msg), crypto_select, pad_size);
|
||||||
|
|
||||||
boost::asio::mutable_buffer vec(msg, buf_size);
|
aux::mutable_buffer vec(msg, buf_size);
|
||||||
m_rc4->encrypt(vec);
|
m_rc4->encrypt(vec);
|
||||||
send_buffer(msg, buf_size);
|
send_buffer(msg, buf_size);
|
||||||
|
|
||||||
|
@ -702,7 +702,7 @@ namespace libtorrent
|
||||||
int consume = 0;
|
int consume = 0;
|
||||||
int produce = len;
|
int produce = len;
|
||||||
int packet_size = 0;
|
int packet_size = 0;
|
||||||
boost::asio::mutable_buffer vec(pos, len);
|
aux::mutable_buffer vec(pos, len);
|
||||||
m_rc4->decrypt(vec, consume, produce, packet_size);
|
m_rc4->decrypt(vec, consume, produce, packet_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3471,12 +3471,12 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(TORRENT_DISABLE_ENCRYPTION) && !defined(TORRENT_DISABLE_EXTENSIONS)
|
#if !defined(TORRENT_DISABLE_ENCRYPTION) && !defined(TORRENT_DISABLE_EXTENSIONS)
|
||||||
std::tuple<int, span<boost::asio::const_buffer>>
|
std::tuple<int, span<aux::const_buffer>>
|
||||||
bt_peer_connection::hit_send_barrier(
|
bt_peer_connection::hit_send_barrier(
|
||||||
span<boost::asio::mutable_buffer> iovec)
|
span<aux::mutable_buffer> iovec)
|
||||||
{
|
{
|
||||||
int next_barrier;
|
int next_barrier;
|
||||||
span<boost::asio::const_buffer> out_iovec;
|
span<aux::const_buffer> out_iovec;
|
||||||
std::tie(next_barrier, out_iovec) = m_enc_handler.encrypt(iovec);
|
std::tie(next_barrier, out_iovec) = m_enc_handler.encrypt(iovec);
|
||||||
#ifndef TORRENT_DISABLE_LOGGING
|
#ifndef TORRENT_DISABLE_LOGGING
|
||||||
if (next_barrier != 0)
|
if (next_barrier != 0)
|
||||||
|
@ -3576,4 +3576,3 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -151,7 +151,7 @@ namespace libtorrent
|
||||||
return m_tmp_vec;
|
return m_tmp_vec;
|
||||||
}
|
}
|
||||||
|
|
||||||
void chained_buffer::build_mutable_iovec(int bytes, std::vector<boost::asio::mutable_buffer> &vec)
|
void chained_buffer::build_mutable_iovec(int bytes, std::vector<aux::mutable_buffer> &vec)
|
||||||
{
|
{
|
||||||
build_vec(bytes, vec);
|
build_vec(bytes, vec);
|
||||||
}
|
}
|
||||||
|
@ -199,4 +199,3 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,38 +103,36 @@ namespace libtorrent
|
||||||
m_xor_mask = h.final();
|
m_xor_mask = h.final();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<int, span<boost::asio::const_buffer>>
|
std::tuple<int, span<aux::const_buffer>>
|
||||||
encryption_handler::encrypt(
|
encryption_handler::encrypt(
|
||||||
span<boost::asio::mutable_buffer> iovec)
|
span<aux::mutable_buffer> iovec)
|
||||||
{
|
{
|
||||||
using namespace boost::asio;
|
|
||||||
|
|
||||||
TORRENT_ASSERT(!m_send_barriers.empty());
|
TORRENT_ASSERT(!m_send_barriers.empty());
|
||||||
TORRENT_ASSERT(m_send_barriers.front().enc_handler);
|
TORRENT_ASSERT(m_send_barriers.front().enc_handler);
|
||||||
|
|
||||||
int to_process = m_send_barriers.front().next;
|
int to_process = m_send_barriers.front().next;
|
||||||
|
|
||||||
boost::asio::mutable_buffer* bufs;
|
aux::mutable_buffer* bufs;
|
||||||
size_t num_bufs;
|
size_t num_bufs;
|
||||||
bool need_destruct = false;
|
bool need_destruct = false;
|
||||||
if (to_process != INT_MAX)
|
if (to_process != INT_MAX)
|
||||||
{
|
{
|
||||||
bufs = TORRENT_ALLOCA(mutable_buffer, iovec.size());
|
bufs = TORRENT_ALLOCA(aux::mutable_buffer, iovec.size());
|
||||||
need_destruct = true;
|
need_destruct = true;
|
||||||
num_bufs = 0;
|
num_bufs = 0;
|
||||||
for (int i = 0; to_process > 0 && i < iovec.size(); ++i)
|
for (int i = 0; to_process > 0 && i < iovec.size(); ++i)
|
||||||
{
|
{
|
||||||
++num_bufs;
|
++num_bufs;
|
||||||
int const size = buffer_size(iovec[i]);
|
int const size = int(iovec[i].size());
|
||||||
if (to_process < size)
|
if (to_process < size)
|
||||||
{
|
{
|
||||||
new (&bufs[i]) mutable_buffer(
|
new (&bufs[i]) aux::mutable_buffer(
|
||||||
buffer_cast<void*>(iovec[i]), to_process);
|
iovec[i].data(), to_process);
|
||||||
to_process = 0;
|
to_process = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
new (&bufs[i]) mutable_buffer(iovec[i]);
|
new (&bufs[i]) aux::mutable_buffer(iovec[i]);
|
||||||
to_process -= size;
|
to_process -= size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -146,7 +144,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
int next_barrier = 0;
|
int next_barrier = 0;
|
||||||
span<const_buffer> out_iovec;
|
span<aux::const_buffer> out_iovec;
|
||||||
if (num_bufs != 0)
|
if (num_bufs != 0)
|
||||||
{
|
{
|
||||||
std::tie(next_barrier, out_iovec)
|
std::tie(next_barrier, out_iovec)
|
||||||
|
@ -179,18 +177,18 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
int payload = 0;
|
int payload = 0;
|
||||||
for (int i = 0; i < num_bufs; ++i)
|
for (int i = 0; i < num_bufs; ++i)
|
||||||
payload += int(buffer_size(bufs[i]));
|
payload += int(bufs[i].size());
|
||||||
|
|
||||||
int overhead = 0;
|
int overhead = 0;
|
||||||
for (auto buf : out_iovec)
|
for (auto buf : out_iovec)
|
||||||
overhead += int(buffer_size(buf));
|
overhead += int(buf.size());
|
||||||
TORRENT_ASSERT(overhead + payload == next_barrier);
|
TORRENT_ASSERT(overhead + payload == next_barrier);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (need_destruct)
|
if (need_destruct)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < num_bufs; ++i)
|
for (int i = 0; i < num_bufs; ++i)
|
||||||
bufs[i].~mutable_buffer();
|
bufs[i].~span<char>();
|
||||||
}
|
}
|
||||||
return std::make_tuple(next_barrier, out_iovec);
|
return std::make_tuple(next_barrier, out_iovec);
|
||||||
}
|
}
|
||||||
|
@ -202,7 +200,7 @@ namespace libtorrent
|
||||||
int consume = 0;
|
int consume = 0;
|
||||||
if (recv_buffer.crypto_packet_finished())
|
if (recv_buffer.crypto_packet_finished())
|
||||||
{
|
{
|
||||||
boost::asio::mutable_buffer wr_buf = recv_buffer.mutable_buffer(bytes_transferred);
|
aux::mutable_buffer wr_buf = recv_buffer.mutable_buffer(bytes_transferred);
|
||||||
int packet_size = 0;
|
int packet_size = 0;
|
||||||
int produce = int(bytes_transferred);
|
int produce = int(bytes_transferred);
|
||||||
m_dec_handler->decrypt(wr_buf, consume, produce, packet_size);
|
m_dec_handler->decrypt(wr_buf, consume, produce, packet_size);
|
||||||
|
@ -248,7 +246,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
int consume = 0;
|
int consume = 0;
|
||||||
int produce = 0;
|
int produce = 0;
|
||||||
std::vector<boost::asio::mutable_buffer> wr_buf;
|
std::vector<aux::mutable_buffer> wr_buf;
|
||||||
crypto->decrypt(wr_buf, consume, produce, packet_size);
|
crypto->decrypt(wr_buf, consume, produce, packet_size);
|
||||||
TORRENT_ASSERT(wr_buf.empty());
|
TORRENT_ASSERT(wr_buf.empty());
|
||||||
TORRENT_ASSERT(consume == 0);
|
TORRENT_ASSERT(consume == 0);
|
||||||
|
@ -276,7 +274,7 @@ namespace libtorrent
|
||||||
int produce = 0;
|
int produce = 0;
|
||||||
int packet_size = 0;
|
int packet_size = 0;
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
boost::asio::mutable_buffer vec(buf, sizeof(buf));
|
aux::mutable_buffer vec(buf, sizeof(buf));
|
||||||
decrypt(vec, consume, produce, packet_size);
|
decrypt(vec, consume, produce, packet_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,23 +284,22 @@ namespace libtorrent
|
||||||
rc4_init(key, len, &m_rc4_outgoing);
|
rc4_init(key, len, &m_rc4_outgoing);
|
||||||
// Discard first 1024 bytes
|
// Discard first 1024 bytes
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
boost::asio::mutable_buffer vec(buf, sizeof(buf));
|
aux::mutable_buffer vec(buf, sizeof(buf));
|
||||||
encrypt(vec);
|
encrypt(vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<int, span<boost::asio::const_buffer>>
|
std::tuple<int, span<aux::const_buffer>>
|
||||||
rc4_handler::encrypt(span<boost::asio::mutable_buffer> bufs)
|
rc4_handler::encrypt(span<aux::mutable_buffer> bufs)
|
||||||
{
|
{
|
||||||
using namespace boost::asio;
|
span<aux::const_buffer> empty;
|
||||||
span<boost::asio::const_buffer> empty;
|
|
||||||
if (!m_encrypt) return std::make_tuple(0, empty);
|
if (!m_encrypt) return std::make_tuple(0, empty);
|
||||||
if (bufs.size() == 0) return std::make_tuple(0, empty);
|
if (bufs.size() == 0) return std::make_tuple(0, empty);
|
||||||
|
|
||||||
int bytes_processed = 0;
|
int bytes_processed = 0;
|
||||||
for (auto& buf : bufs)
|
for (auto& buf : bufs)
|
||||||
{
|
{
|
||||||
unsigned char* const pos = buffer_cast<unsigned char*>(buf);
|
unsigned char* const pos = reinterpret_cast<unsigned char*>(buf.data());
|
||||||
int const len = int(buffer_size(buf));
|
int const len = int(buf.size());
|
||||||
|
|
||||||
TORRENT_ASSERT(len >= 0);
|
TORRENT_ASSERT(len >= 0);
|
||||||
TORRENT_ASSERT(pos);
|
TORRENT_ASSERT(pos);
|
||||||
|
@ -313,7 +310,7 @@ namespace libtorrent
|
||||||
return std::make_tuple(bytes_processed, empty);
|
return std::make_tuple(bytes_processed, empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rc4_handler::decrypt(span<boost::asio::mutable_buffer> bufs
|
void rc4_handler::decrypt(span<aux::mutable_buffer> bufs
|
||||||
, int& consume
|
, int& consume
|
||||||
, int& produce
|
, int& produce
|
||||||
, int& packet_size)
|
, int& packet_size)
|
||||||
|
@ -327,8 +324,8 @@ namespace libtorrent
|
||||||
int bytes_processed = 0;
|
int bytes_processed = 0;
|
||||||
for (auto& buf : bufs)
|
for (auto& buf : bufs)
|
||||||
{
|
{
|
||||||
unsigned char* const pos = boost::asio::buffer_cast<unsigned char*>(buf);
|
unsigned char* const pos = reinterpret_cast<unsigned char*>(buf.data());
|
||||||
int const len = int(boost::asio::buffer_size(buf));
|
int const len = int(buf.size());
|
||||||
|
|
||||||
TORRENT_ASSERT(len >= 0);
|
TORRENT_ASSERT(len >= 0);
|
||||||
TORRENT_ASSERT(pos);
|
TORRENT_ASSERT(pos);
|
||||||
|
@ -406,4 +403,3 @@ unsigned long rc4_encrypt(unsigned char *out, unsigned long outlen, rc4 *state)
|
||||||
} // namespace libtorrent
|
} // namespace libtorrent
|
||||||
|
|
||||||
#endif // #if !defined(TORRENT_DISABLE_ENCRYPTION) && !defined(TORRENT_DISABLE_EXTENSIONS)
|
#endif // #if !defined(TORRENT_DISABLE_ENCRYPTION) && !defined(TORRENT_DISABLE_EXTENSIONS)
|
||||||
|
|
||||||
|
|
|
@ -5468,20 +5468,19 @@ namespace libtorrent
|
||||||
|
|
||||||
if (m_send_barrier == 0)
|
if (m_send_barrier == 0)
|
||||||
{
|
{
|
||||||
std::vector<boost::asio::mutable_buffer> vec;
|
std::vector<aux::mutable_buffer> vec;
|
||||||
// limit outgoing crypto messages to 1MB
|
// limit outgoing crypto messages to 1MB
|
||||||
int const send_bytes = (std::min)(m_send_buffer.size(), 1024*1024);
|
int const send_bytes = (std::min)(m_send_buffer.size(), 1024*1024);
|
||||||
m_send_buffer.build_mutable_iovec(send_bytes, vec);
|
m_send_buffer.build_mutable_iovec(send_bytes, vec);
|
||||||
int next_barrier;
|
int next_barrier;
|
||||||
span<boost::asio::const_buffer> inject_vec;
|
span<aux::const_buffer> inject_vec;
|
||||||
std::tie(next_barrier, inject_vec) = hit_send_barrier(vec);
|
std::tie(next_barrier, inject_vec) = hit_send_barrier(vec);
|
||||||
for (auto i = inject_vec.rbegin(); i != inject_vec.rend(); ++i)
|
for (auto i = inject_vec.rbegin(); i != inject_vec.rend(); ++i)
|
||||||
{
|
{
|
||||||
int const size = boost::asio::buffer_size(*i);
|
int const size = int(i->size());
|
||||||
// this const_cast is a here because chained_buffer need to be
|
// this const_cast is a here because chained_buffer need to be
|
||||||
// fixed.
|
// fixed.
|
||||||
char* ptr = const_cast<char*>(
|
char* ptr = const_cast<char*>(i->data());
|
||||||
boost::asio::buffer_cast<char const*>(*i));
|
|
||||||
m_send_buffer.prepend_buffer(ptr
|
m_send_buffer.prepend_buffer(ptr
|
||||||
, size, size, &nop, nullptr);
|
, size, size, &nop, nullptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,17 +157,15 @@ buffer::interval receive_buffer::mutable_buffer()
|
||||||
, &m_recv_buffer[0] + m_recv_start + rcv_pos);
|
, &m_recv_buffer[0] + m_recv_start + rcv_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::asio::mutable_buffer receive_buffer::mutable_buffer(int const bytes)
|
aux::mutable_buffer receive_buffer::mutable_buffer(int const bytes)
|
||||||
{
|
{
|
||||||
namespace asio = boost::asio;
|
|
||||||
|
|
||||||
// bytes is the number of bytes we just received, and m_recv_pos has
|
// bytes is the number of bytes we just received, and m_recv_pos has
|
||||||
// already been adjusted for these bytes. The receive pos immediately
|
// already been adjusted for these bytes. The receive pos immediately
|
||||||
// before we received these bytes was (m_recv_pos - bytes)
|
// before we received these bytes was (m_recv_pos - bytes)
|
||||||
int const last_recv_pos = m_recv_pos - bytes;
|
int const last_recv_pos = m_recv_pos - bytes;
|
||||||
TORRENT_ASSERT(bytes <= m_recv_pos);
|
TORRENT_ASSERT(bytes <= m_recv_pos);
|
||||||
|
|
||||||
return asio::mutable_buffer(&m_recv_buffer[0] + m_recv_start
|
return aux::mutable_buffer(&m_recv_buffer[0] + m_recv_start
|
||||||
+ last_recv_pos, bytes);
|
+ last_recv_pos, bytes);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -329,7 +327,7 @@ buffer::const_interval crypto_receive_buffer::get() const
|
||||||
return recv_buffer;
|
return recv_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::asio::mutable_buffer crypto_receive_buffer::mutable_buffer(
|
aux::mutable_buffer crypto_receive_buffer::mutable_buffer(
|
||||||
std::size_t const bytes)
|
std::size_t const bytes)
|
||||||
{
|
{
|
||||||
int const pending_decryption = (m_recv_pos != INT_MAX)
|
int const pending_decryption = (m_recv_pos != INT_MAX)
|
||||||
|
|
|
@ -38,6 +38,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/session.hpp"
|
#include "libtorrent/session.hpp"
|
||||||
#include "libtorrent/random.hpp"
|
#include "libtorrent/random.hpp"
|
||||||
#include "libtorrent/span.hpp"
|
#include "libtorrent/span.hpp"
|
||||||
|
#include "libtorrent/buffer.hpp"
|
||||||
|
|
||||||
#include "setup_transfer.hpp"
|
#include "setup_transfer.hpp"
|
||||||
#include "test.hpp"
|
#include "test.hpp"
|
||||||
|
@ -58,7 +59,7 @@ void test_enc_handler(libtorrent::crypto_plugin& a, libtorrent::crypto_plugin& b
|
||||||
std::generate(buf.begin(), buf.end(), &std::rand);
|
std::generate(buf.begin(), buf.end(), &std::rand);
|
||||||
std::copy(buf.begin(), buf.end(), cmp_buf.begin());
|
std::copy(buf.begin(), buf.end(), cmp_buf.begin());
|
||||||
|
|
||||||
using namespace boost::asio;
|
using namespace libtorrent::aux;
|
||||||
|
|
||||||
{
|
{
|
||||||
mutable_buffer iovec(&buf[0], buf_len);
|
mutable_buffer iovec(&buf[0], buf_len);
|
||||||
|
@ -158,4 +159,3 @@ TORRENT_TEST(disabled)
|
||||||
std::fprintf(stderr, "PE test not run because it's disabled\n");
|
std::fprintf(stderr, "PE test not run because it's disabled\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -229,7 +229,7 @@ TORRENT_TEST(recv_buffer_mutable_buffers)
|
||||||
b.cut(100, 1000); // packet size = 1000
|
b.cut(100, 1000); // packet size = 1000
|
||||||
packet_transferred = b.advance_pos(999);
|
packet_transferred = b.advance_pos(999);
|
||||||
TEST_EQUAL(packet_transferred, 999);
|
TEST_EQUAL(packet_transferred, 999);
|
||||||
boost::asio::mutable_buffer vec = b.mutable_buffer(999);
|
aux::mutable_buffer vec = b.mutable_buffer(999);
|
||||||
|
|
||||||
// previous packet
|
// previous packet
|
||||||
// |
|
// |
|
||||||
|
@ -242,8 +242,7 @@ TORRENT_TEST(recv_buffer_mutable_buffers)
|
||||||
// |----------------------| 1000 packet size
|
// |----------------------| 1000 packet size
|
||||||
// |---------------------| 999 buffer
|
// |---------------------| 999 buffer
|
||||||
|
|
||||||
TEST_EQUAL(boost::asio::buffer_size(vec), 999);
|
TEST_EQUAL(vec.size(), 999);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue