157
Handshake::release_connection() {
158
m_peerInfo->unset_flags(PeerInfo::flag_handshake);
165
Handshake::destroy_connection() {
166
manager->connection_manager()->dec_socket_count();
171
if (m_peerInfo == NULL)
174
m_download->peer_list()->disconnected(m_peerInfo, 0);
176
m_peerInfo->unset_flags(PeerInfo::flag_handshake);
181
Handshake::retry_options() {
182
uint32_t options = m_encryption.options() & ~ConnectionManager::encryption_enable_retry;
184
if (m_encryption.retry() == HandshakeEncryption::RETRY_PLAIN)
185
options &= ~ConnectionManager::encryption_try_outgoing;
186
else if (m_encryption.retry() == HandshakeEncryption::RETRY_ENCRYPTED)
187
options |= ConnectionManager::encryption_try_outgoing;
189
throw internal_error("Invalid retry type.");
194
// Handshake::read_proxy_connect()
198
Handshake::read_proxy_connect() {
199
// Being greedy for now.
200
m_readBuffer.move_end(read_stream_throws(m_readBuffer.end(), 512));
202
const char* pattern = "\r\n\r\n";
203
const unsigned int patternLength = 4;
205
if (m_readBuffer.remaining() < patternLength)
208
Buffer::iterator itr = std::search(m_readBuffer.begin(), m_readBuffer.end(),
209
(uint8_t*)pattern, (uint8_t*)pattern + patternLength);
211
m_readBuffer.set_position_itr(itr != m_readBuffer.end() ? (itr + patternLength) : (itr - patternLength));
212
m_readBuffer.move_unused();
214
return itr != m_readBuffer.end();
217
// Handshake::read_encryption_key()
218
// Entry: * 0, [0, 508>
219
// IU 20, [20, enc_pad_read_size>
220
// *E 96, [96, enc_pad_read_size>
222
Handshake::read_encryption_key() {
224
if (m_readBuffer.remaining() < 20)
225
m_readBuffer.move_end(read_stream_throws(m_readBuffer.end(), 20 - m_readBuffer.remaining()));
227
if (m_readBuffer.remaining() < 20)
230
if (m_readBuffer.peek_8() == 19 && std::memcmp(m_readBuffer.position() + 1, m_protocol, 19) == 0) {
231
// got unencrypted BT handshake
232
if (m_encryption.options() & ConnectionManager::encryption_require)
233
throw handshake_error(ConnectionManager::handshake_dropped, e_handshake_unencrypted_rejected);
240
// Read as much of key, pad and sync string as we can; this is safe
241
// because peer can't send anything beyond the initial BT handshake
242
// because it doesn't know our encryption choice yet.
243
if (m_readBuffer.remaining() < enc_pad_read_size)
244
m_readBuffer.move_end(read_stream_throws(m_readBuffer.end(), enc_pad_read_size - m_readBuffer.remaining()));
246
// but we need at least the key at this point
247
if (m_readBuffer.size_end() < 96)
250
// If the handshake fails after this, it wasn't because the peer
251
// doesn't like encrypted connections, so don't retry unencrypted.
252
m_encryption.set_retry(HandshakeEncryption::RETRY_NONE);
255
prepare_key_plus_pad();
257
m_encryption.key()->compute_secret(m_readBuffer.position(), 96);
258
m_readBuffer.consume(96);
260
// Determine the synchronisation string.
262
m_encryption.hash_req1_to_sync();
264
m_encryption.encrypt_vc_to_sync(m_download->info()->hash().c_str());
266
// also put as much as we can write so far in the buffer
268
prepare_enc_negotiation();
270
m_state = READ_ENC_SYNC;
274
// Handshake::read_encryption_sync()
275
// *E 96, [96, enc_pad_read_size>
277
Handshake::read_encryption_sync() {
278
// Check if we've read the sync string already in the previous
279
// state. This is very likely and avoids an unneeded read.
280
Buffer::iterator itr = std::search(m_readBuffer.position(), m_readBuffer.end(),
281
(uint8_t*)m_encryption.sync(), (uint8_t*)m_encryption.sync() + m_encryption.sync_length());
283
if (itr == m_readBuffer.end()) {
284
// Otherwise read as many bytes as possible until we find the sync
286
int toRead = enc_pad_size + m_encryption.sync_length() - m_readBuffer.remaining();
289
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_encryption_sync_failed);
291
m_readBuffer.move_end(read_stream_throws(m_readBuffer.end(), toRead));
293
itr = std::search(m_readBuffer.position(), m_readBuffer.end(),
294
(uint8_t*)m_encryption.sync(), (uint8_t*)m_encryption.sync() + m_encryption.sync_length());
296
if (itr == m_readBuffer.end())
301
// We've found HASH('req1' + S), skip that and go on reading the
303
m_readBuffer.consume(std::distance(m_readBuffer.position(), itr) + 20);
304
m_state = READ_ENC_SKEY;
307
m_readBuffer.consume(std::distance(m_readBuffer.position(), itr));
308
m_state = READ_ENC_NEGOT;
315
Handshake::read_encryption_skey() {
316
if (!fill_read_buffer(20))
319
m_encryption.deobfuscate_hash((char*)m_readBuffer.position());
320
m_download = m_manager->download_info_obfuscated((char*)m_readBuffer.position());
321
m_readBuffer.consume(20);
325
m_encryption.initialize_encrypt(m_download->info()->hash().c_str(), m_incoming);
326
m_encryption.initialize_decrypt(m_download->info()->hash().c_str(), m_incoming);
328
m_encryption.info()->decrypt(m_readBuffer.position(), m_readBuffer.remaining());
330
HandshakeEncryption::copy_vc(m_writeBuffer.end());
331
m_encryption.info()->encrypt(m_writeBuffer.end(), HandshakeEncryption::vc_length);
332
m_writeBuffer.move_end(HandshakeEncryption::vc_length);
334
m_state = READ_ENC_NEGOT;
339
Handshake::read_encryption_negotiation() {
340
if (!fill_read_buffer(enc_negotiation_size))
344
// Start decrypting, but don't decrypt beyond the initial
345
// encrypted handshake and later the pad because we may have read
346
// too much data which may be unencrypted if the peer chose that
348
m_encryption.initialize_decrypt(m_download->info()->hash().c_str(), m_incoming);
349
m_encryption.info()->decrypt(m_readBuffer.position(), enc_negotiation_size);
352
if (!HandshakeEncryption::compare_vc(m_readBuffer.position()))
353
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_invalid_value);
355
m_readBuffer.consume(HandshakeEncryption::vc_length);
357
m_encryption.set_crypto(m_readBuffer.read_32());
358
m_readPos = m_readBuffer.read_16(); // length of padC/padD
360
if (m_readPos > enc_pad_size)
361
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_invalid_value);
363
// choose one of the offered encryptions, or check the chosen one is valid
365
if ((m_encryption.options() & ConnectionManager::encryption_prefer_plaintext) && m_encryption.has_crypto_plain()) {
366
m_encryption.set_crypto(HandshakeEncryption::crypto_plain);
368
} else if ((m_encryption.options() & ConnectionManager::encryption_require_RC4) && !m_encryption.has_crypto_rc4()) {
369
throw handshake_error(ConnectionManager::handshake_dropped, e_handshake_unencrypted_rejected);
371
} else if (m_encryption.has_crypto_rc4()) {
372
m_encryption.set_crypto(HandshakeEncryption::crypto_rc4);
374
} else if (m_encryption.has_crypto_plain()) {
375
m_encryption.set_crypto(HandshakeEncryption::crypto_plain);
378
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_invalid_encryption);
381
// at this point we can also write the rest of our negotiation reply
382
m_writeBuffer.write_32(m_encryption.crypto());
383
m_writeBuffer.write_16(0);
384
m_encryption.info()->encrypt(m_writeBuffer.end() - 4 - 2, 4 + 2);
387
if (m_encryption.crypto() != HandshakeEncryption::crypto_rc4 && m_encryption.crypto() != HandshakeEncryption::crypto_plain)
388
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_invalid_encryption);
390
if ((m_encryption.options() & ConnectionManager::encryption_require_RC4) && (m_encryption.crypto() != HandshakeEncryption::crypto_rc4))
391
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_invalid_encryption);
395
// decrypt appropriate part of buffer: only pad or all
396
if (m_encryption.crypto() == HandshakeEncryption::crypto_plain)
397
m_encryption.info()->decrypt(m_readBuffer.position(), std::min<uint32_t>(m_readPos, m_readBuffer.remaining()));
399
m_encryption.info()->decrypt(m_readBuffer.position(), m_readBuffer.remaining());
402
// next, skip padC/padD
403
m_state = READ_ENC_PAD;
408
Handshake::read_negotiation_reply() {
410
if (m_encryption.crypto() != HandshakeEncryption::crypto_rc4)
411
m_encryption.info()->set_obfuscated();
417
if (!fill_read_buffer(2))
420
// The peer may send initial payload that is RC4 encrypted even if
421
// we have selected plaintext encryption, so read it ahead of BT
423
m_encryption.set_length_ia(m_readBuffer.read_16());
425
if (m_encryption.length_ia() > handshake_size)
426
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_invalid_value);
428
m_state = READ_ENC_IA;
434
Handshake::read_info() {
435
fill_read_buffer(handshake_size);
437
// Check the first byte as early as possible so we can
438
// disconnect non-BT connections if they send less than 20 bytes.
439
if ((m_readBuffer.remaining() >= 1 && m_readBuffer.peek_8() != 19) ||
440
m_readBuffer.remaining() >= 20 &&
441
(std::memcmp(m_readBuffer.position() + 1, m_protocol, 19) != 0))
442
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_not_bittorrent);
444
if (m_readBuffer.remaining() < part1_size)
447
// If the handshake fails after this, it isn't being rejected because
448
// it is unencrypted, so don't retry.
449
m_encryption.set_retry(HandshakeEncryption::RETRY_NONE);
451
m_readBuffer.consume(20);
453
// Should do some option field stuff here, for now just copy.
454
m_readBuffer.read_range(m_options, m_options + 8);
456
// Check the info hash.
458
if (m_download != NULL) {
459
// Have the download from the encrypted handshake, make sure it
460
// matches the BT handshake.
461
if (m_download->info()->hash().not_equal_to((char*)m_readBuffer.position()))
462
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_invalid_value);
465
m_download = m_manager->download_info((char*)m_readBuffer.position());
472
if (m_download->info()->hash().not_equal_to((char*)m_readBuffer.position()))
473
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_invalid_value);
476
m_readBuffer.consume(20);
483
Handshake::read_peer() {
484
if (!fill_read_buffer(20))
489
// The download is just starting so we're not sending any
491
if (m_download->file_list()->bitfield()->is_all_unset())
497
manager->poll()->insert_write(this);
499
// Give some extra time for reading/writing the bitfield.
500
priority_queue_erase(&taskScheduler, &m_taskTimeout);
501
priority_queue_insert(&taskScheduler, &m_taskTimeout, (cachedTime + rak::timer::from_seconds(120)).round_seconds());
503
// Trigger event_write() directly and then skip straight to read
504
// BITFIELD. This avoids going through polling for the first
512
Handshake::read_bitfield() {
513
Bitfield* bitfield = m_download->file_list()->mutable_bitfield();
515
if (m_bitfield.empty()) {
518
// Received a keep-alive message which means we won't be
519
// getting any bitfield.
520
if (m_readBuffer.remaining() >= 4 && m_readBuffer.peek_32() == 0) {
521
m_readBuffer.read_32();
526
if (m_readBuffer.remaining() < 5)
529
// Received a non-bitfield command.
530
if (m_readBuffer.peek_8_at(4) != protocol_bitfield) {
535
if (m_readBuffer.read_32() != bitfield->size_bytes() + 1)
536
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_invalid_value);
538
m_readBuffer.read_8();
541
m_bitfield.set_size_bits(bitfield->size_bits());
542
m_bitfield.allocate();
544
if (m_readBuffer.remaining() != 0) {
545
m_readPos = std::min<uint32_t>(m_bitfield.size_bytes(), m_readBuffer.remaining());
546
std::memcpy(m_bitfield.begin(), m_readBuffer.position(), m_readPos);
547
m_readBuffer.consume(m_readPos);
551
if (m_readPos < m_bitfield.size_bytes()) {
552
uint32_t length = read_stream_throws(m_bitfield.begin() + m_readPos, m_bitfield.size_bytes() - m_readPos);
554
if (m_encryption.info()->decrypt_valid())
555
m_encryption.info()->decrypt(m_bitfield.begin() + m_readPos, length);
560
if (m_readPos == m_bitfield.size_bytes())
137
567
Handshake::event_read() {
140
571
switch (m_state) {
573
if (!read_proxy_connect())
576
m_state = PROXY_DONE;
578
manager->poll()->insert_write(this);
579
return event_write();
582
if (!read_encryption_key())
585
if (m_state != READ_ENC_SYNC)
589
if (!read_encryption_sync())
592
if (m_state != READ_ENC_SKEY)
596
if (!read_encryption_skey())
600
if (!read_encryption_negotiation())
603
if (m_state != READ_ENC_PAD)
608
// Read padC + lenIA or padD; pad length in m_readPos.
609
if (!fill_read_buffer(m_readPos + (m_incoming ? 2 : 0)))
610
// This can be improved (consume as much as was read)
613
m_readBuffer.consume(m_readPos);
617
if (!read_negotiation_reply())
620
if (m_state != READ_ENC_IA)
624
// Just read (and automatically decrypt) the initial payload
625
// and leave it in the buffer for READ_INFO later.
626
if (m_encryption.length_ia() > 0 && !fill_read_buffer(m_encryption.length_ia()))
629
if (m_readBuffer.remaining() > m_encryption.length_ia())
630
throw internal_error("Read past initial payload after incoming encrypted handshake.");
632
if (m_encryption.crypto() != HandshakeEncryption::crypto_rc4)
633
m_encryption.info()->set_obfuscated();
142
m_readBuffer.move_end(read_stream_throws(m_readBuffer.end(), handshake_size - m_readBuffer.size_end()));
144
// Check the first byte as early as possible so we can
145
// disconnect non-BT connections if they send less than 20 bytes.
146
if (m_readBuffer.size_end() >= 1 && m_readBuffer.peek_8() != 19)
147
return m_manager->receive_failed(this);
149
if (m_readBuffer.size_end() < part1_size)
152
if (std::memcmp(m_readBuffer.position() + 1, m_protocol, 19) != 0)
153
return m_manager->receive_failed(this);
155
m_readBuffer.move_position(20);
157
// Should do some option field stuff here, for now just copy.
158
m_readBuffer.read_range(m_options, m_options + 8);
160
// Check the info hash.
162
m_download = m_manager->download_info(std::string(m_readBuffer.position(), m_readBuffer.position() + 20));
163
m_readBuffer.move_position(20);
165
if (m_download == NULL || !m_download->info()->is_accepting_new_peers())
166
return m_manager->receive_failed(this);
168
m_state = WRITE_FILL;
170
manager->poll()->remove_read(this);
171
manager->poll()->insert_write(this);
176
if (std::memcmp(m_download->info()->hash().c_str(), m_readBuffer.position(), 20) != 0)
177
return m_manager->receive_failed(this);
180
m_readBuffer.move_position(20);
641
if (m_state != READ_PEER)
184
if (m_readBuffer.size_end() < handshake_size)
185
m_readBuffer.move_end(read_stream_throws(m_readBuffer.end(), handshake_size - m_readBuffer.size_end()));
187
if (m_readBuffer.size_end() < handshake_size)
192
m_readBuffer.reset();
648
if (m_state != BITFIELD)
656
throw internal_error("Handshake::event_read() called in invalid state.");
659
// if we have more data to write, do so
660
if (m_writeBuffer.remaining()) {
661
manager->poll()->insert_write(this);
662
return event_write();
665
} catch (handshake_succeeded& e) {
666
m_manager->receive_succeeded(this);
668
} catch (handshake_error& e) {
669
m_manager->receive_failed(this, e.type(), e.error());
671
} catch (network_error& e) {
672
m_manager->receive_failed(this, ConnectionManager::handshake_failed, e_handshake_network_error);
678
Handshake::fill_read_buffer(int size) {
679
if (m_readBuffer.remaining() < size) {
680
if (size - m_readBuffer.remaining() > m_readBuffer.reserved_left())
681
throw internal_error("Handshake::fill_read_buffer(...) Buffer overflow.");
683
int read = m_readBuffer.move_end(read_stream_throws(m_readBuffer.end(), size - m_readBuffer.remaining()));
685
if (m_encryption.info()->decrypt_valid())
686
m_encryption.info()->decrypt(m_readBuffer.end() - read, read);
689
return m_readBuffer.remaining() >= size;
693
Handshake::validate_download() {
694
if (m_download == NULL)
695
throw handshake_error(ConnectionManager::handshake_dropped, e_handshake_unknown_download);
696
if (!m_download->info()->is_active())
697
throw handshake_error(ConnectionManager::handshake_dropped, e_handshake_inactive_download);
698
if (!m_download->info()->is_accepting_new_peers())
699
throw handshake_error(ConnectionManager::handshake_dropped, e_handshake_not_accepting_connections);
703
Handshake::read_done() {
704
if (m_readDone != false)
705
throw internal_error("Handshake::read_done() m_readDone != false.");
708
manager->poll()->remove_read(this);
710
if (m_bitfield.empty()) {
711
m_bitfield.set_size_bits(m_download->file_list()->bitfield()->size_bits());
712
m_bitfield.allocate();
713
m_bitfield.unset_all();
720
throw handshake_succeeded();
724
Handshake::event_write() {
729
if (get_fd().get_error())
730
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_network_error);
732
manager->poll()->insert_read(this);
734
if (m_encryption.options() & ConnectionManager::encryption_use_proxy) {
735
prepare_proxy_connect();
737
m_state = PROXY_CONNECT;
742
// If there's any bytes remaining, it means we got a reply from
743
// the other side before our proxy connect command was finished
744
// written. This probably means the other side isn't a proxy.
745
if (m_writeBuffer.remaining())
746
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_not_bittorrent);
193
748
m_writeBuffer.reset();
195
// The download is just starting so we're not sending any
197
if (m_download->content()->bitfield()->is_all_unset())
198
prepare_write_keepalive();
200
prepare_write_bitfield();
203
manager->poll()->insert_write(this);
205
// Give some extra time for reading/writing the bitfield.
206
priority_queue_erase(&taskScheduler, &m_taskTimeout);
207
priority_queue_insert(&taskScheduler, &m_taskTimeout, (cachedTime + rak::timer::from_seconds(120)).round_seconds());
209
// Trigger event_write() directly and then skip straight to read
210
// BITFIELD. This avoids going through polling for the first
750
if (m_encryption.options() & (ConnectionManager::encryption_try_outgoing | ConnectionManager::encryption_require)) {
751
prepare_key_plus_pad();
753
// if connection fails, peer probably closed it because it was encrypted, so retry encrypted if enabled
754
if (!(m_encryption.options() & ConnectionManager::encryption_require))
755
m_encryption.set_retry(HandshakeEncryption::RETRY_PLAIN);
757
m_state = READ_ENC_KEY;
760
// if connection is closed before we read the handshake, it might
761
// be rejected because it is unencrypted, in that case retry encrypted
762
m_encryption.set_retry(HandshakeEncryption::RETRY_ENCRYPTED);
212
775
write_bitfield();
215
if (m_bitfield.empty()) {
216
m_readBuffer.move_end(read_stream_throws(m_readBuffer.end(), 5 - m_readBuffer.size_end()));
218
// Received a keep-alive message which means we won't be
219
// getting any bitfield.
220
if (m_readBuffer.size_end() >= 4 && m_readBuffer.peek_32() == 0) {
221
m_readBuffer.read_32();
225
if (m_readBuffer.size_end() < 5)
228
// Received a non-bitfield command.
229
if (m_readBuffer.peek_8_at(4) != protocol_bitfield)
232
if (m_readBuffer.read_32() != m_download->content()->bitfield()->size_bytes() + 1)
233
return m_manager->receive_failed(this);
235
m_readBuffer.read_8();
238
m_bitfield.set_size_bits(m_download->content()->bitfield()->size_bits());
239
m_bitfield.allocate();
241
if (m_readBuffer.remaining() != 0)
242
throw internal_error("Handshake::event_read() m_readBuffer.remaining() != 0.");
244
// Copy any unread data to bitfield here.
247
// We're guaranteed that we still got bytes remaining to be
248
// read of the bitfield.
249
m_readPos += read_stream_throws(m_bitfield.begin() + m_readPos, m_bitfield.size_bytes() - m_readPos);
251
if (m_readPos == m_bitfield.size_bytes())
257
throw internal_error("Handshake::event_read() called in invalid state.");
782
if (!m_writeBuffer.remaining())
783
throw internal_error("event_write called with empty write buffer.");
785
if (m_writeBuffer.consume(write_stream_throws(m_writeBuffer.position(), m_writeBuffer.remaining())))
786
manager->poll()->remove_write(this);
788
} catch (handshake_succeeded& e) {
789
m_manager->receive_succeeded(this);
791
} catch (handshake_error& e) {
792
m_manager->receive_failed(this, e.type(), e.error());
260
794
} catch (network_error& e) {
261
m_manager->receive_failed(this);
795
m_manager->receive_failed(this, ConnectionManager::handshake_failed, e_handshake_network_error);
801
Handshake::prepare_proxy_connect() {
803
m_address.address_c_str(buf, 256);
805
int advance = snprintf((char*)m_writeBuffer.position(), m_writeBuffer.reserved_left(),
806
"CONNECT %s:%hu HTTP/1.0\r\n\r\n", buf, m_address.port());
809
throw internal_error("Handshake::prepare_proxy_connect() snprintf failed.");
811
m_writeBuffer.move_end(advance);
815
Handshake::prepare_key_plus_pad() {
816
m_encryption.initialize();
818
m_encryption.key()->store_pub_key(m_writeBuffer.end(), 96);
819
m_writeBuffer.move_end(96);
821
int length = random() % enc_pad_size;
824
std::generate_n(pad, length, &::random);
825
m_writeBuffer.write_len(pad, length);
829
Handshake::prepare_enc_negotiation() {
832
// first piece, HASH('req1' + S)
833
sha1_salt("req1", 4, m_encryption.key()->c_str(), m_encryption.key()->size(), m_writeBuffer.end());
834
m_writeBuffer.move_end(20);
836
// second piece, HASH('req2' + SKEY) ^ HASH('req3' + S)
837
m_writeBuffer.write_len(m_download->info()->hash_obfuscated().c_str(), 20);
838
sha1_salt("req3", 4, m_encryption.key()->c_str(), m_encryption.key()->size(), hash);
840
for (int i = 0; i < 20; i++)
841
m_writeBuffer.end()[i - 20] ^= hash[i];
843
// last piece, ENCRYPT(VC, crypto_provide, len(PadC), PadC, len(IA))
844
m_encryption.initialize_encrypt(m_download->info()->hash().c_str(), m_incoming);
846
Buffer::iterator old_end = m_writeBuffer.end();
848
HandshakeEncryption::copy_vc(m_writeBuffer.end());
849
m_writeBuffer.move_end(HandshakeEncryption::vc_length);
851
if (m_encryption.options() & ConnectionManager::encryption_require_RC4)
852
m_writeBuffer.write_32(HandshakeEncryption::crypto_rc4);
854
m_writeBuffer.write_32(HandshakeEncryption::crypto_plain | HandshakeEncryption::crypto_rc4);
856
m_writeBuffer.write_16(0);
857
m_writeBuffer.write_16(handshake_size);
858
m_encryption.info()->encrypt(old_end, m_writeBuffer.end() - old_end);
860
// write and encrypt BT handshake as initial payload IA
865
Handshake::prepare_handshake() {
866
m_writeBuffer.write_8(19);
867
m_writeBuffer.write_range(m_protocol, m_protocol + 19);
869
std::memset(m_writeBuffer.end(), 0, 8);
870
m_writeBuffer.move_end(8);
872
m_writeBuffer.write_range(m_download->info()->hash().c_str(), m_download->info()->hash().c_str() + 20);
873
m_writeBuffer.write_range(m_download->info()->local_id().c_str(), m_download->info()->local_id().c_str() + 20);
875
if (m_encryption.info()->is_encrypted())
876
m_encryption.info()->encrypt(m_writeBuffer.end() - handshake_size, handshake_size);
266
880
Handshake::prepare_peer_info() {
267
881
if (std::memcmp(m_readBuffer.position(), m_download->info()->local_id().c_str(), 20) == 0)
268
throw close_connection();
882
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_is_self);
270
884
// PeerInfo handling for outgoing connections needs to be moved to
271
885
// HandshakeManager.
276
890
m_peerInfo = m_download->peer_list()->connected(m_address.c_sockaddr(), PeerList::connect_incoming);
278
892
if (m_peerInfo == NULL)
279
throw close_connection();
893
throw handshake_error(ConnectionManager::handshake_failed, e_handshake_network_error);
281
895
m_peerInfo->set_flags(PeerInfo::flag_handshake);
284
898
std::memcpy(m_peerInfo->set_options(), m_options, 8);
285
m_peerInfo->set_id(std::string(m_readBuffer.position(), m_readBuffer.position() + 20));
899
m_peerInfo->mutable_id().assign((const char*)m_readBuffer.position());
900
m_readBuffer.consume(20);
289
Handshake::prepare_write_bitfield() {
290
m_writeBuffer.write_32(m_download->content()->bitfield()->size_bytes() + 1);
904
Handshake::prepare_bitfield() {
905
m_writeBuffer.write_32(m_download->file_list()->bitfield()->size_bytes() + 1);
291
906
m_writeBuffer.write_8(protocol_bitfield);
292
m_writeBuffer.prepare_end();
908
if (m_encryption.info()->is_encrypted())
909
m_encryption.info()->encrypt(m_writeBuffer.end() - 5, 5);
298
Handshake::prepare_write_keepalive() {
299
// Write a keep-alive message.
915
Handshake::prepare_keepalive() {
300
916
m_writeBuffer.write_32(0);
301
m_writeBuffer.prepare_end();
918
if (m_encryption.info()->is_encrypted())
919
m_encryption.info()->encrypt(m_writeBuffer.end() - 4, 4);
303
921
// Skip writting the bitfield.
304
m_writePos = m_download->content()->bitfield()->size_bytes();
308
Handshake::read_done() {
309
if (m_readDone != false)
310
throw internal_error("Handshake::read_done() m_readDone != false.");
313
manager->poll()->remove_read(this);
315
if (m_bitfield.empty()) {
316
m_bitfield.set_size_bits(m_download->content()->bitfield()->size_bits());
317
m_bitfield.allocate();
318
m_bitfield.unset_all();
324
// Disconnect if both are seeders.
327
m_manager->receive_succeeded(this);
331
Handshake::event_write() {
336
if (get_fd().get_error())
337
return m_manager->receive_failed(this);
340
m_writeBuffer.write_8(19);
341
m_writeBuffer.write_range(m_protocol, m_protocol + 19);
343
// m_writeBuffer.write_range(m_peerInfo->get_options(), m_peerInfo->get_options() + 8);
344
std::memset(m_writeBuffer.position(), 0, 8);
345
m_writeBuffer.move_position(8);
347
m_writeBuffer.write_range(m_download->info()->hash().c_str(), m_download->info()->hash().c_str() + 20);
348
m_writeBuffer.write_range(m_download->info()->local_id().c_str(), m_download->info()->local_id().c_str() + 20);
350
m_writeBuffer.prepare_end();
352
if (m_writeBuffer.size_end() != handshake_size)
353
throw internal_error("Handshake::event_write() wrong fill size.");
355
m_state = WRITE_SEND;
358
m_writeBuffer.move_position(write_stream_throws(m_writeBuffer.position(), m_writeBuffer.remaining()));
360
if (m_writeBuffer.remaining())
368
manager->poll()->remove_write(this);
369
manager->poll()->insert_read(this);
379
throw internal_error("Handshake::event_write() called in invalid state.");
382
} catch (network_error& e) {
383
m_manager->receive_failed(this);
922
m_writePos = m_download->file_list()->bitfield()->size_bytes();
388
926
Handshake::write_bitfield() {
927
const Bitfield* bitfield = m_download->file_list()->bitfield();
389
929
if (m_writeDone != false)
390
930
throw internal_error("Handshake::event_write() m_writeDone != false.");
392
932
if (m_writeBuffer.remaining())
393
m_writeBuffer.move_position(write_stream_throws(m_writeBuffer.position(), m_writeBuffer.remaining()));
395
if (m_writeBuffer.remaining())
398
if (m_writePos != m_download->content()->bitfield()->size_bytes())
399
m_writePos += write_stream_throws(m_download->content()->bitfield()->begin() + m_writePos,
400
m_download->content()->bitfield()->size_bytes() - m_writePos);
402
if (m_writePos == m_download->content()->bitfield()->size_bytes()) {
933
if (!m_writeBuffer.consume(write_stream_throws(m_writeBuffer.position(), m_writeBuffer.remaining())))
936
if (m_writePos != bitfield->size_bytes()) {
937
if (m_encryption.info()->is_encrypted()) {
939
m_writeBuffer.reset(); // this should be unnecessary now
941
uint32_t length = std::min<uint32_t>(bitfield->size_bytes() - m_writePos, m_writeBuffer.reserved()) - m_writeBuffer.size_end();
944
std::memcpy(m_writeBuffer.end(), bitfield->begin() + m_writePos + m_writeBuffer.size_end(), length);
945
m_encryption.info()->encrypt(m_writeBuffer.end(), length);
946
m_writeBuffer.move_end(length);
949
length = write_stream_throws(m_writeBuffer.begin(), m_writeBuffer.size_end());
950
m_writePos += length;
952
if (length != m_writeBuffer.size_end() && length > 0)
953
std::memmove(m_writeBuffer.begin(), m_writeBuffer.begin() + length, m_writeBuffer.size_end() - length);
955
m_writeBuffer.move_end(-length);
958
m_writePos += write_stream_throws(bitfield->begin() + m_writePos,
959
bitfield->size_bytes() - m_writePos);
963
if (m_writePos == bitfield->size_bytes()) {
403
964
m_writeDone = true;
404
965
manager->poll()->remove_write(this);
406
967
// Ok to just check m_readDone as the call in event_read() won't
407
968
// set it before the call.
409
m_manager->receive_succeeded(this);
970
throw handshake_succeeded();