版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1.引言1.1本說明書提供了freeswan各個模塊部件的說明,以供編碼 具體實現(xiàn)及今后的維護工作。2.總體設(shè)計2.1IPSec的要求;目標系統(tǒng)的服務(wù)器端一定要建立在具有的內(nèi)核操作系統(tǒng)之上;目標系統(tǒng)的客戶端使用方便、界面友好、配置和管理簡單靈活。2.2軟件結(jié)構(gòu)該軟件由如下幾個模塊組成:空間)Pluto1.引言1.1本說明書提供了freeswan各個模塊部件的說明,以供編碼 具體實現(xiàn)及今后的維護工作。2.總體設(shè)計2.1IPSec的要求;目標系統(tǒng)的服務(wù)器端一定要建立在具有的內(nèi)核操作系統(tǒng)之上;目標系統(tǒng)的客戶端使用方便、界面友好、配置和管理簡單靈活。2.2軟件結(jié)構(gòu)該軟件由如下幾個模塊組成:空間)PlutoIKE的協(xié)商(運行在用戶空間)PF_KEYpfkey2SA3.程序描述3.1源代碼文件組成和密鑰的管理工作,以及對數(shù)據(jù)報的加密、 源文件目錄|―――freeswan|――klips|――libdes|――pluto|――utils3.2KLIPS(內(nèi)核IPsec)詳細設(shè)計--―――klipsipsec|――net|――ipsec|――ipsec_init.c登記模塊,并初始化|――ipsec_tunnel.數(shù)據(jù)包的處理并模塊|――ipsec_rcv.c數(shù)據(jù)包接收并處理模塊|――ipsec_xform.cSA|――ipsec_sha1.csha1sha1.c|――ipsec_md5c.cmd5.c|――ipcomp.c|――radij.cradix|――ipsec_radij.c對上個文件的改編|――pfkey_v2.cPF_KEY2|――pfkey_v2_parser.c對上個文件的改編|――sysctl_net_ipsec.c|――utils|――eroute.ceroute|――spi.c|――libdes|――pluto|――utils3.2KLIPS(內(nèi)核IPsec)詳細設(shè)計--―――klipsipsec|――net|――ipsec|――ipsec_init.c登記模塊,并初始化|――ipsec_tunnel.數(shù)據(jù)包的處理并模塊|――ipsec_rcv.c數(shù)據(jù)包接收并處理模塊|――ipsec_xform.cSA|――ipsec_sha1.csha1sha1.c|――ipsec_md5c.cmd5.c|――ipcomp.c|――radij.cradix|――ipsec_radij.c對上個文件的改編|――pfkey_v2.cPF_KEY2|――pfkey_v2_parser.c對上個文件的改編|――sysctl_net_ipsec.c|――utils|――eroute.ceroute|――spi.cSA|――spigrp.c同上|――tncfg.c用戶操作虛接口的模塊|――klipsdebug.c..1.1向內(nèi)核系統(tǒng)登記幾個proc安全虛接口的狀況;初始化SA(tb鏈;初始化SPDB數(shù)據(jù)庫eroute表;初始化pf_ky(PF_EY;.2虛接口的狀況;初始化SA(tb鏈;初始化SPDB數(shù)據(jù)庫eroute表;初始化pf_ky(PF_EY;.2ipsec_init.c:intipsec_init(void)ipsec_xform.c:ipsec_radij.c:pfkey_v2.c:intintintipsec_tdbinit(void)ipsec_radijinit(void)pfkey_init(void).1procproc安全的界面來存取如SA、eroutestructstructproc_dir_entryproc_dir_entryipsec_eroute;ipsec_spi;structproc_dir_entryipsec_spigrp;structstructproc_dir_entryproc_dir_entryipsec_tncfg;ipsec_spinew;structproc_dir_entryipsec_klipsdebug;.2notifier_blockinclude/linux/notifier.hstructnotifier_block{int(*notifier_call)(structnotifier_block*self,unsignedlong,void*);structnotifier_block*next;intpriority;};net/core/dev.cintregister_netdevice_notifier(structnotifier_block*nb){returnnotifier_chain_register(&netdev_chain,nb);}notifier_chain_registerinclude/linux/notifier.hexternintnotifier_chain_register(structnotifier_block**list,structnotifier_block*n){while(*list){if(n->priority>(*list)->priority)break;list=&((*list)->next);}n->next=*list;*list=n;return0;}顯然就是根據(jù)每個block的優(yōu)先級把這個block排列在一個block的鏈表里面,在notifier_chain_registernetdev_chain表的作用就是在每個interfaceioctlregister_netdevice_notifierinterfacenotifier_chain_registerinclude/linux/notifier.hexternintnotifier_chain_register(structnotifier_block**list,structnotifier_block*n){while(*list){if(n->priority>(*list)->priority)break;list=&((*list)->next);}n->next=*list;*list=n;return0;}顯然就是根據(jù)每個block的優(yōu)先級把這個block排列在一個block的鏈表里面,在notifier_chain_registernetdev_chain表的作用就是在每個interfaceioctlregister_netdevice_notifierinterfacenotifier_call.3inet_protocolstructinet_protocolah_protocol={ipsec_rcv,/*AHhandler,定義此協(xié)議處理函數(shù)*/NULL,/*TUNNELerrorcontrol,錯誤處理函數(shù)*/0,/*next*/IPPROTO_AH,/*protocolID*/0,/*copy*/NULL,/*data*/"AH"/*name*/};copy用來協(xié)議共享的,這個以后再說,datastructinet_protocolesp_protocolinet_add_protocolnet/ipv4/protocol.cvoidinet_add_protocol(structinet_protocol*prot){unsignedcharhash;structinet_protocol*p2;hash=prot->protocol&(MAX_INET_PROTOSstructinet_protocolesp_protocolinet_add_protocolnet/ipv4/protocol.cvoidinet_add_protocol(structinet_protocol*prot){unsignedcharhash;structinet_protocol*p2;hash=prot->protocol&(MAX_INET_PROTOS-1);prot->next=inet_protos[hash];inet_protos[hash]=prot;prot->copy=0;p2=(structinet_protocol*)prot->next;while(p2!=NULL){if(p2->protocol==prot->protocol){prot->copy=1;break;}p2=(structinet_protocol*)p2->next;}}hashhashhash表加鏈表的方式每個協(xié)議結(jié)構(gòu)體。登記及初始化模塊包括以下一些函數(shù):init_modules(),ipsec_init(),cleanup_module(),ipsec_cleanup(),ipsec_eroute_get_info(),ipsec_spi_get_info(),ipsec_spigrp_get_info(),ipsec_tncfg_get_info(),ipsec_version_get_info(),ipsec_spi_get_new().1intinit_module(void)目的:參數(shù):返回值:算法描述:ipsec無0――初始化0ipsec_init()。.2intcleanup_module(void)目的:ipsec參數(shù):無返回值:算法描述:0――初始化ipsec_cleanup()。.3intipsec_int(void)目的:ipsec參數(shù):無返回值:算法描述:0――初始化1..1intinit_module(void)目的:參數(shù):返回值:算法描述:ipsec無0――初始化0ipsec_init()。.2intcleanup_module(void)目的:ipsec參數(shù):無返回值:算法描述:0――初始化ipsec_cleanup()。.3intipsec_int(void)目的:ipsec參數(shù):無返回值:算法描述:0――初始化1.proc_dir_entry到系統(tǒng)中,如:proc_register(proc_net,&ipsec_eroute);/*PROC_FS_21*/或proc_register_dynamic(&proc_net,&ipsec_eroute);或proc_net_create(“ipsec_eroute”,0,ipsec_eroute_get_info);proc_net資料。2.ipsec_tdbinit()SAipsec_tdb.cpfkey_initPFKEYpfkey_v2.c函數(shù)向系統(tǒng)中已定義的ipsec_dev_notifier,register_netdevice_ntifier()為系統(tǒng)調(diào)用;6.inet_add_protocol(&esp_protocol)inet_add_protocol(&ah_protocol)函數(shù)向系統(tǒng)中,inet_add_protocol()為系統(tǒng)調(diào)用;7.ipsec_tunnel_init_devices()ipsecipsec_tunnel.c.4intipsec_cleanup(void)目的:參數(shù):返回值:算法描述:ipsec無0――清除01.ipsec_tunnel_cleanup_device(void)ipsecipsec_xform.c2.inet_del_protocol(&ah_protocol)inet_del_protocol(&esp_protocol)清除掉在系統(tǒng)中ESPAH.4intipsec_cleanup(void)目的:參數(shù):返回值:算法描述:ipsec無0――清除01.ipsec_tunnel_cleanup_device(void)ipsecipsec_xform.c2.inet_del_protocol(&ah_protocol)inet_del_protocol(&esp_protocol)清除掉在系統(tǒng)中ESPAHipsec_dev_notifier;5ipsec_radijcleanup()清除系統(tǒng)中的SPDipsec_radij.c實現(xiàn);6.pfkey_cleanup()pfkey7.proc_net_unregisterfreeswanproc..1.1(該程序類似于網(wǎng)卡驅(qū)動程序的編寫).2文件ipsec_tunnel.c.1devicestructdevicestaticstructdevicedev_ipsec0={"ipsec0\00,0,",/*/*/*namerecvrecv*/memoryend*/memorystart*/0,0,0x0,/*/*/*memoryend*/memorystart*/basestaticstructdevicedev_ipsec0={"ipsec0\00,0,",/*/*/*namerecvrecv*/memoryend*/memorystart*/0,0,0x0,/*/*/*memoryend*/memorystart*/baseI/Oaddress*/0,0,0,NULL,/*IRQ*//*flags*/nextdevice*/0,/*ipsec_tunnel_probe};/*setup*/.2ipsecprivstructipsecpriv{structstructsk_buff_headsendq;device*dev;structwait_queue*wait_queue;charintlocked;(*hard_start_xmit)(structsk_buff*skb,structdevice*dev);int(*hard_header)(structsk_buff*skb,structdevice*dev,unsignedshorttype,void*daddr,void*saddr,unsignedlen);#ifdefNET_21int(*rebuild_header)(structsk_buff*skb);#else/*NET_21*/int(*rebuild_header)(void*buff,structdevice*dev,unsignedlongraddr,structsk_buff*skb);#endif/*NET_21*/int(*set_mac_address)(structdevice*dev,void*addr);#ifndefNET_21void(*header_cache_bind)(structhh_cache**hhp,structdevice*dev,unsignedshorthtype,u32daddr);#endif/*!NET_21*/void(*header_cache_update)(structhh_cache*hh,structdevice*dev,unsignedchar*haddr);structenet_statistics*(*get_stats)(structdevice*dev);structenet_statisticsint(*set_mac_address)(structdevice*dev,void*addr);#ifndefNET_21void(*header_cache_bind)(structhh_cache**hhp,structdevice*dev,unsignedshorthtype,u32daddr);#endif/*!NET_21*/void(*header_cache_update)(structhh_cache*hh,structdevice*dev,unsignedchar*haddr);structenet_statistics*(*get_stats)(structdevice*dev);structenet_statisticsmystats;thedesiredMTU?*/intmtu;};/*Whatis.1intipsec_tunnel_init_devices(void)目的:登記ipsec參數(shù):無返回值: 0――登記算法描述:0register_netdev(&dev_ipsec0~34ipsec.2intipsec_tunnel_init(structdevice*dev)目的:ipsecdevice的申請。參數(shù):返回值:0――清除0算法描述:1.devicea)dev->open=ipsec_tunnel_open;b)dev->stop=ipsec_tunnel_stop;c)dev->hard_start_xmit=ipsec_tunnel_start_xmit;d)dev->get_stats =ipsec_tunnel_get_stats;2.dev,dev->privkmalloc(sizeof(structipsecpriv),GFP_KERNEL);3.devskb_queue_head_init(&dev->buffs[i]);4.dev:dev->set_mac_address=NULL.3 intipsec_tunnel_attach(structdevice*tndev,structipsecpriv*prv,structdevice*dev)目的:將某個虛接口綁定到指定的物理接口上。參數(shù):返回值:算法描述:0――綁定0.4intipsec_open(structdevice*dev)目的:參數(shù):opendevice返回值:算法描述:0――open0―open此方法在網(wǎng)絡(luò)設(shè)備驅(qū)動程序里是網(wǎng)絡(luò)設(shè)備被激活的時候被調(diào)用(即設(shè)備狀態(tài)由.3 intipsec_tunnel_attach(structdevice*tndev,structipsecpriv*prv,structdevice*dev)目的:將某個虛接口綁定到指定的物理接口上。參數(shù):返回值:算法描述:0――綁定0.4intipsec_open(structdevice*dev)目的:參數(shù):opendevice返回值:算法描述:0――open0―open此方法在網(wǎng)絡(luò)設(shè)備驅(qū)動程序里是網(wǎng)絡(luò)設(shè)備被激活的時候被調(diào)用(即設(shè)備狀態(tài)由down->up。MOD_INC_USE_COUNT.5intipsec_tunnel_start_xmit(structsk_buff*skb,structdevice*dev)目的:假定此函數(shù)由dev_queue_xmit()函數(shù)調(diào)用,主要負責tcp/udp的數(shù)據(jù)包參數(shù):dev_queue_xmit(skb,及要發(fā)往的網(wǎng)絡(luò)接口返回值: 0――open0―open算法描述:prvdev->privipsecprvphysdev,physmtu,stats;2.如果需要,拷貝skb:IfdefNET_21,thenskb_cloned(skb);3.Ipiph,IPV4,若不是則丟棄;4.(hard_hader_le;5.ttl6.填充查找鍵鍵值,根據(jù)鍵值查找eroute表,獲取eroute,若找到,取出SA,即outgonging_said;7.此PIKE(UPport5008.進入封裝處理大循環(huán)(outgoing_saidsaid多個tdb(tdb:(1)checkforDROPormissingeroute(2)(3)checkcheckforforREJECTeroutePASSeroute(4)(5)(6)checkcheckforforHOLDTRAPerouteeroute,signalPF_KEY,swaptoHOLDerouteacquirelockforwalkingtdbchain(7)1)2)calculateheadroomrequiredforchaincheckcheckififSAisinlarval,dropSAisdead,drop3)4)5)check(2)(3)checkcheckforforREJECTeroutePASSeroute(4)(5)(6)checkcheckforforHOLDTRAPerouteeroute,signalPF_KEY,swaptoHOLDerouteacquirelockforwalkingtdbchain(7)1)2)calculateheadroomrequiredforchaincheckcheckififSAisinlarval,dropSAisdead,drop3)4)5)checkcheckififreplayoverflowed,expireSAlifetimecountershaveoverflowed,expireSAswitchonprotocoltype,tocalculateheadroomsize.I.(8)(9)ifESPswitchonprotocoltypetocalculatetailroomsize.alculatemtudiff,sendICMPfragmentneeded.Mark``note2''ackMSSifdesired(10)(11)copyupper(layer2)headertosafetyifitwaspresentcheckifdatafitsinexistingskb,elseexpand.(12)applygroupedtransforms1)2)applydisasterof#ifdefs.switchbyprotocoltype,calculateheadroomforthisstageI.ifESP,thenswitchbyciphergetheadroomII.3)ifESP,thenswitchbyhashtogettailroomdoublecheck(notinNDEBUG)ifthereisenoughheadroom4)pushthedataahead5)6)doubleextendcheck(notinNDEBUG)thedatabehindifthereisenoughtailroom7)seeifpackethasbecolong(biggerthan64K)8)9)finallymovetheplaintextasappropriateswitchonprotocoltype10)case:ESPI.II.switchprepareonciphertype,prepareIVself-describingpaddingIII.switchonciphertype,doencryptionIV.V.switchonciphertype,updateIVswitchonhashtype,doauthentication11)I.case:AHprepreplayinfo,headroomII.12)13)switchonhashtype,doauthenticationcase:case:IPIP,applyencapIPCOMPI.II.14)callskb_compressdosomedebuggingrecalculateheaderchecksum⒀lookuperoutechangedbynewouterheader,ifwefoundsomethingandthesrc/dsthave9.endICMPifpackethasbecobig11)I.case:AHprepreplayinfo,headroomII.12)13)switchonhashtype,doauthenticationcase:case:IPIP,applyencapIPCOMPI.II.14)callskb_compressdosomedebuggingrecalculateheaderchecksum⒀lookuperoutechangedbynewouterheader,ifwefoundsomethingandthesrc/dsthave9.endICMPifpackethasbecobig10.11.12.re-applylinklayerheaderiftherewasone.thepacketattempttore-routedroppacketifnewrouteleadstousagain.13.14.doconnectiontrackingdonetfilterlocaloutoutputcall15.callip_sendorIP_SENDdependingonkernelversion⑴.dst,src,iphlen,pyldsz,⑵.接下來是一系列和安全性檢查,對不合理部分有兩種處理方法:1)2)丟棄數(shù)據(jù)包,返回。并返回;⑶.eroutephysdev⑷.⑸.spi1),返回;根據(jù)saidtdbpsa_lentdbp⑹.進入tdbipsecheadroomtailroom;tdbptdb①大量的tdb,SAPFKEYv2②tdbp->tdb_to計算headroom和tailroomtdb_toIPPROTO_AH:headroom+=sizeof(structah);IPPROTO_ESP:Ⅰ.tdbp->tdb_encalg(加密算法)ESP_DES:headroom+=sizeof(structesp);ESP_3DES:headroom+=sizeof(structesp);ESP_NULL:headroom+=offsetof(structesp,esp_iv);?????default:丟棄包。Ⅱ.tdbp->tdb_autoalg(認證算法)AH_MD5:ESP_3DES:headroom+=sizeof(structesp);ESP_NULL:headroom+=offsetof(structesp,esp_iv);?????default:丟棄包。Ⅱ.tdbp->tdb_autoalg(認證算法)AH_MD5:tailroomAHHMAC_HASHLEN;AH_SHA:tailroom+=AHHMAC_HASHLEN;AH_NONE:NP(default:16()tailroom+=((8-((pyldsz+2*sizeof(unsignedchar))%8))%8)+2;IPPROTO_IPIP:headroom+=sizeof(structiphdr);default:出錯,丟棄。最后,對鏈表中每一個tdb求出的headroom、tailroom求和得出max_headroom、max_tailrom,pyldz(headoom,tailroom(Ln106)⑺.tot_hadroom,tot_tairoom,m_diffmtu_dff>rv->mtu計算不合適,重新計算;⑻.⑼.mss;hard_eader_sripped(Ln107)⑽.skbskbextend_copy;⑾.①tdbipsec定義變量并賦初值;②根據(jù)tdbp->tdb_toheadroom,tailroom;與(6)的處理類似。③④處理skb,移動數(shù)據(jù)指針(skb_push,skb_put函數(shù));ip⑤根據(jù)不同的協(xié)議類型進行不同的處理:switch(tdbp->tdb_to)IPPROTO_ESP:填寫esppspi,rl,...;iv[0],iv[1](初始化向量?);idat,ilen(內(nèi)部數(shù)據(jù)區(qū)域?)要加密的數(shù)據(jù)地址及長度;求出pad,pdlen.(padpad長度和前iph->prtocol.tdbp->tdb_encalgESP_DES:des_cbc_encrypt(idat,idat,ilen,(caddr_t)tdbp->tdb_key_e,(caddr_t)iv,1);ESP_3DES:des_ede3_cbc_encrypt(idat,des_eks*)(tdbp->tdb_key_e))[0]),idat,ilen,(caddr_t)(&((struct(caddr_t)(&((structdes_eks*)(tdbp->tdb_key_e))[1]),(caddr_t)(&((structdes_eks*)(tdbp->tdb_key_e))[2]),(caddr_t)iv,1);tdbp->tdb_encalgAH_MD5:AH_SHA:IPPROTO_AH:ahp;...AH_MD5:AH_SHA:IPPROTO_IPIP:IP⑥⑿.des_cbc_encrypt(idat,idat,ilen,(caddr_t)tdbp->tdb_key_e,(caddr_t)iv,1);ESP_3DES:des_ede3_cbc_encrypt(idat,des_eks*)(tdbp->tdb_key_e))[0]),idat,ilen,(caddr_t)(&((struct(caddr_t)(&((structdes_eks*)(tdbp->tdb_key_e))[1]),(caddr_t)(&((structdes_eks*)(tdbp->tdb_key_e))[2]),(caddr_t)iv,1);tdbp->tdb_encalgAH_MD5:AH_SHA:IPPROTO_AH:ahp;...AH_MD5:AH_SHA:IPPROTO_IPIP:IP⑥⑿.計算IPskb,tdber;⒀.還要繼續(xù)循環(huán)嗎?⒁.while(/*((orgdst!=newdst)||(orgsrc!=newsrc))*/(orgedst!=outgoing_said.dst.s_addr)&&outgoing_said.dst.s_addr&&er);⒂.硬件頭處理;⒃.⒄.求物理接口,尋路由;。ip_send(skb).6intipsec_tunnel_detach(structdevice*dev,structipsecpriv*prv)目的:將某個綁定了的虛接口解除綁定。參數(shù):返回值:算法描述:0――0prv.7intipsec_tunnel_clear(void)目的:清除所有的綁定虛接口。參數(shù):無返回值:算法描述:0――0prv.8intipsec_tunnel_cleanup_devices(void)目的:清除4個 虛接口。參數(shù):返回值:算法描述:0――0prv.8intipsec_tunnel_cleanup_devices(void)目的:清除4個 虛接口。參數(shù):無返回值: 0――清除算法描述:01.unregister_netdev(&dev_ipsec0~3)清除虛擬接口;2.調(diào)用系統(tǒng)調(diào)用kfree_s(dev_ipsec0~3.priv,sizeof(structipsecpriv))為虛接口分配的空間。..1.1ipsec.2文件ipsec_rcv.c.33-1處理IPSe本地包繞過轉(zhuǎn)發(fā)到本網(wǎng)IP路由關(guān)內(nèi)的包策略處理鏈路層包正常包處理包處理鏈路層3.1傳統(tǒng)IPSec網(wǎng)關(guān)接收和轉(zhuǎn)發(fā)包示意圖圖.1intipsec_rcv(structsk_buff*skb,unsighedshortxlen)目的:接收并處理ipsec參數(shù):skb-接收到的數(shù)據(jù)包,xlen返回值:算法描述:0――登記 ,非0值――登記未1.SKB;2.如果包被克隆過,對包進行一個留頭處理,為后面做準備;3.AHESP(只支持這兩種格式)?不是則丟棄包;4.進入解報循環(huán);⑴是SP4(因ESP;物理接口驅(qū)動物理接口驅(qū)動鏈路層接收包IP分片處理丟棄應用查找SA庫根據(jù)SAIPSec處理檢查SA狀態(tài)、重播窗口、生存期IP路由檢查S態(tài)、生根據(jù)SA進行處理進入加密查找S正常包包處理A庫策略處理A狀存期進行處理處理IPSe本地包繞過轉(zhuǎn)發(fā)到本網(wǎng)IP路由關(guān)內(nèi)的包策略處理鏈路層包正常包處理包處理鏈路層3.1傳統(tǒng)IPSec網(wǎng)關(guān)接收和轉(zhuǎn)發(fā)包示意圖圖.1intipsec_rcv(structsk_buff*skb,unsighedshortxlen)目的:接收并處理ipsec參數(shù):skb-接收到的數(shù)據(jù)包,xlen返回值:算法描述:0――登記 ,非0值――登記未1.SKB;2.如果包被克隆過,對包進行一個留頭處理,為后面做準備;3.AHESP(只支持這兩種格式)?不是則丟棄包;4.進入解報循環(huán);⑴是SP4(因ESP;物理接口驅(qū)動物理接口驅(qū)動鏈路層接收包IP分片處理丟棄應用查找SA庫根據(jù)SAIPSec處理檢查SA狀態(tài)、重播窗口、生存期IP路由檢查S態(tài)、生根據(jù)SA進行處理進入加密查找S正常包包處理A庫策略處理A狀存期進行處理c處理認證分片重組處理重組外出包加認證傳輸層處理⑵ESP或Hsaid(spi,poto,等;⑶AH⑷⑸tdbp(DB頭⑹tdblarval,dead以及超時(有多種情況)均將丟棄包;⑺tdbp->tdb_authalg⑻ESP;⑼IP⑽;(中間丟棄包時也先)⑾IPSec5.tdb6.IPnetifrx(skb)。3.2.4的管理模塊.1SA⑵ESP或Hsaid(spi,poto,等;⑶AH⑷⑸tdbp(DB頭⑹tdblarval,dead以及超時(有多種情況)均將丟棄包;⑺tdbp->tdb_authalg⑻ESP;⑼IP⑽;(中間丟棄包時也先)⑾IPSec5.tdb6.IPnetifrx(skb)。3.2.4的管理模塊.1SASA。.2ipsec_tdb.h,ipsec_tdb.c.1tdbstructtdb/*tunneldescriptorblock*/{structtdb*tdb_hnext;/*nextinhashchain*/structtdb*tdb_onext;/*nextinoutput*/structtdb*tdb_inext;/*nextininput(prev!)*/structifnet*tdb_rcvif;/*relatedrcvencapinterface*/structsa_idtdb_said;/*SAID*/u32#if1tdb_seq;/*seqnumofmsgthatsetthisSA*/tdb_pid;/*PIDofprocessthatsetthisSA*/structxformsw*tdb_xform;/*transformationtouse(hostorder)*/caddr_ttdb_xdata;/*transformationdata(opaque)*/#endifu8tdb_authalg;/*authalgorithmforthisSA*/u8tdb_encalg;/*encalgorithmforthisSA*/u32tdb_alg_errs;/*numberofalgorithmerrors*/u32tdb_auth_errs;/*numberofauthenticationerrors*/u32tdb_encsize_errs;/*numberofencryptionsizeerrors*/u32tdb_encpad_errs;/*numberofencryptionsizeerrors*/u32tdb_replaywin_errs;/*numberofpktsequenceerrors*/u8tdb_replaywin;/*replaywindowsize*/u8tdb_state;/*stateofSA*/u32tdb_replaywin_lastseq;/*lastpktsequencenum*/u64tdb_replaywin_bitmap;/*bitmapofreceivedpkts*/u32tdb_replaywin_maxdiff;/*umpktsequencedifference*/u32tdb_flags;/*genericxformflagsstructxformsw*tdb_xform;/*transformationtouse(hostorder)*/caddr_ttdb_xdata;/*transformationdata(opaque)*/#endifu8tdb_authalg;/*authalgorithmforthisSA*/u8tdb_encalg;/*encalgorithmforthisSA*/u32tdb_alg_errs;/*numberofalgorithmerrors*/u32tdb_auth_errs;/*numberofauthenticationerrors*/u32tdb_encsize_errs;/*numberofencryptionsizeerrors*/u32tdb_encpad_errs;/*numberofencryptionsizeerrors*/u32tdb_replaywin_errs;/*numberofpktsequenceerrors*/u8tdb_replaywin;/*replaywindowsize*/u8tdb_state;/*stateofSA*/u32tdb_replaywin_lastseq;/*lastpktsequencenum*/u64tdb_replaywin_bitmap;/*bitmapofreceivedpkts*/u32tdb_replaywin_maxdiff;/*umpktsequencedifference*/u32tdb_flags;/*genericxformflags*/u32tdb_lifetime_allocations_c;/*seerfc2367*/u32tdb_lifetime_allocations_s;u32tdb_lifetime_allocations_h;u64tdb_lifetime_bytes_c;u64tdb_lifetime_bytes_s;u64tdb_lifetime_bytes_h;u64tdb_lifetime_addtime_c;u64tdb_lifetime_addtime_s;u64tdb_lifetime_addtime_h;u64tdb_lifetime_usetime_c;u64tdb_lifetime_usetime_s;u64tdb_lifetime_usetime_h;u64tdb_lifetime_packets_c;u64tdb_lifetime_packets_s;u64tdb_lifetime_packets_h;u64tdb_lifetime_usetime_l;/*lasttimetransformwasused*/structsockaddr*tdb_addr_s;/*srcsockaddr*/structsockaddr*tdb_addr_d;/*dstsockaddr*/structsockaddr*tdb_addr_p;/*proxysockaddr*/u16tdb_addr_s_size;u16tdb_addr_d_size;u16tdb_addr_p_size;u16tdb_key_bits_a;/*sizeofauthkeyinbits*/u16tdb_auth_bits;/*sizeofauthenticatorinbits*/u16tdb_key_bits_e;/*sizeofenckeyinbits*/u16tdb_iv_bits;/*sizeofIVinbits*/u8tdb_iv_size;u16tdb_key_a_size;u16tdb_key_e_size;caddr_ttdb_key_a;/*authenticationkey*/caddr_ttdb_key_e;/*encryptionkey*/caddr_ttdb_iv;/*InitialisationVector*/u16tdb_ident_type_s;/*srcidentitytype*/u16tdb_ident_type_d;/*dstidentitytype*/u64tdb_ident_id_s;/*srcidentityid*/u64tdb_ident_id_d;/*dstidentityid*/u8tdb_ident_len_s;/*srcidentitytype*/u8tdb_ident_len_d;/*dstidentityu64tdb_lifetime_packets_h;u64tdb_lifetime_usetime_l;/*lasttimetransformwasused*/structsockaddr*tdb_addr_s;/*srcsockaddr*/structsockaddr*tdb_addr_d;/*dstsockaddr*/structsockaddr*tdb_addr_p;/*proxysockaddr*/u16tdb_addr_s_size;u16tdb_addr_d_size;u16tdb_addr_p_size;u16tdb_key_bits_a;/*sizeofauthkeyinbits*/u16tdb_auth_bits;/*sizeofauthenticatorinbits*/u16tdb_key_bits_e;/*sizeofenckeyinbits*/u16tdb_iv_bits;/*sizeofIVinbits*/u8tdb_iv_size;u16tdb_key_a_size;u16tdb_key_e_size;caddr_ttdb_key_a;/*authenticationkey*/caddr_ttdb_key_e;/*encryptionkey*/caddr_ttdb_iv;/*InitialisationVector*/u16tdb_ident_type_s;/*srcidentitytype*/u16tdb_ident_type_d;/*dstidentitytype*/u64tdb_ident_id_s;/*srcidentityid*/u64tdb_ident_id_d;/*dstidentityid*/u8tdb_ident_len_s;/*srcidentitytype*/u8tdb_ident_len_d;/*dstidentitytype*/caddr_ttdb_ident_data_s;/*srcidentitydata*/caddr_ttdb_ident_data_d;/*dstidentitydata*/#if0sens#endif};.1intipsec_tdbinit(void)目的:初始化tdb參數(shù):無返回值:算法描述:0――0tdb.2inttdb_init(structtdb*tdbp,structencap_msghdr*em)目的:參數(shù):返回值:算法描述:0――0.3intputtdb(structtdb*tdbp)目的:將一個新的tdb.1intipsec_tdbinit(void)目的:初始化tdb參數(shù):無返回值:算法描述:0――0tdb.2inttdb_init(structtdb*tdbp,structencap_msghdr*em)目的:參數(shù):返回值:算法描述:0――0.3intputtdb(structtdb*tdbp)目的:將一個新的tdbtdbptdbh參數(shù):tdbp――要添加的tdb返回值: 0――算法描述:0tdbp->tdb_spi、tdbp->tdb_dst.s_addrtdbp->tdb_protohashval;tdbtdbtdbp:tdbp->tdb_hnext=tdbh[hashval];tdbh[hashval]=tdbp;tdb。.4structtdb*gettdb(structsa_id*said)目的:根據(jù)給出的saidtdb參數(shù):saidtdbsaid返回值: structtdb――找到的tdb塊,NULL――失敗算法描述:saidNULL;saidhashval;hashvaltdbNULL。.5intdeb(structtdb*tdbp)目的:刪除某個指定的tdb參數(shù):tdbp――要刪除的tdb返回值: 0――算法描述:0hashvalhashvaltdbp,并刪除它,若失敗,返回錯誤。.6intdebchain(structtdb*tdbp)目的:刪除整個.5intdeb(structtdb*tdbp)目的:刪除某個指定的tdb參數(shù):tdbp――要刪除的tdb返回值: 0――算法描述:0hashvalhashvaltdbp,并刪除它,若失敗,返回錯誤。.6intdebchain(structtdb*tdbp)目的:刪除整個tdbp參數(shù):tdbp――要刪除的tdb返回值: 0――算法描述:0tdbptdbptdbp->tdb_onext;tdb.7intipsec_tdbwipe(structtdb*tdbp)目的:將指定tdb參數(shù):tdbp――要清空的tdb返回值:算法描述:0――0NULL。..1.1SPDeroute。.2radij.c,ipsec_radij.c.1eroutestructeroute{structrjtentryer_rjt;structsa_ider_said;structsockaddr_encaper_eaddr;structsockaddr_encaper_emask;};.1intipsec_radijinit(void)目的:初始化radij參數(shù):無返回值:0――0rj_init()函數(shù)初始化。.1eroutestructeroute{structrjtentryer_rjt;structsa_ider_said;structsockaddr_encaper_eaddr;structsockaddr_encaper_emask;};.1intipsec_radijinit(void)目的:初始化radij參數(shù):無返回值:0――0rj_init()函數(shù)初始化。.2intipsec_makeroute(structsockaddr_encap*eaddr,structsockaddr_encap*emask,structsa_idsaid)目的:根據(jù)saideroute參數(shù):eaddremasksaidsaid返回值: 0――算法描述:0erouteretrt0;retrt:retrt->er_eaddr*eaddrretrt->er_emask*emask;retrt->er_said=said;erouterj_addroute(&(retrt->er_eaddr),&(retrt->er_emask),rnh,retrt->er_rjt.rd_nodes)eroute,返回。.3intipsec_breakroute(struct sockaddr_encap*eaddr,structsockaddr_encap*emask)目的:刪除指定的route。參數(shù):eaddr,emask返回值: 0――算法描述:0erouterj_delete(eaddr,emask,rnh,&rnroute;route0,kfree該空間。.4structeroute*ipsec_findroute(structsockaddr_encap*eaddr)目的:接收并處理ipsec參數(shù):eaddrrouteeaddr.3intipsec_breakroute(struct sockaddr_encap*eaddr,structsockaddr_encap*emask)目的:刪除指定的route。參數(shù):eaddr,emask返回值: 0――算法描述:0erouterj_delete(eaddr,emask,rnh,&rnroute;route0,kfree該空間。.4structeroute*ipsec_findroute(structsockaddr_encap*eaddr)目的:接收并處理ipsec參數(shù):eaddrrouteeaddr返回值:算法描述:structerouteeroute,NULL調(diào)用函數(shù)rj_match((caddr_t)eaddr,rnh),根據(jù)eaddr查找相應的erouteeroute.5intipsec_cleareroutes(void)目的:清空eroute參數(shù):無返回值:0――0算法描述:首先,鎖住eroute表;調(diào)用函數(shù)radijcleartree()函數(shù); ,返回。.6intipsec_radijcleanup(void)目的:參數(shù):無返回值:0――0erouteradijcleanup()函數(shù);,返回。3.3密鑰協(xié)商及管理模塊3.3.1概要說明功能3.3密鑰協(xié)商及管理模塊3.3.1概要說明功能的協(xié)商工作。源代碼組成――――Pluto源文件目錄||――main.c啟動進程pluto|――server.c處理過程||――demux.c由serverIKE|――demux.h處理IKE消息的頭文件,主要定義消息的結(jié)構(gòu)|――ipsec_doi.c描述建立ISAKMPSA和IPSECSA|――state.hstate頭文件,主要定義state結(jié)構(gòu)|――state.c描述對state,為建立SA|――connections.hconnection頭文件,定義connection結(jié)構(gòu)|――connections.c描述對connection的SA服務(wù)|――spdb.c構(gòu)造和源代碼組成――――Pluto源文件目錄||――main.c啟動進程pluto|――server.c處理過程||――demux.c由serverIKE|――demux.h處理IKE消息的頭文件,主要定義消息的結(jié)構(gòu)|――ipsec_doi.c描述建立ISAKMPSA和IPSECSA|――state.hstate頭文件,主要定義state結(jié)構(gòu)|――state.c描述對state,為建立SA|――connections.hconnection頭文件,定義connection結(jié)構(gòu)|――connections.c描述對connection的SA服務(wù)|――spdb.c構(gòu)造和SASA|――packet.c定義了各種ISAKMP包的消息頭格式,以及構(gòu)造消息頭的算法和消息頭的算法|――constants.c與建立SA相關(guān)的各種定義|――cookie.c描述對cookies|――crypto.c調(diào)用加密算法的接口模塊|――id.cID的表示及操作|――timer.c處理時間|――rnd.c隨機數(shù)函數(shù)模塊|――sha1.cSHA-1散列函數(shù)模塊|――md5.cMD5散列函數(shù)模塊|――dsa.cDSA|――preshared.c共享密鑰的處理模塊|――defs.c其它一些函數(shù)的定義|――dnskey.c|――primegen.c|――elgamal.c|――gcryptfix.c||――kernel_comm.c由serverwhack|――whack.cipsecwhackwhack到whackfd,由server.c,發(fā)到kernel_comm.c||――kernel.c由serverpfkeySADB庫||――log.c日志處理模塊|――version.c3.3.2啟動模塊|――primegen.c|――elgamal.c|――gcryptfix.c||――kernel_comm.c由serverwhack|――whack.cipsecwhackwhack到whackfd,由server.c,發(fā)到kernel_comm.c||――kernel.c由serverpfkeySADB庫||――log.c日志處理模塊|――version.c3.3.2啟動模塊概要說明.1功能Pluto進程。.2源代碼組成main.c函數(shù)說明.1intmain(intargc,char**argv)pluto參數(shù):argcargv返回值:0――0算法:pluto令行參數(shù),并做相應的操作;init_log(),初始化日志;init_rnd_pool(),初始化隨機數(shù)池;init_secret(),生成密鑰值;調(diào)用函數(shù)int_stats(),(statetale;3.調(diào)用函數(shù)init_crypto(),做好加密準備;4.調(diào)用函數(shù)init_demux()state_microcode_table;5.pluto令行參數(shù),并做相應的操作;init_log(),初始化日志;init_rnd_pool(),初始化隨機數(shù)池;init_secret(),生成密鑰值;調(diào)用函數(shù)int_stats(),(statetale;3.調(diào)用函數(shù)init_crypto(),做好加密準備;4.調(diào)用函數(shù)init_demux()state_microcode_table;5.調(diào)用函數(shù)call_server(),啟動服務(wù)器,ISAKMPWhcak.2intcreate_lock(void)lockfilepluto參數(shù):無返回值:0――0算法:略.3intdelete_lock(void)lockfile參數(shù):無返回值:0――0算法:略.4voidexit_pluto(intstatus)statuspluto參數(shù):status0ok1generaldiscomfor10lockfileexists返回值:無算法:略3.3.3模塊概要說明.1功能該模塊主要用于種消息后,再調(diào)用相應處理模塊。.2源代碼組成server.c函數(shù)說明.1voidcall_server(void)目的:3.3.3模塊概要說明.1功能該模塊主要用于種消息后,再調(diào)用相應處理模塊。.2源代碼組成server.c函數(shù)說明.1voidcall_server(void)目的:調(diào)用相應處理模塊。參數(shù):無返回值:無算法:init_pfkeyed(),PF_KEYinit_whackfd(),AF_UNIX進入循環(huán)等待,接收到來的消息:IKEcomm_handle()處理;whackwhack_handle()處理;pfkeypfkey_handle()處理。.2voidfind_ifaces(void)目的:參數(shù):無返回值:無算法:.3staticintinit_pfkeyfd(void)PF_KEY參數(shù):無返回值:-1算法:調(diào)用系統(tǒng)調(diào)用socket(socket,返回之。.4staticintinit_whackfd(void)AF_UNIX參數(shù):無返回值:-.3staticintinit_pfkeyfd(void)PF_KEY參數(shù):無返回值:-1算法:調(diào)用系統(tǒng)調(diào)用socket(socket,返回之。.4staticintinit_whackfd(void)AF_UNIX參數(shù):無返回值:-1listen()。3.3.4協(xié)商安全的模塊概要說明.1功能ISAKMPSAIPSECSA。.2源代碼組成詳細說明.1ISAKMPSA.1.11:CookieCKY-IISAKMP的保護方案staticstf_statusmain_outI1(intwhack_sock,structconnection*c,boolpending_quick,lset_tpolicy,unsignedlongtry)cSAcookieISAKMP參數(shù):whack_sockwhackccpending_quick――標識在生成ISAKMPSAIPSECSApolicy――安全策略try――發(fā)起方最多可以重試的協(xié)商次數(shù)返回值:STF_NO_REPLY――算法:new_stateconnection-cstate;statestst->st_connectionc;//這個statecst->st_pending_quick=pending_quick; //st_pending_quickbool量,其含意為:是否needto參數(shù):whack_sockwhackccpending_quick――標識在生成ISAKMPSAIPSECSApolicy――安全策略try――發(fā)起方最多可以重試的協(xié)商次數(shù)返回值:STF_NO_REPLY――算法:new_stateconnection-cstate;statestst->st_connectionc;//這個statecst->st_pending_quick=pending_quick; //st_pending_quickbool量,其含意為:是否needtobuildIPsecSAafterISAKMPSAst->st_policy=policy;//policyforIPsecSAst->st_whack_sock=whack_sock;//fdforourWhackTCPsocket.st->st_try=try;//numberoftimesrekeyingattemptedst->st_state=STATE_MAIN_I1;//Stateofexchange;get_cookiecookiehashevent_schedule(),將隊列;init_pbs(),準備構(gòu)造第一條ISAKMPISAKMP⑴.定義一個類型為isakmp_hdrhdr,先清空;hdr:hdr.isa_version= ISAKMP_MAJOR_VERSION<<ISA_MAJ_SHIFT|ISAKMP_MINOR_VERSION;//ISAKMPhdr.isa_np=ISAKMP_NEXT_SA;//下一載荷hdr.isa_xchg=ISAKMP_XCHG_IDPROT;//交換類型st->st_icookie,COOKIE_SIZE);//cookies⑶.由于上述生成的包為主機格式的,應該轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)格式,調(diào)用函數(shù)out_struct()完成;SA:auth_policy,即使用何種認證方式;out_sa(),構(gòu)造SAproposalSA;close_message()、close_output_pbsISAKMPsend_packet(),將包出去;建立重發(fā)機制;返回狀態(tài)為:STF_NO_REPLY。.1.22CookieCKY-R、響應方選擇的保護方案stf_statusmain_inI1_outR1(structmsg_digest*md)可以接受的保護方案參數(shù):md――消息摘要,接收到的消息返回值:STF_REPLY――算法:根據(jù)收到的消息,查找相應的out_sa(),構(gòu)造SAproposalSA;close_message()、close_output_pbsISAKMPsend_packet(),將包出去;建立重發(fā)機制;返回狀態(tài)為:STF_NO_REPLY。.1.22CookieCKY-R、響應方選擇的保護方案stf_statusmain_inI1_outR1(structmsg_digest*md)可以接受的保護方案參數(shù):md――消息摘要,接收到的消息返回值:STF_REPLY――算法:根據(jù)收到的消息,查找相應的connection-c;new_statestate;statest->st_connection=c;st->st_try=0;st->st_policy=c->policy;memcpy(st->st_icookie,md->hdr.isa_icookie,COOKIE_SIZE);//st_icookieget_cookie(ISAKMP_RESPONDER,st->st_rcookie,COOKIE_SIZE,md->sin.sin_addr);//填充st_rcookieinsert_state(),statehashISAKMP⑴.定義一個類型為isakmp_hdrr_hdr;st_rcookier_hdrSA⑷.由于上述生成的包為主機格式的,應該轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)格式,調(diào)用函數(shù)out_struct()完成;SA:isakmp_sar_sa,給它賦值;r_saNULL,即后面不再跟有載荷;out_struct()r_sa_pbs;parse_isakmp_sa_body(),選擇要采用的保護方案;6.調(diào)用函數(shù)close_message(),完成消息的填寫,返回狀態(tài):STF_REPLY。.1.33Diffie-HellmangxmodpnounceNistf_statusmain_inR1_outI2(structmsg_digest*md)目的:發(fā)起方的第二個協(xié)商消息,D-H參數(shù):md――消息摘要,接收到的消息返回值:STF_REPLY――算法:parse_isakmp_sa_body(),proposal6.調(diào)用函數(shù)close_message(),完成消息的填寫,返回狀態(tài):STF_REPLY。.1.33Diffie-HellmangxmodpnounceNistf_statusmain_inR1_outI2(structmsg_digest*md)目的:發(fā)起方的第二個協(xié)商消息,D-H參數(shù):md――消息摘要,接收到的消息返回值:STF_REPLY――算法:parse_isakmp_sa_body(),proposalHDR,KENi:載荷;out_struct();KE(密鑰交換)NONCEbuild_and_ship_KE();NONCEbuild_and_ship_nonce();close_message();stateSTATE_MAIN_I2;STF_REPLY。.1.44Diffie-Hellmangymodpnouncestf_statusmain_inI2_outR2(structmsg_digest*md)Nr目的:響應方的第二個協(xié)商消息,D-H參數(shù):md――消息摘要,接收到的消息返回值:STF_REPLY――算法:DHGiaccept_KE();NONCE-Ni,accept_nonce();HDR,KENi:KE(密鑰交換)NONCEbuild_and_ship_KE();close_message();compute_dh_shared()state->st_shared,該值為雙方根據(jù)公開值Gi/Gr和隨機數(shù)Ni/Nr生成的一個公有 值;gernerate_skeyid(),生成下列各值:SKEYID(,SKEYID_D用于產(chǎn)生IPsecSA的密鑰,SKEYID_A()ISAKMP,SKEYID_E用于加密ISAKMP據(jù)公開值Gi/Gr和隨機數(shù)Ni/Nr生成的一個公有 值;gernerate_skeyid(),生成下列各值:SKEYID(,SKEYID_D用于產(chǎn)生IPsecSA的密鑰,SKEYID_A()ISAKMP,SKEYID_E用于加密ISAKMP,IVSTF_REPLY。.1.55:發(fā)起方的IDiHASH-IHASH-I(加密)結(jié)果stf_statusmain_inR2_outI3(structmsg_digest*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 直筒模具設(shè)計課程設(shè)計
- 說明文課程設(shè)計
- 課程設(shè)計宿舍供電
- 課程設(shè)計壓縮包
- 2025年度科技園區(qū)物業(yè)房屋租賃管理服務(wù)協(xié)議3篇
- 2025年小學班主任班級工作總結(jié)范文(2篇)
- 2025年事業(yè)單位年檢工作年終總結(jié)模版(2篇)
- 通信原理課程設(shè)計實驗
- 二零二五年度數(shù)據(jù)中心電力需求響應服務(wù)合同2篇
- 二零二五年度建筑垃圾資源化處理質(zhì)量合同3篇
- 山東省濟南市2023-2024學年高二上學期期末考試生物試題 附答案
- DB32T 3292-2017 大跨徑橋梁鋼橋面環(huán)氧瀝青混凝土鋪裝養(yǎng)護技術(shù)規(guī)程
- GB/T 44819-2024煤層自然發(fā)火標志氣體及臨界值確定方法
- 《MATLAB編程及應用》全套教學課件
- 喜歡新老師(教學設(shè)計)-2024-2025學年嶺美版(2024)美術(shù)一年級上冊
- 《銷售技巧培訓》課件
- 抖音本地生活培訓
- 城市規(guī)劃設(shè)計收費標準(中國城市規(guī)劃協(xié)會)參照-202104020
- 2019年海南省公務(wù)員考試申論真題(乙類)
- 2024-2025學年人教版高二上學期期末英語試題及解答參考
- 熱氣球項目可行性實施報告
評論
0/150
提交評論