From 712dcbd1658bdb9a4fa187a431ef676c82978d72 Mon Sep 17 00:00:00 2001 From: erititan <elemer.lelik@ericsson.com> Date: Tue, 24 Apr 2018 07:52:26 +0200 Subject: [PATCH] Security functions added R35B --- TCCUsefulFunctions_CNL113472_Common.tpd | 12 +- TCCUsefulFunctions_CNL113472_IPsec.tpd | 13 +- TCCUsefulFunctions_CNL113472_Interface.tpd | 12 +- TCCUsefulFunctions_CNL113472_Maths.tpd | 12 +- TCCUsefulFunctions_CNL113472_OpenSecurity.tpd | 13 +- ...nctions_CNL113472_PermutatedParameters.tpd | 12 +- TCCUsefulFunctions_CNL113472_Regexp.tpd | 13 +- TCCUsefulFunctions_CNL113472_TitanSim.tpd | 13 +- TCCUsefulFunctions_CNL113472_XPath.tpd | 13 +- demo/TCCAssertion_Example.ttcn | 19 +- demo/TCCConversion_Example.ttcn | 19 +- demo/TCCDateTime_Example.ttcn | 152 ++++- demo/TCCEncoding_Example.ttcn | 19 +- demo/TCCEnv_Example.ttcn | 17 +- demo/TCCFileIO_Example.ttcn | 37 +- demo/TCCFileSystem_Example.ttcn | 17 +- demo/TCCIPsec_Example.ttcn | 17 +- demo/TCCInterface_Example.ttcn | 17 +- demo/TCCMaths_Example.ttcn | 17 +- demo/TCCMessageHandling_Example.ttcn | 17 +- demo/TCCPermutatedParameters_Example.ttcn | 13 +- demo/TCCRegexp_Example.ttcn | 17 +- demo/TCCSecurity_Example.ttcn | 603 ++++++++++++++++++ demo/TCCTemplate_Example.ttcn | 17 +- demo/TCCTitanMetadata_Example.ttcn | 19 +- demo/TCCXPathSupport_Example.ttcn | 17 +- doc/TCCUsefulFunctions_CNL113472_1551.doc | Bin 402432 -> 392704 bytes doc/TCCUsefulFunctions_CNL113472_PRI.doc | Bin 156160 -> 173056 bytes src/TCCAssertion.cc | 2 +- src/TCCAssertion_Functions.ttcn | 2 +- src/TCCConversion.cc | 2 +- src/TCCConversion_Functions.ttcn | 4 +- src/TCCDateTime.cc | 327 +++++++--- src/TCCDateTime_Functions.ttcn | 245 ++++--- src/TCCEncoding.cc | 2 +- src/TCCEncoding_Functions.ttcn | 4 +- src/TCCEnv.cc | 2 +- src/TCCEnv_Functions.ttcn | 2 +- src/TCCFileIO.cc | 46 +- src/TCCFileIO_Functions.ttcn | 53 +- src/TCCFileSystem.cc | 2 +- src/TCCFileSystem_Functions.ttcn | 2 +- src/TCCIPsec.cc | 2 +- src/TCCIPsec_Definitions.ttcn | 2 +- src/TCCIPsec_Functions.ttcn | 2 +- src/TCCIPsec_XFRM.cc | 2 +- src/TCCIPsec_XFRM.hh | 2 +- src/TCCIPsec_XFRM_Definitions.ttcn | 2 +- src/TCCIPsec_XFRM_SA.cc | 2 +- src/TCCIPsec_XFRM_SP.cc | 41 +- src/TCCInterface.cc | 4 +- src/TCCInterface_Functions.ttcn | 2 +- src/TCCInterface_ip.h | 2 +- src/TCCMaths.cc | 2 +- src/TCCMaths_Functions.ttcn | 2 +- src/TCCMaths_GenericTypes.ttcn | 2 +- src/TCCMessageHandling.cc | 2 +- src/TCCMessageHandling_Functions.ttcn | 2 +- src/TCCOpenSecurity.cc | 428 ++++++++++--- src/TCCOpenSecurity_Functions.ttcn | 114 +++- src/TCCPermutatedParameters_Definitions.ttcn | 4 +- src/TCCPermutatedParameters_Functions.ttcn | 4 +- src/TCCRegexp.cc | 2 +- src/TCCRegexp_Functions.ttcn | 2 +- src/TCCSystem.cc | 2 +- src/TCCSystem_Functions.ttcn | 2 +- src/TCCTemplate_Functions.ttcn | 80 +-- src/TCCTitanMetadata.cc | 2 +- src/TCCTitanMetadata_Functions.ttcn | 2 +- src/TCCUsefulFunctions_Library.grp | 6 +- ...CCUsefulFunctions_PermutatedParameters.grp | 2 +- src/TCCXPathSupport.cc | 2 +- src/TCCXPathSupport_Functions.ttcn | 2 +- 73 files changed, 1987 insertions(+), 582 deletions(-) create mode 100644 demo/TCCSecurity_Example.ttcn diff --git a/TCCUsefulFunctions_CNL113472_Common.tpd b/TCCUsefulFunctions_CNL113472_Common.tpd index f13aed5..4862ac0 100644 --- a/TCCUsefulFunctions_CNL113472_Common.tpd +++ b/TCCUsefulFunctions_CNL113472_Common.tpd @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2017 Ericsson + Copyright (c) 2018 Ericsson - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html + The copyright to the computer program(s) herein is the property of Ericsson. + The program(s) may be used and/or copied only with the written permission + of Ericsson or in accordance with the terms and conditions stipulated in the + agreement/contract under which the program(s) has been supplied. File: TCCUsefulFunctions_CNL113472_Common.tpd Description: tpd project file - Rev: R30A + Rev: R35B Prodnr: CNL 113 472 --> diff --git a/TCCUsefulFunctions_CNL113472_IPsec.tpd b/TCCUsefulFunctions_CNL113472_IPsec.tpd index de94e2e..483ad67 100644 --- a/TCCUsefulFunctions_CNL113472_IPsec.tpd +++ b/TCCUsefulFunctions_CNL113472_IPsec.tpd @@ -1,17 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2017 Ericsson - - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html + Copyright (c) 2018 Ericsson + The copyright to the computer program(s) herein is the property of Ericsson. + The program(s) may be used and/or copied only with the written permission + of Ericsson or in accordance with the terms and conditions stipulated in the + agreement/contract under which the program(s) has been supplied. File: TCCUsefulFunctions_CNL113472_IPsec.tpd Description: tpd project file - Rev: R30A + Rev: R35B Prodnr: CNL 113 472 --> diff --git a/TCCUsefulFunctions_CNL113472_Interface.tpd b/TCCUsefulFunctions_CNL113472_Interface.tpd index d852adf..5584d4e 100644 --- a/TCCUsefulFunctions_CNL113472_Interface.tpd +++ b/TCCUsefulFunctions_CNL113472_Interface.tpd @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2017 Ericsson + Copyright (c) 2018 Ericsson - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html + The copyright to the computer program(s) herein is the property of Ericsson. + The program(s) may be used and/or copied only with the written permission + of Ericsson or in accordance with the terms and conditions stipulated in the + agreement/contract under which the program(s) has been supplied. File: TCCUsefulFunctions_CNL113472_Interface.tpd Description: tpd project file - Rev: R30A + Rev: R35B Prodnr: CNL 113 472 --> diff --git a/TCCUsefulFunctions_CNL113472_Maths.tpd b/TCCUsefulFunctions_CNL113472_Maths.tpd index a89ba9a..2a83bf5 100644 --- a/TCCUsefulFunctions_CNL113472_Maths.tpd +++ b/TCCUsefulFunctions_CNL113472_Maths.tpd @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2017 Ericsson + Copyright (c) 2018 Ericsson - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html + The copyright to the computer program(s) herein is the property of Ericsson. + The program(s) may be used and/or copied only with the written permission + of Ericsson or in accordance with the terms and conditions stipulated in the + agreement/contract under which the program(s) has been supplied. File: TCCUsefulFunctions_CNL113472_Maths.tpd Description: tpd project file - Rev: R30A + Rev: R35B Prodnr: CNL 113 472 --> diff --git a/TCCUsefulFunctions_CNL113472_OpenSecurity.tpd b/TCCUsefulFunctions_CNL113472_OpenSecurity.tpd index d3143d5..5620ded 100644 --- a/TCCUsefulFunctions_CNL113472_OpenSecurity.tpd +++ b/TCCUsefulFunctions_CNL113472_OpenSecurity.tpd @@ -1,17 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2017 Ericsson - - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html + Copyright (c) 2018 Ericsson + The copyright to the computer program(s) herein is the property of Ericsson. + The program(s) may be used and/or copied only with the written permission + of Ericsson or in accordance with the terms and conditions stipulated in the + agreement/contract under which the program(s) has been supplied. File: TCCUsefulFunctions_CNL113472_OpenSecurity.tpd Description: tpd project file - Rev: R30A + Rev: R35B Prodnr: CNL 113 472 --> diff --git a/TCCUsefulFunctions_CNL113472_PermutatedParameters.tpd b/TCCUsefulFunctions_CNL113472_PermutatedParameters.tpd index 73208fc..26527f0 100644 --- a/TCCUsefulFunctions_CNL113472_PermutatedParameters.tpd +++ b/TCCUsefulFunctions_CNL113472_PermutatedParameters.tpd @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2017 Ericsson + Copyright (c) 2018 Ericsson - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html + The copyright to the computer program(s) herein is the property of Ericsson. + The program(s) may be used and/or copied only with the written permission + of Ericsson or in accordance with the terms and conditions stipulated in the + agreement/contract under which the program(s) has been supplied. File: TCCUsefulFunctions_CNL113472_PermutatedParameters.tpd Description: tpd project file - Rev: R30A + Rev: R35B Prodnr: CNL 113 472 --> diff --git a/TCCUsefulFunctions_CNL113472_Regexp.tpd b/TCCUsefulFunctions_CNL113472_Regexp.tpd index 13b3d93..b0538dc 100644 --- a/TCCUsefulFunctions_CNL113472_Regexp.tpd +++ b/TCCUsefulFunctions_CNL113472_Regexp.tpd @@ -1,17 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2017 Ericsson - - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html + Copyright (c) 2018 Ericsson + The copyright to the computer program(s) herein is the property of Ericsson. + The program(s) may be used and/or copied only with the written permission + of Ericsson or in accordance with the terms and conditions stipulated in the + agreement/contract under which the program(s) has been supplied. File: TCCUsefulFunctions_CNL113472_Regexp.tpd Description: tpd project file - Rev: R30A + Rev: R35B Prodnr: CNL 113 472 --> diff --git a/TCCUsefulFunctions_CNL113472_TitanSim.tpd b/TCCUsefulFunctions_CNL113472_TitanSim.tpd index 74539c0..3f3f871 100644 --- a/TCCUsefulFunctions_CNL113472_TitanSim.tpd +++ b/TCCUsefulFunctions_CNL113472_TitanSim.tpd @@ -1,17 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2017 Ericsson - - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html + Copyright (c) 2018 Ericsson + The copyright to the computer program(s) herein is the property of Ericsson. + The program(s) may be used and/or copied only with the written permission + of Ericsson or in accordance with the terms and conditions stipulated in the + agreement/contract under which the program(s) has been supplied. File: TCCUsefulFunctions_CNL113472_TitanSim.tpd Description: tpd project file - Rev: R30A + Rev: R35B Prodnr: CNL 113 472 --> diff --git a/TCCUsefulFunctions_CNL113472_XPath.tpd b/TCCUsefulFunctions_CNL113472_XPath.tpd index 2bf643f..1105eb8 100644 --- a/TCCUsefulFunctions_CNL113472_XPath.tpd +++ b/TCCUsefulFunctions_CNL113472_XPath.tpd @@ -1,17 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2017 Ericsson - - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html + Copyright (c) 2018 Ericsson + The copyright to the computer program(s) herein is the property of Ericsson. + The program(s) may be used and/or copied only with the written permission + of Ericsson or in accordance with the terms and conditions stipulated in the + agreement/contract under which the program(s) has been supplied. File: TCCUsefulFunctions_CNL113472_XPath.tpd Description: tpd project file - Rev: R30A + Rev: R35B Prodnr: CNL 113 472 --> diff --git a/demo/TCCAssertion_Example.ttcn b/demo/TCCAssertion_Example.ttcn index a600570..ac1c613 100644 --- a/demo/TCCAssertion_Example.ttcn +++ b/demo/TCCAssertion_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2005 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCAssertion_Example.ttcn // Description: TCC Useful Functions: Assertion Functions. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2007-11-14 // Contact: http://ttcn.ericsson.se @@ -34,4 +35,4 @@ control log(" ----####--- NO Assertion tests executed ----####--- "); } -} +} \ No newline at end of file diff --git a/demo/TCCConversion_Example.ttcn b/demo/TCCConversion_Example.ttcn index 4dca33a..ba5a25d 100644 --- a/demo/TCCConversion_Example.ttcn +++ b/demo/TCCConversion_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2013 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCConversion_Example.ttcn // Description: TCC Useful Functions: Conversion Functions. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2013-09-24 // Contact: http://ttcn.ericsson.se @@ -248,6 +249,6 @@ control }//end of module with { -extension "version R30A" +extension "version R32A" } diff --git a/demo/TCCDateTime_Example.ttcn b/demo/TCCDateTime_Example.ttcn index 37880f5..40347a4 100644 --- a/demo/TCCDateTime_Example.ttcn +++ b/demo/TCCDateTime_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2011 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCDateTime_Example.ttcn // Description: TCC Useful testcases: DateTime testcases. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2011-05-30 // Contact: http://ttcn.ericsson.se @@ -35,7 +36,16 @@ type component DateTime_CT testcase f_test_time() runs on DateTime_CT { log(" ----------- f_time ----------- "); - log("Time (f_time): ", f_time()); + log("Time (f_time): ", f_time()); + + // no check + setverdict(pass); +} +// test f_time_ms testcase +testcase f_test_time_ms() runs on DateTime_CT +{ + log(" ----------- f_time_ms ----------- "); + log("Time (f_time_ms): ", f_time_ms()); // no check setverdict(pass); @@ -45,23 +55,83 @@ testcase f_test_time() runs on DateTime_CT testcase f_test_ctime() runs on DateTime_CT { log(" ----------- f_ctime ----------- "); - log("CTime (f_ctime) - an hour before: ", - f_ctime(f_time() - 3600)); + log("CTime (f_ctime) - an hour before: ", + f_ctime(f_time() - 3600)); + + var charstring vl_time_1 := "Wed Sep 21 14:13:42 2039\n"; + var charstring vl_time_2 := f_ctime(2200220022); + log("CTime (f_ctime) - test string: ",vl_time_1); + log("CTime (f_ctime) - func result: ",vl_time_2); + if (match(vl_time_1,vl_time_2)) { + setverdict(pass); + } else { + setverdict(fail); + } +} - log("CTime (f_ctime) - large integer test: ", f_ctime(2200220022)); - - // no check - setverdict(pass); + +// test f_ctime_ms testcase +testcase f_test_ctime_ms() runs on DateTime_CT +{ + log(" ----------- f_ctime_ms ----------- "); + log("CTime (f_ctime_ms) - an hour before: ", + f_ctime_ms(f_time_ms() - 3600000)); + + var charstring vl_time_1 := "Wed Sep 21 14:13:42.478 2039\n"; + var charstring vl_time_2 := f_ctime_ms(2200220022478); + log("CTime (f_ctime_ms) - test string: ",vl_time_1); + log("CTime (f_ctime_ms) - func result: ",vl_time_2); + if (match(vl_time_1,vl_time_2)) { + setverdict(pass); + } else { + setverdict(fail); + } +} + +// test f_ctime_UTC testcase +testcase f_test_ctime_UTC() runs on DateTime_CT +{ + log(" ----------- f_ctime_UTC ----------- "); + log("CTime (f_ctime_UTC) - an hour before: ", + f_ctime_UTC(f_time() - 3600)); + + var charstring vl_time_1 := "Wed Sep 21 12:13:42 2039\n"; + var charstring vl_time_2 := f_ctime_UTC(2200220022); + log("CTime (f_ctime_UTC) - test string: ",vl_time_1); + log("CTime (f_ctime_UTC) - func result: ",vl_time_2); + if (match(vl_time_1,vl_time_2)) { + setverdict(pass); + } else { + setverdict(fail); + } +} + +// test f_ctime_ms_UTC testcase +testcase f_test_ctime_ms_UTC() runs on DateTime_CT +{ + log(" ----------- f_ctime_ms_UTC ----------- "); + log("CTime (f_ctime_ms_UTC) - an hour before: ", + f_ctime_ms_UTC(f_time_ms() - 3600000)); + + var charstring vl_time_1 := "Wed Sep 21 12:13:42.478 2039\n"; + var charstring vl_time_2 := f_ctime_ms_UTC(2200220022478); + log("CTime (f_ctime_ms_UTC) - test string: ",vl_time_1); + log("CTime (f_ctime_ms_UTC) - func result: ",vl_time_2); + if (match(vl_time_1,vl_time_2)) { + setverdict(pass); + } else { + setverdict(fail); + } } // test f_time2str testcase testcase f_test_getTimeFormatted() runs on DateTime_CT { log(" ----------- f_getTimeFormatted ----------- "); - log("TimeFormatted (f_getTimeFormatted): ", + log("TimeFormatted (f_getTimeFormatted): ", f_getTimeFormatted(f_time(),"Now is %m %I:%M%p.")); - log("TimeFormatted (f_getTimeFormatted) - large integer test: ", - f_getTimeFormatted(2200220022," is %Y.%m %I:%M%p.")); + log("TimeFormatted (f_getTimeFormatted) - large integer test: ", + f_getTimeFormatted(2200220022," is %Y.%m %I:%M%p.")); // no check setverdict(pass); @@ -71,13 +141,13 @@ testcase f_test_getTimeFormatted() runs on DateTime_CT testcase f_test_time2sec() runs on DateTime_CT { log(" ----------- f_time2sec ----------- "); - log("Time2Sec (f_time2sec): ", - f_time2sec(2010,5,24,17,0,20)); + log("Time2Sec (f_time2sec): ", + f_time2sec(2010,5,24,17,0,20)); var integer t1 := f_time2sec(2050,5,5,0,0,0); var integer t2 := f_time2sec(2050,5,5,0,0,30); log("Time2Sec (f_time2sec) - large integer test: ", t1, ", ", t2); - + // no check setverdict(pass); } @@ -86,11 +156,11 @@ testcase f_test_time2sec() runs on DateTime_CT testcase f_test_getCurrentDateWithOffset() runs on DateTime_CT { log(" ----------- f_getCurrentDateWithOffset ----------- "); - log("Date (f_getDateFromSeconds): ", - f_getCurrentDateWithOffset(0)); + log("Date (f_getDateFromSeconds): ", + f_getCurrentDateWithOffset(0)); - log("Date (f_getDateFromSeconds) - large integer test: ", - f_getCurrentDateWithOffset(2200220022)); + log("Date (f_getDateFromSeconds) - large integer test: ", + f_getCurrentDateWithOffset(2200220022)); // no check setverdict(pass); @@ -100,8 +170,19 @@ testcase f_test_getCurrentDateWithOffset() runs on DateTime_CT testcase f_test_getCurrentGMTDate() runs on DateTime_CT { log(" ----------- f_getCurrentGMTDate ----------- "); - log("GMT Date (f_getCurrentGMTDate): ", - f_getCurrentGMTDate()); + log("GMT Date (f_getCurrentGMTDate): ", + f_getCurrentGMTDate()); + + // no check + setverdict(pass); +} + +// test f_getCurrentGMTDate_ms testcase +testcase f_test_getCurrentGMTDate_ms() runs on DateTime_CT +{ + log(" ----------- f_getCurrentGMTDate_ms ----------- "); + log("GMT Date (f_getCurrentGMTDate_ms): ", + f_getCurrentGMTDate_ms()); // no check setverdict(pass); @@ -119,7 +200,7 @@ testcase f_test_tic() runs on DateTime_CT { a := a + 1; } - + tictac := f_tic(); log("Tics since program start (f_tic): ", tictac); @@ -147,7 +228,7 @@ testcase f_test_toc() runs on DateTime_CT } time := f_toc(vl_start); - log("Seconds since vl_start (f_toc): ", time); + log("Seconds since vl_start (f_toc): ", time); // approx 2 seconds has elapsed sinece last tic if (time > 0.0) { setverdict(pass); } @@ -167,11 +248,11 @@ testcase f_test_timeDiff() runs on DateTime_CT T_timer.timeout; vl_end := f_time(); - var integer diff := f_timeDiff(vl_end, vl_start); - log("Time diff (f_timeDiff): ", diff); - + var integer diff := f_timeDiff(vl_end, vl_start); + log("Time diff (f_timeDiff): ", diff); + var integer largeDiff := f_timeDiff(vl_end+5500550055, vl_start+2200220022); - log("Time diff (f_timeDiff) - large integer test: ", largeDiff); + log("Time diff (f_timeDiff) - large integer test: ", largeDiff); if ((diff > 0) and (largeDiff > 3300330033)) { setverdict(pass); } else { setverdict(fail); } @@ -270,11 +351,16 @@ control log(" ################### DateTime ################### "); execute(f_test_time()); + execute(f_test_time_ms()); execute(f_test_ctime()); + execute(f_test_ctime_ms()); + execute(f_test_ctime_UTC()); + execute(f_test_ctime_ms_UTC()); execute(f_test_getTimeFormatted()); execute(f_test_time2sec()); execute(f_test_getCurrentDateWithOffset()); execute(f_test_getCurrentGMTDate()); + execute(f_test_getCurrentGMTDate_ms()); execute(f_test_tic()); execute(f_test_toc()); execute(f_test_timeDiff()); diff --git a/demo/TCCEncoding_Example.ttcn b/demo/TCCEncoding_Example.ttcn index 9b192c7..fb62fc4 100644 --- a/demo/TCCEncoding_Example.ttcn +++ b/demo/TCCEncoding_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2013 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCEncoding_Example.ttcn // Description: TCC Useful Functions: Message Encoding Functions. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2013-02-05 // Contact: http://ttcn.ericsson.se @@ -151,5 +152,5 @@ control { execute(tc_005_artf265694()); } -} with {extension "version R30A"} +} with {extension "version R32A"} diff --git a/demo/TCCEnv_Example.ttcn b/demo/TCCEnv_Example.ttcn index 1ca5b58..452f7cd 100644 --- a/demo/TCCEnv_Example.ttcn +++ b/demo/TCCEnv_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2008 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCEnv_Example.ttcn // Description: TCC Useful Functions: Environment Handling Functions. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2008-12-10 // Contact: http://ttcn.ericsson.se diff --git a/demo/TCCFileIO_Example.ttcn b/demo/TCCFileIO_Example.ttcn index 2fb9dac..1931195 100644 --- a/demo/TCCFileIO_Example.ttcn +++ b/demo/TCCFileIO_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2008 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCFileIO_Example.ttcn // Description: TCC Useful Functions: File IO Functions. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2008-12-10 // Contact: http://ttcn.ericsson.se @@ -311,11 +312,29 @@ testcase TC_test_read_TLV() runs on empty_CT else { setverdict(pass); - } + } } +testcase TC_test_getFileInfo() runs on empty_CT { + var charstring vl_text_in := "TCCFileIO.cc"; + + var FIO_FileInfo v_result; + v_result := f_FIO_getFileInfo(vl_text_in); + log(v_result); + + if (v_result.fileType == RegularFile and v_result.lastFileModification > 0) + { + setverdict(pass); + } + else + { + setverdict(fail); + } + +} control { + execute (TC_test_getFileInfo()); execute (TC_test ()); execute (TC_test_open ()); execute (TC_test_close ()); diff --git a/demo/TCCFileSystem_Example.ttcn b/demo/TCCFileSystem_Example.ttcn index 2013c8e..6b84283 100644 --- a/demo/TCCFileSystem_Example.ttcn +++ b/demo/TCCFileSystem_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2011 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCFileSystem_Example.ttcn // Description: TCC Useful testcases: FileSystem testcases. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2011-07-14 // Contact: http://ttcn.ericsson.se diff --git a/demo/TCCIPsec_Example.ttcn b/demo/TCCIPsec_Example.ttcn index 121fdd0..1e69870 100644 --- a/demo/TCCIPsec_Example.ttcn +++ b/demo/TCCIPsec_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2013 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCAssertion_Example.ttcn // Description: TCC Useful Functions: Assertion Functions. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2013-01-09 // Contact: http://ttcn.ericsson.se diff --git a/demo/TCCInterface_Example.ttcn b/demo/TCCInterface_Example.ttcn index 7f8f1e7..88eb01a 100644 --- a/demo/TCCInterface_Example.ttcn +++ b/demo/TCCInterface_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2008 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCInterface_Example.ttcn // Description: TCC Useful Functions: Interface Functions. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2008-12-10 // Contact: http://ttcn.ericsson.se diff --git a/demo/TCCMaths_Example.ttcn b/demo/TCCMaths_Example.ttcn index 571d13f..27b3b38 100644 --- a/demo/TCCMaths_Example.ttcn +++ b/demo/TCCMaths_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2005 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCMaths_Example.ttcn // Description: TCC Useful testcases: Maths testcases. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2007-12-09 // Contact: http://ttcn.ericsson.se diff --git a/demo/TCCMessageHandling_Example.ttcn b/demo/TCCMessageHandling_Example.ttcn index c98c058..b935bd7 100644 --- a/demo/TCCMessageHandling_Example.ttcn +++ b/demo/TCCMessageHandling_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2013 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCMessageHandling_Example.ttcn // Description: TCC Useful Functions: Message Handling Functions. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2013-03-28 // Contact: http://ttcn.ericsson.se diff --git a/demo/TCCPermutatedParameters_Example.ttcn b/demo/TCCPermutatedParameters_Example.ttcn index a4e58d5..54f8c38 100644 --- a/demo/TCCPermutatedParameters_Example.ttcn +++ b/demo/TCCPermutatedParameters_Example.ttcn @@ -1,14 +1,3 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html -/////////////////////////////////////////////////////////////////////////////// - - module TCCPermutatedParameters_Example { import from TCCPermutatedParameters_Definitions all; @@ -67,4 +56,4 @@ control { execute(tc_001_getPermutatedParams()); } -} +} \ No newline at end of file diff --git a/demo/TCCRegexp_Example.ttcn b/demo/TCCRegexp_Example.ttcn index 5348575..8c7b547 100644 --- a/demo/TCCRegexp_Example.ttcn +++ b/demo/TCCRegexp_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2017 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCRegexp_Example.ttcn // Description: TCC Useful Functions: Regular Expression Functions. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Contact: http://ttcn.ericsson.se /////////////////////////////////////////////// diff --git a/demo/TCCSecurity_Example.ttcn b/demo/TCCSecurity_Example.ttcn new file mode 100644 index 0000000..1ba699a --- /dev/null +++ b/demo/TCCSecurity_Example.ttcn @@ -0,0 +1,603 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// Copyright Test Competence Center (TCC) ETH 2013 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // +/////////////////////////////////////////////////////////////////////////////// +// +// File: TCCSecurity_Example.ttcn +// Description: TCC Useful testcases: Security testcases. +// Rev: R32A +// Prodnr: CNL 113 472 +// Updated: 2013-02-08 +// Contact: http://ttcn.ericsson.se +/////////////////////////////////////////////// + +module TCCSecurity_Example +{ + +import from TCCSecurity_Functions all; + +type component Security_CT { + var DigestData dg; + + var AKAInput aka_input; + var SIMOutput sim_output; +}; +type component IKEv2_CT { + var DigestData dg; + + var AKAInput aka_input; + var SIMOutput sim_output; +}; + +////////////////////////////////////////////////////////////// +// Security functions +////////////////////////////////////////////////////////////// + +type record DigestData { + charstring nonce, + charstring cnonce, + charstring user, + charstring realm, + charstring passwd, + charstring alg, + charstring nonceCount, + charstring method, + charstring qop, + charstring URI, + charstring HEntity +} + +type record AKAInput { + octetstring OP, + octetstring k, + octetstring rand, + octetstring sqn, + octetstring amf +} + +type record SIMOutput { + octetstring sres, + octetstring kc +} + +const octetstring c_OP := '00'O; + +// test f_calculateDigestResponse function +testcase f_test_digestresponse() runs on Security_CT +{ + log(" ----------- f_calculateDigestResponse ----------- "); + + dg := { + nonce := "dcd98b7102dd2f0e8b11d0f600bfb0c093", + cnonce := "0a4f113b", + user := "Mufasa", + realm := "testrealm@host.com", + passwd := "password", + alg := "MD5", + nonceCount := "00000001", + method := "GET", + qop := "auth", + URI := "/dir/index.html", + HEntity := "d41d8cd98f00b204e9800998ecf8427e" // MD5 hash of entity body + } + + log("Data to compute digest from: ", dg); + log("Digest response: ", + f_calculateDigestResponse( + dg.nonce, + dg.cnonce, + dg.user, + dg.realm, + dg.passwd, + dg.alg, + dg.nonceCount, + dg.method, + dg.qop, + dg.URI, + dg.HEntity)); + + // no check + setverdict(pass); +} + +testcase f_test_MD5() runs on Security_CT +{ + var charstring v_hash := f_calculateMD5("") + log("MD5 Hash of empty string: ", v_hash) + log("Expected: ", "d41d8cd98f00b204e9800998ecf8427e"); + if (v_hash == "d41d8cd98f00b204e9800998ecf8427e") { + setverdict(pass); + } + else { + setverdict(fail, "MD5 Hash test failed"); + } +} + +testcase tc_HMACMD5() runs on Security_CT +{ + var octetstring msg := char2oct("The quick brown fox jumps over the lazy dog"); + var octetstring key := char2oct("key"); + + while (lengthof(key) < 64) { + key := key & '00'O; + } + var octetstring hash := f_calculateHMACMD5(msg, key); + log("HMAC MD5 Hash: ", hash); + log("Expected: ", '80070713463e7749b90c2dc24911e275'O); + if(hash == '80070713463e7749b90c2dc24911e275'O) { + setverdict(pass); + } + else { + setverdict(fail, "MD5 Hash test failed"); + } +} + +testcase tc_HMACMD5_2() runs on Security_CT +{ + var octetstring msg := char2oct("The quick brown fox jumps over the lazy dog"); + var octetstring key := char2oct("key"); + + var octetstring hash := f_calculate_HMAC_MD5(key,msg,16); + log("HMAC MD5 Hash: ", hash); + log("Expected: ", '80070713463e7749b90c2dc24911e275'O); + if(hash == '80070713463e7749b90c2dc24911e275'O) { + setverdict(pass); + } + else { + setverdict(fail, "MD5 Hash test 2 failed"); + } +} + +testcase tc_HMACMD5_3() runs on Security_CT +{ + var octetstring msg := char2oct("The quick brown fox jumps over the lazy dog"); + var octetstring key := char2oct("key"); + + var octetstring hash := f_calculate_HMAC_MD5(key,msg,8); + log("HMAC MD5 Hash: ", hash); + log("Expected: ", '80070713463e7749'O); + if(hash == '80070713463e7749'O) { + setverdict(pass); + } + else { + setverdict(fail, "MD5 Hash test 2 failed"); + } +} + +testcase tc_HMACMD5_4() runs on Security_CT +{ + var octetstring msg := char2oct("The quick brown fox jumps over the lazy dog"); + var octetstring key := char2oct("01234567890123456789012345678901234567890123456789012345678901234"); + + var octetstring hash := f_calculate_HMAC_MD5(key,msg,16); + log("HMAC MD5 Hash: ", hash); + log("Expected: ", '6c5f927cd3311e7d2cc569d8f2bfcf98'O); + if(hash == '6c5f927cd3311e7d2cc569d8f2bfcf98'O) { + setverdict(pass); + } + else { + setverdict(fail, "MD5 Hash test 2 failed"); + } +} + +testcase tc_HMAC_SHA1() runs on Security_CT +{ + var octetstring msg := char2oct("The quick brown fox jumps over the lazy dog"); + var octetstring key := char2oct("key"); + + var octetstring hash := f_calculate_HMAC_SHA1(key,msg,20); + log("HMAC SHA1Hash: ", hash); + log("Expected: ", 'de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9'O); + if(hash == 'de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9'O) { + setverdict(pass); + } + else { + setverdict(fail, "SHA1 Hash test 2 failed"); + } +} + +testcase tc_HMAC_SHA256() runs on Security_CT +{ + var octetstring msg := char2oct("The quick brown fox jumps over the lazy dog"); + var octetstring key := char2oct("key"); + + var octetstring hash := f_calculate_HMAC_SHA256(key,msg,32); + log("HMAC SHA256Hash: ", hash); + log("Expected: ", 'f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8'O); + if(hash == 'f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8'O) { + setverdict(pass); + } + else { + setverdict(fail, "SHA256 Hash test 2 failed"); + } +} + +// test tc_AKA_functions function +testcase tc_AKA_functions() runs on Security_CT +{ + log(" ----------- tc_AKA_functions ----------- "); + + aka_input := + { + OP := '00'O, + k := str2oct("1234567890123456"), + rand := int2oct(9876, 16), + sqn := int2oct(1234, 6), + amf := '0000'O + } + +log("AMF: ", str2oct("12")); + log("Data to compute AKA output from: ", aka_input); + log("f_IMSAKA_f1 output MAC-A: ", + f_IMSAKA_f1 + ( + aka_input.OP, + aka_input.k, + aka_input.rand, + aka_input.sqn, + aka_input.amf + ) + ); + log("f_IMSAKA_f2 output RES: ", + f_IMSAKA_f2 + ( + aka_input.OP, + aka_input.k, + aka_input.rand + ) + ); + log("f_IMSAKA_f3 output CK: ", + f_IMSAKA_f3 + ( + aka_input.OP, + aka_input.k, + aka_input.rand + ) + ); + log("f_IMSAKA_f4 output IK: ", + f_IMSAKA_f4 + ( + aka_input.OP, + aka_input.k, + aka_input.rand + ) + ); + log("f_IMSAKA_f5 output AK: ", + f_IMSAKA_f5 + ( + aka_input.OP, + aka_input.k, + aka_input.rand + ) + ); + log("f_IMSAKA_f1star output MAC-S: ", + f_IMSAKA_f1star + ( + aka_input.OP, + aka_input.k, + aka_input.rand, + aka_input.sqn, + aka_input.amf + ) + ); + log("f_IMSAKA_f5star output AK-S: ", + f_IMSAKA_f5star + ( + aka_input.OP, + aka_input.k, + aka_input.rand + ) + ); + log("f_IMSAKA_calculateAUTN output AUTN: ", + f_IMSAKA_calculateAUTN + ( + aka_input.sqn, + f_IMSAKA_f5(aka_input.OP,aka_input.k,aka_input.rand), + aka_input.amf, + f_IMSAKA_f1(aka_input.OP,aka_input.k,aka_input.rand,aka_input.sqn,aka_input.amf) + ) + ); + + f_EAPSIM_A3A8(aka_input.k, aka_input.rand, sim_output.sres, sim_output.kc) + log("sim_output.sres: ", sim_output.sres, " sim_output.sres: ", sim_output.kc); + + setverdict(pass); +} + +testcase tc_EIA() runs on Security_CT +{ + var BIT_32 v_MAC := f_calculate128_EIA3 + ( + '00000000000000000000000000000000'O, //key + '00000000'O, + 0, + '0'B, + '0'B + ) + log(v_MAC); + if (v_MAC == oct2bit('c8a9595e'O)) + {setverdict(pass)} + else {setverdict(fail)} +} + +testcase tc_EEA() runs on Security_CT +{ + var bitstring v_oct := f_calculate128_EEA3 + ( + '173d14ba5003731d7a60049470f00a29'O, + '66035492'O, + 15, + '0'B, + oct2bit('6cf65340735552ab0c9752fa6f9025fe0bd675d9005875b2'O) & '0'B + ) + log(v_oct); + + if (v_oct == ( oct2bit('a6c85fc66afb8533aafc2518dfe784940ee1e4b030238cc8'O) & '0'B)) + {setverdict(pass)} + else {setverdict(fail)} +} + +testcase tc_3des_ecb() runs on Security_CT +{ + var octetstring vl_key := '000102030405060708090A0B0C0D0E0F0011223344556677'O + + var octetstring vl_data := '61A7D3BEAA4C7DBD1FA3B2237A8CC92AE6575BADF894A34643D74AFF502BF523973DF1637453388CC4C06EC02D8AB44E3EDC866555BC0FDC56D0B2029110D7A1A1F585B65FB84D3674EC87B30BF5E7E8F747330549C77A9CCD348B7898825302408CE53D25ED62D56CA0FFACC0DFECDC9CFCBD03279047'O + log(vl_data) + var octetstring vl_encrypted_data := ef_3DES_ECB_Encrypt(vl_data, vl_key); + log(vl_encrypted_data) + + var octetstring vl_decrypted_data := ef_3DES_ECB_Decrypt(vl_encrypted_data, vl_key); + log(vl_decrypted_data) + + if(match(vl_data, vl_decrypted_data)) + { + setverdict(pass); + } else { + log(match(vl_data, vl_decrypted_data)) + setverdict(fail); + } +} + +testcase tc_DH1024() runs on IKEv2_CT +{ + var octetstring vl_key_other := '73DF1637453388CC4C06EC02D8AB44E3EDC866555BC0FDC56D0B2029110D7A1A1F585B65FB84D3674EC87B30BF5E7E8F747330549C77A9CCD348B7898825302408CE53D25ED62D56CA0FFACC0DFECDC9CFCBD03279047E90E4E5013F173AE9E61A7D3BEAA4C7DBD1FA3B2237A8CC92AE6575BADF894A34643D74AFF502BF5239'O + log("Public key:") + log(vl_key_other) + + var octetstring vl_priv_key := '9FCF731129397EF7DC51562D71DD819DE35891B739BD6BE7A5177F676F1A06775A0E915E3758130FE5493B95C7A67F11F45E4C541DDD2834E4A9248F18EE2597936499C97D25227C4A4B78BABD4F33BBC3E3A2C591369A3A4FAF3D851839249E23E90D15051268986E562D76D756F7FAF942FFBC4669199A3C04E31335E2BD70'O + log("Private key:") + log(vl_priv_key) + + var octetstring vl_shared_secret := ef_DH_shared_secret(vl_key_other, vl_priv_key); + log("Shared secret:") + log(vl_shared_secret) +} + +testcase tc_DH2048() runs on IKEv2_CT +{ + var octetstring vl_key_other := '73DF1637453388CC4C06EC02D8AB44E3EDC866555BC0FDC56D0B2029110D7A1A1F585B65FB84D3674EC87B30BF5E7E8F747330549C77A9CCD348B7898825302408CE53D25ED62D56CA0FFACC0DFECDC9CFCBD03279047E90E4E5013F173AE9E61A7D3BEAA4C7DBD1FA3B2237A8CC92AE6575BADF894A34643D74AFF502BF523961A7D3BEAA4C7DBD1FA3B2237A8CC92AE6575BADF894A34643D74AFF502BF523973DF1637453388CC4C06EC02D8AB44E3EDC866555BC0FDC56D0B2029110D7A1A1F585B65FB84D3674EC87B30BF5E7E8F747330549C77A9CCD348B7898825302408CE53D25ED62D56CA0FFACC0DFECDC9CFCBD03279047E90E4E5013F173AE9E'O + log("Public key:") + log(vl_key_other) + + var octetstring vl_priv_key := '61A7D3BEAA4C7DBD1FA3B2237A8CC92AE6575BADF894A34643D74AFF502BF523973DF1637453388CC4C06EC02D8AB44E3EDC866555BC0FDC56D0B2029110D7A1A1F585B65FB84D3674EC87B30BF5E7E8F747330549C77A9CCD348B7898825302408CE53D25ED62D56CA0FFACC0DFECDC9CFCBD03279047E90E4E5013F173AE9E0E915E3758130FE5493B95C7A67F11F45E4C541DDD2834E4A9248F18EE2597936499C97D25227C4A4B789FCF731129397EF7DC51562D71DD819DE35891B739BD6BE7A5177F676F1A06775ABABD4F33BBC3E3A2C591369A3A4FAF3D851839249E23E90D15051268986E562D76D756F7FAF942FFBC4669199A3C04E31335E2BD70'O + log("Private key:") + log(vl_priv_key) + + var octetstring vl_shared_secret := ef_DH_shared_secret(vl_key_other, vl_priv_key); + log("Shared secret:") + log(vl_shared_secret) +} + +testcase tc_3DES_CBC() runs on IKEv2_CT +{ + var octetstring vl_data := '61A7D3BEAA4C7DBD1FA3B2237A8CC92AE6575BADF894A34643D74AFF502BF523973DF1637453388CC4C06EC02D8AB44E3EDC866555BC0FDC56D0B2029110D7A1A1F585B65FB84D3674EC87B30BF5E7E8F747330549C77A9CCD348B7898825302408CE53D25ED62D56CA0FFACC0DFECDC9CFCBD03279047'O + var octetstring vl_key := '000102030405060708090A0B0C0D0E0F0011223344556677'O + var octetstring vl_iv := '0001020304050607'O + + var octetstring vl_encrypted := ef_3DES_CBC_Encrypt(vl_data, vl_key, vl_iv); + log("Encrypted data: ") + log(vl_encrypted) + + var octetstring vl_decrypted := ef_3DES_CBC_Decrypt(vl_encrypted, vl_key, vl_iv); + log("Decrypted data: ") + log(vl_decrypted) + + log("Original data: ") + log(vl_data) + + if(match(vl_data, vl_decrypted)) + { + setverdict(pass); + } else { + log(match(vl_data, vl_decrypted)) + setverdict(fail); + } +} + +testcase tc_AES_XCBC_128_no_data() runs on IKEv2_CT +{ + var octetstring vl_data := ''O + var octetstring vl_key := '000102030405060708090a0b0c0d0e0f'O + + var octetstring vl_computed_value := ef_Calculate_AES_XCBC_128(vl_data, vl_key, 16); + log("Computed value: ") + log(vl_computed_value) + + var octetstring vl_xcbc_value := '75f0251d528ac01c4573dfd584d79f29'O + log("XCBC value: ") + log(vl_xcbc_value) + + if(match(vl_computed_value, vl_xcbc_value)) + { + setverdict(pass); + } else { + log(match(vl_computed_value, vl_xcbc_value)) + setverdict(fail); + } +} + +testcase tc_AES_XCBC_128_20byte_data() runs on IKEv2_CT +{ + var octetstring vl_data := '000102030405060708090a0b0c0d0e0f10111213'O + var octetstring vl_key := '000102030405060708090a0b0c0d0e0f'O + + var octetstring vl_computed_value := ef_Calculate_AES_XCBC_128(vl_data, vl_key, 16); + log("Computed value: ") + log(vl_computed_value) + + var octetstring vl_xcbc_value := '47f51b4564966215b8985c63055ed308'O + log("XCBC value: ") + log(vl_xcbc_value) + + if(match(vl_computed_value, vl_xcbc_value)) + { + setverdict(pass); + } else { + log(match(vl_computed_value, vl_xcbc_value)) + setverdict(fail); + } +} + +testcase tc_test_f_calculate128_EEA1() runs on Security_CT{ + var OCT_16 key := '5ACB1D644C0D51204EA5F1451010D852'O + var OCT_4 count := 'FA556B26'O + var INT_5 bearer := 3 + var BIT_1 direction := '1'B + var BIT_1_65504 msg_in := oct2bit('AD9C441F890B38C457A49D421407E8'O) + var BIT_1_65504 msg_out:= f_calculate128_EEA1(key,count,bearer,direction,msg_in); + log(msg_out) + if(msg_out=='101110100000111100110001001100000000001100110100110001010110101101010010101001110100100101111100101110101100000001000110'B){ + setverdict(pass) + } else { + setverdict(fail) + } + +} + +testcase tc_test_f_calculate128_EIA1() runs on Security_CT{ + var OCT_16 key := '2BD6459F82C5B300952C49104881FF48'O + var OCT_4 count := '38A6F056'O + var integer bearer := 31; + var BIT_1 direction := '0'B + var BIT_1_65504 msg_in := '0011001100110010001101000110001001100011001110010011100001100001001101110011010001111001'B //substr(oct2bit('6B227737296F393C8079353EDC87E2E805D2EC49A4F2D8E0'O),0,88); + var BIT_1_65504 msg_out:= f_calculate128_EIA1(key,count,bearer,direction,msg_in); + log(msg_out) + if(msg_out=='01110011000111110001000101100101'B){ + setverdict(pass) + } else { + setverdict(fail) + } + + + +} + +testcase tc_test_f_calculate128_EIA2_1() runs on Security_CT{ + var OCT_16 key := 'd3c5d592327fb11c4035c6680af8c6d1'O + var OCT_4 count := '398a59b4'O + var integer bearer := 26; + var BIT_1 direction := '1'B + var octetstring msg_in := '484583d5afe082ae'O + var octetstring msg_out:= f_calculate128_EIA2(key,count,bearer,direction,msg_in); + log("Result ",msg_out) + log("Expected ",'B93787E6'O) + if(msg_out=='B93787E6'O){ + setverdict(pass) + } else { + setverdict(fail) + } + + + +} +testcase tc_test_f_calculate128_EIA2_2() runs on Security_CT{ + var OCT_16 key := 'b3120ffdb2cf6af4e73eaf2ef4ebec69'O + var OCT_4 count := '296f393c'O + var integer bearer := 11; + var BIT_1 direction := '1'B + var octetstring msg_in := '00000000000000000101010101010101e0958045f3a0bba4e3968346f0a3b8a7c02a018ae640765226b987c913e6cbf083570016cf83efbc61c082513e21561a427c009d28c298eface78ed6d56c2d4505ad032e9c04dc60e73a81696da665c6c48603a57b45ab33221585e68ee3169187fb0239528632dd656c807ea3248b7b46d002b2b5c7458eb85b9ce95879e0340859055e3b0abbc3eace8719caa80265c97205d5dc4bcc902fe1839629ed71328a0f0449f588557e6898860e042aecd84b2404c212c9222da5bf8a89ef6797870cf50771a60f66a2ee62853657addf04cdde07fa414e11f12b4d81b9b4e8ac538ea30666688d881f6c348421992f31b94f8806ed8fccff4c9123b89642527ad613b109bf75167485f1268bf884b4cd23d29a0934925703d634098f7767f1be7491e708a8bb949a3873708aef4a36239e50cc08235cd5ed6bbe578668a17b58c1171d0b90e813a9e4f58a89d719b11042d6360b1b0f52deb730a58d58faf46315954b0a872691475977dc88c0d733feff54600a0cc1d0300aaaeb94572c6e95b01ae90de04f1dce47f87e8fa7bebf77e1dbc20d6ba85cb9143d518b285dfa04b698bf0cf7819f20fa7a288eb0703d995c59940c7c66de57a9b70f82379b70e2031e450fcfd2181326fcd28d8823baaa80df6e0f443559647539fd8907c0ffd9d79c130ed81c9afd9b7e848c9fed38443d5d380e53fbdb8ac8c3d3f06876054f122461107de92fea09c6f6923a188d53afe54a10f60e6e9d5a03d996b5fbc820f8a637116a27ad04b444a0932dd60fbd12671c11e1c0ec73e789879faa3d42c64d20cd1252742a3768c25a901585888ecee1e612d9936b403b0775949a66cdfd99a29b1345baa8d9d5400c91024b0a607363b013ce5de9ae869d3b8d95b0570b3c2d391422d32450cbcfae96652286e96dec1214a9346527980a8192eac1c39a3aaf6f15351da6be764df89772ec0407d06e4415befae7c92580df9bf507497c8f2995160d4e218daacb02944abf83340ce8be1686a960faf90e2d90c55cc6475babc3171a80a363174954955d7101dab16ae8179167e21444b443a9eaaa7c91de36d118c39d389f8dd4469a846c9a262bf7fa18487a79e8de11699e0b8fdf557cb48719d453ba713056109b93a218c89675ac195fb4fb06639b3797144955b3c9327d1aec003d42ecd0ea98abf19ffb4af3561a67e77c35bf15c59c2412da881db02b1bfbcebfac5152bc99bc3f1d15f771001b7029fedb028f8b852bc4407eb83f891c9ca733254fdd1e9edb56919ce9fea21c174072521c18319a54b5d4efbebddf1d8b69b1cbf25f489fcc981372547cf41d008ef0bca1926f934b735e090b3b251eb33a36f82ed9b29cf4cb944188fa0e1e38dd778f7d1c9d987b28d132dfb9731fa4f4b416935be49de30516af3578581f2f13f561c0663361941eab249a4bc123f8d15cd711a956a1bf20fe6eb78aea2373361da0426c79a530c3bb1de0c99722ef1fde39ac2b00a0a8ee7c800a08bc2264f89f4effe627ac2f0531fb554f6d21d74c590a70adfaa390bdfbb3d68e46215cab187d2368d5a71f5ebec081cd3b20c082dbe4cd2faca28773795d6b0c10204b659a939ef29bbe1088243624429927a7eb576dd3a00ea5e01af5d47583b2272c0c161a806521a16ff9b0a722c0cf26b025d5836e2258a4f7d4773ac801e4263bc294f43def7fa8703f3a4197463525887652b0b2a4a2a7cf87f00914871e25039113c7e1618da34064b57a43c463249fb8d05e0f26f4a6d84972e7a9054824145f91295cdbe39a6f920facc659712b46a54ba295bbe6a90154e91b33985a2bcd420ad5c67ec9ad8eb7ac6864db272a516bc94c2839b0a8169a6bf58e1a0c2ada8c883b7bf497a49171268ed15ddd2969384e7ff4bf4aab2ec9ecc6529cf629e2df0f08a77a65afa12aa9b505df8b287ef6cc91493d1caa39076e28ef1ea028f5118de61ae02bb6aefc3343a050292f199f401857b2bead5e6ee2a1f191022f9278016f047791a9d18da7d2a6d27f2e0e51c2f6ea30e8ac49a0604f4c13542e85b68381b9fdcfa0ce4b2d341354852d360245c536b612af71f3e77c9095ae2dbde504b265733dabfe10a20fc7d6d32c21ccc72b8b3444ae663d65922d17f82caa2b865cd88913d291a65899026ea1328439723c198c36b0c3c8d085bfaf8a320fde334b4a4919b44c2b95f6e8ecf73393f7f0d2a40e60b1d406526b022ddc331810b1a5f7c347bd53ed1f105d6a0d30aba477e178889ab2ec55d558deab2630204336962b4db5b663b6902b89e85b31bc6af50fc50accb3fb9b57b663297031378db47896d7fbaf6c600add2c67f936db037986db856eb49cf2db3f7da6d23650e438f1884041b013119e4c2ae5af37cccdfb68660738b58b3c59d1c0248437472aba1f35ca1fb90cd714aa9f635534f49e7c5bba81c2b6b36fdee21ca27e347f793d2ce944edb23c8c9b914be10335e350feb5070394b7a4a15c0ca120283568b7bfc254fe838b137a2147ce7c113a3a4d65499d9e86b87dbcc7f03bbd3a3ab1aa243ece5ba9bcf25f82836cfe473b2d83e7a7201cd0b96a72451e863f6c3ba664a6d073d1f7b5ed990865d978bd3815d06094fc9a2aba5221c22d5ab996389e3721e3af5f05beddc2875e0dfaeb39021ee27a41187cbb45ef40c3e73bc03989f9a30d12c54ba7d2141da8a875493e65776ef35f97debc2286cc4af9b4623eee902f840c52f1b8ad658939aef71f3f72b9ec1de21588bd35484ea44436343ff95ead6ab1d8afb1b2a303df1b71e53c4aea6b2e3e9372be0d1bc99798b0ce3cc10d2a596d565dba82f88ce4cff3b33d5d24e9c0831124bf1ad54b792532983dd6c3a8b7d0'O + var octetstring msg_out:= f_calculate128_EIA2(key,count,bearer,direction,msg_in); + log("Result ",msg_out) + log("Expected ",'ebd5ccb0'O) + if(msg_out=='ebd5ccb0'O){ + setverdict(pass) + } else { + setverdict(fail) + } + + + +} +testcase tc_test_f_calculate128_EIA2_3() runs on Security_CT{ + var OCT_16 key := '83fd23a244a74cf358da3019f1722635'O + var OCT_4 count := '36af6144'O + var integer bearer := 15; + var BIT_1 direction := '1'B + var octetstring msg_in:='35c68716633c66fb750c266865d53c11ea05b1e9fa49c8398d48e1efa5909d3947902837f5ae96d5a05bc8d61ca8dbef1b13a4b4abfe4fb1006045b674bb54729304c382be53a5af05556176f6eaa2ef1d05e4b083181ee674cda5a485f74d7a'O var octetstring msg_out:= f_calculate128_EIA2(key,count,bearer,direction,msg_in); + log("Result ",msg_out) + log("Expected ",'e657e182'O) + if(msg_out=='e657e182'O){ + setverdict(pass) + } else { + setverdict(fail) + } + + + +} +testcase tc_test_f_calculate128_EEA2() runs on Security_CT{ + var OCT_16 key := 'd3c5d592327fb11c4035c6680af8c6d1'O + var OCT_4 count := '398a59b4'O + var integer bearer := 21; + var BIT_1 direction := '1'B + var octetstring msg_in := '981ba6824c1bfb1ab485472029b71d808ce33e2cc3c0b5fc1f3de8a6dc66b1f0'O + var octetstring msg_out:= f_calculate128_EEA2(key,count,bearer,direction,msg_in); + log(msg_out) + + if(msg_out=='E9FED8A63D155304D71DF20BF3E82214B20ED7DAD2F233DC3C22D7BDEEED8E78'O){ + setverdict(pass) + } else { + setverdict(fail) + } + + +} + + +// execute security tests +control +{ + log(" ################### Security ################### "); + + execute(f_test_digestresponse()); + execute(f_test_MD5()); + execute(tc_AKA_functions()); + execute(tc_HMACMD5()); + execute(tc_HMACMD5_2()); + execute(tc_HMACMD5_3()); + execute(tc_HMACMD5_4()); + execute(tc_HMAC_SHA1()); + execute(tc_HMAC_SHA256()); + execute(tc_EIA()); + execute(tc_EEA()); + execute(tc_3des_ecb()); + execute(tc_DH1024()); + execute(tc_DH2048()); + execute(tc_3DES_CBC()); + execute(tc_AES_XCBC_128_no_data()); + execute(tc_AES_XCBC_128_20byte_data()); + execute(tc_test_f_calculate128_EEA1()) + execute(tc_test_f_calculate128_EIA1()) + execute(tc_test_f_calculate128_EIA2_1()) + execute(tc_test_f_calculate128_EIA2_2()) + execute(tc_test_f_calculate128_EIA2_3()) + execute(tc_test_f_calculate128_EEA2()) +} + +} with {extension "version R32A"} diff --git a/demo/TCCTemplate_Example.ttcn b/demo/TCCTemplate_Example.ttcn index 44c9c45..fd04560 100644 --- a/demo/TCCTemplate_Example.ttcn +++ b/demo/TCCTemplate_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2005 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCTemplate_Example.ttcn // Description: TCC Useful Functions: Template Functions. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2007-12-20 // Contact: http://ttcn.ericsson.se diff --git a/demo/TCCTitanMetadata_Example.ttcn b/demo/TCCTitanMetadata_Example.ttcn index 91f4efd..2db083f 100644 --- a/demo/TCCTitanMetadata_Example.ttcn +++ b/demo/TCCTitanMetadata_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2005 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCTitanMetadata_Example.ttcn // Description: TCC Useful Functions: Titan Metadata Functions. -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2007-11-14 // Contact: http://ttcn.ericsson.se @@ -44,4 +45,4 @@ control { execute(f_test_compilationTime()); } -} +} \ No newline at end of file diff --git a/demo/TCCXPathSupport_Example.ttcn b/demo/TCCXPathSupport_Example.ttcn index 3b8f110..f495c7c 100644 --- a/demo/TCCXPathSupport_Example.ttcn +++ b/demo/TCCXPathSupport_Example.ttcn @@ -1,16 +1,17 @@ /////////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2000-2017 Ericsson Telecom AB -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html +// // +// Copyright Test Competence Center (TCC) ETH 2008 // +// // +// The copyright to the computer program(s) herein is the property of TCC. // +// The program(s) may be used and/or copied only with the written permission // +// of TCC or in accordance with the terms and conditions stipulated in the // +// agreement/contract under which the program(s) have been supplied // +// // /////////////////////////////////////////////////////////////////////////////// // // File: TCCXPathSupport_Example.ttcn // Description: TCC Useful Functions: XPath Support Functions -// Rev: R30A +// Rev: R32A // Prodnr: CNL 113 472 // Updated: 2008-09-04 // Contact: http://ttcn.ericsson.se diff --git a/doc/TCCUsefulFunctions_CNL113472_1551.doc b/doc/TCCUsefulFunctions_CNL113472_1551.doc index 1ae7690e94907c6ac2e85a3aa75789ffb477a29c..609b2ff757a4e3a675f4f43958d1fce3380d1498 100644 GIT binary patch delta 89664 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 UNu9zf_KDDE^+H;9*&BZRUuY<-G5`Po delta 96956 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 I2<q_v0lF>EJpcdz diff --git a/doc/TCCUsefulFunctions_CNL113472_PRI.doc b/doc/TCCUsefulFunctions_CNL113472_PRI.doc index d90970b743c58ed176fc9063cc44ae4fa12e7614..ac0448adf3a7e532e2913ee0782bd7df5b378850 100644 GIT binary patch literal 173056 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 bWuew^O?tnksp_fbYgebe?T!9xtpxrLNV@Q! delta 37729 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 Jk*Prb{|D=)qoDu* diff --git a/src/TCCAssertion.cc b/src/TCCAssertion.cc index 03d0d96..5813a0d 100644 --- a/src/TCCAssertion.cc +++ b/src/TCCAssertion.cc @@ -10,7 +10,7 @@ // // File: TCCAssertion.cc // Description: TCC Useful Functions: Assert Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCAssertion_Functions.ttcn b/src/TCCAssertion_Functions.ttcn index 526c950..eebea19 100644 --- a/src/TCCAssertion_Functions.ttcn +++ b/src/TCCAssertion_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCAssertion_Functions.ttcn // Description: TCC Useful Functions: Assert Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCConversion.cc b/src/TCCConversion.cc index 6d5f58a..27fae12 100644 --- a/src/TCCConversion.cc +++ b/src/TCCConversion.cc @@ -10,7 +10,7 @@ // // File: TCCConversion.cc // Description: TCC Useful Functions: Conversion Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCConversion_Functions.ttcn b/src/TCCConversion_Functions.ttcn index b4df9b6..f52ea2b 100644 --- a/src/TCCConversion_Functions.ttcn +++ b/src/TCCConversion_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCConversion_Functions.ttcn // Description: TCC Useful Functions: Conversion Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// @@ -969,5 +969,5 @@ return boolean }//end of module with { -extension "version R30A"} +extension "version R35B"} diff --git a/src/TCCDateTime.cc b/src/TCCDateTime.cc index 553426f..0256c88 100644 --- a/src/TCCDateTime.cc +++ b/src/TCCDateTime.cc @@ -10,36 +10,49 @@ // // File: TCCDateTime.cc // Description: TCC Useful Functions: DateTime Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// #include "TCCDateTime_Functions.hh" #include <time.h> +#include <sys/time.h> #include <stdlib.h> -namespace TCCDateTime__Functions +namespace TCCDateTime__Functions { + const char * TCC_WEEKDAY[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; + const char * TCC_MONTH[] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; + + //format time string in the following format Www Mmm dd hh:mm::ss.SSS yyyy + CHARSTRING formatTimeString(const struct tm* ti, int msec) + { + char ret_val[30]; + sprintf(ret_val,"%.3s %.3s %.2d %.2d:%.2d:%.2d.%.3d %.4d\n", + TCC_WEEKDAY[ti->tm_wday], TCC_MONTH[ti->tm_mon], ti->tm_mday, + ti->tm_hour, ti->tm_min, ti->tm_sec, msec,ti->tm_year + 1900); + return ret_val; + } /////////////////////////////////////////////////////////////////////////////// // Function: f__time -// +// // Purpose: // Current calendar time of the system in seconds // // Parameters: // - -// +// // Return Value: // integer - time value // // Errors: -// - -// +// - +// // Detailed description: // - -// +// /////////////////////////////////////////////////////////////////////////////// INTEGER f__time() { @@ -50,74 +63,157 @@ namespace TCCDateTime__Functions return i; } +/////////////////////////////////////////////////////////////////////////////// +// Function: f__time__ms +// +// Purpose: +// Current calendar time of the system in milliseconds +// +// Parameters: +// - +// +// Return Value: +// integer - time value +// +// Errors: +// - +// +// Detailed description: +// - +// +/////////////////////////////////////////////////////////////////////////////// + INTEGER f__time__ms() + { + struct timeval ct; + gettimeofday(&ct,0); + INTEGER i; + i.set_long_long_val(ct.tv_sec*1000 + ct.tv_usec/1000); + return i; + } + /////////////////////////////////////////////////////////////////////////////// // Function: f__ctime -// +// // Purpose: // Convert a time value in seconds to human readable string. // The time represented as local time // // Parameters: // pl__sec - *in* *integer* - time value -// +// // Return Value: -// integer - converted time value +// charstring - formatted time in string format // // Errors: -// - -// +// - +// // Detailed description: // - -// +// /////////////////////////////////////////////////////////////////////////////// -CHARSTRING f__ctime(const INTEGER& pl__sec) -{ + CHARSTRING f__ctime(const INTEGER& pl__sec) + { time_t cur_time = pl__sec.get_long_long_val(); return ctime(&cur_time); -} + } /////////////////////////////////////////////////////////////////////////////// +// Function: f__ctime__ms +// +// Purpose: +// Convert a time value in milliseconds to human readable string. +// The time represented as local time +// +// Parameters: +// pl__msec - *in* *integer* - time value +// +// Return Value: +// charstring - formatted time in string format +// +// Errors: +// - +// +// Detailed description: +// - +// +/////////////////////////////////////////////////////////////////////////////// + CHARSTRING f__ctime__ms(const INTEGER& pl__msec) + { + time_t ct = pl__msec.get_long_long_val()/1000; + int msec = pl__msec.get_long_long_val()%1000; + struct tm * ti = localtime(&ct); + return formatTimeString(ti,msec); + } +/////////////////////////////////////////////////////////////////////////////// // Function: f__ctime__UTC -// +// // Purpose: // Convert a time value in seconds to human readable string. // The time represented as UTC // // Parameters: // pl__sec - *in* *integer* - time value -// +// // Return Value: -// integer - converted time value +// charstring - formatted time in string format // // Errors: -// - -// +// - +// // Detailed description: // - -// +// /////////////////////////////////////////////////////////////////////////////// -CHARSTRING f__ctime__UTC(const INTEGER& pl__sec) -{ - time_t cur_time = pl__sec.get_long_long_val(); - return asctime(gmtime(&cur_time)); -} + CHARSTRING f__ctime__UTC(const INTEGER& pl__sec) + { + time_t cur_time = pl__sec.get_long_long_val(); + return asctime(gmtime(&cur_time)); + } + +/////////////////////////////////////////////////////////////////////////////// +// Function: f__ctime__ms__UTC +// +// Purpose: +// Convert a time value in milliseconds to human readable string. +// The time represented as UTC +// +// Parameters: +// pl__msec - *in* *integer* - time value +// +// Return Value: +// charstring - formatted time in string format +// +// Errors: +// - +// +// Detailed description: +// - +// +/////////////////////////////////////////////////////////////////////////////// + CHARSTRING f__ctime__ms__UTC(const INTEGER& pl__msec) + { + time_t ct = pl__msec.get_long_long_val()/1000; + int msec = pl__msec.get_long_long_val()%1000; + struct tm * ti = gmtime(&ct); + return formatTimeString(ti,msec); + } /////////////////////////////////////////////////////////////////////////////// // Function: f__getTimeFormatted -// +// // Purpose: // Return the current calendar time in a formatted way // // Parameters: // pl__sec - *in* *integer* - time value // pl__format - *in* *charstring* - format string -// +// // Return Value: // charstring - formatted time in string format // // Errors: -// - -// +// - +// // Detailed description: // *Specifier / Replaced by / Example* // @@ -170,7 +266,7 @@ CHARSTRING f__ctime__UTC(const INTEGER& pl__sec) // ---------------------------------------------------------------------------------------------------------- // // * The specifiers whose description is marked with an asterisk (*) are locale-dependent. -// +// /////////////////////////////////////////////////////////////////////////////// CHARSTRING f__getTimeFormatted(const INTEGER& pl__sec, const CHARSTRING& pl__format) { @@ -178,12 +274,12 @@ CHARSTRING f__ctime__UTC(const INTEGER& pl__sec) size_t str_len = 255; char ret_val[str_len]; strftime (ret_val, str_len, (const char *)pl__format, localtime(&in_time)); - return ret_val; + return ret_val; } /////////////////////////////////////////////////////////////////////////////// // Function: f__time2sec -// +// // Purpose: // Function to convert a formated time value to seconds. // The time is expressed as local time. @@ -195,23 +291,23 @@ CHARSTRING f__ctime__UTC(const INTEGER& pl__sec) // pl__hour - *in* *integer* - day (e.g. 12) // pl__min - *in* *integer* - day (e.g. 50) // pl__sec - *in* *integer* - day (e.g. 7) -// +// // Return Value: // integer - time in seconds // // Errors: -// - -// +// - +// // Detailed description: // time in seconds since January 1, 1900 -// +// /////////////////////////////////////////////////////////////////////////////// -INTEGER f__time2sec(const INTEGER& pl__year, - const INTEGER& pl__mon, - const INTEGER& pl__mday, - const INTEGER& pl__hour, - const INTEGER& pl__min, - const INTEGER& pl__sec) + INTEGER f__time2sec(const INTEGER& pl__year, + const INTEGER& pl__mon, + const INTEGER& pl__mday, + const INTEGER& pl__hour, + const INTEGER& pl__min, + const INTEGER& pl__sec) { struct tm tms; tms.tm_sec = pl__sec; @@ -230,10 +326,9 @@ INTEGER f__time2sec(const INTEGER& pl__year, return i; } - /////////////////////////////////////////////////////////////////////////////// // Function: f__time2sec__UTC -// +// // Purpose: // Function to convert a formated time value to seconds. // The time is expressed as UTC. @@ -245,24 +340,24 @@ INTEGER f__time2sec(const INTEGER& pl__year, // pl__hour - *in* *integer* - day (e.g. 12) // pl__min - *in* *integer* - day (e.g. 50) // pl__sec - *in* *integer* - day (e.g. 7) -// +// // Return Value: // integer - time in seconds // // Errors: -// - -// +// - +// // Detailed description: // time in seconds since January 1, 1900 -// +// /////////////////////////////////////////////////////////////////////////////// -INTEGER f__time2sec__UTC(const INTEGER& pl__year, - const INTEGER& pl__mon, - const INTEGER& pl__mday, - const INTEGER& pl__hour, - const INTEGER& pl__min, - const INTEGER& pl__sec) + INTEGER f__time2sec__UTC(const INTEGER& pl__year, + const INTEGER& pl__mon, + const INTEGER& pl__mday, + const INTEGER& pl__hour, + const INTEGER& pl__min, + const INTEGER& pl__sec) { struct tm tms; tms.tm_sec = pl__sec; @@ -285,25 +380,25 @@ INTEGER f__time2sec__UTC(const INTEGER& pl__year, /////////////////////////////////////////////////////////////////////////////// // Function: f__getCurrentDateWithOffset -// +// // Purpose: // Generate a date from the actual date and time plus the parameter -// in seconds e.g. getSdate(30) will return a charstring containing +// in seconds e.g. getSdate(30) will return a charstring containing // the date and time of 30 seconds later // // Parameters: // pl__sec - *in* *integer* - offset time value -// +// // Return Value: // charstring - formatted time in string format // // Errors: -// - -// +// - +// // Detailed description: // - -// -/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// CHARSTRING f__getCurrentDateWithOffset(const INTEGER& pl__sec) { time_t cur_time; @@ -314,38 +409,66 @@ INTEGER f__time2sec__UTC(const INTEGER& pl__year, /////////////////////////////////////////////////////////////////////////////// // Function: f__getCurrentGMTDate -// +// // Purpose: -// Return the current GMT date in format RFC 1123-Date -// e.g.:Sat, 13 Nov 2010 23:30:02 GMT +// Return the current GMT date in format RFC 1123-Date +// e.g.:Mon Nov 20 11:22:08 2017 // // Parameters: // - -// +// // Return Value: // charstring - formatted time in string format // // Errors: -// - -// +// - +// // Detailed description: // - -// -/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// CHARSTRING f__getCurrentGMTDate() { time_t cur_time; time( &cur_time ); - return asctime( gmtime( &cur_time ) ); } - - + +/////////////////////////////////////////////////////////////////////////////// +// Function: f__getCurrentGMTDate__ms +// +// Purpose: +// Return the current GMT date in format Www Mmm dd hh:mm:ss.SSS yyyy +// e.g.:Mon Nov 20 11:22:08.683 2017 +// +// Parameters: +// - +// +// Return Value: +// charstring - formatted time in string format +// +// Errors: +// - +// +// Detailed description: +// - +// +/////////////////////////////////////////////////////////////////////////////// + CHARSTRING f__getCurrentGMTDate__ms() + { + struct timeval cur_time; + gettimeofday(&cur_time,0); + time_t sec = cur_time.tv_sec; + int msec = cur_time.tv_usec/1000; + struct tm * ti = gmtime(&sec); + return formatTimeString(ti,msec); + } + ////////////////////////////////////////////////////////////////////////////// // Function: f__tic -// +// // Purpose: -// Return the number of clock ticks used by the application since +// Return the number of clock ticks used by the application since // the program was launched // // OR @@ -358,84 +481,84 @@ INTEGER f__time2sec__UTC(const INTEGER& pl__year, // // Parameters: // - -// +// // Return Value: // integer - tics since program start // // Errors: // - -// +// // Detailed description: // - -// -/////////////////////////////////////////////////////////////////////////////// -INTEGER f__tic() -{ +// +/////////////////////////////////////////////////////////////////////////////// + INTEGER f__tic() + { INTEGER i; i.set_long_long_val(clock()); return i; -} + } ////////////////////////////////////////////////////////////////////////////// // Function: f__toc -// +// // Purpose: -// Elapsed seconds since time t (only when f__tic() returns the number of +// Elapsed seconds since time t (only when f__tic() returns the number of // clock ticks elapsed since the program was launched) // // Warning! This function depends on used library version. Be careful! // // Parameters: // t - *in* *integer* - time value -// +// // Return Value: // float - elapsed seconds // // Errors: // - -// +// // Detailed description: // f__tic counts clock tics since program start. f__toc counts seconds // since clock() readout in t till current time -// +// /////////////////////////////////////////////////////////////////////////////// -FLOAT f__toc(const INTEGER& t) -{ + FLOAT f__toc(const INTEGER& t) + { clock_t tt = (clock_t)t.get_long_long_val(); return FLOAT((double)(clock()-tt)/CLOCKS_PER_SEC); -} - + } + ////////////////////////////////////////////////////////////////////////////// // Function: f__timeDiff -// +// // Purpose: // Difference between two time // // Parameters: // t_start - *in* *integer* - start time // t_stop - *in* *integer* - stop time -// +// // Return Value: // integer - t_stop-t_start // // Errors: -// - -// +// - +// // Detailed description: // - -// +// /////////////////////////////////////////////////////////////////////////////// -INTEGER f__timeDiff(const INTEGER& t_stop, const INTEGER& t_start) -{ + INTEGER f__timeDiff(const INTEGER& t_stop, const INTEGER& t_start) + { if(!t_stop.is_bound()) { - TTCN_error("Stop time is unbound in call to function TimeDiff"); + TTCN_error("Stop time is unbound in call to function TimeDiff"); } if(!t_start.is_bound()) { - TTCN_error("Start time is unbound in call to function TimeDiff"); + TTCN_error("Start time is unbound in call to function TimeDiff"); } return t_stop-t_start; -} + } } // end of Namespace diff --git a/src/TCCDateTime_Functions.ttcn b/src/TCCDateTime_Functions.ttcn index 2be3f65..9343310 100644 --- a/src/TCCDateTime_Functions.ttcn +++ b/src/TCCDateTime_Functions.ttcn @@ -10,20 +10,20 @@ // // File: TCCDateTime_Functions.ttcn // Description: TCC Useful Functions: DateTime Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // Module: TCCDateTime_Functions -// +// // Purpose: // This module supports date and time handling -// +// // Module Parameters: -// - -// +// - +// // Module depends on: // - // @@ -32,85 +32,150 @@ module TCCDateTime_Functions { /////////////////////////////////////////////////////////////////////////////// // Function: f_time -// +// // Purpose: // Current calendar time of the system in seconds // // Parameters: // - -// +// // Return Value: // integer - time value // // Errors: -// - -// +// - +// // Detailed description: // - -// +// /////////////////////////////////////////////////////////////////////////////// external function f_time() return integer; +/////////////////////////////////////////////////////////////////////////////// +// Function: f_time_ms +// +// Purpose: +// Current calendar time of the system in milliseconds +// +// Parameters: +// - +// +// Return Value: +// integer - time value +// +// Errors: +// - +// +// Detailed description: +// - +// +/////////////////////////////////////////////////////////////////////////////// +external function f_time_ms() return integer; + /////////////////////////////////////////////////////////////////////////////// // Function: f_ctime -// +// // Purpose: // Convert a time value in seconds to human readable string // The time represented as local time // // Parameters: // pl_sec - *in* *integer* - time value -// +// // Return Value: -// integer - converted time value +// charstring - formatted time in string format // // Errors: -// - -// +// - +// // Detailed description: // - -// -/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// external function f_ctime(integer pl_sec) return charstring; +/////////////////////////////////////////////////////////////////////////////// +// Function: f_ctime_ms +// +// Purpose: +// Convert a time value in milliseconds to human readable string +// The time represented as local time +// +// Parameters: +// pl_msec - *in* *integer* - time value +// +// Return Value: +// charstring - formatted time in string format +// +// Errors: +// - +// +// Detailed description: +// - +// +/////////////////////////////////////////////////////////////////////////////// +external function f_ctime_ms(integer pl_msec) return charstring; + /////////////////////////////////////////////////////////////////////////////// // Function: f_ctime_UTC -// +// // Purpose: // Convert a time value in seconds to human readable string // The time represented as UTC // // Parameters: // pl_sec - *in* *integer* - time value -// +// // Return Value: -// integer - converted time value +// charstring - formatted time in string format // // Errors: -// - -// +// - +// // Detailed description: // - -// -/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// external function f_ctime_UTC(integer pl_sec) return charstring; +/////////////////////////////////////////////////////////////////////////////// +// Function: f_ctime_ms_UTC +// +// Purpose: +// Convert a time value in milliseconds to human readable string +// The time represented as UTC +// +// Parameters: +// pl_msec - *in* *integer* - time value +// +// Return Value: +// charstring - formatted time in string format +// +// Errors: +// - +// +// Detailed description: +// - +// +/////////////////////////////////////////////////////////////////////////////// +external function f_ctime_ms_UTC(integer pl_msec) return charstring; + /////////////////////////////////////////////////////////////////////////////// // Function: f_getTimeFormatted -// +// // Purpose: // Return the current calendar time in a formatted way // // Parameters: // pl_sec - *in* *integer* - time value in seconds // pl_format - *in* *charstring* - format string -// +// // Return Value: // charstring - formatted time in string format // // Errors: -// - -// +// - +// // Detailed description: // *Specifier / Replaced by / Example* // @@ -163,14 +228,14 @@ external function f_ctime_UTC(integer pl_sec) return charstring; // ---------------------------------------------------------------------------------------------------------- // // * The specifiers whose description is marked with an asterisk (*) are locale-dependent. -// +// /////////////////////////////////////////////////////////////////////////////// -external function f_getTimeFormatted(integer pl_sec, charstring pl_format) +external function f_getTimeFormatted(integer pl_sec, charstring pl_format) return charstring; /////////////////////////////////////////////////////////////////////////////// // Function: f_time2sec -// +// // Purpose: // function to convert a formated time value to seconds // The time represented as local time @@ -182,29 +247,29 @@ return charstring; // pl_hour - *in* *integer* - day (e.g. 12) // pl_min - *in* *integer* - day (e.g. 50) // pl_sec - *in* *integer* - day (e.g. 7) -// +// // Return Value: // integer - time in seconds // // Errors: -// - -// +// - +// // Detailed description: // time in seconds since January 1, 1900 -// +// /////////////////////////////////////////////////////////////////////////////// external function f_time2sec( - integer pl_year, - integer pl_mon, - integer pl_day, + integer pl_year, + integer pl_mon, + integer pl_day, integer pl_hour, integer pl_min, - integer pl_sec) + integer pl_sec) return integer; /////////////////////////////////////////////////////////////////////////////// // Function: f_time2sec_UTC -// +// // Purpose: // function to convert a formated time value to seconds // The time represented as UTC @@ -216,78 +281,98 @@ return integer; // pl_hour - *in* *integer* - day (e.g. 12) // pl_min - *in* *integer* - day (e.g. 50) // pl_sec - *in* *integer* - day (e.g. 7) -// +// // Return Value: // integer - time in seconds // // Errors: -// - -// +// - +// // Detailed description: // time in seconds since January 1, 1900 -// +// /////////////////////////////////////////////////////////////////////////////// external function f_time2sec_UTC( - integer pl_year, - integer pl_mon, - integer pl_day, + integer pl_year, + integer pl_mon, + integer pl_day, integer pl_hour, integer pl_min, - integer pl_sec) + integer pl_sec) return integer; /////////////////////////////////////////////////////////////////////////////// // Function: f_getCurrentDateWithOffset -// +// // Purpose: // Generate a date from the actual date and time plus the parameter -// in seconds e.g. getSdate(30) will return a charstring containing +// in seconds e.g. getSdate(30) will return a charstring containing // the date and time of 30 seconds later // // Parameters: // pl_sec - *in* *integer* - offset time value -// +// // Return Value: // charstring - formatted time in string format // // Errors: -// - -// +// - +// // Detailed description: // - -// +// /////////////////////////////////////////////////////////////////////////////// external function f_getCurrentDateWithOffset(integer pl_sec) return charstring; - + /////////////////////////////////////////////////////////////////////////////// // Function: f_getCurrentGMTDate -// +// // Purpose: -// Return the current GMT date in format RFC 1123-Date -// ex :Sat, 13 Nov 2010 23:30:02 GMT +// Return the current GMT date in format RFC 1123-Date +// ex :Mon Nov 20 11:22:08 2017 // // Parameters: // - -// +// // Return Value: // charstring - formatted time in string format // // Errors: -// - -// +// - +// // Detailed description: // - -// -/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// external function f_getCurrentGMTDate() return charstring; -//external function f_getCurrentTimeValue() return TimeValue; +/////////////////////////////////////////////////////////////////////////////// +// Function: f_getCurrentGMTDate_ms +// +// Purpose: +// Return the current GMT date in format Www Mmm dd hh:mm:ss.SSS yyyy +// ex :Mon Nov 20 11:22:08.693 2017 +// +// Parameters: +// - +// +// Return Value: +// charstring - formatted time in string format +// +// Errors: +// - +// +// Detailed description: +// - +// +/////////////////////////////////////////////////////////////////////////////// +external function f_getCurrentGMTDate_ms() return charstring; ////////////////////////////////////////////////////////////////////////////// // Function: f_tic -// +// // Purpose: -// Return the number of clock ticks used by the application since +// Return the number of clock ticks used by the application since // the program was launched // // OR @@ -300,63 +385,63 @@ external function f_getCurrentGMTDate() return charstring; // // Parameters: // - -// +// // Return Value: // integer - tics since program start // // Errors: // - -// +// // Detailed description: // - -// -/////////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////////// external function f_tic() return integer; ////////////////////////////////////////////////////////////////////////////// // Function: f_toc -// +// // Purpose: -// Elapsed seconds since time t (only when f_tic() returns the number of +// Elapsed seconds since time t (only when f_tic() returns the number of // clock ticks elapsed since the program was launched) // // Warning! This function depends on used library version. Be careful! // // Parameters: // t - *in* *integer* - time value -// +// // Return Value: // float - elapsed seconds // // Errors: // - -// +// // Detailed description: // f_tic counts clock tics since program start. f_toc counts seconds // since clock() readout in t till current time -// +// /////////////////////////////////////////////////////////////////////////////// external function f_toc(integer t) return float; - + ////////////////////////////////////////////////////////////////////////////// // Function: f_timeDiff -// +// // Purpose: // Difference between two time // // Parameters: // t_start - *in* *integer* - start time // t_stop - *in* *integer* - stop time -// +// // Return Value: // integer - t_stop-t_start // // Errors: // - -// +// // Detailed description: // - -// +// /////////////////////////////////////////////////////////////////////////////// external function f_timeDiff(integer t_stop, integer t_start) return integer; diff --git a/src/TCCEncoding.cc b/src/TCCEncoding.cc index 00f4d07..182c95f 100644 --- a/src/TCCEncoding.cc +++ b/src/TCCEncoding.cc @@ -10,7 +10,7 @@ // // File: TCCEncoding.cc // Description: TCC Useful Functions: Message Encoding Functions. -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCEncoding_Functions.ttcn b/src/TCCEncoding_Functions.ttcn index b9f721a..6c00fbb 100644 --- a/src/TCCEncoding_Functions.ttcn +++ b/src/TCCEncoding_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCEncoding_Functions.ttcn // Description: TCC Useful Functions: Message Encoding Functions. -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// @@ -730,4 +730,4 @@ public function f_enc_TBCD_hex(in hexstring pl_hex) return octetstring return vl_oct; } -} with {extension "version R30A"} +} with {extension "version R35B"} diff --git a/src/TCCEnv.cc b/src/TCCEnv.cc index de7bb1e..40757fd 100644 --- a/src/TCCEnv.cc +++ b/src/TCCEnv.cc @@ -10,7 +10,7 @@ // // File: TCCEnv.cc // Description: TCC Useful Functions: Environment Handling Functions. -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCEnv_Functions.ttcn b/src/TCCEnv_Functions.ttcn index 57d05c8..5723950 100644 --- a/src/TCCEnv_Functions.ttcn +++ b/src/TCCEnv_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCEnv_Functions.ttcn // Description: TCC Useful Functions: Environment Handling Functions. -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCFileIO.cc b/src/TCCFileIO.cc index 91be44a..c40e650 100644 --- a/src/TCCFileIO.cc +++ b/src/TCCFileIO.cc @@ -10,7 +10,7 @@ // // File: TCCFileIO.cc // Description: TCC Useful Functions: FileIO Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// @@ -1391,4 +1391,48 @@ BOOLEAN f__FIO__fileList(const CHARSTRING& dirname, FileList& filelist) { } } +FIO__FileInfo f__FIO__getFileInfo(const CHARSTRING& name) { + FIO__FileType type = FIO__FileType::Unknown; + FIO__FileInfo result (type, OMIT_VALUE, OMIT_VALUE, OMIT_VALUE, OMIT_VALUE, OMIT_VALUE, OMIT_VALUE, OMIT_VALUE, OMIT_VALUE, 0, 0, 0); + struct stat sb; + + if (!f__FIO__fileOrDirExists(name)) { + type = FIO__FileType::NotExists; + } else { + if (stat(name, &sb) == -1) { + type = FIO__FileType::ErrorReadingFile; + } + + switch (sb.st_mode & S_IFMT) { + case S_IFBLK: type = FIO__FileType::BlockDevice; break; + case S_IFCHR: type = FIO__FileType::CharacterDevice; break; + case S_IFDIR: type = FIO__FileType::Directory; break; + case S_IFIFO: type = FIO__FileType::FIFO__Pipe; break; + case S_IFLNK: type = FIO__FileType::Symlink; break; + case S_IFREG: type = FIO__FileType::RegularFile; break; + case S_IFSOCK: type = FIO__FileType::Socket; break; + default: type = FIO__FileType::Unknown; break; + } + } + + result.fileType() = type; + + if (type != FIO__FileType::NotExists && type != FIO__FileType::ErrorReadingFile) { + result.nodeNumber() = sb.st_ino; + result.mode() = sb.st_mode; + result.linkCount() = sb.st_nlink; + result.ownership() = sb.st_uid; + result.groupId() = sb.st_gid; + result.blockSize() = sb.st_blksize; + result.fileSize() = sb.st_size; + result.blocksAllocated() = sb.st_blocks; + + result.lastStatusChange().set_long_long_val(sb.st_ctime); + result.lastFileAccess().set_long_long_val(sb.st_atime); + result.lastFileModification().set_long_long_val(sb.st_mtime); + } + + return result; +} + } diff --git a/src/TCCFileIO_Functions.ttcn b/src/TCCFileIO_Functions.ttcn index 94b5bc6..ffe4ef6 100644 --- a/src/TCCFileIO_Functions.ttcn +++ b/src/TCCFileIO_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCFileIO_Functions.ttcn // Description: TCC Useful Functions: FileIO Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// @@ -609,4 +609,55 @@ type record of charstring FileList; external function f_FIO_fileList (in charstring p_name, inout FileList p_files) return boolean; +type enumerated FIO_FileType { + BlockDevice, + CharacterDevice, + Directory, + FIFO_Pipe, + Symlink, + RegularFile, + Socket, + Unknown, + NotExists, + ErrorReadingFile +}; + +type record FIO_FileInfo { + FIO_FileType fileType, //The type of the file + integer nodeNumber optional, //inode number + integer mode optional, //protection + integer linkCount optional, //number of hard links + integer ownership optional, //user ID of owner + integer groupId optional, //group ID of owner + integer blockSize optional, //blocksize for file system I/O + integer fileSize optional, //total size, in bytes + integer blocksAllocated optional, //number of 512B blocks allocated + integer lastStatusChange, //time of last access + integer lastFileAccess, //time of last modification + integer lastFileModification //time of last status change } + +/////////////////////////////////////////////////////////////////////////////// +// Function: f_FIO_getFileType +// +// Purpose: +// Returns the file type of the given file +// +// Parameters: +// p_name - *in* *charstring* - name of the file or directory to check +// +// Return Value: +// - FIO_FileInfo: Contains the file type, and information about it. +// +// Errors: +// - If the file is not found, FIO_FileInfo.fileType will be NotExists +// - If the file can not be accessed, FIO_FileInfo.fileType will be ErrorReadingFile +// - If the file type is unknown, FIO_FileInfo.fileType will be Unknown +// +// Detailed description: +// Returns information about a given file +// +/////////////////////////////////////////////////////////////////////////////// +external function f_FIO_getFileInfo (in charstring p_name) return FIO_FileInfo; + +} \ No newline at end of file diff --git a/src/TCCFileSystem.cc b/src/TCCFileSystem.cc index eae9578..9c56ca9 100644 --- a/src/TCCFileSystem.cc +++ b/src/TCCFileSystem.cc @@ -10,7 +10,7 @@ // // File: TCCFileSystem.cc // Description: TCC Useful Functions: FileSystem Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCFileSystem_Functions.ttcn b/src/TCCFileSystem_Functions.ttcn index 5606ccf..32d4d82 100644 --- a/src/TCCFileSystem_Functions.ttcn +++ b/src/TCCFileSystem_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCC_FileSystem_Functions.ttcn // Description: TCC Useful Functions: FileSystem Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCIPsec.cc b/src/TCCIPsec.cc index 06dcc78..5dddc62 100644 --- a/src/TCCIPsec.cc +++ b/src/TCCIPsec.cc @@ -10,7 +10,7 @@ // // File: TCCIPsec.cc // Description: TCC Useful Functions: IPsec Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCIPsec_Definitions.ttcn b/src/TCCIPsec_Definitions.ttcn index 49e2d4d..5751e08 100644 --- a/src/TCCIPsec_Definitions.ttcn +++ b/src/TCCIPsec_Definitions.ttcn @@ -10,7 +10,7 @@ // // File: TCCIPsec_Definitions.ttcn // Description: TCC Useful Functions: Definitions for IPsec functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCIPsec_Functions.ttcn b/src/TCCIPsec_Functions.ttcn index f831e11..34a44ad 100644 --- a/src/TCCIPsec_Functions.ttcn +++ b/src/TCCIPsec_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCIPsec_Functions.ttcn // Description: TCC Useful Functions: IPsec Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCIPsec_XFRM.cc b/src/TCCIPsec_XFRM.cc index 3c8ad7f..633709e 100644 --- a/src/TCCIPsec_XFRM.cc +++ b/src/TCCIPsec_XFRM.cc @@ -10,7 +10,7 @@ // // File: TCCIPsec_XFRM.cc // Description: TCC Useful Functions: IPsec XFRM Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCIPsec_XFRM.hh b/src/TCCIPsec_XFRM.hh index 0e8fbf8..d27e02a 100644 --- a/src/TCCIPsec_XFRM.hh +++ b/src/TCCIPsec_XFRM.hh @@ -10,7 +10,7 @@ // // File: TCCIPsec_XFRM.hh // Description: TCC Useful Functions: IPsec XFRM Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCIPsec_XFRM_Definitions.ttcn b/src/TCCIPsec_XFRM_Definitions.ttcn index 67bcb89..5791371 100644 --- a/src/TCCIPsec_XFRM_Definitions.ttcn +++ b/src/TCCIPsec_XFRM_Definitions.ttcn @@ -10,7 +10,7 @@ // // File: TCCIPsec_XFRM_Definitions.ttcn // Description: TCC Useful Functions: IPsec XFRM Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCIPsec_XFRM_SA.cc b/src/TCCIPsec_XFRM_SA.cc index 0f4a3dc..d993b57 100644 --- a/src/TCCIPsec_XFRM_SA.cc +++ b/src/TCCIPsec_XFRM_SA.cc @@ -10,7 +10,7 @@ // // File: TCCIPsec_XFRM_SA.cc // Description: TCC Useful Functions: IPsec XFRM Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCIPsec_XFRM_SP.cc b/src/TCCIPsec_XFRM_SP.cc index b5597d2..23f2581 100644 --- a/src/TCCIPsec_XFRM_SP.cc +++ b/src/TCCIPsec_XFRM_SP.cc @@ -10,7 +10,7 @@ // // File: TCCIPsec_XFRM_SP.cc // Description: TCC Useful Functions: IPsec XFRM Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// @@ -91,7 +91,7 @@ void f_add_template( if(ipv4)xTmpl->family = AF_INET; else xTmpl->family = AF_INET6; - + if(tmpl.reqid().ispresent())xTmpl->reqid = tmpl.reqid()().get_long_long_val(); else xTmpl->reqid = 0; //0:require else:unique @@ -103,10 +103,10 @@ void f_add_template( xTmpl->optional = 0; switch(tmpl.level()){ - case Level::use:{xTmpl->optional = 1;break;} + case Level::use:{xTmpl->optional = 1;break;} default: {xTmpl->optional = 0;} //Level -- 0:required 1:use }; - + xTmpl->aalgos = (~(__u32)0); xTmpl->ealgos = (~(__u32)0); xTmpl->calgos = (~(__u32)0); @@ -125,7 +125,7 @@ void f_set_SP_add_info( pol = (struct xfrm_userpolicy_info*)NLMSG_DATA(memo); memset(pol,0,sizeof(struct xfrm_userpolicy_info)); - + int addr_family = f_set_IP_address(pol_info.dst().ip__address(), &pol->sel.daddr); if(addr_family >= 0){ pol->sel.family = addr_family; @@ -147,7 +147,7 @@ void f_set_SP_add_info( pol->sel.prefixlen_s = 128; }; }; //else default value will be set: 0.0.0.0 - + if(pol_info.dst().address__prefix().ispresent()){pol->sel.prefixlen_d = pol_info.dst().address__prefix()();}; if(pol_info.src().address__prefix().ispresent()){pol->sel.prefixlen_s = pol_info.src().address__prefix()();}; if(pol_info.dst().port__number().ispresent()){ @@ -158,10 +158,10 @@ void f_set_SP_add_info( pol->sel.sport = htons(pol_info.src().port__number()()); pol->sel.sport_mask = 0xffff; }; - + pol->sel.ifindex = 0; pol->sel.user = 0; - + if(pol_info.protocol() != TransportProtocol::ANY){ pol->sel.proto = pol_info.protocol(); } else { @@ -195,20 +195,20 @@ void f_set_SP_add_info( if(pol_info.info().ispresent()){ f_process_additionalInfo(pol, pol_info.info()()); }; - + Template__List list = pol_info.tmpl(); - + ahdr = (struct nlattr*)((char*)pol+NLA_ALIGN(sizeof(*pol))); ahdr->nla_len = NLA_HDRLEN+sizeof(*tmpl)*numberOfTmpls; ahdr->nla_type = XFRMA_TMPL; - + for(int i = 0;i<numberOfTmpls;i++){ TTCN_Logger::log( TTCN_DEBUG,"###### %d. template:",i+1); if(i>0){ tmpl = (struct xfrm_user_tmpl*)((char*)tmpl+NLA_ALIGN(sizeof(*tmpl))); } else { tmpl = (struct xfrm_user_tmpl*)((char*)ahdr+NLA_HDRLEN); - }; + }; f_add_template(tmpl,list[i],pol->share,ipv4); }; @@ -235,7 +235,7 @@ void f_set_SP_delete_info( }; }; //else default value will be set: 0.0.0.0 - + temp = inet_pton(AF_INET,pol_info.src().ip__address(),(void*)&pol->sel.saddr.a4); if(temp > 0){ pol->sel.family = AF_INET; @@ -253,12 +253,17 @@ void f_set_SP_delete_info( if(pol_info.dst().address__prefix().ispresent()){pol->sel.prefixlen_d = pol_info.dst().address__prefix()();}; if(pol_info.src().address__prefix().ispresent()){pol->sel.prefixlen_s = pol_info.src().address__prefix()();}; - if(pol_info.dst().port__number().ispresent())pol->sel.dport = htons(pol_info.dst().port__number()()); - if(pol_info.src().port__number().ispresent())pol->sel.sport = htons(pol_info.src().port__number()()); - pol->sel.dport_mask = pol->sel.sport_mask = 0xffff; - - pol->sel.proto = pol_info.protocol(); + if(pol_info.dst().port__number().ispresent()){ + pol->sel.dport = htons(pol_info.dst().port__number()()); + pol->sel.dport_mask = 0xffff; + }; + + if(pol_info.src().port__number().ispresent()){ + pol->sel.sport = htons(pol_info.src().port__number()()); + pol->sel.sport_mask = 0xffff; + }; + pol->sel.proto = pol_info.protocol(); pol->dir = pol_info.dir(); } diff --git a/src/TCCInterface.cc b/src/TCCInterface.cc index 5d3d915..ebcf52e 100644 --- a/src/TCCInterface.cc +++ b/src/TCCInterface.cc @@ -10,7 +10,7 @@ // // File: TCCInterface.cc // Description: TCC Useful Functions: Interface Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// @@ -1066,7 +1066,7 @@ IPAddresses f__getIpAddresses(const CHARSTRING& hostname){ CharstringList ipv6list(NULL_VALUE); if ((status = getaddrinfo((const char*)hostname, NULL, &hints, &res)) != 0) { - TTCN_warning("f_getIpAddresses: getaddrinfo: %s for \"%s\"\n", gai_strerror(status), (const char*)hostname); + TTCN_Logger::log(TTCN_DEBUG, "f_getIpAddresses: getaddrinfo: %s for \"%s\"\n", gai_strerror(status), (const char*)hostname); return IPAddresses(ipv4list, ipv6list); } diff --git a/src/TCCInterface_Functions.ttcn b/src/TCCInterface_Functions.ttcn index 1d3c0a3..6c75e6c 100644 --- a/src/TCCInterface_Functions.ttcn +++ b/src/TCCInterface_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCInterface_Functions.ttcn // Description: TCC Useful Functions: Interface Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCInterface_ip.h b/src/TCCInterface_ip.h index 5eaee6d..0f071ab 100644 --- a/src/TCCInterface_ip.h +++ b/src/TCCInterface_ip.h @@ -10,7 +10,7 @@ // // File: TCCInterface_ip.h // Description: TCC Useful Functions: Interface Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCMaths.cc b/src/TCCMaths.cc index 28afd8c..2cd8142 100644 --- a/src/TCCMaths.cc +++ b/src/TCCMaths.cc @@ -10,7 +10,7 @@ // // File: TCCMaths.cc // Description: TCC Useful Functions: Maths Functions. -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCMaths_Functions.ttcn b/src/TCCMaths_Functions.ttcn index ba9fa56..55ace3b 100644 --- a/src/TCCMaths_Functions.ttcn +++ b/src/TCCMaths_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCMaths_Functions.ttcn // Description: TCC Useful Functions: Math Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCMaths_GenericTypes.ttcn b/src/TCCMaths_GenericTypes.ttcn index 3d78306..106aa0e 100644 --- a/src/TCCMaths_GenericTypes.ttcn +++ b/src/TCCMaths_GenericTypes.ttcn @@ -10,7 +10,7 @@ // // File: TCCMaths_GenericTypes.ttcn // Description: TCC Useful Functions: Generic Types For Maths -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCMessageHandling.cc b/src/TCCMessageHandling.cc index 07893e7..43a802b 100644 --- a/src/TCCMessageHandling.cc +++ b/src/TCCMessageHandling.cc @@ -9,7 +9,7 @@ /////////////////////////////////////////////////////////////////////////////// // // File: TCCMessageHandling.cc -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCMessageHandling_Functions.ttcn b/src/TCCMessageHandling_Functions.ttcn index 6d2b3f9..aadfb44 100644 --- a/src/TCCMessageHandling_Functions.ttcn +++ b/src/TCCMessageHandling_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCMessageHandling_Functions.ttcn // Description: TCC Useful Functions: MessageHandling Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCOpenSecurity.cc b/src/TCCOpenSecurity.cc index 527faee..6044607 100644 --- a/src/TCCOpenSecurity.cc +++ b/src/TCCOpenSecurity.cc @@ -10,7 +10,7 @@ // // File: TCCOpenSecurity.cc // Description: TCC Useful Functions: Security Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// @@ -25,9 +25,259 @@ #include <openssl/sha.h> #include <openssl/rand.h> +#if OPENSSL_VERSION_NUMBER >= 0x10100000L +#include <openssl/modes.h> +#endif + namespace TCCOpenSecurity__Functions { +void tohex(unsigned char * Bin,unsigned char *Hex) +{ + unsigned short i; + unsigned char j; + + for (i = 0; i < MD5_DIGEST_LENGTH; i++) { + j = (Bin[i] >> 4) & 0xf; + if (j <= 9) + Hex[i*2] = (j + '0'); + else + Hex[i*2] = (j + 'a' - 10); + j = Bin[i] & 0xf; + if (j <= 9) + Hex[i*2+1] = (j + '0'); + else + Hex[i*2+1] = (j + 'a' - 10); + }; + Hex[MD5_DIGEST_LENGTH*2] = '\0'; +} + +void CalculateHA1( + const CHARSTRING& alg, + const CHARSTRING& username, + const CHARSTRING& realm, + const CHARSTRING& password, + const CHARSTRING& nonce, + const CHARSTRING& cnonce, + CHARSTRING& sessionkey + ) +{ + MD5_CTX Md5Ctx; + unsigned char ha1[MD5_DIGEST_LENGTH]; + unsigned char hexha1[MD5_DIGEST_LENGTH*2+1]; + + MD5_Init(&Md5Ctx); + MD5_Update(&Md5Ctx, (const char*)username, username.lengthof()); + MD5_Update(&Md5Ctx, ":", 1); + MD5_Update(&Md5Ctx, (const char*)realm, realm.lengthof()); + MD5_Update(&Md5Ctx, ":", 1); + MD5_Update(&Md5Ctx, (const char*)password,password.lengthof() ); + MD5_Final(ha1, &Md5Ctx); + if (alg == "md5-sess" ) { + MD5_Init(&Md5Ctx); + MD5_Update(&Md5Ctx, ha1, MD5_DIGEST_LENGTH); + MD5_Update(&Md5Ctx, ":", 1); + MD5_Update(&Md5Ctx, nonce, nonce.lengthof()); + MD5_Update(&Md5Ctx, ":", 1); + MD5_Update(&Md5Ctx, cnonce, cnonce.lengthof()); + MD5_Final(ha1, &Md5Ctx); + }; + tohex(ha1,hexha1); + sessionkey=CHARSTRING(MD5_DIGEST_LENGTH*2,(const char*)hexha1); +} + +void CalculateDigestResponse( + const CHARSTRING& ha1, /* H(A1) */ + const CHARSTRING& nonce, /* nonce from server */ + const CHARSTRING& nonceCount, /* 8 hex digits */ + const CHARSTRING& cnonce, /* client nonce */ + const CHARSTRING& qop, /* qop-value: "", "auth", "auth-int" */ + const CHARSTRING& method, /* method from the request */ + const CHARSTRING& digestUri, /* requested URL */ + const CHARSTRING& hentity, /* H(entity body) if qop="auth-int" */ + CHARSTRING& response /* request-digest or response-digest */ + ) +{ + MD5_CTX Md5Ctx; + unsigned char ha2[MD5_DIGEST_LENGTH]; + unsigned char hexha2[MD5_DIGEST_LENGTH*2+1]; + unsigned char resp[MD5_DIGEST_LENGTH]; + unsigned char hexresp[MD5_DIGEST_LENGTH*2+1]; + + + // calculate H(A2) + MD5_Init(&Md5Ctx); + MD5_Update(&Md5Ctx, (const char*)method, method.lengthof() ); + MD5_Update(&Md5Ctx, ":", 1); + MD5_Update(&Md5Ctx, (const char*)digestUri, digestUri.lengthof()); + if (qop == "auth-int") { + MD5_Update(&Md5Ctx, ":", 1); + MD5_Update(&Md5Ctx, (const char*)hentity, hentity.lengthof()); + }; + MD5_Final(ha2, &Md5Ctx); + + // calculate response + MD5_Init(&Md5Ctx); + MD5_Update(&Md5Ctx, (const char*)ha1, ha1.lengthof()); + MD5_Update(&Md5Ctx, ":", 1); + MD5_Update(&Md5Ctx, (const char*)nonce, nonce.lengthof()); + MD5_Update(&Md5Ctx, ":", 1); + if (qop.lengthof()>0) { + MD5_Update(&Md5Ctx, (const char*)nonceCount, nonceCount.lengthof()); + MD5_Update(&Md5Ctx, ":", 1); + MD5_Update(&Md5Ctx, (const char*)cnonce, cnonce.lengthof()); + MD5_Update(&Md5Ctx, ":", 1); + MD5_Update(&Md5Ctx, (const char*)qop, qop.lengthof() ); + MD5_Update(&Md5Ctx, ":", 1); + }; + tohex(ha2,hexha2); + + MD5_Update(&Md5Ctx, (const char*)hexha2, MD5_DIGEST_LENGTH*2); + MD5_Final(resp, &Md5Ctx); + tohex(resp,hexresp); + response=CHARSTRING(MD5_DIGEST_LENGTH*2,(const char*)hexresp); +} + +/////////////////////////////////////////////////////////////////////////////// +// Function: f__calculateDigestResponse +// +// Purpose: +// Calculate digest response +// +// Parameters: +// nonce - *in* *charstring* - a server-specified data string which may +// ` be uniquely generated each time a 401 +// response is made +// cnonce - *in* *charstring* - client nonce +// user - *in* *charstring* - user name +// realm - *in* *charstring* - user realm +// passwd - *in* *charstring* - user password +// alg - *in* *charstring* - a string indicating a pair of algorithms +// used to produce the digest and a checksum +// nonceCount - *in* *charstring* - nonce count (8 hex digits) +// method - *in* *charstring* - method (from the request) +// qop - *in* *charstring* - qop-value: "", "auth", "auth-int" +// URI - *in* *charstring* - digest URI +// HEntity - *in* *charstring* - H(entity body) if qop="auth-int" +// +// Return Value: +// charstring - digest response +// +// Errors: +// - +// +// Detailed description: +// Support HTTP authentication (detailed description in RFC 2617) using +// uses one-way hash (md5) specified in RFC 1321. +// When a request arrives to server for an access-protected object, it +// responds an "401 Unauthorized" status code and a WWW-Authenticate +// header (encapsulate nonce and other necessary parameters). The client +// is expected to retry the request, passing an Authorization header with +// response field calculated with f_calculateDigestResponse(). +// +// Overview: http://en.wikipedia.org/wiki/Digest_access_authentication +// +/////////////////////////////////////////////////////////////////////////////// +CHARSTRING f__calculateDigestResponse( + const CHARSTRING& nonce, + const CHARSTRING& cnonce, + const CHARSTRING& user, + const CHARSTRING& realm, + const CHARSTRING& passwd, + const CHARSTRING& alg, + const CHARSTRING& nonceCount, + const CHARSTRING& method, + const CHARSTRING& qop, + const CHARSTRING& URI, + const CHARSTRING& HEntity) +{ + CHARSTRING ha1; + CHARSTRING Response; + + CalculateHA1(alg,user,realm,passwd,nonce,cnonce,ha1); + + CalculateDigestResponse(ha1,nonce,nonceCount,cnonce,qop,method,URI,HEntity,Response); + + return Response; +} + +/////////////////////////////////////////////////////////////////////////////// +// Function: f__calculateDigestHA1 +// +// Purpose: +// Calculate digest H(A1) hash +// +// Parameters: +// nonce - *in* *charstring* - a server-specified data string which may +// ` be uniquely generated each time a 401 +// response is made +// cnonce - *in* *charstring* - client nonce +// user - *in* *charstring* - user name +// realm - *in* *charstring* - user realm +// passwd - *in* *charstring* - user password +// alg - *in* *charstring* - a string indicating a pair of algorithms +// used to produce the digest and a checksum +// +// Return Value: +// charstring - digest response +// +// Errors: +// - +// +// Detailed description: +// Overview: http://en.wikipedia.org/wiki/Digest_access_authentication +// +/////////////////////////////////////////////////////////////////////////////// +CHARSTRING f__calculateDigestHA1( + const CHARSTRING& nonce, + const CHARSTRING& cnonce, + const CHARSTRING& user, + const CHARSTRING& realm, + const CHARSTRING& passwd, + const CHARSTRING& alg) +{ + CHARSTRING ha1; + + CalculateHA1(alg,user,realm,passwd,nonce,cnonce,ha1); + + return ha1; +} + +/////////////////////////////////////////////////////////////////////////////// +// Function: f__calculateMD5 +// +// Purpose: +// Compute MD5 hash value +// +// Parameters: +// pszHashInput - *in* *charstring* - input value to compute hash of +// +// Return Value: +// hashValue - *out* *charstring* - hexa hash value of input +// +// Errors: +// - +// +// Detailed description: +// - +// +/////////////////////////////////////////////////////////////////////////////// +CHARSTRING f__calculateMD5(const CHARSTRING& pszHashInput) +{ + unsigned char md[MD5_DIGEST_LENGTH]; + MD5((const unsigned char*)(const char *)pszHashInput,pszHashInput.lengthof(),md); + return oct2str(OCTETSTRING(MD5_DIGEST_LENGTH,md)); +} + +OCTETSTRING f__calculateMD5__oct(const OCTETSTRING& pszHashInput) +{ + unsigned char md[MD5_DIGEST_LENGTH]; + MD5((const unsigned char*)pszHashInput,pszHashInput.lengthof(),md); + + + return OCTETSTRING(MD5_DIGEST_LENGTH,md); +} + /////////////////////////////////////////////////////////////////////////////// // Function: f__calculateRAND__oct // @@ -447,33 +697,32 @@ OCTETSTRING ef__3DES__ECB__Encrypt (const OCTETSTRING& pl__data, const OCTETSTRI unsigned char* outbuf=NULL; const unsigned char* data= (const unsigned char*)pl__data; - EVP_CIPHER_CTX ctx; - EVP_CIPHER_CTX_init(&ctx); + EVP_CIPHER_CTX *ctx=EVP_CIPHER_CTX_new(); - if(EVP_EncryptInit_ex(&ctx, EVP_des_ede3_ecb(), NULL, pl__key, NULL)) + if(EVP_EncryptInit_ex(ctx, EVP_des_ede3_ecb(), NULL, pl__key, NULL)) { - int block_size = EVP_CIPHER_CTX_block_size(&ctx); + int block_size = EVP_CIPHER_CTX_block_size(ctx); if(!pl__use__padding) { // the padding is used by default - EVP_CIPHER_CTX_set_padding(&ctx,0); + EVP_CIPHER_CTX_set_padding(ctx,0); if(pl__data.lengthof()%block_size){ TTCN_warning("ef_3DES_ECB_Encrypt: The length of the pl_data should be n * %d (the block size) if padding is not used.", block_size); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } } if((outbuf = (unsigned char*)Malloc(pl__data.lengthof() + block_size)) != NULL) { - if(!EVP_EncryptUpdate(&ctx, outbuf, &outl, data, pl__data.lengthof())){ + if(!EVP_EncryptUpdate(ctx, outbuf, &outl, data, pl__data.lengthof())){ TTCN_warning("ef_3DES_ECB_Encrypt: EVP_EncryptUpdate failed."); Free(outbuf); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } position = outl; - if(!EVP_EncryptFinal_ex(&ctx, &outbuf[position], &outl)){ + if(!EVP_EncryptFinal_ex(ctx, &outbuf[position], &outl)){ TTCN_warning("ef_3DES_ECB_Encrypt: EVP_EncryptFinal_ex failed."); Free(outbuf); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } @@ -482,10 +731,11 @@ OCTETSTRING ef__3DES__ECB__Encrypt (const OCTETSTRING& pl__data, const OCTETSTRI Free(outbuf); } - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); } else { TTCN_warning("ef_3DES_ECB_Encrypt: EVP_EncryptInit_ex failed."); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } @@ -524,34 +774,34 @@ OCTETSTRING ef__3DES__ECB__Decrypt (const OCTETSTRING& pl__data, const OCTETSTRI unsigned char* outbuf=NULL; const unsigned char* data= (const unsigned char*)pl__data; - EVP_CIPHER_CTX ctx; - EVP_CIPHER_CTX_init(&ctx); + EVP_CIPHER_CTX *ctx=EVP_CIPHER_CTX_new(); + EVP_CIPHER_CTX_init(ctx); - if(EVP_DecryptInit_ex(&ctx, EVP_des_ede3_ecb(), NULL, pl__key, NULL)) + if(EVP_DecryptInit_ex(ctx, EVP_des_ede3_ecb(), NULL, pl__key, NULL)) { - int block_size = EVP_CIPHER_CTX_block_size(&ctx); + int block_size = EVP_CIPHER_CTX_block_size(ctx); if(pl__data.lengthof()%block_size){ TTCN_warning("ef_3DES_ECB_Decrypt: The length of the pl_data should be n * %d (the block size)!", block_size); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } if(!pl__use__padding) { // the padding is used by default - EVP_CIPHER_CTX_set_padding(&ctx,0); + EVP_CIPHER_CTX_set_padding(ctx,0); } if((outbuf = (unsigned char*)Malloc(pl__data.lengthof() + block_size)) != NULL) { - if(!EVP_DecryptUpdate(&ctx, outbuf, &outl, data, pl__data.lengthof())){ + if(!EVP_DecryptUpdate(ctx, outbuf, &outl, data, pl__data.lengthof())){ TTCN_warning("ef_3DES_ECB_Decrypt: EVP_DecryptUpdate failed."); Free(outbuf); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } position = outl; - if(!EVP_DecryptFinal_ex(&ctx, &outbuf[position], &outl)){ + if(!EVP_DecryptFinal_ex(ctx, &outbuf[position], &outl)){ TTCN_warning("ef_3DES_ECB_Decrypt: EVP_DecryptFinal_ex failed."); Free(outbuf); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } @@ -560,10 +810,11 @@ OCTETSTRING ef__3DES__ECB__Decrypt (const OCTETSTRING& pl__data, const OCTETSTRI Free(outbuf); } - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); } else { TTCN_warning("ef_3DES_ECB_Decrypt: EVP_DecryptInit_ex failed."); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } @@ -605,35 +856,35 @@ OCTETSTRING ef__3DES__CBC__Encrypt (const OCTETSTRING& pl__data, const OCTETSTRI unsigned char* outbuf=NULL; const unsigned char* data= (const unsigned char*)pl__data; - EVP_CIPHER_CTX ctx; - EVP_CIPHER_CTX_init(&ctx); + EVP_CIPHER_CTX *ctx=EVP_CIPHER_CTX_new(); + EVP_CIPHER_CTX_init(ctx); - if(EVP_EncryptInit_ex(&ctx, EVP_des_ede3_cbc(), NULL, pl__key, pl__iv)) + if(EVP_EncryptInit_ex(ctx, EVP_des_ede3_cbc(), NULL, pl__key, pl__iv)) { - int block_size = EVP_CIPHER_CTX_block_size(&ctx); + int block_size = EVP_CIPHER_CTX_block_size(ctx); if(!pl__use__padding) { // the padding is used by default - EVP_CIPHER_CTX_set_padding(&ctx,0); + EVP_CIPHER_CTX_set_padding(ctx,0); if(pl__data.lengthof()%block_size){ TTCN_warning("ef_3DES_CBC_Encrypt: The length of the pl_data should be n * %d (the block size) if padding is not used.", block_size); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } } if((outbuf = (unsigned char*)Malloc(pl__data.lengthof() + block_size)) != NULL) { - if(!EVP_EncryptUpdate(&ctx, outbuf, &outl, data, pl__data.lengthof())){ + if(!EVP_EncryptUpdate(ctx, outbuf, &outl, data, pl__data.lengthof())){ TTCN_warning("ef_3DES_CBC_Encrypt: EVP_EncryptUpdate failed."); Free(outbuf); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } position = outl; - if(!EVP_EncryptFinal_ex(&ctx, &outbuf[position], &outl)){ + if(!EVP_EncryptFinal_ex(ctx, &outbuf[position], &outl)){ TTCN_warning("ef_3DES_CBC_Encrypt: EVP_EncryptFinal_ex failed."); Free(outbuf); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } @@ -642,10 +893,11 @@ OCTETSTRING ef__3DES__CBC__Encrypt (const OCTETSTRING& pl__data, const OCTETSTRI ret_val=OCTETSTRING(position, outbuf); Free(outbuf); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); } else { TTCN_warning("ef_3DES_CBC_Encrypt: EVP_EncryptInit_ex failed."); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } @@ -685,35 +937,35 @@ OCTETSTRING ef__3DES__CBC__Decrypt (const OCTETSTRING& pl__data, const OCTETSTRI unsigned char* outbuf=NULL; const unsigned char* data= (const unsigned char*)pl__data; - EVP_CIPHER_CTX ctx; - EVP_CIPHER_CTX_init(&ctx); + EVP_CIPHER_CTX *ctx=EVP_CIPHER_CTX_new(); + EVP_CIPHER_CTX_init(ctx); - if(EVP_DecryptInit_ex(&ctx, EVP_des_ede3_cbc(), NULL, pl__key, pl__iv)) + if(EVP_DecryptInit_ex(ctx, EVP_des_ede3_cbc(), NULL, pl__key, pl__iv)) { - int block_size = EVP_CIPHER_CTX_block_size(&ctx); + int block_size = EVP_CIPHER_CTX_block_size(ctx); if(pl__data.lengthof()%block_size){ TTCN_warning("ef__3DES__CBC__Decrypt: The length of the pl_data should be n * %d (the block size)!", block_size); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } if(!pl__use__padding) { // the padding is used by default - EVP_CIPHER_CTX_set_padding(&ctx,0); + EVP_CIPHER_CTX_set_padding(ctx,0); } if((outbuf = (unsigned char*)Malloc(pl__data.lengthof() + block_size)) != NULL) { - if(!EVP_DecryptUpdate(&ctx, outbuf, &outl, data, pl__data.lengthof())){ + if(!EVP_DecryptUpdate(ctx, outbuf, &outl, data, pl__data.lengthof())){ TTCN_warning("ef_3DES_CBC_Decrypt: EVP_DecryptUpdate failed."); Free(outbuf); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } ; position = outl; - if(!EVP_DecryptFinal_ex(&ctx, &outbuf[position], &outl)){ + if(!EVP_DecryptFinal_ex(ctx, &outbuf[position], &outl)){ TTCN_warning("ef_3DES_ECB_Decrypt: EVP_DecryptFinal_ex failed."); Free(outbuf); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } position += outl; @@ -721,10 +973,11 @@ OCTETSTRING ef__3DES__CBC__Decrypt (const OCTETSTRING& pl__data, const OCTETSTRI Free(outbuf); } - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); } else { TTCN_warning("ef_3DES_CBC_Decrypt: EVP_DecryptInit_ex failed."); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } @@ -767,22 +1020,22 @@ OCTETSTRING ef__Calculate__AES__XCBC__128 (const OCTETSTRING& pl__data, const OC unsigned char key3[block_size] = { 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 }; unsigned char e[block_size] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - EVP_CIPHER_CTX ctx; - EVP_CIPHER_CTX_init(&ctx); + EVP_CIPHER_CTX *ctx=EVP_CIPHER_CTX_new(); + EVP_CIPHER_CTX_init(ctx); - EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, pl__key, NULL); - EVP_EncryptUpdate(&ctx, key1, &outl, key1, block_size); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, pl__key, NULL); + EVP_EncryptUpdate(ctx, key1, &outl, key1, block_size); + EVP_CIPHER_CTX_cleanup(ctx); - EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, pl__key, NULL); - EVP_EncryptUpdate(&ctx, key2, &outl, key2, block_size); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, pl__key, NULL); + EVP_EncryptUpdate(ctx, key2, &outl, key2, block_size); + EVP_CIPHER_CTX_cleanup(ctx); - EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, pl__key, NULL); - EVP_EncryptUpdate(&ctx, key3, &outl, key3, block_size); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, pl__key, NULL); + EVP_EncryptUpdate(ctx, key3, &outl, key3, block_size); + EVP_CIPHER_CTX_cleanup(ctx); - if(EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key1, NULL)) + if(EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key1, NULL)) { for(int i = 0; i < data_length - block_size; i += block_size) { @@ -791,9 +1044,9 @@ OCTETSTRING ef__Calculate__AES__XCBC__128 (const OCTETSTRING& pl__data, const OC e[j] ^= data[i+j]; } - EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key1, NULL); - EVP_EncryptUpdate(&ctx, e, &outl, e, block_size); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key1, NULL); + EVP_EncryptUpdate(ctx, e, &outl, e, block_size); + EVP_CIPHER_CTX_cleanup(ctx); } int last_block_length = data_length % block_size; @@ -824,13 +1077,14 @@ OCTETSTRING ef__Calculate__AES__XCBC__128 (const OCTETSTRING& pl__data, const OC } } - EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key1, NULL); - EVP_EncryptUpdate(&ctx, e, &outl, e, block_size); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key1, NULL); + EVP_EncryptUpdate(ctx, e, &outl, e, block_size); + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(pl__out__length, (const unsigned char*)e); } + EVP_CIPHER_CTX_free(ctx); return OCTETSTRING(0,NULL); } @@ -881,18 +1135,32 @@ INTEGER ef__DH__generate__private__public__keys (const INTEGER& pl__keyLength, O return INTEGER(0); } } - dh->p = prime; const char* generator = "2"; BIGNUM* gen = BN_new(); BN_hex2bn(&gen, generator); - dh->g = gen; +#if OPENSSL_VERSION_NUMBER >= 0x1010000fL + DH_set0_pqg(dh, prime, NULL, gen); +#else + dh->p = prime; + dh->g = gen; +#endif + DH_generate_key(dh); - - int pub_len = BN_num_bytes(dh->pub_key); + const BIGNUM* pubk=NULL; + const BIGNUM* privk=NULL; + +#if OPENSSL_VERSION_NUMBER >= 0x1010000fL + DH_get0_key(dh, &pubk, &privk); +#else + pubk=dh->pub_key; + privk=dh->priv_key; +#endif + + int pub_len = BN_num_bytes(pubk); unsigned char* pub_key = (unsigned char*)Malloc(pub_len * sizeof(unsigned char)); - pub_len = BN_bn2bin(dh->pub_key, pub_key); + pub_len = BN_bn2bin(pubk, pub_key); if (key_length-pub_len > 0) {pl__pubkey = int2oct(0,key_length-pub_len) + OCTETSTRING(pub_len, pub_key);} else @@ -905,9 +1173,9 @@ INTEGER ef__DH__generate__private__public__keys (const INTEGER& pl__keyLength, O return INTEGER(0); } - int priv_len = BN_num_bytes(dh->priv_key); + int priv_len = BN_num_bytes(privk); unsigned char* priv_key = (unsigned char*)Malloc(priv_len * sizeof(unsigned char)); - priv_len = BN_bn2bin(dh->priv_key, priv_key); + priv_len = BN_bn2bin(privk, priv_key); if (key_length-priv_len > 0) {pl__privkey = int2oct(0,key_length-priv_len) + OCTETSTRING(priv_len, priv_key);} else @@ -970,20 +1238,29 @@ OCTETSTRING ef__DH__shared__secret (const OCTETSTRING& pl__pubkey, const OCTETST return OCTETSTRING(0, NULL); } } - dh->p = prime; const char* generator = "2"; BIGNUM* gen = BN_new(); BN_hex2bn(&gen, generator); + +#if OPENSSL_VERSION_NUMBER >= 0x1010000fL + DH_set0_pqg(dh, prime, NULL, gen); +#else + dh->p = prime; dh->g = gen; +#endif BIGNUM* priv_key = BN_new(); BN_bin2bn((const unsigned char*)pl__privkey, key_length, priv_key); - dh->priv_key = priv_key; BIGNUM* pub_key = BN_new(); BN_bin2bn((const unsigned char*)pl__pubkey, key_length, pub_key); +#if OPENSSL_VERSION_NUMBER >= 0x1010000fL + DH_set0_key(dh, pub_key, priv_key ); +#else + dh->priv_key = priv_key; dh->pub_key = pub_key; +#endif if(DH_compute_key(shared_secret, pub_key, dh)) { @@ -1120,8 +1397,11 @@ OCTETSTRING f__AES__CTR__128__Encrypt__Decrypt__OpenSSL (const OCTETSTRING& p_ke unsigned char ecount_buf[AES_BLOCK_SIZE]; memset(ecount_buf, 0, AES_BLOCK_SIZE); - AES_ctr128_encrypt((const unsigned char*)p_data, enc_data, data_len, &aes_k, k_iv, ecount_buf, &num); - +#if OPENSSL_VERSION_NUMBER >= 0x10100000L + CRYPTO_ctr128_encrypt((const unsigned char*)p_data, enc_data, data_len, &aes_k, k_iv,ecount_buf , &num, (block128_f)AES_encrypt); +#else + AES_ctr128_encrypt((const unsigned char*)p_data, enc_data, data_len, &aes_k, k_iv, ecount_buf, &num); +#endif return OCTETSTRING(data_len, enc_data); } diff --git a/src/TCCOpenSecurity_Functions.ttcn b/src/TCCOpenSecurity_Functions.ttcn index 8152cf6..ec4f212 100644 --- a/src/TCCOpenSecurity_Functions.ttcn +++ b/src/TCCOpenSecurity_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCOpenSecurity.ttcn // Description: TCC Useful Functions: Security Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// @@ -20,6 +20,95 @@ module TCCOpenSecurity_Functions { type octetstring OCT_16 length(16); type octetstring OCT_64 length(64); +/////////////////////////////////////////////////////////////////////////////// +// Function: f_calculateDigestResponse +// +// Purpose: +// Calculate digest response +// +// Parameters: +// nonce - *in* *charstring* - a server-specified data string which may +// ` be uniquely generated each time a 401 +// response is made +// cnonce - *in* *charstring* - client nonce +// user - *in* *charstring* - user name +// realm - *in* *charstring* - user realm +// passwd - *in* *charstring* - user password +// alg - *in* *charstring* - a string indicating a pair of algorithms +// used to produce the digest and a checksum +// nonceCount - *in* *charstring* - nonce count (8 hex digits) +// method - *in* *charstring* - method (from the request) +// qop - *in* *charstring* - qop-value: "", "auth", "auth-int" +// URI - *in* *charstring* - digest URI +// HEntity - *in* *charstring* - H(entity body) if qop="auth-int" +// +// Return Value: +// charstring - digest response +// +// Errors: +// - +// +// Detailed description: +// Support HTTP authentication (detailed description in RFC 2617) using +// uses one-way hash (md5) specified in RFC 1321. +// When a request arrives to server for an access-protected object, it +// responds an "401 Unauthorized" status code and a WWW-Authenticate +// header (encapsulate nonce and other necessary parameters). The client +// is expected to retry the request, passing an Authorization header with +// response field calculated with f_calculateDigestResponse(). +// +// Overview: http://en.wikipedia.org/wiki/Digest_access_authentication +// +/////////////////////////////////////////////////////////////////////////////// +external function f_calculateDigestResponse( + charstring nonce, + charstring cnonce, + charstring user, + charstring realm, + charstring passwd, + charstring alg, + charstring nonceCount, + charstring method, + charstring qop, + charstring URI, + charstring HEntity) return charstring; + + +/////////////////////////////////////////////////////////////////////////////// +// Function: f_calculateDigestHA1 +// +// Purpose: +// Calculate digest H(A1) hash +// +// Parameters: +// nonce - *in* *charstring* - a server-specified data string which may +// ` be uniquely generated each time a 401 +// response is made +// cnonce - *in* *charstring* - client nonce +// user - *in* *charstring* - user name +// realm - *in* *charstring* - user realm +// passwd - *in* *charstring* - user password +// alg - *in* *charstring* - a string indicating a pair of algorithms +// used to produce the digest and a checksum +// +// Return Value: +// charstring - digest response +// +// Errors: +// - +// +// Detailed description: +// Overview: http://en.wikipedia.org/wiki/Digest_access_authentication +// +/////////////////////////////////////////////////////////////////////////////// +external function f_calculateDigestHA1( + charstring nonce, + charstring cnonce, + charstring user, + charstring realm, + charstring passwd, + charstring alg) return charstring; + /////////////////////////////////////////////////////////////////////////////// // Function: f_calculateRAND_oct @@ -42,6 +131,29 @@ type octetstring OCT_64 length(64); /////////////////////////////////////////////////////////////////////////////// external function f_calculateRAND_oct(in integer pl_length) return octetstring; +/////////////////////////////////////////////////////////////////////////////// +// Function: f_calculateMD5 +// +// Purpose: +// Compute MD5 hash value +// +// Parameters: +// pszHashInput - *in* *charstring* - input value to compute MD5 hash +// +// Return Value: +// charstring - hexa hash value of input +// +// Errors: +// - +// +// Detailed description: +// - MD5() is an openssl specific function, should be found under openssl/md5.h +// +/////////////////////////////////////////////////////////////////////////////// +external function f_calculateMD5(in charstring pszHashInput) return charstring; + +external function f_calculateMD5_oct(in octetstring pszHashInput) return octetstring; + /////////////////////////////////////////////////////////////////////////////// // Function: f_calculateSHA1 // diff --git a/src/TCCPermutatedParameters_Definitions.ttcn b/src/TCCPermutatedParameters_Definitions.ttcn index 6c81a0f..14338d6 100644 --- a/src/TCCPermutatedParameters_Definitions.ttcn +++ b/src/TCCPermutatedParameters_Definitions.ttcn @@ -10,7 +10,7 @@ // // File: TCCPermutatedParameters_Definitions.ttcn // Description: definitions for permutated params -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 ////////////////////////////////////////////////////////////////////////////// @@ -156,4 +156,4 @@ type record of PP_ParamSet PP_ParamSetList; // is each CGPN has its own current /////////////////////////////////////////////////////////// type set of PP_SingleParam PP_ParamSet; // ie params belonging to one particular call -} with { extension "version R30A"} +} with { extension "version R35B"} diff --git a/src/TCCPermutatedParameters_Functions.ttcn b/src/TCCPermutatedParameters_Functions.ttcn index a009dec..145d62b 100644 --- a/src/TCCPermutatedParameters_Functions.ttcn +++ b/src/TCCPermutatedParameters_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCPermutatedParameters_Functions.ttcn // Description: functions for permutated params -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 ////////////////////////////////////////////////////////////////////////////// @@ -905,4 +905,4 @@ public function f_PP_getParamValueFromSet( return vl_ret; } -} with { extension "version R30A"} +} with { extension "version R35B"} diff --git a/src/TCCRegexp.cc b/src/TCCRegexp.cc index 3b70154..cfac587 100644 --- a/src/TCCRegexp.cc +++ b/src/TCCRegexp.cc @@ -10,7 +10,7 @@ // // File: TCCRegexp_Functions.ttcn // Description: TCC Useful Functions: Regexp Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCRegexp_Functions.ttcn b/src/TCCRegexp_Functions.ttcn index 325b28b..a496e0a 100644 --- a/src/TCCRegexp_Functions.ttcn +++ b/src/TCCRegexp_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCRegexp_Functions.ttcn // Description: TCC Useful Functions: Regexp Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCSystem.cc b/src/TCCSystem.cc index cd600c7..5f8e664 100644 --- a/src/TCCSystem.cc +++ b/src/TCCSystem.cc @@ -10,7 +10,7 @@ // // File: TCCSystem.cc // Description: TCC Useful Functions: System Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCSystem_Functions.ttcn b/src/TCCSystem_Functions.ttcn index d7c3bfd..2c669db 100644 --- a/src/TCCSystem_Functions.ttcn +++ b/src/TCCSystem_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCSystem_Functions.ttcn // Description: TCC Useful Functions: System Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCTemplate_Functions.ttcn b/src/TCCTemplate_Functions.ttcn index f1a77a9..3e8812f 100644 --- a/src/TCCTemplate_Functions.ttcn +++ b/src/TCCTemplate_Functions.ttcn @@ -10,41 +10,41 @@ // // File: TCCTemplate_Functions.ttcn // Description: TCC Useful Functions: Template Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // Module: TCCTemplate_Functions -// +// // Purpose: // This module supports template handling -// Originally for TitanSIM R2 needs it for substituting substrings in a +// Originally for TitanSIM R2 needs it for substituting substrings in a // charstring template. -// +// // Module Parameters: -// - -// +// - +// // Module depends on: // - -// +// // Current Owner: // Zsolt Szalai (EZSOSZA) -// +// // Last Review Date: // - -// +// // Comments: // Intruduction of ? regexp like behavior like \(x)? in our own pattern -// couses many troubles, like with the current templatefunc signature it -// can be impossible to determine the parameters(using 2 ? pattern) and -// lookup may need much more and complicated additions or rewrite that +// couses many troubles, like with the current templatefunc signature it +// can be impossible to determine the parameters(using 2 ? pattern) and +// lookup may need much more and complicated additions or rewrite that // we may want at that time; // /////////////////////////////////////////////////////////////////////////////// module TCCTemplate_Functions { - + // import from TCCConversion_Functions all; import from TCCFileIO_Functions all; @@ -52,7 +52,7 @@ module TCCTemplate_Functions { charstring TCCTemplate_opentoken := "$("; charstring TCCTemplate_closetoken := ")"; } - + type function templatefunc(in charstringList pl_params) runs on self return charstring; type record TCCSubstitution { @@ -62,7 +62,7 @@ module TCCTemplate_Functions { } type record of TCCSubstitution TCCSubstitutionList; - + type record of charstring charstringList; @@ -70,23 +70,23 @@ module TCCTemplate_Functions { /////////////////////////////////////////////////////////////////////////////// // Function: f_Template_substitutetemplate - // + // // Purpose: // Makes the substitutions according to the dictonary given // // Parameters: // pl_dict - *in* *TCCSubstitutionList* - dictionary - // pl_string - *in* *charstring* - string to substitute in - // + // pl_string - *in* *charstring* - string to substitute in + // // Return Value: // charstring - substituted string // // Errors: - // - - // + // - + // // Detailed description: // - - // + // /////////////////////////////////////////////////////////////////////////////// function f_Template_substitutetemplate(in TCCSubstitutionList pl_dict, in charstring pl_string) return charstring{ var charstring ret := pl_string; @@ -106,7 +106,7 @@ module TCCTemplate_Functions { } return ret;*/ //heuristic implementation end///////////////////////////////////////////// - + var charstring t_open := TCCTemplate_opentoken; var charstring t_close := TCCTemplate_closetoken; @@ -123,7 +123,7 @@ module TCCTemplate_Functions { if (i<lengthof(ret)){ if (substr(ret,i,lengthof(t_close)) == t_close){ i := i + lengthof(t_close); - var charstring variable := substr(ret, tokenstart, i - tokenstart); + var charstring variable := substr(ret, tokenstart+lengthof(t_open), i-tokenstart-lengthof(t_open)-lengthof(t_close)); //log("Variable found: ", variable,"\n"); var charstringList params := {}; var integer recindex := f_Template_lookup(pl_dict, variable, params); @@ -154,25 +154,25 @@ module TCCTemplate_Functions { /////////////////////////////////////////////////////////////////////////////// // Function: f_Template_subsfiletemplate - // + // // Purpose: - // Makes the substitutions in the content of the given file, + // Makes the substitutions in the content of the given file, // according to the dictonary // // Parameters: // pl_dict - *in* *TCCSubstitutionList* - dictionary // pl_file - *in* *charstring* - name of the file containing the template - // + // // Return Value: // charstring - substituted string // // Errors: // From FIO - in this case "" returns - // + // // Detailed description: // - - // - /////////////////////////////////////////////////////////////////////////////// + // + /////////////////////////////////////////////////////////////////////////////// function f_Template_subsfiletemplate(in TCCSubstitutionList pl_dict, in charstring pl_file) return charstring{ var integer fd := f_FIO_open_rdonly(pl_file); if (fd == -1){ @@ -187,7 +187,7 @@ module TCCTemplate_Functions { if (f_FIO_close(fd) == -1){log("Error while closing file!");} return ""; } - if (f_FIO_close(fd) == -1){log("Error while closing file!");} + if (f_FIO_close(fd) == -1){log("Error while closing file!");} return f_Template_substitutetemplate(pl_dict, content); } @@ -196,7 +196,7 @@ module TCCTemplate_Functions { group PrivateFunctions{ - function f_Template_getparams(in charstring matched, in charstring patt) + function f_Template_getparams(in charstring matched, in charstring patt) return charstringList { var integer pc := 0; @@ -204,13 +204,13 @@ module TCCTemplate_Functions { for (var integer i:=0;i<lengthof(patt);i:=i+1){ if (patt[i]=="(" and i!=0 and patt[i-1]!="#" and patt[i-1]!="\\"){pc:=pc+1;} } - for (var integer i:=0;i<pc;i:=i+1){ - params[sizeof(params)] := regexp(matched, patt, i); - } + for (var integer i:=0;i<pc;i:=i+1){ + params[sizeof(params)] := regexp(matched, patt, i); + } return params; } - function f_Template_lookup(in TCCSubstitutionList pl_dict, in charstring pl_var, + function f_Template_lookup(in TCCSubstitutionList pl_dict, in charstring pl_var, out charstringList pl_params) return integer{ pl_params:={}; for (var integer i:=0; i<sizeof(pl_dict);i:=i+1){ // simple search @@ -224,9 +224,9 @@ module TCCTemplate_Functions { while (j<lengthof(pl_dict[i].patt) and k<lengthof(pl_var)){ while(j<lengthof(pl_dict[i].patt) and k<lengthof(pl_var) and pl_dict[i].patt[j] == pl_var[k]){ j := j + 1; - k := k + 1; + k := k + 1; } - if (j<lengthof(pl_dict[i].patt) and pl_dict[i].patt[j]=="\\" and j+1<lengthof(pl_dict[i].patt) and pl_dict[i].patt[j+1]=="w" and j+2<lengthof(pl_dict[i].patt)){ + if (j<lengthof(pl_dict[i].patt) and pl_dict[i].patt[j]=="\\" and j+1<lengthof(pl_dict[i].patt) and pl_dict[i].patt[j+1]=="w" and j+2<lengthof(pl_dict[i].patt)){ // we have found an escape, parameter begins j := j + 2; var integer paramstart := k; @@ -244,6 +244,6 @@ module TCCTemplate_Functions { } } return -1; - } - } -} + } + } +} \ No newline at end of file diff --git a/src/TCCTitanMetadata.cc b/src/TCCTitanMetadata.cc index abb2007..581f12a 100644 --- a/src/TCCTitanMetadata.cc +++ b/src/TCCTitanMetadata.cc @@ -10,7 +10,7 @@ // // File: TCCTitanMetadata.cc // Description: TCC Useful Functions: TitanMetadata Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCTitanMetadata_Functions.ttcn b/src/TCCTitanMetadata_Functions.ttcn index decbb9f..7bb2c39 100644 --- a/src/TCCTitanMetadata_Functions.ttcn +++ b/src/TCCTitanMetadata_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCTitanMetadata_Functions.ttcn // Description: TCC Useful Functions: TitanMetadata Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCUsefulFunctions_Library.grp b/src/TCCUsefulFunctions_Library.grp index 5fc46e2..d570477 100644 --- a/src/TCCUsefulFunctions_Library.grp +++ b/src/TCCUsefulFunctions_Library.grp @@ -11,7 +11,7 @@ // // File: TCCUsefulFunctions_Library.grp // Description: FileGroup file for TCCUsefulFunctions ApplicationLibrary -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// @@ -50,6 +50,8 @@ <File path="TCCMessageHandling_Functions.ttcn" /> <File path="TCCSecurity.cc" /> <File path="TCCSecurity_Functions.ttcn" /> + <File path="TCCOpenSecurity.cc" /> + <File path="TCCOpenSecurity_Functions.ttcn" /> <File path="TCCSystem.cc" /> <File path="TCCSystem_Functions.ttcn" /> <File path="TCCTemplate_Functions.ttcn" /> @@ -57,8 +59,6 @@ <File path="TCCTitanMetadata_Functions.ttcn" /> <File path="aka_algorythm_set.c" /> <File path="aka_algorythm_set.h" /> - <File path="digcalc.c" /> - <File path="digcalc.h" /> <File path="zuc.c" /> <File path="zuc.h" /> <File path="snow3g.c" /> diff --git a/src/TCCUsefulFunctions_PermutatedParameters.grp b/src/TCCUsefulFunctions_PermutatedParameters.grp index 597c32d..ad37c1d 100644 --- a/src/TCCUsefulFunctions_PermutatedParameters.grp +++ b/src/TCCUsefulFunctions_PermutatedParameters.grp @@ -11,7 +11,7 @@ // // File: TCCUsefulFunctions_PermutatedParameters.grp // Description: FileGroup file for TCCUsefulFunctions Permutated Parameters -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCXPathSupport.cc b/src/TCCXPathSupport.cc index 17058ff..cf1077a 100644 --- a/src/TCCXPathSupport.cc +++ b/src/TCCXPathSupport.cc @@ -10,7 +10,7 @@ // // File: TCCXPathSupport_Functions.ttcn // Description: TCC Useful Functions: XPath Support Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/TCCXPathSupport_Functions.ttcn b/src/TCCXPathSupport_Functions.ttcn index 1bc99e7..4d6b0c9 100644 --- a/src/TCCXPathSupport_Functions.ttcn +++ b/src/TCCXPathSupport_Functions.ttcn @@ -10,7 +10,7 @@ // // File: TCCXPathSupport_Functions.ttcn // Description: TCC Useful Functions: XPath Support Functions -// Rev: R30A +// Rev: R35B // Prodnr: CNL 113 472 // /////////////////////////////////////////////////////////////////////////////// -- GitLab