Commit 2045fa94 authored by berge's avatar berge
Browse files

Added support for BA authorization in f_setMobileHeader

parent 5707478a
Loading
Loading
Loading
Loading
+138 −12
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ group rfc2460Root_Functions {
												v_activeIpv6Packet.extHdrList[i].mobileHeader);
					
				//	update packet payloadLen
				p_ipv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (p_ipv6Packet);
				v_activeIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (v_activeIpv6Packet);
				}
				// Process Tunneled Header
				else if (ischosen(v_activeIpv6Packet.extHdrList[i].tunneledIpv6)) {
@@ -364,7 +364,7 @@ group rfc3775Mipv6_ExtHdrFunctions {
			// 3) same applies to nonceIndex etc

			// Process Nonce Indices
			if (f_isPresentNonceIndices(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) {
			if (f_isPresentNonceIndicesInBU(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) {

				// Fill Home Nonce Index only when set to c_uInt16Zero
				if (p_mobileHeader.mobileMessage.bindingUpdateMsg.mobileOptions[v_position].mobileOptNonceIndices.homeNonceIndex == c_uInt16Zero ) {
@@ -389,7 +389,7 @@ group rfc3775Mipv6_ExtHdrFunctions {
				}
			} // end Process Nonce Indices
				
			if (f_isPresentBindingAuthorizationDataOption(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) {
			if (f_isPresentBindingAuthorizationDataOptionInBU(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) {
				if(vc_mobileSec.mnSimuParams.receivedHomeKeygenToken != c_64ZeroBits
					and vc_mobileSec.mnSimuParams.receivedCareOfKeygenToken != c_64ZeroBits) {

@@ -433,9 +433,86 @@ group rfc3775Mipv6_ExtHdrFunctions {
				}
			}
		}
	//	else if (ischosen(p_mobileHeader.mobileMessage.bindingAck) and (PX_TEST_IPSEC == true)) {
		//SMU TODO
		//}
		else if (ischosen(p_mobileHeader.mobileMessage.bindingAckMsg)) {
			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_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

			// Process Nonce Indices
			if (f_isPresentNonceIndicesInBA(p_mobileHeader.mobileMessage.bindingAckMsg, v_position) == e_success) {

				// Fill Home Nonce Index only when set to c_uInt16Zero
				if (p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.homeNonceIndex == c_uInt16Zero ) {
					if(vc_mobileSec.cnSimuParams.nonceIndex != c_uInt16Zero) {
							p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.homeNonceIndex
							:= vc_mobileSec.cnSimuParams.nonceIndex;
					}
					else {
						log("f_setMobileHeader: Info: NonceIndices included in Binding Ack, but cnSimuParams.nonceIndex not initialized");
					}
				}
				
				// Fill Care-Of Nonce Index only when set to c_uInt16Zero
				if (p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.careOfNonceIndex == c_uInt16Zero) {
					if(vc_mobileSec.cnSimuParams.nonceIndex != c_uInt16Zero) {
							p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.careOfNonceIndex
							:= vc_mobileSec.cnSimuParams.nonceIndex;
					}
					else {
						log("f_setMobileHeader: Info: NonceIndices included in Binding Ack, but cnSimuParams.nonceIndex not initialized");
					}
				}
			} // end Process Nonce Indices
				
			if (f_isPresentBindingAuthorizationDataOptionInBA(p_mobileHeader.mobileMessage.bindingAckMsg, v_position) == e_success) {
				if(vc_mobileSec.cnSimuParams.homeKeygenToken != c_64ZeroBits
					and vc_mobileSec.cnSimuParams.careOfKeygenToken != c_64ZeroBits) {

						// kbm is different if BA is sent for de-registration				
						if (p_mobileHeader.mobileMessage.bindingAckMsg.lifeTime != 0) {
							vc_mobileSec.cnSimuParams.kbm := fx_mac(		e_sha1, c_1ZeroByte,
																			bit2oct(vc_mobileSec.cnSimuParams.homeKeygenToken)
																			& bit2oct(vc_mobileSec.cnSimuParams.careOfKeygenToken));
						}
						else {
							vc_mobileSec.cnSimuParams.kbm := fx_mac(		e_sha1, c_1ZeroByte,
																			bit2oct(vc_mobileSec.cnSimuParams.homeKeygenToken));	
						}
											
						//set Authenticator option with dummy Authenticator
						p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileBindingAuthorizationData := {
														mobileOptType := 5,
														mobileOptLen := 12,
														authenticator := c_12ZeroBytes}
																		
						//calculate the mipHeaderLength over the dummy Authenticator
						//modified by AMB to easily send packets with wrong mobileHdrLen
						//calc mobileHeaderLen
						if (p_mobileHeader.headerLen == c_uInt8Zero ) {
							p_mobileHeader.headerLen := fx_mipHeaderLength(p_mobileHeader) ;
						}
						
						//set Authenticator to omit in order to calc the authenticator
						p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileBindingAuthorizationData.authenticator := omit;
				
						// compute authenticator
						p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileBindingAuthorizationData.authenticator 
								 := fx_mac(	e_hmac_sha1_96, vc_mobileSec.cnSimuParams.kbm,
																		p_dstAddr //cnAddr			/!\ inverted /!\
																		& p_srcAddr //careOfaddr    /!\ for BA   /!\
																		& fx_mipHdrToOct(p_mobileHeader) );
				}
				else {
					log("f_setMobileHeader: Error: BindingAuthorizationDataOption included in Binding Ack, but HomeKeygenToken/CareOfKeygenToken not initialized");
					return e_error;	
				}
			}
		}
		
				
		// calc mobileHeaderLen only when set to c_uInt8Zero
		if (p_mobileHeader.headerLen == c_uInt8Zero ) {
@@ -462,7 +539,7 @@ group rfc3775Mipv6_ExtHdrFunctions {
		var UInt8 v_position := 0;
		var octetstring v_computedAuthenticator;
		
		if (f_isPresentBindingAuthorizationDataOption(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) {
		if (f_isPresentBindingAuthorizationDataOptionInBU(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) {
				
			p_mobileHeader.checksum := c_2ZeroBytes;			
				
@@ -506,6 +583,55 @@ group rfc3775Mipv6_ExtHdrFunctions {
	} //end function f_checkAuthenticator


	/*
	 * @desc 	This goes through the BindingAck and
	 *			checks if a NonceIndicesOption is present.
	 * @param 	p_bindingUpdate Binding Update to be treated
	 * @param 	v_position Position of the NonceIndicesOption in the MobileOptionList
	 * @return 	execution status 
	*/
	function f_isPresentNonceIndicesInBA(	in BindingAckMsg p_bindingAck,
														inout UInt8 v_position)
	runs on LibIpv6Node
	return FncRetCode {
		var FncRetCode v_ret := e_error;
		var UInt8 i;
	
		//select ext hdrs that need special calculation
		for (i:=0; i<sizeof(p_bindingAck.mobileOptions) and (v_ret != e_success); i:=i+1) {
			if (ischosen(p_bindingAck.mobileOptions[i].mobileOptNonceIndices)) {
					v_position := i;
					v_ret := e_success;
				}
		}
		return v_ret;
	}//end function f_isPresentNonceIndicesInBA
	
	/*
	 * @desc 	This goes through the BindingAck and
	 *			checks if a AuthorizationDataOption is present.
	 * @param 	p_bindingUpdate Binding Update to be treated
	 * @param 	v_position Position of the AuthorizationDataOption in the MobileOptionList
	 * @return 	execution status 
	*/
	function f_isPresentBindingAuthorizationDataOptionInBA(	in BindingAckMsg p_bindingAck,
														inout UInt8 v_position)
	runs on LibIpv6Node
	return FncRetCode {
		var FncRetCode v_ret := e_error;
		var UInt8 i;
	
		//select ext hdrs that need special calculation
		for (i:=0; i<sizeof(p_bindingAck.mobileOptions) and (v_ret != e_success); i:=i+1) {
			if (ischosen(p_bindingAck.mobileOptions[i].mobileBindingAuthorizationData)) {
					v_position := i;
					v_ret := e_success;
				}
		}
		return v_ret;
	}//end function f_isPresentBindingAuthorizationDataOptionInBA


	/*
	 * @desc 	This goes through the BindingUpdate and
	 *			checks if a NonceIndicesOption is present.
@@ -513,7 +639,7 @@ group rfc3775Mipv6_ExtHdrFunctions {
	 * @param 	v_position Position of the NonceIndicesOption in the MobileOptionList
	 * @return 	execution status 
	*/
	function f_isPresentNonceIndices(	in BindingUpdateMsg p_bindingUpdate,
	function f_isPresentNonceIndicesInBU(	in BindingUpdateMsg p_bindingUpdate,
														inout UInt8 v_position)
	runs on LibIpv6Node
	return FncRetCode {
@@ -528,7 +654,7 @@ group rfc3775Mipv6_ExtHdrFunctions {
				}
		}
		return v_ret;
	}//end function f_isPresentNonceIndices
	}//end function f_isPresentNonceIndicesInBU

	/*
	 * @desc 	This goes through the BindingUpdate and
@@ -537,7 +663,7 @@ group rfc3775Mipv6_ExtHdrFunctions {
	 * @param 	v_position Position of the AuthorizationDataOption in the MobileOptionList
	 * @return 	execution status 
	*/
	function f_isPresentBindingAuthorizationDataOption(	in BindingUpdateMsg p_bindingUpdate,
	function f_isPresentBindingAuthorizationDataOptionInBU(	in BindingUpdateMsg p_bindingUpdate,
														inout UInt8 v_position)
	runs on LibIpv6Node
	return FncRetCode {
@@ -552,7 +678,7 @@ group rfc3775Mipv6_ExtHdrFunctions {
				}
		}
		return v_ret;
	}//end function f_isPresentBindingAuthorizationDataOption
	}//end function f_isPresentBindingAuthorizationDataOptionInBU

	/*
	 * @desc 	This sends a IPv6 packet with MipExtHdr - Binding Update
+62 −0
Original line number Diff line number Diff line
@@ -2270,6 +2270,37 @@ group mobileSecurityFns {
				log(" **** a_cnReceiveBindingUpdateAndReplyOffHome: ERROR: Authenticator mismatch ****");
				v_ret := e_error;
			}
			
			// send BA if requested
			if(c_aFlag1 == v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.aFlag) {
				//Get SeqNr
				v_seqNr := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.sequenceNumber;
				//Get Lifetime
				v_lifetime := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.lifeTime;
				//GetHomeAddress
				v_mnHomeAddr := v_ipv6Packet.extHdrList[0].destinationOptionHeader.destOptionList[1].homeAddressOption.homeAddress;
				
				v_ret := f_sendBA (
					m_bindingAck (
						c_routeHdr,
						p_paramsCn.gla,
						p_paramsIut.mnCoa,
						m_extHdrList_2Elem (
							m_extHdr_routingHeader (
								c_mobileHdr,
								c_routeHdrLen2,
								c_routeHdrType2,
								c_routeHdrSegmentsLeft1,
								m_routingHeaderData_homeAddress(v_mnHomeAddr)),
							m_extHdr_mobileHeader (
								c_noNextHdr,
								c_bindingAck,
								m_bindingAckMsg(
									v_seqNr,
									v_lifetime,
									m_mobileOptList_1Elem (
										m_mobileOpt_padN(m_optPad4)))))));
			}				
		}	

		//2nd alternative: m_optPad4
@@ -2313,6 +2344,37 @@ group mobileSecurityFns {
				log(" **** a_cnReceiveBindingUpdateAndReplyOffHome: ERROR: Authenticator mismatch ****");
				v_ret := e_error;
			}

			// send BA if requested
			if(c_aFlag1 == v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.aFlag) {
				//Get SeqNr
				v_seqNr := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.sequenceNumber;
				//Get Lifetime
				v_lifetime := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.lifeTime;
				//GetHomeAddress
				v_mnHomeAddr := v_ipv6Packet.extHdrList[0].destinationOptionHeader.destOptionList[1].homeAddressOption.homeAddress;
				
				v_ret := f_sendBA (
					m_bindingAck (
						c_routeHdr,
						p_paramsCn.gla,
						p_paramsIut.mnCoa,
						m_extHdrList_2Elem (
							m_extHdr_routingHeader (
								c_mobileHdr,
								c_routeHdrLen2,
								c_routeHdrType2,
								c_routeHdrSegmentsLeft1,
								m_routingHeaderData_homeAddress(v_mnHomeAddr)),
							m_extHdr_mobileHeader (
								c_noNextHdr,
								c_bindingAck,
								m_bindingAckMsg(
									v_seqNr,
									v_lifetime,
									m_mobileOptList_1Elem (
										m_mobileOpt_padN(m_optPad4)))))));
			}
		}

	}//end a_cnReceiveBindingUpdateAndReplyOffHome