Commit 5031a032 authored by mullers's avatar mullers
Browse files

1. ESP example TC added

parent 96ede8d0
Loading
Loading
Loading
Loading
+67 −60
Original line number Diff line number Diff line
@@ -109,12 +109,16 @@ group rfc2460Root_Functions {
				p_dstAddr := p_extHdrList[i].tunneledIpv6.destinationAddress;

			}
		/*	else if (ischosen(p_extHdrList[i].)) {
				f_setSecurityHdr();
			}  */
			else if (ischosen(p_extHdrList[i].espHeader)) {

					v_ret := f_setEspHeader(p_ipv6Packet,
											p_extHdrList[i].espHeader);
			
			} 
		}//end for

		return v_ret;

	}//end f_setExtensionHeaders
		
	}//end group extHdrFns
@@ -704,68 +708,71 @@ group rfc4303Esp_ExtHdrFunctions {
		return v_key;
	}//end f_createSecretKey

//	function f_buildEspExtHdr(	
//			in Sa p_sa,
//			in PlaintextData p_plaintextData,
//			out ExtensionHeader p_extensionHeader)
//	runs on LibIpv6Node
//	return FncRetCode {
//		// Variables
//		var EncryptResult v_encryptResult;
///		var IntegrityResult v_integrityResult;
//		var FncRetCode v_ret := e_error;
//		var octetstring v_padding := c_1ZeroByte;
//TODO check this

	/*
		// Encrypt espPayloadData
		v_ret := fx_encrypt(	p_sa.ipSecProtocolMode,
								p_sa.espEncryptionAlgo,
								p_sa.espEncryptionKey,
								p_plaintextData,
								v_encryptResult);
		if ( v_ret != e_success ) {return v_ret;}
	
		// Fill EspExtHdr
		var EspHeader v_espHdr := valueof(m_espHdr_dummy);
		// Header
		v_espHdr.securityParametersIndex := p_sa.securityParametersIndex;
		v_espHdr.sequenceNumber := p_sa.sequenceNumber;
		// Payload
		if (ispresent(v_encryptResult.iv)) {
			v_espHdr.iv := v_encryptResult.iv;
		}
		// Encrypted payload is assigend for integrity calculation.
		// Afterwards plaintext will be assigned
		v_espHdr.espPayloadData.ciphertextData := v_encryptResult.ciphertextData;
		if (ispresent(v_encryptResult.tfcPadding)) {
			v_espHdr.tfcPadding := v_encryptResult.tfcPadding;
		}
		// Byte Align
		v_ret := fx_byteAlignEspHeader(4, v_espHdr, v_padding);
		if ( v_ret != e_success ) {return v_ret;}

		if (v_padding != c_1ZeroByte) {
			v_espHdr.padding := v_padding;
			v_espHdr.padLength := lengthof(v_padding);
		}

		// Integrity
		v_ret := fx_macEspHdr(	p_sa.espIntegrityAlgo,
									p_sa.espIntegrityKey,
									v_espHdr,
									v_integrityResult);
		if ( v_ret != e_success ) {return v_ret;}
		if (ispresent(v_integrityResult.icv)) {
			v_espHdr.icv := v_integrityResult.icv;
		}

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

		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
					v_originalIpv6Hdr := p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6;
				}
				else { //transportMode
					v_originalIpv6Hdr := p_ipv6Packet.ipv6Hdr;
				}
				//build original packet
				v_originalEchoRequest := {
					ipv6Hdr := v_originalIpv6Hdr,
					extHdrList := omit,
					ipv6Payload := p_espHeader.espPayload.espIpDatagram.ipv6Payload
				}
				//calc checksum 
				if (v_originalEchoRequest.ipv6Payload.echoRequestMsg.checksum != c_2ZeroBytes) {
					//calc checksum
					v_originalEchoRequest.ipv6Payload.echoRequestMsg.checksum := fx_icmpv6Checksum(v_originalEchoRequest);
				}
				//assign checksum
				p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoRequestMsg.checksum := v_originalEchoRequest.ipv6Payload.echoRequestMsg.checksum;
			}
			else if (ischosen(p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoReplyMsg)) {
				if (ischosen(p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6)) {//tunnelMode
					v_originalIpv6Hdr := p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6;
				}
				else { //transportMode
					v_originalIpv6Hdr := p_ipv6Packet.ipv6Hdr;
				}
				//build original packet
				v_originalEchoReply := {
					ipv6Hdr := v_originalIpv6Hdr,
					extHdrList := omit,
					ipv6Payload := p_espHeader.espPayload.espIpDatagram.ipv6Payload
				}
				//calc checksum 
				if (v_originalEchoReply.ipv6Payload.echoReplyMsg.checksum != c_2ZeroBytes) {
					//calc checksum
					v_originalEchoReply.ipv6Payload.echoReplyMsg.checksum := fx_icmpv6Checksum(v_originalEchoReply);
				}
				//assign checksum
				p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoReplyMsg.checksum := v_originalEchoReply.ipv6Payload.echoReplyMsg.checksum;
			}
		}

		return e_success;

	}//end f_setEspHeader

//	}//end function f_buildEspExtHdr	
	
}//end group rfc4303Esp_ExtHdrFunctions

+19 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
	import from LibIpv6_CommonRfcs_TypesAndValues all;
	import from LibIpv6_Rfc3775Mipv6_TypesAndValues all;
	import from LibIpv6_Rfc4068FastHandovers_TypesAndValues all;
	import from LibIpv6_Rfc2463Icmpv6_TypesAndValues all;

	group rfc2460Root_Templates {
	
@@ -607,6 +608,23 @@
	    } //end group ipv6AddressTemplates


		group ipv6PayloadTemplates {
			
			
		/*
		 *	@param  p_echoRequestMsg Echo Request Message
		*/
		template Ipv6Payload m_ipv6Payload_echoRequestMsg (
			in template EchoRequestMsg p_echoRequestMsg
		) := {
				echoRequestMsg := p_echoRequestMsg
		}

			
			
		}//end group ipv6Templates


	}//end group rfc2460Root_Templates

	group rfc3775Mipv6_ExtHdrTemplates {
+36 −0
Original line number Diff line number Diff line
@@ -61,6 +61,42 @@
	
	}//end f_sendEchoRequest

		/*
	 * @desc  	This sends an ICMPv6 echo request from an IPv6 node to 
	 *          any NUT. Prior it modifies IPv6 packet payload length 
	 *			and ICMPv6 checksum to their correct values using external 
	 *          functions.
	 * @remark  The template passed in must NOT contain any matching expressions!
	 * @param 	p_echoRequest Ipv6 packet value or template with echo request to be sent
	 * @return 	execution status
	*/
	function f_sendEchoRequestWithEsp (in template EchoRequestWithEsp p_echoRequestWithEsp) 
	runs on LibIpv6Node
	return FncRetCode {
		var EchoRequestWithEsp v_ipPkt;
		v_ipPkt := valueof(p_echoRequestWithEsp);
		if (ispresent(v_ipPkt.extHdrList)) {
			if(f_setExtensionHeaders(	v_ipPkt.extHdrList,
										v_ipPkt.ipv6Hdr.sourceAddress,
										v_ipPkt.ipv6Hdr.destinationAddress,
										v_ipPkt) != e_success) {
				log(" **** EchoRequestWithEsp: Error when calculating length of extension headers ****");
				return e_error;
			}
		}
		//calc payloadLen
		v_ipPkt.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		
		//calc checksum
		//this is done in f_setExtensionHeaders

		//send
		ipPort.send(v_ipPkt);
	
		return e_success;
	
	}//end f_sendEchoRequestWithEsp

	/*
	 * @desc  	This sends an ICMPv6 echo request from an IPv6 node to any NUT. 
	 *			Prior it modifies IPv6 packet payload length and ICMPv6 checksum 
+41 −2
Original line number Diff line number Diff line
@@ -580,6 +580,45 @@

	} // end group ICMPv6_Echo_Request

	group ICMPv6_Echo_Request_Esp {
		
		/*
		 *	@param  p_nextHeader Next header identifier value to be used.
		 *	@param  p_src Binary IPv6 address associated with the
		 *          test component.
		 *	@param  p_dst Binary IPv6 address associated with NUT.
		 *	@param  p_extHdrList List of extension header in the packet.
		*/
		template EchoRequestWithEsp m_echoRequest_esp (
			UInt8 p_nextHeader,
			template Ipv6Address p_src,
			template Ipv6Address p_dst,
			template ExtensionHeaderList p_extHdrList
		) := {
			ipv6Hdr := m_ipHdr_nextHdr_srcDst(p_nextHeader, p_src, p_dst),
			extHdrList := p_extHdrList,
			ipv6Payload := omit
		}
		
	}//end group ICMPv6_Echo_Request_Esp

	group ICMPv6_EchoRequestMsg {

		template EchoRequestMsg m_echoRequestMsg (
			UInt16 	p_id,
			UInt16 	p_seqNr
		) := {
				icmpType:= c_echoRequestMsg,
				icmpCode:= c_icmpCode0,
				checksum:= c_2ZeroBytes,
				identifier:= p_id,
				sequenceNumber:= p_seqNr,
				data:= omit
		}
		
	}//end group ICMPv6_EchoRequestPayload


	group ICMPv6_Other {

		/*
+1 −1

File changed.

Contains only whitespace changes.