summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-02-18 13:41:58 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-02-18 13:41:58 +0000
commit20cd2e52468f96f5aa0558aa30306e6abc6fbfcd (patch)
tree41be8349f5db162356c0fd316b751d5bda57e647 /src
parentc37539eb25c6a85534fe7a73af2dd9ebccad7f49 (diff)
2008-02-18 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added --bt-min-crypto-level and --bt-require-crypto options. * src/OptionHandlerFactory.cc * src/MSEHandshake.cc * src/HelpItemFactory.cc * src/option_processing.cc * src/ReceiverMSEHandshakeCommand.cc * src/prefs.h * src/DefaultBtAnnounce.cc * src/InitiatorMSEHandshakeCommand.cc * src/usage_text.h * test/MSEHandshakeTest.cc
Diffstat (limited to 'src')
-rw-r--r--src/DefaultBtAnnounce.cc7
-rw-r--r--src/HelpItemFactory.cc10
-rw-r--r--src/InitiatorMSEHandshakeCommand.cc35
-rw-r--r--src/MSEHandshake.cc19
-rw-r--r--src/OptionHandlerFactory.cc2
-rw-r--r--src/ReceiverMSEHandshakeCommand.cc3
-rw-r--r--src/option_processing.cc10
-rw-r--r--src/prefs.h6
-rw-r--r--src/usage_text.h9
9 files changed, 86 insertions, 15 deletions
diff --git a/src/DefaultBtAnnounce.cc b/src/DefaultBtAnnounce.cc
index a804a476..11ae3a88 100644
--- a/src/DefaultBtAnnounce.cc
+++ b/src/DefaultBtAnnounce.cc
@@ -51,6 +51,7 @@
#include "BtRuntime.h"
#include "PeerStorage.h"
#include "Peer.h"
+#include "Option.h"
namespace aria2 {
@@ -160,7 +161,11 @@ std::string DefaultBtAnnounce::getAnnounceUrl() {
url += std::string("&")+"trackerid="+Util::torrentUrlencode((const unsigned char*)trackerId.c_str(),
trackerId.size());
}
- url += "&supportcrypto=1";
+ if(option->getAsBool(PREF_BT_REQUIRE_CRYPTO)) {
+ url += "&requirecrypto=1";
+ } else {
+ url += "&supportcrypto=1";
+ }
return url;
}
diff --git a/src/HelpItemFactory.cc b/src/HelpItemFactory.cc
index f94327ca..5d922287 100644
--- a/src/HelpItemFactory.cc
+++ b/src/HelpItemFactory.cc
@@ -351,6 +351,16 @@ TagContainerHandle HelpItemFactory::createHelpItems()
item->addTag(TAG_BITTORRENT);
tc->addItem(item);
}
+ {
+ HelpItemHandle item = new HelpItem(PREF_BT_MIN_CRYPTO_LEVEL, TEXT_BT_MIN_CRYPTO_LEVEL, V_PLAIN);
+ item->addTag(TAG_BITTORRENT);
+ tc->addItem(item);
+ }
+ {
+ HelpItemHandle item = new HelpItem(PREF_BT_REQUIRE_CRYPTO, TEXT_BT_REQUIRE_CRYPTO, V_FALSE);
+ item->addTag(TAG_BITTORRENT);
+ tc->addItem(item);
+ }
#endif // ENABLE_BITTORRENT
#ifdef ENABLE_METALINK
{
diff --git a/src/InitiatorMSEHandshakeCommand.cc b/src/InitiatorMSEHandshakeCommand.cc
index 79c11a24..beb3dfae 100644
--- a/src/InitiatorMSEHandshakeCommand.cc
+++ b/src/InitiatorMSEHandshakeCommand.cc
@@ -145,17 +145,34 @@ bool InitiatorMSEHandshakeCommand::executeInternal() {
bool InitiatorMSEHandshakeCommand::prepareForNextPeer(int32_t wait)
{
- // try legacy BitTorrent handshake if preference allows it.
- // TODO preference is not created yet.
- logger->info("CUID#%d - Retry using legacy BitTorrent handshake.", cuid);
- Command* command =
- new PeerInitiateConnectionCommand(cuid, _requestGroup, peer, e, btContext,
- false);
- e->commands.push_back(command);
- return true;
+ if(e->option->getAsBool(PREF_BT_REQUIRE_CRYPTO)) {
+ logger->info("CUID#%d - Establishing connection using legacy BitTorrent handshake is disabled by preference.", cuid);
+ if(peerStorage->isPeerAvailable() && btRuntime->lessThanEqMinPeer()) {
+ SharedHandle<Peer> peer = peerStorage->getUnusedPeer();
+ peer->usedBy(CUIDCounterSingletonHolder::instance()->newID());
+ Command* command =
+ new PeerInitiateConnectionCommand(peer->usedBy(), _requestGroup, peer, e,
+ btContext);
+ e->commands.push_back(command);
+ }
+ return true;
+ } else {
+ // try legacy BitTorrent handshake
+ logger->info("CUID#%d - Retry using legacy BitTorrent handshake.", cuid);
+ Command* command =
+ new PeerInitiateConnectionCommand(cuid, _requestGroup, peer, e, btContext,
+ false);
+ e->commands.push_back(command);
+ return true;
+ }
}
-void InitiatorMSEHandshakeCommand::onAbort(Exception* ex) {}
+void InitiatorMSEHandshakeCommand::onAbort(Exception* ex)
+{
+ if(e->option->getAsBool(PREF_BT_REQUIRE_CRYPTO)) {
+ peerStorage->returnPeer(peer);
+ }
+}
bool InitiatorMSEHandshakeCommand::exitBeforeExecute()
{
diff --git a/src/MSEHandshake.cc b/src/MSEHandshake.cc
index 63752643..79799033 100644
--- a/src/MSEHandshake.cc
+++ b/src/MSEHandshake.cc
@@ -48,6 +48,8 @@
#include "Util.h"
#include "BtRegistry.h"
#include "BtContext.h"
+#include "prefs.h"
+#include "Option.h"
#include <cstring>
#include <cassert>
@@ -256,7 +258,10 @@ void MSEHandshake::sendInitiatorStep2()
// crypto_provide
unsigned char cryptoProvide[4];
memset(cryptoProvide, 0, sizeof(cryptoProvide));
- cryptoProvide[3] = CRYPTO_PLAIN_TEXT | CRYPTO_ARC4;
+ if(_option->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) {
+ cryptoProvide[3] = CRYPTO_PLAIN_TEXT;
+ }
+ cryptoProvide[3] |= CRYPTO_ARC4;
memcpy(buffer+8, cryptoProvide, sizeof(cryptoProvide));
// len(padC)
@@ -328,7 +333,8 @@ bool MSEHandshake::receiveInitiatorCryptoSelectAndPadDLength()
unsigned char cryptoSelect[CRYPTO_BITFIELD_LENGTH];
_decryptor->decrypt(cryptoSelect, sizeof(cryptoSelect),
rbufptr, sizeof(cryptoSelect));
- if(cryptoSelect[3]&CRYPTO_PLAIN_TEXT) {
+ if(cryptoSelect[3]&CRYPTO_PLAIN_TEXT &&
+ _option->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) {
_logger->debug("CUID#%d - peer prefers plaintext.", _cuid);
_negotiatedCryptoType = CRYPTO_PLAIN_TEXT;
}
@@ -440,11 +446,11 @@ bool MSEHandshake::receiveReceiverHashAndPadCLength()
rbufptr, sizeof(cryptoProvide));
// TODO choose the crypto type based on the preference.
// For now, choose ARC4.
- if(cryptoProvide[3]&CRYPTO_PLAIN_TEXT) {
+ if(cryptoProvide[3]&CRYPTO_PLAIN_TEXT &&
+ _option->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) {
_logger->debug("CUID#%d - peer provides plaintext.", _cuid);
_negotiatedCryptoType = CRYPTO_PLAIN_TEXT;
- }
- if(cryptoProvide[3]&CRYPTO_ARC4) {
+ } else if(cryptoProvide[3]&CRYPTO_ARC4) {
_logger->debug("CUID#%d - peer provides ARC4.", _cuid);
_negotiatedCryptoType = CRYPTO_ARC4;
}
@@ -476,6 +482,9 @@ bool MSEHandshake::receiveReceiverIALength()
bool MSEHandshake::receiveReceiverIA()
{
+ if(_iaLength == 0) {
+ return true;
+ }
int32_t r = _iaLength-_rbufLength;
if(r > receiveNBytes(r)) {
return false;
diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc
index 13aa5b79..f01fbf3c 100644
--- a/src/OptionHandlerFactory.cc
+++ b/src/OptionHandlerFactory.cc
@@ -119,6 +119,8 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
PREF_DHT_ENTRY_POINT_HOST,
PREF_DHT_ENTRY_POINT_PORT));
handlers.push_back(new NumberOptionHandler(PREF_STOP, 0, 35000000));
+ handlers.push_back(new ParameterOptionHandler(PREF_BT_MIN_CRYPTO_LEVEL, V_PLAIN, V_ARC4));
+ handlers.push_back(new BooleanOptionHandler(PREF_BT_REQUIRE_CRYPTO));
return handlers;
}
diff --git a/src/ReceiverMSEHandshakeCommand.cc b/src/ReceiverMSEHandshakeCommand.cc
index 89cbcd10..01e4ff1e 100644
--- a/src/ReceiverMSEHandshakeCommand.cc
+++ b/src/ReceiverMSEHandshakeCommand.cc
@@ -86,6 +86,9 @@ bool ReceiverMSEHandshakeCommand::executeInternal()
_sequence = RECEIVER_WAIT_KEY;
break;
case MSEHandshake::HANDSHAKE_LEGACY: {
+ if(e->option->getAsBool(PREF_BT_REQUIRE_CRYPTO)) {
+ throw new DlAbortEx("The legacy BitTorrent handshake is not acceptable by the preference.");
+ }
Command* c = new PeerReceiveHandshakeCommand(cuid, peer, e, socket);
e->commands.push_back(c);
return true;
diff --git a/src/option_processing.cc b/src/option_processing.cc
index 165f7a88..0f4b5aff 100644
--- a/src/option_processing.cc
+++ b/src/option_processing.cc
@@ -140,6 +140,8 @@ Option* option_processing(int argc, char* const argv[])
op->put(PREF_ENABLE_DHT, V_FALSE);
op->put(PREF_DHT_LISTEN_PORT, "6881-6999");
op->put(PREF_DHT_FILE_PATH, Util::getHomeDir()+"/.aria2/dht.dat");
+ op->put(PREF_BT_MIN_CRYPTO_LEVEL, V_PLAIN);
+ op->put(PREF_BT_REQUIRE_CRYPTO, V_FALSE);
// following options are not parsed by OptionHandler and not stored in Option.
bool noConf = false;
@@ -221,6 +223,8 @@ Option* option_processing(int argc, char* const argv[])
{ "enable-dht", optional_argument, &lopt, 27 },
{ "dht-listen-port", required_argument, &lopt, 28 },
{ "dht-entry-point", required_argument, &lopt, 29 },
+ { PREF_BT_MIN_CRYPTO_LEVEL, required_argument, &lopt, 30 },
+ { PREF_BT_REQUIRE_CRYPTO, required_argument, &lopt, 31 },
#endif // ENABLE_BITTORRENT
#ifdef ENABLE_METALINK
{ "metalink-file", required_argument, NULL, 'M' },
@@ -325,6 +329,12 @@ Option* option_processing(int argc, char* const argv[])
case 29:
cmdstream << PREF_DHT_ENTRY_POINT << "=" << optarg << "\n";
break;
+ case 30:
+ cmdstream << PREF_BT_MIN_CRYPTO_LEVEL << "=" << optarg << "\n";
+ break;
+ case 31:
+ cmdstream << PREF_BT_REQUIRE_CRYPTO << "=" << optarg << "\n";
+ break;
case 100:
cmdstream << PREF_METALINK_VERSION << "=" << optarg << "\n";
break;
diff --git a/src/prefs.h b/src/prefs.h
index 06fe79f6..88c4fe0f 100644
--- a/src/prefs.h
+++ b/src/prefs.h
@@ -228,6 +228,12 @@
#define PREF_DHT_ENTRY_POINT "dht-entry-point"
// values: a string
#define PREF_DHT_FILE_PATH "dht-file-path"
+// values: plain | arc4
+#define PREF_BT_MIN_CRYPTO_LEVEL "bt-min-crypto-level"
+# define V_PLAIN "plain"
+# define V_ARC4 "arc4"
+// values:: true | false
+#define PREF_BT_REQUIRE_CRYPTO "bt-require-crypto"
/**
* Metalink related preferences
diff --git a/src/usage_text.h b/src/usage_text.h
index 221cc06e..fae24579 100644
--- a/src/usage_text.h
+++ b/src/usage_text.h
@@ -267,6 +267,15 @@ _(" --dht-listen-port... Set UDP listening port for DHT.\n"\
#define TEXT_DHT_ENTRY_POINT \
_(" --dht-entry-point=HOST:PORT Set host and port as an entry point to DHT\n"\
" network.")
+#define TEXT_BT_MIN_CRYPTO_LEVEL \
+_(" --bt-min-crypto-level=plain|arc4 Set minimum level of encryption method.\n"\
+ " If several encryption methods are provided by a\n"\
+ " peer, aria2 chooses a lowest one which satisfies\n"\
+ " given level.")
+#define TEXT_BT_REQUIRE_CRYPTO \
+_(" --bt-require-crypto=true|false If true is given, aria2 doesn't accept and\n"\
+ " establish connection with legacy BitTorrent\n"\
+ " handshake. Thus always use Obfuscation handshake.")
#define TEXT_METALINK_FILE \
_(" -M, --metalink-file=METALINK_FILE The file path to the .metalink file.")
#define TEXT_METALINK_SERVERS \