openswan klips数据加解密过程
本文档的Copyleft归rosetta所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性。
klips实现IP数据包的安全接受或发送的进程。在内核域中运行,主要负责控制管理SA及密钥,同时处理数据包的加密和解密工作。
数据加密过程:
ipsec_tunnel_start_xmit()
->ipsec_xmit_encap_bundle()
->ipsec_sa_getbyid()//获取sa
->ipsec_xmit_encap_once()
->ipsec_alg_esp_encrypt()
->struct ipsec_alg_enc *ixt_e=sa_p->ips_alg_enc
->ixt_e->ixt_e_cbc_encrypt()//真正的加密处理
//此加密函数指针是在ipsec_xmit_encap_bundle()中获取sa后赋的值。
// ixt_e=ixs->ipsp->ips_alg_enc;
->ipsec_tunnel_send()//发送数据
->NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, ixs->skb, NULL, ixs->route->u.dst.dev,ipsec_tunnel_xmit2);
//这里安装一个发包勾子。最终数据由ipsec_tunnel_xmit2发出。
数据解密过程(以esp为例):
ipsec_rcv()
->ipsec_rcv_decap()
->ipsec_rcv_decap_once()//proto_funcs = esp_xform_funcs(当然这里还有ah,ipcomp对应的结构体指针赋值)
->proto_funcs->rcv_checks
->proto_funcs->rcv_setup_auth
->proto_funcs->rcv_decrypt
解完密后由 netif_rx(irs->skb);发送给上层协议栈处理。