tars源码分析之27

2023-05-16

openssl的read,write, handshake:

#if TARS_SSL

#include <openssl/ssl.h>
#include <openssl/err.h>

#include "util/tc_openssl.h"
#include "util/tc_buffer.h"


namespace tars
{

TC_OpenSSL::~TC_OpenSSL()
{
    Release();
}

void TC_OpenSSL::Release()
{
    if (_ssl)
    {
        SSL_free(_ssl);
        _ssl = NULL;
    }
    _bHandshaked = false;
    _err = 0;
}

void TC_OpenSSL::Init(SSL* ssl, bool isServer)
{
    assert (_ssl == NULL);
    _ssl = ssl;
    _bHandshaked = false;
    _isServer = isServer;
    _err = 0;
}

bool TC_OpenSSL::IsHandshaked() const
{
    return _bHandshaked;
}

bool TC_OpenSSL::HasError() const
{
    return _err != 0;
}
    
string* TC_OpenSSL::RecvBuffer()
{
    return &_plainBuf;
}

std::string TC_OpenSSL::DoHandshake(const void* data, size_t size)
{
    assert (!_bHandshaked);
    assert (_ssl);

    if (data && size)
    {
        // 写入ssl内存缓冲区
        BIO_write(SSL_get_rbio(_ssl), data, size);
    }

    ERR_clear_error(); 
    int ret = _isServer ? SSL_accept(_ssl) : SSL_connect(_ssl);

    if (ret <= 0)
    {
        _err = SSL_get_error(_ssl, ret);
        if (_err != SSL_ERROR_WANT_READ)
        {
            return std::string();
        }
    }

    _err = 0;

    if (ret == 1)
    {
        _bHandshaked = true;
    }

    // the encrypted data from write buffer
    std::string out;
    TC_Buffer outdata; 
    GetMemData(SSL_get_wbio(_ssl), outdata);
    if (!outdata.IsEmpty()) 
    {
        out.assign(outdata.ReadAddr(), outdata.ReadableSize());
    }

    return out;
}

std::string TC_OpenSSL::Write(const void* data, size_t size)
{
    if (!_bHandshaked)
        return std::string((const char*)data, size); //握手数据不用加密
 
    // 会话数据需加密
    ERR_clear_error(); 
    int ret = SSL_write(_ssl, data, size); 
    if (ret <= 0) 
    {
        _err = SSL_get_error(_ssl, ret);
        return std::string();
    }

    _err = 0;

    TC_Buffer toSend; 
    GetMemData(SSL_get_wbio(_ssl), toSend);
    return std::string(toSend.ReadAddr(), toSend.ReadableSize());
}

bool TC_OpenSSL::Read(const void* data, size_t size, std::string& out)
{
    bool usedData = false;
    if (!_bHandshaked)
    {
        usedData = true;
        _plainBuf.clear();
        std::string out2 = DoHandshake(data, size);
        out.swap(out2);

        if (_err != 0)
            return false;

        if (_bHandshaked)
            ; // TODO onHandshake
    }

    // 不要用else,因为数据可能紧跟着最后的握手而来
    if (_bHandshaked)
    {
        if (!usedData)
        {
            // 写入ssl内存缓冲区
            BIO_write(SSL_get_rbio(_ssl), data, size);
        }

        string data;
        if (DoSSLRead(_ssl, data))
        {
            _plainBuf.append(data.begin(), data.end());
        }
        else
        {
            _err = SSL_ERROR_SSL;
            return false;
        }
    }

    return true;
}

} // end namespace tars

#endif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tars源码分析之27 的相关文章

  • 对抗样本(四)BIM&ILLC

    文章目录 一 论文相关信息 1 论文题目 2 论文时间 3 论文文献 二 论文背景及简介三 论文内容总结四 论文主要内容1 Introduction2 Methods Of Generating Adversarial Images3 Ph
  • Oracle建立表空间和用户

    Oracle建立表空间和用户 建立表空间和用户的步骤 xff1a 用户 建立 xff1a create user 用户名 identified by 34 密码 34 授权 xff1a grant create session to 用户名
  • Ubuntu 16.04 Qt clang-format 插件安装使用教程

    Ubuntu 16 04 Qt clang format 插件安装使用教程 Qt安装下载安装修改qt环境变量 LLVM安装安装clang format配置qt打开工程文件配置clang format Qt安装 最新的qt5 12支持保存代码

