Libreswan软件的密钥协商协议IKEv1主模式实现分析

1 协商过程

IKEv1(互联网密钥交换协议第一版)是IPsec VPN隧道协商使用的标准密钥协商协议,其协商过程如下图所示。

总共来回交互6次消息。第一、第二消息用来双方协商在本次密钥交换过程中使用的保护策略,由发起方提供议案(Proposal),响应方从众多议案中选择其中一条作为本次协商使用;第三、第四条消息交换DH公钥以及使用对方公钥加密的各自的ID以及Nonce信息,通过这些信息建立共享密钥。其中HASH(1)代表对发起方用来加密使用的数字证书进行hash运算(hash函数由SA协商)产生的hash数据。第五、第六两条消息携带各自的加密后的认证内容验证共享密钥是否正确。该模式要求双方提前拥有对方的公钥信息。

2 主要函数

Libreswan是一款主流的IPsec VPN开源软件,其IKEv1主模式协商主要包含以下几个函数:

发起方

main_outI1

main_inR1_outI2

main_inR2_outI3

main_inR3

响应方

main_inI1_outR1

main_inI2_outR2

main_inI3_outR3

3 main_outI1发起方发送MI1消息

main_outI1生成发起方的state,构造HDR、SA、VID载荷,并发送出去。

关键函数:

生成state:new_state

初始化state并插入statetable中:initialize_new_state

构造HDR:out_struct

构造SA载荷:ikev1_out_sa

构造pluto VID载荷:ikev1_out_generic_raw

构造DPD/IKE分片/XAUTH VID载荷:out_vid

record_and_send_ike_msg()

4 main_inI1_outR1响应方处理MI1消息,发送MR1消息

main_inI1_outR1根据IP地址和端口号查找连接,生成响应方的state,解析MI1中的SA载荷,构造HDR、SA、VID载荷。

关键函数:

查找连接:find_host_connection

生成响应方的state :new_rstate

将生成的state插入statetable中:insert_state

构造HDR:out_struct

构造SA头部:out_struct

解析发起方SA并构造SA主体:parse_isakmp_sa_body

构造pluto VID载荷:ikev1_out_generic_raw

构造DPD/IKE分片/XAUTH/NAT-T VID载荷out_vid

5 main_inR1_outI2发起方处理MR1消息,发送MI2消息

main_inR1_outI2解析响应方SA,生成一个pluto_crypto_req_cont变量ke挂起state,调用build_ke_and_nonce构造ke和nonce。

build_ke_and_nonce生成一个pluto_crypto_req请求rd,调用send_crypto_helper_request计算ke和nonce值保存在rd请求中。

send_crypto_helper_request计算ke和nonce值保存在rd请求中,并调用ke中的回调函数main_inR1_outI2_continue。

main_inR1_outI2_continue恢复挂起的state,并调用main_inR1_outI2_tail和complete_v1_state_transition。

main_inR1_outI2_tail构造HDR、KE、Ni、NAT-D载荷,重新插入st到statetable中。

关键函数:

解析响应方:parse_isakmp_sa_body

构造ke_nonce请求:build_ke_and_nonce

执行ke_nonce计算:send_crypto_helper_request

返回HDR:ikev1_echo_hdr

构造KE载荷:ikev1_ship_KE

构造Ni载荷:ikev1_ship_nonce

完成状态转移并发送数据包:complete_v1_state_transition

6 main_inI2_outR2响应方处理MI2消息,发送MR2消息

main_inI2_outR2解析MI2消息中的KE和Ni载荷,生成pluto_crypto_req_cont变量ke挂起state,调用build_ke_and_nonce。

build_ke_and_nonce生成pluto_crypto_req请求rd,调用send_crypto_helper_request。

send_crypto_helper_request执行ke和nonce计算,完成后调用回调函数main_inI2_outR2_continue。

main_inI2_outR2_continue恢复挂起的st,调用main_inI2_outR2_tail和complete_v1_state_transition。

main_inI2_outR2_tail构造HDR、KE、Nr、CR证书请求、NAT-D载荷,生成pluto_crypto_req_cont变量dh,并调用start_dh_secrteiv执行dh计算。

start_dh_secrteiv生成pluto_crypto_req dh计算请求r,调用send_crypto_helper_request。

send_crypto_helper_request会计算4个skeyid,并保存在r中,计算结束后调用dh中的回调函数main_inI2_outR2_calcdone。

