MSEHandshakeTest.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include "MSEHandshake.h"
  2. #include "Exception.h"
  3. #include "Util.h"
  4. #include "prefs.h"
  5. #include "Socket.h"
  6. #include "Option.h"
  7. #include "BtRegistry.h"
  8. #include "MockBtContext.h"
  9. #include "FileEntry.h"
  10. #include <cppunit/extensions/HelperMacros.h>
  11. namespace aria2 {
  12. class MSEHandshakeTest:public CppUnit::TestFixture {
  13. CPPUNIT_TEST_SUITE(MSEHandshakeTest);
  14. CPPUNIT_TEST(testHandshake);
  15. CPPUNIT_TEST_SUITE_END();
  16. private:
  17. SharedHandle<MockBtContext> _btctx;
  18. void doHandshake(const SharedHandle<MSEHandshake>& initiator,
  19. const SharedHandle<MSEHandshake>& receiver);
  20. public:
  21. void setUp()
  22. {
  23. _btctx.reset(new MockBtContext());
  24. unsigned char infoHash[20];
  25. memset(infoHash, 0, sizeof(infoHash));
  26. _btctx->setInfoHash(infoHash);
  27. BtRegistry::unregisterAll();
  28. BtRegistry::registerBtContext(_btctx->getInfoHashAsString(), _btctx);
  29. }
  30. void tearDown()
  31. {
  32. BtRegistry::unregisterAll();
  33. }
  34. void testHandshake();
  35. };
  36. CPPUNIT_TEST_SUITE_REGISTRATION(MSEHandshakeTest);
  37. static std::pair<SharedHandle<SocketCore>,
  38. SharedHandle<SocketCore> > createSocketPair()
  39. {
  40. SharedHandle<SocketCore> initiatorSock(new SocketCore());
  41. SocketCore receiverServerSock;
  42. receiverServerSock.bind(0);
  43. receiverServerSock.beginListen();
  44. std::pair<std::string, uint16_t> receiverAddrInfo;
  45. receiverServerSock.getAddrInfo(receiverAddrInfo);
  46. initiatorSock->establishConnection("127.0.0.1", 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. void MSEHandshakeTest::doHandshake(const SharedHandle<MSEHandshake>& initiator, const SharedHandle<MSEHandshake>& receiver)
  54. {
  55. initiator->sendPublicKey();
  56. while(!receiver->receivePublicKey());
  57. receiver->sendPublicKey();
  58. while(!initiator->receivePublicKey());
  59. initiator->initCipher(_btctx->getInfoHash());
  60. initiator->sendInitiatorStep2();
  61. while(!receiver->findReceiverHashMarker());
  62. while(!receiver->receiveReceiverHashAndPadCLength());
  63. while(!receiver->receivePad());
  64. while(!receiver->receiveReceiverIALength());
  65. while(!receiver->receiveReceiverIA());
  66. receiver->sendReceiverStep2();
  67. while(!initiator->findInitiatorVCMarker());
  68. while(!initiator->receiveInitiatorCryptoSelectAndPadDLength());
  69. while(!initiator->receivePad());
  70. }
  71. static SharedHandle<MSEHandshake>
  72. createMSEHandshake(SharedHandle<SocketCore> socket, bool initiator,
  73. const Option* option)
  74. {
  75. SharedHandle<MSEHandshake> h(new MSEHandshake(1, socket, option));
  76. h->initEncryptionFacility(initiator);
  77. return h;
  78. }
  79. void MSEHandshakeTest::testHandshake()
  80. {
  81. {
  82. Option op;
  83. op.put(PREF_BT_MIN_CRYPTO_LEVEL, V_PLAIN);
  84. std::pair<SharedHandle<SocketCore>, SharedHandle<SocketCore> > sockPair =
  85. createSocketPair();
  86. SharedHandle<MSEHandshake> initiator = createMSEHandshake(sockPair.first, true, &op);
  87. SharedHandle<MSEHandshake> receiver = createMSEHandshake(sockPair.second, false, &op);
  88. doHandshake(initiator, receiver);
  89. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_PLAIN_TEXT, initiator->getNegotiatedCryptoType());
  90. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_PLAIN_TEXT, receiver->getNegotiatedCryptoType());
  91. }
  92. {
  93. Option op;
  94. op.put(PREF_BT_MIN_CRYPTO_LEVEL, V_ARC4);
  95. std::pair<SharedHandle<SocketCore>, SharedHandle<SocketCore> > sockPair =
  96. createSocketPair();
  97. SharedHandle<MSEHandshake> initiator = createMSEHandshake(sockPair.first, true, &op);
  98. SharedHandle<MSEHandshake> receiver = createMSEHandshake(sockPair.second, false, &op);
  99. doHandshake(initiator, receiver);
  100. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_ARC4, initiator->getNegotiatedCryptoType());
  101. CPPUNIT_ASSERT_EQUAL(MSEHandshake::CRYPTO_ARC4, receiver->getNegotiatedCryptoType());
  102. }
  103. }
  104. } // namespace aria2