openswan协商流程之(七):main_inR3
主模式第六包(收包):main_inR3
1. 序言
main_inR3()函数是ISAKMP协商过程中第一阶段的最后一个报文的接收处理函数,它的作用同main_inI3_outR3()部分功能相同:完成对对端身份的认证。他们的不同之处在于不在需要响应报文(如果不考虑第二阶段的话)。此包处理完毕后,发起端便成功建立了ISAKMP SA, 完成了第一阶段主模式的协商。后续便是第二阶段的协商。这里我们主要说明main_inR3的函数调用关系、处理流程以及对源码的注释分析,关于main_inR3的上下文环境暂不叙述,留给后面的文章进行更新。
ISAKMP协商报文的处理流程都比较复杂,此函数在协商的报文处理函数中比较复杂的,因此个人学习期间难免有遗漏和理解错误的地方,请大家多多批评指正。
目前主要是整理源码中的处理里流程和实现逻辑,尚未深入比较细节的处理;后续在我整理完毕使用主模式协商的9个报文后,我再次结合代码整理每一个报文的详细流程,到时把每一个报文的注意事项、作用,处理方式做一个整体上的把握。同时结合书本上的描述来解释代码层的实现。
ISAKMP主模式协商流程如下:

本文要说明的便是第⑥包的接收函数:main_inR3();
2. 函数调用关系
main_inR3()函数的调用层次少了很多(如果不考虑加解密、证书认证的话),它的调用关系图如下所示

3. 第⑥个报文接收流程图
第⑥个报文的接收流程main_inR3的功能可以分为三类(如果把建立ISAKMP SA也看作一类的话):
- 解析对方的身份标识(ID)和证书载荷,匹配对方的身份标识
- 身份验证
- 预共享秘钥
- 数字证书
- 建立ISAKMP SA
流程图下图:

