Commit 14167028 authored by berge's avatar berge
Browse files

msg 1 + 2 validated

parent 8c3a724a
Loading
Loading
Loading
Loading
+37 −7
Original line number Diff line number Diff line
@@ -292,6 +292,7 @@ group ipSecFns {
	function f_getIcvLen(IntegrityAlgo p_integrityAlgo)
	runs on LibIpv6Node
	return UInt8 {
			
		if(p_integrityAlgo == e_auth_sha1/*e_sha1*/) {
			return 20;
		}
@@ -305,6 +306,7 @@ group ipSecFns {
		return 12;
	}
	
	
	//in units of octets
	function f_getIcvPadLen(IntegrityAlgo p_integrityAlgo)
	runs on LibIpv6Node
@@ -347,7 +349,7 @@ group ipSecFns {
	}

	//in units of octets
	function f_getIntegrKeyLen( in IntegrityAlgo p_integrityAlgo, out UInt8 p_keyLen)
	function f_getIntegrKeyLen( in IntegrityAlgo p_integrityAlgo, out template UInt8 p_keyLen)
	return FncRetCode {

		if(p_integrityAlgo == e_auth_hmacMd5_96){
@@ -392,7 +394,7 @@ group ipSecFns {
	}//end function f_getIntegrKeyLen

	//in units of octets
	function f_getPrfKeyLen( in PseudoRandomFunction p_pseudoRandomFunction, out UInt8 p_keyLen)
	function f_getPrfKeyLen( in PseudoRandomFunction p_pseudoRandomFunction, out template UInt8 p_keyLen)
	return FncRetCode {

		if(p_pseudoRandomFunction == e_prfHmacMd5){
@@ -424,18 +426,44 @@ group ipSecFns {
	function f_getEncryptionIvLen(EncryptionAlgo p_encryptionAlgo)
	runs on LibIpv6Node
	return UInt8 {
		if(p_encryptionAlgo == e_encr_3Des/*e_tripleDes_cbc*/) {
		
		if (p_encryptionAlgo == e_encr_desIv64){
			return 8;
		}
		else if(p_encryptionAlgo == e_encr_des/*e_des_cbc*/) {
			return 8;	
		}
		else if(p_encryptionAlgo == e_encr_3Des/*e_tripleDes_cbc*/) {
			return 8;
		}
		else if(p_encryptionAlgo == e_encr_rc5){
			return 0;
		}
		else if(p_encryptionAlgo == e_encr_idea){
			return 0;
		}		
		else if(p_encryptionAlgo == e_encr_cast){
			return 0;
		}
		else if(p_encryptionAlgo == e_encr_blowfish){
			return 0;
		}
		else if(p_encryptionAlgo == e_encr_3Idea){
			return 0;
		}
		else if(p_encryptionAlgo == e_encr_desIv32){
			return 4;
		}	
		else if (p_encryptionAlgo == e_encr_aesCbc/*e_aes_cbc*/){
			return 16;
		}
		else if(p_encryptionAlgo == e_encr_aesCtr/*e_aes_ctr*/) {
			return 8;	
		}
		else if(p_encryptionAlgo == e_encr_des/*e_des_cbc*/) {
			return 8;	
		else if(p_encryptionAlgo == e_encr_null) {
			return 0;	
		}
		
		return 0;
	}

@@ -460,7 +488,7 @@ group ipSecFns {
	}

	//in units of octets
	function f_getEncrKeyLen( in EncryptionAlgo p_encryptionAlgo, out UInt8 p_keyLen)
	function f_getEncrKeyLen( in EncryptionAlgo p_encryptionAlgo, out template UInt8 p_keyLen)
	return FncRetCode {

		if(p_encryptionAlgo == e_encr_desIv64){
@@ -509,6 +537,7 @@ group ipSecFns {
		}
		else {
			log("**** f_getEncrKeyLen: Error: Unknown encryption algorithm ****");
			p_keyLen := 255;
			return e_error;
		}
		
@@ -788,6 +817,7 @@ group ipSecFns {
	return UInt8 {
		var UInt8 v_len := 0;

//FIXME		
		if ( match(p_saTransformAttributeList, SaTransformAttributeList:omit)) {
			log("**** SaTransformAttributeList omitted ****");
		}
+26 −4
Original line number Diff line number Diff line
@@ -223,21 +223,43 @@ group rfc2460Root_Functions {
					v_activeIpv6Packet.ipv6Payload.ikeMsg.padding := c_4ZeroBytes;
				}
				
				if(ischosen(v_activeIpv6Packet.ipv6Payload.ikeMsg.payloadList[0].encrypted)) {
					
					// set IV if needed. 
					if (f_getEncryptionIvLen(vc_ikeSad[0].ikeEncryptionAlgo) == 0) {
						v_activeIpv6Packet.ipv6Payload.ikeMsg.payloadList[0].encrypted.iv := omit; 
					}
					else {
						v_activeIpv6Packet.ipv6Payload.ikeMsg.payloadList[0].encrypted.iv := 
						int2oct(128, f_getEncryptionIvLen(vc_ikeSad[0].ikeEncryptionAlgo)); 	
					}
					//Payload length
					if(v_activeIpv6Packet.ipv6Payload.ikeMsg.payloadList[0].encrypted.payloadLength == 0) {
						v_activeIpv6Packet.ipv6Payload.ikeMsg.payloadList[0].encrypted.payloadLength := fx_ikeEncPayloadLength(v_activeIpv6Packet.ipv6Payload.ikeMsg.payloadList[0].encrypted); 
					}
					v_activeIpv6Packet.ipv6Payload.ikeMsg.ikev2Header.messageLength := c_ikev2HeaderLen + lengthof(fx_ikePayloadListToOct(v_activeIpv6Packet.ipv6Payload.ikeMsg.payloadList));
				}

				if(v_activeIpv6Packet.ipv6Payload.ikeMsg.msgLength == 0) {
					//calc payloadLen of UDP msg
					v_activeIpv6Packet.ipv6Payload.ikeMsg.msgLength := 	8 + f_getLenPadding(v_activeIpv6Packet.ipv6Payload.ikeMsg) +
														lengthof(fx_ikev2HeaderToOct(v_activeIpv6Packet.ipv6Payload.ikeMsg.ikev2Header))
														+ lengthof(fx_ikePayloadListToOct(v_activeIpv6Packet.ipv6Payload.ikeMsg.payloadList));
					v_activeIpv6Packet.ipv6Payload.ikeMsg.msgLength := 	8 + f_getLenPadding(v_activeIpv6Packet.ipv6Payload.ikeMsg)
														//lengthof(fx_ikev2HeaderToOct(v_activeIpv6Packet.ipv6Payload.ikeMsg.ikev2Header))
														//+ lengthof(fx_ikePayloadListToOct(v_activeIpv6Packet.ipv6Payload.ikeMsg.payloadList));
														+ v_activeIpv6Packet.ipv6Payload.ikeMsg.ikev2Header.messageLength;
				}
			}
			
			// Update the active packet						
			v_activeIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (v_activeIpv6Packet);

			// Compute payload checksum (Icmpv6, UDP, ...)
			v_ret := f_calcIpv6PayloadChecksum(v_pseudoSrcAddr, v_pseudoDstAddr, v_activeIpv6Packet.ipv6Payload);
		}
		
		// Proccess Authentication, non-recursive
		// Compute ICV and ICV-Padding
		if (     v_authHdrIndex<sizeof(v_activeIpv6Packet.extHdrList) 
		if ( ispresent(v_activeIpv6Packet.extHdrList)
			 and v_authHdrIndex<sizeof(v_activeIpv6Packet.extHdrList) 
			 and ischosen(v_activeIpv6Packet.extHdrList[v_authHdrIndex].authHeader)) {
					
			//Set Dummy ICV of correct length
+30 −16
Original line number Diff line number Diff line
@@ -711,8 +711,8 @@ module LibIpv6_Rfc4306Ikev2_Functions {
									in template Ipv6Address p_dst)
	runs on LibIpv6Node
	return FncRetCode {
		var FncRetCode v_ret;
		var FncRetCode v_ret_local;
		var FncRetCode v_ret := e_success;
		var FncRetCode v_ret_local := e_success;
		var Ipv6Packet v_ipv6Packet;
		// next payload from IKE header
		var UInt8 v_nextPayload;
@@ -753,6 +753,10 @@ module LibIpv6_Rfc4306Ikev2_Functions {
					{ if (vc_ikeSad[0].diffieHellmanGroup != v_ikePayload.keyExchange.dhGroup)
						{ v_ret := e_error;
						  log("**** f_waitForIkeSaInitRsp: ERROR: Key Exchange payload indicates wrong Diffie-Hellman group **** "); }
						// calculate shared Diffie-Hellman secret
						vc_ikeSad[0].diffieHellmanSharedSecret := fx_dHSharedSecret(vc_ikeSad[0].diffieHellmanGroup,
																					PX_IKE_DIFFIEHELLMAN_PRIVKEY,
																					v_ikePayload.keyExchange.data);					
					}
					else
					{ log("**** f_waitForIkeSaInitRsp: ERROR: No Key Exchange payload in payload list **** ");
@@ -1254,14 +1258,17 @@ group establishSAFns_active {
		}
		
		// wait for IKE_SA_INIT response
		v_ret := f_waitForIkeSaInitRsp(p_addrIut,p_addrTn);
		v_ret := f_waitForIkeSaInitRsp(p_addrIut,p_addrTn);//todo smu 2007 add tunnel mode
		if (v_ret != e_success) { return v_ret;}

		//fill keyLen
		vc_ikeSad[0].ikeEncrKeyLen := 0;
		v_ret := f_getEncrKeyLen(vc_ikeSad[0].ikeEncryptionAlgo, vc_ikeSad[0].ikeEncrKeyLen);
		if (v_ret != e_success) { return v_ret;}
		vc_ikeSad[0].ikeIntegrKeyLen := 0;
		v_ret := f_getIntegrKeyLen(vc_ikeSad[0].ikeIntegrityAlgo, vc_ikeSad[0].ikeIntegrKeyLen);
		if (v_ret != e_success) { return v_ret;}
		vc_ikeSad[0].prfKeyLen :=0;
		v_ret := f_getPrfKeyLen(vc_ikeSad[0].ikePseudoRandomFunction, vc_ikeSad[0].prfKeyLen);
		if (v_ret != e_success) { return v_ret;}

@@ -1320,13 +1327,13 @@ group establishSAFns_active {
					m_ikePlList_1Elem(
						m_encryptedPL(
							c_idInitiatorPL,
							m_ikePlList_4Elem(
							m_ikePlList_5Elem(
								m_idInitiatorPL (	
									c_authenticationPL,
									p_addrTn
								),
								m_authPL (	
									c_authenticationPL,
									c_saPL,
									f_calculateAUTH(vc_ikeSad[0],c_initiator)
								),
								m_securityAssociationPL(
@@ -1351,15 +1358,20 @@ group establishSAFns_active {
								),
								m_tsInitiatorPL(
									c_noNextPL,
									m_trafficSelectorList_2Elem (
									m_trafficSelectorList_1Elem (
										m_icmpv6Ts(
											c_echoRequestMsg,
											p_addrTn,
											p_addrIut
											p_addrTn
										)
									)
								),
								m_tsResponderPL(
									c_noNextPL,
									m_trafficSelectorList_1Elem (
										m_icmpv6Ts(
											c_echoReplyMsg,
											p_addrTn,
											c_echoRequestMsg,
											p_addrIut,
											p_addrIut
										)
									)
@@ -1380,8 +1392,10 @@ group establishSAFns_active {
		if (v_ret != e_success) { return v_ret;}
		
		//fill keyLen
		vc_sad[c_saOut].espEncrKeyLen := 0;
		v_ret := f_getEncrKeyLen(vc_sad[c_saOut].espEncryptionAlgo, vc_sad[c_saOut].espEncrKeyLen);
		if (v_ret != e_success) { return v_ret;}
		vc_sad[c_saOut].espIntegrKeyLen := 0;
		v_ret := f_getIntegrKeyLen(vc_sad[c_saOut].espIntegrityAlgo, vc_sad[c_saOut].espIntegrKeyLen);
		if (v_ret != e_success) { return v_ret;}

+49 −7
Original line number Diff line number Diff line
@@ -223,7 +223,7 @@
											UInt8 p_nextPayload,
											UInt32 p_messageID,
											template IkePayloadList p_ikepayloads) := {
			ipv6Hdr :=  mw_ipHdr_nextHdr_srcDst(c_udpHdr, p_src, p_dst),
			ipv6Hdr :=  m_ipHdr_nextHdr_srcDst(c_udpHdr, p_src, p_dst),
			extHdrList        := omit,
			ipv6Payload       := {
				ikeMsg := {
@@ -246,7 +246,7 @@
						iFlag         := c_iFlagInitiator,
						threeXFlags   := 0,
						messageID     := p_messageID,
						messageLength := c_uInt32Zero
						messageLength := 0
					},
					// IKEv2 Payloads
					payloadList   := p_ikepayloads
@@ -508,6 +508,27 @@ group payloadTemplates {
			p_ikePayload4
	}

	/*
	 *	@param  p_ikePayload1 First element in IkePayloadList
	 *	@param  p_ikePayload2 Second element in IkePayloadList
	 *	@param  p_ikePayload3 Third element in IkePayloadList
	 *	@param  p_ikePayload4 Third element in IkePayloadList
	 *	@param  p_ikePayload5 Third element in IkePayloadList
	*/
	template IkePayloadList m_ikePlList_5Elem(
		template IkePayload p_ikePayload1,
		template IkePayload p_ikePayload2,
		template IkePayload p_ikePayload3,
		template IkePayload p_ikePayload4,
		template IkePayload p_ikePayload5) := {
			p_ikePayload1,
			p_ikePayload2,
			p_ikePayload3,
			p_ikePayload4,
			p_ikePayload5
	}


	group ikeKeyExchangePayloadTemplates {

		template IkePayload mw_keyExchangePL := {
@@ -688,13 +709,34 @@ group trafficSelectionPLTmplts {
				nextPayload			:= p_nextPayload,
				criticalFlag 		:= 0,
				reserved1	 		:= c_uInt7Zero,
				payloadLength 		:= sizeof(valueof(p_trafficSelectorList)) * 40,
				payloadLength 		:= 8 + sizeof(valueof(p_trafficSelectorList)) * 40,
				numberOfTs			:= sizeof(valueof(p_trafficSelectorList)),
				reserved2			:= c_uInt24Zero,
				trafficSelectorList	:= p_trafficSelectorList
			}
	}
	
	
	template IkePayload m_tsResponderPL(
		UInt8					p_nextPayload,
		template TrafficSelectorList 	p_trafficSelectorList) := {
			tsResponder := {
				nextPayload			:= p_nextPayload,
				criticalFlag 		:= 0,
				reserved1	 		:= c_uInt7Zero,
				payloadLength 		:= 8 + sizeof(valueof(p_trafficSelectorList)) * 40,
				numberOfTs			:= sizeof(valueof(p_trafficSelectorList)),
				reserved2			:= c_uInt24Zero,
				trafficSelectorList	:= p_trafficSelectorList
			}
	}
		
	template TrafficSelectorList m_trafficSelectorList_1Elem(
		template TsTrafficSelector p_tsTrafficSelector1
	) := {
		p_tsTrafficSelector1
	}
	
	template TrafficSelectorList m_trafficSelectorList_2Elem(
		template TsTrafficSelector p_tsTrafficSelector1,
		template TsTrafficSelector p_tsTrafficSelector2
@@ -703,16 +745,16 @@ group trafficSelectionPLTmplts {
	}

	template TsTrafficSelector m_icmpv6Ts(
		UInt8 p_ipProtocolId,
		UInt8 p_icmpType,
		template Ipv6Address	p_startAddress,
		template Ipv6Address	p_endAddress
	) := {
		tsIpv6TrafficSelector := {
			tsType := c_tsIpv6AddrRange,
			ipProtocolId := p_ipProtocolId,
			ipProtocolId := c_icmpHdr,
			tsLength := 40,
			startPort := c_uInt16Zero,
			endPort := c_uInt16Zero,
			startPort := p_icmpType,
			endPort := p_icmpType,
			startAddress := p_startAddress,
			endAddress := p_endAddress
		}