MSEHandshakeTest.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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 "Socket.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. BDE torrentAttrs = BDE::dict();
  29. torrentAttrs[bittorrent::INFO_HASH] =
  30. std::string(vbegin(infoHash), vend(infoHash));
  31. _dctx->setAttribute(bittorrent::BITTORRENT, torrentAttrs);
  32. }
  33. void testHandshake();
  34. };
  35. CPPUNIT_TEST_SUITE_REGISTRATION(MSEHandshakeTest);
  36. static std::pair<SharedHandle<SocketCore>,
  37. SharedHandle<SocketCore> > createSocketPair()
  38. {
  39. SharedHandle<SocketCore> initiatorSock(new SocketCore());
  40. SocketCore receiverServerSock;
  41. receiverServerSock.bind(0);
  42. receiverServerSock.beginListen();
  43. std::pair<std::string, uint16_t> receiverAddrInfo;
  44. receiverServerSock.getAddrInfo(receiverAddrInfo);
  45. initiatorSock->establishConnection("localhost", receiverAddrInfo.second);
  46. initiatorSock->setBlockingMode();
  47. SharedHandle<SocketCore> receiverSock(receiverServerSock.acceptConnection());
  48. receiverSock->setBlockingMode();
  49. return std::pair<SharedHandle<SocketCore>,
  50. SharedHandle<SocketCore> >(initiatorSock, receiverSock);
  51. }
  52. void MSEHandshakeTest::doHandshake(const SharedHandle<MSEHandshake>& initiator, const SharedHandle<MSEHandshake>& receiver)
  53. {
  54. initiator->sendPublicKey();
  55. while(!receiver->receivePublicKey());
  56. receiver->sendPublicKey();
  57. while(!initiator->receivePublicKey());
  58. initiator->initCipher(bittorrent::getInfoHash(_dctx));
  59. initiator->sendInitiatorStep2();
  60. while(!receiver->findReceiverHashMarker());
  61. std::vector<SharedHandle<DownloadContext> > contexts;
  62. contexts.push_back(_dctx);
  63. while(!receiver->receiveReceiverHashAndPadCLength(contexts));
  64. while(!receiver->receivePad());
  65. while(!receiver->receiveReceiverIALength());
  66. while(!receiver->receiveReceiverIA());
  67. receiver->sendReceiverStep2();
  68. while(!initiator->findInitiatorVCMarker());
  69. while(!initiator->receiveInitiatorCryptoSelectAndPadDLength());
  70. while(!initiator->receivePad());
  71. }
  72. static SharedHandle<MSEHandshake>
  73. createMSEHandshake(SharedHandle<SocketCore> socket, bool initiator,
  74. const Option* option)
  75. {
  76. SharedHandle<MSEHandshake> h(new MSEHandshake(1, socket, option));
  77. h->initEncryptionFacility(initiator);
  78. return h;
  79. }
  80. void MSEHandshakeTest::testHandshake()
  81. {
  82. {
  83. Option op;
  84. op.put(PREF_BT_MIN_CRYPTO_LEVEL, V_PLAIN);
  85. std::pair<SharedHandle<SocketCore>, SharedHandle<SocketCore> > sockPair =
  86. createSocketPair();
  87. SharedHandle<MSEHandshake> initiator = createMSEHandshake(sockPair.first, true, &op);
  88. SharedHandle<MSEHandshake> receiver = createMSEHandshake(sockPair.second, false, &op);
  89. doHandshake(initiator, receiver);
  90. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_PLAIN_TEXT, initiator->getNegotiatedCryptoType());
  91. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_PLAIN_TEXT, receiver->getNegotiatedCryptoType());
  92. }
  93. {
  94. Option op;
  95. op.put(PREF_BT_MIN_CRYPTO_LEVEL, V_ARC4);
  96. std::pair<SharedHandle<SocketCore>, SharedHandle<SocketCore> > sockPair =
  97. createSocketPair();
  98. SharedHandle<MSEHandshake> initiator = createMSEHandshake(sockPair.first, true, &op);
  99. SharedHandle<MSEHandshake> receiver = createMSEHandshake(sockPair.second, false, &op);
  100. doHandshake(initiator, receiver);
  101. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_ARC4, initiator->getNegotiatedCryptoType());
  102. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_ARC4, receiver->getNegotiatedCryptoType());
  103. }
  104. }
  105. } // namespace aria2