main_inI2_outR2_calcdone会检查st->st_suspended_md是否为NULL。

关键函数:

解析KE载荷:accept_KE

解析nonce载荷:accept_v1_nonce

构造ke_nonce请求build_ke_and_nonce

完成状态转移并发送数据包:complete_v1_state_transition

返回HDR:ikev1_echo_hdr

构造KE载荷:ikev1_ship_KE

构造Ni载荷:ikev1_ship_nonce

构造CR载荷:ikev1_build_and_ship_CR

构造DH计算请求:start_dh_secretiv

执行DH计算:send_crypto_helper_request

7 main_inR2_outI3发起方处理MR2消息,发送MI3消息(加密)

main_inR2_outI3解析MR2消息中的KE和Nr载荷,生成pluto_crypto_req_cont变量dh,并调用start_dh_secrteiv执行dh计算。

start_dh_secrteiv生成pluto_crypto_req dh计算请求r,调用send_crypto_helper_request。

send_crypto_helper_request会计算4个skeyid,并保存在r中,计算结束后调用dh中的回调函数main_inR2_outI3_cryptotail。

main_inR2_outI3_cryptotail恢复挂起的state,依次调用main_inR2_outI3_continue和complete_v1_state_transition。

main_inR2_outI3_continue解析证书请求,查找证书,构造ID、CERT、CR、HASH_I(或SIG_I)载荷,并加密以上载荷。由于smc->first_out_payload != ISAKMP_NEXT_NONE,HDR已经在process_v1_packet的process_packet_tail中构造。

关键函数:

解析KE载荷:accept_KE

解析nonce载荷:accept_v1_nonce

构造DH计算请求:start_dh_secretiv

解析证书请求:ikev1_decode_cr

查找证书:doi_log_cert_thinking

构造ID载荷:build_id_payload

构造CERT载荷:ikev1_ship_CERT

构造CR载荷:ikev1_build_and_ship_CR

计算载荷的hash值:main_mode_hash

对hash值进行RSA签名:RSA_sign_hash

加密载荷:encrypt_message

8 main_inI3_outR3响应方处理MI3消息,发送MR3消息(加密)

main_inI3_outR3验证MI3的签名,构造HDR、ID、CERT、HASH_R(或SIG_R)载荷,并加密以上载荷。生成Phase2的初始化向量IV。发起方à响应方的ISAKMP_SA建立完成。

关键函数:

验证签名:oakley_id_and_auth

查找证书:doi_log_cert_thinking

返回HDR:ikev1_echo_hdr

构造ID载荷:build_id_payload

构造证书载荷:ikev1_ship_CERT

计算载荷的hash值:main_mode_hash

对hash值进行RSA签名:RSA_sign_hash

加密载荷:encrypt_message

生成IV:set_ph1_iv_from_new

单方向ISAKMP_SA建立完成:ISAKMP_SA_established

9 main_inR3发起方处理MR3消息

main_inR3直接调用main_inR3_tail。

main_inR3_tail中验证MR3的签名,响应方à发起方的ISAKMP_SA建立完成。生成Phase2的初始化向量IV。

关键函数:

验证签名:oakley_id_and_auth

单方向ISAKMP_SA建立完成:ISAKMP_SA_established

生成IV:set_ph1_iv_from_new

