MSEHandshakeTest.cc 3.8 KB

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