Commit d8c13888 authored by mullers's avatar mullers
Browse files

f_setExtensionHeaders modified for ESP

parent 5031a032
Loading
Loading
Loading
Loading
+113 −18
Original line number Diff line number Diff line
@@ -78,24 +78,27 @@ group rfc2460Root_Functions {
		var UInt8 v_nrOfTunnelHdr := 0;
		var Ipv6Address v_pseudoSrcAddr := c_16ZeroBytes;
		var Ipv6Address v_pseudoDstAddr := c_16ZeroBytes;
		var boolean v_loop := true;
		var Ipv6Packet v_originalIpv6Packet;
		var Ipv6Packet v_activeIpv6Packet := p_ipv6Packet;

		for (i:=0; i<sizeof(p_extHdrList);i:=i+1) {
		for (i:=0; i<sizeof(p_extHdrList) and v_loop ;i:=i+1) {
			if (ischosen(p_extHdrList[i].mobileHeader)) {
				if (f_isPresentHomeAddressOption(p_extHdrList, v_homeAddress) == e_success) {//used in all packets that are sent to registered CN
					v_pseudoSrcAddr := v_homeAddress;
					v_pseudoDstAddr := p_dstAddr;
					v_pseudoDstAddr := v_activeIpv6Packet.ipv6Hdr.destinationAddress;
				}
				else if (f_isPresentRoutingHeaderType2(p_extHdrList, v_homeAddress) == e_success) {
					v_pseudoSrcAddr := p_srcAddr;					
					v_pseudoSrcAddr := v_activeIpv6Packet.ipv6Hdr.sourceAddress;					
					v_pseudoDstAddr := v_homeAddress;
				}
				else {
					v_pseudoSrcAddr := p_srcAddr;					
					v_pseudoDstAddr := p_dstAddr;
					v_pseudoSrcAddr := v_activeIpv6Packet.ipv6Hdr.sourceAddress;					
					v_pseudoDstAddr := v_activeIpv6Packet.ipv6Hdr.destinationAddress;
				}
				
				v_ret := f_setMobileHeader(	p_srcAddr,
											p_dstAddr,
				v_ret := f_setMobileHeader(	v_activeIpv6Packet.ipv6Hdr.sourceAddress,
											v_activeIpv6Packet.ipv6Hdr.destinationAddress,
											v_pseudoSrcAddr,					
											v_pseudoDstAddr,
											p_extHdrList[i].mobileHeader);
@@ -105,24 +108,65 @@ group rfc2460Root_Functions {
				p_extHdrList[i].tunneledIpv6.payloadLength := fx_tunnelledPayloadLength(p_ipv6Packet, v_nrOfTunnelHdr);
				
				// Tunneled header is the active packet
				p_srcAddr := p_extHdrList[i].tunneledIpv6.sourceAddress;
				p_dstAddr := p_extHdrList[i].tunneledIpv6.destinationAddress;

				//p_srcAddr := p_extHdrList[i].tunneledIpv6.sourceAddress;
				//p_dstAddr := p_extHdrList[i].tunneledIpv6.destinationAddress;
				v_activeIpv6Packet.ipv6Hdr.sourceAddress := p_extHdrList[i].tunneledIpv6.sourceAddress;
				v_activeIpv6Packet.ipv6Hdr.destinationAddress := p_extHdrList[i].tunneledIpv6.destinationAddress;
			}
			else if (ischosen(p_extHdrList[i].espHeader)) {

					v_ret := f_setEspHeader(p_ipv6Packet,
											p_extHdrList[i].espHeader);
					v_ret := f_getOriginalIpv6Packet(
									v_activeIpv6Packet,
									p_extHdrList[i].espHeader,
									v_originalIpv6Packet);
					if (v_ret == e_success) {
						if (ispresent(v_originalIpv6Packet.extHdrList)) {
							p_extHdrList := v_originalIpv6Packet.extHdrList;
						}
						p_srcAddr := v_originalIpv6Packet.ipv6Hdr.sourceAddress;
						p_dstAddr := v_originalIpv6Packet.ipv6Hdr.destinationAddress;
						v_activeIpv6Packet := v_originalIpv6Packet;

						f_setExtensionHeaders(	p_extHdrList,
												p_srcAddr,
												p_dstAddr,
												v_activeIpv6Packet);

						v_loop := false;
					}
			} 
		}//end for

		if (ispresent(v_activeIpv6Packet.ipv6Payload)) {
			v_ret := f_calcIpv6PayloadChecksum(v_activeIpv6Packet);
		}

		return v_ret;

	}//end f_setExtensionHeaders
		
	}//end group extHdrFns

	function f_calcIpv6PayloadChecksum( inout Ipv6Packet p_ipv6Packet)
	return FncRetCode {
		
		if(ischosen(p_ipv6Packet.ipv6Payload.echoReplyMsg)) {
			if(p_ipv6Packet.ipv6Payload.echoReplyMsg.checksum != c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.echoReplyMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.echoRequestMsg)) {
			if(p_ipv6Packet.ipv6Payload.echoRequestMsg.checksum != c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.echoRequestMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
			}
		}

		return e_success;

	}//end f_calcIpv6PayloadChecksum


    } //end group ipv6Packets
	
@@ -708,22 +752,73 @@ group rfc4303Esp_ExtHdrFunctions {
		return v_key;
	}//end f_createSecretKey

	/*
	 * @desc 	
	 *			This function is used when sending messages.
	 * @param 	p_msg ExtensionHeaderList to be treated	
	 * @return 	execution status 
	*/
	function f_getOriginalIpv6Packet(	in Ipv6Packet p_ipv6Packet,
										in EspHeader p_espHeader,
										out Ipv6Packet p_originalIpv6Packet)
	runs on LibIpv6Node
	return FncRetCode {
		var UInt8 i;
		var boolean v_loop := true;

		if (not(ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList))
			and not(ispresent(p_espHeader.espPayload.espIpDatagram.ipv6Payload))) {
				log("**** f_setEspHeader: EspHeader.espPayload.espIpDatagram received that does neither contain extHdrList not ipv6Payload => EspHeader is not constructed correctly ****")				
				return e_error;
		}

		//Build original packet
		p_originalIpv6Packet.ipv6Hdr := p_ipv6Packet.ipv6Hdr;
		if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) {
			p_originalIpv6Packet.extHdrList := p_espHeader.espPayload.espIpDatagram.extHdrList;
		}
		if (ispresent(p_espHeader.espPayload.espIpDatagram.ipv6Payload)) {
			p_originalIpv6Packet.ipv6Payload := p_espHeader.espPayload.espIpDatagram.ipv6Payload;
		}

		// is a tunneledIpv6Hdr in the extHdrList? If yes, then it becomes the Ipv6Hdr of the original packet
		if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) {
			for (i:=0; i<sizeof(p_espHeader.espPayload.espIpDatagram.extHdrList) and v_loop ;i:=i+1) {
				if (ischosen(p_espHeader.espPayload.espIpDatagram.extHdrList[i].tunneledIpv6)) {
					p_originalIpv6Packet.ipv6Hdr := p_espHeader.espPayload.espIpDatagram.extHdrList[i].tunneledIpv6;
					v_loop := false;
				}
				else {
					p_originalIpv6Packet.extHdrList[i] := p_espHeader.espPayload.espIpDatagram.extHdrList[i];	
				}
			}
		}

		return e_success;

	}//end f_setEspHeader


	/*
	 * @desc 	This goes through the Mip header and calculates length, checksum
	 *			and other specific functions of the different messages.
	 * @desc 	
	 *			This function is used when sending messages.
	 * @param 	p_msg ExtensionHeaderList to be treated	
	 * @return 	execution status 
	*/
	function f_setEspHeader(	in Ipv6Packet p_ipv6Packet,
								/*in*/inout EspHeader p_espHeader)
