OpenSSL-Async mode

OpenSSL的异步模式(Async mode)实现了硬件加速卡的异步I/O操作,通过asyyn job结构处理加密解密任务。在该模式下,CPU在job执行时可以切换上下文,用户需主动检查job状态。主要涉及的数据结构包括ASYNC_JOB和async_ctx,以及相关API如SSL_CTX_set_mode。在handshake过程中,通过ASYNC_pause_job和ASYNC_start_job管理job的运行状态,完成加密解密任务。在QAT engine中,该流程用于RSA加密解密等操作。
摘要由CSDN通过智能技术生成

一、Async mode的功能

Asyn mode是OpenSSL支持异步I/O(AIO)的模式,在这个模式下openssl把硬件加速卡等不占用cpu的操作剥离出来,单独交给一个叫asyn job的结构去做。在asyn job执行的过程中,cpu可以把当前任务暂停,切换上下文(保存/恢复栈,寄存器等,用__setjump, longjump实现)返回给user。User需要主动(或者等待硬件加速卡的事件通知)去poll这个async job的状态,是否是ASYNC_FINISHED状态。如果是,说明之前的任务已经完成,则可以继续后面的操作(取回加密/解密结果)。

二、Async相关数据结构

 

比较重要的数据结构:

ASYNC_JOB:  fibrectx用来保存和恢复栈、寄存器;waitctx指向SSL的waitctx。

async_ctx: 全局唯一,currjob指向一个ASYNC_JOB;dispatcher用来保存和恢复栈、寄存器,与ASYNC_JOB的fibrectx配合使用。

三、Async mode相关API

开启Async mode可以使用:SSL_CTX_set_mode(ctx, SSL_MODE_ASYNC)或SSL_set_mode(ssl, SSL_MODE_ASYNC)。在user调用SSL_do_handshake()(SSL_read()/SSL_write()类似)时,会调用到ssl_start_async_job():

3578 int SSL_do_handshake(SSL *s)
3579 {  
3580     int ret = 1;
3581    
3582     if (s->handshake_func == NULL) {
3583         SSLerr(SSL_F_SSL_DO_HANDSHAKE, SSL_R_CONNECTION_TYPE_NOT_SET);
3584         return -1;
3585     }
3586    
3587     ossl_statem_check_finish_init(s, -1);
3588 
3589     s->method->ssl_renegotiate_check(s, 0);
3590     
3591     if (SSL_in_init(s) || SSL_in_before(s)) {
3592         if ((s->mode & SSL_MODE_ASYNC) && ASYNC_get_current_job() == NULL) {
3593             struct ssl_async_args args;
3594    
3595             args.s = s;
3596    
3597             ret = ssl_start_async_job(s, &args, ssl_do_handshake_intern);
3598         } else {
3599             ret = s->handshake_func(s);
3600         }
3601     }  
3602     return ret;
360
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值