Libreswan软件的密钥协商协议IKEv1主模式实现分析的更多相关文章

  1. HTTPS 和 SSL/TLS 协议:密钥交换(密钥协商)算法及其原理

    转自:https://blog.csdn.net/andylau00j/article/details/54583769 本系列的前一篇,咱们聊了“密钥交换的难点”以及“证书体系”的必要性.今天这篇来 ...

  2. SSL密钥协商过程分析

    一.说明 尽管做过证书生成.双向认证.SSL通信编程等事情,但一直不清楚SSL如何完成密钥交换.看网上的资料则众说纷纭,最近和朋友学习时聊到了这个问题,然后正巧上周处理客户反馈SSL版本过低时领导也想 ...

  3. SSL/TLS/WTLS原理(密钥协商的形象化比喻:验证服务器的身份,用服务器的公钥协商加密格式,然后再加密具体的消息,TCP传递SSL处理后的数据)good

    一 前言 首先要澄清一下名字的混淆: 1 SSL(Secure Socket Layer)是netscape公司设计的主要用于web的安全传输协议.这种协议在WEB上获得了广泛的应用. 2 IETF( ...

  4. Diffie-Hellman密钥协商算法

    一.概述 Diffie-Hellman密钥协商算法主要解决秘钥配送问题,本身并非用来加密用的:该算法其背后有对应数学理论做支撑,简单来讲就是构造一个复杂的计算难题,使得对该问题的求解在现实的时间内无法 ...

  5. 第三十个知识点:大致简述密钥协商中的BR安全定义。

    第三十个知识点:大致简述密钥协商中的BR安全定义. 在两方之间建密钥共享是一件密码学中古老的问题.就算只考虑定义也比标准加密困难的多.尽管古典的Diffie-Hellman协议在1976年思路解决了这 ...

  6. 分析DH加密算法,一种适基于密钥一致协议的加密算法。

    DH Diffie-Hellman算法(D-H算法),密钥一致协议.是由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想.简单的说就是允许两名用户在公开媒体上交换信息以生成&quo ...

  7. Nginx+keepalived 高可用双机热备(主从模式/双主模式)

    基础介绍负载均衡技术对于一个网站尤其是大型网站的web服务器集群来说是至关重要的!做好负载均衡架构,可以实现故障转移和高可用环境,避免单点故障,保证网站健康持续运行. 关于负载均衡介绍,可以参考:li ...

  8. MySQL+MGR 单主模式和多主模式的集群环境 - 部署手册 (Centos7.5)

    MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案.MGR是MySQL官方在5.7.17版本引进的一个数据库高可用与 ...

  9. Mysql Group Replication 简介及单主模式组复制配置【转】

    一 Mysql Group Replication简介    Mysql Group Replication(MGR)是一个全新的高可用和高扩张的MySQL集群服务.    高一致性,基于原生复制及p ...

随机推荐

  1. 今晚的两道 bc

    第一道题  Beautiful Palindrome Number ,简单组合计数问题,手算打表就好~大概十五分钟左右搞定[第一次 提交竟然 wa了一次 有一个小小的坑在那.... /******** ...

  2. JQuery 日期选择框

    一    jeDate日期控件,关于官方的文档请查看: http://www.jayui.com/jedate/ 1 引入js文件 <script type="text/javascr ...

  3. Tarjan求桥

    传送门(poj3177) 这道题是Tarjan求桥的模板题.大意是要求在原图上加上数量最少的边,使得整张图成为一个边双联通分量. 具体的做法是,先在图中求出所有的桥,之后把边双联通分量缩成点,这样的话 ...

  4. 洛谷 P1131 [ ZJOI 2007 ] 时态同步 —— 树形DP

    题目:https://www.luogu.org/problemnew/show/P1131 记录 x 子树内同步的时间 f[x],同步所需代价 g[x]: 直接转移即可,让该儿子子树与其它儿子同步, ...

  5. POJ1912 A highway and the seven dwarfs (判断凸包与直线相交 logn)

    POJ1912 给定n个点 和若干条直线,判断对于一条直线,是否存在两个点在直线的两侧. 显然原命题等价于 凸包与直线是否相交. O(n)的算法是显而易见的 但是直线数量太多 就会复杂到O(n^2)由 ...

  6. SYSUCPC2017 online round La La string 应用manacher算法

    manacher算法给出一个字符串中 以每个位置为对称中心的回文串长度,但是大部分时候我们只需要知道以每个位置为起点的回文串长度,感觉有点浪费. 那么来看看这个不难也不太简单的题目 第一步,我们要想办 ...

  7. 关于file文件操作的头文件 【LINUX】 (转载)

    转自:http://blog.csdn.net/figo77ll/article/details/3156052 Linux下如果要对文件进行读取访问,需要包含至少以下两个头文件: #inlcude ...

  8. bzoj 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏【Floyd】

    先跑一遍取max版的Floyd,直接用数组回答询问即可 #include<iostream> #include<cstdio> using namespace std; con ...

  9. BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)

    题目好神仙--这个叫长链剖分的玩意儿更神仙-- 考虑dp,设\(f[i][j]\)表示以\(i\)为根的子树中到\(i\)的距离为\(j\)的点的个数,\(g[i][j]\)表示\(i\)的子树中有\ ...

  10. java entity

    对java实体类的众多理解: A .就是属性类,通常定义在model层里面 B. 一般的实体类对应一个数据表,其中的属性对应数据表中的字段.好处:1.对对象实体的封装,体现OO思想.2.属性可以对字段 ...