Loading ttcn3/EtsiLibrary/LibIpv6/LibCommonRfcs/LibIpv6_CommonRfcs_Functions.ttcn +49 −129 Original line number Diff line number Diff line Loading @@ -12,66 +12,11 @@ import from LibCommon_DataStrings all; import from LibCommon_VerdictControl { type FncRetCode }; //LibIpv6 import from LibIpv6_Interface_TypesAndValues all ; import from LibIpv6_ExternalFunctions all; import from LibIpv6_Interface all ; import from LibIpv6_ModuleParameters all ; import from LibIpv6_CommonRfcs_TypesAndValues all; import from LibIpv6_CommonRfcs_Templates all; import from LibIpv6_Rfc2460Root_TypesAndValues { type all; const all }; //import from LibIpv6_Rfc2460Root_Templates all; import from LibIpv6_Rfc3775Mipv6_ExtHdrFunctions all; group extHdrFns { /* * @desc This goes through the extension header list and calculates length, checksum * and other specific functions of the different extension headers * @param p_srcAddr Source Address of IPv6 packet * @param p_dstAddr Dst Address of IPv6 packet * @param p_extHdrList Extension Header List * @return execution status */ function f_setExtensionHeaders( inout ExtensionHeaderList p_extHdrList, in Ipv6Address p_srcAddr, in Ipv6Address p_dstAddr, in Ipv6Packet p_ipv6Packet) runs on LibIpv6Node return FncRetCode { var UInt8 i; var Ipv6Address v_homeAddress := c_16ZeroBytes; var UInt8 v_nrOfTunnelHdr := 0; for (i:=0; i<sizeof(p_extHdrList);i:=i+1) { if (ischosen(p_extHdrList[i].mipHeader)) { if (f_isPresentHomeAddressOption(p_extHdrList, v_homeAddress) == e_success) { f_setMipHeader( v_homeAddress, p_dstAddr, p_extHdrList[i].mipHeader); } else if (f_isPresentRoutingHeaderType2(p_extHdrList, v_homeAddress) == e_success) { f_setMipHeader( p_srcAddr, v_homeAddress, p_extHdrList[i].mipHeader); } else { f_setMipHeader( p_srcAddr, p_dstAddr, p_extHdrList[i].mipHeader); } } else if (ischosen(p_extHdrList[i].tunneledIpv6)) { v_nrOfTunnelHdr := v_nrOfTunnelHdr + 1; p_extHdrList[i].tunneledIpv6.payloadLength := fx_tunnelledPayloadLength(p_ipv6Packet, v_nrOfTunnelHdr); } /* else if (ischosen(p_extHdrList[i].)) { f_setSecurityHdr(); } */ }//end for return e_success; }//end f_setExtensionHeaders }//end group extHdrFns group calcPrefixFns { Loading Loading @@ -208,7 +153,6 @@ group extHdrFns { * @desc This goes through the ExtensionHeaderList and * checks if a Routing Header type 2 is present. * @param p_extHdrList ExtensionHeaderList to be treated * @param p_homeAddr Home address * @return execution status */ function f_isPresentRoutingHeaderType2( in ExtensionHeaderList p_extHdrList, Loading @@ -231,97 +175,73 @@ group extHdrFns { return v_ret; }//end function f_isPresentRoutingHeaderType2 /* * @desc This generates a random Init Cookie * @return Init Cookie * @desc This goes through the ExtensionHeaderList and * checks if a Binding Authority Data option is present. * @param p_extHdrList ExtensionHeaderList to be treated * @return execution status */ function f_createInitCookie() runs on LibIpv6Node return Oct8 { var Oct8 v_cookie := int2oct(float2int(int2float(20000-5000)*rnd())+5000, 8); function f_isPresentBindingAuthorityDataOption ( in ExtensionHeaderList p_extHdrList ) return v_cookie; }//end f_createInitCookie /* * @desc This generates a Home Keygen Token * @param p_kcn Correspondant node's secret key * @param p_homeAddr Home address * @param p_nonce Home nonce * @return Home Keygen Token */ function f_createHomeKeygenToken(in octetstring p_kcn, in Ipv6Address p_homeAddr, in octetstring p_nonce) runs on LibIpv6Node return Oct8 { var octetstring v_mac := c_8ZeroBytes; var Oct8 v_token := c_8ZeroBytes; var UInt8 i; v_mac := fx_computeHMAC(p_kcn, p_homeAddr & p_nonce & int2oct(0,1), e_sha1 ); return FncRetCode { var FncRetCode v_ret := e_error; var UInt8 i,j; for ( i := 0; i < 8; i := i + 1 ) { v_token[i] := v_mac[i]; //select ext hdrs that need special calculation for ( i := 0; i < sizeof ( p_extHdrList ) and ( v_ret != e_success ); i := i + 1 ) { if ( ischosen ( p_extHdrList[i].mipHeader ) ) { if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAck ) ) { for ( j := 0; j < sizeof ( p_extHdrList[i].mipHeader.mipMessage.bindingAck.mipOptions ); j := j + 1 ) { if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAck.mipOptions[j].mipBindingAuthorizationData ) == true ) { v_ret := e_success; } } } } } return v_token; }//end f_createHomeKeygenToken /* * @desc This generates a Care-of Keygen Token * @param p_kcn Correspondant node's secret key * @param p_careOfAddr Care-of address * @param p_nonce Home nonce * @return Care-of Keygen Token */ function f_createCareOfKeygenToken(in octetstring p_kcn, in Ipv6Address p_careOfAddr, in octetstring p_nonce) runs on LibIpv6Node return Oct8 { var octetstring v_mac := c_8ZeroBytes; var Oct8 v_token := c_8ZeroBytes; var UInt8 i; v_mac := fx_computeHMAC(p_kcn, p_careOfAddr & p_nonce & int2oct(1,1), e_sha1 ); for ( i := 0; i < 8; i := i + 1 ) { v_token[i] := v_mac[i]; if ( v_ret == e_error ) { log ( "**** f_isPresentBindingAuthorityDataOption: ERROR: Binding Authentication Data option is not present in Binding Ack **** " ); } return v_token; }//end f_createCareOfKeygenToken return v_ret; }//end function f_isPresentBindingAuthorityDataOption /* * @desc This generates a Binding Management Key * @param p_homeKeygenToken Home Keygen Token * @param p_careOfKeygenToken Care-of Keygen Token * @return Binding Management Key * @desc This goes through the ExtensionHeaderList and * checks if a Binding Refresh Advice option is present. * @param p_extHdrList ExtensionHeaderList to be treated * @return execution status */ function f_createBindingManagementKey(in Oct8 p_homeKeygenToken, in Oct8 p_careOfKeygenToken) runs on LibIpv6Node return Oct8 { var octetstring v_key := c_8ZeroBytes; v_key := fx_computeHash(p_homeKeygenToken & p_careOfKeygenToken, e_sha1); return v_key; }//end f_createBindingManagementKey function f_isPresentBindingRefreshAdviceOption ( in ExtensionHeaderList p_extHdrList ) /* * @desc This generates a random Security Parameters Index * @return Security Parameters Index */ function f_createSecurityParametersIndex() runs on LibIpv6Node return Oct4 { var Oct4 v_spi := int2oct(float2int(int2float(20000-5000)*rnd())+5000, 4); return v_spi; }//end f_createSecurityParametersIndex return FncRetCode { var FncRetCode v_ret := e_error; var UInt8 i,j; //select ext hdrs that need special calculation for ( i := 0; i < sizeof ( p_extHdrList ) and ( v_ret != e_success ); i := i + 1 ) { if ( ischosen ( p_extHdrList[i].mipHeader ) ) { if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAck ) ) { for ( j := 0; j < sizeof ( p_extHdrList[i].mipHeader.mipMessage.bindingAck.mipOptions ); j := j + 1 ) { if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAck.mipOptions[j].mipOptBindingRefreshAdvice ) == true ) { v_ret := e_success; } } } } } if ( v_ret == e_error ) { log ( "**** f_isPresentBindingRefreshAdviceOption: ERROR: Binding Authentication Data option is not present in Binding Ack **** " ); } return v_ret; }//end function f_isPresentBindingRefreshAdviceOption } // end module LibIpv6_CommonRfcs_Functions ttcn3/EtsiLibrary/LibIpv6/LibCommonRfcs/LibIpv6_CommonRfcs_TypesAndValues.ttcn +6 −15 Original line number Diff line number Diff line Loading @@ -15,13 +15,12 @@ module LibIpv6_CommonRfcs_TypesAndValues { import from LibCommon_TextStrings all; import from LibCommon_Time all ; group DefaultConstants { const UInt16 c_defId := 10; // for ICMP echo proc const UInt16 c_defSeqNo := 20; // for ICMP echo proc } group rfc3513AddressingArchitecture { group rfc4291AddressingArchitecture { type Oct16 Ipv6Address; type UInt8 PrefixLength ;//indicates nr of bits to be used as Prefix Loading @@ -35,7 +34,7 @@ module LibIpv6_CommonRfcs_TypesAndValues { } }//end group rfc3513AddressingArchitecture }//end group rfc4291AddressingArchitecture group ipv6Options { Loading @@ -43,6 +42,7 @@ module LibIpv6_CommonRfcs_TypesAndValues { const UInt8 c_optLen0 := 0; const UInt8 c_optLen1 := 1; const UInt8 c_optLen2 := 2; const UInt8 c_optLen3 := 3; const UInt8 c_optLen4 := 4; const UInt8 c_optLen6 := 6; const UInt8 c_optLen16 := 16; Loading Loading @@ -235,6 +235,9 @@ module LibIpv6_CommonRfcs_TypesAndValues { group rfc3775Options { const octetstring c_preDefAIOption := '0101000000001000'O; const octetstring c_preDefHAIOption := '0801000000000040'O; /* * @desc Extra ICMP option introduced by RFC3775, clause 7.3 */ Loading Loading @@ -294,16 +297,4 @@ module LibIpv6_CommonRfcs_TypesAndValues { } // end ipv6Options group security { type enumerated CryptoFunction { e_null(0), e_sha1(1) } with { encode "use=com.testingtech.ttcn.tci.*;"; } } // end security } // end LibIpv6_CommonRfcs_TypesAndValues ttcn3/EtsiLibrary/LibIpv6/LibCommonRfcs/LibIpv6_ExternalFunctions.ttcn +70 −29 Original line number Diff line number Diff line Loading @@ -12,13 +12,11 @@ //LibCommon import from LibCommon_BasicTypesAndValues all; import from LibCommon_DataStrings all; import from LibCommon_VerdictControl all; //LibIpv6 import from LibIpv6_CommonRfcs_TypesAndValues { type all }; import from LibIpv6_Interface { type Ipv6Packet }; import from LibIpv6_Rfc2460Root_TypesAndValues {type all}; import from LibIpv6_Rfc3775Mipv6_ExtHdrTypesAndValues all; import from LibIpv6_Interface_TypesAndValues all; import from LibIpv6_Interface_TypesAndValues all; /* @desc This external function calculates the payload length * of a IPv6 packet Loading Loading @@ -77,36 +75,65 @@ // external function fx_dstOptHdrLength( in ExtensionHeader p_extHdr) // return UInt8; /* @desc This external function calculates a Message Authentication Code /* @desc Apply indicated encryption algorithm to the message. * * @param p_crypto Cryptographic function used to compute MAC * @param p_key Key used to compute the MAC * @param p_message Octetstring message * @param p_crypto Cryptographic function used to compute MAC * @return Message HMAC */ external function fx_computeHMAC(in octetstring p_key, in octetstring p_message, CryptoFunction p_crypto ) return octetstring; // external function fx_encrypt( EncryptionAlgo p_encryptionAlgo, in octetstring p_key, in octetstring p_message) // return octetstring; /* @desc This external function calculates a SHA1 hash external function fx_encrypt( in IpSecProtocolMode p_ipSecProtocolMode, in EncryptionAlgo p_encryptionAlgo, in octetstring p_key, in PlaintextData p_plaintextData, out EncryptResult p_encryptResult) return FncRetCode; external function fx_decrypt( in UInt8 p_ivLength, in UInt8 p_icvLength, in IpSecProtocolMode p_ipSecProtocolMode, in EncryptionAlgo p_encryptionAlgo, in octetstring p_key, in octetstring p_encryptedMsg, out PlaintextData p_plaintextData) return FncRetCode; /* @desc Apply indicated Integrity algorithm to the message. Message is an octetstring. * If e_sha1_96 is chosen, then the key input shall be ignored. * * @param p_integrityAlgo Cryptographic function used to compute MAC * @param p_key Key used to compute the MAC * @param p_message Octetstring message * @param p_crypto Cryptographic function used to compute MAC * @return Message hash * @return Message HMAC */ external function fx_computeHash(in octetstring p_message, CryptoFunction p_crypto ) external function fx_integrity( IntegrityAlgo p_integrityAlgo, in octetstring p_key, in octetstring p_message) return octetstring; /* @desc This external function computes the Authenticator for * return routability procedure * @param p_careOfAddr Care-of address * @param p_cnAddr Address of the correspondant * @param p_ipv6Packet Ipv6 Packet * @param p_kbm Binding management key * @return Authenticator /* @desc Apply indicated Integrity algorithm to the message. Message can only be an EspHeader. * If e_sha1_96 is chosen, then the key input shall be ignored. * * @param p_integrityAlgo Cryptographic function used to compute MAC * @param p_key Key used to compute the MAC * @param p_espHeader EspHeader * @param p_integrityResult Result of Integrity function * @return Message HMAC */ external function fx_bindingAuthenticator(in octetstring p_careOfAddr, in Ipv6Address p_careOfAddr, in Ipv6Address cnAddr, in Ipv6Packet p_ipv6Packet, in octetstring p_kbm) external function fx_integrityEspHdr( in IntegrityAlgo p_integrityAlgo, in octetstring p_key, in EspHeader p_espHeader, out IntegrityResult p_integrityResult) return FncRetCode; /* @desc This external function runs the MipHeader through Codec and returns * the octetstring representing the MipHeader * * @param p_mipHeader MIp Header to be encoded to octetstring * @return octetstring */ external function fx_mipHdrToOct(MipHeader p_mipHeader) return octetstring; /* @desc This external function computes Integrity Check Value Loading @@ -114,8 +141,22 @@ * @param p_sa Security association * @return Integrity Check Value */ external function fx_IntegrityCheckValue( in Ipv6Packet p_ipv6Packet, in octetstring p_sa) return octetstring; external function fx_integrityCheckValue( in Ipv6Packet p_ipv6Packet, in octetstring p_sa, out octetstring p_result) return FncRetCode; /* @desc This external function returns the padding octets that * are needed to align to a given Byte Boundary. * Example: Byte Boundary == 4 * If lenghtof EspHeader is 3, then result = 1 * @param p_byteBoundary Align to a multiple of this value * @param p_espHeader ESP-HDR to be aligned * @return Padding needed to align */ external function fx_byteAlignEspHeader( in UInt8 p_byteBoundary, in EspHeader p_espHeader, out octetstring p_result) return FncRetCode; }// end module LibIpv6_ExternalFunctions ttcn3/EtsiLibrary/LibIpv6/LibCommonRfcs/LibIpv6_Interface.ttcndeleted 100644 → 0 +0 −129 Original line number Diff line number Diff line /* * @author STF 276 * @version $Id$ * @desc This module defines the interface for any function * part of the IPv6 library. * Further on, this module defines a meta type over all IPv6 * packets supported by the IPv6 library as well as * templates for it. Also it includes the raw Ipv6 * message type which can be used for sending encoded * Ipv6 packets. * */ module LibIpv6_Interface { //LibCommon import from LibCommon_Time all ; //LibIpv6 import from LibIpv6_Rfc2460Root_TypesAndValues {type all}; import from LibIpv6_Rfc2463Icmpv6_TypesAndValues {type all}; import from LibIpv6_Rfc2461NeighborDiscovery_TypesAndValues {type all}; import from LibIpv6_Rfc2894RouterRenumbering_TypesAndValues {type all}; import from LibIpv6_Rfc3775Mipv6_TypesAndValues {type all}; import from LibIpv6_Rfc0768Udp_TypesAndValues all ; import from LibIpv6_Rfc4303Esp_TypesAndValues all; /* * @desc This type is used to define behavior within the IPv6 library * which can be executed on both, host as well as router, * components. It may also be used to specify behavior outside of * the IPv6 library. In order to call IPv6 library functions * defined based on this type the caller function must * be defined based on a type compatible component type. */ type component LibIpv6Node { port Ipv6Port ipPort; timer tc_ac:= PX_TAC; timer tc_noAc:= PX_TNOAC; timer tc_wait:= PX_TWAIT; } type port Ipv6Port message { inout //Imported from Rfc 2463 DestinationUnreachable, PacketTooBig, TimeExceeded, ParameterProblem, EchoRequest, EchoReply, //Imported from Rfc 2461 RouterAdvertisement, RouterSolicitation, NeighborSolicitation, NeighborAdvertisement, Redirect, //Imported from Rfc 2894 RouterRenumbering, //Imported from Rfc XXXX Mipv6 HomeAgentAddressDiscoveryRequest, HomeAgentAddressDiscoveryReply, MobilePrefixSolicitation, MobilePrefixAdvertisement, MipRouterAdvertisement, OtherIcmpv6Hdr, //hand encoded IPv6 packets RawIpv6Packet, //UDP UdpPacket, //MetaPdu Ipv6Packet, //General IPv6 packet GeneralIpv6, //EspPackets EspTunnelModePacket, EspTransportModePacket } /* * @desc This meta packet type contains any Ipv6 packets. * This type is used mainly for checksum calculation */ type union Ipv6Packet { //Imported from Rfc 2463 DestinationUnreachable destinationUnreachable, PacketTooBig packetTooBig, TimeExceeded timeExceeded, ParameterProblem parameterProblem, EchoRequest echoRequest, EchoReply echoReply, //Imported from Rfc 2461 RouterAdvertisement routerAdvert, RouterSolicitation routerSolicitation, NeighborSolicitation nbrSolicitation, NeighborAdvertisement nbrAdvert, Redirect redirect, //Imported from Rfc 2894 RouterRenumbering routerRenumbering, //Imported from Rfc XXXX Mipv6 HomeAgentAddressDiscoveryRequest homeAgentAddressDiscoveryRequest, HomeAgentAddressDiscoveryReply homeAgentAddressDiscoveryReply, MobilePrefixSolicitation mobilePrefixSolicitation, MobilePrefixAdvertisement mobilePrefixAdvertisement, MipRouterAdvertisement mipRouterAdvertisement, //Default value OtherIcmpv6Hdr otherHeader, //Udp UdpPacket udpPacket, //General IPv6 packet GeneralIpv6 generalIpv6 } with { encode "isPDU=LibIpv6_Interface;" } template Ipv6Packet mw_ipPkt := ? ; template Ipv6Packet m_ipPkt_echoRequest (in template EchoRequest p_echoRequest) := { echoRequest := p_echoRequest } /* * @desc This type is intended to be used to send "hand encoded" * IPv6 packets. It can also be used to create incorrect * IPv6 messages. */ type octetstring RawIpv6Packet; } // end module LibIpv6_Interface Loading
ttcn3/EtsiLibrary/LibIpv6/LibCommonRfcs/LibIpv6_CommonRfcs_Functions.ttcn +49 −129 Original line number Diff line number Diff line Loading @@ -12,66 +12,11 @@ import from LibCommon_DataStrings all; import from LibCommon_VerdictControl { type FncRetCode }; //LibIpv6 import from LibIpv6_Interface_TypesAndValues all ; import from LibIpv6_ExternalFunctions all; import from LibIpv6_Interface all ; import from LibIpv6_ModuleParameters all ; import from LibIpv6_CommonRfcs_TypesAndValues all; import from LibIpv6_CommonRfcs_Templates all; import from LibIpv6_Rfc2460Root_TypesAndValues { type all; const all }; //import from LibIpv6_Rfc2460Root_Templates all; import from LibIpv6_Rfc3775Mipv6_ExtHdrFunctions all; group extHdrFns { /* * @desc This goes through the extension header list and calculates length, checksum * and other specific functions of the different extension headers * @param p_srcAddr Source Address of IPv6 packet * @param p_dstAddr Dst Address of IPv6 packet * @param p_extHdrList Extension Header List * @return execution status */ function f_setExtensionHeaders( inout ExtensionHeaderList p_extHdrList, in Ipv6Address p_srcAddr, in Ipv6Address p_dstAddr, in Ipv6Packet p_ipv6Packet) runs on LibIpv6Node return FncRetCode { var UInt8 i; var Ipv6Address v_homeAddress := c_16ZeroBytes; var UInt8 v_nrOfTunnelHdr := 0; for (i:=0; i<sizeof(p_extHdrList);i:=i+1) { if (ischosen(p_extHdrList[i].mipHeader)) { if (f_isPresentHomeAddressOption(p_extHdrList, v_homeAddress) == e_success) { f_setMipHeader( v_homeAddress, p_dstAddr, p_extHdrList[i].mipHeader); } else if (f_isPresentRoutingHeaderType2(p_extHdrList, v_homeAddress) == e_success) { f_setMipHeader( p_srcAddr, v_homeAddress, p_extHdrList[i].mipHeader); } else { f_setMipHeader( p_srcAddr, p_dstAddr, p_extHdrList[i].mipHeader); } } else if (ischosen(p_extHdrList[i].tunneledIpv6)) { v_nrOfTunnelHdr := v_nrOfTunnelHdr + 1; p_extHdrList[i].tunneledIpv6.payloadLength := fx_tunnelledPayloadLength(p_ipv6Packet, v_nrOfTunnelHdr); } /* else if (ischosen(p_extHdrList[i].)) { f_setSecurityHdr(); } */ }//end for return e_success; }//end f_setExtensionHeaders }//end group extHdrFns group calcPrefixFns { Loading Loading @@ -208,7 +153,6 @@ group extHdrFns { * @desc This goes through the ExtensionHeaderList and * checks if a Routing Header type 2 is present. * @param p_extHdrList ExtensionHeaderList to be treated * @param p_homeAddr Home address * @return execution status */ function f_isPresentRoutingHeaderType2( in ExtensionHeaderList p_extHdrList, Loading @@ -231,97 +175,73 @@ group extHdrFns { return v_ret; }//end function f_isPresentRoutingHeaderType2 /* * @desc This generates a random Init Cookie * @return Init Cookie * @desc This goes through the ExtensionHeaderList and * checks if a Binding Authority Data option is present. * @param p_extHdrList ExtensionHeaderList to be treated * @return execution status */ function f_createInitCookie() runs on LibIpv6Node return Oct8 { var Oct8 v_cookie := int2oct(float2int(int2float(20000-5000)*rnd())+5000, 8); function f_isPresentBindingAuthorityDataOption ( in ExtensionHeaderList p_extHdrList ) return v_cookie; }//end f_createInitCookie /* * @desc This generates a Home Keygen Token * @param p_kcn Correspondant node's secret key * @param p_homeAddr Home address * @param p_nonce Home nonce * @return Home Keygen Token */ function f_createHomeKeygenToken(in octetstring p_kcn, in Ipv6Address p_homeAddr, in octetstring p_nonce) runs on LibIpv6Node return Oct8 { var octetstring v_mac := c_8ZeroBytes; var Oct8 v_token := c_8ZeroBytes; var UInt8 i; v_mac := fx_computeHMAC(p_kcn, p_homeAddr & p_nonce & int2oct(0,1), e_sha1 ); return FncRetCode { var FncRetCode v_ret := e_error; var UInt8 i,j; for ( i := 0; i < 8; i := i + 1 ) { v_token[i] := v_mac[i]; //select ext hdrs that need special calculation for ( i := 0; i < sizeof ( p_extHdrList ) and ( v_ret != e_success ); i := i + 1 ) { if ( ischosen ( p_extHdrList[i].mipHeader ) ) { if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAck ) ) { for ( j := 0; j < sizeof ( p_extHdrList[i].mipHeader.mipMessage.bindingAck.mipOptions ); j := j + 1 ) { if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAck.mipOptions[j].mipBindingAuthorizationData ) == true ) { v_ret := e_success; } } } } } return v_token; }//end f_createHomeKeygenToken /* * @desc This generates a Care-of Keygen Token * @param p_kcn Correspondant node's secret key * @param p_careOfAddr Care-of address * @param p_nonce Home nonce * @return Care-of Keygen Token */ function f_createCareOfKeygenToken(in octetstring p_kcn, in Ipv6Address p_careOfAddr, in octetstring p_nonce) runs on LibIpv6Node return Oct8 { var octetstring v_mac := c_8ZeroBytes; var Oct8 v_token := c_8ZeroBytes; var UInt8 i; v_mac := fx_computeHMAC(p_kcn, p_careOfAddr & p_nonce & int2oct(1,1), e_sha1 ); for ( i := 0; i < 8; i := i + 1 ) { v_token[i] := v_mac[i]; if ( v_ret == e_error ) { log ( "**** f_isPresentBindingAuthorityDataOption: ERROR: Binding Authentication Data option is not present in Binding Ack **** " ); } return v_token; }//end f_createCareOfKeygenToken return v_ret; }//end function f_isPresentBindingAuthorityDataOption /* * @desc This generates a Binding Management Key * @param p_homeKeygenToken Home Keygen Token * @param p_careOfKeygenToken Care-of Keygen Token * @return Binding Management Key * @desc This goes through the ExtensionHeaderList and * checks if a Binding Refresh Advice option is present. * @param p_extHdrList ExtensionHeaderList to be treated * @return execution status */ function f_createBindingManagementKey(in Oct8 p_homeKeygenToken, in Oct8 p_careOfKeygenToken) runs on LibIpv6Node return Oct8 { var octetstring v_key := c_8ZeroBytes; v_key := fx_computeHash(p_homeKeygenToken & p_careOfKeygenToken, e_sha1); return v_key; }//end f_createBindingManagementKey function f_isPresentBindingRefreshAdviceOption ( in ExtensionHeaderList p_extHdrList ) /* * @desc This generates a random Security Parameters Index * @return Security Parameters Index */ function f_createSecurityParametersIndex() runs on LibIpv6Node return Oct4 { var Oct4 v_spi := int2oct(float2int(int2float(20000-5000)*rnd())+5000, 4); return v_spi; }//end f_createSecurityParametersIndex return FncRetCode { var FncRetCode v_ret := e_error; var UInt8 i,j; //select ext hdrs that need special calculation for ( i := 0; i < sizeof ( p_extHdrList ) and ( v_ret != e_success ); i := i + 1 ) { if ( ischosen ( p_extHdrList[i].mipHeader ) ) { if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAck ) ) { for ( j := 0; j < sizeof ( p_extHdrList[i].mipHeader.mipMessage.bindingAck.mipOptions ); j := j + 1 ) { if ( ischosen ( p_extHdrList[i].mipHeader.mipMessage.bindingAck.mipOptions[j].mipOptBindingRefreshAdvice ) == true ) { v_ret := e_success; } } } } } if ( v_ret == e_error ) { log ( "**** f_isPresentBindingRefreshAdviceOption: ERROR: Binding Authentication Data option is not present in Binding Ack **** " ); } return v_ret; }//end function f_isPresentBindingRefreshAdviceOption } // end module LibIpv6_CommonRfcs_Functions
ttcn3/EtsiLibrary/LibIpv6/LibCommonRfcs/LibIpv6_CommonRfcs_TypesAndValues.ttcn +6 −15 Original line number Diff line number Diff line Loading @@ -15,13 +15,12 @@ module LibIpv6_CommonRfcs_TypesAndValues { import from LibCommon_TextStrings all; import from LibCommon_Time all ; group DefaultConstants { const UInt16 c_defId := 10; // for ICMP echo proc const UInt16 c_defSeqNo := 20; // for ICMP echo proc } group rfc3513AddressingArchitecture { group rfc4291AddressingArchitecture { type Oct16 Ipv6Address; type UInt8 PrefixLength ;//indicates nr of bits to be used as Prefix Loading @@ -35,7 +34,7 @@ module LibIpv6_CommonRfcs_TypesAndValues { } }//end group rfc3513AddressingArchitecture }//end group rfc4291AddressingArchitecture group ipv6Options { Loading @@ -43,6 +42,7 @@ module LibIpv6_CommonRfcs_TypesAndValues { const UInt8 c_optLen0 := 0; const UInt8 c_optLen1 := 1; const UInt8 c_optLen2 := 2; const UInt8 c_optLen3 := 3; const UInt8 c_optLen4 := 4; const UInt8 c_optLen6 := 6; const UInt8 c_optLen16 := 16; Loading Loading @@ -235,6 +235,9 @@ module LibIpv6_CommonRfcs_TypesAndValues { group rfc3775Options { const octetstring c_preDefAIOption := '0101000000001000'O; const octetstring c_preDefHAIOption := '0801000000000040'O; /* * @desc Extra ICMP option introduced by RFC3775, clause 7.3 */ Loading Loading @@ -294,16 +297,4 @@ module LibIpv6_CommonRfcs_TypesAndValues { } // end ipv6Options group security { type enumerated CryptoFunction { e_null(0), e_sha1(1) } with { encode "use=com.testingtech.ttcn.tci.*;"; } } // end security } // end LibIpv6_CommonRfcs_TypesAndValues
ttcn3/EtsiLibrary/LibIpv6/LibCommonRfcs/LibIpv6_ExternalFunctions.ttcn +70 −29 Original line number Diff line number Diff line Loading @@ -12,13 +12,11 @@ //LibCommon import from LibCommon_BasicTypesAndValues all; import from LibCommon_DataStrings all; import from LibCommon_VerdictControl all; //LibIpv6 import from LibIpv6_CommonRfcs_TypesAndValues { type all }; import from LibIpv6_Interface { type Ipv6Packet }; import from LibIpv6_Rfc2460Root_TypesAndValues {type all}; import from LibIpv6_Rfc3775Mipv6_ExtHdrTypesAndValues all; import from LibIpv6_Interface_TypesAndValues all; import from LibIpv6_Interface_TypesAndValues all; /* @desc This external function calculates the payload length * of a IPv6 packet Loading Loading @@ -77,36 +75,65 @@ // external function fx_dstOptHdrLength( in ExtensionHeader p_extHdr) // return UInt8; /* @desc This external function calculates a Message Authentication Code /* @desc Apply indicated encryption algorithm to the message. * * @param p_crypto Cryptographic function used to compute MAC * @param p_key Key used to compute the MAC * @param p_message Octetstring message * @param p_crypto Cryptographic function used to compute MAC * @return Message HMAC */ external function fx_computeHMAC(in octetstring p_key, in octetstring p_message, CryptoFunction p_crypto ) return octetstring; // external function fx_encrypt( EncryptionAlgo p_encryptionAlgo, in octetstring p_key, in octetstring p_message) // return octetstring; /* @desc This external function calculates a SHA1 hash external function fx_encrypt( in IpSecProtocolMode p_ipSecProtocolMode, in EncryptionAlgo p_encryptionAlgo, in octetstring p_key, in PlaintextData p_plaintextData, out EncryptResult p_encryptResult) return FncRetCode; external function fx_decrypt( in UInt8 p_ivLength, in UInt8 p_icvLength, in IpSecProtocolMode p_ipSecProtocolMode, in EncryptionAlgo p_encryptionAlgo, in octetstring p_key, in octetstring p_encryptedMsg, out PlaintextData p_plaintextData) return FncRetCode; /* @desc Apply indicated Integrity algorithm to the message. Message is an octetstring. * If e_sha1_96 is chosen, then the key input shall be ignored. * * @param p_integrityAlgo Cryptographic function used to compute MAC * @param p_key Key used to compute the MAC * @param p_message Octetstring message * @param p_crypto Cryptographic function used to compute MAC * @return Message hash * @return Message HMAC */ external function fx_computeHash(in octetstring p_message, CryptoFunction p_crypto ) external function fx_integrity( IntegrityAlgo p_integrityAlgo, in octetstring p_key, in octetstring p_message) return octetstring; /* @desc This external function computes the Authenticator for * return routability procedure * @param p_careOfAddr Care-of address * @param p_cnAddr Address of the correspondant * @param p_ipv6Packet Ipv6 Packet * @param p_kbm Binding management key * @return Authenticator /* @desc Apply indicated Integrity algorithm to the message. Message can only be an EspHeader. * If e_sha1_96 is chosen, then the key input shall be ignored. * * @param p_integrityAlgo Cryptographic function used to compute MAC * @param p_key Key used to compute the MAC * @param p_espHeader EspHeader * @param p_integrityResult Result of Integrity function * @return Message HMAC */ external function fx_bindingAuthenticator(in octetstring p_careOfAddr, in Ipv6Address p_careOfAddr, in Ipv6Address cnAddr, in Ipv6Packet p_ipv6Packet, in octetstring p_kbm) external function fx_integrityEspHdr( in IntegrityAlgo p_integrityAlgo, in octetstring p_key, in EspHeader p_espHeader, out IntegrityResult p_integrityResult) return FncRetCode; /* @desc This external function runs the MipHeader through Codec and returns * the octetstring representing the MipHeader * * @param p_mipHeader MIp Header to be encoded to octetstring * @return octetstring */ external function fx_mipHdrToOct(MipHeader p_mipHeader) return octetstring; /* @desc This external function computes Integrity Check Value Loading @@ -114,8 +141,22 @@ * @param p_sa Security association * @return Integrity Check Value */ external function fx_IntegrityCheckValue( in Ipv6Packet p_ipv6Packet, in octetstring p_sa) return octetstring; external function fx_integrityCheckValue( in Ipv6Packet p_ipv6Packet, in octetstring p_sa, out octetstring p_result) return FncRetCode; /* @desc This external function returns the padding octets that * are needed to align to a given Byte Boundary. * Example: Byte Boundary == 4 * If lenghtof EspHeader is 3, then result = 1 * @param p_byteBoundary Align to a multiple of this value * @param p_espHeader ESP-HDR to be aligned * @return Padding needed to align */ external function fx_byteAlignEspHeader( in UInt8 p_byteBoundary, in EspHeader p_espHeader, out octetstring p_result) return FncRetCode; }// end module LibIpv6_ExternalFunctions
ttcn3/EtsiLibrary/LibIpv6/LibCommonRfcs/LibIpv6_Interface.ttcndeleted 100644 → 0 +0 −129 Original line number Diff line number Diff line /* * @author STF 276 * @version $Id$ * @desc This module defines the interface for any function * part of the IPv6 library. * Further on, this module defines a meta type over all IPv6 * packets supported by the IPv6 library as well as * templates for it. Also it includes the raw Ipv6 * message type which can be used for sending encoded * Ipv6 packets. * */ module LibIpv6_Interface { //LibCommon import from LibCommon_Time all ; //LibIpv6 import from LibIpv6_Rfc2460Root_TypesAndValues {type all}; import from LibIpv6_Rfc2463Icmpv6_TypesAndValues {type all}; import from LibIpv6_Rfc2461NeighborDiscovery_TypesAndValues {type all}; import from LibIpv6_Rfc2894RouterRenumbering_TypesAndValues {type all}; import from LibIpv6_Rfc3775Mipv6_TypesAndValues {type all}; import from LibIpv6_Rfc0768Udp_TypesAndValues all ; import from LibIpv6_Rfc4303Esp_TypesAndValues all; /* * @desc This type is used to define behavior within the IPv6 library * which can be executed on both, host as well as router, * components. It may also be used to specify behavior outside of * the IPv6 library. In order to call IPv6 library functions * defined based on this type the caller function must * be defined based on a type compatible component type. */ type component LibIpv6Node { port Ipv6Port ipPort; timer tc_ac:= PX_TAC; timer tc_noAc:= PX_TNOAC; timer tc_wait:= PX_TWAIT; } type port Ipv6Port message { inout //Imported from Rfc 2463 DestinationUnreachable, PacketTooBig, TimeExceeded, ParameterProblem, EchoRequest, EchoReply, //Imported from Rfc 2461 RouterAdvertisement, RouterSolicitation, NeighborSolicitation, NeighborAdvertisement, Redirect, //Imported from Rfc 2894 RouterRenumbering, //Imported from Rfc XXXX Mipv6 HomeAgentAddressDiscoveryRequest, HomeAgentAddressDiscoveryReply, MobilePrefixSolicitation, MobilePrefixAdvertisement, MipRouterAdvertisement, OtherIcmpv6Hdr, //hand encoded IPv6 packets RawIpv6Packet, //UDP UdpPacket, //MetaPdu Ipv6Packet, //General IPv6 packet GeneralIpv6, //EspPackets EspTunnelModePacket, EspTransportModePacket } /* * @desc This meta packet type contains any Ipv6 packets. * This type is used mainly for checksum calculation */ type union Ipv6Packet { //Imported from Rfc 2463 DestinationUnreachable destinationUnreachable, PacketTooBig packetTooBig, TimeExceeded timeExceeded, ParameterProblem parameterProblem, EchoRequest echoRequest, EchoReply echoReply, //Imported from Rfc 2461 RouterAdvertisement routerAdvert, RouterSolicitation routerSolicitation, NeighborSolicitation nbrSolicitation, NeighborAdvertisement nbrAdvert, Redirect redirect, //Imported from Rfc 2894 RouterRenumbering routerRenumbering, //Imported from Rfc XXXX Mipv6 HomeAgentAddressDiscoveryRequest homeAgentAddressDiscoveryRequest, HomeAgentAddressDiscoveryReply homeAgentAddressDiscoveryReply, MobilePrefixSolicitation mobilePrefixSolicitation, MobilePrefixAdvertisement mobilePrefixAdvertisement, MipRouterAdvertisement mipRouterAdvertisement, //Default value OtherIcmpv6Hdr otherHeader, //Udp UdpPacket udpPacket, //General IPv6 packet GeneralIpv6 generalIpv6 } with { encode "isPDU=LibIpv6_Interface;" } template Ipv6Packet mw_ipPkt := ? ; template Ipv6Packet m_ipPkt_echoRequest (in template EchoRequest p_echoRequest) := { echoRequest := p_echoRequest } /* * @desc This type is intended to be used to send "hand encoded" * IPv6 packets. It can also be used to create incorrect * IPv6 messages. */ type octetstring RawIpv6Packet; } // end module LibIpv6_Interface