MSEHandshakeTest.cc 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include "MSEHandshake.h"
  2. #include <cstring>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "Exception.h"
  5. #include "util.h"
  6. #include "prefs.h"
  7. #include "SocketCore.h"
  8. #include "Option.h"
  9. #include "DownloadContext.h"
  10. #include "FileEntry.h"
  11. #include "array_fun.h"
  12. #include "bittorrent_helper.h"
  13. namespace aria2 {
  14. class MSEHandshakeTest:public CppUnit::TestFixture {
  15. CPPUNIT_TEST_SUITE(MSEHandshakeTest);
  16. CPPUNIT_TEST(testHandshake);
  17. CPPUNIT_TEST_SUITE_END();
  18. private:
  19. SharedHandle<DownloadContext> dctx_;
  20. void doHandshake(const SharedHandle<MSEHandshake>& initiator,
  21. const SharedHandle<MSEHandshake>& receiver);
  22. public:
  23. void setUp()
  24. {
  25. dctx_.reset(new DownloadContext());
  26. unsigned char infoHash[20];
  27. memset(infoHash, 0, sizeof(infoHash));
  28. SharedHandle<TorrentAttribute> torrentAttrs(new TorrentAttribute());
  29. torrentAttrs->infoHash = std::string(vbegin(infoHash), vend(infoHash));
  30. dctx_->setAttribute(CTX_ATTR_BT, torrentAttrs);
  31. }
  32. void testHandshake();
  33. };
  34. CPPUNIT_TEST_SUITE_REGISTRATION(MSEHandshakeTest);
  35. namespace {
  36. std::pair<SharedHandle<SocketCore>, SharedHandle<SocketCore> >
  37. createSocketPair()
  38. {
  39. SharedHandle<SocketCore> initiatorSock(new SocketCore());
  40. SocketCore receiverServerSock;
  41. receiverServerSock.bind(0);
  42. receiverServerSock.beginListen();
  43. receiverServerSock.setBlockingMode();
  44. std::pair<std::string, uint16_t> receiverAddrInfo;
  45. receiverServerSock.getAddrInfo(receiverAddrInfo);
  46. initiatorSock->establishConnection("localhost", receiverAddrInfo.second);
  47. initiatorSock->setBlockingMode();
  48. SharedHandle<SocketCore> receiverSock(receiverServerSock.acceptConnection());
  49. receiverSock->setBlockingMode();
  50. return std::pair<SharedHandle<SocketCore>,
  51. SharedHandle<SocketCore> >(initiatorSock, receiverSock);
  52. }
  53. } // namespace
  54. void MSEHandshakeTest::doHandshake(const SharedHandle<MSEHandshake>& initiator, const SharedHandle<MSEHandshake>& receiver)
  55. {
  56. initiator->sendPublicKey();
  57. while(initiator->getWantWrite()) {
  58. initiator->send();
  59. }
  60. while(!receiver->receivePublicKey()) {
  61. receiver->read();
  62. }
  63. receiver->sendPublicKey();
  64. while(receiver->getWantWrite()) {
  65. receiver->send();
  66. }
  67. while(!initiator->receivePublicKey()) {
  68. initiator->read();
  69. }
  70. initiator->initCipher(bittorrent::getInfoHash(dctx_));
  71. initiator->sendInitiatorStep2();
  72. while(initiator->getWantWrite()) {
  73. initiator->send();
  74. }
  75. while(!receiver->findReceiverHashMarker()) {
  76. receiver->read();
  77. }
  78. std::vector<SharedHandle<DownloadContext> > contexts;
  79. contexts.push_back(dctx_);
  80. while(!receiver->receiveReceiverHashAndPadCLength(contexts)) {
  81. receiver->read();
  82. }
  83. while(!receiver->receivePad()) {
  84. receiver->read();
  85. }
  86. while(!receiver->receiveReceiverIALength()) {
  87. receiver->read();
  88. }
  89. while(!receiver->receiveReceiverIA()) {
  90. receiver->read();
  91. }
  92. receiver->sendReceiverStep2();
  93. while(receiver->getWantWrite()) {
  94. receiver->send();
  95. }
  96. while(!initiator->findInitiatorVCMarker()) {
  97. initiator->read();
  98. }
  99. while(!initiator->receiveInitiatorCryptoSelectAndPadDLength()) {
  100. initiator->read();
  101. }
  102. while(!initiator->receivePad()) {
  103. initiator->read();
  104. }
  105. }
  106. namespace {
  107. SharedHandle<MSEHandshake>
  108. createMSEHandshake(SharedHandle<SocketCore> socket, bool initiator,
  109. const Option* option)
  110. {
  111. SharedHandle<MSEHandshake> h(new MSEHandshake(1, socket, option));
  112. h->initEncryptionFacility(initiator);
  113. return h;
  114. }
  115. } // namespace
  116. void MSEHandshakeTest::testHandshake()
  117. {
  118. {
  119. Option op;
  120. op.put(PREF_BT_MIN_CRYPTO_LEVEL, V_PLAIN);
  121. std::pair<SharedHandle<SocketCore>, SharedHandle<SocketCore> > sockPair =
  122. createSocketPair();
  123. SharedHandle<MSEHandshake> initiator = createMSEHandshake(sockPair.first, true, &op);
  124. SharedHandle<MSEHandshake> receiver = createMSEHandshake(sockPair.second, false, &op);
  125. doHandshake(initiator, receiver);
  126. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_PLAIN_TEXT, initiator->getNegotiatedCryptoType());
  127. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_PLAIN_TEXT, receiver->getNegotiatedCryptoType());
  128. }
  129. {
  130. Option op;
  131. op.put(PREF_BT_MIN_CRYPTO_LEVEL, V_ARC4);
  132. std::pair<SharedHandle<SocketCore>, SharedHandle<SocketCore> > sockPair =
  133. createSocketPair();
  134. SharedHandle<MSEHandshake> initiator = createMSEHandshake(sockPair.first, true, &op);
  135. SharedHandle<MSEHandshake> receiver = createMSEHandshake(sockPair.second, false, &op);
  136. doHandshake(initiator, receiver);
  137. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_ARC4, initiator->getNegotiatedCryptoType());
  138. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_ARC4, receiver->getNegotiatedCryptoType());
  139. }
  140. }
  141. } // namespace aria2