openswan协商流程之(三):main_inR1_outI2

主模式第三包:main_inR1_outI2

1. 序言

main_inR1_outI2()函数是ISAKMP协商过程中第三包的核心处理函数的入口。这里我们主要说明main_inR1_outI2的函数调用关系、处理流程以及对源码的注释分析,关于main_inR1_outI2的上下文环境暂不叙述,留给后面的文章进行更新。

ISAKMP协商报文的处理流程都比较复杂,一个函数有几百行都是很常见的,因此个人学习期间难免有遗漏和理解错误的地方,请大家多多批评指正。

对于源码的学习,我并没有把每一行进行备注,而是将自己认为的关键点做了注释或者标注。


2. 函数调用关系

注意:这里我把收到对方报文后的处理流程也添加上了,主要是在学习源码过程中遇到complete_v1_state_transition执行了两次

  • process_v1_packet
    • process_packet_tail
      • smc->processor(md)
        • main_inR1_outI2
          • build_ke
            • send_crypto_helper_request
              • pluto_do_crypto_op
              • main_inR1_outI2_continue
                • main_inR1_outI2_tail
                  • init_pbs
                  • ship_KE
                  • ship_nonce
                  • nat_traversal_add_natd
                  • close_message
                  • insert_state
                • complete_v1_state_transition
      • complete_v1_state_transition

在这里插入图片描述

3. 第三个报文流程图

由于第三个报文的核心处理函数包含多个,不仅仅包含main_inR1_outI2, 因此这里会将涉及的关键函数接口都添加到流程图中,方便根据函数定位对应的功能。


  • 解析对端发送的SA载荷,确定对端选择的算法,并将其存储在状态/连接上
  • 生成秘钥交换材料和Nonce信息
  • 构造应答报文(第四个报文)
    • 填充KE载荷和Nonce载荷

在这里插入图片描述

4. main_inR1_outI2源码注释

  • 解析收到的第二个报文,确定对端选择的算法,并将算法存储在状态结构上
  • 申请生成交换密钥信息
stf_status
main_inR1_outI2(struct msg_digest *md)
{
   
    struct state *const st = md->st;

    /* verify echoed SA */
    {
   /*md->chain为解析完毕的收到的报文,下标为np的值*/
	struct payload_digest *const sapd = md->chain[ISAKMP_NEXT_SA];

	 /*解析对端SA, 由于无需填充应答SA因此第三个参数为NULL*/
	RETURN_STF_FAILURE(parse_isakmp_sa_body(&sapd->pbs
						, &sapd->payload.sa
						, NULL, TRUE, st));
    }

#ifdef NAT_TRAVERSAL
    DBG(DBG_NATT, DBG_log("sender checking NAT-T: %d and %d"
				 , nat_traversal_enabled
				 , md->quirks.nat_traversal_vid))

    if (nat_traversal_enabled && md->quirks.nat_traversal_vid) {
   /*获取NAT-T采用的标准*/
	st->hidden_variables.st_nat_traversal = nat_traversal_vid_to_method(md->quirks.nat_traversal_vid);
	openswan_log("enabling possible NAT-traversal with method %s"
	     , bitnamesof(natt_type_bitnames, st->hidden_variables.st_nat_traversal));
    }
#endif

    {
   /*密钥交换*/
	struct ke_continuation *ke = alloc_thing(struct ke_continuation
						 , "outI2 KE");
	ke->md = md;

	passert(st->st_sec_in_use==FALSE);/*是否已经加密,是的话,状态有误,返回退出*/
	pcrc_init(&ke->ke_pcrc);
	ke->ke_pcrc.pcrc_func = main_inR1_outI2_continue;
	set_suspended(st, md);
        /*构建秘钥交换载荷信息*/
	return build_ke(&ke->ke_pcrc, st, st->st_oakley.group, st->st_import);
    }
}

5. build_ke源码注释

  • 初始化并发送加密请求
    • 生成加密材料、Nonce载荷、构建应答报文在send_crypto_helper_request及其以后。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叨陪鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值