Commit 9db98e2b authored by berge's avatar berge
Browse files

misc validation changes(index of SAD + function to retrieve index via SPI)

parent b5acb19b
Loading
Loading
Loading
Loading
+48 −12
Original line number Diff line number Diff line
@@ -171,14 +171,19 @@ group rfc2460Root_Functions {
				// Active packet has to be updated once the recursion call returns
				else if (ischosen(v_activeIpv6Packet.extHdrList[i].espHeader)) {

					var integer v_idx := -1;
					if (f_getSaBySpi(vc_sad, v_activeIpv6Packet.extHdrList[i].espHeader.spi, v_idx) == e_error) {
						return e_error;
					}
					
					// set IV if needed. 
					// Payload length may change.
					if (vc_sad[v_activeIpv6Packet.extHdrList[i].espHeader.spi].espEncryptionAlgo == e_encr_null) {
					if (vc_sad[v_idx].espEncryptionAlgo == e_encr_null) {
						v_activeIpv6Packet.extHdrList[i].espHeader.espPayload.iv := omit; 
					}
					else {
						v_activeIpv6Packet.extHdrList[i].espHeader.espPayload.iv := vc_sad[c_saOut].espIv;
						//int2oct(128, f_getEncryptionIvLen(vc_sad[v_activeIpv6Packet.extHdrList[i].espHeader.spi].espEncryptionAlgo)); 	
						v_activeIpv6Packet.extHdrList[i].espHeader.espPayload.iv := vc_sad[v_idx].espIv;
						//int2oct(128, f_getEncryptionIvLen(vc_sad[v_idx].espEncryptionAlgo)); 	
					}
						
					v_ret := f_getOriginalIpv6Packet(
@@ -268,30 +273,34 @@ group rfc2460Root_Functions {
			 and ischosen(v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader)) {
					
			//Set Dummy ICV of correct length
			v_spi := v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.securityParametersIndex;
			if (vc_sad[v_spi].ahIcvLen == 0) {
			var integer v_idx := -1;
			if (f_getSaBySpi(vc_sad, v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.securityParametersIndex, v_idx) == e_error) {
				return e_error;
			}
					
			if (vc_sad[v_idx].ahIcvLen == 0) {
				v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.icv := omit;	
			}
			else {
				v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.icv := int2oct(0, vc_sad[v_spi].ahIcvLen);
				v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.icv := int2oct(0, vc_sad[v_idx].ahIcvLen);
			}
	
			// Check ICV padding
			if (vc_sad[v_spi].ahIcvPadLen == 0) {
			if (vc_sad[v_idx].ahIcvPadLen == 0) {
				v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.icvPadding := omit;
			}
			else {
				v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.icvPadding := int2oct(0, vc_sad[v_spi].ahIcvPadLen);
				v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.icvPadding := int2oct(0, vc_sad[v_idx].ahIcvPadLen);
			}

			//	Update AuthHeader payloadLen
			v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.payloadLen := (12 + vc_sad[v_spi].ahIcvLen 
																			 	 	   + vc_sad[v_spi].ahIcvPadLen) / 4 - 2;
			v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.payloadLen := (12 + vc_sad[v_idx].ahIcvLen 
																			 	 	   + vc_sad[v_idx].ahIcvPadLen) / 4 - 2;
			//Update IPv6 payload based on the calculated ICV + padding
			v_activeIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (p_ipv6Packet);

			//compute icv
			if (vc_sad[v_spi].ahIcvLen != 0) {
			if (vc_sad[v_idx].ahIcvLen != 0) {
				// work on a temporary copy in order to be able to zero mutable fields
				v_tempIpv6Packet := v_activeIpv6Packet;

@@ -301,7 +310,8 @@ group rfc2460Root_Functions {
				
				// Compute ICV
				// !!!!! PS: changed ahIntegrityKey to ahIntegrityKeyInitiator, CHECK !!!!!
				v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.icv := fx_mac( vc_sad[v_spi].ahIntegrityAlgo , vc_sad[v_spi].ahIntegrityKeyInitiator, fx_encodeMessage(v_tempIpv6Packet));
				v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader.icv := 
					fx_mac( vc_sad[v_idx].ahIntegrityAlgo , vc_sad[v_idx].ahIntegrityKeyInitiator, fx_encodeMessage(v_tempIpv6Packet));
			}					
		}
		
@@ -1063,6 +1073,8 @@ group rfc4303Esp_ExtHdrFunctions {

		//Build original packet
		p_originalIpv6Packet.ipv6Hdr := p_ipv6Packet.ipv6Hdr;
		p_originalIpv6Packet.ipv6Hdr.nextHeader := p_espHeader.nextHeader;
		
		if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) {
			p_originalIpv6Packet.extHdrList := p_espHeader.espPayload.espIpDatagram.extHdrList;
		}
@@ -1161,6 +1173,30 @@ group rfc4303Esp_ExtHdrFunctions {
	}//end f_setEspHeader
*/
	
	/*
	 * @desc 	
	 *			This function is used to retrieve the index
	 *          within the SecurityAssociationList corresponding
	 *          to the given SPI.
	 *
	 * @param 	p_sad SecurityAssociationList to be treated	
	 * @param   p_spi SPI used to search for the list index
	 * @param   p_idx Index of the SA corresponding to p_spi
	 * @return 	execution status 
	*/
	function f_getSaBySpi(in Sad p_sad, in integer p_spi, out integer p_idx) return FncRetCode {
		var integer i := 0;
		for (i:=0; i<sizeof(p_sad); i:=i+1) {
			if (p_sad[i].spi == p_spi) {
				p_idx := i;
				return e_success;
			}
		}
		log("**** f_getSaBySpi: Could not find SPI! ****")	;			
		
		return e_error;
	}
	
}//end group rfc4303Esp_ExtHdrFunctions

	
+42 −42
Original line number Diff line number Diff line
@@ -335,7 +335,7 @@ group IcmpAndEspFns {
		var FncRetCode v_ret := e_error;
		var EchoReply v_msg;

		if (vc_sad[c_saOut].ipSecProtocolMode == e_transportMode) {
		if (vc_sad[0].ipSecProtocolMode == e_transportMode) {
			
			v_ret := f_sendEchoRequest (
				m_echoRequest_esp (
@@ -344,8 +344,8 @@ group IcmpAndEspFns {
					p_paramsIut.gla,
					m_extHdrList_1Elem (
						m_extHdr_espHeader(
							vc_sad[c_saOut].spi,
							vc_sad[c_saOut].seqNr,
							vc_sad[0].spi,
							vc_sad[0].seqNr,
							m_espIpDatagram(
								omit,
								m_ipv6Payload_echoRequestMsg(
@@ -355,7 +355,7 @@ group IcmpAndEspFns {
							c_icmpHdr))
				 ) );
			//increment SA-based seqNr
			vc_sad[c_saOut].seqNr := vc_sad[c_saOut].seqNr + 1;
			vc_sad[0].seqNr := vc_sad[0].seqNr + 1;
			if (v_ret != e_success) {return v_ret;}
			
			tc_ac.start;
@@ -367,7 +367,7 @@ group IcmpAndEspFns {
							p_paramsTn.gla,
							m_extHdrList_1Elem (
								mw_extHdr_espHeader(
									vc_sad[c_saIn].spi,
									vc_sad[0].spi,
									?,
									m_espIpDatagram(
										omit,
@@ -379,7 +379,7 @@ group IcmpAndEspFns {
							)) -> value v_msg {
						tc_ac.stop;
						//Save seqNr of IN SAD
						vc_sad[c_saIn].seqNr := v_msg.extHdrList[0].espHeader.seqNbr;
						vc_sad[0].seqNr := v_msg.extHdrList[0].espHeader.seqNbr;
						v_ret := e_success;
				}
				[]	tc_ac.timeout{
@@ -396,8 +396,8 @@ group IcmpAndEspFns {
					p_paramsTunnelEnd.gla,
					m_extHdrList_1Elem (
						m_extHdr_espHeader(
							vc_sad[c_saOut].spi,
							vc_sad[c_saOut].seqNr,
							vc_sad[0].spi,
							vc_sad[0].seqNr,
							m_espIpDatagram(
								m_extHdrList_1Elem(
									m_extHdr_tunneledHeader (
@@ -411,7 +411,7 @@ group IcmpAndEspFns {
							c_tunneledIpHdr))
				 ) );
			//increment SA-based seqNr
			vc_sad[c_saOut].seqNr := vc_sad[c_saOut].seqNr + 1;
			vc_sad[0].seqNr := vc_sad[0].seqNr + 1;
			if (v_ret != e_success) {return v_ret;}
			
			tc_ac.start;
@@ -423,7 +423,7 @@ group IcmpAndEspFns {
							p_paramsTunnelStart.gla,
							mw_extHdrList_1Elem_superSet (
								mw_extHdr_espHeader(
									vc_sad[c_saOut].spi,
									vc_sad[0].spi,
									?,
									m_espIpDatagram(
										m_extHdrList_1Elem(
@@ -439,7 +439,7 @@ group IcmpAndEspFns {
							)) -> value v_msg  {
						tc_ac.stop;
						//Save seqNr of IN SAD
						vc_sad[c_saIn].seqNr := v_msg.extHdrList[0].espHeader.seqNbr;
						vc_sad[0].seqNr := v_msg.extHdrList[0].espHeader.seqNbr;
						v_ret := e_success;
				}
				[]	tc_ac.timeout{
@@ -467,7 +467,7 @@ group IcmpAndEspFns {
	return FncRetCode {
		var FncRetCode v_ret := e_error;

		if (vc_sad[c_saOut].ipSecProtocolMode != e_transportMode) {
		if (vc_sad[0].ipSecProtocolMode != e_transportMode) {
			log("**** f_replyToEchoReq_transportMode; Error SA does not indicate transport Mode, but transport Mode is required****");
			return e_error;
		}
@@ -481,7 +481,7 @@ group IcmpAndEspFns {
						p_paramsTn.gla,
						m_extHdrList_1Elem (
							mw_extHdr_espHeader(
								vc_sad[c_saOut].spi,
								vc_sad[0].spi,
								p_seqNr,
								m_espIpDatagram(
									omit,
@@ -507,7 +507,7 @@ group IcmpAndEspFns {
				p_paramsIut.gla,
				m_extHdrList_1Elem (
					m_extHdr_espHeader(
						vc_sad[c_saOut].spi,
						vc_sad[0].spi,
						p_seqNr + 1,
						m_espIpDatagram(
							omit,
@@ -539,7 +539,7 @@ group IcmpAndEspFns {
	return FncRetCode {
		var FncRetCode v_ret := e_error;

		if (vc_sad[c_saOut].ipSecProtocolMode != e_tunnelMode) {
		if (vc_sad[0].ipSecProtocolMode != e_tunnelMode) {
			log("**** f_replyToEchoReq_tunnelMode; Error SA does not indicate tunnel Mode, but tunnel Mode is required****");
			return e_error;
		}
@@ -553,7 +553,7 @@ group IcmpAndEspFns {
						p_paramsTunnelStart.gla,
						mw_extHdrList_1Elem_superSet (
							mw_extHdr_espHeader(
								vc_sad[c_saOut].spi,
								vc_sad[0].spi,
								p_seqNr,
								m_espIpDatagram(
									m_extHdrList_1Elem(
@@ -583,7 +583,7 @@ group IcmpAndEspFns {
				p_paramsTunnelEnd.gla,
				m_extHdrList_1Elem (
					m_extHdr_espHeader(
						vc_sad[c_saOut].spi,
						vc_sad[0].spi,
						p_seqNr + 1,
						m_espIpDatagram(
							m_extHdrList_1Elem(
@@ -627,15 +627,15 @@ group IcmpAndAuthHeaderFns {
	{
		var EchoRequest v_echoRequest;
			
		if (vc_sad[c_saOut].ipSecProtocolMode == e_transportMode) {
		if (vc_sad[0].ipSecProtocolMode == e_transportMode) {
			// Transport mode
			v_echoRequest := valueof(m_echoRequest_extHdr_noData (
				c_authHdr,
				m_extHdrList_1Elem (
					m_extHdr_AHHeaders(
						c_icmpHdr,
						vc_sad[c_saOut].spi,
						vc_sad[c_saOut].seqNr)),
						vc_sad[0].spi,
						vc_sad[0].seqNr)),
				p_paramsTn.gla,
				p_paramsIut.gla,
				c_defId,
@@ -649,8 +649,8 @@ group IcmpAndAuthHeaderFns {
				m_extHdrList_2Elem (
					m_extHdr_AHHeaders(
						c_tunneledIpHdr,
						vc_sad[c_saOut].spi,
						vc_sad[c_saOut].seqNr),
						vc_sad[0].spi,
						vc_sad[0].seqNr),
					m_extHdr_tunneledHeader (
						c_icmpHdr,
						p_paramsTn.gla,
@@ -678,15 +678,15 @@ group IcmpAndAuthHeaderFns {
	{
		var EchoRequest v_echoRequest;
			
		if (vc_sad[c_saOut].ipSecProtocolMode == e_transportMode) {
		if (vc_sad[0].ipSecProtocolMode == e_transportMode) {
			// Transport mode
			v_echoRequest := valueof(m_echoRequest_extHdr_noData (
				c_authHdr,
			m_extHdrList_1Elem (
				m_extHdr_AHHeaders(
					c_icmpHdr,
					vc_sad[c_saOut].spi,
					vc_sad[c_saOut].seqNr)),
					vc_sad[0].spi,
					vc_sad[0].seqNr)),
				p_paramsRt.gla,
				p_paramsIut.gla,
				p_id,
@@ -698,8 +698,8 @@ group IcmpAndAuthHeaderFns {
			m_extHdrList_1Elem (
				m_extHdr_AHHeaders(
					c_tunneledIpHdr,
					vc_sad[c_saOut].spi,
					vc_sad[c_saOut].seqNr)),
					vc_sad[0].spi,
					vc_sad[0].seqNr)),
				p_paramsRt.gla,
				p_paramsIut.gla,
				p_id,
@@ -720,15 +720,15 @@ group IcmpAndAuthHeaderFns {
	{
		var EchoRequest v_echoRequest;
			
		if (vc_sad[c_saOut].ipSecProtocolMode == e_transportMode) {
		if (vc_sad[0].ipSecProtocolMode == e_transportMode) {
			// Transport mode
			v_echoRequest := valueof(m_echoRequest_extHdr_noData (
				c_authHdr,
				m_extHdrList_1Elem (
					m_extHdr_AHHeaders(
						c_icmpHdr,
						vc_sad[c_saOut].spi,
						vc_sad[c_saOut].seqNr)),
						vc_sad[0].spi,
						vc_sad[0].seqNr)),
				p_paramsTn.lla,
				p_paramsIut.lla,
				c_defId,
@@ -742,8 +742,8 @@ group IcmpAndAuthHeaderFns {
				m_extHdrList_2Elem (
					m_extHdr_AHHeaders(
						c_tunneledIpHdr,
						vc_sad[c_saOut].spi,
						vc_sad[c_saOut].seqNr),
						vc_sad[0].spi,
						vc_sad[0].seqNr),
					m_extHdr_tunneledHeader (
						c_icmpHdr,
						p_paramsTn.lla,
@@ -767,15 +767,15 @@ group IcmpAndAuthHeaderFns {
			
			var EchoRequest v_echoRequest;
				
			if (vc_sad[c_saOut].ipSecProtocolMode == e_transportMode) {
			if (vc_sad[0].ipSecProtocolMode == e_transportMode) {
				// Transport mode
				v_echoRequest := valueof(m_echoRequest_extHdr_noData (
					c_authHdr,
					m_extHdrList_2Elem (
						m_extHdr_AHHeaders(
							c_fragHdr,
							vc_sad[c_saOut].spi,
							vc_sad[c_saOut].seqNr), // ICV is set to 0 before authentication
							vc_sad[0].spi,
							vc_sad[0].seqNr), // ICV is set to 0 before authentication
						m_extHdr_fragmentHeader(
							c_icmpHdr,
							c_fragOffset2,
@@ -792,8 +792,8 @@ group IcmpAndAuthHeaderFns {
					m_extHdrList_3Elem (
						m_extHdr_AHHeaders(
							c_tunneledIpHdr,
							vc_sad[c_saOut].spi,
							vc_sad[c_saOut].seqNr),
							vc_sad[0].spi,
							vc_sad[0].seqNr),
						m_extHdr_tunneledHeader (
							c_fragHdr,
							p_paramsRt.gla,
@@ -821,7 +821,7 @@ group IcmpAndAuthHeaderFns {
		
			var NeighborSolicitation v_nbrSol;
				
			if (vc_sad[c_saOut].ipSecProtocolMode == e_transportMode) {
			if (vc_sad[0].ipSecProtocolMode == e_transportMode) {
				// Transport mode
				v_nbrSol := valueof(m_nbrSol_extHdr (
					c_authHdr,
@@ -831,8 +831,8 @@ group IcmpAndAuthHeaderFns {
					m_extHdrList_1Elem (
						m_extHdr_AHHeaders(
							c_icmpHdr,
							vc_sad[c_saOut].spi,
							vc_sad[c_saOut].seqNr)))); // ICV is set to 0 before authentication
							vc_sad[0].spi,
							vc_sad[0].seqNr)))); // ICV is set to 0 before authentication
			}else{
			// Generate a Neigbor Solicitation message with Authentication Header in tunnel mode
				v_nbrSol := valueof(m_nbrSol_extHdr (
@@ -843,8 +843,8 @@ group IcmpAndAuthHeaderFns {
					m_extHdrList_1Elem (
						m_extHdr_AHHeaders(
							c_tunneledIpHdr,
							vc_sad[c_saOut].spi,
							vc_sad[c_saOut].seqNr))));
							vc_sad[0].spi,
							vc_sad[0].seqNr))));
		}
		return v_nbrSol;
	}// end f_generateNrbSolWithAh
+1 −1
Original line number Diff line number Diff line
@@ -449,7 +449,7 @@ module LibIpv6_Rfc4306Ikev2_Functions {
		v_ret := fx_calculateKEYMATandDistribute(p_ikeSad.ikePseudoRandomFunction,
												 p_ikeSad.sevenSecrets.sK_d,
												 (p_ikeSad.nI & p_ikeSad.nR),
												 v_encIntKeys)
												 v_encIntKeys);

		if (v_ret != e_success) {return v_ret;}