随机推荐

  • AIADATA 独家深度解密:百度XuperChain开源区块链基础平台

    AIADATA 独家深度解密 xff1a 百度XuperChain开源区块链基础平台 百度超级链Xuperchain正式宣布开源 根据官网显示 xff0c 链内并行技术 可插拔共识机制 一体化智能合约等四大技术支撑开源 xff0c 让区块链
  • 应用集成实战系列:服务总线中的发布订阅业务模式

    在应用集成项目中 xff0c 如果有数据同步的需求 xff0c 尤其是主数据同步的需求 xff0c 经常会用到发布订阅模式进行数据的发布 发布订阅模式多用于消息分发业务 xff0c 比如源系统数据更新 xff0c 需要同步到多个业务系统 员
  • docker for windows pull镜像文件的安装位置改变方法

    发生现象 xff1a 在windows10下安装docker for windows xff0c 随着用docker pull image文件后 xff0c C盘的容量越来越小了 xff0c 你可能也有一种跟我一样的想法 xff0c 想改变
  • 树莓派3b+ ubuntu 18.04添加SSH服务

    树莓派3b 43 ubuntu 18 04添加SSH服务 手头有个一年没用的树莓派3B 43 上官网发现ubuntu 18 04已经支持 xff0c 并且有相应的镜像 成功安装ubuntu后需要配置ssh供使用 xff0c 在网上找了一些流
  • 使用 Ctrl + R 命令反向查找/搜索历史【笔记】

    反向查找 搜索历史命令 反向查找 搜索执行过的命令 1 reverse search history Ctrl 43 R 从当前行开始向后搜索 xff0c 并根据需要在历史记录中向上移动 这是一个增量搜索 此命令将区域设置为匹配的文本并激活
  • 最简单的Word公式编号方法

    1 使用Word自带的公式编辑器时 xff0c 在公示后面输入 即可对公式编号 2 使用Mathtype进行公式编辑时 xff0c 需要制定制表位进行公式编号 xff0c 具体设置如下 xff08 1 xff09 样式库新建样式命名为公式A
  • 基于Jetson TX1的faster-rcnn的算法搭建

    Data 2016 12 19 Author cjh Theme Set up the faster rcnnenvironment 由于R FCN运行内存较大 xff0c TX1貌似性能不够 xff0c 又在开发板上尝试faster rc
  • C++子类的构造函数后面加:冒号的作用(转)

    在C 43 43 类的构造函数中经常会看到如下格式的写法 xff1a MyWindow span class token operator span span class token function MyWindow span span
  • C51单片机控制蜂鸣器

    在单片机应用上 xff0c 蜂鸣器可以作为报警信号或者提示信号 单片机控制蜂鸣器发声的基本原理和方法 xff1a 只需对驱动口输出驱动电平并通过放大电路放大驱动电流就能使蜂鸣器发出声音 改变引脚的频率 xff0c 就可以调整蜂鸣器的音调 x
  • Ubuntu20.04安装微信详细步骤,解决显示异常,无法显示输入内容问题和状态栏问题

    Ubuntu20 04安装微信 xff0c 解决显示异常 xff0c 无法输入问题和状态栏问题 最要提示最终效果 xff0c 输入窗口正常 xff0c 应用图标收纳在状态栏中步骤一 xff1a 安装wine步骤二 xff1a 安装字体 xf
  • 论文理解:Defense-GAN

    由于首次接触对抗训练方面的内容 在此借着Defense GAN中的相关内容先对对抗训练相关知识做一个简要的整理 对抗训练基本说明见https www leiphone com news 201702 Jpb0uiOt9RTwcB8E htm
  • 阿里云服务器配置(一、图形界面配置)

    一 更新环境 apt get update apt get upgrade y apt get dist upgrade y 二 开始安装图形化界面 apt get install ubuntu desktop 三 安装结束后通过控制台VN
  • RedBoot 命令使用

    Redboot 常用命令详解 zt 版权声明 xff1a 转载时请以超链接形式标明文章原始出处和作者信息及本声明 http redboot blogbus com logs 22381509 html Redboot启动完成后 xff0c
  • Ubuntu创建虚拟桌面

    安装 span class token function sudo span span class token function apt get span span class token function install span xse
  • python-09装饰器有参数、无参数的传递说明

    以上是通过 args接收元组 xff0c kargs接收字典来接收不定的参数 也可以写固定的参数
  • CSDN快速涨粉秘笈---涨粉速度提升30倍

    首先 xff0c 必须要强调的是 xff0c 这篇文章所述的CSDN快速涨粉秘笈 xff0c 是合法合规的 xff0c 也是CSDN官方博客专门发文推送过的 xff0c 而不是所谓的违规刷粉 你没有看错 xff0c 就是如下的CSDN官方博
  • tars源码分析之26

    decode相关动作 xff0c 这个简单 xff1a include 34 util tc option h 34 include 34 util tc common h 34 namespace tars void TC Option
  • 基于Jetson TX1的摄像头API函数例程

    Data 2017 04 25 Author cjh Theme Install Official Camera API inJetson TX1 之前写过一篇测试摄像头的博客 xff0c 发现博友对如何使用Jetson TX1板载的摄像头
  • 0.96oled移植u8g2库,采用stm32f103硬件SPI或DMA通信,全网唯一,最详细教程

    0 视频教程 我的B站 1 下载源码 去官网下载源码 也可以点击我的链接下载 2 解压 解压出来其中的csrc文件夹 xff0c 放到工程目录 把自己的屏幕驱动保留下来 xff0c 比如我用的128x64的ssd1306 就把里面的 u8x
  • tars源码分析之27

    openssl的read write handshake if TARS SSL include lt openssl ssl h gt include lt openssl err h gt include 34 util tc open