Commit 0cc5b32e authored by tepelmann's avatar tepelmann
Browse files

Changed mip to mobile. Added msgs for Fast... Added mobile specific msg templates.

parent d32524aa
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -207,10 +207,10 @@

		//select ext hdrs that need special calculation
		for ( i := 0; i < sizeof ( p_extHdrList ) and ( v_ret != e_success ); i := i + 1 ) {
			if ( ischosen ( p_extHdrList[i].mipHeader )  ) {
				if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAckMsg ) ) {
					for ( j := 0; j < sizeof ( p_extHdrList[i].mipHeader.mipMessage.bindingAckMsg.mipOptions ); j := j + 1 ) {
						if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAckMsg.mipOptions[j].mipBindingAuthorizationData ) == true ) {
			if ( ischosen ( p_extHdrList[i].mobileHeader )  ) {
				if ( ischosen ( p_extHdrList[i].mobileHeader.mobileMessage.bindingAckMsg ) ) {
					for ( j := 0; j < sizeof ( p_extHdrList[i].mobileHeader.mobileMessage.bindingAckMsg.mobileOptions ); j := j + 1 ) {
						if ( ischosen ( p_extHdrList[i].mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[j].mobileBindingAuthorizationData ) == true ) {
							v_ret := e_success;
						}
					}
@@ -241,10 +241,10 @@

		//select ext hdrs that need special calculation
		for ( i := 0; i < sizeof ( p_extHdrList ) and ( v_ret != e_success ); i := i + 1 ) {
			if ( ischosen ( p_extHdrList[i].mipHeader )  ) {
				if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAckMsg ) ) {
					for ( j := 0; j < sizeof ( p_extHdrList[i].mipHeader.mipMessage.bindingAckMsg.mipOptions ); j := j + 1 ) {
						if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAckMsg.mipOptions[j].mipOptBindingRefreshAdvice ) == true ) {
			if ( ischosen ( p_extHdrList[i].mobileHeader )  ) {
				if ( ischosen ( p_extHdrList[i].mobileHeader.mobileMessage.bindingAckMsg ) ) {
					for ( j := 0; j < sizeof ( p_extHdrList[i].mobileHeader.mobileMessage.bindingAckMsg.mobileOptions ); j := j + 1 ) {
						if ( ischosen ( p_extHdrList[i].mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[j].mobileOptBindingRefreshAdvice ) == true ) {
							v_ret := e_success;
						}
					}
+2 −2
Original line number Diff line number Diff line
@@ -277,7 +277,7 @@ module LibIpv6_CommonRfcs_TypesAndValues {
				variant "present=bytes(0,1,201);intTag='hdrExtIntLen',getIntTag('hdrExtIntLen')-18";
			}

			group mipOptionValues {
			group mobileOptionValues {
				const UInt8	c_bindingRefreshAdvice := 2;
				const UInt8	c_alternateCareofAddress := 3;
				const UInt8	c_nonceIndices := 4;
@@ -285,7 +285,7 @@ module LibIpv6_CommonRfcs_TypesAndValues {
				const UInt8 c_advertisementInterval := 7;
				const UInt8 c_homeAgentInfo := 8;
			
			}//end group mipOptionValues
			}//end group mobileOptionValues

			const UInt8	c_optHomeAddress := 201; 
			
+13 −13
Original line number Diff line number Diff line
@@ -51,20 +51,20 @@
	 *	       If HomeAddressOption present, then this external function is called with the
	 *		   HomeAddress as Source Address
	 * @param  p_srcAddr Source Address to be used for Checksum calculation
	 * @param  p_dstAddr MipHeader
	 * @param  p_mipHeader MipHeader
	 * @param  p_dstAddr MobileHeader
	 * @param  p_mobileHeader MobileHeader
	 * @return MIPv6 Header checksum
	*/
	external function fx_mipHeaderChecksum( in Ipv6Address p_srcAddr,
											in Ipv6Address p_dstAddr,
											in MipHeader p_mipHeader) 
											in MobileHeader p_mobileHeader) 
	return Oct2;

	/* @desc   This external function calculates the length of MIPv6 Header.
	 * @param  p_mipHeader MipHeader
	 * @param  p_mobileHeader MobileHeader
	 * @return MIPv6 Header length
	*/
	external function fx_mipHeaderLength( in  MipHeader p_mipHeader) 
	external function fx_mipHeaderLength( in  MobileHeader p_mobileHeader) 
	return UInt8;

	/* @desc   This external function calculates the length of DstOptHeader .
@@ -83,23 +83,23 @@
	 * @param  p_message Octetstring message
	 * @return Message HMAC
	*/
	external function fx_integrity( IntegrityAlgo p_integrityAlgo, in octetstring p_key, in octetstring p_message) 
	return octetstring;//to be named fx_authenticator
	external function fx_mac( IntegrityAlgo p_integrityAlgo, in octetstring p_key, in octetstring p_message) 
	return octetstring;


	//p_message := SPI & SEQNr & IV & encrypted data
	//* @param 	p_spi Security parameter Index whihc poinst to the SAD to be used
	external function fx_newIntegrity(in UInt31 p_spi, in octetstring p_key, in octetstring p_message) 
	return octetstring;//To be named fx_integrity
	external function fx_integrity(in UInt31 p_spi, in octetstring p_key, in octetstring p_message) 
	return octetstring;


	/* @desc 	This external function runs the MipHeader through Codec and returns 
	 *			the octetstring representing the MipHeader
	/* @desc 	This external function runs the MobileHeader through Codec and returns 
	 *			the octetstring representing the MobileHeader
	 *			
	 * @param 	p_mipHeader Mip Header to be encoded to octetstring
	 * @param 	p_mobileHeader Mip Header to be encoded to octetstring
	 * @return 	octetstring
	*/
	external function fx_mipHdrToOct(MipHeader p_mipHeader)
	external function fx_mipHdrToOct(MobileHeader p_mobileHeader)
	return octetstring;

	/* @desc 	This external function byte aligns the EspPayload (Iv, EspIpDatagram, TfcPadding) + next Header + pad Length
+64 −64
Original line number Diff line number Diff line
@@ -78,23 +78,23 @@ group rfc2460Root_Functions {
		var UInt8 v_nrOfTunnelHdr := 0;

		for (i:=0; i<sizeof(p_extHdrList);i:=i+1) {
			if (ischosen(p_extHdrList[i].mipHeader)) {
			if (ischosen(p_extHdrList[i].mobileHeader)) {
				if (f_isPresentHomeAddressOption(p_extHdrList, v_homeAddress) == e_success) {
					v_ret := f_setMipHeader(	v_homeAddress,
					v_ret := f_setMobileHeader(	v_homeAddress,
									p_dstAddr,
											p_extHdrList[i].mipHeader,
									p_extHdrList[i].mobileHeader,
									p_ipv6Packet);	
				}
				else if (f_isPresentRoutingHeaderType2(p_extHdrList, v_homeAddress) == e_success) {
					v_ret := f_setMipHeader(	p_srcAddr,
					v_ret := f_setMobileHeader(	p_srcAddr,
									v_homeAddress,									
									p_extHdrList[i].mipHeader,
									p_extHdrList[i].mobileHeader,
									p_ipv6Packet);	
				}
				else {
					v_ret := f_setMipHeader(	p_srcAddr,
					v_ret := f_setMobileHeader(	p_srcAddr,
									p_dstAddr,
									p_extHdrList[i].mipHeader,
									p_extHdrList[i].mobileHeader,
									p_ipv6Packet);
				}
			}
@@ -103,11 +103,11 @@ group rfc2460Root_Functions {
				p_extHdrList[i].tunneledIpv6.payloadLength := fx_tunnelledPayloadLength(p_ipv6Packet, v_nrOfTunnelHdr);
			}
		/*	else if (ischosen(p_extHdrList[i].)) {
				v_ret := f_setSecurityHdr();
				f_setSecurityHdr();
			}  */
		}//end for

		return v_ret;
		return e_success;
	}//end f_setExtensionHeaders
		
	}//end group extHdrFns
@@ -126,95 +126,95 @@ group rfc3775Mipv6_ExtHdrFunctions {
	 * @param 	p_msg ExtensionHeaderList to be treated	
	 * @return 	execution status 
	*/
	function f_setMipHeader(in Ipv6Address p_srcAddr,
	function f_setMobileHeader(in Ipv6Address p_srcAddr,
							in Ipv6Address p_dstAddr,
							inout MipHeader p_mipHeader,
							inout MobileHeader p_mobileHeader,
							in Ipv6Packet p_ipv6Packet)
	runs on LibIpv6Node
	return FncRetCode {
		var MipHeader v_mipHeader := valueof(p_mipHeader);
		var MobileHeader v_mobileHeader := valueof(p_mobileHeader);
		var Ipv6Address v_homeAddress := c_16ZeroBytes ;

		//if (ischosen(p_mipHeader.mipMessage.homeTestInit)) {
		//if (ischosen(p_mobileHeader.mobileMessage.homeTestInit)) {
			//calc homeInitCookie
			//p_mipHeader.mipMessage.homeTestInit.homeInitCookie := f_createInitCookie();
			//p_mobileHeader.mobileMessage.homeTestInit.homeInitCookie := f_createInitCookie();
		//}
		//else if (ischosen(p_mipHeader.mipMessage.homeTest)) {//CNSimu sends this message
		//else if (ischosen(p_mobileHeader.mobileMessage.homeTest)) {//CNSimu sends this message
		//}
		//else if (ischosen(p_mipHeader.mipMessage.careOfTestInit) and (PX_TEST_IPSEC == true)) {
		//else if (ischosen(p_mobileHeader.mobileMessage.careOfTestInit) and (PX_TEST_IPSEC == true)) {
		//SMU TODO
		//}
		//else if (ischosen(p_mipHeader.mipMessage.careOfTest) and (PX_TEST_IPSEC == true)) {
		//else if (ischosen(p_mobileHeader.mobileMessage.careOfTest) and (PX_TEST_IPSEC == true)) {
		//SMU TODO
		//}
		if (ischosen(p_mipHeader.mipMessage.bindingUpdateMsg)) {//Authorization data is only needed for BU sent to CN=IUT
		if (ischosen(p_mobileHeader.mobileMessage.bindingUpdateMsg)) {//Authorization data is only needed for BU sent to CN=IUT
			var UInt8 v_position := 0;
			//Concept of including bindingAuthentication
			// specifiy on template level all options
			// 1) if authenticator == c_20ZeroBytes then value is calculated in f_setMipHeader
			// 2) if authenticator != c_20ZeroBytes then no value is calculated in f_setMipHeader,
			// 1) if authenticator == c_20ZeroBytes then value is calculated in f_setMobileHeader
			// 2) if authenticator != c_20ZeroBytes then no value is calculated in f_setMobileHeader,
			//     because it's assumed that the correct value was set on template level
			// 3) same applies to nonceIndex etc

			// TODO Check this 
			if (f_isPresentNonceIndices(p_mipHeader.mipMessage.bindingUpdateMsg, v_position) == e_success) {
				if(vc_mipSec.mnSimuParams.receivedHomeNonceIndex != c_uInt16Zero
					and vc_mipSec.mnSimuParams.receivedCareOfNonceIndex != c_uInt16Zero) {
						p_mipHeader.mipMessage.bindingUpdateMsg.mipOptions[v_position].mipOptNonceIndices.homeNonceIndex
						:= vc_mipSec.mnSimuParams.receivedHomeNonceIndex;
						p_mipHeader.mipMessage.bindingUpdateMsg.mipOptions[v_position].mipOptNonceIndices.careOfNonceIndex
						:= vc_mipSec.mnSimuParams.receivedCareOfNonceIndex;
			if (f_isPresentNonceIndices(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) {
				if(vc_mobileSec.mnSimuParams.receivedHomeNonceIndex != c_uInt16Zero
					and vc_mobileSec.mnSimuParams.receivedCareOfNonceIndex != c_uInt16Zero) {
						p_mobileHeader.mobileMessage.bindingUpdateMsg.mobileOptions[v_position].mobileOptNonceIndices.homeNonceIndex
						:= vc_mobileSec.mnSimuParams.receivedHomeNonceIndex;
						p_mobileHeader.mobileMessage.bindingUpdateMsg.mobileOptions[v_position].mobileOptNonceIndices.careOfNonceIndex
						:= vc_mobileSec.mnSimuParams.receivedCareOfNonceIndex;
				}
				else {
					log("f_setMipHeader: Error: NonceIndices included in Binding Update, but mnSimuParams.receivedCareOfNonceIndex/receivedHomeNonceIndex not initialized");
					log("f_setMobileHeader: Error: NonceIndices included in Binding Update, but mnSimuParams.receivedCareOfNonceIndex/receivedHomeNonceIndex not initialized");
					return e_error;	
				}
			}	
			if (f_isPresentBindingAuthorizationDataOption(p_mipHeader.mipMessage.bindingUpdateMsg, v_position) == e_success) {
				if(vc_mipSec.mnSimuParams.receivedHomeKeygenToken != c_64ZeroBits
					and vc_mipSec.mnSimuParams.receivedCareOfKeygenToken != c_64ZeroBits) {
			if (f_isPresentBindingAuthorizationDataOption(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) {
				if(vc_mobileSec.mnSimuParams.receivedHomeKeygenToken != c_64ZeroBits
					and vc_mobileSec.mnSimuParams.receivedCareOfKeygenToken != c_64ZeroBits) {
				
						vc_mipSec.mnSimuParams.kbm := fx_integrity(		e_sha1, c_1ZeroByte,
																		bit2oct(vc_mipSec.mnSimuParams.receivedHomeKeygenToken)
																		& bit2oct(vc_mipSec.mnSimuParams.receivedCareOfKeygenToken));
						vc_mobileSec.mnSimuParams.kbm := fx_mac(		e_sha1, c_1ZeroByte,
																		bit2oct(vc_mobileSec.mnSimuParams.receivedHomeKeygenToken)
																		& bit2oct(vc_mobileSec.mnSimuParams.receivedCareOfKeygenToken));
																		
						//set Authenticator option with dummy Authenticator
						p_mipHeader.mipMessage.bindingUpdateMsg.mipOptions[v_position].mipBindingAuthorizationData := {
														mipOptType := 5,
														mipOptLen := 12,
						p_mobileHeader.mobileMessage.bindingUpdateMsg.mobileOptions[v_position].mobileBindingAuthorizationData := {
														mobileOptType := 5,
														mobileOptLen := 12,
														authenticator := c_12ZeroBytes}
																		
						//calculate the mipHeaderLength over the dummy Authenticator
						p_mipHeader.headerLen := fx_mipHeaderLength(p_mipHeader) ;
						p_mobileHeader.headerLen := fx_mipHeaderLength(p_mobileHeader) ;
						
						//set Authenticator to omit in order to calc the authenticator
						p_mipHeader.mipMessage.bindingUpdateMsg.mipOptions[v_position].mipBindingAuthorizationData.authenticator := omit;
						p_mobileHeader.mobileMessage.bindingUpdateMsg.mobileOptions[v_position].mobileBindingAuthorizationData.authenticator := omit;
				
						p_mipHeader.mipMessage.bindingUpdateMsg.mipOptions[v_position].mipBindingAuthorizationData.authenticator 
						:= fx_integrity(	e_hmac_sha1_96, vc_mipSec.mnSimuParams.kbm,
					p_mobileHeader.mobileMessage.bindingUpdateMsg.mobileOptions[v_position].mobileBindingAuthorizationData.authenticator 
								 := fx_mac(	e_hmac_sha1_96, vc_mobileSec.mnSimuParams.kbm,
																		p_srcAddr//careOfaddr 
																		& p_dstAddr//cnAddr
											& fx_mipHdrToOct(p_mipHeader) );
																		& fx_mipHdrToOct(p_mobileHeader) );
				}
				else {
					log("f_setMipHeader: Error: BindingAuthorizationDataOption included in Binding Update, but receivedHomeKeygenToken/receivedCareOfKeygenToken not initialized");
					log("f_setMobileHeader: Error: BindingAuthorizationDataOption included in Binding Update, but receivedHomeKeygenToken/receivedCareOfKeygenToken not initialized");
					return e_error;	
				}
			}
		}
	//	else if (ischosen(p_mipHeader.mipMessage.bindingAck) and (PX_TEST_IPSEC == true)) {
	//	else if (ischosen(p_mobileHeader.mobileMessage.bindingAck) and (PX_TEST_IPSEC == true)) {
		//SMU TODO
		//}
		//calc mipHeaderLen
		p_mipHeader.headerLen := fx_mipHeaderLength(p_mipHeader);
		//calc mobileHeaderLen
		p_mobileHeader.headerLen := fx_mipHeaderLength(p_mobileHeader);

// modified by PK to easily send packets with wrong checksum
		//set mipChecksum to zero
		//p_mipHeader.checksum := c_2ZeroBytes;  
		//calc mipChecksum
		p_mipHeader.checksum := fx_mipHeaderChecksum ( p_srcAddr,
		//set mobileChecksum to zero
		//p_mobileHeader.checksum := c_2ZeroBytes;  
		//calc mobileChecksum
		p_mobileHeader.checksum := fx_mipHeaderChecksum ( p_srcAddr,
														p_dstAddr,
														p_mipHeader);
														p_mobileHeader);

		return e_success;
	}
@@ -225,7 +225,7 @@ group rfc3775Mipv6_ExtHdrFunctions {
	 * @desc 	This goes through the BindingUpdate and
	 *			checks if a NonceIndicesOption is present.
	 * @param 	p_bindingUpdate Binding Update to be treated
	 * @param 	v_position Position of the NonceIndicesOption in the MipOptionList
	 * @param 	v_position Position of the NonceIndicesOption in the MobileOptionList
	 * @return 	execution status 
	*/
	function f_isPresentNonceIndices(	in BindingUpdateMsg p_bindingUpdate,
@@ -236,8 +236,8 @@ group rfc3775Mipv6_ExtHdrFunctions {
		var UInt8 i;

		//select ext hdrs that need special calculation
		for (i:=0; i<sizeof(p_bindingUpdate.mipOptions) and (v_ret != e_success); i:=i+1) {
			if (ischosen(p_bindingUpdate.mipOptions[i].mipOptNonceIndices)) {
		for (i:=0; i<sizeof(p_bindingUpdate.mobileOptions) and (v_ret != e_success); i:=i+1) {
			if (ischosen(p_bindingUpdate.mobileOptions[i].mobileOptNonceIndices)) {
					v_position := i;
					v_ret := e_success;
				}
@@ -249,7 +249,7 @@ group rfc3775Mipv6_ExtHdrFunctions {
	 * @desc 	This goes through the BindingUpdate and
	 *			checks if a AuthorizationDataOption is present.
	 * @param 	p_bindingUpdate Binding Update to be treated
	 * @param 	v_position Position of the AuthorizationDataOption in the MipOptionList
	 * @param 	v_position Position of the AuthorizationDataOption in the MobileOptionList
	 * @return 	execution status 
	*/
	function f_isPresentBindingAuthorizationDataOption(	in BindingUpdateMsg p_bindingUpdate,
@@ -260,8 +260,8 @@ group rfc3775Mipv6_ExtHdrFunctions {
		var UInt8 i;

		//select ext hdrs that need special calculation
		for (i:=0; i<sizeof(p_bindingUpdate.mipOptions) and (v_ret != e_success); i:=i+1) {
			if (ischosen(p_bindingUpdate.mipOptions[i].mipBindingAuthorizationData)) {
		for (i:=0; i<sizeof(p_bindingUpdate.mobileOptions) and (v_ret != e_success); i:=i+1) {
			if (ischosen(p_bindingUpdate.mobileOptions[i].mobileBindingAuthorizationData)) {
					v_position := i;
					v_ret := e_success;
				}
@@ -533,11 +533,11 @@ group rfc3775Mipv6_ExtHdrFunctions {
	 * @param 	p_msg MIPHeader to be sent	
	 * @return 	execution status
	*/
	function f_sendFastNbrAdv(template FastNbrAdv p_msg)
	function f_sendFastNbrAdv(template FastNeighborAdvertisement p_msg)
	runs on LibIpv6Node
	return FncRetCode {
		//Variables
		var FastNbrAdv v_ipPkt;
		var FastNeighborAdvertisement v_ipPkt;
		v_ipPkt := valueof(p_msg);
		//set extensionHeaders
		if (ispresent(v_ipPkt.extHdrList)) {
@@ -662,7 +662,7 @@ group rfc4303Esp_ExtHdrFunctions {
		}

		// Integrity
		v_ret := fx_integrityEspHdr(	p_sa.espIntegrityAlgo,
		v_ret := fx_macEspHdr(	p_sa.espIntegrityAlgo,
									p_sa.espIntegrityKey,
									v_espHdr,
									v_integrityResult);
+362 −176

File changed.

Preview size limit exceeded, changes collapsed.

Loading