Commit 5b3be43c authored by schmitting's avatar schmitting
Browse files

IKE postamble added

parent 85b10ea6
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -349,7 +349,7 @@ group ipSecFns {
	}

	//in units of octets
	function f_getIntegrKeyLen( in template IntegrityAlgo p_integrityAlgo)
	function f_getIntegrKeyLen( in IntegrityAlgo p_integrityAlgo)
	return UInt8 {
		
		if(p_integrityAlgo == e_auth_hmacMd5_96){
@@ -553,7 +553,7 @@ group ipSecFns {
	}

	//in units of octets
	function f_getIntegrBlockSize(in template IntegrityAlgo p_integrityAlgo)
	function f_getIntegrBlockSize(in IntegrityAlgo p_integrityAlgo)
	runs on LibIpv6Node
	return UInt8 {
		
+98 −19
Original line number Diff line number Diff line
@@ -1291,8 +1291,8 @@ group sendRequests {
			m_ikeSaInitReq (
				p_addrTn,
				p_addrIut,
				PX_UDP_PORT_HS02,
				PX_UDP_PORT_IUT_1,
				vc_ikeSad[0].udpTnPort,
				vc_ikeSad[0].udpIutPort,
				vc_ikeSad[0].spiInitiator,
				c_saPL,
				vc_ikeSad[0].messageID,
@@ -1353,7 +1353,6 @@ group sendRequests {
	runs on LibIpv6Node
	return FncRetCode {
		var IkeSaInitRequest v_ipPkt := valueof(p_ikeSaInitRequest);
		var FncRetCode v_ret := e_error;

		if(f_setExtensionHeaders(v_ipPkt) != e_success) {
			log(" **** f_sendIkeSaInitReq: Error when calculating length ****");
@@ -1477,8 +1476,8 @@ group sendRequests {
				m_ikeAuthReq (
					p_addrTn,
					p_addrIut,
					PX_UDP_PORT_HS02,
					PX_UDP_PORT_IUT_1,
					vc_ikeSad[0].udpTnPort,
					vc_ikeSad[0].udpIutPort,
					vc_ikeSad[0].spiInitiator,
					vc_ikeSad[0].spiResponder,
					c_encryptedPL,
@@ -1537,8 +1536,8 @@ group sendRequests {
				m_ikeAuthReq (
					p_addrTn,
					p_addrIut,
					PX_UDP_PORT_HS02,
					PX_UDP_PORT_IUT_1,
					vc_ikeSad[0].udpTnPort,
					vc_ikeSad[0].udpIutPort,
					vc_ikeSad[0].spiInitiator,
					vc_ikeSad[0].spiResponder,
					c_encryptedPL,
@@ -1593,7 +1592,6 @@ group sendRequests {
	return FncRetCode {
		var IkeAuthRequest v_ipPkt;
		v_ipPkt := valueof(p_ikeAuthRequest);
		var FncRetCode v_ret := e_error;

		if(f_setExtensionHeaders(v_ipPkt) != e_success) {
			log(" **** f_sendIkeAuthReq: Error when calculating length ****");
@@ -1611,6 +1609,62 @@ group sendRequests {
		return e_success;
	} // end f_sendIkeAuthReq

	function f_createAndSendInfoReq(
		template Ipv6Address p_addrTn,
		template Ipv6Address p_addrIut,
		UInt1 p_iFlag,
		template IkePayload p_payload
	)
	runs on LibIpv6Node
	return FncRetCode {

		var FncRetCode v_ret := e_success;

		v_ret := f_sendIkeInfoReq (
			m_ikeInfoReq (
				p_addrTn,
				p_addrIut,
				vc_ikeSad[0].udpTnPort,
				vc_ikeSad[0].udpIutPort,
				vc_ikeSad[0].spiInitiator,
				vc_ikeSad[0].spiResponder,
				p_iFlag,
				c_encryptedPL,
				vc_ikeSad[0].messageID,
				m_ikePlList_1Elem(
					m_encryptedPL(
						c_deletePL,
						m_ikePlList_1Elem(p_payload)
					)
				)
			)
		);

	return v_ret ;
	} // end f_createAndSendInfoReq

	function f_sendIkeInfoReq(in template InformationalRequest p_ikeInfoRequest)
	runs on LibIpv6Node
	return FncRetCode {
		var InformationalRequest v_ipPkt;
		v_ipPkt := valueof(p_ikeInfoRequest);

		if(f_setExtensionHeaders(v_ipPkt) != e_success) {
			log(" **** f_sendIkeInfoReq: Error when calculating length ****");
			return e_error;
		}
		
		// fill padding field with '00000000'O for UDP port 4500
		if(vc_ikeSad[0].udpTnPort == c_udpPort4500) {
			v_ipPkt.ipv6Payload.ikeMsg.padding := c_4ZeroBytes;
		}

		//send
		ipPort.send(v_ipPkt);

		return e_success;
	} // end f_sendIkeInfoReq

} // end group sendRequests

group sendResponses {
@@ -1646,8 +1700,8 @@ group sendResponses {
			m_ikeSaInitRsp (
				p_addrTn,
				p_addrIut,
				PX_UDP_PORT_HS02,
				PX_UDP_PORT_IUT_1,
				vc_ikeSad[0].udpTnPort,
				vc_ikeSad[0].udpIutPort,
				vc_ikeSad[0].spiInitiator,
				vc_ikeSad[0].spiResponder,
				c_saPL,
@@ -1834,8 +1888,8 @@ group sendResponses {
				m_ikeAuthRsp (
					p_addrIut,
					p_addrTn,
					PX_UDP_PORT_IUT_1,
					PX_UDP_PORT_HS02,
					vc_ikeSad[0].udpIutPort,
					vc_ikeSad[0].udpTnPort,
					vc_ikeSad[0].spiInitiator,
					vc_ikeSad[0].spiResponder,
					c_encryptedPL,
@@ -1884,8 +1938,8 @@ group sendResponses {
				m_ikeAuthRsp (
					p_addrIut,
					p_addrTn,
					PX_UDP_PORT_IUT_1,
					PX_UDP_PORT_HS02,
					vc_ikeSad[0].udpIutPort,
					vc_ikeSad[0].udpTnPort,
					vc_ikeSad[0].spiInitiator,
					vc_ikeSad[0].spiResponder,
					c_encryptedPL,
@@ -1957,7 +2011,7 @@ group establishSAFns_active {
	)
	runs on LibIpv6Node
	return FncRetCode {
		var FncRetCode v_ret := e_error;
		var FncRetCode v_ret := e_success;

		v_ret := f_createAndSendSaInitReq(
			p_addrTn,
@@ -1995,7 +2049,7 @@ group establishSAFns_active {
		in UInt8 p_protocolId
	)
	runs on LibIpv6Node return FncRetCode {
		var FncRetCode v_ret;
		var FncRetCode v_ret := e_success;

		if ((p_protocolId != c_protocolEsp) and (p_protocolId != c_protocolAh))
		{	log("**** f_sndAuthReqAndWaitForRsp: ERROR: Invalid protocol Id, only ESP and AH allowed here !**** ");
@@ -2055,7 +2109,7 @@ group establishSAFns_passive {
	)
	runs on LibIpv6Node
	return FncRetCode {
		var FncRetCode v_ret;
		var FncRetCode v_ret := e_success;

		v_ret := f_waitForIkeSaInitReq(p_addrIut,p_addrTn);
		if(v_ret != e_success) { return v_ret;}
@@ -2095,7 +2149,7 @@ group establishSAFns_passive {
	)
	runs on LibIpv6Node
	return FncRetCode {
		var FncRetCode v_ret;
		var FncRetCode v_ret := e_success;
		var UInt8 v_protocolId;

		v_ret := f_waitForIkeAuthReq(p_addrIut,p_addrTn,v_protocolId);
@@ -2154,4 +2208,29 @@ group establishSAFns_passive {
	
} // end group establishSAFns_passive

group deleteSAFns {

	function f_delIkeSa(
		template Ipv6Address p_addrTn,
		template Ipv6Address p_addrIut,
		UInt1 p_iFlag
	)
	runs on LibIpv6Node
	return FncRetCode {
		var FncRetCode v_ret := e_success;

		v_ret := f_createAndSendInfoReq(
			p_addrTn,
			p_addrIut,
			p_iFlag,
			m_delIkeSaPL(c_noNextPL)
		);
		if (v_ret != e_success) { return v_ret;}
		
		return v_ret;
														
	} // end deleteSAFns

} // end group deleteSAFns

} // end module LibIpv6_Rfc4306Ikev2_Functions
+110 −1
Original line number Diff line number Diff line
@@ -335,6 +335,87 @@

	}//end group ikeAuthResponseTemplates

	group ikeInfoRequestTemplates {

		template InformationalRequest mw_ikeInfoReq (template Ipv6Address p_src,
													 template Ipv6Address p_dst,
													 UInt16 p_udpSourcePort,
													 UInt16 p_udpDestPort,
													 Oct8 p_initiatorSpi,
													 Oct8 p_responderSpi,
													 UInt32 p_messageID,
													 template IkePayloadList p_ikepayloads) := {
			ipv6Hdr :=  mw_ipHdr_nextHdr_srcDst(c_udpHdr, p_src, p_dst),
			extHdrList        := omit,
			ipv6Payload       := { ikeMsg := {
				sourcePort    := p_udpSourcePort, 
				destPort      := p_udpDestPort,
				msgLength     := ?,																																								
				checksum      := ?,
				padding       := c_4ZeroBytes ifpresent,
				// IKEv2 Header
				ikev2Header	  := {
					initiatorSpi  := p_initiatorSpi,
					responderSpi  := p_responderSpi,
					nextPayload   := ?,
					majorVersion  := c_ikeMajorVersion2,
					minorVersion  := c_ikeMinorVersion0,
					exchangeType  := c_informational,
					twoXFlags     := ?,
					rFlag         := c_rFlagRequest,
					vFlag         := c_vFlag,
					iFlag         := c_iFlagInitiator,
					threeXFlags   := ?,
					messageID     := p_messageID,
					messageLength := ?
				},
				// IKEv2 Payloads
				payloadList   := p_ikepayloads
			}}
		}

	template InformationalRequest m_ikeInfoReq (template Ipv6Address p_src,
												template Ipv6Address p_dst,
												UInt16 p_udpsourcePort,
												UInt16 p_udpdestPort,
												Oct8 p_initiatorSpi,
												Oct8 p_responderSpi,
												UInt1 p_iFlag,
												UInt8 p_nextPayload,
												UInt32 p_messageID,
												template IkePayloadList p_ikepayloads) := {
			ipv6Hdr :=  m_ipHdr_nextHdr_srcDst(c_udpHdr, p_src, p_dst),
			extHdrList        := omit,
			ipv6Payload       := {
				ikeMsg := {
					sourcePort    := p_udpsourcePort, 
					destPort      := p_udpdestPort,
					msgLength     := c_uInt16Zero,																																								
					checksum      := c_2ZeroBytes,
					padding       := omit,
					// IKEv2 Header
					ikev2Header := {
						initiatorSpi  := p_initiatorSpi,
						responderSpi  := p_responderSpi,
						nextPayload   := p_nextPayload,
						majorVersion  := c_ikeMajorVersion2,
						minorVersion  := c_ikeMinorVersion0,
						exchangeType  := c_informational,
						twoXFlags     := 0,
						rFlag         := c_rFlagRequest,
						vFlag         := c_vFlag,
						iFlag         := p_iFlag,
						threeXFlags   := 0,
						messageID     := p_messageID,
						messageLength := 0
					},
					// IKEv2 Payloads
					payloadList   := p_ikepayloads
				}
			}
		}

	}//end group ikeInfoRequestTemplates
	group payLoadListTemplates {

		template IkePayloadList mw_ikeSaInitReqPLL :=
@@ -831,6 +912,34 @@ group identificationPLTmplts {
		
	}//end authPLTmplts

	group deletePLTmplts {
		
		template IkePayload mw_delIkeSaPL := {
				delete := {
					nextPayload	 := ?,
					criticalFlag := 0,
					reserved	 := ?,
					protocolId   := c_protocolIke,
					spiSize      := c_spiSize0,
					numberOfSpi  := c_uInt16Zero,
					spis         := omit
				}
		}

		template IkePayload m_delIkeSaPL(UInt8 p_nextPayload) := {
				delete := {
					nextPayload	 := p_nextPayload,
					criticalFlag := 0,
					reserved	 := c_uInt7Zero,
					protocolId   := c_protocolIke,
					spiSize      := c_spiSize0,
					numberOfSpi  := c_uInt16Zero,
					spis         := omit
				}
		}
		
	}//end deletePLTmplts

	group trafficSelectionPLTmplts {
		
	template IkePayload mw_tsInitiatorPL := {
+1 −1
Original line number Diff line number Diff line
@@ -685,7 +685,7 @@
				UInt8			protocolId,
				UInt8			spiSize,
				UInt16			numberOfSpi,
				octetstring		spis
				octetstring		spis optional
			} 
			with {
				variant (nextPayload) "tag='nextPayload';";