4. 源码分析
由于main_R3()的处理流程和main_inI3_outR3()中的部分处理流程调用了相同的函数接口,因此无需再进行说明,如果有疑问可以查看main_inI3_outR3()的中的源码部分。
5. 总结
openswan的源码确实难度很高,虽然用了很长的时间来看主模式的6个报文7个主要的函数接口,前后花费了一个月时间吧(之前陆陆续续看过部分接口),但是学习的时候比较浅,没有深层次的理解。最主要包括以下几个方面:
报文的加解密
报文加密、解密是在第⑤⑥个报文中才有的,关于这部分的功能(加密、哈希、数字证书签名验签、预共享密钥等),只知道它是在做这种处理,基本没有深入去分析代码。这个主要是由于看不懂,内心里有种抵触心理;其次是不想直接深入学习这部分,先学习整体处理框架,然后再慢慢深入学习这部分功能。即“先广度优先搜索,再深度优先搜索”
算法相关的操作
这里的算法相关,我是想表达对于策略的配置解析存储算法、如何与报文中的载荷相对应、支持的算法类型、协商时处理对方建议载荷的原则等等问题。这部分有的可能已经在协商流程中有所涉及,但是关于算法的存储等是在这部分之前的流程中处理的(
whack_handle()),因此没有过多学习。后面再补充whack命令相关的知识。连接和状态之间的联系
主要的疑惑是不清楚他们成员之间的关系,可能是特别大,同时关系有比较复杂的缘故。状态是一个动态的概念,即协商过程中的参数;连接是我们的隧道配置信息,基本是个固定的结构。他们是如何维护、以及协商过程中如何联系起来,这部分没有系统整理和分析过。举个简单的例子:NAT-T在ISAKMP中是如何完成协商的? 这个我之前处理过一个bug,因此可能分析过协商过程中的联系,但是其他的我就不得而知了。
任重而道远,继续努力吧。
openswan协商流程之(七):main_inR3的更多相关文章
- openswan协商流程之(一):main_outI1()
主模式第一包:main_outI1() 1. 序言 main_outI1()作为主模式主动发起连接请求的核心处理函数,我们可以通过学习该函数的处理流程来探究openswan中报文封装的基本思想.如果之 ...
- openswan协商流程之(六):main_inI3_outR3()
主模式第六包:main_inI3_outR3 1. 序言 main_inI3_outR3()函数是ISAKMP协商过程中第六包的核心处理函数的入口,第五六包主要用来验证对方的身份信息,同时此报文也是加 ...
- openswan协商流程之(五):main_inR2_outI3()
主模式第五包:main_inR2_outI3 文章目录 主模式第五包:main_inR2_outI3 1. 序言 2.函数调用关系 3. 第五个报文流程图 4. main_inR2_outI3()源码 ...
- openswan协商流程之(四):main_inI2_outR2()
主模式第四包:main_inI2_outR2 1. 序言 main_inI2_outR2()函数是ISAKMP协商过程中第四包的核心处理函数的入口,同时在此处理流程中已经获取到足够的隧道信息,可以生成 ...
- openswan协商流程之(三):main_inR1_outI2
主模式第三包:main_inR1_outI2 1. 序言 main_inR1_outI2()函数是ISAKMP协商过程中第三包的核心处理函数的入口.这里我们主要说明main_inR1_outI2的函数 ...
- openswan协商流程之(二):main_inI1_outR1()
主模式第二包:main_inI1_outR1() 文章目录 主模式第二包:main_inI1_outR1() 1. 序言 2. `main_inI1_outR1()`处理流程图 3. `main_in ...
- IKEv2协议协商流程: (IKE-SA-INIT 交换)第二包
IKEv2协议协商流程: (IKE-SA-INIT 交换)第二包 文章目录 IKEv2协议协商流程: (IKE-SA-INIT 交换)第二包 1. IKEv2 协商总体框架 2. 第二包流程图 3. ...
- IKEv2协议协商流程: (IKE-SA-INIT 交换)第一包
文章目录 1. IKEv2 协商总体框架 2. 第一包流程图 3. openswan源码学习 3.1 ikev2parent_outI1() 3.2 ikev2parent_outI1_withsta ...
- Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程
本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...
随机推荐
- 比POSTMAN更好用!在国产接口调试工具APIPOST中使用Mock
APIPOST可以让你在没有后端程序的情况下能真实地返回接口数据,你可以用APIPOST实现项目初期纯前端的效果演示,也可以用APIPOST实现开发中的数据模拟从而实现前后端分离.在使用APIPOST ...
- 【爬虫系列】1. 无事,Python验证码识别入门
最近在导入某站数据(正经需求),看到他们的登录需要验证码, 本来并不想折腾的,然而Cookie有效期只有一天. 已经收到了几次夜间报警推送之后,实在忍不住. 得嘞,还是得研究下模拟登录. 于是,秃头了 ...
- 2020年度钻石C++C学习笔记(3)--《博学谷》
1.Unix/Linux操作系统介绍 1.1 操作系统的作用 1.1.1 操作系统的目标 l 方便:使计算机系统易于使用 l 有效:以更有效的方式使用计算机系统资源 l 扩展:方便用户有效开发.测试和 ...
- 1day漏洞反推技巧实战(1)
学习笔记里的存货(1) 以前看了一篇推特老外做赏金猎人的文章,感触有点深,作者没有写相关漏洞分析,只是说了自己挖了多少个漏洞,这里简单的分析下: 1day漏洞在很多时候至关重要,不管是在红蓝对抗,还是 ...
- [C++]-map 映射
map用来存储排序后的由键和值组成的项的集合.键必须唯一,不同的键可以对应同一个值,在map中键保持逻辑排序后的顺序(以键为标准). 代码 #include<iostream> #incl ...
- Python断言及常用断言函数总结
Python断言 Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行:反之,Python 解释器会报 As ...
- Golang语言系列-16-context上下文
context上下文 控制子goroutine退出 全局变量方式 package main import ( "fmt" "sync" "time&q ...
- K8S日志接入sls配置
背景 原有日志方案查询日志很不方便且效率低,而且也不支持基于日志的高级操作.如:聚合,图形展示,关键字检测等. 方案 接入阿里云的sls日志服务. 实施 1.通过环境变量进行日志接入 配置如下: 字段 ...
- SQL 练习36
查询不同课程成绩相同的学生的学生编号.课程编号.学生成绩 select a.cid, a.sid, a.score from sc as a,sc as b WHERE a.sid = b.sid a ...
- NOIP 模拟 $34\; \rm Equation$
题解 \(by\;zj\varphi\) 发现每个点的权值都可以表示成 \(\rm k\pm x\). 那么对于新增的方程,\(\rm x_u+x_v=k\pm x/0\) 且 \(\rm x_u+x ...