主模式第六包(收包):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的更多相关文章

  1. openswan协商流程之(一):main_outI1()

    主模式第一包:main_outI1() 1. 序言 main_outI1()作为主模式主动发起连接请求的核心处理函数,我们可以通过学习该函数的处理流程来探究openswan中报文封装的基本思想.如果之 ...

  2. openswan协商流程之(六):main_inI3_outR3()

    主模式第六包:main_inI3_outR3 1. 序言 main_inI3_outR3()函数是ISAKMP协商过程中第六包的核心处理函数的入口,第五六包主要用来验证对方的身份信息,同时此报文也是加 ...

  3. openswan协商流程之(五):main_inR2_outI3()

    主模式第五包:main_inR2_outI3 文章目录 主模式第五包:main_inR2_outI3 1. 序言 2.函数调用关系 3. 第五个报文流程图 4. main_inR2_outI3()源码 ...

  4. openswan协商流程之(四):main_inI2_outR2()

    主模式第四包:main_inI2_outR2 1. 序言 main_inI2_outR2()函数是ISAKMP协商过程中第四包的核心处理函数的入口,同时在此处理流程中已经获取到足够的隧道信息,可以生成 ...

  5. openswan协商流程之(三):main_inR1_outI2

    主模式第三包:main_inR1_outI2 1. 序言 main_inR1_outI2()函数是ISAKMP协商过程中第三包的核心处理函数的入口.这里我们主要说明main_inR1_outI2的函数 ...

  6. openswan协商流程之(二):main_inI1_outR1()

    主模式第二包:main_inI1_outR1() 文章目录 主模式第二包:main_inI1_outR1() 1. 序言 2. `main_inI1_outR1()`处理流程图 3. `main_in ...

  7. IKEv2协议协商流程: (IKE-SA-INIT 交换)第二包

    IKEv2协议协商流程: (IKE-SA-INIT 交换)第二包 文章目录 IKEv2协议协商流程: (IKE-SA-INIT 交换)第二包 1. IKEv2 协商总体框架 2. 第二包流程图 3. ...

  8. IKEv2协议协商流程: (IKE-SA-INIT 交换)第一包

    文章目录 1. IKEv2 协商总体框架 2. 第一包流程图 3. openswan源码学习 3.1 ikev2parent_outI1() 3.2 ikev2parent_outI1_withsta ...

  9. Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程

    本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...

随机推荐

  1. 缩减Azure上Linux虚拟机系统盘容量

    [话在前头] 这么些年微软 Azure 创建虚拟机一直不能修改系统盘大小,但很多时候实际又用不了这么大的操作系统磁盘.微软自己甚至还针对 Windows 服务器镜像推出一个 smalldisk 的镜像 ...

  2. 【LeetCode】155. 最小栈

    155. 最小栈 知识点:栈:单调 题目描述 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删 ...

  3. 源码解析.Net中IConfiguration配置的实现

    前言 关于IConfituration的使用,我觉得大部分人都已经比较熟悉了,如果不熟悉的可以看这里.因为本篇不准备讲IConfiguration都是怎么使用的,但是在源码部分的解读,网上资源相对少一 ...

  4. 5 秒克隆声音「GitHub 热点速览 v.21.34」

    作者:HelloGitHub-小鱼干 本周特推的 2 个项目都很好用,Realtime-Voice-Clone-Chinese 能让你无需开启变声音,即可获得一个特定声音的语音.这个声音可以是你朋友的 ...

  5. zlib开发笔记(三):zlib库介绍、在ubuntu上进行arm平台交叉编译

    前言   方便做嵌入式arm的交叉移植zlib库.   Zlib库   zlib被设计为一个免费的,通用的,法律上不受限制的-即不受任何专利保护的无损数据压缩库,几乎可以在任何计算机硬件和操作系统上使 ...

  6. NOIP 模拟 $29\; \rm 最近公共祖先$

    题解 \(by\;zj\varphi\) 首先考虑,如果将一个点修改成了黑点,那么它能够造成多少贡献. 它先会对自己的子树中的答案造成 \(w_x\) 的贡献. 考虑祖先时,它会对不包括自己的子树造成 ...

  7. NOIP 模拟 $21\; \rm Park$

    题解 \(by\;zj\varphi\) 首先,分析一下这个答案:本质上是求在一条路径上,选择了一些点,这些点的贡献是它周围的点权和 - 它上一步的点权 对于一棵树,可以先确定一个根,然后每条路径就可 ...

  8. C#中的集合类

    集合相当于容器,用于将一系列相似的项组合在一起. 集合可以分为泛型集合类和非泛型集合类. 多数集合类都是派生自ICollection.IComparer.IEnumerable.IList.IDict ...

  9. 关于servlet中doGet和doPost乱码再一次理解

    今天系统的整理了在web项目下,出现的编码问题,下面就做一些总结: 首先对HTTP协议中对GET和POST的定义:   GET POST 后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数据 ...

  10. JDBC基础篇(MYSQL)——自定义JDBCUtil工具类

    package util; import java.io.File; import java.io.InputStream; import java.sql.Connection; import ja ...