/*	function f_setEspHeader(	in Ipv6Packet p_ipv6Packet,
								inout EspHeader p_espHeader)
	runs on LibIpv6Node
	return FncRetCode {
		var Ipv6Header v_originalIpv6Hdr;
		var EchoRequest v_originalEchoRequest;
		var EchoReply v_originalEchoReply;

		//treat MipHdr and other ext
		if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) {
			
			
		}

		if (ispresent(p_espHeader.espPayload.espIpDatagram.ipv6Payload)) {
			if (ischosen(p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoRequestMsg)) {	
				if (ischosen(p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6)) {//tunnelMode
@@ -772,7 +867,7 @@ group rfc4303Esp_ExtHdrFunctions {
		return e_success;

	}//end f_setEspHeader

*/
	
}//end group rfc4303Esp_ExtHdrFunctions

+0 −21
Original line number Diff line number Diff line
@@ -1470,27 +1470,6 @@

	group cryptoTemplates {

//		template PlaintextData m_plaintextData (in template ExtensionHeaderList p_extensionHeaderList,
//												in template Ipv6Payload p_ipv6Payload) := {
//			extHdrList := p_extensionHeaderList,
//			ipv6Payload := p_ipv6Payload
//		}
//TODO check this, maybe add parameter for iv, etc...
/*		template PlaintextData m_plaintextData (in template ExtensionHeaderList p_extensionHeaderList,
												in template Ipv6Payload p_ipv6Payload) := {
			iv := omit,
			espPayloadData := {
				extHdrList := p_extensionHeaderList,
				ipv6Payload := p_ipv6Payload,
				tfcPadding := omit
			},
			padding := omit,
			padLength := 0,
			nextHdr := 135
		}

*/

	template EspIpDatagram m_espIpDatagram(template ExtensionHeaderList p_extHdrList, template Ipv6Payload p_ipv6Payload) := {
		extHdrList :=  p_extHdrList,
		ipv6Payload := p_ipv6Payload
+4 −4
Original line number Diff line number Diff line
@@ -1085,11 +1085,11 @@ module LibIpv6_Interface_TypesAndValues {
				UInt32				spi,//random, from SAD
				UInt32				seqNbr,//counter value, from SAD	
				// Payload
				EspPayload			espPayload,
/*encrypted*/	EspPayload			espPayload,
				// Trailer
				Oct1to255			padding optional,//depends on enc-algo
				UInt8				padLength,//depends on enc-algo
				UInt8				nextHdr,
/*encrypted*/	Oct1to255			padding optional,//depends on enc-algo
/*encrypted*/	UInt8				padLength,//depends on enc-algo
/*encrypted*/	UInt8				nextHdr,
				octetstring			icv optional// depends on integrity-algo
			}
			with {
+3 −2
Original line number Diff line number Diff line
@@ -84,12 +84,13 @@
				return e_error;
			}
		}
		//calc payloadLen
		v_ipPkt.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		
		//calc checksum
		//this is done in f_setExtensionHeaders

		//calc payloadLen
		//this is done in test adapter

		//send
		ipPort.send(v_ipPkt);