summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/DefaultBtAnnounce.cc3
-rw-r--r--src/InitiatorMSEHandshakeCommand.cc4
-rw-r--r--src/MSEHandshake.cc9
-rw-r--r--src/OptionHandlerFactory.cc12
-rw-r--r--src/ReceiverMSEHandshakeCommand.cc4
-rw-r--r--src/prefs.cc1
-rw-r--r--src/prefs.h2
-rw-r--r--src/usage_text.h8
8 files changed, 37 insertions, 6 deletions
diff --git a/src/DefaultBtAnnounce.cc b/src/DefaultBtAnnounce.cc
index a5a73bb0..f7d491cf 100644
--- a/src/DefaultBtAnnounce.cc
+++ b/src/DefaultBtAnnounce.cc
@@ -189,7 +189,8 @@ std::string DefaultBtAnnounce::getAnnounceUrl() {
uri += "&trackerid=";
uri += util::torrentPercentEncode(trackerId_);
}
- if(option_->getAsBool(PREF_BT_REQUIRE_CRYPTO)) {
+ if(option_->getAsBool(PREF_BT_FORCE_ENCRYPTION) ||
+ option_->getAsBool(PREF_BT_REQUIRE_CRYPTO)) {
uri += "&requirecrypto=1";
} else {
uri += "&supportcrypto=1";
diff --git a/src/InitiatorMSEHandshakeCommand.cc b/src/InitiatorMSEHandshakeCommand.cc
index c8a3681a..b91553f6 100644
--- a/src/InitiatorMSEHandshakeCommand.cc
+++ b/src/InitiatorMSEHandshakeCommand.cc
@@ -216,7 +216,8 @@ bool InitiatorMSEHandshakeCommand::prepareForNextPeer(time_t wait)
// established.
tryNewPeer();
return true;
- } else if(getOption()->getAsBool(PREF_BT_REQUIRE_CRYPTO)) {
+ } else if(getOption()->getAsBool(PREF_BT_FORCE_ENCRYPTION) ||
+ getOption()->getAsBool(PREF_BT_REQUIRE_CRYPTO)) {
A2_LOG_INFO(fmt("CUID#%" PRId64 " - Establishing connection using legacy"
" BitTorrent handshake is disabled by preference.",
getCuid()));
@@ -239,6 +240,7 @@ bool InitiatorMSEHandshakeCommand::prepareForNextPeer(time_t wait)
void InitiatorMSEHandshakeCommand::onAbort()
{
if(sequence_ == INITIATOR_SEND_KEY ||
+ getOption()->getAsBool(PREF_BT_FORCE_ENCRYPTION) ||
getOption()->getAsBool(PREF_BT_REQUIRE_CRYPTO)) {
peerStorage_->returnPeer(getPeer());
}
diff --git a/src/MSEHandshake.cc b/src/MSEHandshake.cc
index c4d3c98a..3b3f67fc 100644
--- a/src/MSEHandshake.cc
+++ b/src/MSEHandshake.cc
@@ -284,7 +284,8 @@ void MSEHandshake::sendInitiatorStep2()
ptr += sizeof(VC);
// crypto_provide
memset(ptr, 0, CRYPTO_BITFIELD_LENGTH);
- if(option_->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) {
+ if(!option_->getAsBool(PREF_BT_FORCE_ENCRYPTION) &&
+ option_->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) {
ptr[3] = CRYPTO_PLAIN_TEXT;
}
ptr[3] |= CRYPTO_ARC4;
@@ -347,7 +348,8 @@ bool MSEHandshake::receiveInitiatorCryptoSelectAndPadDLength()
//verifyCryptoSelect
unsigned char* rbufptr = rbuf_;
decryptor_->encrypt(CRYPTO_BITFIELD_LENGTH, rbufptr, rbufptr);
- if(rbufptr[3]&CRYPTO_PLAIN_TEXT &&
+ if((rbufptr[3]&CRYPTO_PLAIN_TEXT) &&
+ !option_->getAsBool(PREF_BT_FORCE_ENCRYPTION) &&
option_->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) {
A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - peer prefers plaintext.",
cuid_));
@@ -447,7 +449,8 @@ bool MSEHandshake::receiveReceiverHashAndPadCLength
decryptor_->encrypt(CRYPTO_BITFIELD_LENGTH, rbufptr, rbufptr);
// TODO choose the crypto type based on the preference.
// For now, choose ARC4.
- if(rbufptr[3]&CRYPTO_PLAIN_TEXT &&
+ if((rbufptr[3]&CRYPTO_PLAIN_TEXT) &&
+ !option_->getAsBool(PREF_BT_FORCE_ENCRYPTION) &&
option_->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) {
A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - peer provides plaintext.",
cuid_));
diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc
index f2f4eec9..8542900c 100644
--- a/src/OptionHandlerFactory.cc
+++ b/src/OptionHandlerFactory.cc
@@ -1758,6 +1758,18 @@ std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
handlers.push_back(op);
}
{
+ OptionHandler* op(new BooleanOptionHandler
+ (PREF_BT_FORCE_ENCRYPTION,
+ TEXT_BT_FORCE_ENCRYPTION,
+ A2_V_FALSE,
+ OptionHandler::OPT_ARG));
+ op->addTag(TAG_BITTORRENT);
+ op->setInitialOption(true);
+ op->setChangeGlobalOption(true);
+ op->setChangeOptionForReserved(true);
+ handlers.push_back(op);
+ }
+ {
OptionHandler* op(new NumberOptionHandler
(PREF_BT_KEEP_ALIVE_INTERVAL,
NO_DESCRIPTION,
diff --git a/src/ReceiverMSEHandshakeCommand.cc b/src/ReceiverMSEHandshakeCommand.cc
index f0c611d4..02205383 100644
--- a/src/ReceiverMSEHandshakeCommand.cc
+++ b/src/ReceiverMSEHandshakeCommand.cc
@@ -96,7 +96,9 @@ bool ReceiverMSEHandshakeCommand::executeInternal()
sequence_ = RECEIVER_WAIT_KEY;
break;
case MSEHandshake::HANDSHAKE_LEGACY: {
- if(getDownloadEngine()->getOption()->getAsBool(PREF_BT_REQUIRE_CRYPTO)){
+ const auto option = getDownloadEngine()->getOption();
+ if(option->getAsBool(PREF_BT_FORCE_ENCRYPTION) ||
+ option->getAsBool(PREF_BT_REQUIRE_CRYPTO)){
throw DL_ABORT_EX
("The legacy BitTorrent handshake is not acceptable by the"
" preference.");
diff --git a/src/prefs.cc b/src/prefs.cc
index 2332bd57..ba8adfd2 100644
--- a/src/prefs.cc
+++ b/src/prefs.cc
@@ -549,6 +549,7 @@ PrefPtr PREF_BT_EXCLUDE_TRACKER = makePref("bt-exclude-tracker");
PrefPtr PREF_BT_REMOVE_UNSELECTED_FILE =
makePref("bt-remove-unselected-file");
PrefPtr PREF_BT_DETACH_SEED_ONLY = makePref("bt-detach-seed-only");
+PrefPtr PREF_BT_FORCE_ENCRYPTION = makePref("bt-force-encryption");
/**
* Metalink related preferences
diff --git a/src/prefs.h b/src/prefs.h
index a4b5bfdf..75b676a8 100644
--- a/src/prefs.h
+++ b/src/prefs.h
@@ -486,6 +486,8 @@ extern PrefPtr PREF_BT_EXCLUDE_TRACKER;
extern PrefPtr PREF_BT_REMOVE_UNSELECTED_FILE;
// values: true |false
extern PrefPtr PREF_BT_DETACH_SEED_ONLY;
+// values: true | false
+extern PrefPtr PREF_BT_FORCE_ENCRYPTION;
/**
* Metalink related preferences
diff --git a/src/usage_text.h b/src/usage_text.h
index 1b139b13..c45480da 100644
--- a/src/usage_text.h
+++ b/src/usage_text.h
@@ -1013,3 +1013,11 @@
" recognized as active download in RPC method.")
#define TEXT_MIN_TLS_VERSION \
_(" --min-tls-version=VERSION Specify minimum SSL/TLS version to enable.")
+#define TEXT_BT_FORCE_ENCRYPTION \
+ _(" --bt-force-encryption[=true|false]\n" \
+ " Requires BitTorrent message payload encryption\n" \
+ " with arc4. This is a shorthand of\n" \
+ " --bt-requre-crypto --bt-min-crypto-level=arc4.\n" \
+ " If true is given, deny legacy BitTorrent\n" \
+ " handshake and only use Obfuscation handshake and\n" \
+ " always encrypt message payload.")