关键词搜索

源码搜索 ×
×

tars源码分析之27

发布2022-07-17浏览1447次

详情内容

openssl的read,write, handshake:

  1. #if TARS_SSL
  2. #include <openssl/ssl.h>
  3. #include <openssl/err.h>
  4. #include "util/tc_openssl.h"
  5. #include "util/tc_buffer.h"
  6. namespace tars
  7. {
  8. TC_OpenSSL::~TC_OpenSSL()
  9. {
  10. Release();
  11. }
  12. void TC_OpenSSL::Release()
  13. {
  14. if (_ssl)
  15. {
  16. SSL_free(_ssl);
  17. _ssl = NULL;
  18. }
  19. _bHandshaked = false;
  20. _err = 0;
  21. }
  22. void TC_OpenSSL::Init(SSL* ssl, bool isServer)
  23. {
  24. assert (_ssl == NULL);
  25. _ssl = ssl;
  26. _bHandshaked = false;
  27. _isServer = isServer;
  28. _err = 0;
  29. }
  30. bool TC_OpenSSL::IsHandshaked() const
  31. {
  32. return _bHandshaked;
  33. }
  34. bool TC_OpenSSL::HasError() const
  35. {
  36. return _err != 0;
  37. }
  38. string* TC_OpenSSL::RecvBuffer()
  39. {
  40. return &_plainBuf;
  41. }
  42. std::string TC_OpenSSL::DoHandshake(const void* data, size_t size)
  43. {
  44. assert (!_bHandshaked);
  45. assert (_ssl);
  46. if (data && size)
  47. {
  48. // 写入ssl内存缓冲区
  49. BIO_write(SSL_get_rbio(_ssl), data, size);
  50. }
  51. ERR_clear_error();
  52. int ret = _isServer ? SSL_accept(_ssl) : SSL_connect(_ssl);
  53. if (ret <= 0)
  54. {
  55. _err = SSL_get_error(_ssl, ret);
  56. if (_err != SSL_ERROR_WANT_READ)
  57. {
  58. return std::string();
  59. }
  60. }
  61. _err = 0;
  62. if (ret == 1)
  63. {
  64. _bHandshaked = true;
  65. }
  66. // the encrypted data from write buffer
  67. std::string out;
  68. TC_Buffer outdata;
  69. GetMemData(SSL_get_wbio(_ssl), outdata);
  70. if (!outdata.IsEmpty())
  71. {
  72. out.assign(outdata.ReadAddr(), outdata.ReadableSize());
  73. }
  74. return out;
  75. }
  76. std::string TC_OpenSSL::Write(const void* data, size_t size)
  77. {
  78. if (!_bHandshaked)
  79. return std::string((const char*)data, size); //握手数据不用加密
  80. // 会话数据需加密
  81. ERR_clear_error();
  82. int ret = SSL_write(_ssl, data, size);
  83. if (ret <= 0)
  84. {
  85. _err = SSL_get_error(_ssl, ret);
  86. return std::string();
  87. }
  88. _err = 0;
  89. TC_Buffer toSend;
  90. GetMemData(SSL_get_wbio(_ssl), toSend);
  91. return std::string(toSend.ReadAddr(), toSend.ReadableSize());
  92. }
  93. bool TC_OpenSSL::Read(const void* data, size_t size, std::string& out)
  94. {
  95. bool usedData = false;
  96. if (!_bHandshaked)
  97. {
  98. usedData = true;
  99. _plainBuf.clear();
  100. std::string out2 = DoHandshake(data, size);
  101. out.swap(out2);
  102. if (_err != 0)
  103. return false;
  104. if (_bHandshaked)
  105. ; // TODO onHandshake
  106. }
  107. // 不要用else,因为数据可能紧跟着最后的握手而来
  108. if (_bHandshaked)
  109. {
  110. if (!usedData)
  111. {
  112. // 写入ssl内存缓冲区
  113. BIO_write(SSL_get_rbio(_ssl), data, size);
  114. }
  115. string data;
  116. if (DoSSLRead(_ssl, data))
  117. {
  118. _plainBuf.append(data.begin(), data.end());
  119. }
  120. else
  121. {
  122. _err = SSL_ERROR_SSL;
  123. return false;
  124. }
  125. }
  126. return true;
  127. }
  128. } // end namespace tars
  129. #endif

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载