From b9cd41270604e5b3218113decd6e9fa4feb90f06 Mon Sep 17 00:00:00 2001 From: shen guohua Date: Fri, 28 Apr 2023 02:36:01 +0000 Subject: [PATCH 1/6] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20cc-resource-pooling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cc-resource-pooling/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 cc-resource-pooling/.keep diff --git a/cc-resource-pooling/.keep b/cc-resource-pooling/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 01ff8c6b57be52427f9b3ae9fa12e25f4399b728 Mon Sep 17 00:00:00 2001 From: shen-guohua Date: Fri, 28 Apr 2023 11:04:09 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -- Gitee From ef53b723521fe581731b94443b100598e52e72d9 Mon Sep 17 00:00:00 2001 From: shen-guohua Date: Fri, 28 Apr 2023 11:05:32 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cc-resource-pooling/LICENSE | 127 + cc-resource-pooling/README.md | 34 + .../demo/clientapp/parallel/p.sh | 17 + .../demo/clientapp/testcase1/CMakeLists.txt | 16 + .../demo/clientapp/testcase1/build/cmake.sh | 1 + .../demo/clientapp/testcase1/build/test.sh | 11 + .../demo/clientapp/testcase1/testcase.c | 1042 + .../demo/clientapp/testcase1/testcase.h | 39 + .../demo/clientapp/testcase2/CMakeLists.txt | 16 + .../demo/clientapp/testcase2/build/cmake.sh | 1 + .../demo/clientapp/testcase2/build/test.sh | 11 + .../demo/clientapp/testcase2/testcase.c | 941 + .../demo/clientapp/testcase2/testcase.h | 39 + .../demo/clientapp/testcase3/CMakeLists.txt | 16 + .../demo/clientapp/testcase3/build/cmake.sh | 1 + .../demo/clientapp/testcase3/build/test.sh | 11 + .../demo/clientapp/testcase3/testcase.c | 941 + .../demo/clientapp/testcase3/testcase.h | 39 + .../demo/clientapp/testcase4/CMakeLists.txt | 16 + .../demo/clientapp/testcase4/build/cmake.sh | 1 + .../demo/clientapp/testcase4/build/test.sh | 11 + .../demo/clientapp/testcase4/testcase.c | 940 + .../demo/clientapp/testcase4/testcase.h | 39 + .../demo/clientapp/testcase5/CMakeLists.txt | 16 + .../demo/clientapp/testcase5/build/cmake.sh | 1 + .../demo/clientapp/testcase5/build/test.sh | 11 + .../demo/clientapp/testcase5/testcase.c | 940 + .../demo/clientapp/testcase5/testcase.h | 39 + .../demo/clientapp/testcase6/CMakeLists.txt | 16 + .../demo/clientapp/testcase6/build/cmake.sh | 1 + .../demo/clientapp/testcase6/build/test.sh | 11 + .../demo/clientapp/testcase6/testcase.c | 940 + .../demo/clientapp/testcase6/testcase.h | 39 + .../demo/clientapp/testcase7/CMakeLists.txt | 16 + .../demo/clientapp/testcase7/build/cmake.sh | 1 + .../demo/clientapp/testcase7/build/test.sh | 11 + .../demo/clientapp/testcase7/testcase.c | 940 + .../demo/clientapp/testcase7/testcase.h | 39 + .../demo/clientapp/testcase8/CMakeLists.txt | 16 + .../demo/clientapp/testcase8/build/cmake.sh | 1 + .../demo/clientapp/testcase8/build/test.sh | 11 + .../demo/clientapp/testcase8/testcase.c | 940 + .../demo/clientapp/testcase8/testcase.h | 39 + .../demo/clientapp/testcase9/CMakeLists.txt | 16 + .../demo/clientapp/testcase9/build/cmake.sh | 1 + .../demo/clientapp/testcase9/build/test.sh | 11 + .../demo/clientapp/testcase9/testcase.c | 940 + .../demo/clientapp/testcase9/testcase.h | 39 + .../demo/dbusjwt/CMakeLists.txt | 71 + .../demo/dbusjwt/build/cmake.sh | 1 + .../demo/dbusjwt/dbus_return_code.h | 26 + cc-resource-pooling/demo/dbusjwt/dbusc_jwt.c | 458 + cc-resource-pooling/demo/dbusjwt/dbusc_jwt.h | 27 + .../demo/dbusjwt/dbuss_fetchjwt.c | 253 + .../demo/dbusjwt/dbuss_validatejwt.c | 219 + .../demo/libspiffejwt/CMakeLists.txt | 56 + .../demo/libspiffejwt/build/cmake.sh | 1 + .../demo/libspiffejwt/spiffejwt.c | 254 + .../demo/libspiffejwt/spiffejwt.h | 13 + .../demo/libspiffejwt/test_spiffejwt.c | 51 + cc-resource-pooling/demo/scripts/dbus.sh | 10 + .../scripts/spire/createentry_workload.sh | 9 + .../demo/scripts/spire/gentoken_agent.sh | 1 + .../demo/scripts/spire/runagent.sh | 1 + .../demo/scripts/spire/runserver.sh | 1 + .../demo/scripts/spire/showdelentry.sh | 10 + cc-resource-pooling/demo/scripts/tcpdump.sh | 2 + cc-resource-pooling/docs/Design/design.docx | Bin 0 -> 1180936 bytes .../docs/deployment/deployment.docx | Bin 0 -> 99264 bytes cc-resource-pooling/docs/pic/arch-II.png | Bin 0 -> 142683 bytes cc-resource-pooling/docs/test.docx | Bin 0 -> 68525 bytes cc-resource-pooling/patch/c-spiffe_patch | 507 + .../teeproxy/gpproxy/CMakeLists.txt | 107 + .../teeproxy/gpproxy/build/cmake.sh | 3 + .../teeproxy/gpproxy/certs/ca_crt.pem | 22 + .../teeproxy/gpproxy/certs/ca_key.pem | 30 + .../teeproxy/gpproxy/certs/check_ca_crt.sh | 42 + .../teeproxy/gpproxy/certs/check_ca_key.sh | 63 + .../gpproxy/certs/check_client_crt.sh | 43 + .../gpproxy/certs/check_client_key.sh | 62 + .../gpproxy/certs/check_server_crt.sh | 43 + .../gpproxy/certs/check_server_key.sh | 62 + .../teeproxy/gpproxy/certs/gen_ca_crt.sh | 22 + .../teeproxy/gpproxy/certs/gen_ca_keycrt.sh | 22 + .../teeproxy/gpproxy/certs/gen_client_crt.sh | 22 + .../gpproxy/certs/gen_client_keycsr.sh | 22 + .../teeproxy/gpproxy/certs/gen_server_crt.sh | 32 + .../gpproxy/certs/gen_server_keycrt.sh | 32 + .../teeproxy/gpproxy/certs/msg.txt | 1 + .../teeproxy/gpproxy/certs/server_crt.pem | 20 + .../teeproxy/gpproxy/certs/server_key.pem | 30 + .../teeproxy/gpproxy/changelog.md | 7 + .../teeproxy/gpproxy/common.cmake | 129 + .../teeproxy/gpproxy/conf/gpproxy_config.yaml | 19 + .../teeproxy/gpproxy/gpproxy.cc | 4195 +++ .../teeproxy/gpproxy/gpproxy.h | 21 + .../teeproxy/gpproxy/protos/gt.proto | 392 + cc-resource-pooling/teeproxy/gpworker/README | 8 + .../teeproxy/gpworker/build/Makefile | 28 + .../teeproxy/gpworker/build/r.sh | 7 + .../teeproxy/gpworker/changelog.md | 7 + .../teeproxy/gpworker/condition.c | 55 + .../teeproxy/gpworker/condition.h | 28 + .../teeproxy/gpworker/gpworker.c | 50 + .../teeproxy/gpworker/threadpool.c | 155 + .../teeproxy/gpworker/threadpool.h | 108 + .../teeproxy/gpworker/tzcp_dbus.c | 22889 ++++++++++++++++ .../teeproxy/gpworker/tzcp_dbus.h | 550 + .../teeproxy/libdbuscgpw/CMakeLists.txt | 45 + .../teeproxy/libdbuscgpw/build/cmake.sh | 1 + .../teeproxy/libdbuscgpw/dbusc_gpw.c | 9291 +++++++ .../teeproxy/libdbuscgpw/dbusc_gpw.h | 406 + .../teeproxy/libteecc/CMakeLists.txt | 119 + .../teeproxy/libteecc/build/cmake.sh | 3 + .../teeproxy/libteecc/certs/ca_crt.pem | 22 + .../teeproxy/libteecc/certs/check_ca_crt.sh | 42 + .../libteecc/certs/check_client_crt.sh | 43 + .../libteecc/certs/check_client_key.sh | 62 + .../teeproxy/libteecc/certs/client_crt.pem | 20 + .../teeproxy/libteecc/certs/client_key.pem | 30 + .../libteecc/certs/gen_client_keycsr.sh | 22 + .../teeproxy/libteecc/certs/msg.txt | 1 + .../teeproxy/libteecc/changelog.md | 7 + .../teeproxy/libteecc/common.cmake | 129 + .../teeproxy/libteecc/conf/teecc_config.yaml | 10 + .../libteecc/include/teecc/tee_client_api.h | 184 + .../include/teecc/tee_client_constants.h | 165 + .../libteecc/include/teecc/tee_client_list.h | 100 + .../libteecc/include/teecc/tee_client_log.h | 29 + .../libteecc/include/teecc/tee_client_type.h | 150 + .../libteecc/include/teecc/teec_client_api.h | 192 + .../teeproxy/libteecc/protos/gt.proto | 392 + .../teeproxy/libteecc/teecc.cc | 4148 +++ cc-resource-pooling/teeproxy/libteecc/teecc.h | 351 + 134 files changed, 56608 insertions(+) create mode 100644 cc-resource-pooling/LICENSE create mode 100644 cc-resource-pooling/README.md create mode 100644 cc-resource-pooling/demo/clientapp/parallel/p.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase1/CMakeLists.txt create mode 100644 cc-resource-pooling/demo/clientapp/testcase1/build/cmake.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase1/build/test.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase1/testcase.c create mode 100644 cc-resource-pooling/demo/clientapp/testcase1/testcase.h create mode 100644 cc-resource-pooling/demo/clientapp/testcase2/CMakeLists.txt create mode 100644 cc-resource-pooling/demo/clientapp/testcase2/build/cmake.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase2/build/test.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase2/testcase.c create mode 100644 cc-resource-pooling/demo/clientapp/testcase2/testcase.h create mode 100644 cc-resource-pooling/demo/clientapp/testcase3/CMakeLists.txt create mode 100644 cc-resource-pooling/demo/clientapp/testcase3/build/cmake.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase3/build/test.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase3/testcase.c create mode 100644 cc-resource-pooling/demo/clientapp/testcase3/testcase.h create mode 100644 cc-resource-pooling/demo/clientapp/testcase4/CMakeLists.txt create mode 100644 cc-resource-pooling/demo/clientapp/testcase4/build/cmake.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase4/build/test.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase4/testcase.c create mode 100644 cc-resource-pooling/demo/clientapp/testcase4/testcase.h create mode 100644 cc-resource-pooling/demo/clientapp/testcase5/CMakeLists.txt create mode 100644 cc-resource-pooling/demo/clientapp/testcase5/build/cmake.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase5/build/test.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase5/testcase.c create mode 100644 cc-resource-pooling/demo/clientapp/testcase5/testcase.h create mode 100644 cc-resource-pooling/demo/clientapp/testcase6/CMakeLists.txt create mode 100644 cc-resource-pooling/demo/clientapp/testcase6/build/cmake.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase6/build/test.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase6/testcase.c create mode 100644 cc-resource-pooling/demo/clientapp/testcase6/testcase.h create mode 100644 cc-resource-pooling/demo/clientapp/testcase7/CMakeLists.txt create mode 100644 cc-resource-pooling/demo/clientapp/testcase7/build/cmake.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase7/build/test.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase7/testcase.c create mode 100644 cc-resource-pooling/demo/clientapp/testcase7/testcase.h create mode 100644 cc-resource-pooling/demo/clientapp/testcase8/CMakeLists.txt create mode 100644 cc-resource-pooling/demo/clientapp/testcase8/build/cmake.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase8/build/test.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase8/testcase.c create mode 100644 cc-resource-pooling/demo/clientapp/testcase8/testcase.h create mode 100644 cc-resource-pooling/demo/clientapp/testcase9/CMakeLists.txt create mode 100644 cc-resource-pooling/demo/clientapp/testcase9/build/cmake.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase9/build/test.sh create mode 100644 cc-resource-pooling/demo/clientapp/testcase9/testcase.c create mode 100644 cc-resource-pooling/demo/clientapp/testcase9/testcase.h create mode 100644 cc-resource-pooling/demo/dbusjwt/CMakeLists.txt create mode 100644 cc-resource-pooling/demo/dbusjwt/build/cmake.sh create mode 100644 cc-resource-pooling/demo/dbusjwt/dbus_return_code.h create mode 100644 cc-resource-pooling/demo/dbusjwt/dbusc_jwt.c create mode 100644 cc-resource-pooling/demo/dbusjwt/dbusc_jwt.h create mode 100644 cc-resource-pooling/demo/dbusjwt/dbuss_fetchjwt.c create mode 100644 cc-resource-pooling/demo/dbusjwt/dbuss_validatejwt.c create mode 100644 cc-resource-pooling/demo/libspiffejwt/CMakeLists.txt create mode 100644 cc-resource-pooling/demo/libspiffejwt/build/cmake.sh create mode 100644 cc-resource-pooling/demo/libspiffejwt/spiffejwt.c create mode 100644 cc-resource-pooling/demo/libspiffejwt/spiffejwt.h create mode 100644 cc-resource-pooling/demo/libspiffejwt/test_spiffejwt.c create mode 100644 cc-resource-pooling/demo/scripts/dbus.sh create mode 100644 cc-resource-pooling/demo/scripts/spire/createentry_workload.sh create mode 100644 cc-resource-pooling/demo/scripts/spire/gentoken_agent.sh create mode 100644 cc-resource-pooling/demo/scripts/spire/runagent.sh create mode 100644 cc-resource-pooling/demo/scripts/spire/runserver.sh create mode 100644 cc-resource-pooling/demo/scripts/spire/showdelentry.sh create mode 100644 cc-resource-pooling/demo/scripts/tcpdump.sh create mode 100644 cc-resource-pooling/docs/Design/design.docx create mode 100644 cc-resource-pooling/docs/deployment/deployment.docx create mode 100644 cc-resource-pooling/docs/pic/arch-II.png create mode 100644 cc-resource-pooling/docs/test.docx create mode 100644 cc-resource-pooling/patch/c-spiffe_patch create mode 100644 cc-resource-pooling/teeproxy/gpproxy/CMakeLists.txt create mode 100644 cc-resource-pooling/teeproxy/gpproxy/build/cmake.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/ca_crt.pem create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/ca_key.pem create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/check_ca_crt.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/check_ca_key.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/check_client_crt.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/check_client_key.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/check_server_crt.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/check_server_key.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/gen_ca_crt.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/gen_ca_keycrt.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/gen_client_crt.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/gen_client_keycsr.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/gen_server_crt.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/gen_server_keycrt.sh create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/msg.txt create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/server_crt.pem create mode 100644 cc-resource-pooling/teeproxy/gpproxy/certs/server_key.pem create mode 100644 cc-resource-pooling/teeproxy/gpproxy/changelog.md create mode 100644 cc-resource-pooling/teeproxy/gpproxy/common.cmake create mode 100644 cc-resource-pooling/teeproxy/gpproxy/conf/gpproxy_config.yaml create mode 100644 cc-resource-pooling/teeproxy/gpproxy/gpproxy.cc create mode 100644 cc-resource-pooling/teeproxy/gpproxy/gpproxy.h create mode 100644 cc-resource-pooling/teeproxy/gpproxy/protos/gt.proto create mode 100644 cc-resource-pooling/teeproxy/gpworker/README create mode 100644 cc-resource-pooling/teeproxy/gpworker/build/Makefile create mode 100644 cc-resource-pooling/teeproxy/gpworker/build/r.sh create mode 100644 cc-resource-pooling/teeproxy/gpworker/changelog.md create mode 100644 cc-resource-pooling/teeproxy/gpworker/condition.c create mode 100644 cc-resource-pooling/teeproxy/gpworker/condition.h create mode 100644 cc-resource-pooling/teeproxy/gpworker/gpworker.c create mode 100644 cc-resource-pooling/teeproxy/gpworker/threadpool.c create mode 100644 cc-resource-pooling/teeproxy/gpworker/threadpool.h create mode 100644 cc-resource-pooling/teeproxy/gpworker/tzcp_dbus.c create mode 100644 cc-resource-pooling/teeproxy/gpworker/tzcp_dbus.h create mode 100644 cc-resource-pooling/teeproxy/libdbuscgpw/CMakeLists.txt create mode 100644 cc-resource-pooling/teeproxy/libdbuscgpw/build/cmake.sh create mode 100644 cc-resource-pooling/teeproxy/libdbuscgpw/dbusc_gpw.c create mode 100644 cc-resource-pooling/teeproxy/libdbuscgpw/dbusc_gpw.h create mode 100644 cc-resource-pooling/teeproxy/libteecc/CMakeLists.txt create mode 100644 cc-resource-pooling/teeproxy/libteecc/build/cmake.sh create mode 100644 cc-resource-pooling/teeproxy/libteecc/certs/ca_crt.pem create mode 100644 cc-resource-pooling/teeproxy/libteecc/certs/check_ca_crt.sh create mode 100644 cc-resource-pooling/teeproxy/libteecc/certs/check_client_crt.sh create mode 100644 cc-resource-pooling/teeproxy/libteecc/certs/check_client_key.sh create mode 100644 cc-resource-pooling/teeproxy/libteecc/certs/client_crt.pem create mode 100644 cc-resource-pooling/teeproxy/libteecc/certs/client_key.pem create mode 100644 cc-resource-pooling/teeproxy/libteecc/certs/gen_client_keycsr.sh create mode 100644 cc-resource-pooling/teeproxy/libteecc/certs/msg.txt create mode 100644 cc-resource-pooling/teeproxy/libteecc/changelog.md create mode 100644 cc-resource-pooling/teeproxy/libteecc/common.cmake create mode 100644 cc-resource-pooling/teeproxy/libteecc/conf/teecc_config.yaml create mode 100644 cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_api.h create mode 100644 cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_constants.h create mode 100644 cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_list.h create mode 100644 cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_log.h create mode 100644 cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_type.h create mode 100644 cc-resource-pooling/teeproxy/libteecc/include/teecc/teec_client_api.h create mode 100644 cc-resource-pooling/teeproxy/libteecc/protos/gt.proto create mode 100644 cc-resource-pooling/teeproxy/libteecc/teecc.cc create mode 100644 cc-resource-pooling/teeproxy/libteecc/teecc.h diff --git a/cc-resource-pooling/LICENSE b/cc-resource-pooling/LICENSE new file mode 100644 index 0000000..9e32cde --- /dev/null +++ b/cc-resource-pooling/LICENSE @@ -0,0 +1,127 @@ + 木兰宽松许可证, 第2版 + + 木兰宽松许可证, 第2版 + 2020年1月 http://license.coscl.org.cn/MulanPSL2 + + + 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + + 0. 定义 + + “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + + “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + + “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + + “法人实体”是指提交贡献的机构及其“关联实体”。 + + “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + + 1. 授予版权许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 + + 2. 授予专利许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 + + 3. 无商标许可 + + “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 + + 4. 分发限制 + + 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + + 5. 免责声明与责任限制 + + “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 + + 6. 语言 + “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 + + 条款结束 + + 如何将木兰宽松许可证,第2版,应用到您的软件 + + 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + + 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + + 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + + 3, 请将如下声明文本放入每个源文件的头部注释中。 + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. + + + Mulan Permissive Software License,Version 2 + + Mulan Permissive Software License,Version 2 (Mulan PSL v2) + January 2020 http://license.coscl.org.cn/MulanPSL2 + + Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: + + 0. Definition + + Software means the program and related documents which are licensed under this License and comprise all Contribution(s). + + Contribution means the copyrightable work licensed by a particular Contributor under this License. + + Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. + + Legal Entity means the entity making a Contribution and all its Affiliates. + + Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. + + 1. Grant of Copyright License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. + + 2. Grant of Patent License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. + + 3. No Trademark License + + No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. + + 4. Distribution Restriction + + You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. + + 5. Disclaimer of Warranty and Limitation of Liability + + THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + 6. Language + + THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. + + END OF THE TERMS AND CONDITIONS + + How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software + + To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: + + i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; + + ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; + + iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. + + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. diff --git a/cc-resource-pooling/README.md b/cc-resource-pooling/README.md new file mode 100644 index 0000000..c4c8912 --- /dev/null +++ b/cc-resource-pooling/README.md @@ -0,0 +1,34 @@ +# cc-resource-pooling + +#### 介绍 +项目(TEE GP Proxy)旨在通过资源池化TrustZone的算力,方便客户在云景中在鲲鹏机密计算的节点部署可信应用。 +详细内容可参考仓库中的设计文档。 + +#### 软件架构 +![TrustZone资源池架构](docs/pic/arch-II.png) + +本项目借助了gRPC这一字节流框架,扩展新创建了可部署在任意位置的GP(Globle Platform) API 库-下文称为GP Client,用于部署在云上的TrustZone的Client APP访问真实的TrustZone TEE。同时在Host上 新建了 GP API proxy,用于接收来自远程的CA的 GP API的调用。 + +GP Client用于序列化CA的GP接口调用,GP Proxy则收到调用合反序列化后,将GP调用转化为本地TEE Client接口调用。考虑到并发处理的情况,GP API Proxy可管理多任时的队列。 +使用此方法,解决在VM或Docker中穿透虚拟化层访问TEE驱动的问题。如果需要,你也可以进一步开发,将多泰山服务器集群化管理。 + + + +#### 安装教程 + +参考部署文档。 + +#### 使用说明 + +1. 本项目原项目中引入了Host端对客户端的认证机制,并在GP API 以及Service侧提供了透传JWT的API,JWT的获取以及确认需要应用实现; +2. 在配置gPRC时,建议启用TLS以及基于证书的双向认证,注意证书私钥为机密数据,在部署系统时需要考虑保护机制; +3. 本项目不包含其它开源项目的代码,涉及的第三方开源组件均需要使用者自行获取。 + + +#### 参与贡献 + + +#### 特技 +1. 项目提供接口与原接口完全适配,用户仅需更换libteec.so文件即可直接使用 +2. 增加了token验证机制,并添加了两个扩展程序,作为token验证的中间件 +3. 性能上相较于一期项目显著提升 diff --git a/cc-resource-pooling/demo/clientapp/parallel/p.sh b/cc-resource-pooling/demo/clientapp/parallel/p.sh new file mode 100644 index 0000000..de4f582 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/parallel/p.sh @@ -0,0 +1,17 @@ +# ! /bin/bash + +# set maximal number of parallel jobs +MAX_NUM_LCOUNT=100 +MAX_NUM_CCA=9 +# END_NUM=$(($MAX_NUM_CCA-1)) +END_NUM=$MAX_NUM_CCA + +if true; then +for ((LCOUNT = 0; LCOUNT < $MAX_NUM_LCOUNT; LCOUNT++)) +do + echo -e "\n"remove {}_$LCOUNT.log ::: $(eval echo "{1..$END_NUM}") + parallel -j $MAX_NUM_CCA rm "-f" {}_$LCOUNT.log ::: $(eval echo "{1..$END_NUM}") + parallel -j $MAX_NUM_CCA --ungroup bash ../testcase{}/build/test.sh "| tee" {}_$LCOUNT.log ::: $(eval echo "{1..$END_NUM}") + # parallel -j $MAX_NUM_CCA --ungroup ../testcase0/build/testcase "| tee" {}_$LCOUNT.log ::: $(eval echo "{0..$END_NUM}") +done +fi diff --git a/cc-resource-pooling/demo/clientapp/testcase1/CMakeLists.txt b/cc-resource-pooling/demo/clientapp/testcase1/CMakeLists.txt new file mode 100644 index 0000000..80b4384 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase1/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(testcase C CXX) + +# set(CMAKE_C_FLAGS "${CMAKE_}") +# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) + +# include_directories("${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(testcase testcase.c) +target_link_libraries( + testcase + pthread + libteecc.so + libdbusc_jwt.so +) diff --git a/cc-resource-pooling/demo/clientapp/testcase1/build/cmake.sh b/cc-resource-pooling/demo/clientapp/testcase1/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase1/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/demo/clientapp/testcase1/build/test.sh b/cc-resource-pooling/demo/clientapp/testcase1/build/test.sh new file mode 100644 index 0000000..c73734d --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase1/build/test.sh @@ -0,0 +1,11 @@ +CUR_DIR=$( dirname -- "$0"; ) + +${CUR_DIR}/testcase 1 +${CUR_DIR}/testcase 2 +${CUR_DIR}/testcase 3 +${CUR_DIR}/testcase 4 +# ${CUR_DIR}/testcase 5 +${CUR_DIR}/testcase 6 +${CUR_DIR}/testcase 7 +${CUR_DIR}/testcase 8 +${CUR_DIR}/testcase 9 diff --git a/cc-resource-pooling/demo/clientapp/testcase1/testcase.c b/cc-resource-pooling/demo/clientapp/testcase1/testcase.c new file mode 100644 index 0000000..6c4450a --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase1/testcase.c @@ -0,0 +1,1042 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo + */ + +#include "testcase.h" +#include +#include +#include +#include +#include +#include +// #include +// #include +// #include +// #include +#include +#include +#include +#include + +// #include "tee_client_api.h" +#include "teecc/teec_client_api.h" +#include "dbusc_jwt.h" + +#define TESTCASE 1 + +#if TESTCASE == 2 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} +}; +#elif TESTCASE == 3 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} +}; +#elif TESTCASE == 4 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} +}; +#elif TESTCASE == 5 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} +}; +#elif TESTCASE == 6 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} +}; +#elif TESTCASE == 7 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} +}; +#elif TESTCASE == 8 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} +}; +#elif TESTCASE == 9 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} +}; +#else +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} +}; +#endif + +static void DumpBuff(const char *buffer, size_t bufLen) +{ + size_t i; + if (buffer == NULL || bufLen == 0) + { + return; + } + + printf("\n--------------------------------------------------\n"); + printf("bufLen = %d\n", bufLen); + for (i = 0; i < bufLen; i++) + { + if (i % PRINTF_SIZE == 0) + { + printf("\n"); + } + printf("%02x ", *(buffer + i)); + } + printf("\n--------------------------------------------------\n"); + return; +} + +static TEEC_Result testcase_1() +{ + TEEC_Context context; + // uint64_t context_addr; + TEEC_Session session; + TEEC_Operation operation; + uint32_t origin; + TEEC_Result ret; + + //Interface_Function-001 + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; + + //Interface_Function-002 + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- no param + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- value param + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_A); + assert(operation.params[0].value.b == VALUE_B); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_B); + assert(operation.params[0].value.b == VALUE_A); + + // Interface_Function-003 -- temp buf param + char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + memset(tmpbuf, 0, TEMP_BUF_SIZE); + memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + //Interface_Function-004 + TEEC_CloseSession(&session); + //Interface_Function-005 + TEEC_FinalizeContext(&context); + if (!ret) + { + printf("interface_testcase pass\n"); + } + return ret; +} + +static void share_mem_test( + TEEC_Session *session, + TEEC_SharedMemory *sharebuf +) +{ + TEEC_Result ret; + TEEC_Operation operation; + uint32_t origin; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); +} + +static TEEC_Result testcase_2() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + char tmpbuf[TEMP_BUF_SIZE]; + uint32_t origin; + TEEC_Result ret; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; + + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Function-006 + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-011 + share_mem_test(&session, &sharebuf); + + // Interface_Function-008 + TEEC_ReleaseSharedMemory(&sharebuf); + + // Interface_Function-007 + memset(&sharebuf, 0, sizeof(sharebuf)); + sharebuf.buffer = tmpbuf; + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_RegisterSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-012 + share_mem_test(&session, &sharebuf); + + TEEC_ReleaseSharedMemory(&sharebuf); + +// exit: + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) + { + printf("sharemem_interface_testcase pass\n"); + } + return ret; +} + + +static void *thread_function(void *param) +{ + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + TEEC_Context *context = (TEEC_Context *) param; + pthread_t tid; + uint32_t origin; + struct timeval start, end, tokenset; + + tid = (pthread_t) pthread_self(); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) + { + printf("thread %u open session failed, ret=%x\n", tid, ret); + goto exit; + } + + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(context, &sharebuf); + if (ret) + { + printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); + goto exit; + } + + printf("begin multi-thread test, during %u\n", TEST_TIME); + gettimeofday(&start, NULL); + gettimeofday(&tokenset, NULL); + while (1) + { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); + memset(sharebuf.buffer, 0, sharebuf.size); + memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + operation.params[0].memref.parent = &sharebuf; + operation.params[1].value.a = 1; + + ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); + if (ret) + { + printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); + break; + } + + if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) + { + printf("thread %u get wrong comptue result.\n", tid); + break; + } + gettimeofday(&end, NULL); + if (end.tv_sec - start.tv_sec > TEST_TIME) + break; + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + + sleep(1); + } + + TEEC_CloseSession(&session); + exit: + return (void *) ret; +} + +static TEEC_Result testcase_3() +{ + TEEC_Result ret; + TEEC_Operation operation; + TEEC_Context context; + pthread_t tid[THREAD_COUNT]; + void *thread_ret = NULL; + uint32_t i; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; + + for (i = 0; i < THREAD_COUNT; i++) + { + pthread_create(&tid[i], NULL, thread_function, (void *) &context); + } + + for (i = 0; i < THREAD_COUNT; i++) + { + pthread_join(tid[i], &thread_ret); + if ((TEEC_Result) thread_ret != TEEC_SUCCESS) + { + printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result) thread_ret); + ret = TEEC_FAIL; + } + } + + exit: + TEEC_FinalizeContext(&context); + if (!ret) + { + printf("multi_thread_testcase pass\n"); + } + return ret; +} + + +// Exception Test +static TEEC_Result testcase_4() +{ +#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharemem; + uint32_t origin; + + // Interface_Exception_001ll + ret = TEEC_InitializeContext(NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + + // Interface_Exception_002 + ret = TEEC_OpenSession(NULL, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + context.ta_path = (uint8_t *) "/data/not_found.sec"; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); + // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); + printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); + assert(ret); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Exception_003 + ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + session.session_id++; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_ACCESS_DENIED); + assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); + + session.session_id--; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = &sharemem; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(ret); + + ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); + assert(!ret); + + // Interface_Exception_004 + TEEC_CloseSession(NULL); + + // Interface_Exception_005 + TEEC_FinalizeContext(NULL); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) + { + printf("exception_testcase pass\n"); + } + return ret; +} + +static TEEC_Result testcase_5() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // CA_KILL_Test_001 + printf("CA Killed Test begin!, process exit!\n"); + exit(0); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_6() +{ + TEEC_Context context; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) + { + gettimeofday(&start, NULL); + ret = TEEC_InitializeContext(NULL, &context); + gettimeofday(&end, NULL); + if (ret) + { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_FinalizeContext(&context); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) + { + printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); + } + return ret; +} + +static TEEC_Result testcase_7() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) + { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) + { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + gettimeofday(&start, NULL); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) + { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_CloseSession(&session); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) + { + printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); + } + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_8(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) + { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) + { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) + { + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + gettimeofday(&start, NULL); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) + { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) + { + printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); + } + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result RsaSignCmd(char *msgBuf, uint32_t msgLen, char *signBuf, uint32_t *bufLen, + TEEC_Session *session) +{ + TEEC_Operation operation; + TEEC_Result result; + uint32_t origin; + + if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) + { + TEEC_Error("invoke RsaSignCmd has wrong params."); + return (TEEC_Result) RSA_INPUT_ERROR_PARAMETER; + } + + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES( + TEEC_VALUE_INPUT, + TEEC_NONE, + TEEC_MEMREF_TEMP_INPUT, + TEEC_MEMREF_TEMP_OUTPUT); + + operation.params[0].value.a = RSA_KEY_1; + operation.params[0].value.b = RSA_ALG_PSS_SHA256; + operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; + operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; + operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; + operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; + + result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); + if (result != TEEC_SUCCESS) + { + TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); + } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) + { + TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", + operation.params[PARAMS_INDEX_3].tmpref.size); + } else + { + printf("signBuf is : \n"); + DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); + *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; + } + + return result; +} + +static TEEC_Result testcase_9(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + char msgBuf[RSA_KEY_SIZE] = {0}; + char signature[RSA_KEY_SIZE] = {0}; + uint32_t bufLen = RSA_KEY_SIZE; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) + { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) + { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); + printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_10(void) +{ + + TEEC_Result ret; + char infile_path[1024]; + char *subdir = "testcase"; + memset(infile_path, 0, sizeof(infile_path)); + //basic_function + sprintf(infile_path, + "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", + TESTCASE, TESTCASE); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta(size <= 1M) failed. \n"); + return ret; + } else + { + printf("Deploy ta(size <= 1M) succed. \n"); + } + //8M_TA_TEST + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase1/8M_TA_TEST.sec"); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta(size = 8M) failed. \n", TESTCASE); + return ret; + } else + { + printf("Deploy ta(size = 8M) succed. \n", TESTCASE); + } + + //TA_NOT_FOUND + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase1/not_found.sec"); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret == TEEC_INFILE_NOT_FOUND) + { + printf("Deploy ta not found test success\n"); + } else + { + printf("Deploy TA not found test failed \n"); + return ret; + } + + //outfile_path_not_exist + subdir = "not_exist_path"; + sprintf(infile_path, + "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", + TESTCASE, TESTCASE); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta outfile_path_not_exist failed. \n"); + return ret; + } else + { + printf("Deploy ta outfile_path_not_exist succed. \n"); + } + + return ret; +} + +void help_print(void) +{ + printf("Usage: \n \ + 1.function_interface_testcase\n \ + 2.sharemem_interface_testcase\n \ + 3.multi_thread_testcase\n \ + 4.exception_testcase\n \ + 5.client_killed_testcase\n \ + 6.TEEC_InitializeContext perform-test\n \ + 7.TEEC_OpenSession perform-test\n \ + 8.TEEC_InvokeCommand perform-test\n \ + 9.RSA Sign test\n"); +} + +int main(int argc, char **argv) +{ + TEEC_Result ret; + struct timeval start, end; + gettimeofday(&start, NULL); + int choice = -1; + + if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) + { + help_print(); + return 1; + } + +#if 0 + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + return 0; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + return 0; + } + printf("Token set succed. \n"); +#endif + +#if 1 + ret = + TEEC_UnsetJwt( + ); + if (ret != TEEC_SUCCESS) + { + printf("Token unset failed. \n"); + return 0; + } + printf("Token unset succed. \n"); +#endif + + char infile_path[1024]; + char *subdir = "testcase"; + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, + "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", + TESTCASE, TESTCASE); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", TESTCASE); + return 0; + } else + { + printf("Deploy ta %d succed. \n", TESTCASE); + } + + /* + for (int ita = 1; ita < 10; ita ++) + { + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", ita); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", ita); + } + } + */ + + choice = atoi(argv[1]); + + switch (choice) + { + case 1: + ret = testcase_1(); + break; + case 2: + ret = testcase_2(); + break; + case 3: + ret = testcase_3(); + break; + case 4: + ret = testcase_4(); + break; + case 5: + ret = testcase_5(); + break; + case 6: + ret = testcase_6(); + break; + case 7: + ret = testcase_7(); + break; + case 8: + ret = testcase_8(); + break; + case 9: + ret = testcase_9(); + break; + case 10: + ret = testcase_10(); + break; + default: + printf("Error: invalid choice!\n"); + help_print(); + ret = -1; + break; + } + + return ret; +} diff --git a/cc-resource-pooling/demo/clientapp/testcase1/testcase.h b/cc-resource-pooling/demo/clientapp/testcase1/testcase.h new file mode 100644 index 0000000..7ced8e2 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase1/testcase.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo CA application header file + */ + +#ifndef __MULTI_CORE_CA_H +#define __MULTI_CORE_CA_H + +// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" + +#define VALUE_A 55 +#define VALUE_B 33 +#define REE_TEMP_BUF "hello tee" +#define TEE_TEMP_BUF "hello ree" +#define TEMP_BUF_SIZE 20 +#define THREAD_COUNT 3 + +#define TEST_TIME 10 * 6 +#define EXPIRE_TIME 10 * 6 * 5 + +#define RSA_KEY_SIZE 256 // 2048bits +#define RSA_MASSAGE_SIZE 100 +#define RSA_INPUT_ERROR_PARAMETER 0x10000001 +#define RSA_KEY_1 1 +#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign + +#define PARAMS_INDEX_2 2 // params参数的下标索引 2 +#define PARAMS_INDEX_3 3 // params参数的下标索引 3 +#define PRINTF_SIZE 32 + +enum { + CMD_NULL = 0, + CMD_SHARE_MEM_FULL, + CMD_SHARE_MEM_PATR, + CMD_MUL_THREAD, + CMD_SIGN_PSS_MGF1_SHA256, +}; + +#endif diff --git a/cc-resource-pooling/demo/clientapp/testcase2/CMakeLists.txt b/cc-resource-pooling/demo/clientapp/testcase2/CMakeLists.txt new file mode 100644 index 0000000..80b4384 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase2/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(testcase C CXX) + +# set(CMAKE_C_FLAGS "${CMAKE_}") +# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) + +# include_directories("${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(testcase testcase.c) +target_link_libraries( + testcase + pthread + libteecc.so + libdbusc_jwt.so +) diff --git a/cc-resource-pooling/demo/clientapp/testcase2/build/cmake.sh b/cc-resource-pooling/demo/clientapp/testcase2/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase2/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/demo/clientapp/testcase2/build/test.sh b/cc-resource-pooling/demo/clientapp/testcase2/build/test.sh new file mode 100644 index 0000000..c73734d --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase2/build/test.sh @@ -0,0 +1,11 @@ +CUR_DIR=$( dirname -- "$0"; ) + +${CUR_DIR}/testcase 1 +${CUR_DIR}/testcase 2 +${CUR_DIR}/testcase 3 +${CUR_DIR}/testcase 4 +# ${CUR_DIR}/testcase 5 +${CUR_DIR}/testcase 6 +${CUR_DIR}/testcase 7 +${CUR_DIR}/testcase 8 +${CUR_DIR}/testcase 9 diff --git a/cc-resource-pooling/demo/clientapp/testcase2/testcase.c b/cc-resource-pooling/demo/clientapp/testcase2/testcase.c new file mode 100644 index 0000000..9082b63 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase2/testcase.c @@ -0,0 +1,941 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo + */ + +#include "testcase.h" +#include +#include +#include +#include +#include +#include +// #include +// #include +// #include +// #include +#include +#include +#include +#include + +// #include "tee_client_api.h" +#include "teecc/teec_client_api.h" +#include "dbusc_jwt.h" + +#define TESTCASE 2 + +#if TESTCASE == 2 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} +}; +#elif TESTCASE == 3 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} +}; +#elif TESTCASE == 4 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} +}; +#elif TESTCASE == 5 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} +}; +#elif TESTCASE == 6 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} +}; +#elif TESTCASE == 7 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} +}; +#elif TESTCASE == 8 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} +}; +#elif TESTCASE == 9 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} +}; +#else +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} +}; +#endif + +static void DumpBuff(const char *buffer, size_t bufLen) +{ + size_t i; + if (buffer == NULL || bufLen == 0) { + return; + } + + printf("\n--------------------------------------------------\n"); + printf("bufLen = %d\n", bufLen); + for (i = 0; i < bufLen; i++) { + if (i % PRINTF_SIZE == 0) { + printf("\n"); + } + printf("%02x ", *(buffer + i)); + } + printf("\n--------------------------------------------------\n"); + return; +} + +static TEEC_Result testcase_1() +{ + TEEC_Context context; + // uint64_t context_addr; + TEEC_Session session; + TEEC_Operation operation; + uint32_t origin; + TEEC_Result ret; + + //Interface_Function-001 + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + //Interface_Function-002 + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- no param + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- value param + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_A); + assert(operation.params[0].value.b == VALUE_B); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_B); + assert(operation.params[0].value.b == VALUE_A); + + // Interface_Function-003 -- temp buf param + char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + memset(tmpbuf, 0, TEMP_BUF_SIZE); + memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + //Interface_Function-004 + TEEC_CloseSession(&session); + //Interface_Function-005 + TEEC_FinalizeContext(&context); + if (!ret) { + printf("interface_testcase pass\n"); + } + return ret; +} + +static void share_mem_test( + TEEC_Session *session, + TEEC_SharedMemory *sharebuf +) +{ + TEEC_Result ret; + TEEC_Operation operation; + uint32_t origin; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); +} + +static TEEC_Result testcase_2() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + char tmpbuf[TEMP_BUF_SIZE]; + uint32_t origin; + TEEC_Result ret; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Function-006 + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-011 + share_mem_test(&session, &sharebuf); + + // Interface_Function-008 + TEEC_ReleaseSharedMemory(&sharebuf); + + // Interface_Function-007 + memset(&sharebuf, 0, sizeof(sharebuf)); + sharebuf.buffer = tmpbuf; + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_RegisterSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-012 + share_mem_test(&session, &sharebuf); + + TEEC_ReleaseSharedMemory(&sharebuf); + +// exit: + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("sharemem_interface_testcase pass\n"); + } + return ret; +} + + +static void *thread_function(void *param) +{ + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + TEEC_Context *context = (TEEC_Context *)param; + pthread_t tid; + uint32_t origin; + struct timeval start, end, tokenset; + + tid = (pthread_t)pthread_self(); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("thread %u open session failed, ret=%x\n", tid, ret); + goto exit; + } + + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(context, &sharebuf); + if (ret) { + printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); + goto exit; + } + + printf("begin multi-thread test, during %u\n", TEST_TIME); + gettimeofday(&start, NULL); + gettimeofday(&tokenset, NULL); + while (1) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); + memset(sharebuf.buffer, 0, sharebuf.size); + memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + operation.params[0].memref.parent = &sharebuf; + operation.params[1].value.a = 1; + + ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); + if (ret) { + printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); + break; + } + + if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { + printf("thread %u get wrong comptue result.\n", tid); + break; + } + gettimeofday(&end, NULL); + if (end.tv_sec - start.tv_sec > TEST_TIME) + break; + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + + sleep(1); + } + + TEEC_CloseSession(&session); +exit: + return (void *)ret; +} + +static TEEC_Result testcase_3() +{ + TEEC_Result ret; + TEEC_Operation operation; + TEEC_Context context; + pthread_t tid[THREAD_COUNT]; + void *thread_ret = NULL; + uint32_t i; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_create(&tid[i], NULL, thread_function, (void *)&context); + } + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_join(tid[i], &thread_ret); + if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { + printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); + ret = TEEC_FAIL; + } + } + +exit: + TEEC_FinalizeContext(&context); + if (!ret) { + printf("multi_thread_testcase pass\n"); + } + return ret; +} + + +// Exception Test +static TEEC_Result testcase_4() +{ +#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharemem; + uint32_t origin; + + // Interface_Exception_001ll + ret = TEEC_InitializeContext(NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + + // Interface_Exception_002 + ret = TEEC_OpenSession(NULL, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + context.ta_path = (uint8_t *)"/data/not_found.sec"; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); + // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); + printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); + assert(ret); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Exception_003 + ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + session.session_id++; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_ACCESS_DENIED); + assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); + + session.session_id--; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = &sharemem; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(ret); + + ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); + assert(!ret); + + // Interface_Exception_004 + TEEC_CloseSession(NULL); + + // Interface_Exception_005 + TEEC_FinalizeContext(NULL); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("exception_testcase pass\n"); + } + return ret; +} + +static TEEC_Result testcase_5() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // CA_KILL_Test_001 + printf("CA Killed Test begin!, process exit!\n"); + exit(0); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_6() +{ + TEEC_Context context; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + gettimeofday(&start, NULL); + ret = TEEC_InitializeContext(NULL, &context); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_FinalizeContext(&context); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); + } + return ret; +} + +static TEEC_Result testcase_7() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + gettimeofday(&start, NULL); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_CloseSession(&session); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); + } + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_8(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + gettimeofday(&start, NULL); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); + } + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, + TEEC_Session *session) +{ + TEEC_Operation operation; + TEEC_Result result; + uint32_t origin; + + if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { + TEEC_Error("invoke RsaSignCmd has wrong params."); + return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; + } + + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES( + TEEC_VALUE_INPUT, + TEEC_NONE, + TEEC_MEMREF_TEMP_INPUT, + TEEC_MEMREF_TEMP_OUTPUT); + + operation.params[0].value.a = RSA_KEY_1; + operation.params[0].value.b = RSA_ALG_PSS_SHA256; + operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; + operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; + operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; + operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; + + result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); + if (result != TEEC_SUCCESS) { + TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); + } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { + TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", + operation.params[PARAMS_INDEX_3].tmpref.size); + } else { + printf("signBuf is : \n"); + DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); + *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; + } + + return result; +} + +static TEEC_Result testcase_9(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + char msgBuf[RSA_KEY_SIZE] = {0}; + char signature[RSA_KEY_SIZE] = {0}; + uint32_t bufLen = RSA_KEY_SIZE; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); + printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +void help_print(void) +{ + printf("Usage: \n \ + 1.function_interface_testcase\n \ + 2.sharemem_interface_testcase\n \ + 3.multi_thread_testcase\n \ + 4.exception_testcase\n \ + 5.client_killed_testcase\n \ + 6.TEEC_InitializeContext perform-test\n \ + 7.TEEC_OpenSession perform-test\n \ + 8.TEEC_InvokeCommand perform-test\n \ + 9.RSA Sign test\n"); +} + +int main(int argc, char **argv) +{ + TEEC_Result ret; + struct timeval start, end; + gettimeofday(&start, NULL); + int choice = -1; + + if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { + help_print(); + return 1; + } + +#if 0 + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + return 0; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + return 0; + } + printf("Token set succed. \n"); +#endif + +#if 1 + ret = + TEEC_UnsetJwt( + ); + if (ret != TEEC_SUCCESS) + { + printf("Token unset failed. \n"); + return 0; + } + printf("Token unset succed. \n"); +#endif + + char infile_path[1024]; + char * subdir = "testcase"; + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", TESTCASE); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", TESTCASE); + } + + /* + for (int ita = 1; ita < 10; ita ++) + { + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", ita); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", ita); + } + } + */ + + choice = atoi(argv[1]); + + switch (choice) { + case 1: + ret = testcase_1(); + break; + case 2: + ret = testcase_2(); + break; + case 3: + ret = testcase_3(); + break; + case 4: + ret = testcase_4(); + break; + case 5: + ret = testcase_5(); + break; + case 6: + ret = testcase_6(); + break; + case 7: + ret = testcase_7(); + break; + case 8: + ret = testcase_8(); + break; + case 9: + ret = testcase_9(); + break; + default: + printf("Error: invalid choice!\n"); + help_print(); + ret = -1; + break; + } + + return ret; +} diff --git a/cc-resource-pooling/demo/clientapp/testcase2/testcase.h b/cc-resource-pooling/demo/clientapp/testcase2/testcase.h new file mode 100644 index 0000000..7ced8e2 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase2/testcase.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo CA application header file + */ + +#ifndef __MULTI_CORE_CA_H +#define __MULTI_CORE_CA_H + +// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" + +#define VALUE_A 55 +#define VALUE_B 33 +#define REE_TEMP_BUF "hello tee" +#define TEE_TEMP_BUF "hello ree" +#define TEMP_BUF_SIZE 20 +#define THREAD_COUNT 3 + +#define TEST_TIME 10 * 6 +#define EXPIRE_TIME 10 * 6 * 5 + +#define RSA_KEY_SIZE 256 // 2048bits +#define RSA_MASSAGE_SIZE 100 +#define RSA_INPUT_ERROR_PARAMETER 0x10000001 +#define RSA_KEY_1 1 +#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign + +#define PARAMS_INDEX_2 2 // params参数的下标索引 2 +#define PARAMS_INDEX_3 3 // params参数的下标索引 3 +#define PRINTF_SIZE 32 + +enum { + CMD_NULL = 0, + CMD_SHARE_MEM_FULL, + CMD_SHARE_MEM_PATR, + CMD_MUL_THREAD, + CMD_SIGN_PSS_MGF1_SHA256, +}; + +#endif diff --git a/cc-resource-pooling/demo/clientapp/testcase3/CMakeLists.txt b/cc-resource-pooling/demo/clientapp/testcase3/CMakeLists.txt new file mode 100644 index 0000000..80b4384 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase3/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(testcase C CXX) + +# set(CMAKE_C_FLAGS "${CMAKE_}") +# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) + +# include_directories("${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(testcase testcase.c) +target_link_libraries( + testcase + pthread + libteecc.so + libdbusc_jwt.so +) diff --git a/cc-resource-pooling/demo/clientapp/testcase3/build/cmake.sh b/cc-resource-pooling/demo/clientapp/testcase3/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase3/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/demo/clientapp/testcase3/build/test.sh b/cc-resource-pooling/demo/clientapp/testcase3/build/test.sh new file mode 100644 index 0000000..c73734d --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase3/build/test.sh @@ -0,0 +1,11 @@ +CUR_DIR=$( dirname -- "$0"; ) + +${CUR_DIR}/testcase 1 +${CUR_DIR}/testcase 2 +${CUR_DIR}/testcase 3 +${CUR_DIR}/testcase 4 +# ${CUR_DIR}/testcase 5 +${CUR_DIR}/testcase 6 +${CUR_DIR}/testcase 7 +${CUR_DIR}/testcase 8 +${CUR_DIR}/testcase 9 diff --git a/cc-resource-pooling/demo/clientapp/testcase3/testcase.c b/cc-resource-pooling/demo/clientapp/testcase3/testcase.c new file mode 100644 index 0000000..918b48d --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase3/testcase.c @@ -0,0 +1,941 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo + */ + +#include "testcase.h" +#include +#include +#include +#include +#include +#include +// #include +// #include +// #include +// #include +#include +#include +#include +#include + +// #include "tee_client_api.h" +#include "teecc/teec_client_api.h" +#include "dbusc_jwt.h" + +#define TESTCASE 3 + +#if TESTCASE == 2 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} +}; +#elif TESTCASE == 3 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} +}; +#elif TESTCASE == 4 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} +}; +#elif TESTCASE == 5 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} +}; +#elif TESTCASE == 6 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} +}; +#elif TESTCASE == 7 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} +}; +#elif TESTCASE == 8 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} +}; +#elif TESTCASE == 9 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} +}; +#else +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} +}; +#endif + +static void DumpBuff(const char *buffer, size_t bufLen) +{ + size_t i; + if (buffer == NULL || bufLen == 0) { + return; + } + + printf("\n--------------------------------------------------\n"); + printf("bufLen = %d\n", bufLen); + for (i = 0; i < bufLen; i++) { + if (i % PRINTF_SIZE == 0) { + printf("\n"); + } + printf("%02x ", *(buffer + i)); + } + printf("\n--------------------------------------------------\n"); + return; +} + +static TEEC_Result testcase_1() +{ + TEEC_Context context; + // uint64_t context_addr; + TEEC_Session session; + TEEC_Operation operation; + uint32_t origin; + TEEC_Result ret; + + //Interface_Function-001 + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + //Interface_Function-002 + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- no param + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- value param + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_A); + assert(operation.params[0].value.b == VALUE_B); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_B); + assert(operation.params[0].value.b == VALUE_A); + + // Interface_Function-003 -- temp buf param + char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + memset(tmpbuf, 0, TEMP_BUF_SIZE); + memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + //Interface_Function-004 + TEEC_CloseSession(&session); + //Interface_Function-005 + TEEC_FinalizeContext(&context); + if (!ret) { + printf("interface_testcase pass\n"); + } + return ret; +} + +static void share_mem_test( + TEEC_Session *session, + TEEC_SharedMemory *sharebuf +) +{ + TEEC_Result ret; + TEEC_Operation operation; + uint32_t origin; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); +} + +static TEEC_Result testcase_2() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + char tmpbuf[TEMP_BUF_SIZE]; + uint32_t origin; + TEEC_Result ret; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Function-006 + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-011 + share_mem_test(&session, &sharebuf); + + // Interface_Function-008 + TEEC_ReleaseSharedMemory(&sharebuf); + + // Interface_Function-007 + memset(&sharebuf, 0, sizeof(sharebuf)); + sharebuf.buffer = tmpbuf; + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_RegisterSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-012 + share_mem_test(&session, &sharebuf); + + TEEC_ReleaseSharedMemory(&sharebuf); + +// exit: + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("sharemem_interface_testcase pass\n"); + } + return ret; +} + + +static void *thread_function(void *param) +{ + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + TEEC_Context *context = (TEEC_Context *)param; + pthread_t tid; + uint32_t origin; + struct timeval start, end, tokenset; + + tid = (pthread_t)pthread_self(); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("thread %u open session failed, ret=%x\n", tid, ret); + goto exit; + } + + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(context, &sharebuf); + if (ret) { + printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); + goto exit; + } + + printf("begin multi-thread test, during %u\n", TEST_TIME); + gettimeofday(&start, NULL); + gettimeofday(&tokenset, NULL); + while (1) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); + memset(sharebuf.buffer, 0, sharebuf.size); + memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + operation.params[0].memref.parent = &sharebuf; + operation.params[1].value.a = 1; + + ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); + if (ret) { + printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); + break; + } + + if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { + printf("thread %u get wrong comptue result.\n", tid); + break; + } + gettimeofday(&end, NULL); + if (end.tv_sec - start.tv_sec > TEST_TIME) + break; + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + + sleep(1); + } + + TEEC_CloseSession(&session); +exit: + return (void *)ret; +} + +static TEEC_Result testcase_3() +{ + TEEC_Result ret; + TEEC_Operation operation; + TEEC_Context context; + pthread_t tid[THREAD_COUNT]; + void *thread_ret = NULL; + uint32_t i; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_create(&tid[i], NULL, thread_function, (void *)&context); + } + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_join(tid[i], &thread_ret); + if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { + printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); + ret = TEEC_FAIL; + } + } + +exit: + TEEC_FinalizeContext(&context); + if (!ret) { + printf("multi_thread_testcase pass\n"); + } + return ret; +} + + +// Exception Test +static TEEC_Result testcase_4() +{ +#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharemem; + uint32_t origin; + + // Interface_Exception_001ll + ret = TEEC_InitializeContext(NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + + // Interface_Exception_002 + ret = TEEC_OpenSession(NULL, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + context.ta_path = (uint8_t *)"/data/not_found.sec"; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); + // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); + printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); + assert(ret); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Exception_003 + ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + session.session_id++; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_ACCESS_DENIED); + assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); + + session.session_id--; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = &sharemem; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(ret); + + ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); + assert(!ret); + + // Interface_Exception_004 + TEEC_CloseSession(NULL); + + // Interface_Exception_005 + TEEC_FinalizeContext(NULL); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("exception_testcase pass\n"); + } + return ret; +} + +static TEEC_Result testcase_5() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // CA_KILL_Test_001 + printf("CA Killed Test begin!, process exit!\n"); + exit(0); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_6() +{ + TEEC_Context context; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + gettimeofday(&start, NULL); + ret = TEEC_InitializeContext(NULL, &context); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_FinalizeContext(&context); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); + } + return ret; +} + +static TEEC_Result testcase_7() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + gettimeofday(&start, NULL); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_CloseSession(&session); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); + } + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_8(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + gettimeofday(&start, NULL); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); + } + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, + TEEC_Session *session) +{ + TEEC_Operation operation; + TEEC_Result result; + uint32_t origin; + + if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { + TEEC_Error("invoke RsaSignCmd has wrong params."); + return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; + } + + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES( + TEEC_VALUE_INPUT, + TEEC_NONE, + TEEC_MEMREF_TEMP_INPUT, + TEEC_MEMREF_TEMP_OUTPUT); + + operation.params[0].value.a = RSA_KEY_1; + operation.params[0].value.b = RSA_ALG_PSS_SHA256; + operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; + operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; + operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; + operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; + + result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); + if (result != TEEC_SUCCESS) { + TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); + } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { + TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", + operation.params[PARAMS_INDEX_3].tmpref.size); + } else { + printf("signBuf is : \n"); + DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); + *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; + } + + return result; +} + +static TEEC_Result testcase_9(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + char msgBuf[RSA_KEY_SIZE] = {0}; + char signature[RSA_KEY_SIZE] = {0}; + uint32_t bufLen = RSA_KEY_SIZE; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); + printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +void help_print(void) +{ + printf("Usage: \n \ + 1.function_interface_testcase\n \ + 2.sharemem_interface_testcase\n \ + 3.multi_thread_testcase\n \ + 4.exception_testcase\n \ + 5.client_killed_testcase\n \ + 6.TEEC_InitializeContext perform-test\n \ + 7.TEEC_OpenSession perform-test\n \ + 8.TEEC_InvokeCommand perform-test\n \ + 9.RSA Sign test\n"); +} + +int main(int argc, char **argv) +{ + TEEC_Result ret; + struct timeval start, end; + gettimeofday(&start, NULL); + int choice = -1; + + if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { + help_print(); + return 1; + } + +#if 0 + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + return 0; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + return 0; + } + printf("Token set succed. \n"); +#endif + +#if 1 + ret = + TEEC_UnsetJwt( + ); + if (ret != TEEC_SUCCESS) + { + printf("Token unset failed. \n"); + return 0; + } + printf("Token unset succed. \n"); +#endif + + char infile_path[1024]; + char * subdir = "testcase"; + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", TESTCASE); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", TESTCASE); + } + + /* + for (int ita = 1; ita < 10; ita ++) + { + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", ita); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", ita); + } + } + */ + + choice = atoi(argv[1]); + + switch (choice) { + case 1: + ret = testcase_1(); + break; + case 2: + ret = testcase_2(); + break; + case 3: + ret = testcase_3(); + break; + case 4: + ret = testcase_4(); + break; + case 5: + ret = testcase_5(); + break; + case 6: + ret = testcase_6(); + break; + case 7: + ret = testcase_7(); + break; + case 8: + ret = testcase_8(); + break; + case 9: + ret = testcase_9(); + break; + default: + printf("Error: invalid choice!\n"); + help_print(); + ret = -1; + break; + } + + return ret; +} diff --git a/cc-resource-pooling/demo/clientapp/testcase3/testcase.h b/cc-resource-pooling/demo/clientapp/testcase3/testcase.h new file mode 100644 index 0000000..7ced8e2 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase3/testcase.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo CA application header file + */ + +#ifndef __MULTI_CORE_CA_H +#define __MULTI_CORE_CA_H + +// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" + +#define VALUE_A 55 +#define VALUE_B 33 +#define REE_TEMP_BUF "hello tee" +#define TEE_TEMP_BUF "hello ree" +#define TEMP_BUF_SIZE 20 +#define THREAD_COUNT 3 + +#define TEST_TIME 10 * 6 +#define EXPIRE_TIME 10 * 6 * 5 + +#define RSA_KEY_SIZE 256 // 2048bits +#define RSA_MASSAGE_SIZE 100 +#define RSA_INPUT_ERROR_PARAMETER 0x10000001 +#define RSA_KEY_1 1 +#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign + +#define PARAMS_INDEX_2 2 // params参数的下标索引 2 +#define PARAMS_INDEX_3 3 // params参数的下标索引 3 +#define PRINTF_SIZE 32 + +enum { + CMD_NULL = 0, + CMD_SHARE_MEM_FULL, + CMD_SHARE_MEM_PATR, + CMD_MUL_THREAD, + CMD_SIGN_PSS_MGF1_SHA256, +}; + +#endif diff --git a/cc-resource-pooling/demo/clientapp/testcase4/CMakeLists.txt b/cc-resource-pooling/demo/clientapp/testcase4/CMakeLists.txt new file mode 100644 index 0000000..80b4384 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase4/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(testcase C CXX) + +# set(CMAKE_C_FLAGS "${CMAKE_}") +# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) + +# include_directories("${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(testcase testcase.c) +target_link_libraries( + testcase + pthread + libteecc.so + libdbusc_jwt.so +) diff --git a/cc-resource-pooling/demo/clientapp/testcase4/build/cmake.sh b/cc-resource-pooling/demo/clientapp/testcase4/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase4/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/demo/clientapp/testcase4/build/test.sh b/cc-resource-pooling/demo/clientapp/testcase4/build/test.sh new file mode 100644 index 0000000..c73734d --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase4/build/test.sh @@ -0,0 +1,11 @@ +CUR_DIR=$( dirname -- "$0"; ) + +${CUR_DIR}/testcase 1 +${CUR_DIR}/testcase 2 +${CUR_DIR}/testcase 3 +${CUR_DIR}/testcase 4 +# ${CUR_DIR}/testcase 5 +${CUR_DIR}/testcase 6 +${CUR_DIR}/testcase 7 +${CUR_DIR}/testcase 8 +${CUR_DIR}/testcase 9 diff --git a/cc-resource-pooling/demo/clientapp/testcase4/testcase.c b/cc-resource-pooling/demo/clientapp/testcase4/testcase.c new file mode 100644 index 0000000..44498ac --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase4/testcase.c @@ -0,0 +1,940 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo + */ + +#include "testcase.h" +#include +#include +#include +#include +#include +#include +// #include +// #include +// #include +// #include +#include +#include +#include +#include + +// #include "tee_client_api.h" +#include "teecc/teec_client_api.h" +#include "dbusc_jwt.h" + +#define TESTCASE 4 + +#if TESTCASE == 2 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} +}; +#elif TESTCASE == 3 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} +}; +#elif TESTCASE == 4 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} +}; +#elif TESTCASE == 5 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} +}; +#elif TESTCASE == 6 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} +}; +#elif TESTCASE == 7 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} +}; +#elif TESTCASE == 8 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} +}; +#elif TESTCASE == 9 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} +}; +#else +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} +}; +#endif + +static void DumpBuff(const char *buffer, size_t bufLen) +{ + size_t i; + if (buffer == NULL || bufLen == 0) { + return; + } + + printf("\n--------------------------------------------------\n"); + printf("bufLen = %d\n", bufLen); + for (i = 0; i < bufLen; i++) { + if (i % PRINTF_SIZE == 0) { + printf("\n"); + } + printf("%02x ", *(buffer + i)); + } + printf("\n--------------------------------------------------\n"); + return; +} + +static TEEC_Result testcase_1() +{ + TEEC_Context context; + // uint64_t context_addr; + TEEC_Session session; + TEEC_Operation operation; + uint32_t origin; + TEEC_Result ret; + + //Interface_Function-001 + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + //Interface_Function-002 + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- no param + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- value param + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_A); + assert(operation.params[0].value.b == VALUE_B); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_B); + assert(operation.params[0].value.b == VALUE_A); + + // Interface_Function-003 -- temp buf param + char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + memset(tmpbuf, 0, TEMP_BUF_SIZE); + memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + //Interface_Function-004 + TEEC_CloseSession(&session); + //Interface_Function-005 + TEEC_FinalizeContext(&context); + if (!ret) { + printf("interface_testcase pass\n"); + } + return ret; +} + +static void share_mem_test( + TEEC_Session *session, + TEEC_SharedMemory *sharebuf +) +{ + TEEC_Result ret; + TEEC_Operation operation; + uint32_t origin; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); +} + +static TEEC_Result testcase_2() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + char tmpbuf[TEMP_BUF_SIZE]; + uint32_t origin; + TEEC_Result ret; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Function-006 + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-011 + share_mem_test(&session, &sharebuf); + + // Interface_Function-008 + TEEC_ReleaseSharedMemory(&sharebuf); + + // Interface_Function-007 + memset(&sharebuf, 0, sizeof(sharebuf)); + sharebuf.buffer = tmpbuf; + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_RegisterSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-012 + share_mem_test(&session, &sharebuf); + + TEEC_ReleaseSharedMemory(&sharebuf); + +// exit: + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("sharemem_interface_testcase pass\n"); + } + return ret; +} + + +static void *thread_function(void *param) +{ + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + TEEC_Context *context = (TEEC_Context *)param; + pthread_t tid; + uint32_t origin; + struct timeval start, end, tokenset; + + tid = (pthread_t)pthread_self(); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("thread %u open session failed, ret=%x\n", tid, ret); + goto exit; + } + + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(context, &sharebuf); + if (ret) { + printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); + goto exit; + } + + printf("begin multi-thread test, during %u\n", TEST_TIME); + gettimeofday(&start, NULL); + gettimeofday(&tokenset, NULL); + while (1) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); + memset(sharebuf.buffer, 0, sharebuf.size); + memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + operation.params[0].memref.parent = &sharebuf; + operation.params[1].value.a = 1; + + ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); + if (ret) { + printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); + break; + } + + if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { + printf("thread %u get wrong comptue result.\n", tid); + break; + } + gettimeofday(&end, NULL); + if (end.tv_sec - start.tv_sec > TEST_TIME) + break; + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + + sleep(1); + } + + TEEC_CloseSession(&session); +exit: + return (void *)ret; +} + +static TEEC_Result testcase_3() +{ + TEEC_Result ret; + TEEC_Operation operation; + TEEC_Context context; + pthread_t tid[THREAD_COUNT]; + void *thread_ret = NULL; + uint32_t i; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_create(&tid[i], NULL, thread_function, (void *)&context); + } + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_join(tid[i], &thread_ret); + if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { + printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); + ret = TEEC_FAIL; + } + } + +exit: + TEEC_FinalizeContext(&context); + if (!ret) { + printf("multi_thread_testcase pass\n"); + } + return ret; +} + + +// Exception Test +static TEEC_Result testcase_4() +{ +#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharemem; + uint32_t origin; + + // Interface_Exception_001ll + ret = TEEC_InitializeContext(NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + + // Interface_Exception_002 + ret = TEEC_OpenSession(NULL, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + context.ta_path = (uint8_t *)"/data/not_found.sec"; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); + // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); + printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); + assert(ret); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Exception_003 + ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + session.session_id++; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_ACCESS_DENIED); + assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); + + session.session_id--; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = &sharemem; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(ret); + + ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); + assert(!ret); + + // Interface_Exception_004 + TEEC_CloseSession(NULL); + + // Interface_Exception_005 + TEEC_FinalizeContext(NULL); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("exception_testcase pass\n"); + } + return ret; +} + +static TEEC_Result testcase_5() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // CA_KILL_Test_001 + printf("CA Killed Test begin!, process exit!\n"); + exit(0); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_6() +{ + TEEC_Context context; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + gettimeofday(&start, NULL); + ret = TEEC_InitializeContext(NULL, &context); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_FinalizeContext(&context); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); + } + return ret; +} + +static TEEC_Result testcase_7() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + gettimeofday(&start, NULL); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_CloseSession(&session); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); + } + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_8(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + gettimeofday(&start, NULL); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); + } + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, + TEEC_Session *session) +{ + TEEC_Operation operation; + TEEC_Result result; + uint32_t origin; + + if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { + TEEC_Error("invoke RsaSignCmd has wrong params."); + return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; + } + + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES( + TEEC_VALUE_INPUT, + TEEC_NONE, + TEEC_MEMREF_TEMP_INPUT, + TEEC_MEMREF_TEMP_OUTPUT); + + operation.params[0].value.a = RSA_KEY_1; + operation.params[0].value.b = RSA_ALG_PSS_SHA256; + operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; + operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; + operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; + operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; + + result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); + if (result != TEEC_SUCCESS) { + TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); + } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { + TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", + operation.params[PARAMS_INDEX_3].tmpref.size); + } else { + printf("signBuf is : \n"); + DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); + *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; + } + + return result; +} + +static TEEC_Result testcase_9(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + char msgBuf[RSA_KEY_SIZE] = {0}; + char signature[RSA_KEY_SIZE] = {0}; + uint32_t bufLen = RSA_KEY_SIZE; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); + printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +void help_print(void) +{ + printf("Usage: \n \ + 1.function_interface_testcase\n \ + 2.sharemem_interface_testcase\n \ + 3.multi_thread_testcase\n \ + 4.exception_testcase\n \ + 5.client_killed_testcase\n \ + 6.TEEC_InitializeContext perform-test\n \ + 7.TEEC_OpenSession perform-test\n \ + 8.TEEC_InvokeCommand perform-test\n \ + 9.RSA Sign test\n"); +} + +int main(int argc, char **argv) +{ + TEEC_Result ret; + struct timeval start, end; + gettimeofday(&start, NULL); + int choice = -1; + + if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { + help_print(); + return 1; + } + +#if 0 + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + return 0; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + return 0; + } + printf("Token set succed. \n"); +#endif +#if 1 + ret = + TEEC_UnsetJwt( + ); + if (ret != TEEC_SUCCESS) + { + printf("Token unset failed. \n"); + return 0; + } + printf("Token unset succed. \n"); +#endif + + char infile_path[1024]; + char * subdir = "testcase"; + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", TESTCASE); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", TESTCASE); + } + + /* + for (int ita = 1; ita < 10; ita ++) + { + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", ita); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", ita); + } + } + */ + + choice = atoi(argv[1]); + + switch (choice) { + case 1: + ret = testcase_1(); + break; + case 2: + ret = testcase_2(); + break; + case 3: + ret = testcase_3(); + break; + case 4: + ret = testcase_4(); + break; + case 5: + ret = testcase_5(); + break; + case 6: + ret = testcase_6(); + break; + case 7: + ret = testcase_7(); + break; + case 8: + ret = testcase_8(); + break; + case 9: + ret = testcase_9(); + break; + default: + printf("Error: invalid choice!\n"); + help_print(); + ret = -1; + break; + } + + return ret; +} diff --git a/cc-resource-pooling/demo/clientapp/testcase4/testcase.h b/cc-resource-pooling/demo/clientapp/testcase4/testcase.h new file mode 100644 index 0000000..7ced8e2 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase4/testcase.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo CA application header file + */ + +#ifndef __MULTI_CORE_CA_H +#define __MULTI_CORE_CA_H + +// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" + +#define VALUE_A 55 +#define VALUE_B 33 +#define REE_TEMP_BUF "hello tee" +#define TEE_TEMP_BUF "hello ree" +#define TEMP_BUF_SIZE 20 +#define THREAD_COUNT 3 + +#define TEST_TIME 10 * 6 +#define EXPIRE_TIME 10 * 6 * 5 + +#define RSA_KEY_SIZE 256 // 2048bits +#define RSA_MASSAGE_SIZE 100 +#define RSA_INPUT_ERROR_PARAMETER 0x10000001 +#define RSA_KEY_1 1 +#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign + +#define PARAMS_INDEX_2 2 // params参数的下标索引 2 +#define PARAMS_INDEX_3 3 // params参数的下标索引 3 +#define PRINTF_SIZE 32 + +enum { + CMD_NULL = 0, + CMD_SHARE_MEM_FULL, + CMD_SHARE_MEM_PATR, + CMD_MUL_THREAD, + CMD_SIGN_PSS_MGF1_SHA256, +}; + +#endif diff --git a/cc-resource-pooling/demo/clientapp/testcase5/CMakeLists.txt b/cc-resource-pooling/demo/clientapp/testcase5/CMakeLists.txt new file mode 100644 index 0000000..80b4384 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase5/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(testcase C CXX) + +# set(CMAKE_C_FLAGS "${CMAKE_}") +# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) + +# include_directories("${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(testcase testcase.c) +target_link_libraries( + testcase + pthread + libteecc.so + libdbusc_jwt.so +) diff --git a/cc-resource-pooling/demo/clientapp/testcase5/build/cmake.sh b/cc-resource-pooling/demo/clientapp/testcase5/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase5/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/demo/clientapp/testcase5/build/test.sh b/cc-resource-pooling/demo/clientapp/testcase5/build/test.sh new file mode 100644 index 0000000..c73734d --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase5/build/test.sh @@ -0,0 +1,11 @@ +CUR_DIR=$( dirname -- "$0"; ) + +${CUR_DIR}/testcase 1 +${CUR_DIR}/testcase 2 +${CUR_DIR}/testcase 3 +${CUR_DIR}/testcase 4 +# ${CUR_DIR}/testcase 5 +${CUR_DIR}/testcase 6 +${CUR_DIR}/testcase 7 +${CUR_DIR}/testcase 8 +${CUR_DIR}/testcase 9 diff --git a/cc-resource-pooling/demo/clientapp/testcase5/testcase.c b/cc-resource-pooling/demo/clientapp/testcase5/testcase.c new file mode 100644 index 0000000..df56bf4 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase5/testcase.c @@ -0,0 +1,940 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo + */ + +#include "testcase.h" +#include +#include +#include +#include +#include +#include +// #include +// #include +// #include +// #include +#include +#include +#include +#include + +// #include "tee_client_api.h" +#include "teecc/teec_client_api.h" +#include "dbusc_jwt.h" + +#define TESTCASE 5 + +#if TESTCASE == 2 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} +}; +#elif TESTCASE == 3 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} +}; +#elif TESTCASE == 4 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} +}; +#elif TESTCASE == 5 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} +}; +#elif TESTCASE == 6 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} +}; +#elif TESTCASE == 7 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} +}; +#elif TESTCASE == 8 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} +}; +#elif TESTCASE == 9 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} +}; +#else +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} +}; +#endif + +static void DumpBuff(const char *buffer, size_t bufLen) +{ + size_t i; + if (buffer == NULL || bufLen == 0) { + return; + } + + printf("\n--------------------------------------------------\n"); + printf("bufLen = %d\n", bufLen); + for (i = 0; i < bufLen; i++) { + if (i % PRINTF_SIZE == 0) { + printf("\n"); + } + printf("%02x ", *(buffer + i)); + } + printf("\n--------------------------------------------------\n"); + return; +} + +static TEEC_Result testcase_1() +{ + TEEC_Context context; + // uint64_t context_addr; + TEEC_Session session; + TEEC_Operation operation; + uint32_t origin; + TEEC_Result ret; + + //Interface_Function-001 + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + //Interface_Function-002 + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- no param + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- value param + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_A); + assert(operation.params[0].value.b == VALUE_B); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_B); + assert(operation.params[0].value.b == VALUE_A); + + // Interface_Function-003 -- temp buf param + char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + memset(tmpbuf, 0, TEMP_BUF_SIZE); + memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + //Interface_Function-004 + TEEC_CloseSession(&session); + //Interface_Function-005 + TEEC_FinalizeContext(&context); + if (!ret) { + printf("interface_testcase pass\n"); + } + return ret; +} + +static void share_mem_test( + TEEC_Session *session, + TEEC_SharedMemory *sharebuf +) +{ + TEEC_Result ret; + TEEC_Operation operation; + uint32_t origin; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); +} + +static TEEC_Result testcase_2() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + char tmpbuf[TEMP_BUF_SIZE]; + uint32_t origin; + TEEC_Result ret; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Function-006 + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-011 + share_mem_test(&session, &sharebuf); + + // Interface_Function-008 + TEEC_ReleaseSharedMemory(&sharebuf); + + // Interface_Function-007 + memset(&sharebuf, 0, sizeof(sharebuf)); + sharebuf.buffer = tmpbuf; + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_RegisterSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-012 + share_mem_test(&session, &sharebuf); + + TEEC_ReleaseSharedMemory(&sharebuf); + +// exit: + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("sharemem_interface_testcase pass\n"); + } + return ret; +} + + +static void *thread_function(void *param) +{ + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + TEEC_Context *context = (TEEC_Context *)param; + pthread_t tid; + uint32_t origin; + struct timeval start, end, tokenset; + + tid = (pthread_t)pthread_self(); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("thread %u open session failed, ret=%x\n", tid, ret); + goto exit; + } + + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(context, &sharebuf); + if (ret) { + printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); + goto exit; + } + + printf("begin multi-thread test, during %u\n", TEST_TIME); + gettimeofday(&start, NULL); + gettimeofday(&tokenset, NULL); + while (1) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); + memset(sharebuf.buffer, 0, sharebuf.size); + memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + operation.params[0].memref.parent = &sharebuf; + operation.params[1].value.a = 1; + + ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); + if (ret) { + printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); + break; + } + + if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { + printf("thread %u get wrong comptue result.\n", tid); + break; + } + gettimeofday(&end, NULL); + if (end.tv_sec - start.tv_sec > TEST_TIME) + break; + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + + sleep(1); + } + + TEEC_CloseSession(&session); +exit: + return (void *)ret; +} + +static TEEC_Result testcase_3() +{ + TEEC_Result ret; + TEEC_Operation operation; + TEEC_Context context; + pthread_t tid[THREAD_COUNT]; + void *thread_ret = NULL; + uint32_t i; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_create(&tid[i], NULL, thread_function, (void *)&context); + } + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_join(tid[i], &thread_ret); + if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { + printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); + ret = TEEC_FAIL; + } + } + +exit: + TEEC_FinalizeContext(&context); + if (!ret) { + printf("multi_thread_testcase pass\n"); + } + return ret; +} + + +// Exception Test +static TEEC_Result testcase_4() +{ +#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharemem; + uint32_t origin; + + // Interface_Exception_001ll + ret = TEEC_InitializeContext(NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + + // Interface_Exception_002 + ret = TEEC_OpenSession(NULL, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + context.ta_path = (uint8_t *)"/data/not_found.sec"; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); + // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); + printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); + assert(ret); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Exception_003 + ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + session.session_id++; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_ACCESS_DENIED); + assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); + + session.session_id--; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = &sharemem; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(ret); + + ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); + assert(!ret); + + // Interface_Exception_004 + TEEC_CloseSession(NULL); + + // Interface_Exception_005 + TEEC_FinalizeContext(NULL); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("exception_testcase pass\n"); + } + return ret; +} + +static TEEC_Result testcase_5() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // CA_KILL_Test_001 + printf("CA Killed Test begin!, process exit!\n"); + exit(0); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_6() +{ + TEEC_Context context; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + gettimeofday(&start, NULL); + ret = TEEC_InitializeContext(NULL, &context); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_FinalizeContext(&context); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); + } + return ret; +} + +static TEEC_Result testcase_7() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + gettimeofday(&start, NULL); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_CloseSession(&session); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); + } + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_8(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + gettimeofday(&start, NULL); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); + } + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, + TEEC_Session *session) +{ + TEEC_Operation operation; + TEEC_Result result; + uint32_t origin; + + if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { + TEEC_Error("invoke RsaSignCmd has wrong params."); + return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; + } + + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES( + TEEC_VALUE_INPUT, + TEEC_NONE, + TEEC_MEMREF_TEMP_INPUT, + TEEC_MEMREF_TEMP_OUTPUT); + + operation.params[0].value.a = RSA_KEY_1; + operation.params[0].value.b = RSA_ALG_PSS_SHA256; + operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; + operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; + operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; + operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; + + result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); + if (result != TEEC_SUCCESS) { + TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); + } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { + TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", + operation.params[PARAMS_INDEX_3].tmpref.size); + } else { + printf("signBuf is : \n"); + DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); + *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; + } + + return result; +} + +static TEEC_Result testcase_9(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + char msgBuf[RSA_KEY_SIZE] = {0}; + char signature[RSA_KEY_SIZE] = {0}; + uint32_t bufLen = RSA_KEY_SIZE; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); + printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +void help_print(void) +{ + printf("Usage: \n \ + 1.function_interface_testcase\n \ + 2.sharemem_interface_testcase\n \ + 3.multi_thread_testcase\n \ + 4.exception_testcase\n \ + 5.client_killed_testcase\n \ + 6.TEEC_InitializeContext perform-test\n \ + 7.TEEC_OpenSession perform-test\n \ + 8.TEEC_InvokeCommand perform-test\n \ + 9.RSA Sign test\n"); +} + +int main(int argc, char **argv) +{ + TEEC_Result ret; + struct timeval start, end; + gettimeofday(&start, NULL); + int choice = -1; + + if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { + help_print(); + return 1; + } + +#if 0 + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + return 0; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + return 0; + } + printf("Token set succed. \n"); +#endif +#if 1 + ret = + TEEC_UnsetJwt( + ); + if (ret != TEEC_SUCCESS) + { + printf("Token unset failed. \n"); + return 0; + } + printf("Token unset succed. \n"); +#endif + + char infile_path[1024]; + char * subdir = "testcase"; + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", TESTCASE); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", TESTCASE); + } + + /* + for (int ita = 1; ita < 10; ita ++) + { + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", ita); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", ita); + } + } + */ + + choice = atoi(argv[1]); + + switch (choice) { + case 1: + ret = testcase_1(); + break; + case 2: + ret = testcase_2(); + break; + case 3: + ret = testcase_3(); + break; + case 4: + ret = testcase_4(); + break; + case 5: + ret = testcase_5(); + break; + case 6: + ret = testcase_6(); + break; + case 7: + ret = testcase_7(); + break; + case 8: + ret = testcase_8(); + break; + case 9: + ret = testcase_9(); + break; + default: + printf("Error: invalid choice!\n"); + help_print(); + ret = -1; + break; + } + + return ret; +} diff --git a/cc-resource-pooling/demo/clientapp/testcase5/testcase.h b/cc-resource-pooling/demo/clientapp/testcase5/testcase.h new file mode 100644 index 0000000..7ced8e2 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase5/testcase.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo CA application header file + */ + +#ifndef __MULTI_CORE_CA_H +#define __MULTI_CORE_CA_H + +// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" + +#define VALUE_A 55 +#define VALUE_B 33 +#define REE_TEMP_BUF "hello tee" +#define TEE_TEMP_BUF "hello ree" +#define TEMP_BUF_SIZE 20 +#define THREAD_COUNT 3 + +#define TEST_TIME 10 * 6 +#define EXPIRE_TIME 10 * 6 * 5 + +#define RSA_KEY_SIZE 256 // 2048bits +#define RSA_MASSAGE_SIZE 100 +#define RSA_INPUT_ERROR_PARAMETER 0x10000001 +#define RSA_KEY_1 1 +#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign + +#define PARAMS_INDEX_2 2 // params参数的下标索引 2 +#define PARAMS_INDEX_3 3 // params参数的下标索引 3 +#define PRINTF_SIZE 32 + +enum { + CMD_NULL = 0, + CMD_SHARE_MEM_FULL, + CMD_SHARE_MEM_PATR, + CMD_MUL_THREAD, + CMD_SIGN_PSS_MGF1_SHA256, +}; + +#endif diff --git a/cc-resource-pooling/demo/clientapp/testcase6/CMakeLists.txt b/cc-resource-pooling/demo/clientapp/testcase6/CMakeLists.txt new file mode 100644 index 0000000..80b4384 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase6/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(testcase C CXX) + +# set(CMAKE_C_FLAGS "${CMAKE_}") +# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) + +# include_directories("${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(testcase testcase.c) +target_link_libraries( + testcase + pthread + libteecc.so + libdbusc_jwt.so +) diff --git a/cc-resource-pooling/demo/clientapp/testcase6/build/cmake.sh b/cc-resource-pooling/demo/clientapp/testcase6/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase6/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/demo/clientapp/testcase6/build/test.sh b/cc-resource-pooling/demo/clientapp/testcase6/build/test.sh new file mode 100644 index 0000000..c73734d --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase6/build/test.sh @@ -0,0 +1,11 @@ +CUR_DIR=$( dirname -- "$0"; ) + +${CUR_DIR}/testcase 1 +${CUR_DIR}/testcase 2 +${CUR_DIR}/testcase 3 +${CUR_DIR}/testcase 4 +# ${CUR_DIR}/testcase 5 +${CUR_DIR}/testcase 6 +${CUR_DIR}/testcase 7 +${CUR_DIR}/testcase 8 +${CUR_DIR}/testcase 9 diff --git a/cc-resource-pooling/demo/clientapp/testcase6/testcase.c b/cc-resource-pooling/demo/clientapp/testcase6/testcase.c new file mode 100644 index 0000000..8603324 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase6/testcase.c @@ -0,0 +1,940 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo + */ + +#include "testcase.h" +#include +#include +#include +#include +#include +#include +// #include +// #include +// #include +// #include +#include +#include +#include +#include + +// #include "tee_client_api.h" +#include "teecc/teec_client_api.h" +#include "dbusc_jwt.h" + +#define TESTCASE 6 + +#if TESTCASE == 2 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} +}; +#elif TESTCASE == 3 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} +}; +#elif TESTCASE == 4 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} +}; +#elif TESTCASE == 5 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} +}; +#elif TESTCASE == 6 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} +}; +#elif TESTCASE == 7 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} +}; +#elif TESTCASE == 8 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} +}; +#elif TESTCASE == 9 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} +}; +#else +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} +}; +#endif + +static void DumpBuff(const char *buffer, size_t bufLen) +{ + size_t i; + if (buffer == NULL || bufLen == 0) { + return; + } + + printf("\n--------------------------------------------------\n"); + printf("bufLen = %d\n", bufLen); + for (i = 0; i < bufLen; i++) { + if (i % PRINTF_SIZE == 0) { + printf("\n"); + } + printf("%02x ", *(buffer + i)); + } + printf("\n--------------------------------------------------\n"); + return; +} + +static TEEC_Result testcase_1() +{ + TEEC_Context context; + // uint64_t context_addr; + TEEC_Session session; + TEEC_Operation operation; + uint32_t origin; + TEEC_Result ret; + + //Interface_Function-001 + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + //Interface_Function-002 + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- no param + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- value param + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_A); + assert(operation.params[0].value.b == VALUE_B); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_B); + assert(operation.params[0].value.b == VALUE_A); + + // Interface_Function-003 -- temp buf param + char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + memset(tmpbuf, 0, TEMP_BUF_SIZE); + memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + //Interface_Function-004 + TEEC_CloseSession(&session); + //Interface_Function-005 + TEEC_FinalizeContext(&context); + if (!ret) { + printf("interface_testcase pass\n"); + } + return ret; +} + +static void share_mem_test( + TEEC_Session *session, + TEEC_SharedMemory *sharebuf +) +{ + TEEC_Result ret; + TEEC_Operation operation; + uint32_t origin; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); +} + +static TEEC_Result testcase_2() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + char tmpbuf[TEMP_BUF_SIZE]; + uint32_t origin; + TEEC_Result ret; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Function-006 + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-011 + share_mem_test(&session, &sharebuf); + + // Interface_Function-008 + TEEC_ReleaseSharedMemory(&sharebuf); + + // Interface_Function-007 + memset(&sharebuf, 0, sizeof(sharebuf)); + sharebuf.buffer = tmpbuf; + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_RegisterSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-012 + share_mem_test(&session, &sharebuf); + + TEEC_ReleaseSharedMemory(&sharebuf); + +// exit: + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("sharemem_interface_testcase pass\n"); + } + return ret; +} + + +static void *thread_function(void *param) +{ + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + TEEC_Context *context = (TEEC_Context *)param; + pthread_t tid; + uint32_t origin; + struct timeval start, end, tokenset; + + tid = (pthread_t)pthread_self(); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("thread %u open session failed, ret=%x\n", tid, ret); + goto exit; + } + + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(context, &sharebuf); + if (ret) { + printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); + goto exit; + } + + printf("begin multi-thread test, during %u\n", TEST_TIME); + gettimeofday(&start, NULL); + gettimeofday(&tokenset, NULL); + while (1) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); + memset(sharebuf.buffer, 0, sharebuf.size); + memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + operation.params[0].memref.parent = &sharebuf; + operation.params[1].value.a = 1; + + ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); + if (ret) { + printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); + break; + } + + if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { + printf("thread %u get wrong comptue result.\n", tid); + break; + } + gettimeofday(&end, NULL); + if (end.tv_sec - start.tv_sec > TEST_TIME) + break; + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + + sleep(1); + } + + TEEC_CloseSession(&session); +exit: + return (void *)ret; +} + +static TEEC_Result testcase_3() +{ + TEEC_Result ret; + TEEC_Operation operation; + TEEC_Context context; + pthread_t tid[THREAD_COUNT]; + void *thread_ret = NULL; + uint32_t i; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_create(&tid[i], NULL, thread_function, (void *)&context); + } + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_join(tid[i], &thread_ret); + if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { + printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); + ret = TEEC_FAIL; + } + } + +exit: + TEEC_FinalizeContext(&context); + if (!ret) { + printf("multi_thread_testcase pass\n"); + } + return ret; +} + + +// Exception Test +static TEEC_Result testcase_4() +{ +#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharemem; + uint32_t origin; + + // Interface_Exception_001ll + ret = TEEC_InitializeContext(NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + + // Interface_Exception_002 + ret = TEEC_OpenSession(NULL, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + context.ta_path = (uint8_t *)"/data/not_found.sec"; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); + // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); + printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); + assert(ret); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Exception_003 + ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + session.session_id++; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_ACCESS_DENIED); + assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); + + session.session_id--; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = &sharemem; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(ret); + + ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); + assert(!ret); + + // Interface_Exception_004 + TEEC_CloseSession(NULL); + + // Interface_Exception_005 + TEEC_FinalizeContext(NULL); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("exception_testcase pass\n"); + } + return ret; +} + +static TEEC_Result testcase_5() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // CA_KILL_Test_001 + printf("CA Killed Test begin!, process exit!\n"); + exit(0); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_6() +{ + TEEC_Context context; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + gettimeofday(&start, NULL); + ret = TEEC_InitializeContext(NULL, &context); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_FinalizeContext(&context); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); + } + return ret; +} + +static TEEC_Result testcase_7() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + gettimeofday(&start, NULL); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_CloseSession(&session); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); + } + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_8(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + gettimeofday(&start, NULL); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); + } + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, + TEEC_Session *session) +{ + TEEC_Operation operation; + TEEC_Result result; + uint32_t origin; + + if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { + TEEC_Error("invoke RsaSignCmd has wrong params."); + return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; + } + + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES( + TEEC_VALUE_INPUT, + TEEC_NONE, + TEEC_MEMREF_TEMP_INPUT, + TEEC_MEMREF_TEMP_OUTPUT); + + operation.params[0].value.a = RSA_KEY_1; + operation.params[0].value.b = RSA_ALG_PSS_SHA256; + operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; + operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; + operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; + operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; + + result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); + if (result != TEEC_SUCCESS) { + TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); + } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { + TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", + operation.params[PARAMS_INDEX_3].tmpref.size); + } else { + printf("signBuf is : \n"); + DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); + *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; + } + + return result; +} + +static TEEC_Result testcase_9(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + char msgBuf[RSA_KEY_SIZE] = {0}; + char signature[RSA_KEY_SIZE] = {0}; + uint32_t bufLen = RSA_KEY_SIZE; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); + printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +void help_print(void) +{ + printf("Usage: \n \ + 1.function_interface_testcase\n \ + 2.sharemem_interface_testcase\n \ + 3.multi_thread_testcase\n \ + 4.exception_testcase\n \ + 5.client_killed_testcase\n \ + 6.TEEC_InitializeContext perform-test\n \ + 7.TEEC_OpenSession perform-test\n \ + 8.TEEC_InvokeCommand perform-test\n \ + 9.RSA Sign test\n"); +} + +int main(int argc, char **argv) +{ + TEEC_Result ret; + struct timeval start, end; + gettimeofday(&start, NULL); + int choice = -1; + + if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { + help_print(); + return 1; + } + +#if 0 + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + return 0; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + return 0; + } + printf("Token set succed. \n"); +#endif +#if 1 + ret = + TEEC_UnsetJwt( + ); + if (ret != TEEC_SUCCESS) + { + printf("Token unset failed. \n"); + return 0; + } + printf("Token unset succed. \n"); +#endif + + char infile_path[1024]; + char * subdir = "testcase"; + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", TESTCASE); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", TESTCASE); + } + + /* + for (int ita = 1; ita < 10; ita ++) + { + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", ita); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", ita); + } + } + */ + + choice = atoi(argv[1]); + + switch (choice) { + case 1: + ret = testcase_1(); + break; + case 2: + ret = testcase_2(); + break; + case 3: + ret = testcase_3(); + break; + case 4: + ret = testcase_4(); + break; + case 5: + ret = testcase_5(); + break; + case 6: + ret = testcase_6(); + break; + case 7: + ret = testcase_7(); + break; + case 8: + ret = testcase_8(); + break; + case 9: + ret = testcase_9(); + break; + default: + printf("Error: invalid choice!\n"); + help_print(); + ret = -1; + break; + } + + return ret; +} diff --git a/cc-resource-pooling/demo/clientapp/testcase6/testcase.h b/cc-resource-pooling/demo/clientapp/testcase6/testcase.h new file mode 100644 index 0000000..7ced8e2 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase6/testcase.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo CA application header file + */ + +#ifndef __MULTI_CORE_CA_H +#define __MULTI_CORE_CA_H + +// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" + +#define VALUE_A 55 +#define VALUE_B 33 +#define REE_TEMP_BUF "hello tee" +#define TEE_TEMP_BUF "hello ree" +#define TEMP_BUF_SIZE 20 +#define THREAD_COUNT 3 + +#define TEST_TIME 10 * 6 +#define EXPIRE_TIME 10 * 6 * 5 + +#define RSA_KEY_SIZE 256 // 2048bits +#define RSA_MASSAGE_SIZE 100 +#define RSA_INPUT_ERROR_PARAMETER 0x10000001 +#define RSA_KEY_1 1 +#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign + +#define PARAMS_INDEX_2 2 // params参数的下标索引 2 +#define PARAMS_INDEX_3 3 // params参数的下标索引 3 +#define PRINTF_SIZE 32 + +enum { + CMD_NULL = 0, + CMD_SHARE_MEM_FULL, + CMD_SHARE_MEM_PATR, + CMD_MUL_THREAD, + CMD_SIGN_PSS_MGF1_SHA256, +}; + +#endif diff --git a/cc-resource-pooling/demo/clientapp/testcase7/CMakeLists.txt b/cc-resource-pooling/demo/clientapp/testcase7/CMakeLists.txt new file mode 100644 index 0000000..80b4384 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase7/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(testcase C CXX) + +# set(CMAKE_C_FLAGS "${CMAKE_}") +# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) + +# include_directories("${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(testcase testcase.c) +target_link_libraries( + testcase + pthread + libteecc.so + libdbusc_jwt.so +) diff --git a/cc-resource-pooling/demo/clientapp/testcase7/build/cmake.sh b/cc-resource-pooling/demo/clientapp/testcase7/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase7/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/demo/clientapp/testcase7/build/test.sh b/cc-resource-pooling/demo/clientapp/testcase7/build/test.sh new file mode 100644 index 0000000..c73734d --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase7/build/test.sh @@ -0,0 +1,11 @@ +CUR_DIR=$( dirname -- "$0"; ) + +${CUR_DIR}/testcase 1 +${CUR_DIR}/testcase 2 +${CUR_DIR}/testcase 3 +${CUR_DIR}/testcase 4 +# ${CUR_DIR}/testcase 5 +${CUR_DIR}/testcase 6 +${CUR_DIR}/testcase 7 +${CUR_DIR}/testcase 8 +${CUR_DIR}/testcase 9 diff --git a/cc-resource-pooling/demo/clientapp/testcase7/testcase.c b/cc-resource-pooling/demo/clientapp/testcase7/testcase.c new file mode 100644 index 0000000..0078f58 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase7/testcase.c @@ -0,0 +1,940 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo + */ + +#include "testcase.h" +#include +#include +#include +#include +#include +#include +// #include +// #include +// #include +// #include +#include +#include +#include +#include + +// #include "tee_client_api.h" +#include "teecc/teec_client_api.h" +#include "dbusc_jwt.h" + +#define TESTCASE 7 + +#if TESTCASE == 2 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} +}; +#elif TESTCASE == 3 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} +}; +#elif TESTCASE == 4 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} +}; +#elif TESTCASE == 5 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} +}; +#elif TESTCASE == 6 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} +}; +#elif TESTCASE == 7 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} +}; +#elif TESTCASE == 8 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} +}; +#elif TESTCASE == 9 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} +}; +#else +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} +}; +#endif + +static void DumpBuff(const char *buffer, size_t bufLen) +{ + size_t i; + if (buffer == NULL || bufLen == 0) { + return; + } + + printf("\n--------------------------------------------------\n"); + printf("bufLen = %d\n", bufLen); + for (i = 0; i < bufLen; i++) { + if (i % PRINTF_SIZE == 0) { + printf("\n"); + } + printf("%02x ", *(buffer + i)); + } + printf("\n--------------------------------------------------\n"); + return; +} + +static TEEC_Result testcase_1() +{ + TEEC_Context context; + // uint64_t context_addr; + TEEC_Session session; + TEEC_Operation operation; + uint32_t origin; + TEEC_Result ret; + + //Interface_Function-001 + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + //Interface_Function-002 + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- no param + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- value param + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_A); + assert(operation.params[0].value.b == VALUE_B); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_B); + assert(operation.params[0].value.b == VALUE_A); + + // Interface_Function-003 -- temp buf param + char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + memset(tmpbuf, 0, TEMP_BUF_SIZE); + memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + //Interface_Function-004 + TEEC_CloseSession(&session); + //Interface_Function-005 + TEEC_FinalizeContext(&context); + if (!ret) { + printf("interface_testcase pass\n"); + } + return ret; +} + +static void share_mem_test( + TEEC_Session *session, + TEEC_SharedMemory *sharebuf +) +{ + TEEC_Result ret; + TEEC_Operation operation; + uint32_t origin; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); +} + +static TEEC_Result testcase_2() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + char tmpbuf[TEMP_BUF_SIZE]; + uint32_t origin; + TEEC_Result ret; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Function-006 + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-011 + share_mem_test(&session, &sharebuf); + + // Interface_Function-008 + TEEC_ReleaseSharedMemory(&sharebuf); + + // Interface_Function-007 + memset(&sharebuf, 0, sizeof(sharebuf)); + sharebuf.buffer = tmpbuf; + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_RegisterSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-012 + share_mem_test(&session, &sharebuf); + + TEEC_ReleaseSharedMemory(&sharebuf); + +// exit: + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("sharemem_interface_testcase pass\n"); + } + return ret; +} + + +static void *thread_function(void *param) +{ + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + TEEC_Context *context = (TEEC_Context *)param; + pthread_t tid; + uint32_t origin; + struct timeval start, end, tokenset; + + tid = (pthread_t)pthread_self(); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("thread %u open session failed, ret=%x\n", tid, ret); + goto exit; + } + + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(context, &sharebuf); + if (ret) { + printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); + goto exit; + } + + printf("begin multi-thread test, during %u\n", TEST_TIME); + gettimeofday(&start, NULL); + gettimeofday(&tokenset, NULL); + while (1) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); + memset(sharebuf.buffer, 0, sharebuf.size); + memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + operation.params[0].memref.parent = &sharebuf; + operation.params[1].value.a = 1; + + ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); + if (ret) { + printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); + break; + } + + if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { + printf("thread %u get wrong comptue result.\n", tid); + break; + } + gettimeofday(&end, NULL); + if (end.tv_sec - start.tv_sec > TEST_TIME) + break; + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + + sleep(1); + } + + TEEC_CloseSession(&session); +exit: + return (void *)ret; +} + +static TEEC_Result testcase_3() +{ + TEEC_Result ret; + TEEC_Operation operation; + TEEC_Context context; + pthread_t tid[THREAD_COUNT]; + void *thread_ret = NULL; + uint32_t i; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_create(&tid[i], NULL, thread_function, (void *)&context); + } + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_join(tid[i], &thread_ret); + if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { + printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); + ret = TEEC_FAIL; + } + } + +exit: + TEEC_FinalizeContext(&context); + if (!ret) { + printf("multi_thread_testcase pass\n"); + } + return ret; +} + + +// Exception Test +static TEEC_Result testcase_4() +{ +#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharemem; + uint32_t origin; + + // Interface_Exception_001ll + ret = TEEC_InitializeContext(NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + + // Interface_Exception_002 + ret = TEEC_OpenSession(NULL, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + context.ta_path = (uint8_t *)"/data/not_found.sec"; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); + // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); + printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); + assert(ret); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Exception_003 + ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + session.session_id++; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_ACCESS_DENIED); + assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); + + session.session_id--; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = &sharemem; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(ret); + + ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); + assert(!ret); + + // Interface_Exception_004 + TEEC_CloseSession(NULL); + + // Interface_Exception_005 + TEEC_FinalizeContext(NULL); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("exception_testcase pass\n"); + } + return ret; +} + +static TEEC_Result testcase_5() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // CA_KILL_Test_001 + printf("CA Killed Test begin!, process exit!\n"); + exit(0); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_6() +{ + TEEC_Context context; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + gettimeofday(&start, NULL); + ret = TEEC_InitializeContext(NULL, &context); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_FinalizeContext(&context); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); + } + return ret; +} + +static TEEC_Result testcase_7() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + gettimeofday(&start, NULL); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_CloseSession(&session); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); + } + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_8(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + gettimeofday(&start, NULL); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); + } + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, + TEEC_Session *session) +{ + TEEC_Operation operation; + TEEC_Result result; + uint32_t origin; + + if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { + TEEC_Error("invoke RsaSignCmd has wrong params."); + return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; + } + + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES( + TEEC_VALUE_INPUT, + TEEC_NONE, + TEEC_MEMREF_TEMP_INPUT, + TEEC_MEMREF_TEMP_OUTPUT); + + operation.params[0].value.a = RSA_KEY_1; + operation.params[0].value.b = RSA_ALG_PSS_SHA256; + operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; + operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; + operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; + operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; + + result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); + if (result != TEEC_SUCCESS) { + TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); + } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { + TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", + operation.params[PARAMS_INDEX_3].tmpref.size); + } else { + printf("signBuf is : \n"); + DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); + *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; + } + + return result; +} + +static TEEC_Result testcase_9(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + char msgBuf[RSA_KEY_SIZE] = {0}; + char signature[RSA_KEY_SIZE] = {0}; + uint32_t bufLen = RSA_KEY_SIZE; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); + printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +void help_print(void) +{ + printf("Usage: \n \ + 1.function_interface_testcase\n \ + 2.sharemem_interface_testcase\n \ + 3.multi_thread_testcase\n \ + 4.exception_testcase\n \ + 5.client_killed_testcase\n \ + 6.TEEC_InitializeContext perform-test\n \ + 7.TEEC_OpenSession perform-test\n \ + 8.TEEC_InvokeCommand perform-test\n \ + 9.RSA Sign test\n"); +} + +int main(int argc, char **argv) +{ + TEEC_Result ret; + struct timeval start, end; + gettimeofday(&start, NULL); + int choice = -1; + + if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { + help_print(); + return 1; + } + +#if 0 + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + return 0; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + return 0; + } + printf("Token set succed. \n"); +#endif +#if 1 + ret = + TEEC_UnsetJwt( + ); + if (ret != TEEC_SUCCESS) + { + printf("Token unset failed. \n"); + return 0; + } + printf("Token unset succed. \n"); +#endif + + char infile_path[1024]; + char * subdir = "testcase"; + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", TESTCASE); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", TESTCASE); + } + + /* + for (int ita = 1; ita < 10; ita ++) + { + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", ita); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", ita); + } + } + */ + + choice = atoi(argv[1]); + + switch (choice) { + case 1: + ret = testcase_1(); + break; + case 2: + ret = testcase_2(); + break; + case 3: + ret = testcase_3(); + break; + case 4: + ret = testcase_4(); + break; + case 5: + ret = testcase_5(); + break; + case 6: + ret = testcase_6(); + break; + case 7: + ret = testcase_7(); + break; + case 8: + ret = testcase_8(); + break; + case 9: + ret = testcase_9(); + break; + default: + printf("Error: invalid choice!\n"); + help_print(); + ret = -1; + break; + } + + return ret; +} diff --git a/cc-resource-pooling/demo/clientapp/testcase7/testcase.h b/cc-resource-pooling/demo/clientapp/testcase7/testcase.h new file mode 100644 index 0000000..7ced8e2 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase7/testcase.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo CA application header file + */ + +#ifndef __MULTI_CORE_CA_H +#define __MULTI_CORE_CA_H + +// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" + +#define VALUE_A 55 +#define VALUE_B 33 +#define REE_TEMP_BUF "hello tee" +#define TEE_TEMP_BUF "hello ree" +#define TEMP_BUF_SIZE 20 +#define THREAD_COUNT 3 + +#define TEST_TIME 10 * 6 +#define EXPIRE_TIME 10 * 6 * 5 + +#define RSA_KEY_SIZE 256 // 2048bits +#define RSA_MASSAGE_SIZE 100 +#define RSA_INPUT_ERROR_PARAMETER 0x10000001 +#define RSA_KEY_1 1 +#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign + +#define PARAMS_INDEX_2 2 // params参数的下标索引 2 +#define PARAMS_INDEX_3 3 // params参数的下标索引 3 +#define PRINTF_SIZE 32 + +enum { + CMD_NULL = 0, + CMD_SHARE_MEM_FULL, + CMD_SHARE_MEM_PATR, + CMD_MUL_THREAD, + CMD_SIGN_PSS_MGF1_SHA256, +}; + +#endif diff --git a/cc-resource-pooling/demo/clientapp/testcase8/CMakeLists.txt b/cc-resource-pooling/demo/clientapp/testcase8/CMakeLists.txt new file mode 100644 index 0000000..80b4384 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase8/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(testcase C CXX) + +# set(CMAKE_C_FLAGS "${CMAKE_}") +# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) + +# include_directories("${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(testcase testcase.c) +target_link_libraries( + testcase + pthread + libteecc.so + libdbusc_jwt.so +) diff --git a/cc-resource-pooling/demo/clientapp/testcase8/build/cmake.sh b/cc-resource-pooling/demo/clientapp/testcase8/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase8/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/demo/clientapp/testcase8/build/test.sh b/cc-resource-pooling/demo/clientapp/testcase8/build/test.sh new file mode 100644 index 0000000..c73734d --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase8/build/test.sh @@ -0,0 +1,11 @@ +CUR_DIR=$( dirname -- "$0"; ) + +${CUR_DIR}/testcase 1 +${CUR_DIR}/testcase 2 +${CUR_DIR}/testcase 3 +${CUR_DIR}/testcase 4 +# ${CUR_DIR}/testcase 5 +${CUR_DIR}/testcase 6 +${CUR_DIR}/testcase 7 +${CUR_DIR}/testcase 8 +${CUR_DIR}/testcase 9 diff --git a/cc-resource-pooling/demo/clientapp/testcase8/testcase.c b/cc-resource-pooling/demo/clientapp/testcase8/testcase.c new file mode 100644 index 0000000..6ac5d90 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase8/testcase.c @@ -0,0 +1,940 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo + */ + +#include "testcase.h" +#include +#include +#include +#include +#include +#include +// #include +// #include +// #include +// #include +#include +#include +#include +#include + +// #include "tee_client_api.h" +#include "teecc/teec_client_api.h" +#include "dbusc_jwt.h" + +#define TESTCASE 8 + +#if TESTCASE == 2 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} +}; +#elif TESTCASE == 3 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} +}; +#elif TESTCASE == 4 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} +}; +#elif TESTCASE == 5 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} +}; +#elif TESTCASE == 6 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} +}; +#elif TESTCASE == 7 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} +}; +#elif TESTCASE == 8 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} +}; +#elif TESTCASE == 9 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} +}; +#else +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} +}; +#endif + +static void DumpBuff(const char *buffer, size_t bufLen) +{ + size_t i; + if (buffer == NULL || bufLen == 0) { + return; + } + + printf("\n--------------------------------------------------\n"); + printf("bufLen = %d\n", bufLen); + for (i = 0; i < bufLen; i++) { + if (i % PRINTF_SIZE == 0) { + printf("\n"); + } + printf("%02x ", *(buffer + i)); + } + printf("\n--------------------------------------------------\n"); + return; +} + +static TEEC_Result testcase_1() +{ + TEEC_Context context; + // uint64_t context_addr; + TEEC_Session session; + TEEC_Operation operation; + uint32_t origin; + TEEC_Result ret; + + //Interface_Function-001 + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + //Interface_Function-002 + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- no param + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- value param + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_A); + assert(operation.params[0].value.b == VALUE_B); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_B); + assert(operation.params[0].value.b == VALUE_A); + + // Interface_Function-003 -- temp buf param + char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + memset(tmpbuf, 0, TEMP_BUF_SIZE); + memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + //Interface_Function-004 + TEEC_CloseSession(&session); + //Interface_Function-005 + TEEC_FinalizeContext(&context); + if (!ret) { + printf("interface_testcase pass\n"); + } + return ret; +} + +static void share_mem_test( + TEEC_Session *session, + TEEC_SharedMemory *sharebuf +) +{ + TEEC_Result ret; + TEEC_Operation operation; + uint32_t origin; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); +} + +static TEEC_Result testcase_2() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + char tmpbuf[TEMP_BUF_SIZE]; + uint32_t origin; + TEEC_Result ret; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Function-006 + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-011 + share_mem_test(&session, &sharebuf); + + // Interface_Function-008 + TEEC_ReleaseSharedMemory(&sharebuf); + + // Interface_Function-007 + memset(&sharebuf, 0, sizeof(sharebuf)); + sharebuf.buffer = tmpbuf; + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_RegisterSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-012 + share_mem_test(&session, &sharebuf); + + TEEC_ReleaseSharedMemory(&sharebuf); + +// exit: + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("sharemem_interface_testcase pass\n"); + } + return ret; +} + + +static void *thread_function(void *param) +{ + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + TEEC_Context *context = (TEEC_Context *)param; + pthread_t tid; + uint32_t origin; + struct timeval start, end, tokenset; + + tid = (pthread_t)pthread_self(); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("thread %u open session failed, ret=%x\n", tid, ret); + goto exit; + } + + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(context, &sharebuf); + if (ret) { + printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); + goto exit; + } + + printf("begin multi-thread test, during %u\n", TEST_TIME); + gettimeofday(&start, NULL); + gettimeofday(&tokenset, NULL); + while (1) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); + memset(sharebuf.buffer, 0, sharebuf.size); + memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + operation.params[0].memref.parent = &sharebuf; + operation.params[1].value.a = 1; + + ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); + if (ret) { + printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); + break; + } + + if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { + printf("thread %u get wrong comptue result.\n", tid); + break; + } + gettimeofday(&end, NULL); + if (end.tv_sec - start.tv_sec > TEST_TIME) + break; + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + + sleep(1); + } + + TEEC_CloseSession(&session); +exit: + return (void *)ret; +} + +static TEEC_Result testcase_3() +{ + TEEC_Result ret; + TEEC_Operation operation; + TEEC_Context context; + pthread_t tid[THREAD_COUNT]; + void *thread_ret = NULL; + uint32_t i; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_create(&tid[i], NULL, thread_function, (void *)&context); + } + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_join(tid[i], &thread_ret); + if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { + printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); + ret = TEEC_FAIL; + } + } + +exit: + TEEC_FinalizeContext(&context); + if (!ret) { + printf("multi_thread_testcase pass\n"); + } + return ret; +} + + +// Exception Test +static TEEC_Result testcase_4() +{ +#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharemem; + uint32_t origin; + + // Interface_Exception_001ll + ret = TEEC_InitializeContext(NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + + // Interface_Exception_002 + ret = TEEC_OpenSession(NULL, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + context.ta_path = (uint8_t *)"/data/not_found.sec"; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); + // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); + printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); + assert(ret); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Exception_003 + ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + session.session_id++; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_ACCESS_DENIED); + assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); + + session.session_id--; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = &sharemem; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(ret); + + ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); + assert(!ret); + + // Interface_Exception_004 + TEEC_CloseSession(NULL); + + // Interface_Exception_005 + TEEC_FinalizeContext(NULL); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("exception_testcase pass\n"); + } + return ret; +} + +static TEEC_Result testcase_5() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // CA_KILL_Test_001 + printf("CA Killed Test begin!, process exit!\n"); + exit(0); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_6() +{ + TEEC_Context context; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + gettimeofday(&start, NULL); + ret = TEEC_InitializeContext(NULL, &context); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_FinalizeContext(&context); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); + } + return ret; +} + +static TEEC_Result testcase_7() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + gettimeofday(&start, NULL); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_CloseSession(&session); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); + } + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_8(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + gettimeofday(&start, NULL); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); + } + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, + TEEC_Session *session) +{ + TEEC_Operation operation; + TEEC_Result result; + uint32_t origin; + + if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { + TEEC_Error("invoke RsaSignCmd has wrong params."); + return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; + } + + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES( + TEEC_VALUE_INPUT, + TEEC_NONE, + TEEC_MEMREF_TEMP_INPUT, + TEEC_MEMREF_TEMP_OUTPUT); + + operation.params[0].value.a = RSA_KEY_1; + operation.params[0].value.b = RSA_ALG_PSS_SHA256; + operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; + operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; + operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; + operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; + + result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); + if (result != TEEC_SUCCESS) { + TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); + } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { + TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", + operation.params[PARAMS_INDEX_3].tmpref.size); + } else { + printf("signBuf is : \n"); + DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); + *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; + } + + return result; +} + +static TEEC_Result testcase_9(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + char msgBuf[RSA_KEY_SIZE] = {0}; + char signature[RSA_KEY_SIZE] = {0}; + uint32_t bufLen = RSA_KEY_SIZE; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); + printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +void help_print(void) +{ + printf("Usage: \n \ + 1.function_interface_testcase\n \ + 2.sharemem_interface_testcase\n \ + 3.multi_thread_testcase\n \ + 4.exception_testcase\n \ + 5.client_killed_testcase\n \ + 6.TEEC_InitializeContext perform-test\n \ + 7.TEEC_OpenSession perform-test\n \ + 8.TEEC_InvokeCommand perform-test\n \ + 9.RSA Sign test\n"); +} + +int main(int argc, char **argv) +{ + TEEC_Result ret; + struct timeval start, end; + gettimeofday(&start, NULL); + int choice = -1; + + if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { + help_print(); + return 1; + } + +#if 0 + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + return 0; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + return 0; + } + printf("Token set succed. \n"); +#endif +#if 1 + ret = + TEEC_UnsetJwt( + ); + if (ret != TEEC_SUCCESS) + { + printf("Token unset failed. \n"); + return 0; + } + printf("Token unset succed. \n"); +#endif + + char infile_path[1024]; + char * subdir = "testcase"; + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", TESTCASE); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", TESTCASE); + } + + /* + for (int ita = 1; ita < 10; ita ++) + { + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", ita); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", ita); + } + } + */ + + choice = atoi(argv[1]); + + switch (choice) { + case 1: + ret = testcase_1(); + break; + case 2: + ret = testcase_2(); + break; + case 3: + ret = testcase_3(); + break; + case 4: + ret = testcase_4(); + break; + case 5: + ret = testcase_5(); + break; + case 6: + ret = testcase_6(); + break; + case 7: + ret = testcase_7(); + break; + case 8: + ret = testcase_8(); + break; + case 9: + ret = testcase_9(); + break; + default: + printf("Error: invalid choice!\n"); + help_print(); + ret = -1; + break; + } + + return ret; +} diff --git a/cc-resource-pooling/demo/clientapp/testcase8/testcase.h b/cc-resource-pooling/demo/clientapp/testcase8/testcase.h new file mode 100644 index 0000000..7ced8e2 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase8/testcase.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo CA application header file + */ + +#ifndef __MULTI_CORE_CA_H +#define __MULTI_CORE_CA_H + +// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" + +#define VALUE_A 55 +#define VALUE_B 33 +#define REE_TEMP_BUF "hello tee" +#define TEE_TEMP_BUF "hello ree" +#define TEMP_BUF_SIZE 20 +#define THREAD_COUNT 3 + +#define TEST_TIME 10 * 6 +#define EXPIRE_TIME 10 * 6 * 5 + +#define RSA_KEY_SIZE 256 // 2048bits +#define RSA_MASSAGE_SIZE 100 +#define RSA_INPUT_ERROR_PARAMETER 0x10000001 +#define RSA_KEY_1 1 +#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign + +#define PARAMS_INDEX_2 2 // params参数的下标索引 2 +#define PARAMS_INDEX_3 3 // params参数的下标索引 3 +#define PRINTF_SIZE 32 + +enum { + CMD_NULL = 0, + CMD_SHARE_MEM_FULL, + CMD_SHARE_MEM_PATR, + CMD_MUL_THREAD, + CMD_SIGN_PSS_MGF1_SHA256, +}; + +#endif diff --git a/cc-resource-pooling/demo/clientapp/testcase9/CMakeLists.txt b/cc-resource-pooling/demo/clientapp/testcase9/CMakeLists.txt new file mode 100644 index 0000000..80b4384 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase9/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(testcase C CXX) + +# set(CMAKE_C_FLAGS "${CMAKE_}") +# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) + +# include_directories("${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(testcase testcase.c) +target_link_libraries( + testcase + pthread + libteecc.so + libdbusc_jwt.so +) diff --git a/cc-resource-pooling/demo/clientapp/testcase9/build/cmake.sh b/cc-resource-pooling/demo/clientapp/testcase9/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase9/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/demo/clientapp/testcase9/build/test.sh b/cc-resource-pooling/demo/clientapp/testcase9/build/test.sh new file mode 100644 index 0000000..c73734d --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase9/build/test.sh @@ -0,0 +1,11 @@ +CUR_DIR=$( dirname -- "$0"; ) + +${CUR_DIR}/testcase 1 +${CUR_DIR}/testcase 2 +${CUR_DIR}/testcase 3 +${CUR_DIR}/testcase 4 +# ${CUR_DIR}/testcase 5 +${CUR_DIR}/testcase 6 +${CUR_DIR}/testcase 7 +${CUR_DIR}/testcase 8 +${CUR_DIR}/testcase 9 diff --git a/cc-resource-pooling/demo/clientapp/testcase9/testcase.c b/cc-resource-pooling/demo/clientapp/testcase9/testcase.c new file mode 100644 index 0000000..1181690 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase9/testcase.c @@ -0,0 +1,940 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo + */ + +#include "testcase.h" +#include +#include +#include +#include +#include +#include +// #include +// #include +// #include +// #include +#include +#include +#include +#include + +// #include "tee_client_api.h" +#include "teecc/teec_client_api.h" +#include "dbusc_jwt.h" + +#define TESTCASE 9 + +#if TESTCASE == 2 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} +}; +#elif TESTCASE == 3 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} +}; +#elif TESTCASE == 4 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} +}; +#elif TESTCASE == 5 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} +}; +#elif TESTCASE == 6 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} +}; +#elif TESTCASE == 7 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} +}; +#elif TESTCASE == 8 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} +}; +#elif TESTCASE == 9 +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} +}; +#else +#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" +static const TEEC_UUID TEST_CASE_UUID = { + 0xb8ff9049, 0x9cbb, 0x46b0, + {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} +}; +#endif + +static void DumpBuff(const char *buffer, size_t bufLen) +{ + size_t i; + if (buffer == NULL || bufLen == 0) { + return; + } + + printf("\n--------------------------------------------------\n"); + printf("bufLen = %d\n", bufLen); + for (i = 0; i < bufLen; i++) { + if (i % PRINTF_SIZE == 0) { + printf("\n"); + } + printf("%02x ", *(buffer + i)); + } + printf("\n--------------------------------------------------\n"); + return; +} + +static TEEC_Result testcase_1() +{ + TEEC_Context context; + // uint64_t context_addr; + TEEC_Session session; + TEEC_Operation operation; + uint32_t origin; + TEEC_Result ret; + + //Interface_Function-001 + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + //Interface_Function-002 + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- no param + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + //Interface_Function-003 -- value param + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_A); + assert(operation.params[0].value.b == VALUE_B); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].value.a = 55; + operation.params[0].value.b = 33; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(operation.params[0].value.a == VALUE_B); + assert(operation.params[0].value.b == VALUE_A); + + // Interface_Function-003 -- temp buf param + char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].tmpref.buffer = tmpbuf; + operation.params[0].tmpref.size = TEMP_BUF_SIZE; + memset(tmpbuf, 0, TEMP_BUF_SIZE); + memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(!ret); + assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); + + //Interface_Function-004 + TEEC_CloseSession(&session); + //Interface_Function-005 + TEEC_FinalizeContext(&context); + if (!ret) { + printf("interface_testcase pass\n"); + } + return ret; +} + +static void share_mem_test( + TEEC_Session *session, + TEEC_SharedMemory *sharebuf +) +{ + TEEC_Result ret; + TEEC_Operation operation; + uint32_t origin; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); + + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = sharebuf; + operation.params[0].memref.offset = 1; + operation.params[0].memref.size = TEMP_BUF_SIZE - 1; + memset(sharebuf->buffer, 0, sharebuf->size); + memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); + assert(!ret); + assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); +} + +static TEEC_Result testcase_2() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + char tmpbuf[TEMP_BUF_SIZE]; + uint32_t origin; + TEEC_Result ret; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Function-006 + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-011 + share_mem_test(&session, &sharebuf); + + // Interface_Function-008 + TEEC_ReleaseSharedMemory(&sharebuf); + + // Interface_Function-007 + memset(&sharebuf, 0, sizeof(sharebuf)); + sharebuf.buffer = tmpbuf; + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_RegisterSharedMemory(&context, &sharebuf); + assert(!ret); + + // Interface_Function-012 + share_mem_test(&session, &sharebuf); + + TEEC_ReleaseSharedMemory(&sharebuf); + +// exit: + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("sharemem_interface_testcase pass\n"); + } + return ret; +} + + +static void *thread_function(void *param) +{ + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharebuf; + TEEC_Context *context = (TEEC_Context *)param; + pthread_t tid; + uint32_t origin; + struct timeval start, end, tokenset; + + tid = (pthread_t)pthread_self(); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + ret = TEEC_OpenSession(context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("thread %u open session failed, ret=%x\n", tid, ret); + goto exit; + } + + sharebuf.size = TEMP_BUF_SIZE; + sharebuf.flags = TEEC_MEM_INOUT; + ret = TEEC_AllocateSharedMemory(context, &sharebuf); + if (ret) { + printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); + goto exit; + } + + printf("begin multi-thread test, during %u\n", TEST_TIME); + gettimeofday(&start, NULL); + gettimeofday(&tokenset, NULL); + while (1) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); + memset(sharebuf.buffer, 0, sharebuf.size); + memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); + operation.params[0].memref.parent = &sharebuf; + operation.params[1].value.a = 1; + + ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); + if (ret) { + printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); + break; + } + + if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { + printf("thread %u get wrong comptue result.\n", tid); + break; + } + gettimeofday(&end, NULL); + if (end.tv_sec - start.tv_sec > TEST_TIME) + break; + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + + sleep(1); + } + + TEEC_CloseSession(&session); +exit: + return (void *)ret; +} + +static TEEC_Result testcase_3() +{ + TEEC_Result ret; + TEEC_Operation operation; + TEEC_Context context; + pthread_t tid[THREAD_COUNT]; + void *thread_ret = NULL; + uint32_t i; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_create(&tid[i], NULL, thread_function, (void *)&context); + } + + for (i = 0; i < THREAD_COUNT; i++) { + pthread_join(tid[i], &thread_ret); + if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { + printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); + ret = TEEC_FAIL; + } + } + +exit: + TEEC_FinalizeContext(&context); + if (!ret) { + printf("multi_thread_testcase pass\n"); + } + return ret; +} + + +// Exception Test +static TEEC_Result testcase_4() +{ +#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 + TEEC_Result ret = TEEC_SUCCESS; + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory sharemem; + uint32_t origin; + + // Interface_Exception_001ll + ret = TEEC_InitializeContext(NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + + // Interface_Exception_002 + ret = TEEC_OpenSession(NULL, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + ret = TEEC_OpenSession(&context, + &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + context.ta_path = (uint8_t *)"/data/not_found.sec"; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); + // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); + printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); + assert(ret); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // Interface_Exception_003 + ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + session.session_id++; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + // assert(ret == TEEC_ERROR_ACCESS_DENIED); + assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); + + session.session_id--; + operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + operation.params[0].memref.parent = &sharemem; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + assert(ret); + + ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); + assert(ret == TEEC_ERROR_BAD_PARAMETERS); + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); + assert(!ret); + + // Interface_Exception_004 + TEEC_CloseSession(NULL); + + // Interface_Exception_005 + TEEC_FinalizeContext(NULL); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + + if (!ret) { + printf("exception_testcase pass\n"); + } + return ret; +} + +static TEEC_Result testcase_5() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + assert(!ret); + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + assert(!ret); + + // CA_KILL_Test_001 + printf("CA Killed Test begin!, process exit!\n"); + exit(0); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_6() +{ + TEEC_Context context; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + gettimeofday(&start, NULL); + ret = TEEC_InitializeContext(NULL, &context); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_FinalizeContext(&context); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); + } + return ret; +} + +static TEEC_Result testcase_7() +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + gettimeofday(&start, NULL); + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + TEEC_CloseSession(&session); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); + } + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result testcase_8(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + struct timeval start, end, tokenset; + uint32_t cost = 0; + uint32_t i; + TEEC_Result ret; + uint32_t count = 1000; + uint32_t origin; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + gettimeofday(&tokenset, NULL); + for (i = 0; i < count; i++) { + operation.started = 1; + memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); + gettimeofday(&start, NULL); + ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); + gettimeofday(&end, NULL); + if (ret) { + break; + } + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) + { + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + break; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + break; + } + printf("Token set succed. \n"); + gettimeofday(&tokenset, NULL); + } + } + + if (!ret) { + printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); + } + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, + TEEC_Session *session) +{ + TEEC_Operation operation; + TEEC_Result result; + uint32_t origin; + + if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { + TEEC_Error("invoke RsaSignCmd has wrong params."); + return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; + } + + operation.started = 1; + operation.paramTypes = TEEC_PARAM_TYPES( + TEEC_VALUE_INPUT, + TEEC_NONE, + TEEC_MEMREF_TEMP_INPUT, + TEEC_MEMREF_TEMP_OUTPUT); + + operation.params[0].value.a = RSA_KEY_1; + operation.params[0].value.b = RSA_ALG_PSS_SHA256; + operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; + operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; + operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; + operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; + + result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); + if (result != TEEC_SUCCESS) { + TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); + } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { + TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", + operation.params[PARAMS_INDEX_3].tmpref.size); + } else { + printf("signBuf is : \n"); + DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); + *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; + } + + return result; +} + +static TEEC_Result testcase_9(void) +{ + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_Result ret; + uint32_t origin; + char msgBuf[RSA_KEY_SIZE] = {0}; + char signature[RSA_KEY_SIZE] = {0}; + uint32_t bufLen = RSA_KEY_SIZE; + + ret = TEEC_InitializeContext(NULL, &context); + if (ret) { + printf("initail conatext failed\n"); + return ret; + } + context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; + + memset(&operation, 0, sizeof(operation)); + operation.started = 1; + ret = TEEC_OpenSession(&context, + &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); + if (ret) { + printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); + TEEC_FinalizeContext(&context); + return ret; + } + + ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); + printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); + + TEEC_CloseSession(&session); + TEEC_FinalizeContext(&context); + return ret; +} + +void help_print(void) +{ + printf("Usage: \n \ + 1.function_interface_testcase\n \ + 2.sharemem_interface_testcase\n \ + 3.multi_thread_testcase\n \ + 4.exception_testcase\n \ + 5.client_killed_testcase\n \ + 6.TEEC_InitializeContext perform-test\n \ + 7.TEEC_OpenSession perform-test\n \ + 8.TEEC_InvokeCommand perform-test\n \ + 9.RSA Sign test\n"); +} + +int main(int argc, char **argv) +{ + TEEC_Result ret; + struct timeval start, end; + gettimeofday(&start, NULL); + int choice = -1; + + if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { + help_print(); + return 1; + } + +#if 0 + char token[1024]; + int iret; + iret = + dbusmethodcall_fetch_jwt( + token + ); + if (iret != 0) + { + printf("Token fetching failed. \n"); + return 0; + } + printf("The fetched token: %s \n", token); + + ret = + TEEC_SetJwt( + token + ); + if (ret != TEEC_SUCCESS) + { + printf("Token set failed. \n"); + return 0; + } + printf("Token set succed. \n"); +#endif +#if 1 + ret = + TEEC_UnsetJwt( + ); + if (ret != TEEC_SUCCESS) + { + printf("Token unset failed. \n"); + return 0; + } + printf("Token unset succed. \n"); +#endif + + char infile_path[1024]; + char * subdir = "testcase"; + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", TESTCASE); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", TESTCASE); + } + + /* + for (int ita = 1; ita < 10; ita ++) + { + memset(infile_path, 0, sizeof(infile_path)); + sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); + ret = TEEC_DeployTa(infile_path, subdir, NULL); + if (ret != TEEC_SUCCESS) + { + printf("Deploy ta %d failed. \n", ita); + return 0; + } + else + { + printf("Deploy ta %d succed. \n", ita); + } + } + */ + + choice = atoi(argv[1]); + + switch (choice) { + case 1: + ret = testcase_1(); + break; + case 2: + ret = testcase_2(); + break; + case 3: + ret = testcase_3(); + break; + case 4: + ret = testcase_4(); + break; + case 5: + ret = testcase_5(); + break; + case 6: + ret = testcase_6(); + break; + case 7: + ret = testcase_7(); + break; + case 8: + ret = testcase_8(); + break; + case 9: + ret = testcase_9(); + break; + default: + printf("Error: invalid choice!\n"); + help_print(); + ret = -1; + break; + } + + return ret; +} diff --git a/cc-resource-pooling/demo/clientapp/testcase9/testcase.h b/cc-resource-pooling/demo/clientapp/testcase9/testcase.h new file mode 100644 index 0000000..7ced8e2 --- /dev/null +++ b/cc-resource-pooling/demo/clientapp/testcase9/testcase.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: multi_core_demo CA application header file + */ + +#ifndef __MULTI_CORE_CA_H +#define __MULTI_CORE_CA_H + +// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" + +#define VALUE_A 55 +#define VALUE_B 33 +#define REE_TEMP_BUF "hello tee" +#define TEE_TEMP_BUF "hello ree" +#define TEMP_BUF_SIZE 20 +#define THREAD_COUNT 3 + +#define TEST_TIME 10 * 6 +#define EXPIRE_TIME 10 * 6 * 5 + +#define RSA_KEY_SIZE 256 // 2048bits +#define RSA_MASSAGE_SIZE 100 +#define RSA_INPUT_ERROR_PARAMETER 0x10000001 +#define RSA_KEY_1 1 +#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign + +#define PARAMS_INDEX_2 2 // params参数的下标索引 2 +#define PARAMS_INDEX_3 3 // params参数的下标索引 3 +#define PRINTF_SIZE 32 + +enum { + CMD_NULL = 0, + CMD_SHARE_MEM_FULL, + CMD_SHARE_MEM_PATR, + CMD_MUL_THREAD, + CMD_SIGN_PSS_MGF1_SHA256, +}; + +#endif diff --git a/cc-resource-pooling/demo/dbusjwt/CMakeLists.txt b/cc-resource-pooling/demo/dbusjwt/CMakeLists.txt new file mode 100644 index 0000000..0c23113 --- /dev/null +++ b/cc-resource-pooling/demo/dbusjwt/CMakeLists.txt @@ -0,0 +1,71 @@ +# + +cmake_minimum_required(VERSION 3.5.1) + +project(dbus_jwt C CXX) + +# set(CMAKE_C_FLAGS "${CMAKE_}") +# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) + +# include_directories("${CMAKE_CURRENT_BINARY_DIR}") +# include_directories(${CMAKE_CURRENT_BINARY_DIR}/../include/) +include_directories(/usr/include/dbus-1.0/) +include_directories(/usr/lib64/dbus-1.0/include/) + +# Introduce variables: +# - CMAKE_INSTALL_LIBDIR +# - CMAKE_INSTALL_BINDIR +# - CMAKE_INSTALL_INCLUDEDIR +include(GNUInstallDirs) + + +set(lib_dbusc_jwt + ${PROJECT_SOURCE_DIR}/dbusc_jwt.c +) +# Install Headers: +set(HEADERS_DBUSC_JWT + ${PROJECT_SOURCE_DIR}/dbusc_jwt.h +) +install( + FILES ${HEADERS_DBUSC_JWT} + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${TARGET_NAME}" +) + +add_library(dbusc_jwt SHARED ${lib_dbusc_jwt}) +target_link_libraries( + dbusc_jwt + libdbus-1.so +) + +# Install lib: +install( + TARGETS "dbusc_jwt" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" +) + + +set(dbuss_fetchjwt + ${PROJECT_SOURCE_DIR}/dbuss_fetchjwt.c +) +add_executable(dbuss_fetchjwt "${dbuss_fetchjwt}") +target_link_libraries( + dbuss_fetchjwt + libdbus-1.so + spiffejwt +) + +set(dbuss_validatejwt + ${PROJECT_SOURCE_DIR}/dbuss_validatejwt.c +) +add_executable(dbuss_validatejwt "${dbuss_validatejwt}") +target_link_libraries( + dbuss_validatejwt + libdbus-1.so + spiffejwt +) + +# Install bin: +install( + TARGETS "dbuss_fetchjwt" "dbuss_validatejwt" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR$}" +) diff --git a/cc-resource-pooling/demo/dbusjwt/build/cmake.sh b/cc-resource-pooling/demo/dbusjwt/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/demo/dbusjwt/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/demo/dbusjwt/dbus_return_code.h b/cc-resource-pooling/demo/dbusjwt/dbus_return_code.h new file mode 100644 index 0000000..e59e9b5 --- /dev/null +++ b/cc-resource-pooling/demo/dbusjwt/dbus_return_code.h @@ -0,0 +1,26 @@ +// +// Created by 62754 on 2022/8/19. +// + +#ifndef _DBUS_RETURN_CODE_H +#define _DBUS_RETURN_CODE_H + +enum TEEC_ReturnCode +{ + TEEC_ERROR_JWTVALIDATE_FAIL = 0xAAAA0020, /* jwt validate fail */ + TEEC_ERROR_GRPC_ERROR = 0xAAAA0021, /* grpc transmission error */ + TEEC_ERROR_DBUS_CONN_NULL = 0xAAAA0022, /* dbus connection null */ + TEEC_ERROR_DBUS_NAME_ERROR = 0xAAAA0023, /* dbus name set is error */ + TEEC_ERROR_DBUS_MSG_NULL = 0xAAAA0024, /* dbus message is null */ + TEEC_ERROR_DBUS_APPEND_ERROR = 0xAAAA0025, /* dbus append argument error */ + TEEC_ERROR_DBUS_REPLY_ERROR = 0xAAAA0026, /* dbus send with reply error */ + TEEC_ERROR_DBUS_ARG_NULL = 0xAAAA0027, /* dbus argument is null */ + TEEC_ERROR_DBUS_ARG_TYPE_ERROR = 0xAAAA0028, /* dbus argument type error */ + TEEC_ERROR_TOKEN_NULL = 0xAAAA0029, /* fetch token is null */ + TEEC_ERROR_TOKEN_SIZE_ERROR = 0xAAAA0030, /* token size is error */ + TEEC_ERROR_FETCHJWT_ERROR = 0xAAAA0031, /* fetch jwt error */ + TEEC_INFILE_PATH_NULL = 0xAAAA0032 /* deployta infile patn is null*/ +}; + +typedef enum TEEC_ReturnCode TEEC_Result; +#endif //_DBUS_RETURN_CODE_H diff --git a/cc-resource-pooling/demo/dbusjwt/dbusc_jwt.c b/cc-resource-pooling/demo/dbusjwt/dbusc_jwt.c new file mode 100644 index 0000000..2445602 --- /dev/null +++ b/cc-resource-pooling/demo/dbusjwt/dbusc_jwt.c @@ -0,0 +1,458 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dbus_return_code.h" + + +TEEC_Result dbusmethodcall_fetch_jwt( + char *token +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + int ret; + int iType; + + unsigned char *charp; + unsigned char param[12] = "fetchtoken"; + DBusMessageIter structIter; + dbus_uint32_t retcode; + unsigned char *token_temp = NULL; + + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return TEEC_ERROR_DBUS_CONN_NULL; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + "fetchjwt", + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_NAME_ERROR; + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_NAME_ERROR; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", "fetchjwt"); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", "fetchjwt"); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", "fetchjwt"); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "fetch_jwtsvid" // method name + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null \n"); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_MSG_NULL; + } + + // append arguments + dbus_message_iter_init_append(msg, &args); + + charp = param; + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &charp)) + { + fprintf(stderr, "Out Of Memory. \n"); + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_APPEND_ERROR; + } + + DBusMessage *reply; + reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "libdbusc_jwt: fetchjwt send_with_reply_and_block error %s \n", err.message); + dbus_error_free(&err); + + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_REPLY_ERROR; + } + if (reply == NULL) + { + fprintf(stderr, "libdbusc_jwt: fetchjwt dbus reply error \n"); + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_REPLY_ERROR; + } + + dbus_message_unref(msg); + dbus_connection_flush(conn); + msg = reply; + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments. \n"); + dbus_message_unref(msg); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_ARG_NULL; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32. \n"); + dbus_message_unref(msg); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_ARG_TYPE_ERROR; + } + dbus_message_iter_get_basic( + &structIter, + &retcode + ); + + if (retcode == 0) + { + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments! \n"); + dbus_message_unref(msg); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_ARG_NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_STRING + ) + { + fprintf(stderr, "Argument is not STRING.\n"); + dbus_message_unref(msg); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_ARG_TYPE_ERROR; + } + dbus_message_iter_get_basic( + &structIter, + &token_temp); + + if (token == NULL) + { + dbus_message_unref(msg); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_TOKEN_NULL; + } else + { + if (sizeof(token) < sizeof(token_temp)) + { + dbus_message_unref(msg); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_TOKEN_SIZE_ERROR; + } else + { + memset(token, '\0', sizeof(token)); + strcpy(token, token_temp); + } + } + + } + + // free reply + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return retcode; +} + + +TEEC_Result dbusmethodcall_validate_jwt( + char *token +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + int ret; + int iType; + + unsigned char *charp; + dbus_uint32_t retcode; + + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return TEEC_ERROR_DBUS_CONN_NULL; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + "validatejwt", + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_NAME_ERROR; + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_NAME_ERROR; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", "validatejwt"); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", "validatejwt"); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", "validatejwt"); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "validate_jwtsvid" // method name + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null \n"); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_MSG_NULL; + } + + // append arguments + dbus_message_iter_init_append(msg, &args); + + if (token == NULL) + { + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_TOKEN_NULL; + } + + charp = token; + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &charp)) + { + fprintf(stderr, "Out Of Memory. \n"); + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_APPEND_ERROR; + } + + + DBusMessage *reply; + reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "libdbusc_jwt: validatejwt send_with_reply_and_block error, %s \n", err.message); + dbus_error_free(&err); + + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_REPLY_ERROR; + } + if (reply == NULL) + { + fprintf(stderr, "libdbusc_jwt: validatejwt dbus reply error \n"); + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_REPLY_ERROR; + } + + dbus_message_unref(msg); + dbus_connection_flush(conn); + msg = reply; + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments. \n"); + dbus_message_unref(msg); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_ARG_NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &args + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32. \n"); + dbus_message_unref(msg); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return TEEC_ERROR_DBUS_ARG_TYPE_ERROR; + } + dbus_message_iter_get_basic( + &args, + &retcode + ); + + printf("libdbusc_jwt: got reply of methodcall validate_jwtsvid \n"); + printf(" retcode = 0x %8x \n", retcode); + + // free reply + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return retcode; +} + diff --git a/cc-resource-pooling/demo/dbusjwt/dbusc_jwt.h b/cc-resource-pooling/demo/dbusjwt/dbusc_jwt.h new file mode 100644 index 0000000..5f2b495 --- /dev/null +++ b/cc-resource-pooling/demo/dbusjwt/dbusc_jwt.h @@ -0,0 +1,27 @@ +#ifndef _DBUSC_JWT_H +#define _DBUSC_JWT_H + +#ifdef __cplusplus +extern "C" { +#endif + +int dbusmethodcall_fetch_jwt( + char *token +); + +int dbusmethodcall_validate_jwt( + // const char * taname, + char *token +); + +/* +int dbusmethodcall_restart( + const char * taname +); + */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/cc-resource-pooling/demo/dbusjwt/dbuss_fetchjwt.c b/cc-resource-pooling/demo/dbusjwt/dbuss_fetchjwt.c new file mode 100644 index 0000000..7762a1f --- /dev/null +++ b/cc-resource-pooling/demo/dbusjwt/dbuss_fetchjwt.c @@ -0,0 +1,253 @@ +#include +#include +#include +#include +#include +#include +#include +#include "spiffejwt.h" + +#include "dbus_return_code.h" + +#define NO_ERROR 0 + + +void * +reply_methodcall_fetch_jwtsvid( + DBusMessage *msg, + DBusConnection *conn +) +{ + DBusMessage *reply; + DBusMessageIter args; + dbus_bool_t bResult; + dbus_uint32_t retcode; + dbus_uint32_t serial = 0; + DBusMessageIter structIter; + char token[1024] = "noToken"; + + printf("\n"); + printf("Received mechod call fetch_jwtsvid. \n"); + + // read the arguments + if (!dbus_message_iter_init(msg, &args)) + { + fprintf(stderr, "Message has no arguments!\n"); + retcode = TEEC_ERROR_DBUS_MSG_NULL; + } else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) + { + fprintf(stderr, "Argument is not string!\n"); + retcode = TEEC_ERROR_DBUS_ARG_TYPE_ERROR; + } else + { + dbus_message_iter_get_basic(&args, &token); + + int iResult = spiffe_fetch_jwtsvid( + token + ); + if (iResult == NO_ERROR) + { + printf("Token fetching succed, token = %s \n", token); + retcode = 0; + } else + { + retcode = TEEC_ERROR_FETCHJWT_ERROR; + } + } + + // create a reply from the message + reply = dbus_message_new_method_return(msg); + + // add the arguments to the reply + dbus_message_iter_init_append(reply, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &retcode + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory! \n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + return NULL; + } + + if (retcode == 0) + { + unsigned char *charp; + charp = token; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &charp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory! \n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + return NULL; + } + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + serial = 100; + if (!dbus_connection_send(conn, reply, &serial)) + { + fprintf(stderr, "Out Of Memory! \n"); + dbus_message_unref(reply); + dbus_connection_flush(conn); + return NULL; + } + + dbus_message_unref(reply); + dbus_connection_flush(conn); + + return NULL; +} + +/** + * Server that exposes a method call and waits for it to be called + */ +void +receive_methodcall( +) +{ + DBusMessage *msg; + DBusConnection *conn; + DBusError err; + int ret; + dbus_bool_t bResult; + + + printf("Dbus server for fetching jwt is listening for method calls ... \n"); + + // initialise the error + dbus_error_init(&err); + + dbus_threads_init_default(); + + // connect to the bus and check for errors + conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + // conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + exit(1); + } + + if (NULL == conn) + { + fprintf(stderr, "Connection Null. \n"); + exit(1); + } + + char dbusname[1024]; + memset((char *) dbusname, 0, 1024); + // sprintf(dbusname, "%s.method.server", argv[1]); + sprintf(dbusname, "%s.method.server", "fetchjwt"); + // request our name on the bus and check for errors + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + exit(1); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + fprintf(stderr, "Not Primary Owner (%d)\n", ret); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + exit(1); + } + + // loop, testing for new messages + memset((char *) dbusname, 0, 1024); + // sprintf(dbusname, "%s.method.Type", argv[1]); + sprintf(dbusname, "%s.method.Type", "fetchjwt"); + while (true) + { + // non blocking read of the next available message + dbus_connection_read_write(conn, 0); + msg = dbus_connection_pop_message(conn); + + // loop again if we haven't got a message + if (NULL == msg) + { + usleep(10000); + continue; + } + + // printf("Received one method call. \n"); + + // check this is a method call for the right interface & method + bResult = dbus_message_is_method_call( + msg, + dbusname, + "fetch_jwtsvid" + ); + if (bResult == TRUE) + { + reply_methodcall_fetch_jwtsvid( + msg, + conn + ); + } + + // free the message + dbus_message_unref(msg); + + } // end of the while true + +} // end of the function + + +int main(int argc, char *argv[]) +{ + int iResult; + + iResult = spiffe_start_conn(); + if (iResult != NO_ERROR) + { + fprintf(stderr, "Spiffe start conn failed. \n"); + return -1; + } + + receive_methodcall( + ); + + return 0; +} diff --git a/cc-resource-pooling/demo/dbusjwt/dbuss_validatejwt.c b/cc-resource-pooling/demo/dbusjwt/dbuss_validatejwt.c new file mode 100644 index 0000000..87d603a --- /dev/null +++ b/cc-resource-pooling/demo/dbusjwt/dbuss_validatejwt.c @@ -0,0 +1,219 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "spiffejwt.h" +#include "dbus_return_code.h" + +#define NO_ERROR 0 + + +void * +reply_methodcall_validate_jwtsvid( + DBusMessage *msg, + DBusConnection *conn +) +{ + DBusMessage *reply; + DBusMessageIter args; + char *token = NULL; + dbus_bool_t bResult; + dbus_uint32_t retcode; + dbus_uint32_t serial = 0; + + // read the arguments + if (!dbus_message_iter_init(msg, &args)) + { + fprintf(stderr, "Message has no arguments!\n"); + retcode = TEEC_ERROR_DBUS_MSG_NULL;; + } else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) + { + fprintf(stderr, "Argument is not string!\n"); + retcode = TEEC_ERROR_DBUS_ARG_TYPE_ERROR;; + } else + { + dbus_message_iter_get_basic(&args, &token); + printf("\n"); + printf("Received mechod call validate_jwtsvid: \n"); + printf(" token = %s \n", token); + struct timeval start, end; + gettimeofday(&start, NULL); + int iResult = spiffe_validate_jwtsvid( + token + ); + gettimeofday(&end, NULL); + int64_t i64Time_jwt; + i64Time_jwt = (end.tv_sec - start.tv_sec) * 1000000 + + (end.tv_usec - start.tv_usec); + printf("spiffe validate jwt used time: %ld us. \n", i64Time_jwt); + + if (iResult == NO_ERROR) + { + printf("Token validate succed \n"); + retcode = NO_ERROR; + } else + { + printf("Token validate failed \n"); + retcode = TEEC_ERROR_JWTVALIDATE_FAIL; + } + } + + // create a reply from the message + reply = dbus_message_new_method_return(msg); + + // add the arguments to the reply + dbus_message_iter_init_append(reply, &args); + bResult = + dbus_message_iter_append_basic( + &args, + DBUS_TYPE_UINT32, + &retcode + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_unref(reply); + dbus_connection_flush(conn); + return NULL; + } + + serial = 100; + if (!dbus_connection_send(conn, reply, &serial)) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_unref(reply); + dbus_connection_flush(conn); + return NULL; + } + + dbus_message_unref(reply); + dbus_connection_flush(conn); + + return NULL; +} + +/** + * Server that exposes a method call and waits for it to be called + */ +void +receive_methodcall( +) +{ + DBusMessage *msg; + DBusConnection *conn; + DBusError err; + int ret; + dbus_bool_t bResult; + + + printf("Dbus server for validating jwt is listening for method calls ... \n"); + + // initialise the error + dbus_error_init(&err); + + dbus_threads_init_default(); + + // connect to the bus and check for errors + conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + // conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + exit(1); + } + + if (NULL == conn) + { + fprintf(stderr, "Connection Null\n"); + exit(1); + } + + char dbusname[1024]; + memset((char *) dbusname, 0, 1024); + // sprintf(dbusname, "%s.method.server", argv[1]); + sprintf(dbusname, "%s.method.server", "validatejwt"); + // request our name on the bus and check for errors + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + exit(1); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + fprintf(stderr, "Not Primary Owner (%d)\n", ret); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + exit(1); + } + + // loop, testing for new messages + memset((char *) dbusname, 0, 1024); + // sprintf(dbusname, "%s.method.Type", argv[1]); + sprintf(dbusname, "%s.method.Type", "validatejwt"); + while (true) + { + // non blocking read of the next available message + dbus_connection_read_write(conn, 0); + msg = dbus_connection_pop_message(conn); + + // loop again if we haven't got a message + if (NULL == msg) + { + usleep(10000); + continue; + } + + // check this is a method call for the right interface & method + bResult = dbus_message_is_method_call( + msg, + dbusname, + "validate_jwtsvid" + ); + if (bResult == TRUE) + { + reply_methodcall_validate_jwtsvid( + msg, + conn + ); + } + + // free the message + dbus_message_unref(msg); + + } // end of the while true + +} // end of the function + + +int main(int argc, char *argv[]) +{ + int iResult; + + iResult = spiffe_start_conn(); + if (iResult != NO_ERROR) + { + fprintf(stderr, "Spiffe start conn failed. \n"); + return -1; + } + + receive_methodcall( + ); + + return 0; +} diff --git a/cc-resource-pooling/demo/libspiffejwt/CMakeLists.txt b/cc-resource-pooling/demo/libspiffejwt/CMakeLists.txt new file mode 100644 index 0000000..f20ce44 --- /dev/null +++ b/cc-resource-pooling/demo/libspiffejwt/CMakeLists.txt @@ -0,0 +1,56 @@ +# +# + +cmake_minimum_required(VERSION 3.5.1) + +project(spiffejwt C CXX) + +# include_directories("${CMAKE_CURRENT_BINARY_DIR}") + +# Introduce variables: +# - CMAKE_INSTALL_LIBDIR +# - CMAKE_INSTALL_BINDIR +# - CMAKE_INSTALL_INCLUDEDIR +include(GNUInstallDirs) + + +set(LIB_SPIFFEJWT + ${PROJECT_SOURCE_DIR}/spiffejwt.c +) +# Install Headers: +set(HEADERS_SPIFFEJWT + ${PROJECT_SOURCE_DIR}/spiffejwt.h +) +install( + FILES ${HEADERS_SPIFFEJWT} + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${TARGET_NAME}" +) + +add_library(spiffejwt SHARED ${LIB_SPIFFEJWT}) +target_link_libraries(spiffejwt + libclient.so +) + +# Install lib: +install( + TARGETS "spiffejwt" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" +) + +set(TEST_SPIFFEJWT + ${PROJECT_SOURCE_DIR}/test_spiffejwt.c +) +add_executable(test_spiffejwt "${TEST_SPIFFEJWT}") +target_link_libraries( + test_spiffejwt + spiffejwt +) + +# Install bin: +# install( +# TARGETS test_spiffejwt +# RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR$}" +# ) + + + diff --git a/cc-resource-pooling/demo/libspiffejwt/build/cmake.sh b/cc-resource-pooling/demo/libspiffejwt/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/demo/libspiffejwt/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/demo/libspiffejwt/spiffejwt.c b/cc-resource-pooling/demo/libspiffejwt/spiffejwt.c new file mode 100644 index 0000000..49a060e --- /dev/null +++ b/cc-resource-pooling/demo/libspiffejwt/spiffejwt.c @@ -0,0 +1,254 @@ +#include +#include +#include + +#include "c-spiffe/workload/client.h" + +#include "spiffejwt.h" + + +workloadapi_Client *client; + + +int spiffe_start_conn() +{ + err_t error = NO_ERROR; + + client = workloadapi_NewClient(&error); + + workloadapi_Client_SetAddress(client, "unix:///tmp/spire-agent/public/api.sock"); + + workloadapi_Client_SetHeader(client, "workload.spiffe.io", "true"); + if (error != NO_ERROR) + { + // printf("client error! %d\n", (int) error); + return error; + } + + error = workloadapi_Client_Connect(client); + if (error != NO_ERROR) + { + // printf("conn error! %d\n", (int) error); + return error; + } + + return NO_ERROR; +} + + +int spiffe_close_conn() +{ + if (client == NULL) + { + return -1; + } + + err_t error = NO_ERROR; + + error = workloadapi_Client_Close(client); + if (error != NO_ERROR) + { + // printf("close error! %d\n", (int) error); + return error; + } + + workloadapi_Client_Free(client); + if (error != NO_ERROR) + { + // printf("client free error! %d\n", (int) error); + return error; + } + + return NO_ERROR; +} + +bool utf8_check_is_valid(const char *string) +{ + if (!string) + return 0; + + const unsigned char *bytes = (const unsigned char *) string; + while (*bytes) + { + if ((// ASCII + // use bytes[0] <= 0x7F to allow ASCII control characters + bytes[0] == 0x09 || + bytes[0] == 0x0A || + bytes[0] == 0x0D || + (0x20 <= bytes[0] && bytes[0] <= 0x7E) + ) + ) + { + bytes += 1; + continue; + } + + if ((// non-overlong 2-byte + (0xC2 <= bytes[0] && bytes[0] <= 0xDF) && + (0x80 <= bytes[1] && bytes[1] <= 0xBF) + ) + ) + { + bytes += 2; + continue; + } + + if ((// excluding overlongs + bytes[0] == 0xE0 && + (0xA0 <= bytes[1] && bytes[1] <= 0xBF) && + (0x80 <= bytes[2] && bytes[2] <= 0xBF) + ) || + (// straight 3-byte + ((0xE1 <= bytes[0] && bytes[0] <= 0xEC) || + bytes[0] == 0xEE || + bytes[0] == 0xEF) && + (0x80 <= bytes[1] && bytes[1] <= 0xBF) && + (0x80 <= bytes[2] && bytes[2] <= 0xBF) + ) || + (// excluding surrogates + bytes[0] == 0xED && + (0x80 <= bytes[1] && bytes[1] <= 0x9F) && + (0x80 <= bytes[2] && bytes[2] <= 0xBF) + ) + ) + { + bytes += 3; + continue; + } + + if ((// planes 1-3 + bytes[0] == 0xF0 && + (0x90 <= bytes[1] && bytes[1] <= 0xBF) && + (0x80 <= bytes[2] && bytes[2] <= 0xBF) && + (0x80 <= bytes[3] && bytes[3] <= 0xBF) + ) || + (// planes 4-15 + (0xF1 <= bytes[0] && bytes[0] <= 0xF3) && + (0x80 <= bytes[1] && bytes[1] <= 0xBF) && + (0x80 <= bytes[2] && bytes[2] <= 0xBF) && + (0x80 <= bytes[3] && bytes[3] <= 0xBF) + ) || + (// plane 16 + bytes[0] == 0xF4 && + (0x80 <= bytes[1] && bytes[1] <= 0x8F) && + (0x80 <= bytes[2] && bytes[2] <= 0xBF) && + (0x80 <= bytes[3] && bytes[3] <= 0xBF) + ) + ) + { + bytes += 4; + continue; + } + + return 0; + } + + return 1; +} + + +int spiffe_fetch_jwtsvid( + char *token +) +{ + err_t error = NO_ERROR; + + if (client == NULL) + { + return -1; + } + + spiffeid_ID id = {string_new("example.org"), + string_new("/myservice")}; + string_t audience = string_new("spiffe://example.org/audience"); + jwtsvid_Params params + = {.audience = audience, .extra_audiences = NULL, .subject = id}; + jwtsvid_SVID *svid + = workloadapi_Client_FetchJWTSVID(client, ¶ms, &error); + if (error != NO_ERROR) + { + // printf("fetch error! %d\n", (int) error); + return error; + } + // printf("Address: %p\n", svid); + + spiffeid_ID_Free(&id); + arrfree(audience); + + if (svid) + { + if (token == NULL) + { + jwtsvid_SVID_Free(svid); + return -1; + } else + { + if (sizeof(token) < sizeof(svid->token)) + { + jwtsvid_SVID_Free(svid); + return -1; + } else + { + bool bResult; + bResult = utf8_check_is_valid(svid->token); + if (bResult == false) + { + return -1; + } + + memset(token, '\0', sizeof(token)); + strcpy(token, svid->token); + jwtsvid_SVID_Free(svid); + } + } + } else + { + return -1; + } + + return NO_ERROR; +} + + +int spiffe_validate_jwtsvid( + char *token +) +{ + err_t error = NO_ERROR; + + if (client == NULL) + { + return -1; + } + + if (token == NULL) + { + return -1; + } + + bool bResult; + bResult = utf8_check_is_valid(token); + if (bResult == false) + { + return -1; + } + + // string_t audience = string_new(audience_name); + string_t audience = string_new("spiffe://example.org/audience"); + jwtsvid_SVID *svid = workloadapi_Client_ValidateJWTSVID( + client, token, audience, &error); + // printf("%s %d: spiffe_validate_jwtsvid error = %d \n", __FILE__, __LINE__, (int)error); + printf("libspiffejwt: spiffe_validate_jwtsvid error = %d \n", (int) error); + if (error != NO_ERROR) + { + return error; + } + + if (svid) + { + jwtsvid_SVID_Free(svid); + } + arrfree(audience); + + return NO_ERROR; +} diff --git a/cc-resource-pooling/demo/libspiffejwt/spiffejwt.h b/cc-resource-pooling/demo/libspiffejwt/spiffejwt.h new file mode 100644 index 0000000..0d2e774 --- /dev/null +++ b/cc-resource-pooling/demo/libspiffejwt/spiffejwt.h @@ -0,0 +1,13 @@ +#ifndef _SPIFFEJWT_H +#define _SPIFFEJWT_H + +int spiffe_start_conn(); +int spiffe_close_conn(); +int spiffe_fetch_jwtsvid( + char * token +); +int spiffe_validate_jwtsvid( + char * token +); + +#endif // _SPIFFEJWT_H diff --git a/cc-resource-pooling/demo/libspiffejwt/test_spiffejwt.c b/cc-resource-pooling/demo/libspiffejwt/test_spiffejwt.c new file mode 100644 index 0000000..b4a3f42 --- /dev/null +++ b/cc-resource-pooling/demo/libspiffejwt/test_spiffejwt.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include + +#include "spiffejwt.h" + + +#define NO_ERROR 0 + + +int main() +{ + char token[1024]; + int iResult; + + + iResult = spiffe_start_conn(); + if (iResult != NO_ERROR) + { + return -1; + } + + iResult = spiffe_fetch_jwtsvid( + token + ); + if (iResult != NO_ERROR) + { + return -1; + } else + { + printf("The feteched token: %s \n", token); + } + + iResult = spiffe_validate_jwtsvid( + token + ); + if (iResult != NO_ERROR) + { + printf("Token validate failed. \n"); + return -1; + } else + { + printf("Token validate succed. \n"); + } + + spiffe_close_conn(); + + return 0; +} + diff --git a/cc-resource-pooling/demo/scripts/dbus.sh b/cc-resource-pooling/demo/scripts/dbus.sh new file mode 100644 index 0000000..78602a7 --- /dev/null +++ b/cc-resource-pooling/demo/scripts/dbus.sh @@ -0,0 +1,10 @@ +# export $(dbus-launch) +# echo $DBUS_SESSION_BUS_ADDRESS + + +export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-mE1jFGBAsx,guid=dad6b93cccad1aeca78dd84162f7968b +echo $DBUS_SESSION_BUS_ADDRESS + + +export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-TdbAmwQsui,guid=3556dc166fba4469e0f7f87762f4d56a +echo $DBUS_SESSION_BUS_ADDRESS diff --git a/cc-resource-pooling/demo/scripts/spire/createentry_workload.sh b/cc-resource-pooling/demo/scripts/spire/createentry_workload.sh new file mode 100644 index 0000000..e18be75 --- /dev/null +++ b/cc-resource-pooling/demo/scripts/spire/createentry_workload.sh @@ -0,0 +1,9 @@ +# bin/spire-server entry create \ +# -parentID spiffe://example.org/myagent \ +# -spiffeID spiffe://example.org/myservice \ +# -selector unix:uid:$(id -u) + +bin/spire-server entry create \ + -parentID spiffe://example.org/myagent \ + -spiffeID spiffe://example.org/myservice \ + -selector unix:uid:1000 diff --git a/cc-resource-pooling/demo/scripts/spire/gentoken_agent.sh b/cc-resource-pooling/demo/scripts/spire/gentoken_agent.sh new file mode 100644 index 0000000..afda869 --- /dev/null +++ b/cc-resource-pooling/demo/scripts/spire/gentoken_agent.sh @@ -0,0 +1 @@ +bin/spire-server token generate -spiffeID spiffe://example.org/myagent diff --git a/cc-resource-pooling/demo/scripts/spire/runagent.sh b/cc-resource-pooling/demo/scripts/spire/runagent.sh new file mode 100644 index 0000000..41918e9 --- /dev/null +++ b/cc-resource-pooling/demo/scripts/spire/runagent.sh @@ -0,0 +1 @@ +bin/spire-agent run -config conf/agent/agent.conf -joinToken 16047f93-a133-494e-865e-033617d33eec diff --git a/cc-resource-pooling/demo/scripts/spire/runserver.sh b/cc-resource-pooling/demo/scripts/spire/runserver.sh new file mode 100644 index 0000000..1907eec --- /dev/null +++ b/cc-resource-pooling/demo/scripts/spire/runserver.sh @@ -0,0 +1 @@ +bin/spire-server run -config conf/server/server.conf diff --git a/cc-resource-pooling/demo/scripts/spire/showdelentry.sh b/cc-resource-pooling/demo/scripts/spire/showdelentry.sh new file mode 100644 index 0000000..6a0183f --- /dev/null +++ b/cc-resource-pooling/demo/scripts/spire/showdelentry.sh @@ -0,0 +1,10 @@ +bin/spire-server entry show + +# bin/spire-server entry delete -entryID + +# rm -f .data/agent_svid.der +# rm -f .data/agent-data.json +# rm -f .data/keys.json +# bin/spire-server entry delete -entryID + +bin/spire-server entry show diff --git a/cc-resource-pooling/demo/scripts/tcpdump.sh b/cc-resource-pooling/demo/scripts/tcpdump.sh new file mode 100644 index 0000000..a01f5d6 --- /dev/null +++ b/cc-resource-pooling/demo/scripts/tcpdump.sh @@ -0,0 +1,2 @@ +tcpdump -vvvv -XX -i lo '(port 50051)' -w 01.cap +tcpdump -vvv -XX -r 01.cap | more diff --git a/cc-resource-pooling/docs/Design/design.docx b/cc-resource-pooling/docs/Design/design.docx new file mode 100644 index 0000000000000000000000000000000000000000..d26d09a258e30e8720ad40b34f9a8e1907056222 GIT binary patch literal 1180936 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�w#hZ-d?cbXL?U%=0~|Z!8>2pY5|+S=5G7iK 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

$ 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 z%0D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

=OKNd`f}eO0BSKsFp#U{m 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¨RH@=By=jRRu#H+K9;G&AsO9zYd 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�RJ!>tzfZ`nN&BNm5TAP6Y??X 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

xc7-xrTA9QQ}e;}&l>LJTM8Qt+zX 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

m)`;o0uN{FI@u1ZBeR`ePy=_ zZD1`HMcw~V(W~*Qav~%xA{0-G0-lWCwGm?Q%QG_10sJ>P4f~c(gQZnj59}`qlH1J* zPLi756_gW+N~8Ce6Gvtu0}($EcB5(lxK*c|$%$Xo47q^COv+hiGLH+IwPuq+3d=VU z#Ly_@y`CiekeM%s@%rbMw*m6dZSYR4q)A>;c#x?C^D1w z&CiZp#!3bd*jpNA8nz~PoLsR z7scDN*~>f5yYkqETaV!|g?p+*D=kZsWtIi%<1oi_rVbX2S=SCyHXn3LIiSBq8W{q$ZE8Yj-MSClm`o9wP+8j9mzs`#!h8$P5= z7Tzyy$=9X@(FECkm$E<@|Ug^s;aGtBGca zld~3M`0zh_6J!deGKXfbnH(Grdt8+`d$Fg9tsy9^cfQnwT@tYL!e;K=1x2 zyYPyCkJrntN_$H>09ckTq~HUj$B2#21W`74_iwG;LN_B z)&M62p9VXh?(Fb7EPdEB{b9Qs@G#2_tf-N|W?DjFx*a@h`5cp;-4L`TmE+zWbVIaO zQCH`BLgw~E4Dahm|4H8ItQUjVHvPISBop^0-KMWxlRvK||2q|aYtBVJH8?e;$9~wY zI|rfgaU6Rs`2)A#C_`#5R&HU9vIuFF_UMLyzOJ*guIn@Ulpu!86lX=#g{7!5JIe3c z4o~J)e`su<1hKgFAY?PklEeDj&D%zeMdkFY)#&Yu+M(TQq((NsLdL!e_7k)Vc49}0 zm+`4{vINelC{4@7spY7zj5G00Br4?FOOS6M>M|!;9;osk_dd1agE?}Ktb z#$wdv%wakBqPTLDyo#nBo(yWN%Em=KyBu~ll`XxF`5p>b*@#l^D<4#MMa54~uWh3mYVAGS!-=Q3742gBwR@xmdo zG4dhd;Xk>>&xg#$hU~)}-X90&YM%gOS3k9%w0xd@;&#o#3$P4G9LV1)NL@DSGKo_# z4)ulR{hYN(3s&V1!jlX8WMfyE32Y|e&!VkttyGI&N_spf>Ul)MdnG@fGft@S!A{LY zMWgejdgA*LN&zJnxxxv#PQj7Nc)^vAV~`_!0h`1Yv*y%xmiShJ^IZ+&s(z8@U+tgL z#SlLno3;f>eSBpvFJl{Q^PRnw8<6gKu=Z3v&yGtaa-5&sZuIBY!=V;AE+>1X_zKWF z+J|F5pf%8ZZX^%QpE^*zu`4Mq4ksw7u+1K~;a1>rd0dTNHoi+fEwvLjM$9J7jq_P;QxQ{JpGTOBmPG$;{%ABuQ@wzxx0!zfwld@qy9LG ziPtM^)>iSA<)Ad6I~nr(C_Ne&;ptDuFzq}ic-kWeC{X!qspYOkqL?VYI2(WcWGo*^ zM##agYyjiY37Mhxxpn|pvN}~Of{^*9*y)%wo4n^c;FGugNp{+LJcH|Yvs0J`pBd-f+J4C&2$u=M=u+9F2A&d_X%9N`oKRDsW6xnNKE{C{$bHj!(DhrtdI} zza()mT8eizJ|-Dp&8L0pNg}=lMKx*WwdId(@YaqlS%=6sf~R3>q&doI4<&&p zH4;$x)Uc_Hze1t3c@ABTa+jWcwB}(q_8VpkLu{Q8NoO%Zdioj=J`ZhI9&cvgSfJu( zwYr@A%4lPuah=)j3CneBzd=RiY{xE3Vedb8h#+zl3Ur9)e>x(+k z$5yPAL`zaD_J@8;r1`B+J#j<$QBC(NS*jlfDuihyWGYUW@CVP|VUT~;=|QrOV%KVR z;EO)g-(XWzHv8x<`>SgtLGz;;)h1K4d8*-?m4)9SuwSPA-$odu1IeU>S*AZ8skFV} z2Pq0p!@tS4E-nT8G{784za-`x`SjFZ4WS)jIi5SAg%kt>_H>wndTMkuz_4xF{B*=+cKz;)wc~KjB6@ zc#l5(ZyIMFDK_TuKU6&o35(BgDnnk*sskI_$rN_#BEK68Mh|^b-XeHsI!{J!F$kH- zv<`CXd+RZc88i5xxBDWEWE9QU=;fvSA|(1-zdj>rIB3P^?f;8ES!4B`I4Nq!wvXSP z0CVzVo^b0YJeXR`d9kvV33R5j{J<>Xxw%u7U+wrLQA@BlXLDf>(1c>V{mf5NhJI!H zzh(LS=a{ee%WE3BCxWNza;ie^_uW%M8C3Ka#TRI!ay7R0N2W71P3w-yTt{G)MO|BR zOeu0}%d%?A{`ZP1b@Ng6%;t(qoQ+*Wtf{g0H?-|320EM}goE=tKTR(#oI+mKEoj~bo z_)xxm&3?yNgRaHf=iJ-Sua0@i7yi?i98VpQdeQp0L<9>n5%J=L?3Y#K2oZQaq*M}_Ep{MG5tPQWI zgCACFF{`F{{&bsCP^yY6l4!B%8|W9KlYaMp;|sd4{KwdlxXg-K=f$0d&F&9B-3GnG z2tve!sw34;&T#NMpDv6&8u(XQiYXptreR%%y*7d7)!?<$(7#5P`!c%BOWyB9*pZ!~ z_<-@`-par6LjGMG5C4_2{+(X(U$X)9Rq3g2)IMq?L{m0a) zL5qoM-%3d{(J=&^QOOE?RikxTxyJzF8?IM`LD@`NM0NT0(s2|o zu8Q3I%`1j!lQ00QuCt#MED>7}ZBtJiSqaZ4g7nxG(hD9I?$YPeOR|=|9G#0+s#z(G zz$&t53=+zz!(>H^(g00EL~~~T50&r#V`IU3%T{Ys<{*j=-9n}Z#xKtqrH-P+`6mB{ z+2#!#kURUU;;ips{9HD2TBgSO?Ab_5lA`oTs1zfGUXH*AqMDLj@yt2!@4Xk#Ln@g7 z8(*Sl@N}0F?2H7A(AwY~&ws#Od`X!)5??`NP0IT0FX`_g@w;Q(FNX8_zbH+I#NPyX zxnj6Sy}o#GgX+6CA%?k1e3tO)(f?1A@NDuvF&E%-HeD-du?%@ugBAh?F7vaO=L2O+ zCV^jvGB2N2ypKwQzvkiLC(haAFrrTTKTZb!MXQ*$a^FWc>wvFhFMSsIX)rJ(?xz3a z2~cmpiPDrv-N%SWe+bbc`_Csp3350&SYlwjzYBn=D$6{3LiPlm=$V`>NF6;Z-e6#0 zK_A~oUs;NHor(U!c9PX`Mb9tee?IrHQY+FhFlaF3KyNfXQ+MVpzff#?F`ln0WuWXm z+`(54yo#7sPv4WiHx;C_3>q7XVT2Pf_b52e%uNl=Ly+xr^YiVsV!KjI1ku{Uuo3wj zLMb>wJG~H{rEKIGi6?Hw8y~%SOYP({am`lVK9U!oY&7ozs9z+F>*%QP<(J(hU66GM zF`}!5fnjAWS^f{$;r$tU-HNjGC`=RSsRs9JGO&XfM)`^AjRk|wql(^}|6yra9T{sk7) z7XyJJ22bkAA2o5eU`_0>EXI!{97-ckzN4Q-7ntP0dN#QmqoRa7 zP+y!A{Eeav|5FfusLi~S{rsOtkH4_UTaEh)jD==vc%(qu8CtuD#}{tatk%&rb-GHw z{Uo4~aEQ*$Ve{zj?7RJ^B@1vVbNz42PK&4#UPNfWl;-D!i_4san^Qr|hkx2)^{+IW z`rl;NS`R_zQEfJE*ITh*fjQZXmGx7{X~6cuk+y`poi8!J@E_5=*AqTW!(q%wwt^C3 zkbm6%eRqu*jMqYxtW| z+J900Ray#RPSZ^UwE*Jr`)6(3cD~HIBr_L(+K=%+(eA%gng47e|1W2vVgvnSicTU} zO_seet#fjk;%FYRN@k) z3~`DNa5>G|AJEzY`xALCE+DIq#3jZHWbSTQ898+qfehi5QS<*sxz3|k-IxOAjou;|_X z^1wX|J12C1CJ&!^Vn_UoC0aLKY_(*g=MI>HH&(tb2!WkW5mdGv~Q2EVPNh_|AVA# zsNYvdqc%=>nnblA-)?;`UYnEAc`IZ$jYgWO>^dP$V*1q@dA z3k#@@px$4o8@23Xqw=%Ru?n;ItKh+d?}V0~Z)KGpZ7bs>W;0N4Y|R2jc$@Rc@>~@X zBF*!)klYwn+^hcYBP35M=&Q~f!fRG$+&fWpvY8Tl5l^MPap@3E7ZVC9SzLmTel-Mk zFW=mq!iMehe-(Qje`=u3AQ8Px2p&u=6b20!m9pb95KhuC4jnW@OQ2q(GFRSvB4^7B zimSb;A+c2(GPj+WVrhpnQPi7rN$hopB7`)#pE8gKzt-!n(^)48qD90T`TXn-vzn+B z)*bv+)$nf5{hL5-l&r1;Kl4GWoAa}LHG{U#WKZ@!P~w8ddpX6ftvt?fmFrJG(YMk7 ziO7`wf1jPXfl8qGRQ`nl>$WmYSHw6cm;DA$G4_c5wDL0mFnw`7ouQbmp{R;#dwVnM z@gT9#&CiPILfV^QZs*CpMV9Q7im2O68w1KJnW&D58)NfuNwqi~r~`jOItQ71){2n~ zFAMANVpS(%J)6TKEP_+qw2c28^f9GlL@zIyajKk_DQv7N$I@wX>p9f>F|;b83a-bbl+o9Xxl1{hoXd0*Wv?Tq zA?#Yr=GJj~(;;iA2wX-@A0um{DR7~CkFm+Vd$15<%sc+E`$)Y4jx^oGS`diWH7GiO zmn>Ee`>N&bmf{TE2f1WAZWqPbMs8VZ(`XLZ{b{~l=a7&@x}N-B_MO}iAReKddZKMn zQE_YH54lX)V$_s-!h#d4!51kx0EzSL&ouY`Cy75`nX(a`Qd-e;=s03uLo(f3ZLt;A z>D6d*9A+nvU)YUx3s!FrxSKu?O=g4Ha1$$ZWhZ$09MU*A+fkmr*ff<5HSCK|DI$c_#13gPB7>c43tuV{E29c%3tf zAI8`DZF6(^meX!Kyod6v^1@I*5Ay7`ue!)~u&TrQF~Ea0A>QD6B_^zQyLbeLn`aGd zcsIJjqfj+gdH&0BpK=eJrE269wU3ngZmYsQT?BA;wb@IO5Kb7>{RrFyXceXqahziE z&IWbggfojv)t@?b&v}nSDL9y-GoL_<9A-hFOqTAR@o`p_1hKN$4h<%*Ks>B=S}uRD z6Ye(vb1k=sI&%O%Ry*sAmaSjpOEoY-Qf<8X!~_aQEzVqPG163Pm(?C91<^KZF4D6| zBZ#7VQEjsg?J`pv2DzkqkH2Y^u6d^2s9POEb~Z{1fD0tm>=R!}Ql*Q#Y_8%IR0;#& zGoxO=aT@$1IGcE(hp2FR1z40FQ>~7o9B$2m0Jj z-?^pLfp;c?J7-}Qbw7o*-ig=MN9*DMO@5^yN$qFxVDt^Z>cg1nK7HfMqS&PufNshq zu?$ih+*%%qRQ)(V%rizHm#$!a;ZtZ;yOgQ8`|;Iit(_^DO>ju;a?|X!2Y4Y>^gzAN z0e|!){bm=QZsZdMUWFQSGzq8c38oc~2?Eq;>h}v;?O*EpF70SC*Q1Pl*c8J!l~P5b zOPXdG`Z4xJSRwl99J64F7#m-@oijroJn{9wO}5d>b0a~3I$cuUuE7UEI1O_sjT{K< zNHk`-KJU$^0@BPQQjXpAGYG_<|3Q~8$wYB@MK4{?T`9<=kxQN$zSZuSu}9@yBj(n7 z___IYp@u1l&K7Yy{vjPnI$~q3~3HhzJ zkiuX(X$p5pS85k0)xhZ)lqr*dp_-_A60F`=3s;ihAu+}}l&A#`ll z;|`Mz*`F#qJ93^bOucEo2#=jQEB!pk$h9}2eYD;rAk<`s2PYYlX{<0gtdl=2eCA@`AeDlZ z_OjK7&@Wf)D;{7vOV_J~4(LcXR$eXkwa%Ya;8zR=r2A6f)TKlH$M44C zMzx0d@7{GW@FGBo3>|QWbUWbH^t|)dMSv~?(6MZ#`Of=Cj$y*YK&>ezwc8qI7PX&< z3P@g%_i`Ii6%{0!Uio6QA*Z!?A{s&*d2Li>6g^M4F}Fa4<5W^;uY%R$9Ec7@&&tO< z29LEaDDei~c=OAE=z8sOPjIOpD5`XULiZvZTXUX1Zi$;S$_33;_;ik**>Y_pX z=n84advCssk>`6*H10i5))VBuU5>)J{m_VeH?PV|R~=yGIT<*%&AB$&^u!~A6?ZH` zx7|4egr^l)pGlGM09ZDsKHwF+jImg3>%9k-_P=WW6op0i&H0yUI9ErA>i}i15JOn6 zgRfp;Ipp#A*Z||0QI2G4;%m^DyP?c0myN&xT|UZenYWZ8rlCudCjKfivI#JJ({L-g zc^)#K+W;R^n`t~v<~sI?q}Xufh9jr#!eS(mbW01_yF%iWS`2&G`ZdVWZu~Q@NR?_2bnjO3E#ud~kZ= z4H1rm&F>clH)Fy!V>d(P?G$)t@^JlZeAx9wj<4fv+J*+00JZM3sJ>LzlK8-?$PhYP zzo-ZEg7B48vl9NF5;WW{@|Af>sV`Y(B`SUPWm=+bQ5+WFb(>`jLh|ncund8>=J4Xhh^x6umAlo~~^wvE6_BM(4+j zL>@H)cfv>x-_sCP^q(~Vf&8yO*Z%gyv zFG>%jT`f$K@piSglCHZg*Lqgx4)PjhRbyMerDbf$-}H~oK%_e=zJO_$BW)3>I#qAv zCxfdZ_HeuLTzj&37BW~!e^km;i_I^MwncvWM7w_I*boa57A<#rCCpn`KnWAW=*wB_ARczQ7%-gWkPx7pqao1{bQTT7(N} z`(4UdMrH5`n$8b=$y10OLyx4AQ)Mo;CQqst=t!sgG zFup=Upp_(;K5MrbdOF%yIh^NfjcQQ{%Mx}aI*gk+*#{WW;`q~04Uy9Jq#=&iJl1#$ zf=0*#Hat%0O!qhUOEd&RwHq`>vBXHfxWieV1DLz{qfVhJtd@nk{aNp2srZay*Vl@w zXD`VLIQv(r!a98w_n&y!;czs@BeK2HHg<7)HLF5oCo$)Y(J^}`731=(QgE`%-zLy8 z^M8FT)8!r#atsnos>o4}rQjXGw902#_g|15qQ!?d9FOvJrgJ!DejFpZv(X3k3|g## zpB8n#1%bkACl1Rk)9)tqvzGHakD3F{j8ybvTN|rxe`g(3zEmcm6^Zd%xf2ue&))cw zXgVL|C-m(V(KOz34@GuEA*6G4RkYYC*mAurGE=xx`EDM!!kT-<;-qCE&3_xE6&&-G zeNtBJ{2;M#vjO+B3T1yh7+n*?9V&_;y1W%rJ!%6u@ZK(d!(hD3 zTsQw$FB=V9WHWEd% z2m(;Gir?Dsje!iZ25DXL?Bi9Z@*lJJFNtxX%GrZAPBzxxYSi6Bn7EhEHtz#q&A&EE z<|d~|@gL|g0N>c2@mwUIVqYL}0-P{t^$XJVY%Y(QE$xVFyAIw@(F`3_vvoe1F3uyGz*5YnaxwL^G!c=t zuQ}v)OqnzVz?EWiyLbz0rGcB1vK2fSou`lF@Ic)g-K!88y5&^F$w>k|OI%EFSzM?B z$fB56NNqdx3QH%{lMl5eUGHmby{SID1X?AC>L-?n3Asq5IA#JwXmdDf6{KCS)$-)H zM%*oT$@0z@zmh)DgqpC-3NqD7yQ7vRFWwISRQb)&n#rIs-P7<2dJ7*IPOGDM?1mK* zQbLhJ5g@kj0xat=G?>1EpMC-VcGx7dp>DEbczEe9Z3dQiEioVFzc()?5+iQl~~`q@1zt;H!IVLRrW@fs!@;XmOrfC zGz1>ublzQDx0hF{s#^2DVHmhTwe>?fD=3y7tQ)KLMBA!DFKjzD@(Lpjna=2F!{rXH z>c&RfZ(mZ=0%zZOdQHE?^X9FD2MR*$36_K{hF>m^XD!#!EDKkyji_1j;j4g=QPTH=+0M&JhX-$ ztVS`!+#pPhxoQf|VDP<;T%Ald?lR)u=_8Op|4qF~aee8#X`$80&x^%-16|is4IJ3bUfH*>G7nrjBQl} zET0oX!#8ZST6K7N7DVguRlz};YG)M-)DVu~PX-@C!fUfGu6=IWF_nWN=Bl%aAKtrb(Wv$CpYT!B(-Awa?8#yuZpOuZx^v7LNL{#($hVqe3>v;D@w(+*%XO<13^%er=0 z)kGz08?sX4phE%_Uc71E3rRqL?mJfxD=yR=_vtvwHtv5?(=v_*PG$8ZIfftI&O=l{ zA%+fjgX9QPu=n-EKwteixMI8eL-Ve`4jx@#NR6#dVE6HPl4eAR-QEPG?hwk+)P1bU zP>EdG)=KJ}tk$4NL0o&379);Le4^@60juy1n{d}quuTk|V!Fypd=`CFrF=k3@0 z$I=(|n?ow~e*u0Ev565G0E;`_4{s*1CZ|};$_*uon z>{J?Y^gsmv(Wp7a_TuSSLi|9+&gQ1vD~2iw-m!!0rK~5;12BAmMoaz5`iE!|QK{E%52dWk|-w!dctf%nAJc%^VnEt4j?V7yYU!PHlV3xZ{@{ts3)& zn?Mm)V;kr>(L3#|iKN8o)tfg{)6p!@c>y z9{P>YdyT0Qht!6oQF$Lt6H16)Ph1}!-F1e2_^DW|VNiqz5gJ_|@4m3S8?7Om5M?Pq z*=8@*O!6X2IL)5lZT8AwHIJ^Tbun8i73?`7%Rfa};-88+y6o+H`u^krM(fo6jyOoA z2>}YIqvA^K@;u)zP%BZ_aq_wsZ`9D)HaFf=qFHul)Z;I%<@|Nr=xJ$E{K^gTdevnkSL6M0!eC)3(pV`*I_3sO`wnH8?DdyQl_WD(X1mQ@xPM~-uF zuMrKX#0g*3WoG7-*!R929vdx)(0+`{yT}?h3kY7FBO49D`cR14X=A&5*BD$K=HwHXaVN~=uk`pL;@U?Bye)_rk>?K=&_{sjse1T(@mj@~9ib!# zv}v0=U>rhK@GKktxNcm}nFm}HLcc{s7$Vmdy!6Jj3?-x7Jmb@;n>?$I`4Lq;r`N;R zMqvGk%6IDcbZZ1X_?Gz*3STA;4_ihSoe~PG0?{w$8WPC^>uhS^>)l4#>U5veYZ%YQ z3rupd>cSCrj!nTh-P5|g^;G@YqN4a>aa}IgINMujt+MsOB_~03;qu5c&Lx*>i#6h6 z@r22~>+3p*R(!93LG|i$4+=!R?@-t7jH5i0RM;=+fC`4JghSK^{mq(rbT z#dR=42_+;v4|a~(2GC93z!D4PfB=s)}P&%HD{mnM?g91JT>6a1+U;qReV}|F?;Nsy?5>$ESZJelV#cqsi`b4)YiJH*Y7vY zlmEuHzj~C3phWC(tHtuF{j{n4ULHPw%2@{)jN~Nj9hQCl0v3Wmb-P(Ovqwy!mM`wO z0XIFWyljZ-s1^h2C`xXH z$r?oipM=k5yJlIZ(1c~Sb-9K!h<)Bq3QfOX}$S_cachOjd9 zK0~Sf0NtDD2h|P>zHWJyGhM~Alk@Gs4v-cBY3+8{OCZCOXkg(u+HDIn6FC(@5;!KK zHEO$66qrUG@>x`V!BYB4y!@2OBelnO?N}nM!70C zL*w~y+y{VXgI$|U87X+h{G&(wLykOSqo3}p zhnG;9dV^sOEn>!z1OwfT>t#$oN)sW&%8)MS?E;j%fzgR>mhZ_6E&W36x9IS0HWR>n z17G8ysLzs=R9b+YPa$urZRgaj<>t7>w8Kb6L`VlA=W>%CCQC&Iddtw3ezW3j zuXCN$+r`srsx>Td z^iEJbqZl8)F&-pQ+u*2Ltv$k+o-ALY3j%$tx=|4E@gcMo^4rlfO~M13J%4sOU_*?^Zig_bK z6|xbHaIxAsSMchjH<7fm)ie3E(8#xT6kV#WPt{v&(Deg6u{MY!QDMIDNiAJD&D)}z z2Pt&?I+im>#qUZzzYY*wWbYzE-DwfQQI6CR5onXddGl{r06YRU0x3fk--QGZf)U2} z65eAzo17*eIr5!(ZZcI+wP2(0=}2Fo0QYv3SiLa6$5yV;G3?d~1nnKac*{eak)hXz z52%gT>rOmja#gUnsjEf5$j@IVS6;tfA8J0e3g*Bzi?c1rA>wSPap-Vi|Sg=Um3Rc<>n7&cvprm{N4z4|gsx z`f1Q+y^{<2j;^BFIL+GBCQ)Too0Ag>iTr}Tyzvo_y@aP2)demG z!RxH12HfGO@;DeRSVe)v1|GNshDL zS6da6-sbb|0B@W8TPKV|IM>^E{Bh@OalsZgj41b57z&)bRb<6S($b#wD5uuwb{Ti)Fo z1%0qlbKUDZsa+5lJ6i--cYFd0oj@ysgJ|nmzHD=fiUlJBJ{esvaz20Hwx%8GcpEG*2;qjw%7f6G zyMB6)G=%^ZkG-@<8bGJ+7*M^$(2=B zncLQ*POJ_XV&Y_yAtGxhkb1Sl-?!Kq*aCCyY;Xzd?90lya7;G_r6LA&Im*BpVmA@Q zgZ%u^lBb`w`TBKNtVJbYaNk9-#rU+8KBS;olwN^lM{!0)m>$%h#ixHgj5wzpEYj-g z@Izi9Z#!j~g!LjT&UQjbz*URq3_3YlYmUk}61bz8EJ9}O6m^m;ci1>vpV*%&In1&2 zqa25qrv{XetJU`~luXPy*(^BcU-<*LN0^Nx#P=; z4fSP}@OO1)`JIir@<{SD!m{!S7O1cT=@(Sjn-^F(t_@ehG%ny*^&gqqpEI;&5K;i` z^|&`oL2U$;mSe8hOiAvC;uI$epf&|`&V1_CPyKg1s?W7Lwoi_075VK$-vs!++Q8iq zqn>?9+@I5ka6@4hxPg2^YF2cKYM&b}Or~1HBGEo=Cs7)gQHr~P>6JkX{e%Z+xT5EQ z&F@rmONiDPakM^Frw%s-3{2| zAc`oC81o5ns-~pm~6aQNys?oKjWy? zXj%%KOA%#an2m0rLOaBC{rnzaqQm39-hRCiy!~0Ux%n#_x2^TbkRfG8deyt1yQX)& zjg1cI8REHLz>IsBtCwE2Hs#%I-rK<+PZjL$0wL6QHc>2Gj*gj(p3YmK#>?)3_Z%DD zo|3gSsyUH<_p+QHWWa8VxU?XzwnrAf8qxqAa&S2jKkU6SdA@Q1)5U#nr%RLwp8|C@ zZ;*Sq0m6CA@>eo-Hw$_!29YM=rQR$Ox7Ug+gF2P^UFz2^#wLP4uL^cyH6UfbgIb*6 zblqGRAY^|&;proK0|9U(yS|{7lRh3nMh@c;6;Z<+d=-PRqj(R=7cre+X~B@6*+MK& zUg2n|;d+;;_KrKoS?=lQQ-AZpQLAAD=O@bF|5{hdP&-}Wp z^J<%7{a5ytM=h`L-o7z>chFG}GD9z@^_`bi52tf-j?6i(Am7cV)z-8X5&i{g4Yd$~ zZ9W;iG@E9ZWWm#FnP;bgW^3pz+>0Uoiw-@kKOiIa@2U{7jDr1RD@w|!n-n9P`5}?} zAAa^x+M>=6-H-U4X5Axt&%$j`x=As?AtW&{JP7mf2B|0l&8W2&Xn*sv&d_9~Pp>s#kX@zZY)I+ftp2^^gQobBRx@fe=5& z2XN^S$^knPsYVHOXk1{j@WA(m7H(d6^}Uu{&`JmV=|Ej}52fW*P0opk2+GU6iyQBC zu)&=!|J3f;Lp1Md1nKQwnW~T!K_sMI=XELz}n+V-4deB72oBjP|=R0o!$7V=lB6Rs+-l3fb$#+?LJR(3u#$$*mR-mhiJKWrl zVplHdO(-^A%kJ}W*egN1vw<$#+75>k5X^0;Kif%Un(21nVN2;@8v71(O4*oOE71;0 z`bT&B5~Z|ge`!LoDth~1YC2Tn+bpW*x&X)3b)3A@5dM9>i{JhtbIB!pf%=&z7CKi8 z>*SE!I_{>55s@)^FK;}|G<^auFJXJ!z(vG?~A+bPF#=X<3H z6Gopz`lY)LCUO9{Ue<6D9K%4X7Ef@pJVxmQ!8r-a4LY#9i7()oy7Z~iGvCwmgJf&r z>F~Jl{ErOV?zSkqo<PAE^WEEf%`2q0V-taa<-I~Y?)XK>lvmM(PtX$J6+ut=dL(8h{SJBReIm<^cCERI+B1(Y7iXO zey|3^2qAq{H#lHAaCv&auc#m8K$4_T5JY-xtw`gNFKr`a>SCa)Ge9hY4^T5|g9wPl z^%T2jR}!Z;3N}a}V>HK4yZj8X$DYY(66%;EOI>p;qr|HZsUCh^?wG=!gMb>D%u-ppORN*9?ofDk!RC(*uqBvF$Jf!4pV8GqwZ<$Az(k;z3EDC)b zVAqwbah!tn^z?x^^3o=Q9^trsJ(v|OYa{WHcWrM`H{aaQhldF2SvI*Js;6+i z7&l9*buXybR{7L}dFo8COyZF=|*mKFJY z@U-fSp;$+oo4YJHu4F2{n22ePOS#o{_CVN*;*Ja2L8 zF<{G@HPh427{KV#%Ts&Ur{u4yLP(^(P0hWXba4Dk#K|_#h28z=z;r8V#AHpIvtfzm zpMJUfQzNU65^i3){k9dJ*6lJ(*kJQj2^`XuH`pkez%6SFg*!d?Q?*|WN?+(3IO|Sc z`@CWjikrEH2e!jTDsPzeh-f=V@Iyklpk8rYCbq8a+#Og;ROH4t^U-45{uK%{N8kA8 zXlu~H<#81cYis1#VwB!oDGAJTSOm53Z z;qWgK`s~%q7sxZcv)x7srjmXwkVra(yoAT`RRF@u{(7xLB7-vOZ1auQSwS>IPcj`# z=2jeG6dUu$LWPe^Om%c2XEQIh&j=8@LT3@Q!~tJDBCBL(wRB7z=6aN~*9VCUd&?6h zR3P3r)Dd3>TrAhLlXZ6+a_>GwS~;qoFo$w58|Vzvx6>-*=U$qr5ugvaRPp%>39bpQ zln}1CdM!)T)fZb9rnPn^g%GuoHA-3JK6~5Ls22;^P8npLTr)^%Y}C1p%Sc8Y?80TEcuJ?-ZO5G zZikUDV>Z>b`q_KA14Uf-4u7FAFeYFBfsEG#vy1a^Ay|jTi#>g2r4gp+!>omyJP)s8 zj(FBYBuFv%@hd{n>!OxS3%!`poFlE6v5@MkC3cnTZAvxH+cwN!!h%fb zc?LPVBe}VJHXwS(D3fs)7N!tJ1ki}t#gr?ZcE9(l<0DiYo#>3?+kUyo%=UC%c~)IJ ztAbXmRrr@i{(1q7Uxfc?jYDN}ATkZ{&?BWvt@MGCwiwX4TDZ#7dd3=RkMXngulXSn z`Mu@s%`dg$AF$`*truIbb8t{xt+j_wvuJ$hXIL;#xU=r-RS4&A#(MA*R;a}7ck#*J ztHl~BW4ZiK+dXRW?=FV29J{}LkS$a~@zL_Z`z?1p{O22JO4+xa8?xZJFM%%A!OUo?k z$3_{IY6zDUv6K{^RJJEdnja4<+Fh{?=j^$3G?0Y~ZM||a1Q7JoxVib&T)V}E7X72r+xd{^Mqn7zxhJt7& zoR4%N(Z4?XtYJp|oy4l!NH$-x5AB_Fo~Y(X#2yF6+!_VrDmi}*#EyPpb%cdKZxqZq zLHyL?Q48djsK!3Ms)mjE6fX>)c|Gb>OdluCj9UlirHYAdK44eaL{iTf>>_M z^~bH8_4=oS^79#L?oR=>r--njm#q+SvG+B&DUv@Jhbmd;#VKH?53il0m==!uJ?8;` zN7A(xEOpVcH86hb((R{iE0xzL-BzubMN#lVdEM7?d*Npb3jp%Rc?LSM0%|I5f0+yY zk|#Z-A5;rDr-blq7x0F!<;z*`*N`Xvy0%Y8*K&YzcmQ6*nJ<9IT>INGto)WZ0`4#= z(?m?Z{aCMux4Dkx0K>7!5JZc$0XfwCTw{6>q#p;6G6OfTyNTx z3OP(W<;KMMhMXc>51(08G$90jQu0?5PJ^cRHAJHY3f&{BPN+AYR(WY<)RT5F-lGA& zF$)Dh_qePUn@E`=JNc|BM+iT6{JU~-8Z=pbW;;A@R3Y#MNjk`KsM#T#wH;d=?05J` z#=jlTcdL~x`bM{I`tSMA>HKST4GZ2nXw0$mMJv`tj_RK90<3#Cp+s`G@mixXxbU5K|6?Uxn(w#XYi9-`7 zTaC9r)O>u$0u043WALV}V=Sz+$M)E@3BwH{P?B_%swp>9xeH$#xVcXOJ3&tFh53-Q2H!QH`$$d9N6JRr>#YF`@WIhiMY4b; z7=89+28aFji9mH`M#eHc1#;gG6khtegukBlt37}6>FWr$nW=z?RGVewPc#~ide+X)Oy-|RY z|7*2zY54KAQRhMjCzpS}Mdz+&O3W&MYw?EB8@F`96Wqsb#k#WFmS#r3-HIg8;Aqrr zh0s;R%`NY1cTQ2M(--Rz5~>@*>oQo$n{1JRSyrveNUw(XsyP0O^^7aw36Jd-;Kcsv zA`6>2;5`|-Xzp26acFlS^&D}y^SeABp;-$tTiCc@F z8+~u%p**G4HumUUkg{)$u5L-{&OLa(TOX>td@>qG^4@CgwUi>CvNs6yJ$d&<6i|I=`nHUi}fM4T~O>`04z} zan8E@X#^63>;_HOLHjvitZkcHJ2#PQZQb_|3LJz^$oMuOwpbWSw#R z*>;1(gV}a1x>VB=Th)Wc{e|F}A@Sv%=p8O(kQEs!x}}D@N>=uet zsKnhfje*PBoT5<$w%l8o z5!CLX8hK17TkT@Vq?^Sr6VS7^<%h#ZCkJy9fT!B#L^aVIG+<$b6SWvfgx&Eqd$Nc? zOG`f+;Z`PRTX0*TlPz~9W0#(k;cFwg3K&H&coXBI=)dR3Z!uU-(dItXJD2c z`uGxzuwUS!sTE2o!Es z6dpC}uK4)p(Po_CJ&Xun-wc|Yz0tWFeZ9}>_oe8y`3bI5zmZb^2p9 zX0lJnr{Imo52fqK&gA;M_&5KT&e4CcjsG)${)0I)gZEKZ$XL~s7yZ49^#%_A4OP<9)=D51;(0gD2$xaytbUa*7t*v;10lSA5k{H~$-;}!4VI51!W&%}D*LKm$ zf(lF3Ma|k)3JyPZbiXCP1W2H7QGP=7;pv+CK3)40?EjZv!BhjA?t1OP-PE;kPV+GZ zc(}%n`u97idx@V@_smA3W z7w%Zj+NbOM#j3Vf6={^(=}tVV_1fC9$b~rY{WSsF|Fd-e58$u=|3Q@h;%ohRMO1=f z6>RC>@!g`Mz#XpVz=-}u)_J>8$>iHy_TO!S9l9O_TMP@OBq@DHQw=lo0;Ux-zxIgs zy}bcCMrwncu%(zo$vojvXVolYJ*YR4UbMrZj{a%3%qDM!2sW_)`0k(nhr2~(qZa;h zff`ts_A9pe$s}k>N{a4$$B)^cyvl0qcv0+aFQ8?(=D`PD>~^`j32w({JxT;~=fC`b z;0jZ`{Pq6~4jfhn`--+`>o?N~bt5gcz*Sd;|5afg{zN5JJzH1S@GT!h>(+>E{#p<= z{u`%x2i*x#DPu@`iC)DVdkiBY=Ss4Zd}PO#?W&kuCVEGkp2NJWt`J6$8#tBMwBMLW z&v%gFReFSzekr)HbVYMkl?6``wm-tAe|SjGf^y4s-air(kJxqjDf)tJjxUG1ZV$RY$Ck5!b2~r)VpV32Q)e+&mA95VCm%AbC|N_QeP6(^vesqK;x|_yqFMtU$ExS z@1cTihC%?PSVn|tFGzqQ+O${8w&&W)O-!J@6eB9Utp6TVNYJgW&Z{nioR1eeCOfx* zu9dw}Gu5sC;Hd-26O)%wx5V4U$J?YW=?I#_#$uKhd@Hy7`Af3(N~;|8hY#^*pM(hx ztHC$|@ON=lKa#wTnengC(zEttESs_7& zoNZoy63F8Xe0oc}Zy7TW;6uOX}ZEXjEC;X0F*Om&EfdaHIvpe9ewN6U`R+KN8u5gS#|*dtK9cDCC1s zKM%JV&|u&kpr4)BxOkl*Nq^|Xi}`F0A+i~jk8STr0&N#upFNV}B5ddX zE(kb#V!g>PCp>!ES3E4T_o;)Aa=bAhe(D|R^@Oc=SF#1%Tixuyj`I!es98NTfkC{Z zJQky1QLk`($rA|#19-8~S%V*DV=?uFtDf8G2^}kDD)s(U4v}b|N2&A3|5FRF!S=iXjsES8~Y#;esGJ^^NGEhg4W$p9fzW{!?pMH53Q0U!8 z2dI4|0}b)ESxrSLyJDw5jF!`Yf3SwHMR{DqFjV9ZGXE|YDO%1EJ2aYqhG|a3J_FrY zdcx+;d0Z+jkLMB<1jLw!CvwV^D>MY?~4> zc3^i;gQ5v5iScs)T; z37uun1_&HVu03zXNxQ`P6vEYvb_q#Pp0 zUGF;?XE@yd`;n3V&ZLC4S;W(EscPPBR<%B5h0Cv#o}Grw-5i7}P#*u`F9AcOT#Ztudmreg-ubW* zPp$nK($4iatpw{!^7SGVnspx`A)mMd?tFHyDbEdK)RLKNQPJECyjk;P)II53%$#wy zh2)~CrBE+*1t+fQDsX)AjV|5*E-v$>wR^O}Cf<|9$_dLm(<6lJyr8`NJNk!*IVA$9d|XTx0)asUMmS!$ovE&P)8Y!f@-I zmW&QvUYTDY_uOxA(Qr#yGaA$*BuO2B^t~)|k#7VmhGQqS9}0k}rJwse!u834U^nZj za0O0!9~%+TB%H8vFd|77^hT62x1O>{v&s5)&;R7WG#hTMNeh=x2 zgOKd}Ub>&a9zI1moSVAc_&-e7)sPgR^y~Ys>-&q&bi*&8bEVb@D0dOP z%Nn+yu7}}V-nQa?1s)F72WwuhxnILhUAknTH6XtzL&3q3GzIeg=?{y_!Owh6w!XcO zkA)T?((S=5T2rHnt{Z=Rb%Lv(80VI)5Tp)M{(b9HphZtJG5OotpT7`zC)&nEGYlX; z(ahN~k-sw;W=4JZ4w>9X9g?R<1-;uCoQLYjwM!0HuoMFbsXMvIO!gtfT|Z8n0C-0X z6xF;`U`{@R;;9_El+;h9*lToe?jt=d?aND_81EAn0M9ZVz0@yW_sxgFU*p_=Y&&2M z*=IT2n~MSgDH|U=m83d+c@tgi;G5XFJB9(C1`lkGhsHUxqn^~lK;$u`CC z8^fMJ7qe|Ps~N^@?jom|D!b0~l~kvf<$f|%;2V%||CYmr4i0Wy^^` zTRDwj21Ll0h|BIRowbT2H+PrCD}VRVJ6B`$XDcorqol>p1#B#Bg0ZHqqsMD}WkQT~ zQtSkHVFU*b6)mk6E0c=3Ki^P=o4AoGkspE7$UDEs%_z@{7|!*uUT! z!Dt}2>UUz;@)(@uY?^JS@yCDO^rKHdEWs{;p$aw_0#KUI=Xq93i~2WPEWHTLADVYJ z@E9nGbzrpmyf@zk;ez4Qn?~bT%`wG)7yPN72!FWXMb>b|g`SkKF)4Js066 zv)`B0UJa-#kw4?~fZ1jUh}RpRo;|tg#dTs;MkLAJ@arLRmz7L^qfCoQSz8y{}lhG*}C({0D;u4^U8N$!vTqsXG6RcTlWHX|HdOp8$pJGR}QQhjJCyhsA^ zAxUY=;3EQQS*57ao<|vmaovIIHdnF;j_aOK&kc6pzpZ`N0p^_^0_^5#ZjTmUGKhk^ zW&gEB>jr043C4d1hMDD$q5pRGfpfnU`Zt#g_cI?77Y04{NKpy@5DgBRm@co!ze{rS zpjb&lNY!?uhxLG{R95}SyV^JTXdKh{Fj(hv&8VMW`T}b6(t#O;LP>YcOD+OvKHKg z*YIBveb??UZ*hi9kn0oP4?sipj2uH+%%5{*_y@ZP8Mnv-FS%2YC;}MJg@<@Uppmni z+wX6qTA&7Fn4BZl1_74SCWV!kDofMl`p&DQD!M7>mx+c>9wYtuas0t<5lTzp3P-Jh zgYqgnfR4X@oMNiyWv$D4L5-Aeytp?Bj6i!g4x-NwHg5W}heL2@8ct{#jr?%_riJgf zeANMouIERXS+jD_oO{laN~@I&L5wD{i#v~kb^=8wI*pqRpk9n7M>A=aMt}jh6U?67 z#}a7GsazG@kd3p$P+V7@+*>Zyl6*qE2-eX}xH4*a*u!4>_{3tFD38Nus|bn><|{j<9)@F-~nFWi)B& ze3VB1G+!R7>-u;alX1Dh{|=_#>0g3(JV% z0{mEJzEI{T0yRTv@UU7oFo%D{R-}e1WxpX=Df4 zd~UX9l;gji$u89amWY_4WRYn*A1{)vk9Oa9xI!=m{CL7XrOR|DSzZ({aqZW;>Y@j|cZ@mKz}$S|bqt zMo?|_)KvC=BZGQ4?c8y;yOj@A060-;fFcsY8O=PQuYS6_)atobCs%-8Y9j8AaS1Hp@Uv2-?V= zj;RmoqzSYYT&YT0cA?~$s8g<|zo@q{gb^&JDXCde=DnjOG`;J6{Y=B2OqVCoryLIe z^kjcq!of;TEKD5)g+EoaNnbxUA4|r%JOlD<$vtn|G6vp}2FCH}uds$EdzKYeQmSov zTI4EfHrZnOZWnV3s0Kk1f*7ZoqZBrAy30DS@xdlXW@nk{)@5n5SB;rXHt;AX`WLb5I=e$`5*CRMXbB(*rEalZtt@Um6yNFI2lztL|vbHs6`4=y~P z*~Jso?Rp82@u7;7gwb({qGYa8M;q^h98)`Cab4K+aFedKJh}L>U&r^>xL;^5MDVd? z9afK~@9wz>gia&T5sdW`JZaD|4fnXeCVh4HU(ST!yzaR-*PK?itKnm^9%lSP3(`9Y zuL#9o)=7{#rY=~FxTv^tSkLov9}Rt*d^f@E3o-ImH8;*)*5S$<35%!M{19Ymnn2X) zox)@tU4hm8dQJLzMNu@avhlWp{@Kovf2eU^@*^-~5MZ&{4BX-xFknAm$9An)%%I$# z^D~4tGqV7Hq6*iyo2)qyi&Gt~wcmrT)*kEjsRbyJL&Gf=YxPp}`O#lnMy)k)XEuT( zw#Wie4e322W}d!I!eL8dSOSP?!(ao*i6vMxO+?r1WG!9$9ik*@A19x;JGb4=F8q}E zG9FU1SCHMFI81SUfI-s2z78%Q=JvgWC!8u2L0aP#+*{YQ5poU4BE~(E*ov%b>WON9~R z3hFB$g>x~6)+jGJsl<{VrKakO4am*w!$ z&$n&7O{X1OECd4&4KkpPHkoF}B_^MI%*g%$`;&_{=I@&qlA4HrtyRuhdSw@IOEZ|< zy`HC4WYqY*%aVszp#CRv&?K?(uf()lUx8X4{=wJ4xvH*Js%3z(o#1rUakWN%&_SD3 z8jVBWZ*~1wA7x3jWy*vmsihySY`G}}&JxTh5P}+P+2Bk6m|^=ZS44&?gvYa$onhR3 z3RdEampq8gDShVq!L-i4OZv`f1MZNf$k!e}Jm?i(rn zTetRidT!qDH`weW@+{N&)H6mru1LxpyBt_A(uk=oipXTvJ=(x8Ik&O~GKeD-=m#is z>PVK@m5IAZDm-t(IFP&mGVftzdM*^c|W&&cl+;QYbq^e0_0LiW8O z_Zq~G&%GB#A8ug*W-A53&Yi*MN4wtP$PX?Msf2;x`KrEjJ6&0!P6yJ}&9-#=A&Vx` zcu0IsKlhPqB*}0q9cHy_#O$s!IICQgepjhr^q<~Nz?#Q#?=j03z-Mn~!*R~oq>$|- z?Lo9_fbFNEz0IKlluREF9YQOP;83mt^te4vA`asfY}y{j%@VgYlRmDExkfWeo0EdM@YFg=`u zUgz{6h8i5@cbu;=2%SkfT=TXdoVhyoP#AQNz$2`ECvdl%S;Jx(h&otGk@$wp*hNQb9e1`&hj?->EWT~*cNpaAfm-j5 z&$z34<6{0MTu@(taE}Hhw`ed{Y5H4I{x&#<&Ns@(65L0WwawOA?|XI=1P}D1^LmHv z;eyX?tAF~N#i-5WG;R3}eu@nrKBoyrj3|Nd^MS?333OWRdSbTYeLpIuyS;labnSS) zkVcZipBQKaqN32x5dwc*OzEKtgU9lrzEF_fWPlzRo+NN=@UbvS zTEBvca08R`^bU5&tW{sWwb^NkR!3jUUX>B&x#T&v5yahkFDmT&2Jr2>;t-~?O<2$t zs&K1J29=Mq!`&e9hft-J()_Ob)$a;mrrXPY+W>_97{BK;;*lDLv!8gtGAp?~1sHW=|P90K`morp=jFR(dQ#9NFsnfRt z5Sn2`+Q(!4_H9croC0nzd0=L8cv+eUkIpeB5sr+lxNC7sDXK(rJkruUQ>XU+q6_$* z^4Pun`X`gjE`!GpC3ptl0v4&WL2rDM?`ZZ-H?~o0&<65Wnhn6Wb+@UYkCW$}3}KQ+ z3M?h&59=g4)5HT$M?f_m*D$INeAZp`0x;sBNqocUPMsuLy5Eh8s6p4)dsb^t9GnN} zh4|e+B}aVOb3U)Mh^wLS8QrxBF!EJY$&^c|H3n}-boTD~-PzLlm8@tsdd;>$CelhC zx64vICCCDC1{|+`SEA^1RTABS4<>bJEjkfc_TSCvJpSVnt~UErJ6-Ya11mjOqCVR& zlj^zRTK`KFWF6pDu<098vi&m{=*z2#w^ma&Zn%ZhUS7OFt9a+hcB&cDu$%cnt&+V= zCp6AIKF|6^8sDzCNC?4yZO&D;so%vNU=|Q;d<&|TJ`LB;thBTKe~au-_f4(#wAOUc(9F%(Qi4=Ngbx+mUUGo`gFX4EV~zxa zEXZ}0?$D~W9U7kYbJGwkq0fkesG|rT(R$A}8X_ebw@fnDbN?M-Y| z?W;Obv5GY47bA7@1TD&QkGOsU1ID0iRnbdA-r|HrKZxE&3{A9=7HCm1I|E?J({?J50FSp#ghq6DQ;BPx?+(7p(phClFN_=Y)7_ zWNk&_?418Lk&T3&zWgLPlR?lg3&J3Vz)jy;A3@Cs!oGC{+;%%X-nxJ=TM1E2HgmcO ztyqm|!dPibDX%qZut?d3U)NN#ePO6lEjv$8gqK$)V`@Mk?ZXXsBj#tay-+UrWx>H~ zmyLzH*81iS+Buq3<$6PgDxAq~oye6#`ZxR&;i%m0QJ7WhkxvDF0~ zu;!{&htCw+@p@~m>~|;z^jf>B5~HIxTCaqAn9Zv_X1c1OgU@v$2^Q6~ox&qaNCrO> zmSWBGvP+|)lF%~I&(;nRcaFeB@pEhcQz-QKEp`kskJE{6I<3dg>R0+?W4g(%4dtdz z#y77#%2EW`H_PJcu*Pwg)Vke{5&OkRJMR1a+>V?r&*5O)DnGj%{@yvWdt-AfvWOIY z#AwdzD_tt9!2cqcv$=OEedI1541w}P!KxY zO?SaMS%BGyn5c|kfV1JuqZut$e2>O+$$i+V%XU-uqXWzPDbstN&g)r^j^1Nl`Aitk zp=f5wO{PuYW(v~f8gbRK#MC4ii?O}OdYVK6&n9Q0KKPg=&SY6**8L~IOgs`d8}$>` zT9KS?Dig5;hlrS|*3(rTP_FshuK`>zO#3Ts)S2L17=bh(#;iJKb58M7WH>%6gZJW> zrEA?IzLt+sE`(2|d)%fs^$*<}WSwy$rQHvQ&)Oj*WU3hi^-v==0GeN7r@{m*lO zetYh z8p%B8BmhxSO5}6Ro=?SYHz`IB(3E78Ms-B0IO_k@0$eqf8A2JJ`=JZNu-=7)x273CZRGXfI5C(>KhOv#nDj$0DmLa*K*-I+SCr1)Vf6}&P3Dy2+pftb z0P~Oun^hT?(~)ep+{1+iT}Pq!fbDKy+8jw~F{{&fh+U-!LQQmg{e?$4Pd8w{<;MQD z+1K*ZSZFA!@G&*LAah@yqSQpy2no|~@HP!^;|A(o4`)W+q>snLBjFo$pBtKNCkAEox`2L{A@C zmDhRY$3$%;^3)zDe5!aC<9om!L2I(d$<)~@Nr1}Ll%@Gu{c~RYpd5jH3N73BZ6#PF z$^g1}H0;}1*k#K_$o>@3n2jME$`mUt$~t*Vv_<9G8DWG5FSm}@);mrWy;Evh^nK!` z{BGUh3Zd^Y6l16?CEc(BTY+cmVZK;w0E2E0X45}sW* z!$#@0k8IFidRl2g(g;js<0`-Mr}m@@EWRtZeRLx}-3saIGA1J)da0K;#z%t7q)+nz=rs_Vx`=ogKPu+=ju-vC}W$hfD6|7b78MEQK0 zR*wi(=eXl|=TsK&Tc57|p(J&d{lU7xI_QAk4_vqyOC3}hDQvCmxRYCN4jNy@PO;AeW7 ztpBEiBSN z1I_XM1y)mCg5(SIl}#?tm3Oj<{+w3?7wRu+}E{+lv|3s=!hcsQCemjELw0l`G z8ghQe9VyseF@RQksVb{(1cI7^Qj|)>4 z2;-X5PJ=F)L2T=9o({Ldyl(~*f~cfrQ))jqN3S*r&J>ML)R*3uV4^I}W5d~}93ju0 z7?2L@ITSq;GDMgW~gA4S(zLEz;vxA=rkIQMbUxp2OQ z+oA|I2d?9!wV=Jal@LO1=GMF-?ZrHCm+p1Wr*r&U)vm7wE|D=xWGE;>vchXAA-Jx3 z6C;H{{j=1En_|uE(N{reN!Y<=*oU9{`X!hw5}+=Xb)oY<0ZO$3lO3EpzhdVB&&^lF z#6csp0eqgD%fn3V0)FmKg$6bvgqRkC$a~Iy2G{<-G2H}oF{}DOA@F1Fc8=g0YR^IF zVw6}2r`=FQ#--XMPGH;-R*ntWu+$FQm$-C{zxFa zH*CFOv%RD4urFu=RJ1kKCX#!u4M}#1_dgO0?vKmYHSiG1NTRb2S-x2(JsVtoSaaP| z>xlk<>c>u9^O8e1SBFWc3kw8O%%sCgcRoQs@8<8V4(l;hb07sxE|8e!0C3GafzQL! zvAEs#p`TlZiFm=8uVZT=CElpxN-G5uEiSaEhbKmR-Q~oa2M^3LW;t^*+*mJz%6(L5 z;%QRQbYyUNBEexKCa*5u@}4v>R%6hE{1b>_=oeWaSMRt0X&@?7_2J%HzkzV!ZT1_! zIo;bmiK=JE0H2+*_w2aWYBT|CLlJG>{7n4M!1;N5KR1Xy#G#9i%c6(R7q&Iy-Jbs% zwqrnl@Zqi+!}+Z7jbg=Q?16Z;A|_LAd~!nRHdw*$re#~5Y_cBBEiV3#kc^kSA7_gO5C^~#j4B+@IN1rc5}r&j zQ<-7?Vy_+laEX86c`1c(R@@qc_O>3#O*IDC+%+!T&@ilYBU{|h1*Qb_iE14e7S504h6k@!ur6C@}+)Yfp^~PCqdD9 zeum$oW0>!C(y$UD*-g&`B~pq8RkSAS^P;3eEsYDLHs(1e!4nxWPdhZJK?(~`5WsRS z?VeO>Yk7L#Q&jzpqTdLP^HOD=_9Rr8c=zO0FkgsDlLA}r2W1BH1T(;X=uB?XGxgfXGq?BjTh6SJZN#kd=aQSN5Tnd{5kcS6iBdgE?Ki6~6B{?sa?ia& z%(jtitwzg}bsSP9=-n$b?l#M*?VXVRKn@G=9&qA_+s`%(ePh(&{L>8B*%*{yz(PR%9q4aw|b zn{b|#l$EAZZoZOmvv4(T#oLa`0LSj3?#|I7<#j|IB`n^>IP*4Wh$T?+ndU0YhubKg zet*whVB_iYS?}CRjQ#iRPblXgS?N45MMHZLb-{*@gaB>4)cuDHG9m(&62Ht0gV(7f zuIqiYT8-WYo0krH``|E0=`Z<}X1G@qzwfmTHNWbDDu+v2*^ai0Ixk0Cm5Y#ZN)T_1Ye&EhrA?M zLUkF&)P38pY*S}pQhx21U2a0}aUgRaP| z71P@;H>;|be6FYamT$C4=G&AQB0eDTuhvQb)Nj+u?fV&33OH{Dx*oKlIDYY8PM{9^ zUS%re?;5iRDgZg*#`>g3`?estWz*Wx?Qdv_d}f2zPZD>uO%lu4_`4^eM- z8&OS8Q}-8yc7yV@?@6SZQyvm7_BC9*>K@R7%S2JRWsm}kv}2^i6f9wL`6j0UezhEA`RnKQAm;eaefE- zqn-cygjohf{QWWt+4}oJTWE*FcQl!Ax)w$Ti4=DwoWK#yc7w@=mN%-<8+{^{tyx#n z@FH967rT_c(2IYQkj*8rDebU90@jj}5M1E=I^hE}iZ|`E@s!@Z9p7C1sDT!A5MQ*%~Wz@9+C< zvlGo8dcyrD>94+C^xoh?@6ocd$hZvqdSXlvF$->AXjtEfg4*R3<|;`Ugt8p6m1tBE ztu=LtrgJ%MECsBx3IxceKh(8p_}q>QC>fjmm{=EeF;m?@jSp$Sn?4%@$6zmsI`@aY z5lv}fXs30^&P`mXrhkR*W-eGisH$wX?nZV@~?;P6YwZ20h_o?KwqL0ay|uLg4r` zSj`KOM?Q5a--Rn*O7LMX208(toXB2{{hsaPWT2cnvhbZz=ky-GE?V$zd3mZsyKLtH z%KV1vO_of zjHDzz0f*&-rMm_<;5BM2g2M-<@?-P_570G$OsDHg-3)~^jI`i`l>WnTt(~Awr^Rej zVNh>2kdNyt__Va--x=AyptvnpwK$xw-wAhy?jrT`4U|vm6uznep74JjlIU-nS>}yg zF=R_U3UnO$!ZaEhT z!S!n1^40pPtDwdfy#?RDr35d8YOBs?14o+}(%%qXtOG!s;t9hzMc_m#GxUxL19&?B6tTuSZ47&&q~nmm(8exiqlNYLiswc32CU~Ua`I6N&oBH6hc^W)7I@$x9#lGn0DOqB>Pf; z2|@4(AE;NktMls-Evi@Rb!2U1el1&tuiS^;Kr}mTRjXQskd=aYVr7YzWM=s` z^#r3Pyh9DFPz=@>l6jepYMuI>Mfs2hUz3t)0F8Q!dgGF8x?$7&#}p5EL{Y?f;fNAp zootmZRv|^!n6I5*546pHW8&9~UC||AR9qsKp@S{ixv`AIU~?$soQJtG7-$vcT?Y4> zRszznMliEUD=Fne)O50stK04n!wU43gMe0HE0(`49dSS%z9vCt2n>mB$(rNfk=pWm zb`}B+&)_rj8mn9-fMGFxxknkTl$lo1M6|loPTHF_y{=OY(ViUF4pWc&{%<(?7YRMg zV>(h^bo=+f7v!aX$ov-04YmoPf?!wW;VCAcwz7&jy9UwfrL@OJ|NRwuYkTbPW6H?p z*+UB!i$-6;0$;hz^@jaA=AuXAd0{!F1HrO^xvH^z6T)|0#Av)j4a`h7kT`~m7lw8G zBl{$BphWkJuij;N@dw?fQeI^hinH`*k1(sS8QaB{-6X3$j(I`Y{t#keN94x9auD8B znV#)){Pl6^H4*2s4_StXHzSuj_{XTOjbSR;tm@g++95lmN)hyQaUZR< ztF4^r=CE~>P`_iFcgIr4QE$$_+(2wwQ(bX+rP6)c@Y+g28#XHgcmck!%3ZL)o1*F473`d;9oXjceNbnEIf=0{GQe z@A*2LeNAe{@Mk+S`LvH3KVnd#h8|XiQek*CSJ20MPBjq6lLS&Y0-BPNRyQcrZdz&i zL{`)*FP7hs25tqW0LquR?fKft4-#WBjxl4uD%!RVn-B%KNW0f-5~fnbd(KwTqtYIx zG}|!8Fm2BIo&+4|A-2sb>N{s`9k||UblVH>%=9b?29({%!Z-rw4*$U%!k^ROrqYzx z^7F(*zbiA7Ale9GWc7p}IWxgkfdPm#Xd2*iptowm)tuAn5|DZ?DZQRv)l(BWn^yrq z7YW^dFD1RMJ;aKfp$4gB6+aVm$@2j99#m&6s}9%`G4wlphZQD+L8ZS;S(@c!dzf`; zlvz-~Wh- ziOEcO>lc|vQ&Mk>%>?&xSWd9jv;XTnFHL67!}p~=7aZal(?HE4TXX5Z1yy{8CnX6A zCFL2g+s(}<5?4PRdyOM1;N)B)!ra5ZreA`HZ~5K&l!WqYV2--O@nHSQHT}LV{NK%t z$OBfNc}mmkFilD zFZ%n$2)O_G3w(vuY@-l8zJaqe&|<6_%i~n5(#}ade^C9t1bGc-PUX9j*5>(N^}E=0 z=>OL5?y!VIaf4-;n6WHNv8@qLF+^|Mv`n!42Qw2ko)!}P_!{yKY@S{9zk~#FydV*y z`W!+#(mF^V=r2b+yo`rH=g-?CPi&;~a!#)E$Zsa2u( z7Q}cgqg>qm%bU|bKbrroc=MMa{;!gFIKF$5e=op=Tc7%0xcJ{|;G4}j^wQ=|wAb0x z)bWm^GQO-;R{Y{N;Qk03c>NV@RDaW`Ew1E}L4%3rWLx`M#*9pHy~2ra6vGEwElAmEEV8UrZ5mu_o+aAVdt{QKal&K8|(soH==|*7d|M!XJoZ zIwVcIA(*tyKz4F0{Ze4I?wZp@?7#bwoDwlenRJh(a4&|aCRtC?jome4W%oDG39xW+anb$=T|D-G zgoj!0xX-_UAVE)#(S~2S!^87)p5otTw+V(QLgfE!4T}_FKWnz|kGqDbkcseoP&I{k zL(6Q$gT?4WHd3`I0|4SLYWe2>BkL`r>ga-P(Tyb8IKf?lyE}y7?!hg=-Q6Jsg1cLA zcXxujySuwPxB1RHW4v*1|5~GaOE0UMRW+;DhnE)+t2vhFI{Qn~5GK@iXqxRj9^$Ae z1AqHz{$}?FRGv?iu`@S#HPV!upP>b3_>M7(|Lu;)?(XeGH~b@3{PF0Qil?PZg#l}k zys6dsmu6PKdt~Lac^TzEaRsak^d@J@%pVt&um7OQBd(*w?W!k(L)akWGy(>JF;)u5 zxdIaN{0z|o0P2xxK9a(}G?o`B-h1eL)qH8!62^TgB zk;!yVF?jA;_N9Is6i-8XAxEWRvo!W0X7C19c%!?{`*!g0hG?1xnVhQG|I-x*(~2KMWuL{s!r2;92>ih@_1>cDJR=NOG4v7!wXfF&V177!YrfE5 z94I#5LK{^(h6mDvMq5HdxNtrR`a6pkv`cP|=Xk#j48q~SZMq}5AJnSm-NweuG~TCH zd(0(|P>~tM#B5yu4wQn_97pG{$}z@3Q^pyrVxF8T)8Y15mzPvAok0xkGGb1WHewm$ zG3}ia>P8I7EGg(XpxQ~2smGF@t7hA-Rt}-eVPP_Z{3h1*1P_UBPqC3QvK)gUR32vKi)Z zD!!*VF3FSMT$FeWW3n-hN6~ore@MC+?jpfqUa!7i{W>BG;;{sj9hZ4V(5a|Y!M@RA zdf-fWZPT4xC3LJY#prY$6??6^{mxZ3p6k-5>kHpC1<-QXzqIMJ&7zF03EurhDA4pJ z)=P@yx|(!kx2=6!$No2osk%=-qMIQ(kd>1qL@nlSad8ddsmE1Fxu7m;1S2ZIDe9Yl1VRT{*K$AtCvkeP>|%Z)s~4ssRd4` z{E&Y_)s=plmmusGCppPZFg4?-X1`Fa&Ftim`zWrt9Ms>H#uATUe=xz}_M#;fM(aO3*1B64jW{ zV6#0Rs6+pN=@5Qh!KK}46|PrA<>g>uu)0ta`Wwkl@D}wY3vY98h}PR+Rd2|i9aEAt zdCb6e@SnO9&H4hwLZ;Nqpit{6>dgJ)Ce%48?C>pj5yZnp@gIM-IP+IL9{bzuhDmsN zryn1~`}QQr7ZYG9gLanl7q zZ576#(##Q#B(W1srdBf4QXW6dW(uDW*OBW}QCTJ-@5ZJ5LKcJ;l@#WcQE0;evOcQp z!v5(|(+=z3_eXml=cg?eGROqUUmn6w(G76gFBB%Oa%&_yuUGf9i`?KZv|5Jd`^>1A zMTz@wF%|)yoen+)ntM9GA|+nG>CPopuWcX=rlafIVwUlqyaCe^?;@So)Z1Yh!zA9H zoO@{7t8&JG4gcncGwkLvRtBCByO-iqR@K8{tbojq#zX&X%Kg1M(c9BZnaHhA*1rDI zfm5D_d5TiQPR!4h>!j>6vv?e5)bs%!;2pYvtGEr@}r}oz^k$>$g>R{@HNNL zrNiIEN_c+cqv+6aw>(|gfWr(wD4F4Lk;L|Y0XFyPLD8J1`}Tg()d(cn0bIi zZKM~W2j?Q$OT(W`Fl^SYWa)~Tt84t@^_gwx;f2yGbxg`kTdkugutI+>g9-01hnIC_ zb!XHUmCX<)<*5(>?t#yn_gCPRI$odv%!LG%q-r7P7g59g9FOiQzW^3PJ5}xC=GBXV&T7y3 zsviq|>8(*j`y?imP5plf0nkSDrL?M)WaDe^z;0P=Jmcdxd!TZ}5GRhpgw-T>1COeZ z){QrUYQ@o*)vN22veov`+4UWrMw7`v(=S!J(WP=s8_eT?jH|29^uhpEW?R1ol05>t+gjZMKqB=$qwhb>#}w}*xC zN8Y34ZNFlWX&#jm4OR;%g*{deWw=8K{}Y;{g=oSNPt}9h#Tk~%Rfrw;&$eRT0iW zh=N~Y`c{11f!Fz&%u|H5`&*#jsN5Jfk1%n0@DrB-%My05Dg#BIsWZ;u$m#%wu~v%< z@mluNwr|weTDM1ANcADP)8(3*jI=qr%<44{4nYxOVEjSL{8)W#5Zc$U?~$5D;^ppj@d4D!XxCv-zuZf^Qg0NVdL=9vig+G z)c>FyX1mB${4MR%oFet7(zHBZr}q3sKl|mN2^GA88cq800(H6t@jlLhhyZqeo;zhf z{d9*23^{Op1P+{kzs~pFLoc7W!tFV^D3tgpU-`%)22t7<_TX^^(Ig;ZVb zY;=0)>g2gQ+PJ4Oy-31f9}^dn*NteIfQ%F7l1}lbdiRdRpI(8eo2RvP$iCratx5Ki zpos&vjBPv7w6n`BA)|=SM|FZNFNa2CPIjzKlb}Qbh>e-Qv|R)FP)R;nDfW zK2uY~e1$SS`N{z;0OlMK&7RnXWkfNQ7F6^Ta4h`EIgo>%(6bxBdPB4&qzaqv!9RyS&ry1D)f?B#-#N7?i%;S$o|%rcvnMJL@k5i?`9j4?pu1*-<$Sk2KX{^h=MOlOTVzCyuQFHMLqWB4 zd|?O~t#g%Xg`pRnQ0{8U*O4_1K&8IS4o3vT%t019Hwa`Kl5Ehe zU<)H5QPl67S4}$QqDgavrETQplqWlctf4I^I`P+mcmHtl;olX{3=096)#^1%M1xa+ z&-0zP#+ z>v9y+_~H(k>e4$&NJksA=O5DQ!)t6;*nE1vlu^R*H2?3|W!~^h-!dn0up^tbi@RlU z&)MA*Ng9HErq9^k)kD@4xy(q&zf3P+)b~I6Y`uUH%%LU7Fr{S(8g|Lg7Cf)F{F18e zxRI_J$)@s+wKmZejrpFZOLvts_`SE1>&u(AUXONVheN026Szm>BTZP!8p)LDG2!Ab z%N=@9`|`|M5#v!i4pgO@QKu#qITNaBi0K4^x{!eVH;x2)>k={XhiPuQn>|N`Q~GqY zBsB!j!GAmV)^>l~8DzWk`m*iG?`ox5{FFtAn;LY^q0H_Ep@lz_)>t_4bE;Bk=jrxj zNmaqrp$>1M-g<4dYXzddXA_^kN9;2&g+n;ucO$R{Dt#;8DSS_y1OL z5He%=tAqLL^_$f9G;H@fixsmJKAy8Las&2w@@O!i(C;xEp0~6sVmynQEySF3r_OcC zUP@jK<_Q}cajHhz<4J`D7ctu2_hXMvR+n_k#^tZofoL(H^)t@dg~xy1L6jh0{T2Ga zNn%MIW*xhz7r?yo9~b%8K$scz%Mt(axYnp^SPk6f zT4_&uKq~TcX46TEbIJ*meQ=Gj|Heh`+}mYlFaK%Kgzo*oK;rS2*AtxG*G}7q>OnW> z#fW6YlSciWOR3ZZpZARt0;GHhlK8DVJDlh~J$#jW-5M$nk5X8tpk&^*X=>H6&iQc0 zs8Xhhud4Dro-!oo6_u1u&&2NAB9Z`eX!mRH)X>-HaS%v&y0iH-Qu)l|WGJFD6B+3n zN~~L_WyIQ73ESRdh~T_Vtz|ln;l}mBSHbzEMt3ohc?s_}t9%au(;8X2Oo`4T+XJlN zz5|i}78dN5mwy14ud!#Ta-W$r-$tS-O+vUrFkr$))%*y3oT)u~z7lrG(e9X3+;JqG zQ75M$7aQE5Q8K1)r(s#MVI~pB)~s;o$tJ@nyJMpo!{zZBw5;A$#V;zbIQKu8?xc$8 z%`5IUelV=4`OXys3j_e%e+JzPj;~go#vrwRpm}{#o2 zxD!m6tf;;*C0bKQFYjI1=d7owh`g3uaas+U&j zs2eUB;wV|qpT@>e;fG!5Rzp-8!e4Q|3ihALq}uMu z#cQV(BzSuNel|^(m6m>7m5ms;`B?+qWa-;qCoQ-`P7_$i4@PKIRpsz*TESYNAC+&d z&>J4VH8u&$YRK68okwr28Nq+aEJ{N!u7qHjFuw1gV9Sq#h6O19@qK^Ww{O||jocC_ zNie~~&^_|b(C>mCoJqJy`R2zb7c;56(>s<#-iVqy?nPznauKSbU z10scL&{2=|0~eG1>_9O<1}I*@jqWXij^p&uTnGB!rK) zoaDhAa7Pn?SD#1i%X75c@BE?-lEKQJw}<7_tnK#)gD^pyTtHeg^5dyZ3t{Hxz;JwT z%cSS-1l;16J&Uep%idY1>_*+8N{-hDTSHa3GbttK1l=!4YH7ab>*3icN6u~4hga;z z$e``V`{Uu`GajAU5`)o+2 z%-$|e*ywD$!WS69Mw$?td)N&v00L`q4qtq`MSnI9dm{AmcnPjgr;3Mn85Bb%6+rP{ zchpGLxxI!%jn&Fl3gQe|Ael1TiB_V%yVC04a&Utpmdui;Lf1?F0tO+gX|Ak!-QczESS&{xrS)ihAial^4N(Z*~>#maUDGrq1nt;8{N!8pQ;H z&X&<=_)*9*1wuY7m|x14jZhumY^YT46blqmN|y-9Q@aaFTjH}-A~(WyL-heqMk;f2 zz;zPq@)Dy_K5FUWk5S(+w<0Iqo zg~nNdB6?Qlnqg@YlQ}F*(Tj?Ruew(t2+LiGNwK`G;PpGy>>b|7BSd z1{jjaq{zkD@p{m`*VG3}LQBG_%GdDM&-J6bHceG#BgOE{w@?pCEM#z@I0imR@!Inm z^+h*rRXP7_OaGjP1bKfy~$60Mk`i=~_ zd>tL?KC+5%!7zt)uqf7QAP@_Z#sxWWhiM>yB*{vricKKZ+FL90R!0P$+GaAQv0fh& z;%pTcXYB8BGaY8LL};$wWd^}pQJ!dmS6wr~yD-zH41M~H!$hhe`E)qL2E#u%m5O(J zddNPeQ)MCj+@ZnYw=%zs{v%c~&l+iMVzviVeO2v^f~}fBP6NOP$KN6Yn}0|8?Cf^+ zdM8XxYXo-h@TvGG)6`HXzW8DUfk2%Q=3+5%G46_J~ z^~uAm5bKu#5I&$E-Glx$wCP{&n-VJ*)Nww40Kv*QRE${F7P&F>{a*gc%}o=WWm7@; zpF9#(SY`nG@%KLnwW14P1bmLigl|g=KLp(KEmN0-(B#o=~POq6*it1^~yu9RL{p4n8t#POLZKT=s zA^VO&QYFMR%KzhEalb5gYw{MSkOARu{U=V%9ac;!CLkM^&b@XYqH_wVFc_jAFS7ph zp+mT*jCUCKaR{rEc)(`vqI9#O2d`gNrNw{S&RDSh{2T2v4!O9aN^;A|_{L-Zuj2GW z?Z@A6n}%z4v12N0R$09}6bPG`Is`GEQ-iv^Z<|9A+A*!(GlZ|zrLQF;4am4)Xvlw{ zq2CYkjL1OK*XCXm(ls67!{Y}i+CBuGzIRxxV1^cUN8*4@ByQ;DwFr?AxCPNrhTrTc zMJUJT-ImXW?Osq1C;7-|JZWskrBT0$DH% z+-60(tWpB!;pXOR#gaqKOl*8qam*yNPv5L12T#pZRt^-y&=tsHybl5-fIRMO$i8ma z=#v}rI}0MLi#TM&WOE8oU_`vPR_#NxQzU0^U|HSuFOPx1zP(Yeu78?3>Fsy24LJOb zt{+gxF9i3FAlU@g7vxRWHCiR~^C?iibMBW}Ut$^?_(S=MSMi!#&)bZ1Ij@q|HaJI@ zBO|io-#@;j#cQh44$U%xzJdM)atZkKLofaqcWgL}P{|-Q{E~GC&-U z4i+2e36<%*>qdp6bkMi$u4It`a0H{cl;`GFRW&t{xoo{48H-7LafWmYG8@7qY?(^Jdf0s$zB%GwV;~)&4juyB zQ<5=?tb5d@0(O_&vD^oPzo(iyR#taEf{09Sy3J49y?=Y%%#tg~HK)*Oxs1ik>8M6$ zLCjXZy|llcMD8ABFfdF*J6k^2XmGRV9gU|$ee{eauKvO6Gxq6`s(SBZwX5OXKRa(h ziC~L8RoyxY?VIiA$}f~z&Yt)G0>3+W=*iBTR@qVK(kgC% z>rS6@di_juQVL(!Wlia-H%#upJtI8B<|dmAl8)O|Lsa#AKjW42+!snD#Dw}GbGeFf z=o0eZpC|fnjE}JrGx`!u^aquu;Tb4yu%?oY_73_nKVBL9hxn13o`K?D?=aMVd703Gn(RiBR8>-6I zVjW7u?1Od}|M3r4BK)wd63fgyKMz9h`=w9_9RV+AQ%g?Iz|>}&rzbC9ps)g-ML!~} zY*oI64F+7XadNfb@P?0O|ibRL>37V6bR#pFr}Wu z9AVBMRZVCbty;n#xRD6pF;*ILzKf*2Ooq>P^_>K7K0Ey0$D?zzT@h<{JGA~}<^4Fu z5jJs7Iuhw$?6{VpQ>JqfNI_0c9W=FcH9NZdm-ed)2^kFN{KWHS?uGysVDL)! zee{|*F~r7Cf08UIGR2uhB3gO}V7xnrT3|9q0}h*dcOSQ&<~&{xCSGuLpDe6BWt1H? z^`)f5JS{ElHUGP$UhD5^*Y$$Xa z85;IT(H`+HTj`Ct8U|^pydDe@o>)J`69gQ)a}Y|TISg&;302rW9c5S?T>5`V51pbQ zI~aur`1^kGgY~N}?$)hIn9!h%1+38qy{{kNm;J{T3Z76J9d4Y5yZQ*+fF>Rx_;>Zh zA($K+my#5PQBERbX-Pe)yednM9=B3^d|K#QxX|djko4b$eNdU4C|rv1mtm3|3<{1C zCq;qjk|(9ZkRsI!`jcfUN(`x8cNMAmd#kNDR&AR=vKsjY+_^g z;@ai6&OUo$e`KY@tsnrKrmSma2@Vp5@>28Hf%=Mqox-30efF_)?Q3l%uYae2pZIvO zw@*9S`_fAOnT{mbg(HBR9^Pf`siY8@b5=K>yeOXWyZqi^>Iq-z^>rF0Olx{BJX0bX zi?QkShO^VZFt;f9uY?pMb1n4luUI>*Zw~Jl!CXE zJJgGA7YECz*3(o{rgq@mN>x}yIH@DpN#mtQ!uYWlVnXc>H_eeyEg?aimM5t>^5r=9 zg}-h32|os@38&wbIQ0Y2+beJDe5eEk=_M@>%n1De3r>HA}9cNzB@+V9JF+|#X3iDPyy2$RaV(S6nrmO1tJ`xv<9OchT|fb?dyv=Xw_}h?Oeok6 zD2AKyHx1;EhD0l*|K)eH5XjT`Cl5_{iAPl~FVp&@`uk#&rEdym5}9ntewj6Xb&HQw=`UJ??Is8dkf*3gkG*Bd|1V|t{N|l01QQ7R# zCzfE;Gph@O)^~rLy$oiKTQRL$g+a{KDnS+fj``aq5tP6x+2;b;;k-)N#QkSyg8B zWW$u(%uGUQTm|$&;d5;DtenrFj>=j6Fzw%{AvyW%+s~tivQPJ1TVKfB)#(39^@|6^ zi;{z`cp0w8&=DKmr4dgpq`;N*Q@%|d_jn_1*0XcY&7D!Ayl1wYxhQNBn@9kigP7Ii z-K7=v_ayRU(HPUX|AUg3=pAmk@{Ak#C?tqTT!Rz^0`zCHFO=tsGalh1mn3xpi(O-# zHw83S>laBH{=E`)4SvV?<1_OJqgA#AN;o|&XF2IkYI`8(;Uuv}Z zN!BU1)HcNBQ$OpGo{Oq=#LkxupGdY%S?pEb%=NjZo+o@KHQ(?kcv^j>(~`?R`m8R0 ziK1qw(Uc8#&wx$zpm3meHgd8`g(l)~Ue@x)7gx;#3y7M4XtBqPWiN`SR#Hy3Mv$-9p;4&?5dw&<~4TxcqFdFVvX#+ zxWP{Rotxc4u8FLFxSp8MWl#IPs&nez*HeMau`lg{23i}+cYAQD?fHEh;^Q=x0FHQv zA^%CBt$7gcHEc`ARjUM>ABbXZ2>mgBA6+n=z&R2V+N|Rnmw^12Ahj=ChAkPGQ{UhI zMX69kAVYuMH+iy~3B2vTKzezmcb@5Of7=ZzohonNi+2q&gOP~tE<9m~Cj#qiMZI}e zdG~4~Ny|pxdBX~T{D>%{!5?^<+_rm?ugc~AC$919JphQ03tz!kN>LPk)9O%rQEKNgthp+d6a@ZPX5FSU!X_R34?q-gw-BOEC=tq_f<@sq^!tZLgA{I!uA~-Gs?^9# zSO^;2XGimPF_=DpAp4B8-8~gjW4EDJO2Y)AGzP!D4)dtvZ`Ejg>K*q;Ok=&#h~qS= z9$|{qgjd}W0aCE9&7JnU9hw4vl`uuBbdxWpbeed;Gpwn4=uhDiu z<7*#$CNkBG$V5I+8ZA~l>#tnI@-GB2Ck~BVL+8~L0zO9kph#+j1FG$f-pdGG-I=_^ z=c#-vITii+h;fmW)bg1^H|s05U>5Qz5`R&S&0`_Q1SZzwk z^>@R&-m(%1tT#li;iAyQ!MoZScO1d`sF5YWw`k3uIXw!LDx|ydcerUmNPdZ7oL(sJ z_|_Jc zISSDPC=J>Oj0|RVRnj?8(N`G1oKd?wNye-Yk5rLpl;o(?>|5D2b(mlbn(56cCrLE3 zfh5m(>KkJ&+-&(YYf$uGVQ!)2-`AM$DgzTP`^SIAhlA@E@VoeE~UWi*-RYdHFvr?TE{U#mKY4ffYR(y5buykZDhdRx;)jN(s6MK{$0&Tn-Ni)epbs%lU&TEEmf z9}h=RQD8PLEVlvD1ybwHjzrxj{oJjol`^;)5`rYGbZ@j)rg!RP#(s$JFI@C_H^lS5 zb&#g(iwKC4NBNhCz1^-cV60r2s5jyGaLnSDoan{bF@5`cdo*SdL*VhlsxA>4tj^)t zrj5$~3-?zWH?*=n`blzyCo*)4KF z(!<({f1~L{kWqDsu{-?9KZjRe+BR-wO_dN6{}6N5Xqj4jlgQ%~9sIBV-P*=6cvn1Mz?Ne5(2n*PvD+e2 zRk0~`o%aK-+=gc<>4PMMmJH2q;iq^rJTRa~12%78ID2TBMhkooyQ~44oa5bm-(2^cB&d7U4?n_D^5xy3H}s z4Tsg$rgbi6Zj-~a&DZ94hug0Lu&b2Bo<5}8FAS4c_W*lkvAN$5Mj=)=zQsik&A56& z&_QouQnAy#y0Pnb&;Yf>8nO`Oyy1ppr5W=!2h~;<8!71eyS178_E>tdEK~4>lG5Q^ zOY4UJhy45ZK*=w-KA_^r zT>3Y(>e6-+5->6-7PUF(AhaeI8>q;tg6`*Mj|^JRUB6V{gU8)E4Vs)a8|Ai8=y8K# z{JHDPD?p{ri^C*Gc}yyZEJj*G_*qQWSG<9l0F zmBP}fyct-k^%qCMB6BhmArfD=&lHL%#AsSiMT^5HQT)oE09R;LZaw{Rn!(nc!=tiSlRcM|N5SndvR&m6Q#k=@BZK^r1E`~V)$`~p=e&%$scdZf`I{uVd)w>g31+&NHU_`dV(3Ax z{?wMEVqq*f#I~FE(9x%6ieMZ=L)Dxf%w7gM;OG+XkswDYjFoy;DJQphuW@r!g&YlO zR|_LPlG+qL)2$Fv2og0;LsCp}wvAg>`2$o;YV3ecQg46y(cNFWrDDTTC;pTNmt>|w zON9R870gYWuTC-6N{v)#7$71t72p^LoY(swNabm)#7dfLyo?h8qm;>BCR-}@vuvfG z?s{{iM}rkpT`l@efh!Z7wKOVvYm(K=kea?qC!3On{^{T0;>;6y?5?;t2)W^Jd4BPf z6$iomS~Q3A0F>%cxYv1#^O5whvPj68m&HbD9YT5gbu1XY3BR)SD$X~N)u-qtYow`o=f2bpd;0qw)aq>gYzVS)7N+}+ZtIDsNSkP9_fCk z3lUl>_s|Z`G~*T_F7So;hiIMthc))t4gvZlJyPfwE3>GL-wEka!$5AN^vywBBlK4^ zaK3RwikgOGl<Db&n4vQjk@FaiE(qh~cueylPu z{~j$dW|W8a!b3;^|Cb}~l6!1G&bIW0kGTX8cvf0kmfwSQoINYIYfgh8_LMdaYFFHm zN>j`FZjBI;CNF3?d9fhD3?jyJXl(r_FTU>DK1FcNn$#TxE0j9;IwyztYG>=aA2i1v z`ZRST^C@Du@lN%(LjD-(yBSCyzl3@F!R=E!R=_ls$p6wmNl*w8)sDR?$#wL~%&Yf| z#3X{0*4S^x-8@;DDr)klrXe9gF-$vy)?OEzQNs@m#y9b26ylPkS%48`s%HoiEO6}l zdNrRi1p6h99U`<3Kl*w4K1RTM-kQJ3Sjn(;LCZ?9cJ+6UV%sqC*u#X+uZQ7Ms(}eeqsG zZf^lrG-#jOJ0Dy7(XoD&L`r%}65G!weiVnCNe<%gM9&nf2-fAPw~2a9whUiBDPpnn ze+mo%a8-(a3>@iy5Nsj3Pt&Hj^=_>saoy3c&dxDd6_R6qJIfebed`D{PGiQ&m*PMK|L z!FlTv{yHyrk%18!qg-=A9dq}rBef_*t;S-Wv z@d);<#W#?|62pV%T+%Wt#7XnjrZVmaCsgp?hNqi#lluEfzfW6;Jd9>fRc(3X)v+_g zC83O^9&H1w2f0c79VanYK$Ih2-m#vRmt9HLqN*$_6ksTUz71rRH@yWFBr3nD-3ZDI zt+adWH@O5`me%fR+dGDanip9X&sUyq2~F^~Nqy8=SBseXmp812Rf-~Xe8T@}A;JA{ zsq`VLVa?o(mS1D*1|~P;Y#>5)0{ZNRN3)2guH?nUJK-^^-2f?71Yk2d#&f5@i};D_ zRv37&7Gx1LNGvqEuO!1R-6wfI#6l9h+t$fWt2xS&%_!8bL}TyHyY=n+{}rR>oH)l~_EQ!;!RnW(wWAe&}=~ zEZ|Vt$_Yqpk(g_ZQfV}peF@j^k0m0u5*HV9{Zk=TtZTDkH|TON3Q4fcZqGLoXpzDi zO?ig7NHuR!@& zf8_VA@L4b;wVeO1nUpMCLi)s$ShZ*1X_ZL4k(g@;pvq5h8BXNm&G4sTg1%wv#(LMW zuuL8Yu`rZGRCO-{S>1mJ+Tcu3?2ReXS7mcTlezZ>`|IerPp|9Wf&DcfXX_&&&;S71 z{^h%$;J@bo6`&cXL_vJ;d_^9!_bR98xAP-{-(7G$n&ntqSUcXPui)ytpx`0$Uvg@B zd=U7=Q=t9+Bl3jr{+3tH@*#Zi)t>p6^Rm(1JlUfMp@-XG23?QW81j&lj>mc(_q`z} z=X>5T&pIoy_304U*ICpNg4^ShuK2ogq*z?Oy#q>Pt75L%qyAfluUhUEBv_^+Pl#SG z7vU!Z~7U+nGA*2SM>1`^i9Dn`S_G90HRx+=a-XhCSDQabJb-sL+JLc@>r}yxV zoYR;GPuy*fn;m|}Z%&?>?1~@zx9lXoQ{#YqSU8+>wOy|^nI3)lX$1R?Z9mLt$XH*< z`(pZ_1W`gBQ?xx!dSAtgt7rHW?uKMf;-00BIM;vJs_tpfc#nFr&Woxp%PHk(30D6k z0Oja;%=(JLD#o+2kKA>KluLM3+8JqV#QH;OkY>Sv+8(ocUIp5&%X26EY-VPpIDMlf zK_E!_>K?~<-z)lR?H?}nJqA%!Wghzji*+N`ErhN2$uwCzp|srki`QsDC1)Z39NEiX zNNq2Nsj#)<`t7)>Z@6p_uV&{7>Pxo+)WM$@C)v^cs) z7}LE%^b?qL7%*hH8_-1H!e=iUfG2u1H{bo(c(?J%J5SPXETKF^XLCo%%Am<_|Fh zs1yID_8(Kkc5h*~Z^fEKFp9~#)~>8+^gqTQBaF$JA_39G*2!hOVq^F+JaF4({od`~U$A>9yiOqUplq#R=+aQsL<1ABm>QXk&vTUKT%U9P-6|y zc?;9ucoETqbcy~cjFFu-CBD+f^XFc@(zrEiZP}q=FpH7$i}ME^DNm$~uf-O_rXzk3 z5!zJ313g|5zoa6?D$^H*nvbzXl78yn*pm1l*RbK)l7%V}x*lb`8F@eVKQAW=JPN(5 z=xqGm1`^g~7(5ze1J9nPKpxL1P@4TT!GQz(^X+9xd)=;D0w3q!WF!j7LEQ$EjVzH6 zjN!E8l#-wbMRD|xVTn!woXA>Y>}Q->))aqY3co>TQ&JBg5k8&2Ah?H1DoQGCgT6(Q z631(DpFl*^DxK$&nT#z;WK=u7G#AqeP-ktOKQat02^zD)J*?FD0Xe1-T_ri-^u5{z zr930yYCK`YoLmKU^@EU8@6&Q`7c(o_>mScA?-nHVe<=(0(8Lm>gm573f#7tPUj+;Y z+J@uel-n?1x8psf$?D4*+3WFLR6r3uW?jE7k;mFUgv9+k~TkDadE6NT*{Kjd51axc%h=X`H(p_&UqYpc57 zA3(^siXjcjH||0#<^4QzhMwl`FLSyc&l6&V-q#a-nuALavS;~3;8@|ZIcoLxIUrl* z1hJe`BqImzSiN?xgpRf5`DqFkX{bp`7vNiJ~@}J+&_u`v4vvqO`*b1STV&K(gd3}AN$Wem+T(#87oTNhg5i~n@ zH4^w{Khm%f9^|TZnTAW~>Z){u&Jm&TfzJsSGak7L85ixF!>o9`R2Gj$+tIzkLY$1r5a>FEIA9(3z#Bj{QRoFGNnfoG!to1C!^IsVVrQCGhBZq z?#X--Esoy=+=?muJ2v2_NKa;K#_$d@#NS<0!e9xu-&2bD z-IZzXPD|#=!=h7_E6pz+_GwF^@n@^0pZ*z_>AuN~bW(UR@ysw9Uhs-l8r@z?B-v6& z6G4AnR?>CNYK!l0IXumRW`bEfI)&O?nM;4l?ILtG9-Z%`T+bq>B|v3iOhjtLk8{6G zVl|AQrH+pVUB;%Ixfbj-uJN{0Z#1IAO=WKbfm`F*Luk-?V?}LsWm(zfFXfCn@{#{T z)>lSF8E)YY4JuvIh=io1q>OY(cZ1U1-Q5j>ba!`$lyrx5*GPBYZ#?I$b?>_Hhc%1& z@_lza``ORNn{1E%fb4t0(_)TxvgTgrW*vCDL8OG5_#j=u>|+R^NqXr6X1v&s6K!W* zV={N=!DPQ#LdMTOHflNf*@kZlM*SGt-$@iQ!Z?=QMd{%2M)Mu(Q7OrB2y(`g85nI9A4M zkKe|c7suWn2%Jpmaa060SYPe?%q!bVGtVYSYT2|_w7v9%frcq^n{K&eBjK{~jaRIu z>I8%b>k-lu?CHtL>>moD3sSTQz~0;+zm>A}zJ>)cvlA31=~1a(_B>eGf?NKzqW~U{ zetgd*{Nc%Z@ksy;^u2B~bL9skS>B{D;0;ZFAMqHi*ta<&%9Y93%_k2259G?xsRS=i z9bF)DfskwP)exa2dqM)j$W>|F-QP}5aj-z5JMpE-3L2vV$N85Hv@oC$+Hh44^1gLy!AMk!0KYiiX9&GuFf71&pDuL50l zeZn7K2QcZa3=b1RU4u95_{G{M1YKmL$5p+eO64Lq$R3$TO>S|sY)|*R*ZFo5jRo9z z4J1AD@gAJ2ZSlh2VLlJJ;k!>lTO0gTCt9;18{JWNEgrKa+nmuAEY$sl?CV1)_R*Nl z+E1SAr<3fLhn@=R0fLnXj~^G_IPcz`BKUo4GX@euhtO56`IhaUp0VDYE>FF3&c-27 z1niW?CFRCjah4Po1AgqpHgnMQ=y}&a$-B|a97Hk6DuKk4GK%+8YBhYUGd>WN4xYXFagHq6bnRd5!HIS{k=T!srbK~)A`DHY7i1Ewq z6GWHHfIH$5$l0<5*jje4DA-vs!+N*J_Pj16AGU_^4b+#SI2XjrB?UpJ<*6^H+|B2c z>V#r-=xqPv0{G4w$!e4TUgnP(g7L{B(5RU0?=@*5BK(}QASIL_n5P7kRG77cbu@Kp z-0yd7pYSo@Gxl6ye70PC_nu_J`wn)0eF+t&ggMVUK-cMU`&$qb&w1>AvURwf7`>cO zmX|wqj!@FyM@iWyu0fSu_KTeWfjpoUy=+Bv+(@lY5eni z-TBQtZczk>d#kIzs3gpny|I_Jlk~e@KVpG(1)6bLEcz$dkFbYGFXm7dWfIN5gc4aH zjoGt%M%JuV$V2A)^LB3sr%Oo~0&8p0hvT#XL|KpXL!LoL?dB1qK9yjR+=`1(OAqs@(hvSV- zoa{T;1up)bx_f#ZBymW)ny8?p#2(@e%y|OH+0go>Xi(mi`AMs7oF5`cU_CHg!}cT9 zX92fWM0l#uu+Z@EY2PH&i}SkbTI&|8!R_KLMXH8zelK%#K1%+lW61)cvDp$vI)(y~p2~AWq(l zT{5NA((;g}VP_P5ZswrNa8-Xh~1Gi zcuY0vNUb=TQ4I*%jAP##vo%9cZMWXU$qjWRE$XrRL3W{TDTliYKQVA(7-QpFTH>F} z!!4yw)=P?p#J$me(7dr03Vv)z>!n7YfR)tSon|w^jGQ&Fpwl^jU5~2P=b3XJE%No( z)k*9&$Mw#0^Rsb%_Tf!JWR-ukoejjwiyZnG+43ksKI8hIBAQMAP~N<(uAD>=uUDmG z)M?IDDM%WD6WtE$7pQF3+~o3i-tCuK{T+N?X;tKmEf;9AfQx|iOZa69EZuI%Zq zuIyrhe9%=YbZhIUxT@A*$C27IF!VX! zfgPBr3)4Dia;ZrKc7fDx_YGU8#)@F|4)!2qY)PbaWbr;8-)rcknTEv4wjRGT{CZ?- zzBwWxiAe;D0fQW=srvbus(E}n9r+kRU4Z1IJc z`Jr2^f`L8lT>amIK!FmVzD1HF#|l#?ioZ?CDu(%HvxYbx?B@&mjcuiV=dH-b{%AUY zEDXmP`V7)4F zb;SZW`AXEI%>1T0cd0x$PUPQV}B_XJlS zw^`ucz>uo771}tN$T$>X@wjA?a&j0DJd8}LBt3G+kClRvzS`L(l^c+ccrGpsh=fe` zFD>UT4LzjsxDJQkP5I1+?#uRz@d?vbE>A6@Pp0`+%1_Gp&{k~N?v?xrLD~d5WwQi@ zHOt1DM9`+Iw} zejogUGJoo=M$1`K+-h4o&2!iJV=uzgR(um&G;6%YjTq9={f)G8w)`0@1zrzD0)F&C zRx9-)xh8zp-Z;vr__3kK!- zn(&%Ff;kxO+Tik4=Yik7LGzsqBsUI1_FGxzKLS6<*cX3W!GrYuO^x`sL%Vs%0^HE& z-1Lqzs6V=+xq|g0BqGpMaezUWeNoX9c1vEj`$v@xi;sMuOy=hf2oh3e9nVL}w;2W4 z>D0VQVo^W#JX%7(rn6CQ_CgT$8g}>o(wo-|JI1Q#Qs+SkK3XP(2@sK+(lTCtMdeAK z-zqn^jv|gNdf5sLs-3M|i-%m=dY|Dy3+4NKSCwtLbOnMASh+IaXC(aUv9R3Vw{VgMjQyNn>295Q*Avu# zyG&Y{so&0@G~DOz$tUKf#f0xuSnlvt5H~qLg06}Ids6vvq4itv!9CTy7@a8ySt{kU z@c}~SVe6RhnjtymvHg1^XR73=wFDb4RQC356=`bfl_S#yW1{QB^>L*G;^R|#H0+}N zss|*#)AH8z^t3GDc3~keA>i~&wc2(S``zDw{G@SO?zI6N4^ix`k@gS-Buqar*tHdn*AREuJ1U@&)yBL7X21tCQ~nh)33 zWG|?)^O>p8WH;Uv4g~}fWKb?izD5UYeEZsdH;+pa`(s+4Vt|<=#LtASuH0*6|?`$!f zZRj7{iBOw0zbSCG=36QCuD^Ld1CF7X>_A!k1i?q2eK*47^gHBl%$o<~()Sp82A%sq8tn*89; zEpLn((#0(yQ*VJ6x z?UhA5OEX_Cl>e19lAuPi^8JD(-}{66Q`YaXzo**{%T>V|^(%inkO#rz&7%cq*ZV?# zN+$l6->cKeU4rXZcF!|Rg%n7gcKjk7U)*+sS2+IuRJms>cLjIe56a^GeTFhAwJp@v zfXk#z{2DFOC?dC66;WM#gc=RL3RArvnj)aJA?-1>JFYnbzr?Lcy;?5OBS zAzlnuvFp}gIVI(bgI4$a)uBh?y)Ml)cfI?cbW{XSRooX-Ji?dN7;4eEJv*xA>~ADM z$V}#`qoc86dqWM4v&n5OFsAY~6#_!E)$k(}>R&pKodTg(gp~}uKq42$hsG0YBupXS zd967G-Sk@XRAolMdwOt)g@uNcL97T5c}_CECa`<``h`RT+ADf`oJ|RV91n$|b-K+t=}JZhsJ`B z5+CMB*mdpK^rsd4VVV{nNm_^gVzEsByd~3k@KQfTwdSk+pyBE9UEVL7;E@U{hSRdZ zd?HrFNlqZGhXKbf;uma<`_(W7l&(XM06I-^+S&dZ8E@6;MN1WzA*=tw;#cUfRT&vn zd=t3jtk#JHdWJOG&ee#&&Y5HCU|J7pvIOEsjbirRrytOPgtV6ou?NqgpvFMx4d{$Z*ke=1bwP)`LEhgO=t*@Fn+Oc_ntq@z^ zXBQ@Bz>O3+ALzPzr;e&FZEm{2fO_8$kQKy)6dj|z%C_(NfQ^WDsO7-n!qGCcuw4fu zU&)VYg_b;y4v!F?cv?3}oV^I9ZOa#>kK9KxRbUyZ~F3NavVf~ z0@le&Lv}pv;7?~HDTnhpZmyBcRlJm{sqBghKbUv>ObkzFeMz9mn@4UrLwjnnnK%z~ zln8&Z{fs=oE#Wy4SiulvKR|QAlIf+oqsl6L7UHDIXlXQs3L=dklz32c7t^;rcozLO zwD8XE-os2^Jn-9J+~@ zmP^kp>E7Py{jT@-=Y4J8X7x2(^AqGAvqaJV9ZvtuW%8mjnb)L_LFSoB(3>u;4p)2g z?Muuv$;T(u?AMA)mM`Dj_4n)qn_w>hOe7S#f{n3ngL1Sr?KJyX<&6=K%qy+R7}r`2 z^>Y>8fMEAzquAz17Hsp3)*6xiByW`r$-haEF zj?U;jutr3M08)0bdwR)u{Pobg5+6TK;{eSu)8R%QFb^k@v) z?`rcl)pm5gR;~Z@gGO~g`^#q!O^F67%bJen79DZ)H!%x!gowyvkhoA0$$FJSl@G8v zusemFCPnYJl1pAl%963u31C6HEw8?#lF&E*~7kwSW9v0x<4upv!A&f5I0`*2VZNm9n! zcO%7aUS+BOb0_89%6yV)E0-UZ@u;rbi{A!C8#&b26g@Wv2dhY;?(wzJFwTn{?7yP8t_TP*Fw`;@``+1_V>Pgvy;W#{n9fK~ zL$z3Xq9rMwNN!VqhYCj>spMEshnzNU)ewIVLJ;v;n|yo-dVip3O-xAfJ|r);xTdX# zWAz*2AJ-1=f9r)Fx?V<+18}{I;baaYdO#9 z{CqkpICOdccv62uBSQk_VUwW8hjF1y@jX;Do`dadEhm4_o_TKkwVg~kNdVj+$a&d*PoI-q&3RfRcn8QjqvpP?O_zgP}P2$2Zy8un%P>huDVihuZs6GA9J>r68!t2EWGW3{GWS>~o z6&8!#(W6LQ*E>_ zWIAyokL$H-ziUg@m=m@jMt~GPk8tqxKjpzB_}wQUB8yNWpip*l#sMBQ#-X7NF;wRZ z`1_v!-wuX;_)s;5l&v$U&|yDoG~HBMKnYLJ^hW?*z(?Qku55nN$m|Bt&p?3~;eLzt zt;zMjdhKLyXh<*ICt5rvZP6QB;hmezXQ!r%?5+p%3wyh-DZGkT;Q?%k_;|{n97&Te77k13%*`Ot z#Z0R&o!+0X7tD1N8=70ABz=UX$aEeiTi14)K%g(w=v9ej&*NgLJT4%gIDg2nrU>y( z@SPVlGIR*Ns=R()2c0$fx>ZIaf$IH!guVRop+R;m{Nd^C{<1zX60$XIjKUwUyH&Q_ zXlDoqsv;d;bu=$M@cr0%CuP^wcONZHXP6PK)*_~024NCO=&ufpru`}DQgRsf8 zy)OVM|Fl*L-Ul1U*UpDbdDTCA6#U*%)o^uH$zxW|e`;^%ZD>dWW&S|hT`wFNgl46FJHwcQz3br?+gqQ!s0x#_ zBW;A1vEJQ2ER9$M#BEu#yXU-?)h8)ppf%h5IX|l3-*ryDWcd{|jyO~ZP79q>#&s{NyLqa4qH^PV4!4Qvw*CTO-biRxqdRl?H%{h71@+ATJ zW}hqsZ}jjSKHZM1BD2Xu>lg4xDhd``DIa}L?4_Ln(z*2jWWB;6Zc#9 z#W)+ob2pcN#0^Ix$`2T~It$s=3MW7j#9!NYSlM^bb{6x+ILwB6`WqW|vXb-s0+A48 zoB5N^6U+|ZMVX~RAcvX1E)Q2LY^1HuHpy1k??1|F_QUv?-VoXAa^LpSpNvV#!D7^j z|1}*!1d=$|iK>ff?~_yh+h4r%Xs@XruYXDF&T~J3(p|yg4lKZARFGaf@eUdZn`hgr zWo}eW!%$9b?nPwSOnplSdr47Y*po&L1}AiS7iol@s4|uwI75exMfA=E0|^owtNO3a zB%MlFZQS0|qKZS_t7>@E?aO=629(3`fA=6)^z%?zGts_KbTBcfsKi<&F>vKaSrW*n z{r+^WX6T&?I3PAc?HAB6kcJgRPFt-+o#ZTi4EemGGm4t;CrUzEk|aqPARNbGY>Ed0 zY3e2@&hBpUjRw;<(c_Kei)ZIna~XF^p{;HnHkfUkddYuA7L=$DjW$B|1C7nAs47F& z+i@Y!wc)O&aw=I7M!i`2;)lwwjY?a+Qct&CFC;0ZgqRPYatBNwp~g)l&(=Qz{AjGa zsmK{%F1Vc$cfz>~Zni;2@o<#znz{_^iFeqW{Q8N{({H!j8T@cQknFx2WQI!t72_gT zcGFLOlT~j!3q#)=f|!-CIFa1MMdgy_E2(K>prys^vrad}2wBEtj3$i1m6%X*we_Lr zll}+;(s&~+cKuj4^!|tr_I%zz)eg>BFVhV$ib>tG`jObISLwqwUf`_PP~!>fHHV}S z1dBlsMDY7Y)oRE?&uKF&Zvr>-Wx?hu#wMHkB+KP`P0Vcn;(&^X>vVCC%-ZFp7QOP> zawozZUx&qW>U3LW=ko}wB^Lbk&!+8C3Rfu zuvsKX+VkXaW^uzm(7E=exzaS;;Cs0G76KDsFnBlx2yJ5!-4h(Ufo-PKwNZtESpLR` zoDyYnyq|DxD&Y_6T>Tq;pPn}1I_1yL~Y3Oir+ue<>s@F^Z^(awN z+v!Ol!993c$OSTd^W3mV1*hvOAmsSaKYOGB%HFgIj7hQGU3q{E)y$U%>K{GLx^h&^ zT!jBK=6mQ+XUM;*q>7pLNeu1_hOmJhoo!PeWbe&4T7RRdYC6p^^dAJOTE#6sx*t(A z2!HTA_V)_ZR-|2C!pVBxJU71AY5geaHKef_QzU?07@_K?soJWZ!e=xj4(F2vF&X1s z>LAc}=ns&HPn6mdvhHxz)%JeL#)YnOL}&)Qg%Z`z>UJA|j0Hlb`0#DJ{PmI&R*FL5 z(^EEkLwOw&xq(8{wI9+i8gUI`j8uMp(JSBl#SKI*juWIXywH3FT4ai#?=5()EYg_X z$qegn=O7jqCAoZ7DO-YacNFFRd3sqw;8BXy_t@g z(TFhf5HaARuDG>GNz<(GA&zyLzq`h?u@ge5o30Cn?x`;_gj~l)Mk?eG#wJx7X~qe^ znHJSP2;xSJ?_eVZiw+3WN9{iG>x)OGHRI3#;@KF2#=fp#!OyAW$%I4^rt*m0Kn3b) zKsEf@!oT-VK0@%TdCzO1$ZIm$7e+?4#l-ZN4KyEsN}S{EbyrdTaxl_{yJfA$7h!U@ zzX5rf+$c0v$l8|hH{y4A!4-J3kSaO%(#A7R#_>{+++*&AD9PfY6!8}1gO=(d8^Eu| zxTP)q@cI!bHHrW#UuufSi%I;8+~>RbvSWdNuguM`S+Rr1JDjz$WElAgLopm4zytAW z`%pzhZL0vAAsnbqM_F}s_ufVN))4GC-jVhmON6vs%2#uqx78th+)2)Ln!PEYl$%sS zbDm}4Uq!UV-8Ey%eB~mkXsN705pNWo>nm%SzUo|85VE;Dm@mG~WFc2k)U|8MsTl3? z*TT=p$iT{p1)V;0cs=L(XGcFh^}8?{GL7mq+P}o+xG9vQyb6s%mIs8O{VI35I_Rne zFTm#b-y{bq?YS$CyE6XV*-i!ZxYwU=t?6EH*1HW2k)5+vV%x|(?pQ#t+m>wsiUtw;NK^tR5>#3n+mIoVuo~DB3HlPj)Onwxp;Oj(;+0kbbNa8Z!d`_*9x{-qBqbsE8gqw`vR{nx?hTlT zB<(!`7#Z-?0q^Xs8@qFrxO3zL2K^5z*ec83w|n^N3U2uTc#tPyoj{Jxsk!Dd#ZaR+ zua8$<0Ce)z+`pz=PhqQ{j(tHbV>K>^hCE4u6bbtIyO|px z6Zr4^v!19o;$u zFP1d-a5aXBSO8;%1QvSSQQ-FW?Xbi9R!DyRL8eq)8JcUj=OJ_B)}TvtvKEIPzQsoE zpJFFKXkH6G0`!4YhzD$m=U3#@Q1|xWW)m`xTDX`g0Y+B~XWr`p<~Kj?fone8gC4l1 z=1-YQX?<(%Ew;0)DhzSyf%B(NJgsag;qTbl6TS(rkRU)WA{|&3nK;EBhr7aHdXP`Z zJ4d<^xc}U3=S1hZSACj9w7m1bNF5-rky4UmKm4`jlXs^<^ zK2$-W-YYpSK&9mWdq_%c1-bv@0{riu?hELHh-$Dn(uXBYy~o`j9v=Q9NaU&P62s1i z{Ltk5ufT%}2qtB8#(YMG_5Q{SEkwy#2LkV*J)o> zJbcIJ6dcdn!X$!4;`bAfo9NcJbgo*s{kK%{q1fxm`hm&s3P8SQEsoNAL)E(DEsNpg zFWbSm_>*PqIEtMwAeZnt@2jt|+ERYCZcj(34|3gi1n}$3gO(EQ>Z=~m#B_?fyy!pSmA! zQRu_t3RmO!aJ!7});cp@x1X16pH^M+lEHv9NBM6ZhaVxwky8$38Z{#ZZybJ>19>QR z5~WE)yG`GX>!5yt0TqHm(l#>m?eM5R(VyJhH#r4oZXtlO#3{beVzH0bsU z&~d|%-}3jLx9;uBiQ4mK_h-2+E3x6nTFGx+BnY3H=QekApScFOOvwLj9ywg~`*FYy zZ}lsjG3r|D=a#2bToOnlLI3CX$OTD?Augf!0Ax57&jW`6Rz{QUt1bW)pS zaI&Z=ceFvPt+rWI-4jWN3Dd=+d1JBak(ZqgN6p~%yQ!LhE(}uiaj}}dwWCLfWvaKD zZGZ~icdf>K={YZS8u9mA(E76F!zW9wDU++S06H$C->2Ws5D^40j_-xc&&zUIbL|_g zOHWQE;eOGKC1X{5XW9aaMbRHB>XYWUd6GC@8Ce8%xNiv{Uwr@;lvvUH#>$o0;WlU}y76EN90T|fK(QX<$MLlY5#Z1P+@L&oww@DUD zmCPZ+e=sbr#iJ4lZH?M2dbvMJ>Rg5pvwaKcmG4|K`b|tgb-i@s@zM<;E1!=}i=*W9 z?${ib7HI@~-u#ja)rai8Jl&N1f>G=b_%fVv1OOs$`c=>RzD7Sy;eEDLYAdB%Bjz&E z62#yt;eXP*Yiq)Ui+Hsn@`f|`80U`yV?5XW`m34sBH1+p1#x@ z1)cipZ1C_$CI16OW5&~irz)bv*y%M8@l;h7dHz3M2#Op;@sG(4eNV%=|SE`P;m_6ok&GzvnLe1w(P`d^c*v+Y}A_aX}R|5}o9~Gbt zRc4LP$*Y{Yo0UqASdA^tP;R|9Na$?tXz1wZs2((cRB>{CVy}0_jaa{QPDB~>&qWe8 zQ}w=_fXE=E;Hk>{pgdoh@u zqpK~gCDgSN7oX?wyy#x)JZ5ZkQ}d&g2`wyZ%i}jX>{Y{+0Mz;pHd#djL^Q6qQ-N_b zh8Fjiw(1H&6cRkFjtL7#^{wqm`w38*{u4G7{Bf_U$Z^bUJ6+ZIK2aZQ$1+?)DI#e| zSiC>u4pI=tW>R%@jIS){t|aS=-^?rf2GXmfIZx44L_!ObV*_aoW>`xV+Xsu#_Q9Zp zXL|OW?hJt2Z+;=0B-P}zGFq<<-vDuY$wlV zCwIONT5Ej`&5=+A%Ltk6&vKQD>`tW^H%b|bISMGpJ2pg`bAi!{gh`GOahL#cn z^5-KgymL>xTQHzy%UMGa+@%DF11n*db*)QJ!d1p8C5ps{Hxiuu_lJ*tsOD>4hxweV zA(0-R$h8B^#T0oz!UJ;xPip2{)8ncr(}~9xJ6Dx&FN`yf zOWE_@q_SC$WvPAEsRcrn^j4?V&W3z*Cin83&gi$kYuU(G)bO-KJo@~grcr8p?RtJ% z5o=`bqZA75N0Xx)dLjjURHC2cWV3g9)8sPS|zKR4Q{drO$YWp%8PX)@YmB=Kkzls zU#|6~7b4l%a0KMf-eu=VUgue4{GcqL6e-iX8a%lmOO9ng&>d`8`ay#;D$y* z%@`Nb(R}qRnb6%WEPWeQ_B^T^RH*zuf}gyO>*P^lyA?2ZZd$1@D05_rf4s}HYq1z^ zCF{JP6G0)L(z0J!V|#D#%4=rIu(9pxPbypIU6MGpF(`pHp46MG??Y?@ep%;5Pc#CS znjrhtp?hH-d~BlB^PcRe`#d^%jMM~2v@W&;Tug!#9iBX8jMUJKi0sS~Ai8%D#Oafb z>^o_+^0e8m|ArDIz-AYEd+YK{$rvB9pZghJTqA|ut^2D$SZn5^$4l&P_P0rwKhSt_ z49?4!VupVI7u&+g^TXmN>3QS16IN#oQ{n+T2IC6)g(kP70=QX!>lufRL)N6{Iy=RQ zk-o3N#f@d^SA!5u%I=M9f&SknmL@iGw%20{ejre5aX}v~0hiNM%z}J0KmKP^Z>RR~ zDCsfc7z{cJ81X+of1KO+O*Va(VZ-A;_4gN24j}v%fu~%(x*gW9v6s|nf5$?r4!329 zgFLACd}Sr2Ba{78mD0d~Iv9cslIvf2=t{?wrvutDAT-NY!jDZouK65HGNj-SY_tsG zg7KiN5R#i)OStc_Ena>x@aQgjp{#>NT=%Oee&jQu)6XZSBxHDg^9+DZ+JD6Gvnjyr zddPZ|gbeE@*4Meid@00wx@gGjwb{wE3Y-v`S+%OxDBr8j9juNL}0t=_4 z5C)`N6->*`yh+K-#uh~yQcWpNWEOA2(9lumzP|OlX_l5ooy8S<^~$`YodH4Y2CeZLxu;}FfO3KAr3&iA;Rf`@;zR|>t5{j{sfGml@e`8Ok>-?&LZfLPVk^;z|6%oYpbS6ea6 z=`3FuPTSVahgX~ygwz_XDv0ZCB*_I9AU9r5n!_vOd_PDjuRf6sT4Cpl!YhDA^B-Po zIw}^vNnoRqq7r2jFohGsd4e1QXF}FCdxE4YQ{(_AgJxQu!Rxiks*M=ms|Sy_i6_(& zFOJSfd+^pcT{gMwSDjxhFIIl0;7MUo>sBY^z~W$mFx-jOJgt^SWk=Bwibhsz3K%SY zC$n?+5U`J(ycsSFrAc{7ZMsI-@kXL z0Mhde7KWz(B!RbqVRB%F%=XdF>7W#&iM}&OGjP;pj!m^F?}lwlj{2&m=-yqtfGscbYqfF_CoDHu?PKx1mP0C z!-9OA)l*WmHh*Izw%1oz_Y|VCBAV~u463IdMkT1Qv$OvorB&ee^Xn13l0<>&x+9i$ zL?yAB2n<9h-obh2lK$hqMa9rWD<%#G!(;6F-mUf*#wG{uk2&^FABMtSy?V3h6SD9{ zRogY)Unzt(zVCZ&GX2-{TGbbmv<|L6_4V36JM@&=>O1tjub*|jxZ=*%+t2l_#q>N$ zqmjA>YP#MA%cPfmLyr4PcjmnF0S%GTI5KSfFo-P@3Nxrfk-r`kAQ8yyd~_N8(KGs~ zQ>v7V|8B0YQEJA|{$+7orR0GqBOOjgH5mZ|$sYs9vDDE77!G9+rhx`!JbZVU zk`yU^X1mpEPu`oiwFRO@BE5fPpdiKNyc8);GDg9^)*RhdY>Q3cD@|Wme&4K|JwKRe3BnI z8av*0(dWG8)n*cKJ3X(nW|OCECa%uRa&|gi>Csx-((W}MZ2k0u)k@IqSC^r6o431} z#d#GKndi$&u=NTq6}2IZXvN0*vt+75u1Z)Uk7t%BQ+%*-zfj-3c5o@=@Q^6w^Eq<< zT~cGms4X$c&-fg;EnwjC)YN7~Hw8e2o4F@?zMG-%v&^vi{0A_h_bE-xeZ2y{>E1uj zQjXCIQ~#wM{ne4YUi`_fSEy{kl!zv<-w|ch+bjf%W@?T~Il{8-tx|b)Drfh9DOBjT zu#dJ_FLe)%m2V#kID=ap9KMIV`*bm6>)*>5$mkRoJA}*1BEiZUs8FsDLNKIM?Jd^e z-JQeD0;3>WM#yS=jByl85^Rp55XXKrR=OFQc+z>6`Ql#cy3R4L&7#)N417~i9*0r6 zWL7difdT}decu(ecAa?d;=AR+lvK*)t(vY)X{hbqh{Npyq~SUk45;~aT2dtGq2c7> zDFvn}1s?!FT>*#JK}zbOLib{+6~YI_>i%JKGr4CCK{cXBF%!&~o`NV5rTKX&uOy^r zh)K3}^4JM`EL~BhVS(}6)gL}Bes~Y^i7^qviD-)DU13lgYnW5{I*R}CbA!eZzz}fL zBz$6V0yiPmh|&c?(Xz_L;>3<0DS8tTgy`U3Xz zj<|y*jj7Q;3n}MKEXz|xC&qj!ssCmQ$10Tf6D0Sv6c%o|JV$=0Z>?;kQO~Ungv%?*~RnccNP@CE_-6}H-m$Z^H;%|ywphW zA)v0+m?Twv4i@UmzwX$j33Qp6JFQj}I0B;Yrw_lw#>ai<&D>DK6UPFzp}Idm997IL zWxPFkJSxT|iyn)};2@8Im+mKTai~*-W?x&>pq1J`^h~%*Pr1d?Lpd? zqV8?~CSir*zt-?)y=x6qvT&7v|x*>>lR#6dOiq+<& z7bJb&OOHQkGhcac4L;BF9`viu%XjG$TSJo3WHxpo#weuU=a$69!DPB~*tsdayF6V_ zh?u#RudQ6ZJ*$o826%|Xn0lq7f0`y)A3`5!2(;Ha&SZj}#-=Z5f(1Or#!{beCOOqV zu39S5<+7ooWl%M~s8(d3InoyZ)PrcJ4d0NarNm8f z2l@T>dMFYWGJZomKIn)UN=u6gvJ;D}<(86y1p&24fco!e6SV)22LMxKoax!ns^8@C zm+4b$Q+wW={Ga_Yw&p|y4S;P8;PIUpcmk|cJbVhv3WgzihLiQg9%>mP z4E(oxA!Nyfk`6O_+uOIC8WzL|_(w{HGSS5{bE^DETtL>}T~~WJ);&bj{j6^@l@*|8ZZ2Y_W2GD(k0e8y z%xC8k5wOQoER-|z=9XK}Wa{L`91B~a=kj~lR8U`jen8j<5U6w7!{ubIoY(ni(a}fz z=VvMbcTCw<$^4uTk5$0-KAcC+2G^G>bGGW-wbXTQ!vIVPR~s*esQmz@+H0rqS+l3% zRFt&&qiega5Gn;s&qtuCdFL84L7Wa(QTsv%rEGlb3|qlLS%*Ua#iatnw_2f#{Rxy5LoPT;K|PO=Mw6@i_D~% zpUa@EAJg8g@7~d$eQ%(pxGWrFJ2{DU$sGS0r*MC{j?|(4mPG(VW?Jal z@A`KwpPbkOGMvvE1WTMnNYUFaIk(3~XG9Nb^yLGKtpx#< ziz~b`fY(+~5y@Lk-_c5SBNsS2{H%WCA%JlUzTVh#eNNc(7;VmE(p8^3=Di--uqJge zGOQ>rF36eudv;N{!aMGoO8**-n9k|eC287KApmyIu0`$mk_Z~tCn?4EDask1JeHc- zIXQE!yn)7pRBH3SvzZ>scu%|L;dNp}vk01JNR^gNTlL;=(730Ke>TqJ%})uO-~Wwl zEj5kAQLCICrA=hTdOWgRjeTu3_DYqM@3rcKFH2SG_R*FfPcxh{Fkg?Yb$WM7 zvV1?QXY5Y}c0YwF zkzr#Jl(MHxqNwiis-@mxZ{;IG*QwF1VT9a?o;6c>F*_!h>EqIu2L@&L3*HKk+rU7e zDyddEK5)h^5odg?_;pChF1804-01=yz9?JUyYM{;5cCjOFLUL+$&b{=V))K!vG$#6 zlh^F)E5bkTxo4$0ApD65fwXUv!Y7NHRpO=bE8e*R?i>^VK>oxh_D(o6ocr&m1TfS( z*Y~ z3JM<}UZ^_KUgPyN@Zx!%RHk{N$>-QL_}=PORLgr*CGw4L3c=&*T+VN`8(pKPJs|C` zFZFcfHEkRiy;DWvz9qC+Tyd8=(Tux);Gm3o2Lj>Pm9HNW4h*d6ob^5Eii^DYk1JK9GjYGdI23Hn zD@HyLm6Wbsl)y_YW4vG5W##zvNsiG{$JpIo$RD5KleH=W8tvq`)+4jnIaMmZGulsA z#ezk%Pp{k7AhwNlJflb|A72_iOLqTeZ;2?rK+PsRG}(#jYDGKwvzrjL`0@u595hBi z&7@Xe%|qVmR=%dFu8pZDH8DtQtXaz0h2LoKgS3(p>Hu!KPre1X@pLaWJn23BDy6n% zOe}D!EUC|tD9$ieN^3%+QbEsjUTT*z&3X&!HJ!#Uln$OF`MXiB9?j1ofx7Cy=FwDH zWin2RZpw6MQbV%PE(YVoMpA&|cSFPPM|cLh>!iM za7D3TJTjiUrqR;2^w)dTMg4)R#=pas(qUn<2GS%?gL}j8fAHV^VlxAss+s9{?dj_8 zuJN3qe{zTC?#No z*;8PG;8}CJdTW<~pzsr+lCWjhAPx z@nv+$hRbpz@)ZjTsOyY>b(l2$O%kQ-lBddPvvvU8hsy*_1OZSKmm7`LEu%7rQ*eua zI+wLTnv9nPqa;o~DrDh&xKNrGElU0RZzT36LT7ZoF#8~Hsa<27VkOZCzcw2Dds%5R zhTF2c2lP7=7Kn+JWwi?F;Ji~z;9cTmZegT2a(_oV^oluwEB4OP@EE@Q{f}|!LtgwF zsNoIgbOo?S&tO^3P{JIK6=XthMOW?F z`K$0${WTgVdZ*XfNSO_$1W_+b|SWdVaNz zyNtrj_HW<)-ZlkI^(Z;0Fds3Lp1cKH6)kx0-=4X2malAnGe{dgzPL?yN>!$vCc31E z>#F91qSME-07W3c?PJEp?4Fg*G$Aj0$=!ps%6KL>-7gICjXv948bAxT?9jZJVf^FB zYHd9i$Ma#`2eag_5ULT^aY9(-uaMc37mbEUdlU|uJ>cUdlf^c#17N8X34sw zWi*|Uvzt;9W>)Ai6CmM_Ey&f{Y;tl)*1%zk49M3P!224Pi#aJ5QW-Z}7zrlE5fiL4 zfV~U^bI3R>5kW2t9PVhAQb1Xa58#bB5ESD&xX7tCr@sRMq($WPe^hF?RaHm5qiFY~ z%4X+-b-kNivQF3kL)cpewH0nr!+}Bzh2ril?oeCW2LjH(;q zwhnaT2=ZO6mDMN3$`R1kWQ}vhgYv5V=q{K(xCE3o^_$CR6!*2l^r_is}lir=j0m6vMXFNA^4$^|UMz_x!eUo*XKU~q01i9>LFvN|cP zZSKZPC1L6LL>|mi$(Ix5B0=0F@HSWx{e{XPlnU!%&!$#8`MtyCyl#Xgkhc+mdpt~p zY|V5aiZ%+LSp`OhC1G&Z8^A~3iD6b|X=<_k`N7OzAEvFkaZZ*8GTKTP^yuSU-z~km zlCa3Q-vFml0rYKLoNC?n^9O!uFPwz zA7nIaLaQfSRj<>b>;(|Nodkk0l1IqbT~o6~16hQ4CbM2_er-(SKisiKN0NjllE1 zz#~iR>U)4l=g-No*Ry!9kt#>H(;i$~TkGb5 z$vom%9TS1nmX}95jBaH*f9}fRkSVB0d;LogGKRisb+w6C*PnP3J0k*mTKA{-MWHWz}(Bi~|vY zScVtljDGXO7FeJcTVa`tL(zL;xVrszaY#K}A_pVusjJ5wr`+@4yz%Rovqz1Pzo)(T zVuwiz&#j&OSG8f~Jam=-!;ImQ)?43;KZQ~@*(u2Kq-+$L^!#;o6iB6`W_ET(r7RGz zmBC!1$Cv2UgN1aNl=Wb}h5g~5NwK*&q`>LcyU$Snlg!4@fYt4OC2eHUbV2Eq+tpVw z0ktQ$vlcy>733J2NjY@IHfE_M&u*{*shd_SC#}G6lR)@O&-InN&CYkfv+{AAobvsaZ zP>X5UT1%72pefmbgb>dh;^(cTGZcet-pOq*xix@$$o1;fd6y} zwVVV|>P^ADZCZ2=#fdi>|HB#Y4B4SWi&oOs~5^zJ> z(^LD(d?<1?l>s)qQK4Ql*PnEzx0uG~(}fxDJHo{g74hW82h${d1}bd+)QC4r85?5?%FmXI_Se^qFBe2i>?L`$-;k zBoZ@}Hy)i5T6JERxR+eO1jegWlmotAFEXRaWdD?oHp^+AU309gk)dp&D;r4ES@AyB zxc-dJOl-L7+_{!vTJ(4DC|O%cV&?H|Ur( z^7ePg-|gUM6ww`dmKN>&TqFHv7jXd5ZL;iubfeRtTgeecyu+(3v+FU8qLKmt%B8lp zd#LF?&|aNf{-`1dSL}4Uz+1#L)oRogpFTf5k53_6(sL`%{Y;)@HebL>N^t?gK9LFu z)~RH|T~iSJRQUQqS;UQ0<8aIlW~Z(gXE=>xBPPS6bUDpbGMS)>T=ZoCh7gZu3OI^k z&W~i6{AFeG-aa?+^`u-b>Jd<~uS>W1ATp!qXn7xF+tmu8Om9#&8m*IN1V7AOLZ03& zZK~Er4L3H$rwyIxG&(zHjnPUon_0A`KMl8x$w|^SwnQYCvdZ}Uw4O<|0yGNp94LK+ z_7Gn5HaBI-W!(4>&1$^|RCh3)?y{|R#oTd%aa)U7F=jMz0@kqt=H}?a`Fu7))r#P9 zbXOeSv!%_!+sW)x#!6V`k_uHv`?>@YO!Ev#{LS|KK&^lP(2YO<%#<>N-&#YsM3ts< zPB-t9soyg%zUGg^vD#U*ec&8E>k98#pu2Qf(MQ3p8~>{HX;CWs78lag3_g%n$bLJ5R9kpG^_vUYwPUTR}L0`3QBQwEMbh@O4KL5|7 z8GFT_{%7guUBb{KTc$6J+YJI5h{t&vXr$3-2dJYG0eF|SkOPNv9eJWLZI9rL5XCP9kHo_ol0o7R#K7wB>mt7lTCg~z&cwqLTII?rAv1chq>#8kz8s? zo9)WkB}w>Vbc~KybKGOK`eYO_n3_4&Yp_3kux)u&{GEf5K|(xCf?OTt6+-`-B1t(@ z@x9_#sR3HJ(#C`)Fm{!!CEf%SXVYoKc62C;hlgk?!Hfes>v>;g443}=F!>8sEtQX- z;3ZlCeDv%NhCMCzIj&VJ@Heo#4LFAw0Q3|-!BJbq>H!ecHJMh*B60l zM@tC0b!@l(p{4y}=KlFNLh2URtL-9hW_X_a#C1mIW70UM`XrD<3VE^c3knpjbX>(} zV~(4?gbioTP3!-a`y1d2tqUe#LfyMqQ-sOP9iq$Ekd1@f>SLPXb=5bFKbL7P6f+Nx z{-tNrM*b?cwYNpHjsYmmW@0T1yeclB8yH|>;yKH6w?CH0A`=HxFqur?SeS2F4^x0W zD%nPhsJpAoKWoWLxL1x0VGb-EG%$8I7bpL5JVixCMMx?u_+tY7BIwU}xuH(RWHaKO z&{+wht;4f0$0gJn=os$nmr&)yFlIv3vhwQDX6#T~5D-{o^dkAjon(=3k+eHR6=rjA ze2|ZWBgETmbU-eu)T2X|=|_+@Z!^?gcvr`S;hG{|oG?hT^zdK{C!!ITk(y(I3{MwZ z67W3=sL*Z->wV9=S&g^Fpm#ZQO7}H?NOe1$I~~09??wk+Q-pahEaP&%OmvVJNzE_fBkgO73tUbGW6E{FZLj_~7W|0m$ipD}v%B zD8m%rZz@r#XnrtNY$6%f=DSnOZWR&9mC%y&EePxm1G(?OFvr<_rf;-yr^SzY`l`Q5 z3KqN<&k-Jq4S!UAi=APx-NF$a5c-zpcuN8wF?fbd>p%#=NTJluAi8_&{ zw9)@WvO%`bL<6U(*O7BRi$!SGT|xFvt#beqPW+56f`VS!au)O4mNW^p%)6HCeU3M5 zOL*MlXH=k-Bwb%|aIaSo7x5)nT*VsWiiq3B@>#+;n(JVHnSLez@_?e%l`k*1H1{vX z0l(39&2cQrH@3vwW6e6x(K3<-)xWUwba>e4#t9!BoE;@_6`SRTE?zh)MVN z_Z?SU=N7OH0YxA#iWi`LqDM#gevV{1UaBqgR}OvufI1f$@9745>g~Lu`tW1?ed}@~ z&mtX`l6f_+??iey`{n9XD;IG7bEO}TfRh?U(jqpsdC1 zZg;Ei%EUY-61k$M2_8m2$(sCYK#!>!+JwgNbZ|6e^I}PhJNGRNTx0B@!ELvL?vYyO zuxk%mRiYY9!c7h=P!*|68mhOcj5)J1Ja<@OVqp<#97RAK1~6VY_s0lTvqrzNHTO-4 z4zPTzi%cffMoYUfdh>Z8amraqB*>gap1Zc-E5?JjoHuhRero#Y-EC6@T?GKJ`Ple4 zn7|Q13s=NPd;C?21U5kOaXw|wo>bC*YD`CrV8dUZH(+H(g86f5qcRi9PrqZ=PM;0) zA14@u^1fi#$>b()5Bt?V6DXNhZv$!~{1yy%*XtYm=e|+k_8VOIG;K5X7Nltz=DdzSF zUf(dekl&<#!7BY@N&-;buUd4@?{uF<6pJml8)ikW_{-VrIw>r}g7t8wJ%oMVGMoe8 z7*dDHoR&nL!56#F3IgJ5h!K^r^Q$3Oi?3_v<8>e ztBSle;~rsA&i;A-M>Df_ZoaY3{5D!X4&N3gqp}--zX$q$(Wf1q2#fwm0KgD+z=L;( zfcaO4-(a!x^MSp|eYf3bd#Jm6vvYhZEj9{L1eA>Ah)Bkn{;}r}WlQPR-F2x0y_fH$ zzJzKM*(Jlk+2(`$-S6^)d+b-ea;0;O*mK=c50PKczWq)Z@sCO`0ZKUEeu|a4$fc&< zR9uLNl9s=}-l^fx#?jIN6x4C9-KrXxhlA`JixYPxKUJXLViK`P$=%=&{Dg6_Z4 zBSAy4clNEiZK>Ls^e{0c`I==pfp4vZ-Y8L$J|>zHAIh z(Vz92-RV(~HeR|h&2nX829#I;^F;f`>T%&OYL!cyp8o7j4BOJ~PQ!Er-vcVPmzM%6 zIUgps$ppWZ&K3^Vu!l;!%($dK0IgM3%eNS*J^_B$>%IjH-IeM_+fY&i9C5Eg-yGm& zN~ZuH^*s2(`r7thIM~C6#hKE`pYNlg*L^St z!bIYB&DX|R*6)rs&mt^xgO!m%AM&S@EeMe-d4gqWzWT~j6<}v%Z+WMU# ziuTBk;aZ#$rHAv9t__3NNCi3nN zR*>&dfyY-E?^r7RliOK)5c9^B%*?u z_&?i=hQswP`JgQi|D@0!DtW{BfTF0M1WI0v^wLd{ zVqjoWn=CEWjwO-#{e7SRuIbm;nDVEyBd`q(&4D_IWPb>3HR1E4pu&F;3BB^CB$kLy z8K)dJ&MY-W;cnj}2Nb#UUg5by_SIK4jpA2{zeZDK*P%2#z7|M6&gcMufq5T$UQcFA zifVhDSO;YDo3HnZa8w?}llj-9zv1MFbE*nEYxM}6Xwg2J)&gcC-zjKmHHuVu#as`G zb|1dDqrJa6!L$=_|3&Ah&Yznhsoxgb+iNjyX zcxf=U$P--WG>#Mx0_&cC7v8Rx8`Y`7F^D>UO1*psN7qo(rn^~?Agt9*F!HiO%OwzKS4!A4$%Gb`o!0pqroS*X=@=zlExle5*Z)xWnn_O zOo^&I7WuQ{(n(SVC7NH=^K9_1O1TCA0A|IOsj#Qo)*AGSYs)~$XNA@PKtoR690%2)&l~;!i->N%SkAOdIdH>8Efs-GojFQtwxGO87fHKq+bF zyq4w%$kL&yZXF$H>KC?xx7@)Z{ip7biQpUFSQ`}b`=uM+54k$ug|7A0M(O-p#>_|F zQ)S8K$&l-Qi8@|s!v>(1AN^E>_Zsx*t3!yRs`XI$$Ore)BI~=hiUX4J^zW$2Bx%~z zD7~@zG7apw&#?eSs`^;bTIe!$z40c;Drg1qB|^EC=r{qps%SX6Dwtq|PeJ=F2j1cw z%^7Qk)*2hXI>{LHCT=`uDS)9?Ql++K5`}aeKxLvu04w=v!kUmuu)*a(R4?c=e4>JR z+1Uk%DKh0&in3&duGz^_s-mY?{^nWk&Qo3hMuLgkAsbJJfc?0@xs_Z3YvzZfEITPk zt=2$XpATy6(CY;uyZh1&R$JZMC@%kqk=6f53Lj{5{DpfRqnAbweEk_)2C}I&dNSDry{9}2P3{?V;-3tH1 zQm8`TN~Hba7hHp;qT`Qd#=&cM#apx_soWkLczQx+tXLd%-3IzF1K`0Kvi+ck5bHMV?>1V2Y4F0T~|Qyds(98!=|P$GsT zeuzN)#+E8msxDC41)E6TjZy}$KN;70^_S;f2nqqdBc>}s1XDxi9?Tdo>L&2=_4vH< z+riMOne2efUlu8)-8%FkTepN-WVTL?Iuj~sq@UY zms(QS7R#I}V)~vZ7~^cPAtg~NE&HO(D_no1ZJNBX0C81>t*$xe3U5I9xr0loLk2<@ z>*ELVSZDxxm#dgPhLTh^b<2(UKYBj2>~JEDJj8Wt#L0ePqxsufY3ON?k&+e47Uct}4yR-Mm*NDoCBRRD0R#;T8*}@NrxS-u`pwcjrlfwm6 zGRH6v#J?r#p zm{faB(wd~z%bx@f{3HL^^sjX&iJYpsa{(L7k2d<|`DM+Xl-13{Sy(xQg~hOu&2wQs<4OA z0qdJt7Dv$NB3;`QuZPViYkBb{1-bnL(#iH?R-J5~ZxSl{y1EZMb)(TuiRHDGZkOlo z+d!^Syg>pk#N?QxCHE71%TY|qH#Ko>Y<6jRa$fzFK6S^~Pu}MXl}skJA9Yz^j7VI$EU=cvr(<6 zG8$4jS?^QikxvW$rV@Z}HEsiMZGc`MX)@TAgAjQ$* zv~14cD4ZxH+<7r0DKDJ0yf^)R&Unx8{`*3h7D5NM%u&ch0onEm<7fpC1X=NMj-xD1 zD(YH8E^cFi`Ea8tP^}qJg*;XJH^jA_yKWsl`P;|2#dqpE1Ymr6rYC?+y+1v}jtiUj zd_nMF+4zyG)ci#Z0VaO6h(3BvsT#sg^n)sFbfeXmC|W*eO*Zd_@8#X6$ftTe&vPTK zo~ou6#}@=}F>4m(^kE0aNMZk<6?s-vcfSLUa`R_R59~9PSZhb*kc^eP%dX zO!;x^AEL&!UAS!6iHGr0%MKIkH1(AHLRm%w9!`|DRnpo{Qs(w~j?*G0?12LlsWxe) zFTRQ1#6m+;nT<+{r%(ywy@TTs8(2B_DRGMMI!0f*%7dzQI~jeQ4^9*gKbm}qh37fS z!gy#Ftu(!MFL%ULs=>{9at0D3Q;g2_>+s$J{Yc3Fc3_%Oqdaq|)_Hl~FJ>AKz`wJ< zY&Gbw*tS{GZ7tQ}`ydmV&v3GXrkm$R*H&j7hnnHJ_Kl%2Wxt<+cy!k&$XCs`)41qIU&>j+q(><`yXg7=pRrb` zIZ{;>9u;ghu;?c}3=nP=AtNJod)#gAy4H@4a>haOq!I;m>^oOiSHtuQ^$>FJ)-nYi zLXU8Lu>xNMN}_@w)n?BrXXikFkJ-ar3K&3cAjQci8RmU1ZDXa*aMXLP*uyJL_l-j8 z8;+B%>Hz*M`+qJiGR$59K%mk)Pww7bLc>b3YooAF4qfrvo$zT%W4KkIz2msc^-JR^ zsv6L>Npcp0@`CM%IjrzJa`gk)q8LRRb68Vd#VQxzX0 z&J>R)sjpYV4`eG!q1Wihr-hAF?c2-3cQ&z*K4wTU_qJ@exr7ZHL7*)BPX=gySBvO~ z9|LqG{pvSGjY)#+Rx_YR-cAt*vuCvTQBCF;`1hJ@ZYWD~46&%+dZ4#Y@0XX+sI<{& z#ZP`eTI`o4e}Qy~Wo^!|Jjib#0qynrnDRw^tto9_&+&X#?`VRC`$0sGZ3v-Yp+<04 zTCf3o8S6^UV?9WR9U1t1LOhswX6@@s5GiUwqXG~A*p;S&qqb4XFI^-E-`VL~oH-pU zy_|A22lD?e^EaD$p?(hGzFqN+RaAHzK?c9V@9$`*eiPr>cM-mh*y zdArTFrA05U>myJUk>$j?C{q%cGum43I8vvd1tP%MQWgUJwKk%Qpu`dO8nR_kRf+Cs zPXF?XE_3+Q;*zg&aa2)7!=EHOmuaDSDR?eW-VTTA_U75m@!yk}1dH|4a!e*%v@4Gr zMzJ57Hw+bMd#V%55Z;dJZ*0F2%ba)F{n{K9^z#FpW@x?@9>d61HB%S7C>8=>kc~++ z4k0j`&HjEntHnEdpJZJ#QCeXvsaYrBkYnjJTb|x6bF^jCdNq=UM24E_yI9A#QF8VM z?r2m;-+f`@OjRX?d_Ld3krVfK4OAVPa)`PUEMp~t^pVJ?e#Kp-Y5@n}rfAV(#$>Wv zk1KGJ@Bkx44#W#HSXW*iAB@A>OhgDA*FuxEpFN7E3Z|Xk;(V`Js|uUnv(-Q;s%x+ZGp7f9{xXq z101}M+abEuAlcz){5%6$8nvLli+K*WrI-n7BSP9iA%T0oa3r?YxQ!Rl-)tT|NW?uK z)!uKMU&E+??+7H>t6K$T;tqsgOR}H_4wszeKGhvLsc?WmwR;lH0m9J$eBH$Z^*r=+N*e>-rjh=RRPx)89G8@A9@lIUTB=|pNoCil+ zFlM@;76)bQUr#`S%j7YcK~%cOpv&QUNc1NFAim?of*)wYP9#S{W>m|D7qnnoY1-3Q z75mCAgap4~Fj3Yc)r%8f4I=pEFR>U{G5iKW9a;w%|HKN zH&sX~D47a5MHL|XtCZew<0GE4+q`H={g`$jSc;5 zccvfR(Zp1|ELP^FP!-lFE&hH<9d*w~V$8Nbl()#UBjyY5jwWTa`4}qpncuR9JWs>! z%b?tMP2-$Vn0WCa$X5Ed`A3YRufw-~U^c42XY8RqH zTKwwmDjT0xW+bBV$>I3XcAa%oTlCWUw6l3voy^~n}pFFVQbF#|ZG;4>kicFwA>)tuWe4n4 zsyBe%KMIjezK7tx$L--W4K)SBoM2;p^^vXwgdpKtGRD%FemkU=o={g;@`>?Bw`+J9 z9t8`rpST?PM$vx|njGf{%x=6D*%fwn#`c(xA2h?dMuU9w7peuS(0qUk}n8 zHIqI6NQmx0POH@udYN|ZJ}6yJqCzq@Oe+dVWNpYyF_+~i$n6VHYleA;rCc0EJp zK2TO?D0SkSjpP+nz&&TUS#&_dtL9(S?WH)0241+2Sq{MT@1Mbbnvqo;1N3>xCU%wV zCiDZtGnk(mG(RLE@o|BEPvYgsJD6tr{z8gl#EPuPQA$rit1D+%izmvcQ7f3$M9Tic zbW<%f__0Q-M2Wcc6R`k&ST+hroEto?2QH|BEemsDfw5v=2s@@VN*9vU+qjxX(9UhQ1MYKs=?m$dz+_eJID ziM--}l12`|moLHohT(k=^KE)rj+bf~R#N?Yx$N&&;@{RYuq3UXe82<{i4Be^>7JIq zX%u*goUo4q%k6s}%~7g1W`}}N-vN+3H~-pazSQEdx3gh-sav-didx_VGdO_FuYaVg zZ2oNfjDI83%f>`4YBm+>OfG!EWiW90J_zGZ0ha$-sOxnzRT=ysEuO@hrHA1*x4474 zXqb8ic|RQu9FoUWJOxp=6_3y|N9VoxtBvPJ<*MwJ=MIk0KkWh$UseMH2?74=s@wIt z-S2T7j||yjO+1uBiTB6c+`PYEPI}qXjiv3sT3Y-_usZ+W$$}>n>*IXr_an?KbVR}V z@*pq}g#T~3V6peel}Fs~zbjuF-S-GHJN&c2l5R!?`q5c2;Vl>EO(Kx%n>>4p3& zM2=qCWdB||083Y5Fp9ta`HsN~+kFH|zP+7#`5~}3^xwyb^!#@=1W322GyVXw=h7p0{@PU^eDTpzNCN=92h43 zkLLWTaHQkj`+paEy6pVrRv6Pcgt(XcnWQr&NyEEnVSeI*^>JaxZK3ugiRz>{m}wahNDp9x5sw&m0+9YU!qZ2jC@%*@I>N${&}9C=1Ly~YaCTkV8+ zAuA-!Ot4Toxm$*M?+g)p7MQUe)3Mwx+OXqFN=``Hi^B7zgn2-hZB!#h%r^Sw{e^_F-2O^5S+nm}9LwRFB&2g|lzuu9*JE3(&T{A; zVqg#YA*!;ysi$x^0ig?Ub?&Hog$F&(jB7TyhWeWet&u*;o1o95TxYjlbX|4fPo!hR z@SKomSs=&VGh@`V+4(qd$*##y(|Euc&UdP~^zM8|!Rp8+Ncs$^Wqd(w zt~R{F2hwr_YKPrL7Yvm(YAWeznHdE<<5ZG{Q0>uv^^Sl`7qbe&$~Qc=ZFrCto!^li>Q7z|V zXA};lEFe%k12;LJ-QdQng$p+RN$^!g@%oC{mU?MHzliUA`E;~*Xdu>ekyz!*Ubdul zCU->EQ`M0Cbd42q-*)1rc@8?(aozkHA9*pBKkO$ETzjS}2<0yoH;7C9#d3w@s5bp^ z=XW{Vk$)!F-&qx!8_Bjg+3T1C@F2hQM(@)V;OFVRz-OQx`*U&%^N~S5yA4B&$9;D8 z0wu}UshJKK-=rhwDeqvkM)+WC+b{UqN0#Q=IaW|echiaYL#tjFdT%BXaIHo7bj4O{ zp088oJ1`L`8w~HC0(*i8lkyzMpUodV!dL_u)QW>c|2S8A*JX=~2zLZjP{qiP|;FUULo z54JPK@U!wh>ci+YTPTPR#TLdjgexPNt#VZ9P411L8}YT$O3tmYcWDucWo>%E?YoK7 zN%Mdfqxp-_@;L3qg#4_mWtUIgFd<)`=>T`TvvAO#*`%jRAHN@?K=1cyTnC)mB@NCe z-I|bBhC>2k0**y@q_~@6!LUvpdr#Rk%?~lJ*YucHNz1+kLTdqB!Zs*MQ z9MRwLCn>$rQ2*Azbw$H*GCe+F`H7aOCe_`U+l{|0xVY$1Ue^&D(b|ouX+oUvfO0$e zH1|Y9%LU_X`Uu%L0D#Gae%SxwAX;tEUC%Z8$#M8Fo6x6^nfZr4pG|PdkG`rOj=h+NW#MbM@gN_7gmX!{6(V)vRgRZhanhh9BObMxOx;ndf(4&<53_ z*F-+6gctn{j+&QIn3?GQvg5_K%VC$iPYdnsZEPPzk+K6wU`ZpJXuxeI2;Z3@$%~}Q z#KcF3?>SFfJ5s(}XB46B`L=odX<~q_-(=mQ==9a>Ve5(Ld54-0eSb4?a>{0+#!!{; z2~U^cf@X!qTJG(ekK0FlQ+y(D01?N{^7k9b&zpNZ7TafeX@7`o;VBSmxA9_0&|v5& z@ad$Xv{hy2lk|Rh#tIGIDT7BjbA4tZH~9h^Z4Yb$_;|@TJ)`jfCBDgFH4yG|i!A_9 zYDPcUhx)`GzRTrw*^GIVDA-HWc%I3AZXrvWq_AHa3B2t2CJvU1Qa{wg*|`66eq5^M zcbyy+kC$%GW74xLFRJ@3?%rMZe4}wxLXPl4se{L0#9C`5_8BZG?f@Uh2zGOJ@c^M# zLWK5tzSjhaKDzra=E-)Ii*i42+T^1+*sq*5Id@)l$SbpyjV{-k+DBM~4aYCLtWR#4 z_0UANE2?|0B|pX#bv~qD-1t;lu;O2*R_;fJmvuiIf?&DbKzV2VNzdXV$6Hibfg@Ip zp*DHP4Qi4^dITpNls1i+sxd_(s&)Z-274bV-jZ_q6jA(Dx!Y+_DqrHB8b7!67UdI} z_ERHc?mJwXhs-dpLd{({77iZ`MpN3LqG4JGK4H_mi6fYEuB4Ui`Tp9EN%p7cPsTjq zZFYkgeP3c6H?TvFTRU=Jfj`XD6qUUa;?o~MxX0N_6XV2>0fg68m3X9(yl@yA-%k5e|!QL`-!brO)*Pf zn5lZu*dN2LtuFsC5&+t(zAOg;uSj|E(zJs6`x?u@bsZVeu$PW*^#vC4Q8U|rja z@!WL%x=YvD)4>nodpJ2Q;Sjkzp$Xv+m#%zN?7cME8Q zOT#Mtu-%EK`~5|BMq4`LM5QtD>=o4iLjE)Q`yNX&gFEL_9_yVetk3cfkIm@^VKXF5 zq}6`#&z(u*eV`=5cl)I`fBFy?X97qu2?-BXSc}hBqhFD{qWq?R_6j!Z`0V7ya@=-V zaj0+22T;UWGiHQk;%tpj%2S8sry_688u<+6IM#RPg-_BO-|aqk+VrOcuxlH*8a^&H z=&;nJ)c<+&{A3Y-HA~llq}xU#v`jvx-9O!C$@-)A@H8YUt^7?u^K|AEv6fMM-7DrF zh?=l{o#;{`^Qo7K3&`TX+aTuOi6-U0!4StEg?d8U zW2Fs1X>-fu0L$v*t9cmAr@QpBBQKc2qxnHB_wixPJI!W%<=ZA6!9_90uMK<4= z5dk&yj}y`FDK)hB5qVYeEdq?AmN6M$8>1m)J~A>_+y;B|0{miw_8iz76S?{+(*P1 z=6zevbP-hg!ox80-KXk({a9c6HKHvznzYFAVodXXkwjKRJJW({D|5KuznW zxo(l#^>pw7H$d^1Yu?iE^cNlEKN3RZ-zY4rg?WV5?s^7!pb&ni6HD&CVf{`gSM+Gq zcRx?F&RYh?Qah(|npzjDcUGrA^dU#iMjx+e(-+o5Qn(JnzyAavi^IcV^|eb6x`&F{ z>s1{Nwzks#$spjR2k`#`qfH@5wc5El({D^4c}e%In65+C3< z>yMR2=l){>tv@uiLew_$0$`J?GoPH9BeIF5&r*Ps*mp4O<*&J?LaYMJw&u>WuFI`EjOxS6ux0qlGNE zv&<54$^r$}h+eJ@PWN>I9*5S>PD-K;5<0qysO3?#%uA}H-ab!fkTpA<21Z_qoJw<$ zG)uB9Tn6_2`Hle-(3M+%p<=WVm!pyM6nnZJ@oU$H>edB@Zn#T9_T&TQA9vsCbx+KC z{{GB_&kQ&I$6-4&Q*n0X!?N(wgT=t0<&@T@sO~O3{nG*wHP(E$^P@rN4#4vjth19X zn+VQ)5OpDjLk5VP>84)p?bdVNivAhF>ZC*&wOuN4A{4v|axbPeV-k0VBX6GFD0sB6 z5vnPzyZ~d<4$0l4Tdln>^`*|8<1@bbokZ!8Ir>namd*+fFeHrEFHtXnQBqu$7Rn$i z<%{Q%^MB1YIy1y@kG|kV$1B`>GzFhClw)G#c2@7@hC}V{Z|0zek8F6S-L`99PV!3!YsGqK)3-Of0Oi%(Wyk;(iu=}2W#)%iQJfG}MlV^H=>I+1RF9^Uf9CWdtJBSodSTVc3 z57LLyJXp$A zoZi^4TxT}m6{{Dl<^C*kyA}JRWjddue$3mQQfCb0zIRnlQb}%rQ?|c^Po8L(fGpW5 z%*+^=c)_G3d2Z06(4i2O$I}NA4ksQiH5=4Am;-DA@Xo%s{c|K@uv%6|Vi)WLi`|Aa z?q}Ul-HP_#Qscep;dEM6J0R|GvYg^C-R-MiED8;clXSXPejpN`Qy=A7Z zUK|@EAbfh)S46Mh`1mx;eJ|PCsV-$X=;)KPk*V>dcHxrr-|#U)^JUKAOjc@|Xg9EFPjp z-(w7(J>b1i*TnX>HvtbxX7+2==gCC`d3(t`(E9t4LiBHHTc#yJay=j?LCuf?9 z1GN9*ly;(aU0!-m%fNA0cJ{qNwxG{bsG+>Q_DImq3Wu>urQZ`r8laNo>V4K7;>D7Y z6cdg&!y7P)L!16&J~$e|omEfAcqcwT1Lev~8n|Z_Q%)zEXP-Dp(t9(l-u7I6xjr;E zQ4ExgV=cdPhD}E@{cNn~7vNoxiHJYHm?84m8W3N%sG7aB_6rYrUGYn%%v^&ftw7Q? zcdjD}#g$p8R{Mvy+jvfmfd|f#r*)#km+!%zAEz*zE>r70J#`$S^G0OFIl)%*y-{wU?NX(Oih>t2D*+6m<9q?r^xr3O+d#8)1-!>kX+8^Q-HI~$oB~tL+o{OY zaX6kRB->q(565$|Z7$hY@l+;gB&|Mt6FP^yI505K0YbS52rl z-Ih#}=V;wkA=I2irB8NZ0;sKl{??rpf74QNyq~H|iF8Nm3@uHcTI`#gRJz*nGW)#N zg&XkDZpUWT@t0;IKxq2gG%X8}@OFew3@f-C*-h!Jo&-%CIM=q@+tZy4L6mkzR?gx2 z2;k}^EuAj3_+1CjgCMP>YhRu1(n`L#J`Xt+S2*rj{hr=(ASpJp1CQOD?$dhtEAb$$ zEOUNR{ba|;SZl`C&)n9iGLMw2Js-o_|z!di#tlyIXuM@3Tt6l{H_Ol$2In3pg#VKI6XtU2jeR-hx zkgkli;j(ba8q#>PmUS71@KC7GMtXF*BdoblD%<38+y@0ig>dl~e9o$@NMTI-eeJ5F zIIS+BEnNV><#b%_++zi6WS)26^9>PJsayC?Oaew1{tp|%Ox{KLkM~Ll zGNx_1@^qwl_9{nyrc+w5DkQs3*W;_y@uB+j#0LCV)jMY|J*qbS#oKd%clXZy=w+V@ zYEH|vjo7u~u&ch5WfaG-GR4Fn(~Cn9>yda#ENIaSa)+2W>==uWijd;Euo>(^WOUwS ztx9B~Rj*_{+pJGL4JXz`X}c4XjxDQi9pdl9x@}N%(9c1$C2Q6(0lGhyT|q;Cnuj2f zV6(qT?{YuHBEl#*^ok= z&qXSSi&Ql}!sFeNPZOGc`HGoHy!XI!rPPPMqP0@5cZ|=51Vn)!5Jmk8$}Q=Y1;IV- zML7;=zwU&<2Nv%R8XB)3*uEGLrl!d#a}sLo;z7b%RLaQc%M{gY6w*-q(}7OI*^J`p z?fs14mPPKRB#UtC72Dy$X_Vjy>dE_g4Dq&rCd>Kkn)idPN02#E{WtMSZ`#lJs4AE+ zVCYRb-Q`q@idWLlWJt*0JU7N`sK-%j+{1`KYgNSU4=rtSkNw@mCBdDAb^mCwX(~?V z`#bUxGgRA+UXX34CRyh5t#6XEV%tpI!ZEwul-ttZNsqc=148WP{I8_ov*#cszw7HP zth?ag`E%rNfF!fhyq)WZ?uD>g>(!C>bTPjv(B0R<7jNIQALEF^sN!Xi=i7QyP|QOA z=uyKSztuJdkCHe(QbSqBM1o;1;i`ZuDX>K#Y|!hY3&LO()8|P}(KuYm|`@bysv{qp_GV;v;Y4y{|5b@k*gygD<#!wnoRVCYLo@4R z{GTNni|m4a73=7{^QsDBXq^U&M&iYeI@qmvtotfmZ0ye1WiEk+P!8FwpdQ`rAZ$016-6*OSX0e3hWbM@uAXrQFbM zP}2;lC+}*>E4d6Wz$)3aNq68%E5ReCM@J1ofKR7tlB*Z=;ZbX2w$W!{MnJ$v8qJ=7O?*`Xik%`<3}0rc%98_YT}^q`@O0$WqNB z_anFa?UR)s(HYY3GIa{+i0&I$8Q%NSXSs+-$bIx>|hu4bt7+ zAPv$T14zTrFhj!~zxUqzbLPj1=RC3Z+H0@HN|E8G$!3Kq7ETKH;DP3KtXlFbz7b37DX@2pCHkb9@roV)O?B}SIL7Qbu5XG0cZthE;_08o7YOj~j z8c&CfPJgHlnKA?A{R>M6CJC=*!_H)ZP==qtB?Tbx0E_2(JULPm-2Cy*i+hyHTKe$4 zz_+t@e?z@+?8qzOR7^eAGhzl^w^^ zwPRRIjZk^vNZaNO0%G4PnL@E$0ZOn1!Xy<1n*m>GdPne@CFp5=LBAzh_yS$3t}&iu z!}T!o>suy{;7UY$2Whnv2-*SLrjmlPqHo#()`q<=r?V7_W`)3WM-f^;N9yq23Nxvl z_j`bt+6<1uH@^VhBZa0y#X(wg=?2IOOv+bfWu>!Semf-$Y5!eX(-f04^a}H$J~eH; z{*1PW0RIpUabknpvo_7l%j?-Eg`6R9`8)Gu#G^yzEzCSLT8hN;tb~n#MGouc{_C(o zK;6r1UW{$eBY)Gh3GRBn>le4u+^Fzj0%Ujt7`sv0KE2P1VT6SS&xmD>r-1aY#6M zZKkkl%D}AUy2r!ul|}9p-%mFvwoa4j4%QZ{6Ut+?K%58i18=u5vJ{u`X2;1oB{Jh&1t-i`eeu!rtfUB0$udItqLdBK> z=)_1B+2s7ug6@LMbr)@BlWpDT(9q#Wapm80upf+SbbYk{_>qBtAxZ6P46|_Kpo*H# zP&^}^sYtvFP5!IpTkTgK7QJd#7EYZ?F(-J_h%eOnBgA0~HjB3N#Qk&1100Q-H7rZV zid=7L!kCkpC4E`t(h_59D6U73KdQ*mCIk*;KSIt3w|DZBB9T{BvNF97*8AM`V^hYS zLKU-3J+CX2p|(SR4EgF4Zx{136pN8+|y@dOa^32&RQ7^QDII^Gq?`P|ni9 z&<3Bl>A@1`@yX9fO(|Dz0EB*j>nH-ow7VO8j^?rSMF2gJU&{F%7;P`$y2RA;b-@PU zROoKjAGoGs1IIj=^@JKj%4!GFyNu>)1u1S~J=cQ^%&_y_w>t9IXlQ7hIHo)DKOAE6 zsUMW@@{Kp4Mm(lh6lfTX)zd?&cb!cJ@xP1ojue6mB{`C1wd~Pi{}|mJ=%v@E@G9iH zROg^dV$o<*)?v@fVs0zgzjlIBKGZf<7)eqf2YWS-=Grm_btP`C48yKAd4H5D?Q$nC z7)GEmd2k^qFF3l_)NWZVW9{7vx%X+)bM*F!^ zg{C-}PqYEAduvbj$n1I@rR!ln%K5N|O@{wH=5ROo^Jd5|SpC`P9juB!O%h&WHS1@U zcs6Bd+_RR2yFuY%&f@@ChfNYGd?cAOe*cx?+e!(`;qpv>xu8F7=9_UD5U!)K@vErF z@$p9Kh8YQM17zA(p>D~qJKIJz9CUl(g^Rn~V9yE-hrbiVTvjVRugGl5%9x(K1SDmF zPp=z=e>eo9MpcUE7V5w?uRO88AHO@}=4R9fvNhdaV~{+p2%ehiA>6mgd6U8gvfYw4 zTe)`Cx~q%42F)FUl0TT{2yXmiW&PtSl^=ws>gU=EowD@X(UMduFf+$YP8?K^g!KNPN zL5{G`eC0NyL(+#7G`EMKwHXHLsV%DeXt&5M;Z8Qr(H3Xs_)_bxl@ppZ&R^z%8tM=mGoGV*wHosxqaGh0 z_iukj0uhD3G4cL+5=VZ1-HKz8IMke>C*N#1@IeF+&j0ZCUMX|-OprHM+?eTD4Ry%j zq#f?@^CR$vjELTEJBw$wQGJD_X*Z^JUzMK9gy(R~0x+Ua$Vj>{b(P{=<9)@i?f|OjOT)OL2NbmQ`3)o*g;JSZ) z5~2LIAuN)?!zUr$o0~2w$`&hZw@BD1#U-Pp%Dw-qDeVToA?HU4+A6LXGEBL#G9GNl zVN;2}(?CWCTi;rmQ&BL0&Td|>s@Rfu-|0>$sPSRw-RI00;*92bABI*T)rpuY>8|$0 z9caJ_$kXfn!Ybgxa}^3Yap379n59BM&I_F`@?@k&4rhQy8rJAkgQk3{ma&UulT8nQ zioxX-CvJ>e05h+i;{n!`$dSJvfmiE-{6LHS6IqW<{_7l9NmGOm$DdvWhucmTQyfS> z;*47t_v_d!ntLuQ8Zsxs)25WmmiG_0&N+Cr*?~0Z7$d%b7-iNSIGrjRI>s6`Hoo$I z3_2k5Fl$K-E*>SYG3e36 zd+4x4AMl4wEZduh#zzWNI}ACqmcVXh0IpH$Xq!Vg@NVXE^fY(2faXl8Nv~7j^U9Z9 zg6D5V?ZeLxzfCo(tMJhPsOI1NTdx=fN^AR$XU%Kv=}IEa=YI;RqE=IvSst2lH$47& zE<*0M3Clv*Q?-5FrOEKgiMQyH0O~9#G}d+kk88KNsHdjC%;;S!+LW99t{(@8UN3Lr zYy);X&3bb9ZVZ#r&z_{I!JkyI+l5fthlg$0 zf74CHvX!#r-5+UubRK_4=6`-{>0E58m)J`dxa6P3HX{ul3^j+`7TuWWHXMyR{w=`3i*zWa`e^;j$nd=@{R&zHQ2Twqx44H40 z3~}Zx^&S(3GS&^jxt{!0hRh{OzO1#wy-?Z(S{bOFZ<(!P#23zslwsfRz!tWTeBJkl z8&e%xi$0;4#4YQJYhS&?qRGya3C_;-R{D8iKHPZO4xV#MLZEe(^``m&EBVzVg0)ng ziI|Qh;Tp$}M=(C5wftsd(WycPI1Yd^dSIS%M%OIqI2(bL}oPg51@ars6iE ztzVuc5@BukCr4yLo>WOSw(mb0xO)5l06jRBj6H-lSSp`ywN5&Ven@aX&37mjnX~77 zUp|S8dr7LV?cKRHhEt|rvf(qiSIRodG;zL9*CzJuw;RN0}}Ik|gdsOWDz_n?-5)*O zt|b~ngYqu5^c1un!cD?WEhLc%*WUN2rAwDVk8Ubq{<7`=*pa1grD@1KAHymuGP95{ zH`A18)!ICc6C9_W>6};zRH!3ELU#nARr@gQ(;RbtBS0;$cJh++!yh{eR!#(<-*>v` zoYeg@vYDe1)rdqc@;t*i3)zITd24h)#CHNj>33(VTS_n)i{5ba=g>`p^iOrR=DfGP zN^KOd+l+*iB&rd3R-ODMnJcTGov?g*Qf^nwyhJ~nE0Y8hEuOU-im6ifOm}CazWx0O z8&;Z>3irNj)E%Th*Jz4o#r2YXvb))+NYUOj)ti;o$we;qB{+5S_7`{bxE%wFfUSM< z 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𝔖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

fNm}#RabC4_wWj6oNsNm==J8}?ySJWca6r6 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⪚dP%Mx(#E%7_fCFG$=RLMRy)?x6pHiD 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ÏTu0PuDW{5Kd{utu5!#8{b? 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 V1QzJsJPrU^1VTF?fkFrQ{{V1p doesn't define. */ +-#cmakedefine pid_t ${pid_t} +- +-/* Define intmax_t and uintmax_t if they are not already defined. */ +-#if !defined(HAVE_INTMAX_T) +-typedef int64_t intmax_t; +-#define INTMAX_MIN INT64_MIN +-#define INTMAX_MAX INT64_MAX +-#endif +- +-#if !defined(HAVE_UINTMAX_T) +-typedef uint64_t uintmax_t; +-#endif +diff -Nur c-spiffe_orign/cmake/COPYING-CMAKE-SCRIPTS.txt c-spiffe/cmake/COPYING-CMAKE-SCRIPTS.txt +--- c-spiffe_orign/cmake/COPYING-CMAKE-SCRIPTS.txt 2022-08-29 22:07:28.600000000 +0800 ++++ c-spiffe/cmake/COPYING-CMAKE-SCRIPTS.txt 1970-01-01 08:00:00.000000000 +0800 +@@ -1,22 +0,0 @@ +-Redistribution and use in source and binary forms, with or without +-modification, are permitted provided that the following conditions +-are met: +- +-1. Redistributions of source code must retain the copyright +- notice, this list of conditions and the following disclaimer. +-2. Redistributions in binary form must reproduce the copyright +- notice, this list of conditions and the following disclaimer in the +- documentation and/or other materials provided with the distribution. +-3. The name of the author may not be used to endorse or promote products +- derived from this software without specific prior written permission. +- +-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +diff -Nur c-spiffe_orign/cmake/FindCheck.cmake c-spiffe/cmake/FindCheck.cmake +--- c-spiffe_orign/cmake/FindCheck.cmake 2022-08-29 22:07:28.600000000 +0800 ++++ c-spiffe/cmake/FindCheck.cmake 1970-01-01 08:00:00.000000000 +0800 +@@ -1,57 +0,0 @@ +-# - Try to find the CHECK libraries +-# Once done this will define +-# +-# CHECK_FOUND - system has check +-# CHECK_INCLUDE_DIR - the check include directory +-# CHECK_LIBRARIES - check library +-# +-# This configuration file for finding libcheck is originally from +-# the opensync project. The originally was downloaded from here: +-# opensync.org/browser/branches/3rd-party-cmake-modules/modules/FindCheck.cmake +-# +-# Copyright (c) 2007 Daniel Gollub +-# Copyright (c) 2007 Bjoern Ricks +-# +-# Redistribution and use is allowed according to the terms of the New +-# BSD license. +-# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +- +- +-INCLUDE( FindPkgConfig ) +- +-# Take care about check.pc settings +-PKG_SEARCH_MODULE( CHECK Check ) +- +-# Look for CHECK include dir and libraries +-IF( NOT CHECK_FOUND ) +- IF ( CHECK_INSTALL_DIR ) +- MESSAGE ( STATUS "Using override CHECK_INSTALL_DIR to find Check" ) +- SET ( CHECK_INCLUDE_DIR "${CHECK_INSTALL_DIR}/include" ) +- SET ( CHECK_INCLUDE_DIRS "${CHECK_INCLUDE_DIR}" ) +- FIND_LIBRARY( CHECK_LIBRARY NAMES check PATHS "${CHECK_INSTALL_DIR}/lib" ) +- FIND_LIBRARY( COMPAT_LIBRARY NAMES compat PATHS "${CHECK_INSTALL_DIR}/lib" ) +- SET ( CHECK_LIBRARIES "${CHECK_LIBRARY}" "${COMPAT_LIBRARY}" ) +- ELSE ( CHECK_INSTALL_DIR ) +- FIND_PATH( CHECK_INCLUDE_DIR check.h ) +- FIND_LIBRARY( CHECK_LIBRARIES NAMES check ) +- ENDIF ( CHECK_INSTALL_DIR ) +- +- IF ( CHECK_INCLUDE_DIR AND CHECK_LIBRARIES ) +- SET( CHECK_FOUND 1 ) +- IF ( NOT Check_FIND_QUIETLY ) +- MESSAGE ( STATUS "Found CHECK: ${CHECK_LIBRARIES}" ) +- ENDIF ( NOT Check_FIND_QUIETLY ) +- ELSE ( CHECK_INCLUDE_DIR AND CHECK_LIBRARIES ) +- IF ( Check_FIND_REQUIRED ) +- MESSAGE( FATAL_ERROR "Could NOT find CHECK" ) +- ELSE ( Check_FIND_REQUIRED ) +- IF ( NOT Check_FIND_QUIETLY ) +- MESSAGE( STATUS "Could NOT find CHECK" ) +- ENDIF ( NOT Check_FIND_QUIETLY ) +- ENDIF ( Check_FIND_REQUIRED ) +- ENDIF ( CHECK_INCLUDE_DIR AND CHECK_LIBRARIES ) +-ENDIF( NOT CHECK_FOUND ) +- +-# Hide advanced variables from CMake GUIs +-MARK_AS_ADVANCED( CHECK_INCLUDE_DIR CHECK_LIBRARIES ) +- +diff -Nur c-spiffe_orign/CMakeLists.txt c-spiffe/CMakeLists.txt +--- c-spiffe_orign/CMakeLists.txt 2022-08-29 22:07:28.596000000 +0800 ++++ c-spiffe/CMakeLists.txt 2022-08-29 21:33:28.000000000 +0800 +@@ -28,33 +28,10 @@ + set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + + set(CMAKE_CXX_STANDARD 14) +-set(protobuf_MODULE_COMPATIBLE TRUE) + +-find_package(Protobuf 3.13.0 REQUIRED) +-find_package(gRPC 1.34.0 REQUIRED) + +-message(STATUS "Using protobuf ${Protobuf_VERSION}") ++include(common.cmake) + +-set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) +-set(_REFLECTION gRPC::grpc++_reflection) +- +-if(CMAKE_CROSSCOMPILING) +- find_program(_PROTOBUF_PROTOC protoc) +-else() +- set(_PROTOBUF_PROTOC $) +-endif() +- +-# Find gRPC installation +-# Looks for gRPCConfig.cmake file installed by gRPC's cmake installation. +-find_package(gRPC CONFIG REQUIRED) +-message(STATUS "Using gRPC ${gRPC_VERSION}") +- +-set(_GRPC_GRPCPP gRPC::grpc++) +-if(CMAKE_CROSSCOMPILING) +- find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) +-else() +- set(_GRPC_CPP_PLUGIN_EXECUTABLE $) +-endif() + + # Enable Coverage Tests + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage -g -O0") +diff -Nur c-spiffe_orign/common.cmake c-spiffe/common.cmake +--- c-spiffe_orign/common.cmake 1970-01-01 08:00:00.000000000 +0800 ++++ c-spiffe/common.cmake 2022-08-29 21:33:28.000000000 +0800 +@@ -0,0 +1,129 @@ ++# Copyright 2018 gRPC authors. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# ++# cmake build file for C++ route_guide example. ++# Assumes protobuf and gRPC have been installed using cmake. ++# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build ++# that automatically builds all the dependencies before building route_guide. ++ ++cmake_minimum_required(VERSION 3.5.1) ++ ++# set (CMAKE_CXX_STANDARD 11) ++set (CMAKE_CXX_STANDARD 14) ++ ++set (GRPC_FETCHCONTENT 1) ++ ++ ++if(MSVC) ++ add_definitions(-D_WIN32_WINNT=0x600) ++endif() ++ ++find_package(Threads REQUIRED) ++ ++if(GRPC_AS_SUBMODULE) ++ # One way to build a projects that uses gRPC is to just include the ++ # entire gRPC project tree via "add_subdirectory". ++ # This approach is very simple to use, but the are some potential ++ # disadvantages: ++ # * it includes gRPC's CMakeLists.txt directly into your build script ++ # without and that can make gRPC's internal setting interfere with your ++ # own build. ++ # * depending on what's installed on your system, the contents of submodules ++ # in gRPC's third_party/* might need to be available (and there might be ++ # additional prerequisites required to build them). Consider using ++ # the gRPC_*_PROVIDER options to fine-tune the expected behavior. ++ # ++ # A more robust approach to add dependency on gRPC is using ++ # cmake's ExternalProject_Add (see cmake_externalproject/CMakeLists.txt). ++ ++ # Include the gRPC's cmake build (normally grpc source code would live ++ # in a git submodule called "third_party/grpc", but this example lives in ++ # the same repository as gRPC sources, so we just look a few directories up) ++ add_subdirectory(../../.. ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL) ++ message(STATUS "Using gRPC via add_subdirectory.") ++ ++ # After using add_subdirectory, we can now use the grpc targets directly from ++ # this build. ++ set(_PROTOBUF_LIBPROTOBUF libprotobuf) ++ set(_REFLECTION grpc++_reflection) ++ if(CMAKE_CROSSCOMPILING) ++ find_program(_PROTOBUF_PROTOC protoc) ++ else() ++ set(_PROTOBUF_PROTOC $) ++ endif() ++ set(_GRPC_GRPCPP grpc++) ++ if(CMAKE_CROSSCOMPILING) ++ find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) ++ else() ++ set(_GRPC_CPP_PLUGIN_EXECUTABLE $) ++ endif() ++elseif(GRPC_FETCHCONTENT) ++ # Another way is to use CMake's FetchContent module to clone gRPC at ++ # configure time. This makes gRPC's source code available to your project, ++ # similar to a git submodule. ++ message(STATUS "Using gRPC via add_subdirectory (FetchContent).") ++ include(FetchContent) ++ FetchContent_Declare( ++ grpc ++ GIT_REPOSITORY https://github.com/grpc/grpc.git ++ # when using gRPC, you will actually set this to an existing tag, such as ++ # v1.25.0, v1.26.0 etc.. ++ # For the purpose of testing, we override the tag used to the commit ++ # that's currently under test. ++ # GIT_TAG vGRPC_TAG_VERSION_OF_YOUR_CHOICE) ++ GIT_TAG v1.48.0 ++ ) ++ FetchContent_MakeAvailable(grpc) ++ ++ # Since FetchContent uses add_subdirectory under the hood, we can use ++ # the grpc targets directly from this build. ++ set(_PROTOBUF_LIBPROTOBUF libprotobuf) ++ set(_REFLECTION grpc++_reflection) ++ set(_PROTOBUF_PROTOC $) ++ set(_GRPC_GRPCPP grpc++) ++ if(CMAKE_CROSSCOMPILING) ++ find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) ++ else() ++ set(_GRPC_CPP_PLUGIN_EXECUTABLE $) ++ endif() ++else() ++ # This branch assumes that gRPC and all its dependencies are already installed ++ # on this system, so they can be located by find_package(). ++ ++ # Find Protobuf installation ++ # Looks for protobuf-config.cmake file installed by Protobuf's cmake installation. ++ set(protobuf_MODULE_COMPATIBLE TRUE) ++ find_package(Protobuf CONFIG REQUIRED) ++ message(STATUS "Using protobuf ${Protobuf_VERSION}") ++ ++ set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) ++ set(_REFLECTION gRPC::grpc++_reflection) ++ if(CMAKE_CROSSCOMPILING) ++ find_program(_PROTOBUF_PROTOC protoc) ++ else() ++ set(_PROTOBUF_PROTOC $) ++ endif() ++ ++ # Find gRPC installation ++ # Looks for gRPCConfig.cmake file installed by gRPC's cmake installation. ++ find_package(gRPC CONFIG REQUIRED) ++ message(STATUS "Using gRPC ${gRPC_VERSION}") ++ ++ set(_GRPC_GRPCPP gRPC::grpc++) ++ if(CMAKE_CROSSCOMPILING) ++ find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) ++ else() ++ set(_GRPC_CPP_PLUGIN_EXECUTABLE $) ++ endif() ++endif() +diff -Nur c-spiffe_orign/protos/google/protobuf/struct.proto c-spiffe/protos/google/protobuf/struct.proto +--- c-spiffe_orign/protos/google/protobuf/struct.proto 1970-01-01 08:00:00.000000000 +0800 ++++ c-spiffe/protos/google/protobuf/struct.proto 2022-08-29 21:33:28.000000000 +0800 +@@ -0,0 +1,95 @@ ++// Protocol Buffers - Google's data interchange format ++// Copyright 2008 Google Inc. All rights reserved. ++// https://developers.google.com/protocol-buffers/ ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++syntax = "proto3"; ++ ++package google.protobuf; ++ ++option csharp_namespace = "Google.Protobuf.WellKnownTypes"; ++option cc_enable_arenas = true; ++option go_package = "google.golang.org/protobuf/types/known/structpb"; ++option java_package = "com.google.protobuf"; ++option java_outer_classname = "StructProto"; ++option java_multiple_files = true; ++option objc_class_prefix = "GPB"; ++ ++// `Struct` represents a structured data value, consisting of fields ++// which map to dynamically typed values. In some languages, `Struct` ++// might be supported by a native representation. For example, in ++// scripting languages like JS a struct is represented as an ++// object. The details of that representation are described together ++// with the proto support for the language. ++// ++// The JSON representation for `Struct` is JSON object. ++message Struct { ++ // Unordered map of dynamically typed values. ++ map fields = 1; ++} ++ ++// `Value` represents a dynamically typed value which can be either ++// null, a number, a string, a boolean, a recursive struct value, or a ++// list of values. A producer of value is expected to set one of these ++// variants. Absence of any variant indicates an error. ++// ++// The JSON representation for `Value` is JSON value. ++message Value { ++ // The kind of value. ++ oneof kind { ++ // Represents a null value. ++ NullValue null_value = 1; ++ // Represents a double value. ++ double number_value = 2; ++ // Represents a string value. ++ string string_value = 3; ++ // Represents a boolean value. ++ bool bool_value = 4; ++ // Represents a structured value. ++ Struct struct_value = 5; ++ // Represents a repeated `Value`. ++ ListValue list_value = 6; ++ } ++} ++ ++// `NullValue` is a singleton enumeration to represent the null value for the ++// `Value` type union. ++// ++// The JSON representation for `NullValue` is JSON `null`. ++enum NullValue { ++ // Null value. ++ NULL_VALUE = 0; ++} ++ ++// `ListValue` is a wrapper around a repeated field of values. ++// ++// The JSON representation for `ListValue` is JSON array. ++message ListValue { ++ // Repeated field of dynamically typed values. ++ repeated Value values = 1; ++} +diff -Nur c-spiffe_orign/spiffetls/CMakeLists.txt c-spiffe/spiffetls/CMakeLists.txt +--- c-spiffe_orign/spiffetls/CMakeLists.txt 2022-08-29 22:07:28.628000000 +0800 ++++ c-spiffe/spiffetls/CMakeLists.txt 2022-08-29 21:33:28.000000000 +0800 +@@ -49,7 +49,7 @@ + + target_link_libraries(${TARGET_NAME} + svid +- ssl ++ # ssl + spiffeid + internal + bundle +@@ -61,7 +61,10 @@ + rt + m + pthread +- crypto) ++ # crypto ++ libcrypto.so ++ libssl.so ++ ) + + # Install Headers: + set(HEADERS_SPIFFETLS +diff -Nur c-spiffe_orign/svid/jwtsvid/parse.c c-spiffe/svid/jwtsvid/parse.c +--- c-spiffe_orign/svid/jwtsvid/parse.c 2022-08-29 22:07:28.632000000 +0800 ++++ c-spiffe/svid/jwtsvid/parse.c 2022-08-29 21:33:28.000000000 +0800 +@@ -85,6 +85,17 @@ + payload_str_len, 0, NULL); + + char *signature = strtok(NULL, dot); ++ ////////////////////////////////////////////////////////////////////// ++ // fjyu@whu.edu.cn debug 2022.07.08 ++ if (signature == NULL) { ++ printf("%s %d: parsed signature is null \n", __FILE__, __LINE__); ++ jwtsvid_JWT_Free(jwt); ++ *err = ERR_PARSING; ++ return NULL; ++ } else { ++ // printf("%s %d: parsed signature is %s \n", __FILE__, __LINE__, signature); ++ } ++ ////////////////////////////////////////////////////////////////////// + signature[-1] = '.'; + jwt->signature = string_new(signature); + free(header_str); +diff -Nur c-spiffe_orign/workload/client.cc c-spiffe/workload/client.cc +--- c-spiffe_orign/workload/client.cc 2022-08-29 22:07:28.636000000 +0800 ++++ c-spiffe/workload/client.cc 2022-08-29 21:33:28.000000000 +0800 +@@ -244,6 +244,7 @@ + return NO_ERROR; + } + ++ + err_t workloadapi_Client_Connect(workloadapi_Client *client) + { + if(!client) { +@@ -252,7 +253,7 @@ + // if client already has a stub, we don't create a new one. + if(!client->stub) { + std::shared_ptr chan = grpc::CreateChannel( +- client->address, grpc::InsecureChannelCredentials()); ++ client->address, grpc::InsecureChannelCredentials()); + if(!chan) { + return ERR_NULL; + } +@@ -737,7 +738,13 @@ + char *token, char *audience, + err_t *err) + { +- grpc::ClientContext ctx; ++ // grpc::ClientContext ctx; ++ grpc::ClientContext *ctx = new grpc::ClientContext(); ++ ++ if(client->headers) { ++ for(int i = 0; i < arrlen(client->headers); i += 2) ++ ctx->AddMetadata(client->headers[i], client->headers[i + 1]); ++ } + + ValidateJWTSVIDRequest req; + req.set_svid(token); +@@ -745,9 +752,10 @@ + + ValidateJWTSVIDResponse resp; + grpc::Status status = ((SpiffeWorkloadAPI::StubInterface *) client->stub) +- ->ValidateJWTSVID(&ctx, req, &resp); +- ++ ->ValidateJWTSVID(ctx, req, &resp); ++ // ->ValidateJWTSVID(&ctx, req, &resp); + if(status.ok()) { ++ // printf("%s %d: workloadapi_Client_ValidateJWTSVID, status ok \n", __FILE__, __LINE__); + // parse response + string_arr_t audiences_array = NULL; + arrput(audiences_array, audience); +@@ -757,6 +765,7 @@ + + return svid; + } else { ++ // printf("%s %d: workloadapi_Client_ValidateJWTSVID, err = %d \n", __FILE__, __LINE__, (int)ERR_BAD_REQUEST); + // could not validate jwt svid + *err = ERR_BAD_REQUEST; + return NULL; +diff -Nur c-spiffe_orign/workload/CMakeLists.txt c-spiffe/workload/CMakeLists.txt +--- c-spiffe_orign/workload/CMakeLists.txt 2022-08-29 22:07:28.636000000 +0800 ++++ c-spiffe/workload/CMakeLists.txt 2022-08-29 21:33:28.000000000 +0800 +@@ -70,7 +70,9 @@ + rt + m + pthread +-crypto) ++# crypto ++libcrypto.so ++) + + + # Install Headers: diff --git a/cc-resource-pooling/teeproxy/gpproxy/CMakeLists.txt b/cc-resource-pooling/teeproxy/gpproxy/CMakeLists.txt new file mode 100644 index 0000000..2b333c5 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/CMakeLists.txt @@ -0,0 +1,107 @@ +# +# + +cmake_minimum_required(VERSION 3.5.1) + +project(gpp C CXX) + +include(common.cmake) + +# Proto file +get_filename_component(gt_proto "./protos/gt.proto" ABSOLUTE) +get_filename_component(gt_proto_path "${gt_proto}" PATH) +# [[get_filename_component(proto "../protos/${proto_name}.proto" ABSOLUTE) +# get_filename_component(proto_dir "${proto}" DIRECTORY)]] + +# Generated sources +set(gt_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/gt.pb.cc") +set(gt_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/gt.pb.h") +set(gt_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/gt.grpc.pb.cc") +set(gt_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/gt.grpc.pb.h") + +add_custom_command( + OUTPUT "${gt_proto_srcs}" "${gt_proto_hdrs}" "${gt_grpc_srcs}" "${gt_grpc_hdrs}" + COMMAND ${_PROTOBUF_PROTOC} + ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}" + --cpp_out "${CMAKE_CURRENT_BINARY_DIR}" + -I "${gt_proto_path}" + --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" + "${gt_proto}" + DEPENDS "${gt_proto}" +) + +# Include generated *.pb.h files +include_directories("${CMAKE_CURRENT_BINARY_DIR}") +include_directories(/usr/include/dbus-1.0/) +include_directories(/usr/lib64/dbus-1.0/include/) +include_directories(${CMAKE_CURRENT_BINARY_DIR}/../include) + +# Introduce variables: +# - CMAKE_INSTALL_LIBDIR +# - CMAKE_INSTALL_BINDIR +# - CMAKE_INSTALL_INCLUDEDIR +include(GNUInstallDirs) + +# gt_grpc_proto +add_library(gt_grpc_proto + ${gt_grpc_srcs} + ${gt_grpc_hdrs} + ${gt_proto_srcs} + ${gt_proto_hdrs} +) +target_link_libraries(gt_grpc_proto + ${_REFLECTION} + ${_GRPC_GRPCPP} + ${_PROTOBUF_LIBPROTOBUF} +) + + +add_executable(gpproxy + "gpproxy.cc" + ${gt_grpc_srcs} + ${gt_proto_srcs} +) +target_link_libraries(gpproxy + gt_grpc_proto + ${_REFLECTION} + ${_GRPC_GRPCPP} + ${_PROTOBUF_LIBPROTOBUF} + libdbusc_gpw.so + libdbusc_jwt.so + yaml-cpp.a +) + +# Install bin +install( + TARGETS gpproxy + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" +) +# Install config file +set(gpp_config_dir "$ENV{HOME}/.gpp") +install( + FILES "conf/gpproxy_config.yaml" + DESTINATION ${gpp_config_dir} +) +# Install certs +set(gpp_certs_dir "$ENV{HOME}/.gpp/certs") +install( + FILES + "certs/server_key.pem" + "certs/server_crt.pem" + "certs/ca_key.pem" + "certs/ca_crt.pem" + "certs/gen_ca_keycrt.sh" + "certs/gen_server_keycrt.sh" + "certs/gen_client_keycsr.sh" + "certs/msg.txt" + "certs/check_ca_key.sh" + "certs/check_ca_crt.sh" + "certs/check_server_key.sh" + "certs/check_server_crt.sh" + "certs/check_client_key.sh" + "certs/check_client_crt.sh" + "certs/gen_ca_crt.sh" + "certs/gen_server_crt.sh" + "certs/gen_client_crt.sh" + DESTINATION ${gpp_certs_dir} +) diff --git a/cc-resource-pooling/teeproxy/gpproxy/build/cmake.sh b/cc-resource-pooling/teeproxy/gpproxy/build/cmake.sh new file mode 100644 index 0000000..4511f00 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/build/cmake.sh @@ -0,0 +1,3 @@ +# cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR .. +cmake -DCMAKE_BUILD_TYPE=Debug .. + diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/ca_crt.pem b/cc-resource-pooling/teeproxy/gpproxy/certs/ca_crt.pem new file mode 100644 index 0000000..c1f851a --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/ca_crt.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDozCCAougAwIBAgIUZoRrQX6TrtP0Reyf9DbHVJRNDoQwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBUh1YmVpMQ4wDAYDVQQHDAVXdWhh +bjESMBAGA1UECgwJVHJ1c3RDdXRlMQ0wCwYDVQQLDARnUlBDMQ8wDQYDVQQDDAZj +YS5vcmcwHhcNMjIwODIwMDQ1OTUyWhcNMzIwODE3MDQ1OTUyWjBhMQswCQYDVQQG +EwJDTjEOMAwGA1UECAwFSHViZWkxDjAMBgNVBAcMBVd1aGFuMRIwEAYDVQQKDAlU +cnVzdEN1dGUxDTALBgNVBAsMBGdSUEMxDzANBgNVBAMMBmNhLm9yZzCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMYdYD9GChLzSOWmaIcHMqx8itp/7Zvx +7y2qgb23EWCWIz01kPQaCXpuSOi38dFipXFBWo5o3GaezIoSCp66eN3kHGpcluu2 +0nbyh7zdUVCSXhNWbEiwlhC53DDs2SBYWr2KGTRDEcJEXli110v8sEGZQvkj3XGF +B6IbTczMbhpVfJ82RMqGqNYSJ5jCvqw3XOX6xoN4CP3PuAKC6MtEkLLkXQOS72oL +TSE9XoZNqlyhmymAVwQwCV1zT28W/hwKbCN4tVoO+1bwc3togNYO0W7x1GgOoNoZ +va1UNDX1sfW6B041TgSTGQ0OhGzgKWadKHm2UpG2d5NLkaiBUPpvuokCAwEAAaNT +MFEwHQYDVR0OBBYEFKrFU5qoBe2AkvvTiOfwY24T36zTMB8GA1UdIwQYMBaAFKrF +U5qoBe2AkvvTiOfwY24T36zTMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACjfqOa6G596NbFfAAhBFFS+RIueRWdDkBxR7kk+eQ3Z5j4hIBmrA0OS +R6KCrvmvnXxqSBRmuwRfs0e7G76jkUAFFHkslTPLwgklWCarsGXeAkrdgQU7WL4n +NYBNnjUNK11JREUdAXgvzyuLOhjf4l5UvhujWivhviChFB8xpTQfq2d1oE9jsotv +r2opic4ynu69LXd8HZiShabXgQ60/BNOX8D+wb1YzoZlUCKzSH15QRuuEbkj4/Hy +R2+qxUODbuwfqI4fkOvQIIrD2NO89nHpWFtui4ByQEQaeTesus8M8corCekrxr08 +VkxuOGg2U3zWUlLuSZMD2G7KWuDXU78= +-----END CERTIFICATE----- diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/ca_key.pem b/cc-resource-pooling/teeproxy/gpproxy/certs/ca_key.pem new file mode 100644 index 0000000..8a1fb51 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/ca_key.pem @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-192-CBC,39D9C0B289197FF4451BD03C066C8895 + +HZGExFo0mzCidPeXEb1DWkawC2XnTOZfZoHw7+aZGdTXnnbK8x72UuX7CgfyqVrQ +nVgGHJioD/0TpwhhRhgFCs8xPPVmKWIHssgXKz1ZzSHwQSamby/1aGq1bJtVY7VL +qAgUjkMVClErKIiR4ZAAC/Z95BW3ap/K9GmagAFdcGlaiLyXImS/gC3KRxkTZLNn +5Zfq7+XwBp3tWDjM6SLHvYtvsALs2+g8bJUXZFA9OvRZogPnL9EEaTfrjlYBuN2z +0lf2NSQhuAxPN/Qo80l7u6wKIojM+OnWZITbiMit/QmYAEa6znJbt9EWNEYdnIXr +P1NP0zU9ycBDFELNJwZcEUj+Ua9BxPwN01NgBBbPDuFikpyojzcNzm++ZG/uFc5s +LuSYm3lLuhsENVAXx7iwBTBAAWbQxYf8XOP3Nnhj83K/hgL5rfIKMkaFC2+FMvfo +SnIWitAImbn0IB9XncdRkJ9BTOLks/2VOWuVPknNCEGcNEJuL5p/FWCBHQa0eqeT +a84FdLXhN9wSjPaskb8gk+QDSh0L0bTByJC584u2P4Wwb/aJNPzicBBJWVc2DObL +OUYfad1NOvl7uXoe8vRsdYGQOtcUYjfw82MB1855JsuFj7CQwp+ZnO2tu7crnf0Q +v3YL4FAAIHFUi+/w5w6Vp2By86BTApCiStFuSxI+1VabbfpWLk/rtQE9uMTfFLaF +LFQszev4POfEC1u3XegJc+ccYcADxuXseHj07UtCKQkoqAX/lahvOCK2hk2BYQdh +sHtrcJjZqSjDtm4Ec08pfjSKjISVoT5aWlFK0W9RJFsQNoWip7ZIAZwRy8ZPrVOx +bvBiSTYeuwa3Z7J5uGJZKH0Y0zYbwtsWvfIH8jgB+BRSBLQPKqlbPCCSNSfR8iVy +x446hB/a9HONTot5TCDuJ5T12Kw61mTupWGRLzImg6cm+anTXNSHDopTN9eugHE7 +eUvbzzpVYZ1AJduIdPYvzznOYq6T+jbBPiDTg1zUr3R3eLqOBpYJABnDxJlcOyCD +YHL2Ns/EFSMjLm0EyRGNP6a5NdsYljAFqrHMU2MHdj/GqNKWDzdVtMSZXG/1Xui7 +/Iu5xRMPtE7qEudVIupDFfgMzj9hZfM984N6B5exq6ZGMhwlJ/YBB8VpxRuW4Adi +32VTO5nF4M7m71jcOfFmaKz85u2g6RIctEIzJRZ0F4YmI33bj8HPTodV2bmtxd9V +6jipxZ4gO3zuKUsOUnmCkAp3Y9WgPZXsTS3WksFY4+Q3+vjQAlx3xMsTXpi2wKvi +uxYflNKeWPJQzBsdUAhEsffbIN+RTomnZh9ze4nO+8i1B/Hob3mxlTOVzIP6udvc +6NaZV6n42z1cv/X+5mexB74umFkpicMveNpaSGZO43v8ai6gppI4SaO9Wa7T3gWu +d6dchs+/gG0nZWsrq8XZmoEqywxqUEI/OR2dp/298cQYZug+psw4QJ3kXmRwu8qG +l3qjxpFyak64GLGNcfsd4KYOmsAtEZY/EDfVhVG4lexMInxDNMSziBEphocHbQlR +LpxryE9vfZZHOtbQuN1Bp/6KiH3kuVVLMNvIWrik6aeO8xc7vnT6ExKk8PENGo1L +-----END RSA PRIVATE KEY----- diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/check_ca_crt.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/check_ca_crt.sh new file mode 100644 index 0000000..83cffa1 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/check_ca_crt.sh @@ -0,0 +1,42 @@ +#! /bin/sh +# Purpose: Alert sysadmin/developer about the cert expiry date in advance +# Author: under license +# ------------------------------------------------------------------------------- + + +_openssl="openssl" + + +# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem +# REGENCRTSCRIPT=${HOME}/gen_ca_crt.sh +CUR_DIR=$( dirname -- "$0"; ) +CACRTPEM=$CUR_DIR/ca_crt.pem +REGENCRTSCRIPT=${CUR_DIR}/gen_ca_crt.sh + +# 7 days in seconds +DAYS="604800" + +# Email settings +_sub=$CACRTPEM" will expire within $DAYS seconds (7 days)" +# _sub="${CACRTPEM} will expire within $DAYS seconds (7 days)" +_from="system-account@your-dommain" +_to="sysadmin@your-domain" + +echo -e '\n'get date of $CACRTPEM: +openssl x509 -in $CACRTPEM -noout -dates + +echo -e '\n'check expiry of $CACRTPEM: +$_openssl x509 -enddate -noout -in "$CACRTPEM" -checkend "$DAYS" +$_openssl x509 -enddate -noout -in "$CACRTPEM" -checkend "$DAYS" | grep -q 'Certificate will expire' +# If will expire, regenerate key and certifcate +# // , and send email +if [ $? -eq 0 ] +then + echo "${_sub}" + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${REGENCRTSCRIPT} +fi diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/check_ca_key.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/check_ca_key.sh new file mode 100644 index 0000000..4461e1f --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/check_ca_key.sh @@ -0,0 +1,63 @@ +#! /bin/sh +# Purpose: Alert sysadmin/developer about the interity of key in advance +# Author: under license +# ------------------------------------------------------------------------------- + +_openssl="openssl" + + +CUR_DIR=$( dirname -- "$0"; ) + + +# KEYPEM=$HOME/.gpp/certs/ca_key.pem +# PUBPEM=$HOME/.gpp/certs/ca_pubkey.pem +# CRTPEM=$HOME/.gpp/certs/ca_crt.pem +# MSGTXT=$HOME/.gpp/certs/msg.txt +# MSGSIG=$HOME/.gpp/certs/msg.sig +# GENKEYCRTSCRIPT=${HOME}/.gpp/certs/gen_ca_keycrt.sh +KEYPEM=$CUR_DIR/ca_key.pem +PUBPEM=$CUR_DIR/ca_pubkey.pem +CRTPEM=$CUR_DIR/ca_crt.pem +MSGTXT=${CUR_DIR}/msg.txt +MSGSIG=${CUR_DIR}/msg.sig +GENKEYCRTSCRIPT=${CUR_DIR}/gen_ca_keycrt.sh + +echo -e '\n'check integrity of ${KEYPEM}: +# ${_openssl} rsa -in ${KEYPEM} -passin pass:111111 -check -noout +# ${_openssl} rsa -in ${KEYPEM} -check -noout +${_openssl} rsa -in ${KEYPEM} -check -noout | grep -q 'RSA key ok' +if [ $? -ne 0 ] +then + echo "the integrity of "${KEYPEM}" is broken" + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${GENKEYCRTSCRIPT} +else + echo -e "RSA key ok" +fi + +echo -e '\n'use private ${KEYPEM} to sign ${MSGTXT}: +# ${_openssl} dgst -sha256 -sign ${KEYPEM} -passin pass:111111 -out msg.sig msg.txt +${_openssl} dgst -sha256 -sign ${KEYPEM} -out ${MSGSIG} ${MSGTXT} + +echo -e '\n'get public key from ${CRTPEM}: +${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} + +echo -e '\n'use public key in ${CRTPEM} to verify signature of ${MSGTXT}: +# ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt +${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} +${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} | grep -q 'Verified OK' +if [ $? -ne 0 ] +then + echo ${KEYPEM}" is not matched with "${CRTPEM} + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${GENKEYCRTSCRIPT} +fi +rm -f ${PUBPEM} diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/check_client_crt.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/check_client_crt.sh new file mode 100644 index 0000000..769041a --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/check_client_crt.sh @@ -0,0 +1,43 @@ +#! /bin/sh +# Purpose: Alert sysadmin/developer about the cert expiry date in advance +# Author: under license +# ------------------------------------------------------------------------------- + + +_openssl="openssl" + + +# CRTPEM=$HOME/.gpp/certs/client_crt.pem +# REGENCRTSCRIPT=${HOME}/gen_client_crt.sh +CUR_DIR=$( dirname -- "$0"; ) +CRTPEM=$CUR_DIR/client_crt.pem +REGENCRTSCRIPT=${CUR_DIR}/gen_client_crt.sh + +# 7 days in seconds +DAYS="604800" + +# Email settings +_sub=$CRTPEM" will expire within $DAYS seconds (7 days)" +# _sub="${CRTPEM} will expire within $DAYS seconds (7 days)" +_from="system-account@your-dommain" +_to="sysadmin@your-domain" + + +echo -e '\n'get date of $CRTPEM: +openssl x509 -in $CRTPEM -noout -dates + +echo -e '\n'check expiry of $CRTPEM: +$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" +$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" | grep -q 'Certificate will expire' +# If will expire, regenerate key and certifcate +# // , and send email +if [ $? -eq 0 ] +then + echo "${_sub}" + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${REGENCRTSCRIPT} +fi diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/check_client_key.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/check_client_key.sh new file mode 100644 index 0000000..c62d32c --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/check_client_key.sh @@ -0,0 +1,62 @@ +#! /bin/sh +# Purpose: Alert sysadmin/developer about the interity of key in advance +# Author: under license +# ------------------------------------------------------------------------------- + + +_openssl="openssl" + + +# KEYPEM=$HOME/.gpp/certs/client_key.pem +# PUBPEM=$HOME/.gpp/certs/client_pubkey.pem +# CRTPEM=$HOME/.gpp/certs/client_crt.pem +# MSGTXT=$HOME/.gpp/certs/msg.txt +# MSGSIG=$HOME/.gpp/certs/msg.sig +# GENKEYCRTSCRIPT=${HOME}/.gpp/certs/gen_client_keycrt.sh +CUR_DIR=$( dirname -- "$0"; ) +KEYPEM=$CUR_DIR/client_key.pem +PUBPEM=$CUR_DIR/client_pubkey.pem +CRTPEM=$CUR_DIR/client_crt.pem +MSGTXT=${CUR_DIR}/msg.txt +MSGSIG=${CUR_DIR}/msg.sig +GENKEYCRTSCRIPT=${CUR_DIR}/gen_client_keycrt.sh + +echo -e '\n'check integrity of ${KEYPEM}: +# ${_openssl} rsa -in ${KEYPEM} -passin pass:111111 -check -noout +# ${_openssl} rsa -in ${KEYPEM} -check -noout +${_openssl} rsa -in ${KEYPEM} -check -noout | grep -q 'RSA key ok' +if [ $? -ne 0 ] +then + echo "the integrity of "${KEYPEM}" is broken" + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${GENKEYCRTSCRIPT} +else + echo -e "RSA key ok" +fi + +echo -e '\n'use private ${KEYPEM} to sign ${MSGTXT}: +# ${_openssl} dgst -sha256 -sign ${KEYPEM} -passin pass:111111 -out msg.sig msg.txt +${_openssl} dgst -sha256 -sign ${KEYPEM} -out ${MSGSIG} ${MSGTXT} + +echo -e '\n'get public key from ${CRTPEM}: +${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} + +echo -e '\n'use public key in ${CRTPEM} to verify signature of ${MSGTXT}: +# ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt +${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} +${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} | grep -q 'Verified OK' +if [ $? -ne 0 ] +then + echo ${KEYPEM}" is not matched with "${CRTPEM} + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${GENKEYCRTSCRIPT} +fi +rm -f ${PUBPEM} diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/check_server_crt.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/check_server_crt.sh new file mode 100644 index 0000000..acedfce --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/check_server_crt.sh @@ -0,0 +1,43 @@ +#! /bin/sh +# Purpose: Alert sysadmin/developer about the cert expiry date in advance +# Author: under license +# ------------------------------------------------------------------------------- + + +_openssl="openssl" + + +# CRTPEM=$HOME/.gpp/certs/server_crt.pem +# REGENCRTSCRIPT=${HOME}/gen_server_crt.sh +CUR_DIR=$( dirname -- "$0"; ) +CRTPEM=$CUR_DIR/server_crt.pem +REGENCRTSCRIPT=${CUR_DIR}/gen_server_crt.sh + +# 7 days in seconds +DAYS="604800" + +# Email settings +_sub=$CRTPEM" will expire within $DAYS seconds (7 days)" +# _sub="${CRTPEM} will expire within $DAYS seconds (7 days)" +_from="system-account@your-dommain" +_to="sysadmin@your-domain" + + +echo -e '\n'get date of $CRTPEM: +openssl x509 -in $CRTPEM -noout -dates + +echo -e '\n'check expiry of $CRTPEM: +$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" +$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" | grep -q 'Certificate will expire' +# If will expire, regenerate key and certifcate +# // , and send email +if [ $? -eq 0 ] +then + echo "${_sub}" + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${REGENCRTSCRIPT} +fi diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/check_server_key.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/check_server_key.sh new file mode 100644 index 0000000..9445f55 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/check_server_key.sh @@ -0,0 +1,62 @@ +#! /bin/sh +# Purpose: Alert sysadmin/developer about the interity of key in advance +# Author: under license +# ------------------------------------------------------------------------------- + + +_openssl="openssl" + + +# KEYPEM=$HOME/.gpp/certs/server_key.pem +# PUBPEM=$HOME/.gpp/certs/server_pubkey.pem +# CRTPEM=$HOME/.gpp/certs/server_crt.pem +# MSGTXT=$HOME/.gpp/certs/msg.txt +# MSGSIG=$HOME/.gpp/certs/msg.sig +# GENKEYCRTSCRIPT=${HOME}/.gpp/certs/gen_server_keycrt.sh +CUR_DIR=$( dirname -- "$0"; ) +KEYPEM=$CUR_DIR/server_key.pem +PUBPEM=$CUR_DIR/server_pubkey.pem +CRTPEM=$CUR_DIR/server_crt.pem +MSGTXT=${CUR_DIR}/msg.txt +MSGSIG=${CUR_DIR}/msg.sig +GENKEYCRTSCRIPT=${CUR_DIR}/gen_server_keycrt.sh + +echo -e '\n'check integrity of ${KEYPEM}: +# ${_openssl} rsa -in ${KEYPEM} -passin pass:111111 -check -noout +# ${_openssl} rsa -in ${KEYPEM} -check -noout +${_openssl} rsa -in ${KEYPEM} -check -noout | grep -q 'RSA key ok' +if [ $? -ne 0 ] +then + echo "the integrity of "${KEYPEM}" is broken" + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${GENKEYCRTSCRIPT} +else + echo -e "RSA key ok" +fi + +echo -e '\n'use private ${KEYPEM} to sign ${MSGTXT}: +# ${_openssl} dgst -sha256 -sign ${KEYPEM} -passin pass:111111 -out msg.sig msg.txt +${_openssl} dgst -sha256 -sign ${KEYPEM} -out ${MSGSIG} ${MSGTXT} + +echo -e '\n'get public key from ${CRTPEM}: +${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} + +echo -e '\n'use public key in ${CRTPEM} to verify signature of ${MSGTXT}: +# ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt +${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} +${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} | grep -q 'Verified OK' +if [ $? -ne 0 ] +then + echo ${KEYPEM}" is not matched with "${CRTPEM} + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${GENKEYCRTSCRIPT} +fi +rm -f ${PUBPEM} diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/gen_ca_crt.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_ca_crt.sh new file mode 100644 index 0000000..267cac5 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_ca_crt.sh @@ -0,0 +1,22 @@ +#! /bin/sh + +_openssl="openssl" + +CUR_DIR=$( dirname -- "$0"; ) + + +# CAKEYPEM=$HOME/.gpp/certs/ca_key.pem +# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem +CAKEYPEM=$CUR_DIR/ca_key.pem +CACRTPEM=$CUR_DIR/ca_crt.pem +RSAKEYLEN=2048 +EXPIREDAYS=3650 +SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=ca.org" + +# echo -e '\n'generate $CAKEYPEM: +# $_openssl genrsa -passout pass:111111 -aes192 -out $CAKEYPEM ${RSAKEYLEN} +# $_openssl genrsa -aes192 -out $CAKEYPEM ${RSAKEYLEN} + +echo -e '\n'generate $CACRTPEM: +# $_openssl req -passin pass:111111 -new -x509 -days 3650 -key $CAKEYPEM -out $CACRTPEM -subj ${SUBSTR} +$_openssl req -new -x509 -days ${EXPIREDAYS} -key $CAKEYPEM -out $CACRTPEM -subj ${SUBSTR} diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/gen_ca_keycrt.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_ca_keycrt.sh new file mode 100644 index 0000000..5110ba9 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_ca_keycrt.sh @@ -0,0 +1,22 @@ +#! /bin/sh + +_openssl="openssl" + +CUR_DIR=$( dirname -- "$0"; ) + + +# CAKEYPEM=$HOME/.gpp/certs/ca_key.pem +# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem +CAKEYPEM=$CUR_DIR/ca_key.pem +CACRTPEM=$CUR_DIR/ca_crt.pem +RSAKEYLEN=2048 +EXPIREDAYS=3650 +SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=ca.org" + +echo -e '\n'generate $CAKEYPEM: +# $_openssl genrsa -passout pass:111111 -aes192 -out $CAKEYPEM ${RSAKEYLEN} +$_openssl genrsa -aes192 -out $CAKEYPEM ${RSAKEYLEN} + +echo -e '\n'generate $CACRTPEM: +# $_openssl req -passin pass:111111 -new -x509 -days 3650 -key $CAKEYPEM -out $CACRTPEM -subj ${SUBSTR} +$_openssl req -new -x509 -days ${EXPIREDAYS} -key $CAKEYPEM -out $CACRTPEM -subj ${SUBSTR} diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/gen_client_crt.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_client_crt.sh new file mode 100644 index 0000000..8bfa94f --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_client_crt.sh @@ -0,0 +1,22 @@ +#! /bin/sh + +_openssl="openssl" + +CUR_DIR=$( dirname -- "$0"; ) + + +# CAKEYPEM=$HOME/.gpp/certs/ca_key.pem +# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem +# CSRPEM=$HOME/.gpp/certs/client_csr.pem +# CRTPEM=$HOME/.gpp/certs/client_crt.pem +CAKEYPEM=$CUR_DIR/ca_key.pem +CACRTPEM=$CUR_DIR/ca_crt.pem +CSRPEM=$CUR_DIR/client_csr.pem +CRTPEM=$CUR_DIR/client_crt.pem +RSAKEYLEN=2048 +EXPIREDAYS=3650 +SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=gpclient.org" + +echo -e '\n'generate $CRTPEM: +# ${_openssl} x509 -req -passin pass:111111 -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM +${_openssl} x509 -req -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/gen_client_keycsr.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_client_keycsr.sh new file mode 100644 index 0000000..cbf8077 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_client_keycsr.sh @@ -0,0 +1,22 @@ +#! /bin/sh + +_openssl="openssl" + +CUR_DIR=$( dirname -- "$0"; ) + + +# KEYPEM=$HOME/.teecc/certs/client_key.pem +# CSRPEM=$HOME/.teecc/certs/client_csr.pem +KEYPEM=$CUR_DIR/client_key.pem +CSRPEM=$CUR_DIR/client_csr.pem +RSAKEYLEN=2048 +SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=gpclient.org" + +echo -e '\n'generate $KEYPEM: +# $_openssl genrsa -passout pass:111111 -aes192 -out $KEYPEM ${RSAKEYLEN} +$_openssl genrsa -aes192 -out $KEYPEM ${RSAKEYLEN} + +echo -e '\n'generate certgen request $CSRPEM: +# $_openssl req -passin pass:111111 -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} +$_openssl req -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} + diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/gen_server_crt.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_server_crt.sh new file mode 100644 index 0000000..56399b0 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_server_crt.sh @@ -0,0 +1,32 @@ +#! /bin/sh + +_openssl="openssl" + +CUR_DIR=$( dirname -- "$0"; ) + + +# CAKEYPEM=$HOME/.gpp/certs/ca_key.pem +# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem +# KEYPEM=$HOME/.gpp/certs/server_key.pem +# CSRPEM=$HOME/.gpp/certs/server_csr.pem +# CRTPEM=$HOME/.gpp/certs/server_crt.pem +CAKEYPEM=$CUR_DIR/ca_key.pem +CACRTPEM=$CUR_DIR/ca_crt.pem +KEYPEM=$CUR_DIR/server_key.pem +CSRPEM=$CUR_DIR/server_csr.pem +CRTPEM=$CUR_DIR/server_crt.pem +RSAKEYLEN=2048 +EXPIREDAYS=3650 +SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=gpserver.org" + +# echo -e '\n'generate $KEYPEM: +# $_openssl genrsa -passout pass:111111 -aes192 -out $KEYPEM ${RSAKEYLEN} +# $_openssl genrsa -aes192 -out $KEYPEM ${RSAKEYLEN} + +echo -e '\n'generate certgen request $CSRPEM: +# $_openssl req -passin pass:111111 -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} +$_openssl req -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} + +echo -e '\n'generate $CRTPEM: +# ${_openssl} x509 -req -passin pass:111111 -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM +${_openssl} x509 -req -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/gen_server_keycrt.sh b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_server_keycrt.sh new file mode 100644 index 0000000..977c6fd --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/gen_server_keycrt.sh @@ -0,0 +1,32 @@ +#! /bin/sh + +_openssl="openssl" + +CUR_DIR=$( dirname -- "$0"; ) + + +# CAKEYPEM=$HOME/.gpp/certs/ca_key.pem +# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem +# KEYPEM=$HOME/.gpp/certs/server_key.pem +# CSRPEM=$HOME/.gpp/certs/server_csr.pem +# CRTPEM=$HOME/.gpp/certs/server_crt.pem +CAKEYPEM=$CUR_DIR/ca_key.pem +CACRTPEM=$CUR_DIR/ca_crt.pem +KEYPEM=$CUR_DIR/server_key.pem +CSRPEM=$CUR_DIR/server_csr.pem +CRTPEM=$CUR_DIR/server_crt.pem +RSAKEYLEN=2048 +EXPIREDAYS=3650 +SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=gpserver.org" + +echo -e '\n'generate $KEYPEM: +# $_openssl genrsa -passout pass:111111 -aes192 -out $KEYPEM ${RSAKEYLEN} +$_openssl genrsa -aes192 -out $KEYPEM ${RSAKEYLEN} + +echo -e '\n'generate certgen request $CSRPEM: +# $_openssl req -passin pass:111111 -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} +$_openssl req -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} + +echo -e '\n'generate $CRTPEM: +# ${_openssl} x509 -req -passin pass:111111 -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM +${_openssl} x509 -req -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/msg.txt b/cc-resource-pooling/teeproxy/gpproxy/certs/msg.txt new file mode 100644 index 0000000..93388ad --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/msg.txt @@ -0,0 +1 @@ +verify the integrity of a certificate and private key pair diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/server_crt.pem b/cc-resource-pooling/teeproxy/gpproxy/certs/server_crt.pem new file mode 100644 index 0000000..7c4aef6 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/server_crt.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDTzCCAjcCFD3UsYh/aU1yUsNsej6x2MjHaxBNMA0GCSqGSIb3DQEBCwUAMGEx +CzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIdWJlaTEOMAwGA1UEBwwFV3VoYW4xEjAQ +BgNVBAoMCVRydXN0Q3V0ZTENMAsGA1UECwwEZ1JQQzEPMA0GA1UEAwwGY2Eub3Jn +MB4XDTIyMDgyMDA1MDAwN1oXDTMyMDgxNzA1MDAwN1owZzELMAkGA1UEBhMCQ04x +DjAMBgNVBAgMBUh1YmVpMQ4wDAYDVQQHDAVXdWhhbjESMBAGA1UECgwJVHJ1c3RD +dXRlMQ0wCwYDVQQLDARnUlBDMRUwEwYDVQQDDAxncHNlcnZlci5vcmcwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGXHn+5sLRKB2RUG3PF+rzLbCVfrfW +2Lgq6PB11M0Qg7+yHCKuZJPZYo1M4DyAjVaF/h24IMr7Vg5j/MqVjwW2Q84DMkmI +WkaHgo+7bqfZ2fIOlrRiUo9ilALRDL2S/NJfRF2Z5e6lu4XvchjnRpC+Pu3YrxhB ++2LJ7F061OyKal5ylXfbb0+/TE4zM30nrJR8R4OvPeQvrmea//s5m1DLy6p5R6ZJ +YZH33xRo2zCYLmID6RwHChJHQX6f48e2u2nqXk20Q6wIrBh5jY2ATL3l6b/mqZ5K +U0IdzrPPGrtUz9hiT8H0tnjarnvIp6ffEqx9cBAulNocIAfBSAiOK2zfAgMBAAEw +DQYJKoZIhvcNAQELBQADggEBACS+qheuLHDKewqkyFBoDOy4T16b7ula9oRl0NsZ +Veh7jiu6BT5xcAbSUIAS5oxlhGb+CEzwMHT9r5D5ZBmSk6MWeG8my5SfWq7GKa6Y +DsjwNM2Wm0lM9brQZObr4BWorSYhHz6rfiSc5IfpiDPe7wluTJX0RuHUsp2rbjwO +EPdiEISQYu8ugMbMc8uyTV9L0/3X9Hy210FDIgZ+B9Z7udqsgZkQ/DjmWITXpgd5 +1T8O91v3lp9LuFKv2PvzlD6h3fSc5ITlRqlzY52ql3Xece7jfNCpDsuGEWO00//q +x3hM5EYI8qp0FCLvfxD16TBIq34yCXq3NmdinGc/1PGulLU= +-----END CERTIFICATE----- diff --git a/cc-resource-pooling/teeproxy/gpproxy/certs/server_key.pem b/cc-resource-pooling/teeproxy/gpproxy/certs/server_key.pem new file mode 100644 index 0000000..be30821 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/certs/server_key.pem @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-192-CBC,FE8794441B351ACA7569D5F49605C874 + +YYmoW3nUds/a4CumjFwyZEyXcT5qVXOX3nxpFKnAQRu0oA83CmyLPxxKksKfpmu5 +RbTFCS06XP+1jKpnP7Bx9gT31WdfMdwlb1xQaQJkxWBqAQZNPdUHoY2aiyqy7Mzt +j5P6wmFdVsauOnfvh+lcIDP6AjxGfsLtqTXe7JXtxyR+VVXlNcyRewwRfcy5eEUT +OnSfcsgY9lgHkUT2gbzttvmUfWWhCHU4U+IMpC1pGFZx5njJV/pkKXNzESvoYmeb +PrKu0PN9oKg8i0Iina3/G5/uiRgUl3+EfhpUm2XtTXimNeVJ/s4/9yB/ysFIrura +QqzFMVxyMESD+eoGrcelX1Ow0bj8JKMzGvcQNRIE9dHuZ8htyhd5QV3N7jKzEiAE +wDoQdvOHzhblepibm0pfndi6BTy7tSRYC3wINF2e8rmxoMSVT+jIfTnpRG4finj+ +0ZTFHoDCyitgqvEAztG9+b4gel3lK5Xm1CayyGkBoFLDhl3iWlUIfDkd2mEaUyjf +N/mjs/AXZKZCT9ApNm6X2hzVrNPZBbOgTPdeQfstVJjxj4heCGn/kn2wciEpmZPG +geXAh357+wGngs+kzAy0p/nso1Lp2fYUui3uh5o8Acbc0/D1b1ysWyxvlE3vtkJ3 +uXqz3hgJNFmLLOk1/K8akGnQd9Hc15pQrNoE6of5w9FvkO7r3pIMNOptJDlz/ogj +Jn2TP2UJGC6EwCSJM+lUxum6BKt6nz+4n8Sl8aPGiBpr4tQIrEodWRHsixd+Vy6u +yUffB0DfL41X28O7bGOIpdhcIQG25mE65/idMoTYAtrvExQymZjCCBsbzlBiQcwk +4bzA+Wv5tCWyJjwJKJBKSYFBVcNf3P9micB5YDyIcpDmgwqYZxo5KAj4K4Fmm7er +hYMA+Jzd3SYemH/lUSDSlK438bv9d7P7qIm27QC6TngKW9or4b2F/gDy7iYjXm5Q +Gk7C39xTlIUwSQR/WMVCG8MhkkamuDWTiaj9BEydO8VeIQf7jWEsY5ShGTr+VxtI +3SeUjkmD6whqRrKJBgdlIINuBUpB8dVzVufchhtR9GNPqCWdaMFquVK1JcgWISb6 +LuXAGPmumhFER4oK7xmITmlIRxjgXkld5Qcj9wzmmISO7ChxCWhXKNd/fabPRrO1 +gNO2C41/JbNoshF9qZfyR/0uVJZGLFy+/YsHh0Hk6s7o+g1SxpWYc2QG1fcvPvIS +vPI/I0+J8MUzL0BjdJf8lb/A2kCGRRn2P7AfGiUsbkGT3lnshudWQDe+sEdxJpm4 +OcrFpbyghiJuxYoE6LwDb2wgMbujsHDccL8eKpBvdlqcxU48dl3sF1C6rTjFgRPT +KI8KMcyWxVNfjYn1pMPPLkz3TEQd/mwu8g7yU2JAe3oH79pZE5Qdjji5uPRXSqF/ +c2FAFH10cyct5UISeMofFnECecx7XbxaurjiDQ0wCzcKZ1aO07XIyfLtWoQZHFOi +UlceygZQgISxsofxNLXfx4mur1yI6snOg/BH8dBKzmi7UvaffGv1o0U4JMAGavXT +DyZPod78wf3DImX/FQT1QVCVXH11igUUQl0RrHUc0y+dAKxxFxevSmedNP++wkNm +-----END RSA PRIVATE KEY----- diff --git a/cc-resource-pooling/teeproxy/gpproxy/changelog.md b/cc-resource-pooling/teeproxy/gpproxy/changelog.md new file mode 100644 index 0000000..f66c4e1 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/changelog.md @@ -0,0 +1,7 @@ +# 更新日志 + +## [1.0.0] - 2022-10-11 + +### 新增 + +* 项目初始化,上传第一版 diff --git a/cc-resource-pooling/teeproxy/gpproxy/common.cmake b/cc-resource-pooling/teeproxy/gpproxy/common.cmake new file mode 100644 index 0000000..62099c5 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/common.cmake @@ -0,0 +1,129 @@ +# Copyright 2018 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# cmake build file for C++ route_guide example. +# Assumes protobuf and gRPC have been installed using cmake. +# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build +# that automatically builds all the dependencies before building route_guide. + +cmake_minimum_required(VERSION 3.5.1) + +# set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD 14) + +set (GRPC_FETCHCONTENT 1) + + +if(MSVC) + add_definitions(-D_WIN32_WINNT=0x600) +endif() + +find_package(Threads REQUIRED) + +if(GRPC_AS_SUBMODULE) + # One way to build a projects that uses gRPC is to just include the + # entire gRPC project tree via "add_subdirectory". + # This approach is very simple to use, but the are some potential + # disadvantages: + # * it includes gRPC's CMakeLists.txt directly into your build script + # without and that can make gRPC's internal setting interfere with your + # own build. + # * depending on what's installed on your system, the contents of submodules + # in gRPC's third_party/* might need to be available (and there might be + # additional prerequisites required to build them). Consider using + # the gRPC_*_PROVIDER options to fine-tune the expected behavior. + # + # A more robust approach to add dependency on gRPC is using + # cmake's ExternalProject_Add (see cmake_externalproject/CMakeLists.txt). + + # Include the gRPC's cmake build (normally grpc source code would live + # in a git submodule called "third_party/grpc", but this example lives in + # the same repository as gRPC sources, so we just look a few directories up) + add_subdirectory(../../.. ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL) + message(STATUS "Using gRPC via add_subdirectory.") + + # After using add_subdirectory, we can now use the grpc targets directly from + # this build. + set(_PROTOBUF_LIBPROTOBUF libprotobuf) + set(_REFLECTION grpc++_reflection) + if(CMAKE_CROSSCOMPILING) + find_program(_PROTOBUF_PROTOC protoc) + else() + set(_PROTOBUF_PROTOC $) + endif() + set(_GRPC_GRPCPP grpc++) + if(CMAKE_CROSSCOMPILING) + find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) + else() + set(_GRPC_CPP_PLUGIN_EXECUTABLE $) + endif() +elseif(GRPC_FETCHCONTENT) + # Another way is to use CMake's FetchContent module to clone gRPC at + # configure time. This makes gRPC's source code available to your project, + # similar to a git submodule. + message(STATUS "Using gRPC via add_subdirectory (FetchContent).") + include(FetchContent) + FetchContent_Declare( + grpc + GIT_REPOSITORY https://github.com/grpc/grpc.git + # when using gRPC, you will actually set this to an existing tag, such as + # v1.25.0, v1.26.0 etc.. + # For the purpose of testing, we override the tag used to the commit + # that's currently under test. + # GIT_TAG vGRPC_TAG_VERSION_OF_YOUR_CHOICE + GIT_TAG v1.48.0 + ) + FetchContent_MakeAvailable(grpc) + + # Since FetchContent uses add_subdirectory under the hood, we can use + # the grpc targets directly from this build. + set(_PROTOBUF_LIBPROTOBUF libprotobuf) + set(_REFLECTION grpc++_reflection) + set(_PROTOBUF_PROTOC $) + set(_GRPC_GRPCPP grpc++) + if(CMAKE_CROSSCOMPILING) + find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) + else() + set(_GRPC_CPP_PLUGIN_EXECUTABLE $) + endif() +else() + # This branch assumes that gRPC and all its dependencies are already installed + # on this system, so they can be located by find_package(). + + # Find Protobuf installation + # Looks for protobuf-config.cmake file installed by Protobuf's cmake installation. + set(protobuf_MODULE_COMPATIBLE TRUE) + find_package(Protobuf CONFIG REQUIRED) + message(STATUS "Using protobuf ${Protobuf_VERSION}") + + set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) + set(_REFLECTION gRPC::grpc++_reflection) + if(CMAKE_CROSSCOMPILING) + find_program(_PROTOBUF_PROTOC protoc) + else() + set(_PROTOBUF_PROTOC $) + endif() + + # Find gRPC installation + # Looks for gRPCConfig.cmake file installed by gRPC's cmake installation. + find_package(gRPC CONFIG REQUIRED) + message(STATUS "Using gRPC ${gRPC_VERSION}") + + set(_GRPC_GRPCPP gRPC::grpc++) + if(CMAKE_CROSSCOMPILING) + find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) + else() + set(_GRPC_CPP_PLUGIN_EXECUTABLE $) + endif() +endif() diff --git a/cc-resource-pooling/teeproxy/gpproxy/conf/gpproxy_config.yaml b/cc-resource-pooling/teeproxy/gpproxy/conf/gpproxy_config.yaml new file mode 100644 index 0000000..978cc84 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/conf/gpproxy_config.yaml @@ -0,0 +1,19 @@ +GPPROXY_ADDRESS: "[::]:50051" + +NAME_SERVER_KEY: "server_key.pem" +NAME_SERVER_CERT: "server_crt.pem" +NAME_CLIENTCA_CERT: "ca_crt.pem" + +# 0, no tls +# 1, only server certificate +# 2, server and client certificates +GRPC_TLS: 1 + +# 0, do not validate jwt +# 1, foreced to validate jwt +FORCE_VALIDATE_JWT: 1 + +MAX_NUM_THREAD: 128 +MAX_NUM_WORKER: 128 +TIMEDOUT_SESSION: 60 +TIMEDOUT_CONTEXT: 90 diff --git a/cc-resource-pooling/teeproxy/gpproxy/gpproxy.cc b/cc-resource-pooling/teeproxy/gpproxy/gpproxy.cc new file mode 100644 index 0000000..b510d08 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/gpproxy.cc @@ -0,0 +1,4195 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gt.grpc.pb.h" +#include "gt.pb.h" + +#include "gpproxy.h" + +extern "C" { +#include "dbusc_gpw.h" +} + +#include "dbusc_jwt.h" +#include "yaml-cpp/yaml.h" + + +using grpc::Server; +using grpc::ServerBuilder; +using grpc::ServerContext; +using grpc::Status; +using grpc::ServerCompletionQueue; +using grpc::ServerAsyncResponseWriter; +using grpc::ServerAsyncReader; + +using grpc::experimental::AltsServerCredentials; +using grpc::experimental::AltsServerCredentialsOptions; + +using gt::gpp; +using gt::Inicont_Request; +using gt::Inicont_Reply; +using gt::Fincont_Request; +using gt::Fincont_Reply; +using gt::Opes_Reply; +using gt::Opes_Request; +using gt::Close_Reply; +using gt::Close_Request; +using gt::Invo_Reply; +using gt::Invo_Request; +using gt::TA_Chunk; +using gt::TA_Reply; +using gt::Setjwt_Request; +using gt::Setjwt_Reply; + + +#define NO_ERROR 0 + +std::string global_strcfgfiletemp = getenv("HOME"); +std::string global_strcfgfile = global_strcfgfiletemp + "/.gpp/gpproxy_config.yaml"; +YAML::Node glo_config = YAML::LoadFile(global_strcfgfile); +std::string gpproxy_address = glo_config["GPPROXY_ADDRESS"].as(); +std::string global_servercert_path = + global_strcfgfiletemp + "/.gpp/certs/" + glo_config["NAME_SERVER_CERT"].as(); +std::string global_serverkey_path = + global_strcfgfiletemp + "/.gpp/certs/" + glo_config["NAME_SERVER_KEY"].as(); +std::string global_clientcacert_path = + global_strcfgfiletemp + "/.gpp/certs/" + glo_config["NAME_CLIENTCA_CERT"].as(); +int grpc_tls = glo_config["GRPC_TLS"].as(); +int global_force_valideta_jwt = glo_config["FORCE_VALIDATE_JWT"].as(); + +int global_max_num_thread = glo_config["MAX_NUM_THREAD"].as(); +int global_max_num_worker = glo_config["MAX_NUM_WORKER"].as(); +int global_timeout_session = glo_config["TIMEDOUT_SESSION"].as(); +int global_timeout_context = glo_config["TIMEDOUT_CONTEXT"].as(); + + +static std::string get_file_contents(std::string fpath) +{ + std::ifstream finstream(fpath); + std::string contents; + contents.assign((std::istreambuf_iterator(finstream)), + std::istreambuf_iterator()); + finstream.close(); + return contents; +} + +bool utf8_check_is_valid(std::string &string) +{ + int c, i, ix, n, j; + for (i = 0, ix = string.length(); i < ix; i++) + { + c = (unsigned char) string[i]; + //if (c==0x09 || c==0x0a || c==0x0d || (0x20 <= c && c <= 0x7e) ) n = 0; // is_printable_ascii + if (0x00 <= c && c <= 0x7f) n = 0; // 0bbbbbbb + else if ((c & 0xE0) == 0xC0) n = 1; // 110bbbbb + else if (c == 0xed && i < (ix - 1) && ((unsigned char) string[i + 1] & 0xa0) == 0xa0) + return false; //U+d800 to U+dfff + else if ((c & 0xF0) == 0xE0) n = 2; // 1110bbbb + else if ((c & 0xF8) == 0xF0) n = 3; // 11110bbb + //else if (($c & 0xFC) == 0xF8) n=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8 + //else if (($c & 0xFE) == 0xFC) n=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8 + else return false; + for (j = 0; j < n && i < ix; j++) + { // n bytes matching 10bbbbbb follow ? + if ((++i == ix) || (((unsigned char) string[i] & 0xC0) != 0x80)) + return false; + } + } + return true; +} + + +#define MAX_DATA_LEN 50*1024 +#define SHA256_LENTH 32 + +int get_file_sha256(char *file_path, char *val) +{ + SHA256_CTX sha256_ctx; + FILE *fp = NULL; + char *strFilePath = file_path; + unsigned char SHA256result[SHA256_LENTH]; + char DataBuff[MAX_DATA_LEN]; + int len; + int t = 0; + int i; + std::string sha256; + + fp = fopen(strFilePath, "rb"); + + SHA256_Init(&sha256_ctx); + + while (!feof(fp)) + { + memset(DataBuff, 0x00, sizeof(DataBuff)); + + len = fread(DataBuff, 1, MAX_DATA_LEN, fp); + if (len) + { + t += len; + SHA256_Update(&sha256_ctx, DataBuff, len); + } + } + + fclose(fp); + SHA256_Final(SHA256result, &sha256_ctx); + + if (val == NULL || (sizeof(val) * 4) < SHA256_LENTH) + { + return -1; + } else + { + memset(val, 0, sizeof(val)); + memcpy(val, SHA256result, SHA256_LENTH); + } + + return 0; +} + +bool isFileExists_ifstream(std::string &name) +{ + std::ifstream f(name.c_str()); + return f.good(); +} + +void check_config() +{ + if (grpc_tls != 0 && grpc_tls != 1 && grpc_tls != 2) + { + std::cout << global_strcfgfile << " grpc_tls should be 0 or 1 or 2 " << std::endl; + exit(-1); + } + if (global_force_valideta_jwt != 0 && global_force_valideta_jwt != 1) + { + std::cout << global_strcfgfile << " global_force_valideta_jwt should be 0 or 1 " << std::endl; + exit(-1); + } + if (global_max_num_thread < 0 || global_max_num_thread > 128) + { + std::cout << global_strcfgfile << " global_max_num_thread should between 0 and 128 " << std::endl; + exit(-1); + } + if (global_max_num_worker < 0 || global_max_num_worker > 128) + { + std::cout << global_strcfgfile << " global_max_num_worker should between 0 and 128 " << std::endl; + exit(-1); + } + if (global_timeout_session <= 0) + { + std::cout << global_strcfgfile << " global_timeout_session should > 0 " << std::endl; + exit(-1); + } + if (global_timeout_context <= 0) + { + std::cout << global_strcfgfile << " global_timeout_context should > 0 " << std::endl; + exit(-1); + } + if (grpc_tls == 2) + { + if (!isFileExists_ifstream(global_servercert_path)) + { + std::cout << "error file : " << global_servercert_path << " is not exist " << std::endl; + exit(-1); + } + if (!isFileExists_ifstream(global_serverkey_path)) + { + std::cout << "error file : " << global_serverkey_path << " is not exist " << std::endl; + exit(-1); + } + if (!isFileExists_ifstream(global_clientcacert_path)) + { + std::cout << "error file : " << global_clientcacert_path << " is not exist " << std::endl; + exit(-1); + } + } + if (grpc_tls == 1) + { + if (!isFileExists_ifstream(global_servercert_path)) + { + std::cout << "error file : " << global_servercert_path << " is not exist " << std::endl; + exit(-1); + } + if (!isFileExists_ifstream(global_serverkey_path)) + { + std::cout << "error file : " << global_serverkey_path << " is not exist " << std::endl; + exit(-1); + } + } +} + +class ServerImpl final +{ +public: + ~ServerImpl() + { + server_->Shutdown(); + for (auto &cq: cq_) + cq->Shutdown(); + delete[] workerrec; + } + + ServerImpl() + { + pthread_mutex_init(&mutex_workerrec, NULL); + pthread_cond_init(&cond_notbusy, NULL); + for (int iworker = 0; iworker < global_max_num_worker; iworker++) + { + workerrec[iworker].busy = 0; + workerrec[iworker].context_fd = 0; + workerrec[iworker].context_addr = 0xffffffff; + workerrec[iworker].sessionid_count = 0; + workerrec[iworker].first = NULL; + workerrec[iworker].last = NULL; + } + } + + class CallData + { + + public: + + enum ServiceType + { + SS_TEECC_InitializeContext = 0, + SS_TEECC_FinalizeContext = 1, + SS_TEECC_OpenSession = 2, + SS_TEECC_CloseSession = 3, + SS_TEECC_InvokeCommand = 4, + SS_TEECC_TA = 5, + SS_TEECC_SetJwt = 6 + }; + + ~CallData() + { + + } + + CallData(gpp::AsyncService *service, + ServerCompletionQueue *cq, + ServiceType s_type, + pthread_mutex_t *mutex_workerrec, + pthread_cond_t *cond_notbusy, + wr_t *workerrec) + : service_(service), + cq_(cq), + s_type_(s_type), + mutex_workerrec_(mutex_workerrec), + cond_notbusy_(cond_notbusy), + workerrec_(workerrec), + inicont_response(&ctx_), + fincont_response(&ctx_), + opes_response(&ctx_), + close_response(&ctx_), + invo_response(&ctx_), + ta_response(&ctx_), + setjwt_response(&ctx_), + status_(CREATE) + { + Process(); + } + + void Process() + { + if (status_ == CREATE) + { + status_ = PROCESS; + switch (s_type_) + { + case ServerImpl::CallData::SS_TEECC_InitializeContext: + service_->RequestTEECC_InitializeContext(&ctx_, &inicont_request, &inicont_response, cq_, cq_, + this); + break; + case ServerImpl::CallData::SS_TEECC_FinalizeContext: + service_->RequestTEECC_FinalizeContext(&ctx_, &fincont_request, &fincont_response, cq_, cq_, this); + break; + case ServerImpl::CallData::SS_TEECC_OpenSession: + service_->RequestTEECC_OpenSession(&ctx_, &opes_request, &opes_response, cq_, cq_, this); + break; + case ServerImpl::CallData::SS_TEECC_InvokeCommand: + service_->RequestTEECC_InvokeCommand(&ctx_, &invo_request, &invo_response, cq_, cq_, this); + break; + case ServerImpl::CallData::SS_TEECC_CloseSession: + service_->RequestTEECC_CloseSession(&ctx_, &close_request, &close_response, cq_, cq_, this); + break; + case ServerImpl::CallData::SS_TEECC_TA: + service_->RequestTEECC_TA(&ctx_, &ta_chunk, &ta_response, cq_, cq_, this); + break; + case ServerImpl::CallData::SS_TEECC_SetJwt: + service_->RequestTEECC_SetJwt(&ctx_, &setjwt_request, &setjwt_response, cq_, cq_, this); + break; + default: + break; + } + + } else if (status_ == PROCESS) + { + status_ = FINISH; + new CallData(service_, cq_, this->s_type_, mutex_workerrec_, cond_notbusy_, workerrec_); + + switch (s_type_) + { + case ServerImpl::CallData::SS_TEECC_InitializeContext: + { + struct timeval start, end, jwt_validate_start, jwt_validate_end; + gettimeofday(&start, NULL); + + std::string name; + const uint8_t *name_temp = reinterpret_cast(name.c_str()); + std::size_t name_size; + std::int32_t in_context_fd; + std::string in_context_tapath; + const uint8_t *in_context_tapath_temp = NULL; + std::int32_t in_context_tapath_size; + unsigned char *charp = NULL; + std::string charpp; + std::uint64_t in_context_sessionlist_next; + std::uint64_t in_context_sessionlist_prev; + std::uint64_t in_context_shrdmemlist_next; + std::uint64_t in_context_shrdmemlist_prev; + std::uint64_t in_context_sharebuffer_buffer; + std::int64_t in_context_sharebuffer_bufferbarrier; + + std::uint32_t teecresult; + std::int32_t fd; + + unsigned char *ta_path = NULL; + std::int32_t ta_path_size = 0; + + std::uint64_t session_list_next; + std::uint64_t session_list_prev; + std::uint64_t shrd_mem_list_next; + std::uint64_t shrd_mem_list_prev; + std::uint64_t share_buffer_buffer; + std::int64_t share_buffer_buffer_barrier; + std::uint64_t context_addr; + + in_context_fd = 0; + in_context_tapath_size = 0; + in_context_sessionlist_next = 0; + in_context_sessionlist_prev = 0; + in_context_shrdmemlist_next = 0; + in_context_shrdmemlist_prev = 0; + in_context_sharebuffer_buffer = 0; + in_context_sharebuffer_bufferbarrier = 0; + + name_size = inicont_request.name_size(); + if (name_size > 0) + { + name = inicont_request.name(); + std::cout << "gpp received name: " << name << std::endl; + } + + std::uint32_t serial = 0; + std::int32_t flag = 0; + + std::string token; + token = inicont_request.token(); + + std::string noToken("noToken"); + int ivaljwtResult = -1; + int iforceValidateJwt = global_force_valideta_jwt; + + if + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + ) + { + char Token[1024]; + strcpy(Token, (char *) token.data()); + + gettimeofday(&jwt_validate_start, NULL); + ivaljwtResult = + dbusmethodcall_validate_jwt( + Token + ); + gettimeofday(&jwt_validate_end, NULL); + int64_t i64Time_jwt; + i64Time_jwt = (jwt_validate_end.tv_sec - jwt_validate_start.tv_sec) * 1000000 + + (jwt_validate_end.tv_usec - jwt_validate_start.tv_usec); + printf("gpp initcont validate jwt used time: %ld us. \n", i64Time_jwt); + + std::cout << "gpp validate initcont jwtsvid" << std::endl; + } else + { + std::cout << "gpp no validate initcont jwtsvid" << std::endl; + } + + if + ( + iforceValidateJwt != 1 + || + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + && + ivaljwtResult == NO_ERROR + ) + ) + { + std::cout << "gpp does not need validate initcont jwtsvid or validate jwt succed" << std::endl; + std::cout << "gpp received init context" << std::endl; + std::cout << "gpp received namesize: " << name_size << std::endl; + + ta_path = (unsigned char *) malloc(1024 * sizeof(char)); + ta_path_size = 1024; + memset((char *) ta_path, 0, 1024); + uint32_t context_tapath_outsize; + + char workername[1024]; + memset((char *) workername, 0, 1024); + int ifound = 0; + int iworker; + + for (;;) + { + pthread_mutex_lock(mutex_workerrec_); + for (iworker = 0; iworker < global_max_num_worker; iworker++) + { + if (workerrec_[iworker].busy == 0) + { + sprintf(workername, "%s%d", "gpworker", iworker); + std::cout << "gpp method call worker No: " << std::dec << iworker << std::endl; + workerrec_[iworker].busy = 1; + ifound = 1; + break; + } + } + if (ifound == 0) + { + pthread_cond_wait(cond_notbusy_, mutex_workerrec_); + } + pthread_mutex_unlock(mutex_workerrec_); + + if (ifound == 1) + { + break; + } + } + + method_call_teec_inicont( + workername, + + name_temp, + name_size, + in_context_fd, + in_context_tapath_temp, + in_context_tapath_size, + in_context_sessionlist_next, + in_context_sessionlist_prev, + in_context_shrdmemlist_next, + in_context_shrdmemlist_prev, + in_context_sharebuffer_buffer, + in_context_sharebuffer_bufferbarrier, + + &teecresult, + + &fd, + ta_path, + ta_path_size, + &session_list_next, + &session_list_prev, + &shrd_mem_list_next, + &shrd_mem_list_prev, + &share_buffer_buffer, + &share_buffer_buffer_barrier, + &context_addr, + &context_tapath_outsize + ); + + if (teecresult == 0) + { + pthread_mutex_lock(mutex_workerrec_); + workerrec_[iworker].context_fd = fd; + workerrec_[iworker].context_addr = context_addr; + workerrec_[iworker].first = NULL; + workerrec_[iworker].last = NULL; + workerrec_[iworker].sessionid_count = 0; + struct timeval tvcreate; + gettimeofday(&tvcreate, NULL); + workerrec_[iworker].context_createtime = tvcreate; + pthread_mutex_unlock(mutex_workerrec_); + } else + { + workerrec_[iworker].busy = 0; + } + + if (ta_path_size >= context_tapath_outsize) + { + ta_path_size = context_tapath_outsize; + charp = ta_path; + } else + { + ta_path_size = 0; + charp = NULL; + } + inicont_reply.set_teecresult(teecresult); + inicont_reply.set_context_fd(fd); + inicont_reply.set_context_tapath_outsize(ta_path_size); + + if (ta_path_size > 0 && + charp != NULL && + strlen((const char *) charp) > 0 + ) + { + charpp = (const char *) charp; + if (utf8_check_is_valid(charpp)) + { + ta_path_size = strlen((const char *) charp); + } else + { + ta_path_size = 0; + } + } else + { + ta_path_size = 0; + } + if (ta_path_size > 0) + { + inicont_reply.set_context_tapath(charpp); + } + + inicont_reply.set_context_sessionlist_next(session_list_next); + inicont_reply.set_context_sessionlist_prev(session_list_prev); + inicont_reply.set_context_shrdmemlist_prev(shrd_mem_list_prev); + inicont_reply.set_context_shrdmemlist_next(shrd_mem_list_next); + inicont_reply.set_context_sharebuffer_buffer(share_buffer_buffer); + inicont_reply.set_context_sharebuffer_bufferbarrier(share_buffer_buffer_barrier); + inicont_reply.set_context_addr(context_addr); + + status_ = FINISH; + gettimeofday(&end, NULL); + int64_t i64Time; + i64Time = (end.tv_sec - start.tv_sec) * 1000000 + + (end.tv_usec - start.tv_usec); + printf("gpp initcont used time: %ld us. \n", i64Time); + + inicont_response.Finish(inicont_reply, Status::OK, this); + } else + { + std::cout << "gpp receive no initcont jwtsvid or validate jwt failed" << std::endl; + flag = 2; + inicont_reply.set_flag(flag); + status_ = FINISH; + + inicont_response.Finish(inicont_reply, Status::OK, this); + } + break; + } + + case ServerImpl::CallData::SS_TEECC_FinalizeContext: + { + struct timeval start, end, jwt_validate_start, jwt_validate_end; + gettimeofday(&start, NULL); + + std::int32_t in_context_fd; + std::string in_context_tapath; + const uint8_t *in_context_tapath_temp = NULL; + std::int32_t in_context_tapath_size; + unsigned char *charp = NULL; + std::string charpp; + std::uint64_t in_context_sessionlist_next; + std::uint64_t in_context_sessionlist_prev; + std::uint64_t in_context_shrdmemlist_next; + std::uint64_t in_context_shrdmemlist_prev; + std::uint64_t in_context_sharebuffer_buffer; + std::int64_t in_context_sharebuffer_bufferbarrier; + std::uint64_t in_context_addr; + + std::uint32_t teecresult; + std::int32_t fd; + + unsigned char *ta_path = NULL; + std::int32_t ta_path_size = 0; + + std::uint64_t session_list_next; + std::uint64_t session_list_prev; + std::uint64_t shrd_mem_list_next; + std::uint64_t shrd_mem_list_prev; + std::uint64_t share_buffer_buffer; + std::int64_t share_buffer_buffer_barrier; + + std::uint32_t serial = 0; + std::int32_t flag = 0; + std::string token; + token = fincont_request.token(); + std::string noToken("noToken"); + int ivaljwtResult = -1; + int iforceValidateJwt = global_force_valideta_jwt; + if + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + ) + { + char Token[1024]; + strcpy(Token, (char *) token.data()); + + gettimeofday(&jwt_validate_start, NULL); + ivaljwtResult = + dbusmethodcall_validate_jwt( + Token + ); + gettimeofday(&jwt_validate_end, NULL); + int64_t i64Time_jwt; + i64Time_jwt = (jwt_validate_end.tv_sec - jwt_validate_start.tv_sec) * 1000000 + + (jwt_validate_end.tv_usec - jwt_validate_start.tv_usec); + printf("gpp finacont validate jwt used time: %ld us. \n", i64Time_jwt); + + std::cout << "gpp validate finacont jwtsvid" << std::endl; + } else + { + std::cout << "gpp no validate finacont jwtsvid" << std::endl; + } + + if + ( + iforceValidateJwt != 1 + || + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + && + ivaljwtResult == NO_ERROR + ) + ) + { + std::cout << "gpp does not need validate finacont jwtsvid or validate jwt succed" << std::endl; + std::cout << "gpp received fincontext" << std::endl; + in_context_fd = fincont_request.in_context_fd(); + in_context_tapath_size = fincont_request.in_context_tapath_size(); + if (in_context_tapath_size > 0) + { + in_context_tapath = fincont_request.in_context_tapath(); + in_context_tapath_temp = reinterpret_cast(in_context_tapath.c_str()); + std::cout << "gpp received in_context_tapath_temp: " << in_context_tapath_temp + << std::endl; + } + + std::cout << "gpp received in_context_fd: " << in_context_fd << std::endl; + in_context_sessionlist_next = fincont_request.in_context_sessionlist_next(); + in_context_sessionlist_prev = fincont_request.in_context_sessionlist_prev(); + in_context_shrdmemlist_next = fincont_request.in_context_shrdmemlist_next(); + in_context_shrdmemlist_prev = fincont_request.in_context_shrdmemlist_prev(); + in_context_sharebuffer_buffer = fincont_request.in_context_shrdmemlist_prev(); + in_context_sharebuffer_bufferbarrier = fincont_request.in_context_sharebuffer_bufferbarrier(); + in_context_addr = fincont_request.in_context_addr(); + + + ta_path = (unsigned char *) malloc(1024 * sizeof(char)); + ta_path_size = 1024; + memset((char *) ta_path, 0, 1024); + uint32_t context_tapath_outsize; + + char workername[1024]; + memset((char *) workername, 0, 1024); + int ifound = 0; + int iworker; + pthread_mutex_lock(mutex_workerrec_); + for (iworker = 0; iworker < global_max_num_worker; iworker++) + { + if (workerrec_[iworker].context_fd == in_context_fd && + workerrec_[iworker].context_addr == in_context_addr + ) + { + sprintf(workername, "%s%d", "gpworker", iworker); + std::cout << "gpp method call worker No: " << std::dec << iworker << std::endl; + ifound = 1; + break; + } + } + pthread_mutex_unlock(mutex_workerrec_); + + if (ifound == 0) + { + printf("gpp can't find the worker for the context. \n"); + + fd = 0; + ta_path_size = 0; + charp = NULL; + session_list_prev = 0; + shrd_mem_list_next = 0; + shrd_mem_list_prev = 0; + share_buffer_buffer = 0; + share_buffer_buffer_barrier = 0; + + fincont_reply.set_context_fd(fd); + fincont_reply.set_context_tapath_outsize(ta_path_size); + fincont_reply.set_context_sessionlist_prev(session_list_prev); + fincont_reply.set_context_shrdmemlist_prev(shrd_mem_list_prev); + fincont_reply.set_context_shrdmemlist_next(shrd_mem_list_next); + fincont_reply.set_context_sharebuffer_buffer(share_buffer_buffer); + fincont_reply.set_context_sharebuffer_bufferbarrier(share_buffer_buffer_barrier); + + status_ = FINISH; + + fincont_response.Finish(fincont_reply, Status::OK, this); + } else + { + pthread_mutex_unlock(mutex_workerrec_); + sin_t *sinIns = NULL; + sin_t *sinInsPrev = NULL; + sinIns = workerrec_[iworker].last; + if (sinIns != NULL) + { + uint32_t in_session_seesionid; + uint32_t in_session_serviceid_timelow = 0; + uint32_t in_session_serviceid_timemid = 0; + uint32_t in_session_serviceid_timehiandver = 0; + uint32_t in_session_serviceid_clockseqandnode_size = 8; + uint32_t in_session_serviceid_clockseqandnode[8]; + uint32_t in_session_opscnt = 0; + uint64_t in_session_head_next = 0; + uint64_t in_session_head_prev = 0; + uint64_t in_session_context; + + uint32_t seesionid; + uint32_t serviceid_timelow; + uint32_t serviceid_timemid; + uint32_t serviceid_timehiandver; + uint32_t *serviceid_clockseqandnode; + int serviceid_clockseqandnode_realsize; + uint32_t opscnt; + uint64_t head_next; + uint64_t head_prev; + uint64_t session_context; + + for (;;) + { + in_session_seesionid = sinIns->session_id; + in_session_context = workerrec_[iworker].context_addr; + + pthread_mutex_unlock(mutex_workerrec_); + + for (int iind = 0; iind < 8; iind++) + { + in_session_serviceid_clockseqandnode[iind] = 0; + } + + uint32_t serviceid_clockseqandnode_outsize_temp; + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(uint32_t) + ); + + printf("\ngpp self method call teec closesession before finalizecontext \n"); + method_call_teec_closesession( + workername, + + in_session_seesionid, + in_session_serviceid_timelow, + in_session_serviceid_timemid, + in_session_serviceid_timehiandver, + in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_size, + in_session_opscnt, + in_session_head_next, + in_session_head_prev, + in_session_context, + + &seesionid, + &serviceid_timelow, + &serviceid_timemid, + &serviceid_timehiandver, + serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize, + &serviceid_clockseqandnode_outsize_temp, + &opscnt, + &head_next, + &head_prev, + &session_context + ); + + if (serviceid_clockseqandnode != NULL) + { + free(serviceid_clockseqandnode); + } + + pthread_mutex_lock(mutex_workerrec_); + + sinInsPrev = sinIns->prev; + free(sinIns); + if (sinInsPrev == NULL) + { + break; + } + sinIns = sinInsPrev; + } + } + pthread_mutex_unlock(mutex_workerrec_); + + method_call_teec_fincont( + workername, + + in_context_fd, + in_context_tapath_temp, + in_context_tapath_size, + in_context_sessionlist_next, + in_context_sessionlist_prev, + in_context_shrdmemlist_next, + in_context_shrdmemlist_prev, + in_context_sharebuffer_buffer, + in_context_sharebuffer_bufferbarrier, + in_context_addr, + + &fd, + ta_path, + ta_path_size, + &session_list_next, + &session_list_prev, + &shrd_mem_list_next, + &shrd_mem_list_prev, + &share_buffer_buffer, + &share_buffer_buffer_barrier, + &context_tapath_outsize + ); + + pthread_mutex_lock(mutex_workerrec_); + workerrec_[iworker].busy = 0; + pthread_cond_signal(cond_notbusy_); + workerrec_[iworker].context_fd = 0; + workerrec_[iworker].context_addr = 0xffffffff; + workerrec_[iworker].sessionid_count = 0; + workerrec_[iworker].first = NULL; + workerrec_[iworker].last = NULL; + pthread_mutex_unlock(mutex_workerrec_); + + if (ta_path_size >= context_tapath_outsize) + { + ta_path_size = context_tapath_outsize; + charp = ta_path; + } else + { + ta_path_size = 0; + charp = NULL; + } + fincont_reply.set_context_fd(fd); + fincont_reply.set_context_tapath_outsize(ta_path_size); + + if (ta_path_size > 0 && + charp != NULL && + strlen((const char *) charp) > 0 + ) + { + charpp = (const char *) charp; + if (utf8_check_is_valid(charpp)) + { + ta_path_size = strlen((const char *) charp); + } else + { + ta_path_size = 0; + } + } else + { + ta_path_size = 0; + } + if (ta_path_size > 0) + { + fincont_reply.set_context_tapath(charpp); + } + + fincont_reply.set_context_sessionlist_next(session_list_next); + fincont_reply.set_context_sessionlist_prev(session_list_prev); + fincont_reply.set_context_shrdmemlist_prev(shrd_mem_list_prev); + fincont_reply.set_context_shrdmemlist_next(shrd_mem_list_next); + fincont_reply.set_context_sharebuffer_buffer(share_buffer_buffer); + fincont_reply.set_context_sharebuffer_bufferbarrier(share_buffer_buffer_barrier); + + status_ = FINISH; + gettimeofday(&end, NULL); + int64_t i64Time; + i64Time = (end.tv_sec - start.tv_sec) * 1000000 + + (end.tv_usec - start.tv_usec); + printf("gpp finalcontext used time: %ld us. \n", i64Time); + + fincont_response.Finish(fincont_reply, Status::OK, this); + } + }else + { + std::cout << "gpp receive no finacont jwtsvid or validate jwt failed" << std::endl; + flag = 2; + fincont_reply.set_flag(flag); + status_ = FINISH; + fincont_response.Finish(fincont_reply, Status::OK, this); + } + break; + } + + case ServerImpl::CallData::SS_TEECC_OpenSession: + { + struct timeval start, end, jwt_validate_start, jwt_validate_end; + gettimeofday(&start, NULL); + + std::int32_t in_context_fd; + std::string in_context_tapath; + const uint8_t *in_context_tapath_temp = NULL; + std::int32_t in_context_tapath_size; + unsigned char *charp = NULL; + std::string charpp; + std::uint64_t in_context_sessionlist_next; + std::uint64_t in_context_sessionlist_prev; + std::uint64_t in_context_shrdmemlist_next; + std::uint64_t in_context_shrdmemlist_prev; + std::uint64_t in_context_sharebuffer_buffer; + std::int64_t in_context_sharebuffer_bufferbarrier; + + std::uint32_t teecresult; + std::int32_t fd; + + std::uint32_t in_destination_timelow; + std::uint32_t in_destination_timemid; + std::uint32_t in_destination_timehiandver; + + std::uint32_t in_connectionmethod; + std::uint64_t in_connectiondata; + std::uint32_t in_operation_started; + std::uint32_t in_operation_paramtypes; + std::int32_t in_destination_clockseqandnode_size; + std::uint32_t *in_destination_clockseqandnode; + + std::uint64_t in_operation_param1_tmpref_buffer; + std::uint32_t in_operation_param1_tmpref_size; + std::uint64_t in_operation_param1_memref_parent; + std::uint32_t in_operation_param1_memref_size; + std::uint32_t in_operation_param1_memref_offset; + std::uint32_t in_operation_param1_value_a; + std::uint32_t in_operation_param1_value_b; + std::int32_t in_operation_param1_ionref_ionsharefd; + std::uint32_t in_operation_param1_ionref_ionsize; + + std::uint64_t in_operation_param2_tmpref_buffer; + std::uint32_t in_operation_param2_tmpref_size; + std::uint64_t in_operation_param2_memref_parent; + std::uint32_t in_operation_param2_memref_size; + std::uint32_t in_operation_param2_memref_offset; + std::uint32_t in_operation_param2_value_a; + std::uint32_t in_operation_param2_value_b; + std::int32_t in_operation_param2_ionref_ionsharefd; + std::uint32_t in_operation_param2_ionref_ionsize; + + std::uint64_t in_operation_param3_tmpref_buffer; + std::uint32_t in_operation_param3_tmpref_size; + std::uint64_t in_operation_param3_memref_parent; + std::uint32_t in_operation_param3_memref_size; + std::uint32_t in_operation_param3_memref_offset; + std::uint32_t in_operation_param3_value_a; + std::uint32_t in_operation_param3_value_b; + std::int32_t in_operation_param3_ionref_ionsharefd; + std::uint32_t in_operation_param3_ionref_ionsize; + + std::uint64_t in_operation_param4_tmpref_buffer; + std::uint32_t in_operation_param4_tmpref_size; + std::uint64_t in_operation_param4_memref_parent; + std::uint32_t in_operation_param4_memref_size; + std::uint32_t in_operation_param4_memref_offset; + std::uint32_t in_operation_param4_value_a; + std::uint32_t in_operation_param4_value_b; + std::int32_t in_operation_param4_ionref_ionsharefd; + std::uint32_t in_operation_param4_ionref_ionsize; + + std::uint64_t in_operation_session; + std::int32_t in_operation_cancelflag; + std::uint32_t in_returnorigin; + + std::uint64_t in_context_addr; + + unsigned char *ta_path = NULL; + std::int32_t ta_path_size = 0; + + std::uint64_t session_list_next; + std::uint64_t session_list_prev; + std::uint64_t shrd_mem_list_next; + std::uint64_t shrd_mem_list_prev; + std::uint64_t share_buffer_buffer; + std::int64_t share_buffer_buffer_barrier; + + std::uint32_t sessionid; + std::uint32_t serviceid_timelow; + std::uint32_t serviceid_timemid; + std::uint32_t serviceid_timehiandver; + std::uint32_t *serviceid_clockseqandnode; + int serviceid_clockseqandnode_realsize; + std::int32_t serviceid_clockseqandnode_outsize; + std::uint32_t opscnt; + std::uint64_t head_next; + std::uint64_t head_prev; + std::uint64_t session_context; + std::uint32_t started; + std::uint32_t paramtypes; + std::uint64_t operation_param1_tmpref_buffer; + std::uint32_t operation_param1_tmpref_size; + std::uint64_t operation_param1_memref_parent; + std::uint32_t operation_param1_memref_size; + std::uint32_t operation_param1_memref_offset; + std::uint32_t operation_param1_value_a; + std::uint32_t operation_param1_value_b; + std::int32_t operation_param1_ionref_ionsharefd; + std::uint32_t operation_param1_ionref_ionsize; + std::uint64_t operation_param2_tmpref_buffer; + std::uint32_t operation_param2_tmpref_size; + std::uint64_t operation_param2_memref_parent; + std::uint32_t operation_param2_memref_size; + std::uint32_t operation_param2_memref_offset; + std::uint32_t operation_param2_value_a; + std::uint32_t operation_param2_value_b; + std::int32_t operation_param2_ionref_ionsharefd; + std::uint32_t operation_param2_ionref_ionsize; + std::uint64_t operation_param3_tmpref_buffer; + std::uint32_t operation_param3_tmpref_size; + std::uint64_t operation_param3_memref_parent; + std::uint32_t operation_param3_memref_size; + std::uint32_t operation_param3_memref_offset; + std::uint32_t operation_param3_value_a; + std::uint32_t operation_param3_value_b; + std::int32_t operation_param3_ionref_ionsharefd; + std::uint32_t operation_param3_ionref_ionsize; + std::uint64_t operation_param4_tmpref_buffer; + std::uint32_t operation_param4_tmpref_size; + std::uint64_t operation_param4_memref_parent; + std::uint32_t operation_param4_memref_size; + std::uint32_t operation_param4_memref_offset; + std::uint32_t operation_param4_value_a; + std::uint32_t operation_param4_value_b; + std::int32_t operation_param4_ionref_ionsharefd; + std::uint32_t operation_param4_ionref_ionsize; + std::uint64_t operation_session; + std::int32_t operation_cancelflag; + std::uint32_t returnorigin; + + std::uint32_t serial = 0; + std::int32_t flag = 0; + std::string token; + token = opes_request.token(); + + std::string noToken("noToken"); + + int ivaljwtResult = -1; + int iforceValidateJwt = global_force_valideta_jwt; + + if + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + ) + { + char Token[1024]; + strcpy(Token, (char *) token.data()); + gettimeofday(&jwt_validate_start, NULL); + ivaljwtResult = + dbusmethodcall_validate_jwt( + Token + ); + gettimeofday(&jwt_validate_end, NULL); + int64_t i64Time_jwt; + i64Time_jwt = (jwt_validate_end.tv_sec - jwt_validate_start.tv_sec) * 1000000 + + (jwt_validate_end.tv_usec - jwt_validate_start.tv_usec); + printf("gpp opensession validate jwt used time: %ld us. \n", i64Time_jwt); + std::cout << "gpp validate opensession jwtsvid" << std::endl; + } else + { + std::cout << "gpp no validate opensession jwtsvid" << std::endl; + } + + if + ( + iforceValidateJwt != 1 + || + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + && + ivaljwtResult == NO_ERROR + ) + ) + { + std::cout << "gpp does not need validate opensession jwtsvid or validate jwt succed" + << std::endl; + std::cout << "gpp received OpenSession" << std::endl; + in_context_fd = opes_request.in_context_fd(); + in_context_tapath_size = opes_request.in_context_tapath_size(); + if (in_context_tapath_size > 0) + { + in_context_tapath = opes_request.in_context_tapath(); + in_context_tapath_temp = reinterpret_cast(in_context_tapath.c_str()); + std::cout << "gpp received in_context_tapath_temp: " << in_context_tapath_temp + << std::endl; + } + std::cout << "gpp received in_context_fd: " << std::dec << in_context_fd + << std::endl; + std::cout << "gpp received in_context_tapath_size: " << std::dec + << in_context_tapath_size + << std::endl; + in_context_sessionlist_next = opes_request.in_context_sessionlist_next(); + in_context_sessionlist_prev = opes_request.in_context_sessionlist_prev(); + in_context_shrdmemlist_next = opes_request.in_context_shrdmemlist_next(); + in_context_shrdmemlist_prev = opes_request.in_context_shrdmemlist_prev(); + in_context_sharebuffer_buffer = opes_request.in_context_shrdmemlist_prev(); + in_context_sharebuffer_bufferbarrier = opes_request.in_context_sharebuffer_bufferbarrier(); + in_destination_timelow = opes_request.in_destination_timelow(); + in_destination_timemid = opes_request.in_destination_timemid(); + + in_destination_timehiandver = opes_request.in_destination_timehiandver(); + in_destination_clockseqandnode_size = opes_request.in_destination_clockseqandnode_size(); + if (in_destination_clockseqandnode_size > 0) + { + in_destination_clockseqandnode = new uint32_t[in_destination_clockseqandnode_size]; + for (int i = 0; i < in_destination_clockseqandnode_size; i++) + { + in_destination_clockseqandnode[i] = opes_request.in_destination_clockseqandnode( + i); + } + } + + in_connectionmethod = opes_request.in_connectionmethod(); + in_connectiondata = opes_request.in_connectiondata(); + in_operation_started = opes_request.in_operation_started(); + in_operation_paramtypes = opes_request.in_operation_paramtypes(); + in_operation_param1_tmpref_buffer = opes_request.in_operation_param1_tmpref_buffer(); + in_operation_param1_tmpref_size = opes_request.in_operation_param1_tmpref_size(); + in_operation_param1_memref_parent = opes_request.in_operation_param1_memref_parent(); + in_operation_param1_memref_size = opes_request.in_operation_param1_memref_size(); + in_operation_param1_memref_offset = opes_request.in_operation_param1_memref_offset(); + in_operation_param1_value_a = opes_request.in_operation_param1_value_a(); + in_operation_param1_value_b = opes_request.in_operation_param1_value_b(); + in_operation_param1_ionref_ionsharefd = opes_request.in_operation_param1_ionref_ionsharefd(); + in_operation_param1_ionref_ionsize = opes_request.in_operation_param1_ionref_ionsize(); + + in_operation_param2_tmpref_buffer = opes_request.in_operation_param2_tmpref_buffer(); + in_operation_param2_tmpref_size = opes_request.in_operation_param2_tmpref_size(); + in_operation_param2_memref_parent = opes_request.in_operation_param2_memref_parent(); + in_operation_param2_memref_size = opes_request.in_operation_param2_memref_size(); + in_operation_param2_memref_offset = opes_request.in_operation_param2_memref_offset(); + in_operation_param2_value_a = opes_request.in_operation_param2_value_a(); + in_operation_param2_value_b = opes_request.in_operation_param2_value_b(); + in_operation_param2_ionref_ionsharefd = opes_request.in_operation_param2_ionref_ionsharefd(); + in_operation_param2_ionref_ionsize = opes_request.in_operation_param2_ionref_ionsize(); + + in_operation_param3_tmpref_buffer = opes_request.in_operation_param3_tmpref_buffer(); + in_operation_param3_tmpref_size = opes_request.in_operation_param3_tmpref_size(); + in_operation_param3_memref_parent = opes_request.in_operation_param3_memref_parent(); + in_operation_param3_memref_size = opes_request.in_operation_param3_memref_size(); + in_operation_param3_memref_offset = opes_request.in_operation_param3_memref_offset(); + in_operation_param3_value_a = opes_request.in_operation_param3_value_a(); + in_operation_param3_value_b = opes_request.in_operation_param3_value_b(); + in_operation_param3_ionref_ionsharefd = opes_request.in_operation_param3_ionref_ionsharefd(); + in_operation_param3_ionref_ionsize = opes_request.in_operation_param3_ionref_ionsize(); + + in_operation_param4_tmpref_buffer = opes_request.in_operation_param4_tmpref_buffer(); + in_operation_param4_tmpref_size = opes_request.in_operation_param4_tmpref_size(); + in_operation_param4_memref_parent = opes_request.in_operation_param4_memref_parent(); + in_operation_param4_memref_size = opes_request.in_operation_param4_memref_size(); + in_operation_param4_memref_offset = opes_request.in_operation_param4_memref_offset(); + in_operation_param4_value_a = opes_request.in_operation_param4_value_a(); + in_operation_param4_value_b = opes_request.in_operation_param4_value_b(); + in_operation_param4_ionref_ionsharefd = opes_request.in_operation_param4_ionref_ionsharefd(); + in_operation_param4_ionref_ionsize = opes_request.in_operation_param4_ionref_ionsize(); + + in_operation_session = opes_request.in_operation_session(); + in_operation_cancelflag = opes_request.in_operation_cancelflag(); + in_returnorigin = opes_request.in_returnorigin(); + in_context_addr = opes_request.in_context_addr(); +#if 0 + printf(" in_session_list_next = 0x %16.16lx \n", in_context_sessionlist_next); + printf(" in_session_list_prev = 0x %16.16lx \n", in_context_sessionlist_prev); + printf(" in_shrd_mem_list_next = 0x %16.16lx \n", in_context_shrdmemlist_next); + printf(" in_shrd_mem_list_prev = 0x %16.16lx \n", in_context_shrdmemlist_prev); + printf(" in_share_buffer_buffer = 0x %16.16lx \n", in_context_sharebuffer_buffer); + printf(" in_share_buffer_buffer_barrier = 0x %16.16lx \n", in_context_sharebuffer_bufferbarrier); + + printf(" in_destination_timelow = 0x %8.8x \n", in_destination_timelow); + printf(" in_destination_timemid = 0x %8.8x \n", in_destination_timemid); + printf(" in_destination_timehiandver = 0x %8.8x \n", in_destination_timehiandver); + if ( in_destination_clockseqandnode_size > 0 ) + { + printf(" in_destination_clockseqandnode = \n"); + printf(" "); + for (int i = 0; i < in_destination_clockseqandnode_size; i++) { + printf(" %8.8x", in_destination_clockseqandnode[i]); + } + printf("\n"); + } + else + { + printf(" in_destination_clockseqandnode addr = 0x %16.16lx \n", + (long unsigned int)in_destination_clockseqandnode + ); + } + printf(" in_destination_clockseqandnode_size = 0x %8.8x \n", in_destination_clockseqandnode_size); + + printf(" in_connectionmethod = 0x %8.8x \n", in_connectionmethod); + printf(" in_connectiondata = 0x %16.16lx \n", in_connectiondata); + + printf(" in_operation_started = 0x %8.8x \n", in_operation_started); + printf(" in_operation_paramtypes = 0x %8.8x \n", in_operation_paramtypes); + + printf(" in_operation_param1_tmpref_buffer = 0x %16.16lx \n", in_operation_param1_tmpref_buffer); + printf(" in_operation_param1_tmpref_size = 0x %8.8x \n", in_operation_param1_tmpref_size); + printf(" in_operation_param1_memref_parent = 0x %16.16lx \n", in_operation_param1_memref_parent); + printf(" in_operation_param1_memref_size = 0x %8.8x \n", in_operation_param1_memref_size); + printf(" in_operation_param1_memref_offset = 0x %8.8x \n", in_operation_param1_memref_offset); + printf(" in_operation_param1_value_a = 0x %8.8x \n", in_operation_param1_value_a); + printf(" in_operation_param1_value_b = 0x %8.8x \n", in_operation_param1_value_b); + printf(" in_operation_param1_ionref_ionsharefd = 0x %8.8x \n", + in_operation_param1_ionref_ionsharefd); + printf(" in_operation_param1_ionref_ionsize = 0x %8.8x \n", in_operation_param1_ionref_ionsize); + + printf(" in_operation_param2_tmpref_buffer = 0x %16.16lx \n", in_operation_param2_tmpref_buffer); + printf(" in_operation_param2_tmpref_size = 0x %8.8x \n", in_operation_param2_tmpref_size); + printf(" in_operation_param2_memref_parent = 0x %16.16lx \n", in_operation_param2_memref_parent); + printf(" in_operation_param2_memref_size = 0x %8.8x \n", in_operation_param2_memref_size); + printf(" in_operation_param2_memref_offset = 0x %8.8x \n", in_operation_param2_memref_offset); + printf(" in_operation_param2_value_a = 0x %8.8x \n", in_operation_param3_value_a); + printf(" in_operation_param2_value_b = 0x %8.8x \n", in_operation_param3_value_b); + printf(" in_operation_param2_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); + printf(" in_operation_param2_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); + + printf(" in_operation_param3_tmpref_buffer = 0x %16.16lx \n", in_operation_param3_tmpref_buffer); + printf(" in_operation_param3_tmpref_size = 0x %8.8x \n", in_operation_param3_tmpref_size); + printf(" in_operation_param3_memref_parent = 0x %16.16lx \n", in_operation_param3_memref_parent); + printf(" in_operation_param3_memref_size = 0x %8.8x \n", in_operation_param3_memref_size); + printf(" in_operation_param3_memref_offset = 0x %8.8x \n", in_operation_param3_memref_offset); + printf(" in_operation_param3_value_a = 0x %8.8x \n", in_operation_param3_value_a); + printf(" in_operation_param3_value_b = 0x %8.8x \n", in_operation_param3_value_b); + printf(" in_operation_param3_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); + printf(" in_operation_param3_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); + + printf(" in_operation_param4_tmpref_buffer = 0x %16.16lx \n", in_operation_param4_tmpref_buffer); + printf(" in_operation_param4_tmpref_size = 0x %8.8x \n", in_operation_param4_tmpref_size); + printf(" in_operation_param4_memref_parent = 0x %16.16lx \n", in_operation_param4_memref_parent); + printf(" in_operation_param4_memref_size = 0x %8.8x \n", in_operation_param4_memref_size); + printf(" in_operation_param4_memref_offset = 0x %8.8x \n", in_operation_param4_memref_offset); + printf(" in_operation_param4_value_a = 0x %8.8x \n", in_operation_param4_value_a); + printf(" in_operation_param4_value_b = 0x %8.8x \n", in_operation_param4_value_b); + printf(" in_operation_param4_ionref_ionsharefd = 0x %8.8x \n", in_operation_param4_ionref_ionsharefd); + printf(" in_operation_param4_ionref_ionsize = 0x %8.8x \n", in_operation_param4_ionref_ionsize); + + printf(" in_operation_session = 0x %16.16lx \n", in_operation_session); + printf(" in_operation_cancelflag = 0x %8.8x \n", in_operation_cancelflag); + + printf(" in_returnorigin = 0x %8.8x \n", in_returnorigin); +#endif + std::cout << "gpp received in_context_addr: 0x " << std::hex << std::setfill('0') + << std::setw(16) << in_context_addr << std::endl; + ta_path = (unsigned char *) malloc(1024 * sizeof(char)); + ta_path_size = 1024; + memset((char *) ta_path, 0, 1024); + + uint32_t context_tapath_outsize; + uint32_t serviceid_clockseqandnode_outsize_temp; + uint32_t returnorigin_temp; + + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (std::uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(std::uint32_t) + ); + + char workername[1024]; + memset((char *) workername, 0, 1024); + int ifound = 0; + int iworker; + + pthread_mutex_lock(mutex_workerrec_); + for (iworker = 0; iworker < global_max_num_worker; iworker++) + { + if (workerrec_[iworker].context_fd == in_context_fd && + workerrec_[iworker].context_addr == in_context_addr + ) + { + sprintf(workername, "%s%d", "gpworker", iworker); + std::cout << "gpp method call worker No: " << std::dec << iworker << std::endl; + ifound = 1; + break; + } + } + pthread_mutex_unlock(mutex_workerrec_); + if (ifound == 0) + { + printf("gpp can't find the woker for the context. \n"); + + teecresult = 0xAAAA0017; + + fd = 0x0; + ta_path = NULL; + charp = ta_path; + session_list_next = 0x0; + session_list_prev = 0x0; + shrd_mem_list_next = 0x0; + shrd_mem_list_prev = 0x0; + share_buffer_buffer = 0; + share_buffer_buffer_barrier = 0x0; + + sessionid = 0x0; + serviceid_timelow = 0x0; + serviceid_timemid = 0x0; + serviceid_timehiandver = 0x0; + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(uint32_t) + ); + for (int i = 0; i < serviceid_clockseqandnode_realsize; i++) + { + serviceid_clockseqandnode[i] = 0x0; + } + serviceid_clockseqandnode_outsize = 8; + opscnt = 0x0; + head_next = 0x0; + head_prev = 0x0; + session_context = 0x0; + + started = 0x0; + paramtypes = 0x0; + + operation_param1_tmpref_buffer = 0x0; + operation_param1_tmpref_size = 0x0; + operation_param1_memref_parent = 0x0; + operation_param1_memref_size = 0x0; + operation_param1_memref_offset = 0x0; + operation_param1_value_a = 0x0; + operation_param1_value_b = 0x0; + operation_param1_ionref_ionsharefd = 0x0; + operation_param1_ionref_ionsize = 0x0; + + operation_param2_tmpref_buffer = 0x0; + operation_param2_tmpref_size = 0x0; + operation_param2_memref_parent = 0x0; + operation_param2_memref_size = 0x0; + operation_param2_memref_offset = 0x0; + operation_param2_value_a = 0x0; + operation_param2_value_b = 0x0; + operation_param2_ionref_ionsharefd = 0x0; + operation_param2_ionref_ionsize = 0x0; + + operation_param3_tmpref_buffer = 0x0; + operation_param3_tmpref_size = 0x0; + operation_param3_memref_parent = 0x0; + operation_param3_memref_size = 0x0; + operation_param3_memref_offset = 0x0; + operation_param3_value_a = 0x0; + operation_param3_value_b = 0x0; + operation_param3_ionref_ionsharefd = 0x0; + operation_param3_ionref_ionsize = 0x0; + + operation_param4_tmpref_buffer = 0x0; + operation_param4_tmpref_size = 0x0; + operation_param4_memref_parent = 0x0; + operation_param4_memref_size = 0x0; + operation_param4_memref_offset = 0x0; + operation_param4_value_a = 0x0; + operation_param4_value_b = 0x0; + operation_param4_ionref_ionsharefd = 0x0; + operation_param4_ionref_ionsize = 0x0; + + operation_session = 0x0; + operation_cancelflag = 0x0; + + returnorigin = 0x0; + + opes_reply.set_teecresult(teecresult); + opes_reply.set_context_fd(fd); + opes_reply.set_context_tapath_outsize(ta_path_size); + opes_reply.set_context_sessionlist_next(session_list_next); + opes_reply.set_context_sessionlist_prev(session_list_prev); + opes_reply.set_context_shrdmemlist_prev(shrd_mem_list_prev); + opes_reply.set_context_shrdmemlist_next(shrd_mem_list_next); + opes_reply.set_context_sharebuffer_buffer(share_buffer_buffer); + opes_reply.set_context_sharebuffer_bufferbarrier(share_buffer_buffer_barrier); + opes_reply.set_session_sessionid(sessionid); + opes_reply.set_session_serviceid_timelow(serviceid_timelow); + opes_reply.set_session_serviceid_timemid(serviceid_timemid); + opes_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); + opes_reply.set_session_serviceid_clockseqandnode_outsize( + serviceid_clockseqandnode_outsize); + if (serviceid_clockseqandnode_outsize > 0 && + serviceid_clockseqandnode != NULL + ) + { + for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) + opes_reply.add_session_serviceid_clockseqandnode( + serviceid_clockseqandnode[i]); + } + opes_reply.set_session_opscnt(opscnt); + opes_reply.set_session_head_next(head_next); + opes_reply.set_session_head_prev(head_prev); + opes_reply.set_session_context(session_context); + opes_reply.set_operation_started(started); + opes_reply.set_operation_paramtypes(paramtypes); + opes_reply.set_operation_param1_tmpref_buffer(operation_param1_tmpref_buffer); + opes_reply.set_operation_param1_tmpref_size(operation_param1_tmpref_size); + opes_reply.set_operation_param1_memref_parent(operation_param1_memref_parent); + opes_reply.set_operation_param1_memref_size(operation_param1_memref_size); + opes_reply.set_operation_param1_memref_offset(operation_param1_memref_offset); + opes_reply.set_operation_param1_value_a(operation_param1_value_a); + opes_reply.set_operation_param1_value_b(operation_param1_value_b); + opes_reply.set_operation_param1_ionref_ionsharefd( + operation_param1_ionref_ionsharefd); + opes_reply.set_operation_param1_ionref_ionsize(operation_param1_ionref_ionsize); + + opes_reply.set_operation_param2_tmpref_buffer(operation_param2_tmpref_buffer); + opes_reply.set_operation_param2_tmpref_size(operation_param2_tmpref_size); + opes_reply.set_operation_param2_memref_parent(operation_param2_memref_parent); + opes_reply.set_operation_param2_memref_size(operation_param2_memref_size); + opes_reply.set_operation_param2_memref_offset(operation_param2_memref_offset); + opes_reply.set_operation_param2_value_a(operation_param2_value_a); + opes_reply.set_operation_param2_value_b(operation_param2_value_b); + opes_reply.set_operation_param2_ionref_ionsharefd( + operation_param2_ionref_ionsharefd); + opes_reply.set_operation_param2_ionref_ionsize(operation_param2_ionref_ionsize); + + opes_reply.set_operation_param3_tmpref_buffer(operation_param3_tmpref_buffer); + opes_reply.set_operation_param3_tmpref_size(operation_param3_tmpref_size); + opes_reply.set_operation_param3_memref_parent(operation_param3_memref_parent); + opes_reply.set_operation_param3_memref_size(operation_param3_memref_size); + opes_reply.set_operation_param3_memref_offset(operation_param3_memref_offset); + opes_reply.set_operation_param3_value_a(operation_param3_value_a); + opes_reply.set_operation_param3_value_b(operation_param3_value_b); + opes_reply.set_operation_param3_ionref_ionsharefd( + operation_param3_ionref_ionsharefd); + opes_reply.set_operation_param3_ionref_ionsize(operation_param3_ionref_ionsize); + + opes_reply.set_operation_param4_tmpref_buffer(operation_param4_tmpref_buffer); + opes_reply.set_operation_param4_tmpref_size(operation_param4_tmpref_size); + opes_reply.set_operation_param4_memref_parent(operation_param4_memref_parent); + opes_reply.set_operation_param4_memref_size(operation_param4_memref_size); + opes_reply.set_operation_param4_memref_offset(operation_param4_memref_offset); + opes_reply.set_operation_param4_value_a(operation_param4_value_a); + opes_reply.set_operation_param4_value_b(operation_param4_value_b); + opes_reply.set_operation_param4_ionref_ionsharefd( + operation_param4_ionref_ionsharefd); + opes_reply.set_operation_param4_ionref_ionsize(operation_param4_ionref_ionsize); + + opes_reply.set_operation_session(operation_session); + opes_reply.set_operation_cancelflag(operation_cancelflag); + opes_reply.set_returnorigin(returnorigin); + + status_ = FINISH; + + opes_response.Finish(opes_reply, Status::OK, this); + } else + { + method_call_teec_opensession( + workername, + + in_context_fd, + in_context_tapath_temp, + in_context_tapath_size, + in_context_sessionlist_next, + in_context_sessionlist_prev, + in_context_shrdmemlist_next, + in_context_shrdmemlist_prev, + in_context_sharebuffer_buffer, + in_context_sharebuffer_bufferbarrier, + + in_destination_timelow, + in_destination_timemid, + in_destination_timehiandver, + in_destination_clockseqandnode, + in_destination_clockseqandnode_size, + + in_connectionmethod, + in_connectiondata, + + in_operation_started, + in_operation_paramtypes, + + in_operation_param1_tmpref_buffer, + in_operation_param1_tmpref_size, + in_operation_param1_memref_parent, + in_operation_param1_memref_size, + in_operation_param1_memref_offset, + in_operation_param1_value_a, + in_operation_param1_value_b, + in_operation_param1_ionref_ionsharefd, + in_operation_param1_ionref_ionsize, + + in_operation_param2_tmpref_buffer, + in_operation_param2_tmpref_size, + in_operation_param2_memref_parent, + in_operation_param2_memref_size, + in_operation_param2_memref_offset, + in_operation_param2_value_a, + in_operation_param2_value_b, + in_operation_param2_ionref_ionsharefd, + in_operation_param2_ionref_ionsize, + + in_operation_param3_tmpref_buffer, + in_operation_param3_tmpref_size, + in_operation_param3_memref_parent, + in_operation_param3_memref_size, + in_operation_param3_memref_offset, + in_operation_param3_value_a, + in_operation_param3_value_b, + in_operation_param3_ionref_ionsharefd, + in_operation_param3_ionref_ionsize, + + in_operation_param4_tmpref_buffer, + in_operation_param4_tmpref_size, + in_operation_param4_memref_parent, + in_operation_param4_memref_size, + in_operation_param4_memref_offset, + in_operation_param4_value_a, + in_operation_param4_value_b, + in_operation_param4_ionref_ionsharefd, + in_operation_param4_ionref_ionsize, + + in_operation_session, + in_operation_cancelflag, + + in_returnorigin, + + in_context_addr, + + + &teecresult, + + &fd, + ta_path, + ta_path_size, + &context_tapath_outsize, + &session_list_next, + &session_list_prev, + &shrd_mem_list_next, + &shrd_mem_list_prev, + &share_buffer_buffer, + &share_buffer_buffer_barrier, + + &sessionid, + &serviceid_timelow, + &serviceid_timemid, + &serviceid_timehiandver, + serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize, + &serviceid_clockseqandnode_outsize_temp, + &opscnt, + &head_next, + &head_prev, + &session_context, + + &started, + ¶mtypes, + + &operation_param1_tmpref_buffer, + &operation_param1_tmpref_size, + &operation_param1_memref_parent, + &operation_param1_memref_size, + &operation_param1_memref_offset, + &operation_param1_value_a, + &operation_param1_value_b, + &operation_param1_ionref_ionsharefd, + &operation_param1_ionref_ionsize, + + &operation_param2_tmpref_buffer, + &operation_param2_tmpref_size, + &operation_param2_memref_parent, + &operation_param2_memref_size, + &operation_param2_memref_offset, + &operation_param2_value_a, + &operation_param2_value_b, + &operation_param2_ionref_ionsharefd, + &operation_param2_ionref_ionsize, + + &operation_param3_tmpref_buffer, + &operation_param3_tmpref_size, + &operation_param3_memref_parent, + &operation_param3_memref_size, + &operation_param3_memref_offset, + &operation_param3_value_a, + &operation_param3_value_b, + &operation_param3_ionref_ionsharefd, + &operation_param3_ionref_ionsize, + + &operation_param4_tmpref_buffer, + &operation_param4_tmpref_size, + &operation_param4_memref_parent, + &operation_param4_memref_size, + &operation_param4_memref_offset, + &operation_param4_value_a, + &operation_param4_value_b, + &operation_param4_ionref_ionsharefd, + &operation_param4_ionref_ionsize, + + &operation_session, + &operation_cancelflag, + + &returnorigin_temp + ); + if (teecresult == 0) + { + pthread_mutex_lock(mutex_workerrec_); + sin_t *sinIns = (sin_t *) malloc(sizeof(sin_t)); + sinIns->session_id = sessionid; + struct timeval tvcreate; + gettimeofday(&tvcreate, NULL); + sinIns->session_createtime = tvcreate; + workerrec_[iworker].context_createtime = tvcreate; + if (workerrec_[iworker].first == NULL) + { + sinIns->next = NULL; + sinIns->prev = NULL; + workerrec_[iworker].first = sinIns; + workerrec_[iworker].last = sinIns; + workerrec_[iworker].sessionid_count = 1; + } else + { + sinIns->prev = workerrec_[iworker].last; + sinIns->next = NULL; + workerrec_[iworker].last->next = sinIns; + workerrec_[iworker].last = sinIns; + workerrec_[iworker].sessionid_count = + workerrec_[iworker].sessionid_count + 1; + } + pthread_mutex_unlock(mutex_workerrec_); + } + serviceid_clockseqandnode_outsize = + serviceid_clockseqandnode_outsize_temp; + returnorigin = returnorigin_temp; + + if (ta_path_size >= context_tapath_outsize) + { + ta_path_size = context_tapath_outsize; + charp = ta_path; + } else + { + ta_path_size = 0; + charp = NULL; + } + + if ( + serviceid_clockseqandnode_realsize >= serviceid_clockseqandnode_outsize && + 8 >= serviceid_clockseqandnode_outsize + ) + { + serviceid_clockseqandnode_realsize = serviceid_clockseqandnode_outsize; + } else + { + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode_outsize = 0; + } + opes_reply.set_teecresult(teecresult); + opes_reply.set_context_fd(fd); + opes_reply.set_context_tapath_outsize(ta_path_size); + + if (ta_path_size > 0 && + charp != NULL && + strlen((const char *) charp) > 0 + ) + { + charpp = (const char *) charp; + if (utf8_check_is_valid(charpp)) + { + ta_path_size = strlen((const char *) charp); + } else + { + ta_path_size = 0; + } + } else + { + ta_path_size = 0; + } + if (ta_path_size > 0) + { + opes_reply.set_context_tapath(charpp); + } + + opes_reply.set_context_sessionlist_next(session_list_next); + opes_reply.set_context_sessionlist_prev(session_list_prev); + opes_reply.set_context_shrdmemlist_prev(shrd_mem_list_prev); + opes_reply.set_context_shrdmemlist_next(shrd_mem_list_next); + opes_reply.set_context_sharebuffer_buffer(share_buffer_buffer); + opes_reply.set_context_sharebuffer_bufferbarrier(share_buffer_buffer_barrier); + opes_reply.set_session_sessionid(sessionid); + opes_reply.set_session_serviceid_timelow(serviceid_timelow); + opes_reply.set_session_serviceid_timemid(serviceid_timemid); + opes_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); + opes_reply.set_session_serviceid_clockseqandnode_outsize( + serviceid_clockseqandnode_outsize); + if (serviceid_clockseqandnode_outsize > 0 && + serviceid_clockseqandnode != NULL + ) + { + for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) + opes_reply.add_session_serviceid_clockseqandnode( + serviceid_clockseqandnode[i]); + } + opes_reply.set_session_opscnt(opscnt); + opes_reply.set_session_head_next(head_next); + opes_reply.set_session_head_prev(head_prev); + opes_reply.set_session_context(session_context); + opes_reply.set_operation_started(started); + opes_reply.set_operation_paramtypes(paramtypes); + opes_reply.set_operation_param1_tmpref_buffer(operation_param1_tmpref_buffer); + opes_reply.set_operation_param1_tmpref_size(operation_param1_tmpref_size); + opes_reply.set_operation_param1_memref_parent(operation_param1_memref_parent); + opes_reply.set_operation_param1_memref_size(operation_param1_memref_size); + opes_reply.set_operation_param1_memref_offset(operation_param1_memref_offset); + opes_reply.set_operation_param1_value_a(operation_param1_value_a); + opes_reply.set_operation_param1_value_b(operation_param1_value_b); + opes_reply.set_operation_param1_ionref_ionsharefd( + operation_param1_ionref_ionsharefd); + opes_reply.set_operation_param1_ionref_ionsize(operation_param1_ionref_ionsize); + + opes_reply.set_operation_param2_tmpref_buffer(operation_param2_tmpref_buffer); + opes_reply.set_operation_param2_tmpref_size(operation_param2_tmpref_size); + opes_reply.set_operation_param2_memref_parent(operation_param2_memref_parent); + opes_reply.set_operation_param2_memref_size(operation_param2_memref_size); + opes_reply.set_operation_param2_memref_offset(operation_param2_memref_offset); + opes_reply.set_operation_param2_value_a(operation_param2_value_a); + opes_reply.set_operation_param2_value_b(operation_param2_value_b); + opes_reply.set_operation_param2_ionref_ionsharefd( + operation_param2_ionref_ionsharefd); + opes_reply.set_operation_param2_ionref_ionsize(operation_param2_ionref_ionsize); + + opes_reply.set_operation_param3_tmpref_buffer(operation_param3_tmpref_buffer); + opes_reply.set_operation_param3_tmpref_size(operation_param3_tmpref_size); + opes_reply.set_operation_param3_memref_parent(operation_param3_memref_parent); + opes_reply.set_operation_param3_memref_size(operation_param3_memref_size); + opes_reply.set_operation_param3_memref_offset(operation_param3_memref_offset); + opes_reply.set_operation_param3_value_a(operation_param3_value_a); + opes_reply.set_operation_param3_value_b(operation_param3_value_b); + opes_reply.set_operation_param3_ionref_ionsharefd( + operation_param3_ionref_ionsharefd); + opes_reply.set_operation_param3_ionref_ionsize(operation_param3_ionref_ionsize); + + opes_reply.set_operation_param4_tmpref_buffer(operation_param4_tmpref_buffer); + opes_reply.set_operation_param4_tmpref_size(operation_param4_tmpref_size); + opes_reply.set_operation_param4_memref_parent(operation_param4_memref_parent); + opes_reply.set_operation_param4_memref_size(operation_param4_memref_size); + opes_reply.set_operation_param4_memref_offset(operation_param4_memref_offset); + opes_reply.set_operation_param4_value_a(operation_param4_value_a); + opes_reply.set_operation_param4_value_b(operation_param4_value_b); + opes_reply.set_operation_param4_ionref_ionsharefd( + operation_param4_ionref_ionsharefd); + opes_reply.set_operation_param4_ionref_ionsize(operation_param4_ionref_ionsize); + + opes_reply.set_operation_session(operation_session); + opes_reply.set_operation_cancelflag(operation_cancelflag); + opes_reply.set_returnorigin(returnorigin); + + status_ = FINISH; + gettimeofday(&end, NULL); + int64_t i64Time; + i64Time = (end.tv_sec - start.tv_sec) * 1000000 + + (end.tv_usec - start.tv_usec); + printf("gpp opensession used time: %ld us. \n", i64Time); + + status_ = FINISH; + + opes_response.Finish(opes_reply, Status::OK, this); + } + }else + { + std::cout << "gpp receive no opensession jwtsvid or validate jwt failed" << std::endl; + flag = 2; + opes_reply.set_flag(flag); + status_ = FINISH; + opes_response.Finish(opes_reply, Status::OK, this); + } + break; + } + + case ServerImpl::CallData::SS_TEECC_CloseSession: + { + struct timeval start, end, jwt_validate_start, jwt_validate_end; + gettimeofday(&start, NULL); + + std::uint32_t in_session_sessionid; + std::uint32_t in_session_serviceid_timelow; + std::uint32_t in_session_serviceid_timemid; + std::uint32_t in_session_serviceid_timehiandver; + std::uint32_t in_session_serviceid_clockseqandnode_size; + std::uint32_t *in_session_serviceid_clockseqandnode; + std::uint32_t in_session_opscnt; + std::uint64_t in_session_head_next; + std::uint64_t in_session_head_prev; + std::uint64_t in_session_context; + + std::uint32_t sessionid; + std::uint32_t serviceid_timelow; + std::uint32_t serviceid_timemid; + std::uint32_t serviceid_timehiandver; + std::uint32_t *serviceid_clockseqandnode; + std::uint32_t serviceid_clockseqandnode_outsize; + int serviceid_clockseqandnode_realsize; + std::uint32_t opscnt; + std::uint64_t head_next; + std::uint64_t head_prev; + std::uint64_t session_context; + + std::uint32_t serial = 0; + std::int32_t flag = 0; + + std::string token; + token = close_request.token(); + + std::string noToken("noToken"); + int ivaljwtResult = -1; + int iforceValidateJwt = global_force_valideta_jwt; + + if + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + ) + { + char Token[1024]; + strcpy(Token, (char *) token.data()); + gettimeofday(&jwt_validate_start, NULL); + ivaljwtResult = + dbusmethodcall_validate_jwt( + Token + ); + gettimeofday(&jwt_validate_end, NULL); + int64_t i64Time_jwt; + i64Time_jwt = (jwt_validate_end.tv_sec - jwt_validate_start.tv_sec) * 1000000 + + (jwt_validate_end.tv_usec - jwt_validate_start.tv_usec); + printf("gpp closesession validate jwt used time: %ld us. \n", i64Time_jwt); + std::cout << "gpp validate closesession jwtsvid" << std::endl; + } else + { + std::cout << "gpp no validate closesession jwtsvid" << std::endl; + } + + if + ( + iforceValidateJwt != 1 + || + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + && + ivaljwtResult == NO_ERROR + ) + ) + { + std::cout << "gpp does not need validate closesession jwtsvid or validate jwt succed" + << std::endl; + std::cout << "gpp received CloseSesssion " << std::endl; + in_session_sessionid = close_request.in_session_sessionid(); + in_session_serviceid_timelow = close_request.in_session_serviceid_timelow(); + in_session_serviceid_timemid = close_request.in_session_serviceid_timemid(); + in_session_serviceid_timehiandver = close_request.in_session_serviceid_timehiandver(); + in_session_serviceid_clockseqandnode_size = close_request.in_session_serviceid_clockseqandnode_size(); + if (in_session_serviceid_clockseqandnode_size > 0) + { + in_session_serviceid_clockseqandnode = new uint32_t[in_session_serviceid_clockseqandnode_size]; + for (int i = 0; i < in_session_serviceid_clockseqandnode_size; i++) + { + in_session_serviceid_clockseqandnode[i] = close_request.in_session_serviceid_clockseqandnode( + i); + } + } + in_session_opscnt = close_request.in_session_opscnt(); + in_session_head_next = close_request.in_session_head_next(); + in_session_head_prev = close_request.in_session_head_prev(); + in_session_context = close_request.in_session_context(); +#if 0 + printf(" in_session_serviceid_timelow = 0x %8.8x \n", in_session_serviceid_timelow); + printf(" in_session_serviceid_timemid = 0x %8.8x \n", in_session_serviceid_timemid); + printf(" in_session_serviceid_timehiandver = 0x %8.8x \n", + in_session_serviceid_timehiandver); + printf(" in_session_serviceid_clockseqandnode = \n"); + printf(" "); + for (int i = 0; i < in_session_serviceid_clockseqandnode_size; i++) { + printf(" %8.8x", in_session_serviceid_clockseqandnode[i]); + } + printf("\n"); + printf(" in_session_serviceid_clockseqandnode_size = 0x %8.8x \n", + in_session_serviceid_clockseqandnode_size); + printf(" in_session_opscnt = 0x %8.8x \n", in_session_opscnt); + printf(" in_session_head_next = 0x %16.16lx \n", in_session_head_next); + printf(" in_session_head_prev = 0x %16.16lx \n", in_session_head_prev); +#endif + std::cout << "gpp received in_session_sessionid: 0x " << std::hex << std::setfill('0') + << std::setw(8) << in_session_sessionid << std::endl; + std::cout << "gpp received in_session_context: 0x " << std::hex << std::setfill('0') + << std::setw(16) << in_session_context << std::endl; + + uint32_t serviceid_clockseqandnode_outsize_temp; + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (std::uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(std::uint32_t) + ); + char workername[1024]; + memset((char *) workername, 0, 1024); + int ifound = 0; + int iworker; + sin_t *sinIns; + + pthread_mutex_lock(mutex_workerrec_); + for (iworker = 0; iworker < global_max_num_worker; iworker++) + { + if (workerrec_[iworker].context_addr == in_session_context) + { + sinIns = NULL; + if (workerrec_[iworker].first != NULL) + { + sinIns = workerrec_[iworker].first; + do + { + if (sinIns->session_id == in_session_sessionid) + { + sprintf(workername, "%s%d", "gpworker", iworker); + std::cout << "gpp method call worker No: " << std::dec << iworker << std::endl; + ifound = 1; + break; + } + sinIns = sinIns->next; + } while (sinIns != NULL); + + if (ifound == 1) + { + break; + } + } + } + } + pthread_mutex_unlock(mutex_workerrec_); + if (ifound == 0) + { + printf("gpp can't find the worker for the session and the context. \n"); + + sessionid = 0x0; + serviceid_timelow = 0x0; + serviceid_timemid = 0x0; + serviceid_timehiandver = 0x0; + opscnt = 0x0; + head_next = 0x0; + head_prev = 0x0; + session_context = 0x0; + + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(uint32_t) + ); + for (int i = 0; i < serviceid_clockseqandnode_realsize; i++) + { + serviceid_clockseqandnode[i] = 0x0; + } + serviceid_clockseqandnode_outsize = 8; + close_reply.set_session_sessionid(sessionid); + close_reply.set_session_serviceid_timelow(serviceid_timelow); + close_reply.set_session_serviceid_timemid(serviceid_timemid); + close_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); + close_reply.set_session_serviceid_cad_outsize(serviceid_clockseqandnode_outsize); + if (serviceid_clockseqandnode_outsize > 0 && + serviceid_clockseqandnode != NULL + ) + { + for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) + close_reply.add_session_serviceid_clockseqandnode(serviceid_clockseqandnode[i]); + } + close_reply.set_session_opscnt(opscnt); + close_reply.set_session_head_next(head_next); + close_reply.set_session_head_prev(head_prev); + close_reply.set_session_context(session_context); + + status_ = FINISH; + + close_response.Finish(close_reply, Status::OK, this); + } else + { + method_call_teec_closesession( + workername, + + in_session_sessionid, + in_session_serviceid_timelow, + in_session_serviceid_timemid, + in_session_serviceid_timehiandver, + in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_size, + in_session_opscnt, + in_session_head_next, + in_session_head_prev, + in_session_context, + + &sessionid, + &serviceid_timelow, + &serviceid_timemid, + &serviceid_timehiandver, + serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize, + &serviceid_clockseqandnode_outsize_temp, + &opscnt, + &head_next, + &head_prev, + &session_context + ); + pthread_mutex_lock(mutex_workerrec_); + sin_t *sinTemp; + sinTemp = sinIns->prev; + struct timeval tvcreate; + gettimeofday(&tvcreate, NULL); + workerrec_[iworker].context_createtime = tvcreate; + if (sinTemp != NULL) + { + sinTemp->next = sinIns->next; + } + sinTemp = sinIns->next; + if (sinTemp != NULL) + { + sinTemp->prev = sinIns->prev; + } + if (workerrec_[iworker].last == sinIns) + { + workerrec_[iworker].last = sinIns->prev; + } + if (workerrec_[iworker].first == sinIns) + { + workerrec_[iworker].first = sinIns->next; + } + free(sinIns); + workerrec_[iworker].sessionid_count = + workerrec_[iworker].sessionid_count - 1; + pthread_mutex_unlock(mutex_workerrec_); + + serviceid_clockseqandnode_outsize = serviceid_clockseqandnode_outsize_temp; + + if ( + serviceid_clockseqandnode_realsize >= serviceid_clockseqandnode_outsize && + 8 >= serviceid_clockseqandnode_outsize + ) + { + serviceid_clockseqandnode_realsize = serviceid_clockseqandnode_outsize; + } else + { + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode_outsize = 0; + } + close_reply.set_session_sessionid(sessionid); + close_reply.set_session_serviceid_timelow(serviceid_timelow); + close_reply.set_session_serviceid_timemid(serviceid_timemid); + close_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); + close_reply.set_session_serviceid_cad_outsize(serviceid_clockseqandnode_outsize); + if (serviceid_clockseqandnode_outsize > 0 && + serviceid_clockseqandnode != NULL + ) + { + for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) + close_reply.add_session_serviceid_clockseqandnode(serviceid_clockseqandnode[i]); + } + close_reply.set_session_opscnt(opscnt); + close_reply.set_session_head_next(head_next); + close_reply.set_session_head_prev(head_prev); + close_reply.set_session_context(session_context); + + gettimeofday(&end, NULL); + int64_t i64Time; + i64Time = (end.tv_sec - start.tv_sec) * 1000000 + + (end.tv_usec - start.tv_usec); + printf("gpp closesession used time: %ld us. \n", i64Time); + + status_ = FINISH; + + close_response.Finish(close_reply, Status::OK, this); + } + }else + { + std::cout << "gpp receive no closesession jwtsvid or validate jwt failed" << std::endl; + flag = 2; + close_reply.set_flag(flag); + status_ = FINISH; + + close_response.Finish(close_reply, Status::OK, this); + } + + break; + } + + case ServerImpl::CallData::SS_TEECC_InvokeCommand: + { + struct timeval start, end, jwt_validate_start, jwt_validate_end; + gettimeofday(&start, NULL); + + std::uint32_t in_session_sessionid; + std::uint32_t in_session_serviceid_timelow; + std::uint32_t in_session_serviceid_timemid; + std::uint32_t in_session_serviceid_timehiandver; + std::uint32_t in_session_serviceid_clockseqandnode_size; + std::uint32_t *in_session_serviceid_clockseqandnode; + int in_session_serviceid_clockseqandnode_realsize; + std::uint32_t in_session_opscnt; + std::uint64_t in_session_head_next; + std::uint64_t in_session_head_prev; + std::uint64_t in_session_context; + + std::uint32_t in_commandid; + + std::uint32_t in_operation_started; + std::uint32_t in_operation_paramtypes; + + std::uint64_t in_operation_param1_tmpref_buffer; + std::uint32_t in_operation_param1_tmpref_size; + std::uint64_t in_operation_param1_memref_parent; + std::uint32_t in_operation_param1_memref_parent_flag; + std::uint32_t in_operation_param1_memref_size; + std::uint32_t in_operation_param1_memref_offset; + std::uint32_t in_operation_param1_value_a; + std::uint32_t in_operation_param1_value_b; + std::int32_t in_operation_param1_ionref_ionsharefd; + std::uint32_t in_operation_param1_ionref_ionsize; + + std::uint64_t in_operation_param2_tmpref_buffer; + std::uint32_t in_operation_param2_tmpref_size; + std::uint64_t in_operation_param2_memref_parent; + std::uint32_t in_operation_param2_memref_parent_flag; + std::uint32_t in_operation_param2_memref_size; + std::uint32_t in_operation_param2_memref_offset; + std::uint32_t in_operation_param2_value_a; + std::uint32_t in_operation_param2_value_b; + std::int32_t in_operation_param2_ionref_ionsharefd; + std::uint32_t in_operation_param2_ionref_ionsize; + + std::uint64_t in_operation_param3_tmpref_buffer; + std::uint32_t in_operation_param3_tmpref_size; + std::uint64_t in_operation_param3_memref_parent; + std::uint32_t in_operation_param3_memref_parent_flag; + std::uint32_t in_operation_param3_memref_size; + std::uint32_t in_operation_param3_memref_offset; + std::uint32_t in_operation_param3_value_a; + std::uint32_t in_operation_param3_value_b; + std::int32_t in_operation_param3_ionref_ionsharefd; + std::uint32_t in_operation_param3_ionref_ionsize; + + std::uint64_t in_operation_param4_tmpref_buffer; + std::uint32_t in_operation_param4_tmpref_size; + std::uint64_t in_operation_param4_memref_parent; + std::uint32_t in_operation_param4_memref_parent_flag; + std::uint32_t in_operation_param4_memref_size; + std::uint32_t in_operation_param4_memref_offset; + std::uint32_t in_operation_param4_value_a; + std::uint32_t in_operation_param4_value_b; + std::int32_t in_operation_param4_ionref_ionsharefd; + std::uint32_t in_operation_param4_ionref_ionsize; + + std::uint64_t in_operation_session; + std::int32_t in_operation_cancelflag; + + std::uint32_t in_returnorigin; + + std::uint32_t in_buffer1_size; + std::uint32_t *in_buffer1; + int in_buffer1_realsize; + std::uint32_t in_buffer2_size; + std::uint32_t *in_buffer2; + int in_buffer2_realsize; + std::uint32_t in_buffer3_size; + std::uint32_t *in_buffer3; + int in_buffer3_realsize; + std::uint32_t in_buffer4_size; + std::uint32_t *in_buffer4; + int in_buffer4_realsize; + + std::uint32_t teecresult; + + std::uint32_t sessionid; + std::uint32_t serviceid_timelow; + std::uint32_t serviceid_timemid; + std::uint32_t serviceid_timehiandver; + std::uint32_t *serviceid_clockseqandnode; + int serviceid_clockseqandnode_realsize; + std::int32_t serviceid_clockseqandnode_outsize; + std::uint32_t opscnt; + std::uint64_t head_next; + std::uint64_t head_prev; + std::uint64_t session_context; + std::uint32_t started; + std::uint32_t paramtypes; + std::uint64_t operation_param1_tmpref_buffer; + std::uint32_t operation_param1_tmpref_size; + std::uint64_t operation_param1_memref_parent; + std::uint32_t operation_param1_memref_parent_flag; + std::uint32_t operation_param1_memref_size; + std::uint32_t operation_param1_memref_offset; + std::uint32_t operation_param1_value_a; + std::uint32_t operation_param1_value_b; + std::int32_t operation_param1_ionref_ionsharefd; + std::uint32_t operation_param1_ionref_ionsize; + std::uint64_t operation_param2_tmpref_buffer; + std::uint32_t operation_param2_tmpref_size; + std::uint64_t operation_param2_memref_parent; + std::uint32_t operation_param2_memref_parent_flag; + std::uint32_t operation_param2_memref_size; + std::uint32_t operation_param2_memref_offset; + std::uint32_t operation_param2_value_a; + std::uint32_t operation_param2_value_b; + std::int32_t operation_param2_ionref_ionsharefd; + std::uint32_t operation_param2_ionref_ionsize; + std::uint64_t operation_param3_tmpref_buffer; + std::uint32_t operation_param3_tmpref_size; + std::uint64_t operation_param3_memref_parent; + std::uint32_t operation_param3_memref_parent_flag; + std::uint32_t operation_param3_memref_size; + std::uint32_t operation_param3_memref_offset; + std::uint32_t operation_param3_value_a; + std::uint32_t operation_param3_value_b; + std::int32_t operation_param3_ionref_ionsharefd; + std::uint32_t operation_param3_ionref_ionsize; + std::uint64_t operation_param4_tmpref_buffer; + std::uint32_t operation_param4_tmpref_size; + std::uint64_t operation_param4_memref_parent; + std::uint32_t operation_param4_memref_parent_flag; + std::uint32_t operation_param4_memref_size; + std::uint32_t operation_param4_memref_offset; + std::uint32_t operation_param4_value_a; + std::uint32_t operation_param4_value_b; + std::int32_t operation_param4_ionref_ionsharefd; + std::uint32_t operation_param4_ionref_ionsize; + std::uint64_t operation_session; + std::int32_t operation_cancelflag; + std::uint32_t returnorigin; + + std::uint32_t *buffer1; + int buffer1_realsize; + std::uint32_t buffer1_outsize; + std::uint32_t *buffer2; + int buffer2_realsize; + std::uint32_t buffer2_outsize; + std::uint32_t *buffer3; + int buffer3_realsize; + std::uint32_t buffer3_outsize; + std::uint32_t *buffer4; + int buffer4_realsize; + std::uint32_t buffer4_outsize; + + std::uint32_t serial = 0; + std::int32_t flag = 0; + std::string token; + token = invo_request.token(); + + std::string noToken("noToken"); + int ivaljwtResult = -1; + int iforceValidateJwt = global_force_valideta_jwt; + + if + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + ) + { + char Token[1024]; + strcpy(Token, (char *) token.data()); + gettimeofday(&jwt_validate_start, NULL); + ivaljwtResult = + dbusmethodcall_validate_jwt( + Token + ); + gettimeofday(&jwt_validate_end, NULL); + int64_t i64Time_jwt; + i64Time_jwt = (jwt_validate_end.tv_sec - jwt_validate_start.tv_sec) * 1000000 + + (jwt_validate_end.tv_usec - jwt_validate_start.tv_usec); + printf("gpp invokecommand validate jwt used time: %ld us. \n", i64Time_jwt); + std::cout << "gpp validate invokecommand jwtsvid" << std::endl; + } else + { + std::cout << "gpp no validate invokecommand jwtsvid" << std::endl; + } + + if + ( + iforceValidateJwt != 1 + || + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + && + ivaljwtResult == NO_ERROR + ) + ) + { + std::cout << "gpp does not need validate invokecommand jwtsvid or validate jwt succed" + << std::endl; + + in_session_sessionid = invo_request.in_session_sessionid(); + in_session_serviceid_timelow = invo_request.in_session_serviceid_timelow(); + in_session_serviceid_timemid = invo_request.in_session_serviceid_timemid(); + in_session_serviceid_timehiandver = invo_request.in_session_serviceid_timehiandver(); + + in_session_serviceid_clockseqandnode_size = invo_request.in_session_serviceid_clockseqandnode_size(); + in_session_serviceid_clockseqandnode_realsize = in_session_serviceid_clockseqandnode_size; + if (in_session_serviceid_clockseqandnode_size > 0) + { + in_session_serviceid_clockseqandnode = new uint32_t[in_session_serviceid_clockseqandnode_size]; + for (int i = 0; i < in_session_serviceid_clockseqandnode_size; i++) + { + in_session_serviceid_clockseqandnode[i] = invo_request.in_session_serviceid_clockseqandnode( + i); + } + } + in_session_opscnt = invo_request.in_session_opscnt(); + in_session_head_next = invo_request.in_session_head_next(); + in_session_head_prev = invo_request.in_session_head_prev(); + in_session_context = invo_request.in_session_context(); + in_commandid = invo_request.in_commandid(); + in_operation_started = invo_request.in_operation_started(); + in_operation_paramtypes = invo_request.in_operation_paramtypes(); + in_operation_param1_tmpref_buffer = invo_request.in_operation_param1_tmpref_buffer(); + in_operation_param1_tmpref_size = invo_request.in_operation_param1_tmpref_size(); + in_operation_param1_memref_parent_flag = invo_request.in_operation_param1_memref_parent_flag(); + in_operation_param1_memref_parent = invo_request.in_operation_param1_memref_parent(); + in_operation_param1_memref_size = invo_request.in_operation_param1_memref_size(); + in_operation_param1_memref_offset = invo_request.in_operation_param1_memref_offset(); + in_operation_param1_value_a = invo_request.in_operation_param1_value_a(); + in_operation_param1_value_b = invo_request.in_operation_param1_value_b(); + in_operation_param1_ionref_ionsharefd = invo_request.in_operation_param1_ionref_ionsharefd(); + in_operation_param1_ionref_ionsize = invo_request.in_operation_param1_ionref_ionsize(); + + in_operation_param2_tmpref_buffer = invo_request.in_operation_param2_tmpref_buffer(); + in_operation_param2_tmpref_size = invo_request.in_operation_param2_tmpref_size(); + in_operation_param2_memref_parent = invo_request.in_operation_param2_memref_parent(); + in_operation_param2_memref_parent_flag = invo_request.in_operation_param2_memref_parent_flag(); + in_operation_param2_memref_size = invo_request.in_operation_param2_memref_size(); + in_operation_param2_memref_offset = invo_request.in_operation_param2_memref_offset(); + in_operation_param2_value_a = invo_request.in_operation_param2_value_a(); + in_operation_param2_value_b = invo_request.in_operation_param2_value_b(); + in_operation_param2_ionref_ionsharefd = invo_request.in_operation_param2_ionref_ionsharefd(); + in_operation_param2_ionref_ionsize = invo_request.in_operation_param2_ionref_ionsize(); + + in_operation_param3_tmpref_buffer = invo_request.in_operation_param3_tmpref_buffer(); + in_operation_param3_tmpref_size = invo_request.in_operation_param3_tmpref_size(); + in_operation_param3_memref_parent = invo_request.in_operation_param3_memref_parent(); + in_operation_param3_memref_parent_flag = invo_request.in_operation_param3_memref_parent_flag(); + in_operation_param3_memref_size = invo_request.in_operation_param3_memref_size(); + in_operation_param3_memref_offset = invo_request.in_operation_param3_memref_offset(); + in_operation_param3_value_a = invo_request.in_operation_param3_value_a(); + in_operation_param3_value_b = invo_request.in_operation_param3_value_b(); + in_operation_param3_ionref_ionsharefd = invo_request.in_operation_param3_ionref_ionsharefd(); + in_operation_param3_ionref_ionsize = invo_request.in_operation_param3_ionref_ionsize(); + + in_operation_param4_tmpref_buffer = invo_request.in_operation_param4_tmpref_buffer(); + in_operation_param4_tmpref_size = invo_request.in_operation_param4_tmpref_size(); + in_operation_param4_memref_parent = invo_request.in_operation_param4_memref_parent(); + in_operation_param4_memref_parent_flag = invo_request.in_operation_param4_memref_parent_flag(); + in_operation_param4_memref_size = invo_request.in_operation_param4_memref_size(); + in_operation_param4_memref_offset = invo_request.in_operation_param4_memref_offset(); + in_operation_param4_value_a = invo_request.in_operation_param4_value_a(); + in_operation_param4_value_b = invo_request.in_operation_param4_value_b(); + in_operation_param4_ionref_ionsharefd = invo_request.in_operation_param4_ionref_ionsharefd(); + in_operation_param4_ionref_ionsize = invo_request.in_operation_param4_ionref_ionsize(); + + in_operation_session = invo_request.in_operation_session(); + in_operation_cancelflag = invo_request.in_operation_cancelflag(); + in_returnorigin = invo_request.in_returnorigin(); + + in_buffer1_size = invo_request.in_buffer1_size(); + in_buffer1_realsize = in_buffer1_size; + if (in_buffer1_size > 0) + { + in_buffer1 = new uint32_t[in_buffer1_size]; + for (int i = 0; i < in_buffer1_size; i++) + { + in_buffer1[i] = invo_request.in_buffer1(i); + } + } + + in_buffer2_size = invo_request.in_buffer2_size(); + in_buffer2_realsize = in_buffer2_size; + if (in_buffer2_size > 0) + { + in_buffer2 = new uint32_t[in_buffer2_size]; + for (int i = 0; i < in_buffer2_size; i++) + { + in_buffer2[i] = invo_request.in_buffer2(i); + } + } + + in_buffer3_size = invo_request.in_buffer3_size(); + in_buffer3_realsize = in_buffer3_size; + if (in_buffer3_size > 0) + { + in_buffer3 = new uint32_t[in_buffer3_size]; + for (int i = 0; i < in_buffer3_size; i++) + { + in_buffer3[i] = invo_request.in_buffer3(i); + } + } + + in_buffer4_size = invo_request.in_buffer4_size(); + in_buffer4_realsize = in_buffer4_size; + if (in_buffer4_size > 0) + { + in_buffer4 = new uint32_t[in_buffer4_size]; + for (int i = 0; i < in_buffer4_size; i++) + { + in_buffer4[i] = invo_request.in_buffer4(i); + } + } + + std::cout << "gpp received InvokeCommand " << std::endl; + std::cout << "gpp received in_session_sessionid: 0x " + << std::hex << std::setfill('0') << std::setw(8) << in_session_sessionid << std::endl; +#if 0 + printf(" in_session_serviceid_timelow = 0x %8.8x \n", in_session_serviceid_timelow); + printf(" in_session_serviceid_timemid = 0x %8.8x \n", in_session_serviceid_timemid); + printf(" in_session_serviceid_timehiandver = 0x %8.8x \n", + in_session_serviceid_timehiandver); + printf(" in_session_serviceid_clockseqandnode = \n"); + printf(" "); + for (int i = 0; i < in_session_serviceid_clockseqandnode_realsize; i++) { + printf(" %2.2x", in_session_serviceid_clockseqandnode[i]); + } + printf("\n"); + printf(" in serviceid_clockseqandnode_size = 0x %8.8x \n", + in_session_serviceid_clockseqandnode_size); + printf(" in_session_opscnt = 0x %8.8x \n", in_session_opscnt); + printf(" in_session_head_next = 0x %16.16lx \n", in_session_head_next); + printf(" in_session_head_prev = 0x %16.16lx \n", in_session_head_prev); +#endif + std::cout << "gpp received in_session_context: 0x " << std::hex << std::setfill('0') + << std::setw(16) << in_session_context << std::endl; + +#if 0 + printf(" commandid = 0x %8.8x \n", in_commandid); + printf(" in_operation_started = 0x %8.8x \n", in_operation_started); + printf(" in_operation_paramtypes = 0x %8.8x \n", in_operation_paramtypes); + printf(" in_operation_param1_tmpref_buffer = 0x %16.16lx \n", in_operation_param1_tmpref_buffer); + printf(" in_operation_param1_tmpref_size = 0x %8.8x \n", in_operation_param1_tmpref_size); + printf(" in_operation_param1_memref_parent = 0x %16.16lx \n", in_operation_param1_memref_parent); + printf(" in_operation_param1_memref_size = 0x %8.8x \n", in_operation_param1_memref_size); + printf(" in_operation_param1_memref_offset = 0x %8.8x \n", in_operation_param1_memref_offset); + printf(" in_operation_param1_value_a = 0x %8.8x \n", in_operation_param1_value_a); + printf(" in_operation_param1_value_b = 0x %8.8x \n", in_operation_param1_value_b); + printf(" in_operation_param1_ionref_ionsharefd = 0x %8.8x \n",in_operation_param2_ionref_ionsharefd); + printf(" in_operation_param1_ionref_ionsize = 0x %8.8x \n", in_operation_param2_ionref_ionsize); + + printf(" in_operation_param2_tmpref_buffer = 0x %16.16lx \n", in_operation_param2_tmpref_buffer); + printf(" in_operation_param2_tmpref_size = 0x %8.8x \n", in_operation_param2_tmpref_size); + printf(" in_operation_param2_memref_parent = 0x %16.16lx \n", in_operation_param2_memref_parent); + printf(" in_operation_param2_memref_size = 0x %8.8x \n", in_operation_param2_memref_size); + printf(" in_operation_param2_memref_offset = 0x %8.8x \n", in_operation_param2_memref_offset); + printf(" in_operation_param2_value_a = 0x %8.8x \n", in_operation_param3_value_a); + printf(" in_operation_param2_value_b = 0x %8.8x \n", in_operation_param3_value_b); + printf(" in_operation_param2_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); + printf(" in_operation_param2_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); + + printf(" in_operation_param3_tmpref_buffer = 0x %16.16lx \n", in_operation_param3_tmpref_buffer); + printf(" in_operation_param3_tmpref_size = 0x %8.8x \n", in_operation_param3_tmpref_size); + printf(" in_operation_param3_memref_parent = 0x %16.16lx \n", in_operation_param3_memref_parent); + printf(" in_operation_param3_memref_size = 0x %8.8x \n", in_operation_param3_memref_size); + printf(" in_operation_param3_memref_offset = 0x %8.8x \n", in_operation_param3_memref_offset); + printf(" in_operation_param3_value_a = 0x %8.8x \n", in_operation_param3_value_a); + printf(" in_operation_param3_value_b = 0x %8.8x \n", in_operation_param3_value_b); + printf(" in_operation_param3_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); + printf(" in_operation_param3_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); + + printf(" in_operation_param4_tmpref_buffer = 0x %16.16lx \n", in_operation_param4_tmpref_buffer); + printf(" in_operation_param4_tmpref_size = 0x %8.8x \n", in_operation_param4_tmpref_size); + printf(" in_operation_param4_memref_parent = 0x %16.16lx \n", in_operation_param4_memref_parent); + printf(" in_operation_param4_memref_size = 0x %8.8x \n", in_operation_param4_memref_size); + printf(" in_operation_param4_memref_offset = 0x %8.8x \n", in_operation_param4_memref_offset); + printf(" in_operation_param4_value_a = 0x %8.8x \n", in_operation_param4_value_a); + printf(" in_operation_param4_value_b = 0x %8.8x \n", in_operation_param4_value_b); + printf(" in_operation_param4_ionref_ionsharefd = 0x %8.8x \n", in_operation_param4_ionref_ionsharefd); + printf(" in_operation_param4_ionref_ionsize = 0x %8.8x \n", in_operation_param4_ionref_ionsize); + + printf(" in_operation_session = 0x %16.16lx \n", in_operation_session); + printf(" in_operation_cancelflag = 0x %8.8x \n", in_operation_cancelflag); + + printf(" in_returnorigin = 0x %8.8x \n", in_returnorigin); + + printf(" in_buffer1 = \n"); + if (in_buffer1_size > 0) { + printf(" "); + for (int i = 0; i < in_buffer1_realsize; i++) { + printf(" %2.2x", in_buffer1[i]); + } + printf("\n"); + } +#endif + +#if 0 + printf(" in_buffer1_size = 0x %8.8x \n", + in_buffer1_size); +#endif + +#if 0 + printf(" in_buffer2 = \n"); + if (in_buffer2_size > 0) { + printf(" "); + for (int i = 0; i < in_buffer2_realsize; i++) { + printf(" %2.2x", in_buffer2[i]); + } + printf("\n"); + } + printf(" in_buffer2_size = 0x %8.8x \n", + in_buffer2_size); + + printf(" in_buffer3 = \n"); + if (in_buffer3_size > 0) { + printf(" "); + for (int i = 0; i < in_buffer3_realsize; i++) { + printf(" %2.2x", in_buffer3[i]); + } + printf("\n"); + } + printf(" in_buffer3_size = 0x %8.8x \n", + in_buffer3_size); + + printf(" in_buffer4 = \n"); + if (in_buffer4_size > 0) { + printf(" "); + for (int i = 0; i < in_buffer4_realsize; i++) { + printf(" %2.2x", in_buffer4[i]); + } + printf("\n"); + } + printf(" in_buffer4_size = 0x %8.8x \n", + in_buffer4_size); + +#endif + if (in_buffer1_size > 0) + { + } else + { + in_buffer1_realsize = 0; + } + if (in_buffer2_size > 0) + { + } else + { + in_buffer2_realsize = 0; + } + if (in_buffer3_size > 0) + { + } else + { + in_buffer3_realsize = 0; + } + if (in_buffer4_size > 0) + { + } else + { + in_buffer4_realsize = 0; + } + + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(uint32_t) + ); + uint32_t serviceid_clockseqandnode_outsize_temp; + uint32_t returnorigin_temp; + + uint32_t *buffer1_temp = NULL; + uint32_t buffer1_size = 4096; + uint32_t buffer1_outsize_temp; + buffer1_temp = + (uint32_t *) malloc(buffer1_size * sizeof(uint32_t)); + + uint32_t buffer2_size = 4096; + uint32_t *buffer2_temp = NULL; + uint32_t buffer2_outsize_temp; + buffer2_temp = + (uint32_t *) malloc(buffer2_size * sizeof(uint32_t)); + + uint32_t buffer3_size = 4096; + uint32_t *buffer3_temp = NULL; + uint32_t buffer3_outsize_temp; + buffer3_temp = + (uint32_t *) malloc(buffer3_size * sizeof(uint32_t)); + + uint32_t buffer4_size = 4096; + uint32_t *buffer4_temp = NULL; + uint32_t buffer4_outsize_temp; + buffer4_temp = + (uint32_t *) malloc(buffer4_size * sizeof(uint32_t)); + + char workername[1024]; + memset((char *) workername, 0, 1024); + int ifound = 0; + int iworker; + sin_t *sinIns; + + pthread_mutex_lock(mutex_workerrec_); + for (iworker = 0; iworker < global_max_num_worker; iworker++) + { + if (workerrec_[iworker].context_addr == in_session_context) + { + sinIns = NULL; + if (workerrec_[iworker].first != NULL) + { + sinIns = workerrec_[iworker].first; + do + { + if (sinIns->session_id == in_session_sessionid) + { + sprintf(workername, "%s%d", "gpworker", iworker); + std::cout << "gpp method call worker No: " << std::dec << iworker << std::endl; + ifound = 1; + break; + } + sinIns = sinIns->next; + } while (sinIns != NULL); + if (ifound == 1) + { + break; + } + } + } + } + pthread_mutex_unlock(mutex_workerrec_); + + if (ifound == 0) + { + printf("gpp can't find the worker for the session and the context. \n"); + + teecresult = 0xAAAA0017; + + sessionid = 0x0; + serviceid_timelow = 0x0; + serviceid_timemid = 0x0; + serviceid_timehiandver = 0x0; + opscnt = 0x0; + head_next = 0x0; + head_prev = 0x0; + session_context = 0x0; + started = 0x0; + paramtypes = 0x0; + + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(uint32_t) + ); + for (int i = 0; i < serviceid_clockseqandnode_realsize; i++) + { + serviceid_clockseqandnode[i] = 0x0; + } + serviceid_clockseqandnode_outsize = 8; + + operation_param1_tmpref_buffer = 0x0; + operation_param1_tmpref_size = 0x0; + operation_param1_memref_parent = 0x0; + operation_param1_memref_size = 0x0; + operation_param1_memref_offset = 0x0; + operation_param1_value_a = 0x0; + operation_param1_value_b = 0x0; + operation_param1_ionref_ionsharefd = 0x0; + operation_param1_ionref_ionsize = 0x0; + + operation_param2_tmpref_buffer = 0x0; + operation_param2_tmpref_size = 0x0; + operation_param2_memref_parent = 0x0; + operation_param2_memref_size = 0x0; + operation_param2_memref_offset = 0x0; + operation_param2_value_a = 0x0; + operation_param2_value_b = 0x0; + operation_param2_ionref_ionsharefd = 0x0; + operation_param2_ionref_ionsize = 0x0; + + operation_param3_tmpref_buffer = 0x0; + operation_param3_tmpref_size = 0x0; + operation_param3_memref_parent = 0x0; + operation_param3_memref_size = 0x0; + operation_param3_memref_offset = 0x0; + operation_param3_value_a = 0x0; + operation_param3_value_b = 0x0; + operation_param3_ionref_ionsharefd = 0x0; + operation_param3_ionref_ionsize = 0x0; + + operation_param4_tmpref_buffer = 0x0; + operation_param4_tmpref_size = 0x0; + operation_param4_memref_parent = 0x0; + operation_param4_memref_size = 0x0; + operation_param4_memref_offset = 0x0; + operation_param4_value_a = 0x0; + operation_param4_value_b = 0x0; + operation_param4_ionref_ionsharefd = 0x0; + operation_param4_ionref_ionsize = 0x0; + + operation_session = 0x0; + operation_cancelflag = 0x0; + + returnorigin = 0x0; + + buffer1_realsize = 0; + buffer1_outsize = buffer1_realsize; + + buffer2_realsize = 0; + buffer2_outsize = buffer2_realsize; + + buffer3_realsize = 0; + buffer3_outsize = buffer3_realsize; + + buffer4_realsize = 0; + buffer4_outsize = buffer4_realsize; + + invo_reply.set_teecresult(teecresult); + invo_reply.set_session_sessionid(sessionid); + invo_reply.set_session_serviceid_timelow(serviceid_timelow); + invo_reply.set_session_serviceid_timemid(serviceid_timemid); + invo_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); + invo_reply.set_session_serviceid_clockseqandnode_outsize(serviceid_clockseqandnode_outsize); + if (serviceid_clockseqandnode_outsize > 0 && + serviceid_clockseqandnode != NULL + ) + { + for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) + invo_reply.add_session_serviceid_clockseqandnode(serviceid_clockseqandnode[i]); + } + invo_reply.set_session_opscnt(opscnt); + invo_reply.set_session_head_next(head_next); + invo_reply.set_session_head_prev(head_prev); + invo_reply.set_session_context(session_context); + invo_reply.set_operation_started(started); + invo_reply.set_operation_paramtypes(paramtypes); + + invo_reply.set_operation_param1_tmpref_buffer(operation_param1_tmpref_buffer); + invo_reply.set_operation_param1_tmpref_size(operation_param1_tmpref_size); + invo_reply.set_operation_param1_memref_parent(operation_param1_memref_parent); + invo_reply.set_operation_param1_memref_parent_flag(in_operation_param1_memref_parent_flag); + invo_reply.set_operation_param1_memref_size(operation_param1_memref_size); + invo_reply.set_operation_param1_memref_offset(operation_param1_memref_offset); + invo_reply.set_operation_param1_value_a(operation_param1_value_a); + invo_reply.set_operation_param1_value_b(operation_param1_value_b); + invo_reply.set_operation_param1_ionref_ionsharefd(operation_param1_ionref_ionsharefd); + invo_reply.set_operation_param1_ionref_ionsize(operation_param1_ionref_ionsize); + + invo_reply.set_operation_param2_tmpref_buffer(operation_param2_tmpref_buffer); + invo_reply.set_operation_param2_tmpref_size(operation_param2_tmpref_size); + invo_reply.set_operation_param2_memref_parent(operation_param2_memref_parent); + invo_reply.set_operation_param2_memref_parent_flag(in_operation_param2_memref_parent_flag); + invo_reply.set_operation_param2_memref_size(operation_param2_memref_size); + invo_reply.set_operation_param2_memref_offset(operation_param2_memref_offset); + invo_reply.set_operation_param2_value_a(operation_param2_value_a); + invo_reply.set_operation_param2_value_b(operation_param2_value_b); + invo_reply.set_operation_param2_ionref_ionsharefd(operation_param2_ionref_ionsharefd); + invo_reply.set_operation_param2_ionref_ionsize(operation_param2_ionref_ionsize); + + invo_reply.set_operation_param3_tmpref_buffer(operation_param3_tmpref_buffer); + invo_reply.set_operation_param3_tmpref_size(operation_param3_tmpref_size); + invo_reply.set_operation_param3_memref_parent(operation_param3_memref_parent); + invo_reply.set_operation_param3_memref_parent_flag(in_operation_param3_memref_parent_flag); + invo_reply.set_operation_param3_memref_size(operation_param3_memref_size); + invo_reply.set_operation_param3_memref_offset(operation_param3_memref_offset); + invo_reply.set_operation_param3_value_a(operation_param3_value_a); + invo_reply.set_operation_param3_value_b(operation_param3_value_b); + invo_reply.set_operation_param3_ionref_ionsharefd(operation_param3_ionref_ionsharefd); + invo_reply.set_operation_param3_ionref_ionsize(operation_param3_ionref_ionsize); + + invo_reply.set_operation_param4_tmpref_buffer(operation_param4_tmpref_buffer); + invo_reply.set_operation_param4_tmpref_size(operation_param4_tmpref_size); + invo_reply.set_operation_param4_memref_parent(operation_param4_memref_parent); + invo_reply.set_operation_param4_memref_parent_flag(in_operation_param4_memref_parent_flag); + invo_reply.set_operation_param4_memref_size(operation_param4_memref_size); + invo_reply.set_operation_param4_memref_offset(operation_param4_memref_offset); + invo_reply.set_operation_param4_value_a(operation_param4_value_a); + invo_reply.set_operation_param4_value_b(operation_param4_value_b); + invo_reply.set_operation_param4_ionref_ionsharefd(operation_param4_ionref_ionsharefd); + invo_reply.set_operation_param4_ionref_ionsize(operation_param4_ionref_ionsize); + + invo_reply.set_operation_session(operation_session); + invo_reply.set_operation_cancelflag(operation_cancelflag); + invo_reply.set_returnorigin(returnorigin); + + invo_reply.set_buffer1_outsize(buffer1_realsize); + invo_reply.set_buffer2_outsize(buffer2_realsize); + invo_reply.set_buffer3_outsize(buffer3_realsize); + invo_reply.set_buffer4_outsize(buffer4_realsize); + + if (buffer1_realsize > 0 && + buffer1 != NULL + ) + { + for (int i = 0; i < buffer1_realsize; i++) + + invo_reply.add_buffer1(buffer1[i]); + } + + if (buffer2_realsize > 0 && + buffer2 != NULL + ) + { + for (int i = 0; i < buffer2_realsize; i++) + invo_reply.add_buffer2(buffer2[i]); + } + + if (buffer3_realsize > 0 && + buffer3 != NULL + ) + { + for (int i = 0; i < buffer3_realsize; i++) + invo_reply.add_buffer3(buffer3[i]); + } + + if (buffer4_realsize > 0 && + buffer4 != NULL + ) + { + for (int i = 0; i < buffer4_realsize; i++) + invo_reply.add_buffer4(buffer4[i]); + } + status_ = FINISH; + + invo_response.Finish(invo_reply, Status::OK, this); + } else + { + method_call_teec_invokecommand( + workername, + + in_session_sessionid, + in_session_serviceid_timelow, + in_session_serviceid_timemid, + in_session_serviceid_timehiandver, + in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_realsize, + in_session_opscnt, + in_session_head_next, + in_session_head_prev, + in_session_context, + + in_commandid, + + in_operation_started, + in_operation_paramtypes, + + in_operation_param1_tmpref_buffer, + in_operation_param1_tmpref_size, + in_operation_param1_memref_parent, + in_operation_param1_memref_parent_flag, + in_operation_param1_memref_size, + in_operation_param1_memref_offset, + in_operation_param1_value_a, + in_operation_param1_value_b, + in_operation_param1_ionref_ionsharefd, + in_operation_param1_ionref_ionsize, + + in_operation_param2_tmpref_buffer, + in_operation_param2_tmpref_size, + in_operation_param2_memref_parent, + in_operation_param2_memref_parent_flag, + in_operation_param2_memref_size, + in_operation_param2_memref_offset, + in_operation_param2_value_a, + in_operation_param2_value_b, + in_operation_param2_ionref_ionsharefd, + in_operation_param2_ionref_ionsize, + + in_operation_param3_tmpref_buffer, + in_operation_param3_tmpref_size, + in_operation_param3_memref_parent, + in_operation_param3_memref_parent_flag, + in_operation_param3_memref_size, + in_operation_param3_memref_offset, + in_operation_param3_value_a, + in_operation_param3_value_b, + in_operation_param3_ionref_ionsharefd, + in_operation_param3_ionref_ionsize, + + in_operation_param4_tmpref_buffer, + in_operation_param4_tmpref_size, + in_operation_param4_memref_parent, + in_operation_param4_memref_parent_flag, + in_operation_param4_memref_size, + in_operation_param4_memref_offset, + in_operation_param4_value_a, + in_operation_param4_value_b, + in_operation_param4_ionref_ionsharefd, + in_operation_param4_ionref_ionsize, + + in_operation_session, + in_operation_cancelflag, + + in_returnorigin, + + in_buffer1, + in_buffer1_realsize, + in_buffer2, + in_buffer2_realsize, + in_buffer3, + in_buffer3_realsize, + in_buffer4, + in_buffer4_realsize, + + + &teecresult, + + &sessionid, + &serviceid_timelow, + &serviceid_timemid, + &serviceid_timehiandver, + serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize, + &serviceid_clockseqandnode_outsize_temp, + + &opscnt, + &head_next, + &head_prev, + &session_context, + + &started, + ¶mtypes, + + &operation_param1_tmpref_buffer, + &operation_param1_tmpref_size, + &operation_param1_memref_parent, + &operation_param1_memref_parent_flag, + &operation_param1_memref_size, + &operation_param1_memref_offset, + &operation_param1_value_a, + &operation_param1_value_b, + &operation_param1_ionref_ionsharefd, + &operation_param1_ionref_ionsize, + + &operation_param2_tmpref_buffer, + &operation_param2_tmpref_size, + &operation_param2_memref_parent, + &operation_param2_memref_parent_flag, + &operation_param2_memref_size, + &operation_param2_memref_offset, + &operation_param2_value_a, + &operation_param2_value_b, + &operation_param2_ionref_ionsharefd, + &operation_param2_ionref_ionsize, + + &operation_param3_tmpref_buffer, + &operation_param3_tmpref_size, + &operation_param3_memref_parent, + &operation_param3_memref_parent_flag, + &operation_param3_memref_size, + &operation_param3_memref_offset, + &operation_param3_value_a, + &operation_param3_value_b, + &operation_param3_ionref_ionsharefd, + &operation_param3_ionref_ionsize, + + &operation_param4_tmpref_buffer, + &operation_param4_tmpref_size, + &operation_param4_memref_parent, + &operation_param4_memref_parent_flag, + &operation_param4_memref_size, + &operation_param4_memref_offset, + &operation_param4_value_a, + &operation_param4_value_b, + &operation_param4_ionref_ionsharefd, + &operation_param4_ionref_ionsize, + + &operation_session, + &operation_cancelflag, + + &returnorigin_temp, + + buffer1_temp, + buffer1_size, + &buffer1_outsize_temp, + buffer2_temp, + buffer2_size, + &buffer2_outsize_temp, + buffer3_temp, + buffer3_size, + &buffer3_outsize_temp, + buffer4_temp, + buffer4_size, + &buffer4_outsize_temp + ); + + pthread_mutex_lock(mutex_workerrec_); + struct timeval tvcreate; + gettimeofday(&tvcreate, NULL); + workerrec_[iworker].context_createtime = tvcreate; + sinIns->session_createtime = tvcreate; + pthread_mutex_unlock(mutex_workerrec_); + + serviceid_clockseqandnode_outsize = + serviceid_clockseqandnode_outsize_temp; + + returnorigin = returnorigin_temp; + + buffer1_outsize = buffer1_outsize_temp; + buffer2_outsize = buffer2_outsize_temp; + buffer3_outsize = buffer3_outsize_temp; + buffer4_outsize = buffer4_outsize_temp; + + + buffer1_realsize = buffer1_outsize; + if (buffer1_realsize > 0) + { + buffer1 = + (uint32_t *) malloc( + buffer1_realsize * sizeof(uint32_t) + ); + for (int i = 0; i < buffer1_realsize; i++) + { + buffer1[i] = (uint32_t) buffer1_temp[i]; + } + } + buffer2_realsize = buffer2_outsize; + if (buffer2_realsize > 0) + { + buffer2 = + (uint32_t *) malloc( + buffer2_realsize * sizeof(uint32_t) + ); + for (int i = 0; i < buffer2_realsize; i++) + { + buffer2[i] = (uint32_t) buffer2_temp[i]; + } + } + + buffer3_realsize = buffer3_outsize; + if (buffer3_realsize > 0) + { + buffer3 = + (uint32_t *) malloc( + buffer3_realsize * sizeof(uint32_t) + ); + for (int i = 0; i < buffer3_realsize; i++) + { + buffer3[i] = (uint32_t) buffer3_temp[i]; + } + } + + buffer4_realsize = buffer4_outsize; + if (buffer4_realsize > 0) + { + buffer4 = + (uint32_t *) malloc( + buffer4_realsize * sizeof(uint32_t) + ); + for (int i = 0; i < buffer4_realsize; i++) + { + buffer4[i] = (uint32_t) buffer4_temp[i]; + } + } + if (buffer1_temp != NULL) + { + free(buffer1_temp); + } + if (buffer2_temp != NULL) + { + free(buffer2_temp); + } + if (buffer3_temp != NULL) + { + free(buffer3_temp); + } + if (buffer4_temp != NULL) + { + free(buffer4_temp); + } + + invo_reply.set_teecresult(teecresult); + invo_reply.set_session_sessionid(sessionid); + invo_reply.set_session_serviceid_timelow(serviceid_timelow); + invo_reply.set_session_serviceid_timemid(serviceid_timemid); + invo_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); + invo_reply.set_session_serviceid_clockseqandnode_outsize(serviceid_clockseqandnode_outsize); + + if (serviceid_clockseqandnode_outsize > 0 && + serviceid_clockseqandnode != NULL + ) + { + for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) + invo_reply.add_session_serviceid_clockseqandnode(serviceid_clockseqandnode[i]); + } + invo_reply.set_session_opscnt(opscnt); + invo_reply.set_session_head_next(head_next); + invo_reply.set_session_head_prev(head_prev); + invo_reply.set_session_context(session_context); + invo_reply.set_operation_started(started); + invo_reply.set_operation_paramtypes(paramtypes); + + invo_reply.set_operation_param1_tmpref_buffer(operation_param1_tmpref_buffer); + invo_reply.set_operation_param1_tmpref_size(operation_param1_tmpref_size); + invo_reply.set_operation_param1_memref_parent(operation_param1_memref_parent); + invo_reply.set_operation_param1_memref_parent_flag(in_operation_param1_memref_parent_flag); + invo_reply.set_operation_param1_memref_size(operation_param1_memref_size); + invo_reply.set_operation_param1_memref_offset(operation_param1_memref_offset); + invo_reply.set_operation_param1_value_a(operation_param1_value_a); + invo_reply.set_operation_param1_value_b(operation_param1_value_b); + invo_reply.set_operation_param1_ionref_ionsharefd(operation_param1_ionref_ionsharefd); + invo_reply.set_operation_param1_ionref_ionsize(operation_param1_ionref_ionsize); + + invo_reply.set_operation_param2_tmpref_buffer(operation_param2_tmpref_buffer); + invo_reply.set_operation_param2_tmpref_size(operation_param2_tmpref_size); + invo_reply.set_operation_param2_memref_parent(operation_param2_memref_parent); + invo_reply.set_operation_param2_memref_parent_flag(in_operation_param2_memref_parent_flag); + invo_reply.set_operation_param2_memref_size(operation_param2_memref_size); + invo_reply.set_operation_param2_memref_offset(operation_param2_memref_offset); + invo_reply.set_operation_param2_value_a(operation_param2_value_a); + invo_reply.set_operation_param2_value_b(operation_param2_value_b); + invo_reply.set_operation_param2_ionref_ionsharefd(operation_param2_ionref_ionsharefd); + invo_reply.set_operation_param2_ionref_ionsize(operation_param2_ionref_ionsize); + + invo_reply.set_operation_param3_tmpref_buffer(operation_param3_tmpref_buffer); + invo_reply.set_operation_param3_tmpref_size(operation_param3_tmpref_size); + invo_reply.set_operation_param3_memref_parent(operation_param3_memref_parent); + invo_reply.set_operation_param3_memref_parent_flag(in_operation_param3_memref_parent_flag); + invo_reply.set_operation_param3_memref_size(operation_param3_memref_size); + invo_reply.set_operation_param3_memref_offset(operation_param3_memref_offset); + invo_reply.set_operation_param3_value_a(operation_param3_value_a); + invo_reply.set_operation_param3_value_b(operation_param3_value_b); + invo_reply.set_operation_param3_ionref_ionsharefd(operation_param3_ionref_ionsharefd); + invo_reply.set_operation_param3_ionref_ionsize(operation_param3_ionref_ionsize); + + invo_reply.set_operation_param4_tmpref_buffer(operation_param4_tmpref_buffer); + invo_reply.set_operation_param4_tmpref_size(operation_param4_tmpref_size); + invo_reply.set_operation_param4_memref_parent(operation_param4_memref_parent); + invo_reply.set_operation_param4_memref_parent_flag(in_operation_param4_memref_parent_flag); + invo_reply.set_operation_param4_memref_size(operation_param4_memref_size); + invo_reply.set_operation_param4_memref_offset(operation_param4_memref_offset); + invo_reply.set_operation_param4_value_a(operation_param4_value_a); + invo_reply.set_operation_param4_value_b(operation_param4_value_b); + invo_reply.set_operation_param4_ionref_ionsharefd(operation_param4_ionref_ionsharefd); + invo_reply.set_operation_param4_ionref_ionsize(operation_param4_ionref_ionsize); + + invo_reply.set_operation_session(operation_session); + invo_reply.set_operation_cancelflag(operation_cancelflag); + invo_reply.set_returnorigin(returnorigin); + + invo_reply.set_buffer1_outsize(buffer1_realsize); + invo_reply.set_buffer2_outsize(buffer2_realsize); + invo_reply.set_buffer3_outsize(buffer3_realsize); + invo_reply.set_buffer4_outsize(buffer4_realsize); + + if (buffer1_realsize > 0 && + buffer1 != NULL + ) + { + for (int i = 0; i < buffer1_realsize; i++) + + invo_reply.add_buffer1(buffer1[i]); + } + + if (buffer2_realsize > 0 && + buffer2 != NULL + ) + { + for (int i = 0; i < buffer2_realsize; i++) + invo_reply.add_buffer2(buffer2[i]); + } + + if (buffer3_realsize > 0 && + buffer3 != NULL + ) + { + for (int i = 0; i < buffer3_realsize; i++) + invo_reply.add_buffer3(buffer3[i]); + } + + if (buffer4_realsize > 0 && + buffer4 != NULL + ) + { + for (int i = 0; i < buffer4_realsize; i++) + invo_reply.add_buffer4(buffer4[i]); + } + status_ = FINISH; + gettimeofday(&end, NULL); + int64_t i64Time; + i64Time = (end.tv_sec - start.tv_sec) * 1000000 + + (end.tv_usec - start.tv_usec); + printf("gpp invokecommand used time: %ld us. \n", i64Time); + + invo_response.Finish(invo_reply, Status::OK, this); + } + }else + { + std::cout << "gpp receive no invokecommand jwtsvid or validate jwt failed" << std::endl; + flag = 2; + invo_reply.set_flag(flag); + status_ = FINISH; + + invo_response.Finish(invo_reply, Status::OK, this); + } + break; + } + + case ServerImpl::CallData::SS_TEECC_TA: + { + std::string token; + token = ta_chunk.token(); + std::int32_t flag = 0; + + std::string noToken("noToken"); + int ivaljwtResult = -1; + int iforceValidateJwt = global_force_valideta_jwt; + + if + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + ) + { + char Token[1024]; + strcpy(Token, (char *) token.data()); + ivaljwtResult = + dbusmethodcall_validate_jwt( + Token + ); + std::cout << "gpp validate deployta jwtsvid" << std::endl; + } else + { + std::cout << "gpp no validate deployta jwtsvid" << std::endl; + } + + if + ( + iforceValidateJwt != 1 + || + ( + iforceValidateJwt == 1 + && + token.compare(noToken) != 0 + && + ivaljwtResult == NO_ERROR + ) + ) + { + std::cout << "gpp does not need validate deployta jwtsvid or validate jwt succed" << std::endl; + std::cout << "gpp received deployta " << std::endl; + + std::string remote_sha256 = ta_chunk.sha256(); + + std::string subdir = ta_chunk.subdir(); + + std::string name = ta_chunk.name(); + name = "/data/" + subdir + "/" + name; + const char *filename = name.data(); + + std::cout << "gpp deployta, full namepath: " << name << std::endl; + + if (access(name.c_str(), F_OK) != -1) + { + std::cout << "gpp deloyta: ta file exist" << std::endl; + + char *name_temp = const_cast(name.data()); + char local_sha256_temp[SHA256_LENTH]; + int iRet; + iRet = get_file_sha256((char *) name_temp, local_sha256_temp); + if (iRet != 0) + { + ta_reply.set_code(-2); + status_ = FINISH; + + ta_response.Finish(ta_reply, Status::OK, this); + } else + { + + char remote_sha256_temp[SHA256_LENTH + 1]; + strcpy(remote_sha256_temp, remote_sha256.c_str()); + + + + if (memcmp(local_sha256_temp, remote_sha256_temp, SHA256_LENTH) == 0) + { + std::cout << "gpp deloyta: sha256 vals are the same" << std::endl; + + status_ = FINISH; + ta_reply.set_code(0); + + ta_response.Finish(ta_reply, Status::OK, this); + } else + { + std::cout << "gpp deloyta: sha256 vals are different, replace " << filename + << std::endl; + + std::ofstream outfile; + outfile.open(filename, + std::ofstream::out | std::ofstream::trunc | std::ofstream::binary); + + const char *data; + data = ta_chunk.buffer().c_str(); + outfile.write(data, ta_chunk.buffer().length()); + outfile.close(); + + status_ = FINISH; + ta_reply.set_code(0); + + ta_response.Finish(ta_reply, Status::OK, this); + } + + } + } else + { + std::string wholedir; + wholedir = "/data/" + subdir; + const char *charwholedir = wholedir.data(); + + std::cout << "gpp deployta, wholedir: " << wholedir << std::endl; + + struct stat st = {0}; + if (stat(charwholedir, &st) == -1) + { + std::cout << "gpp deployta, make a new dir " << wholedir << std::endl; + + int iResult; + iResult = mkdir(charwholedir, 0600); + + if (iResult != 0) + { + std::cout << "gpp deployta, make a new dir falied" << wholedir << std::endl; + } + } + + if (stat(charwholedir, &st) == 0) + { + std::cout << "gpp deloyta: write a new file " << filename << std::endl; + + std::ofstream outfile; + outfile.open(filename, std::ofstream::out | std::ofstream::trunc | std::ofstream::binary); + + const char *data; + data = ta_chunk.buffer().c_str(); + outfile.write(data, ta_chunk.buffer().length()); + outfile.close(); + + status_ = FINISH; + ta_reply.set_code(0); + + ta_response.Finish(ta_reply, Status::OK, this); + } else + { + ta_reply.set_code(-3); + status_ = FINISH; + + ta_response.Finish(ta_reply, Status::OK, this); + } + } + + }else + { + std::cout << "gpp receive no deployta jwtsvid or validate jwt failed" << std::endl; + ta_reply.set_code(-1); + ta_reply.set_flag(flag); + status_ = FINISH; + + ta_response.Finish(ta_reply, Status::OK, this); + } + + break; + } + + default: + break; + } + } else + { + GPR_ASSERT(status_ == FINISH); + delete this; + std::cout << std::endl; + } + } + + private: + gpp::AsyncService *service_; + ServerCompletionQueue *cq_; + ServerContext ctx_; + ServiceType s_type_; + Inicont_Request inicont_request; + Inicont_Reply inicont_reply; + ServerAsyncResponseWriter inicont_response; + Fincont_Request fincont_request; + Fincont_Reply fincont_reply; + ServerAsyncResponseWriter fincont_response; + Opes_Request opes_request; + Opes_Reply opes_reply; + ServerAsyncResponseWriter opes_response; + Close_Request close_request; + Close_Reply close_reply; + ServerAsyncResponseWriter close_response; + Invo_Request invo_request; + Invo_Reply invo_reply; + ServerAsyncResponseWriter invo_response; + TA_Chunk ta_chunk; + TA_Reply ta_reply; + ServerAsyncResponseWriter ta_response; + Setjwt_Request setjwt_request; + Setjwt_Reply setjwt_reply; + ServerAsyncResponseWriter setjwt_response; + + enum CallStatus + { + CREATE, PROCESS, CHECKCANCEL, FINISH + }; + CallStatus status_; + + pthread_mutex_t *mutex_workerrec_; + pthread_cond_t *cond_notbusy_; + wr_t *workerrec_; + }; + + void RunServer() + { + std::string server_address(gpproxy_address); + grpc::EnableDefaultHealthCheckService(true); + grpc::reflection::InitProtoReflectionServerBuilderPlugin(); + + + ServerBuilder builder; + builder.SetMaxReceiveMessageSize(50 * 1024 * 1024); + + std::cout << "gpproxy server key path = " << global_serverkey_path << std::endl; + std::cout << "gpproxy server cert path = " << global_servercert_path << std::endl; + std::cout << "gpproxy client ca cert path = " << global_clientcacert_path << std::endl; + + int igrpctls = grpc_tls; + switch (igrpctls) + { + case 0: + { + builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); + + break; + } + + case 1: + { + FILE *pipe; + char buffer[128]; + std::string result; + + std::string strcmd = "openssl rsa -in " + global_serverkey_path + " -out " + + global_serverkey_path + ".nopass"; + std::string nopass_serverkey_path = global_serverkey_path + ".nopass"; + + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; + exit(1); + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + + + strcmd = "openssl rsa -in " + nopass_serverkey_path + " -check -noout"; + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; + exit(1); + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + std::string keyok("RSA key ok\n"); + + if (result.compare(keyok) != 0) + { + std::cout << "gpp '" + global_serverkey_path + "' integrity is broken" << std::endl; + exit(1); + } + + std::string sigfile_path = global_strcfgfiletemp + "/.gpp/certs/msg.sig"; + std::string msgfile_path = global_strcfgfiletemp + "/.gpp/certs/msg.txt"; + strcmd = + "openssl dgst -sha256 -sign " + nopass_serverkey_path + " -out " + sigfile_path + " " + msgfile_path; + system(strcmd.c_str()); + // ${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} + std::string pubkeyfile_path = global_strcfgfiletemp + "/.gpp/certs/server_pubkey.pem"; + strcmd = "openssl x509 -in " + global_servercert_path + " -pubkey -out " + pubkeyfile_path; + system(strcmd.c_str()); + + // ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt + strcmd = "openssl dgst -sha256 -verify " + pubkeyfile_path + " -signature " + sigfile_path + " " + + msgfile_path; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; + exit(1); + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + std::string verifyok("Verified OK\n"); + if (result.compare(verifyok) != 0) + { + std::cout << "gpp '" + global_serverkey_path + "' is not matched with '" + global_servercert_path + "'" + << std::endl; + exit(1); + } + + std::string strdayseconds; + char *resulttemp; + const char slash[] = "\n"; + char *parresult; + std::string strparresult; + std::string willexpire("Certificate will expire"); + + // 7 days in seconds + strdayseconds = "604800"; + strcmd = "openssl x509 -enddate -noout -in " + global_servercert_path + " -checkend " + strdayseconds; + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; + exit(1); + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); +; + resulttemp = const_cast(result.data()); + parresult = strtok(resulttemp, slash); + while (parresult != NULL) + { + strparresult = std::string(parresult); + parresult = strtok(NULL, slash); + } + if (strparresult.compare(willexpire) == 0) + { + std::cout << "gpp '" << global_servercert_path << "' will expire in 7 days, please reget it" + << std::endl; + exit(1); + } + + auto serverkey = get_file_contents(nopass_serverkey_path); + strcmd = "rm -f " + global_serverkey_path + ".nopass"; + system(strcmd.c_str()); + strcmd = "rm -f " + pubkeyfile_path; + system(strcmd.c_str()); + strcmd = "rm -f " + sigfile_path; + system(strcmd.c_str()); + + auto servercert = get_file_contents(global_servercert_path); + grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = { + serverkey.c_str(), servercert.c_str() + }; + + grpc::SslServerCredentialsOptions ssl_opts(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE); + ssl_opts.pem_key_cert_pairs.push_back(pkcp); + std::shared_ptr creds; + creds = grpc::SslServerCredentials(ssl_opts); + + builder.AddListeningPort(server_address, creds); + + break; + } + + case 2: + { + FILE *pipe; + char buffer[128]; + std::string result; + + std::string strcmd = "openssl rsa -in " + global_serverkey_path + " -out " + + global_serverkey_path + ".nopass"; + std::string nopass_serverkey_path = global_serverkey_path + ".nopass"; + system(strcmd.c_str()); + + strcmd = "openssl rsa -in " + nopass_serverkey_path + " -check -noout"; + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; + exit(1); + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + std::string keyok("RSA key ok\n"); + if (result.compare(keyok) != 0) + { + std::cout << "gpp '" + global_serverkey_path + "' integrity is broken" << std::endl; + exit(1); + } + + std::string sigfile_path = global_strcfgfiletemp + "/.gpp/certs/msg.sig"; + std::string msgfile_path = global_strcfgfiletemp + "/.gpp/certs/msg.txt"; + strcmd = + "openssl dgst -sha256 -sign " + nopass_serverkey_path + " -out " + sigfile_path + " " + msgfile_path; + system(strcmd.c_str()); + // ${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} + std::string pubkeyfile_path = global_strcfgfiletemp + "/.gpp/certs/server_pubkey.pem"; + strcmd = "openssl x509 -in " + global_servercert_path + " -pubkey -out " + pubkeyfile_path; + system(strcmd.c_str()); + + // ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt + strcmd = "openssl dgst -sha256 -verify " + pubkeyfile_path + " -signature " + sigfile_path + " " + + msgfile_path; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; + exit(1); + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + std::string verifyok("Verified OK\n"); + if (result.compare(verifyok) != 0) + { + std::cout << "gpp '" + global_serverkey_path + "' is not matched with '" + global_servercert_path + "'" + << std::endl; + exit(1); + } + + std::string strdayseconds; + char *resulttemp; + const char slash[] = "\n"; + char *parresult; + std::string strparresult; + std::string willexpire("Certificate will expire"); + + // 7 days in seconds + strdayseconds = "604800"; + strcmd = "openssl x509 -enddate -noout -in " + global_servercert_path + " -checkend " + strdayseconds; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; + exit(1); + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + + resulttemp = const_cast(result.data()); + parresult = strtok(resulttemp, slash); + while (parresult != NULL) + { + strparresult = std::string(parresult); + parresult = strtok(NULL, slash); + } + if (strparresult.compare(willexpire) == 0) + { + std::cout << "gpp '" << global_servercert_path << "' will expire in 7 days, please reget it" + << std::endl; + exit(1); + } + + strdayseconds = "604800"; + strcmd = "openssl x509 -enddate -noout -in " + global_clientcacert_path + " -checkend " + strdayseconds; + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; + exit(1); + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + resulttemp = const_cast(result.data()); + parresult = strtok(resulttemp, slash); + while (parresult != NULL) + { + strparresult = std::string(parresult); + parresult = strtok(NULL, slash); + } + if (strparresult.compare(willexpire) == 0) + { + std::cout << "gpp '" << global_clientcacert_path << "' will expire in 7 days, please reget it" + << std::endl; + exit(1); + } + + auto serverkey = get_file_contents(nopass_serverkey_path); + strcmd = "rm -f " + global_serverkey_path + ".nopass"; + system(strcmd.c_str()); + strcmd = "rm -f " + pubkeyfile_path; + system(strcmd.c_str()); + strcmd = "rm -f " + sigfile_path; + system(strcmd.c_str()); + + auto servercert = get_file_contents(global_servercert_path); + auto clientcacert = get_file_contents(global_clientcacert_path); // for verifying clients + grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = { + serverkey.c_str(), servercert.c_str() + }; + + grpc::SslServerCredentialsOptions ssl_opts(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY); + ssl_opts.pem_root_certs = clientcacert; + ssl_opts.pem_key_cert_pairs.push_back(pkcp); + std::shared_ptr creds; + creds = grpc::SslServerCredentials(ssl_opts); + + builder.AddListeningPort(server_address, creds); + + break; + } + + default: + { + builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); + } + } + + + // Register "service" as the instance through which we'll communicate with + // clients. In this case it corresponds to an *synchronous* service. + builder.RegisterService(&service_); + + for (int i = 0; i < global_max_num_thread; i++) + { + cq_.emplace_back(builder.AddCompletionQueue()); + } + server_ = builder.BuildAndStart(); + //Finally assemble the server. + std::cout << "gpproxy is listening on " << server_address << std::endl; + + server_threads_.emplace_back(std::thread( + [this] + { + this->session_timeout_process(&mutex_workerrec, workerrec); + } + )); + server_threads_.emplace_back(std::thread( + [this] + { + this->context_timeout_process(&mutex_workerrec, &cond_notbusy, workerrec); + } + )); + + for (unsigned int i = 0; i < global_max_num_thread; i++) + { + server_threads_.emplace_back(std::thread( + [this, i] + { + this->HandleRpcs(i); + })); + std::cout << "thread " << i << " created." << std::endl; + } + std::this_thread::sleep_until(std::chrono::time_point::max()); + } + + void HandleRpcs(int i) + { + new CallData(&service_, + cq_[i].get(), + ServerImpl::CallData::SS_TEECC_InitializeContext, + &mutex_workerrec, + &cond_notbusy, + workerrec); + new CallData(&service_, + cq_[i].get(), + ServerImpl::CallData::SS_TEECC_FinalizeContext, + &mutex_workerrec, &cond_notbusy, + workerrec); + new CallData(&service_, + cq_[i].get(), + ServerImpl::CallData::SS_TEECC_OpenSession, + &mutex_workerrec, + &cond_notbusy, + workerrec); + new CallData(&service_, + cq_[i].get(), + ServerImpl::CallData::SS_TEECC_CloseSession, + &mutex_workerrec, + &cond_notbusy, + workerrec); + new CallData(&service_, + cq_[i].get(), + ServerImpl::CallData::SS_TEECC_InvokeCommand, + &mutex_workerrec, + &cond_notbusy, + workerrec); + new CallData(&service_, + cq_[i].get(), + ServerImpl::CallData::SS_TEECC_TA, + &mutex_workerrec, + &cond_notbusy, + workerrec); + + new CallData(&service_, + cq_[i].get(), + ServerImpl::CallData::SS_TEECC_SetJwt, + &mutex_workerrec, + &cond_notbusy, + workerrec); + + void *tag; + bool ok; + + while (true) + { + GPR_ASSERT(cq_[i]->Next(&tag, &ok)); + std::cout << "gpp thread[" << i << "], cq_[" << i << "]" + << std::endl; + + static_cast(tag)->Process(); + } + } + + void + session_timeout_process( + pthread_mutex_t *mutex_workerrec, + wr_t *workerrec + ) + { + struct timeval tv; + uint64_t u64time; + + char workername[1024]; + memset((char *) workername, 0, 1024); + int iworker; + + uint32_t in_session_seesionid; + uint32_t in_session_serviceid_timelow = 0; + uint32_t in_session_serviceid_timemid = 0; + uint32_t in_session_serviceid_timehiandver = 0; + uint32_t in_session_serviceid_clockseqandnode_size = 8; + uint32_t in_session_serviceid_clockseqandnode[8]; + uint32_t in_session_opscnt = 0; + uint64_t in_session_head_next = 0; + uint64_t in_session_head_prev = 0; + uint64_t in_session_context; + + uint32_t seesionid; + uint32_t serviceid_timelow; + uint32_t serviceid_timemid; + uint32_t serviceid_timehiandver; + uint32_t *serviceid_clockseqandnode; + int serviceid_clockseqandnode_realsize; + uint32_t opscnt; + uint64_t head_next; + uint64_t head_prev; + uint64_t session_context; + + sin_t *sinIns; + + while (1) + { + sleep(global_timeout_session); + + pthread_mutex_lock(mutex_workerrec); + for (iworker = 0; iworker < global_max_num_worker; iworker++) + { + if (workerrec[iworker].busy == 1) + { + sinIns = NULL; + if (workerrec[iworker].first != NULL) + { + sinIns = workerrec[iworker].first; + do + { + gettimeofday(&tv, NULL); + u64time = (long unsigned int) (tv.tv_sec - + sinIns->session_createtime.tv_sec + ); + sin_t *sinTemp = NULL; + + if (u64time > global_timeout_session) + { + sprintf(workername, "%s%d", "gpworker", iworker); + + in_session_seesionid = sinIns->session_id; + in_session_context = workerrec[iworker].context_addr; + + for (int iind = 0; iind < 8; iind++) + { + in_session_serviceid_clockseqandnode[iind] = 0; + } + + pthread_mutex_unlock(mutex_workerrec); + + uint32_t serviceid_clockseqandnode_outsize_temp; + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(uint32_t) + ); + + printf("\ngpp method call teec closesession for timeout process \n"); + method_call_teec_closesession( + workername, + + in_session_seesionid, + in_session_serviceid_timelow, + in_session_serviceid_timemid, + in_session_serviceid_timehiandver, + in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_size, + in_session_opscnt, + in_session_head_next, + in_session_head_prev, + in_session_context, + + &seesionid, + &serviceid_timelow, + &serviceid_timemid, + &serviceid_timehiandver, + serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize, + &serviceid_clockseqandnode_outsize_temp, + &opscnt, + &head_next, + &head_prev, + &session_context + ); + + if (serviceid_clockseqandnode != NULL) + { + free(serviceid_clockseqandnode); + } + + pthread_mutex_lock(mutex_workerrec); + + sinTemp = sinIns->prev; + if (sinTemp != NULL) + { + sinTemp->next = sinIns->next; + } + sinTemp = sinIns->next; + if (sinTemp != NULL) + { + sinTemp->prev = sinIns->prev; + } + if (workerrec[iworker].last == sinIns) + { + workerrec[iworker].last = sinIns->prev; + } + if (workerrec[iworker].first == sinIns) + { + workerrec[iworker].first = sinIns->next; + } + + sinTemp = sinIns; + workerrec[iworker].sessionid_count = + workerrec[iworker].sessionid_count - 1; + + } // end of if timedout + sinIns = sinIns->next; + if (sinTemp != NULL) + { + free(sinTemp); + } + } while (sinIns != NULL); + + } // end of the first not null + } // end of the busy = 1 + } // end of the for iworker + pthread_mutex_unlock(mutex_workerrec); + } // end of while 1 + // return NULL; + } + + void + context_timeout_process( + pthread_mutex_t *mutex_workerrec, + pthread_cond_t *cond_notbusy, + wr_t *workerrec + ) + { + struct timeval tv; + uint64_t u64time; + + char workername[1024]; + memset((char *) workername, 0, 1024); + int iworker; + + int32_t in_fd; + unsigned char *in_ta_path = NULL; + int32_t in_ta_path_size = 0; + uint64_t in_session_list_next = 0; + uint64_t in_session_list_prev = 0; + uint64_t in_shrd_mem_list_next = 0; + uint64_t in_shrd_mem_list_prev = 0; + uint64_t in_share_buffer_buffer = 0; + int64_t in_share_buffer_buffer_barrier = 0; + uint64_t in_context_addr; + + int32_t fd; + unsigned char *ta_path; + int32_t ta_path_size; + uint64_t session_list_next; + uint64_t session_list_prev; + uint64_t shrd_mem_list_next; + uint64_t shrd_mem_list_prev; + uint64_t share_buffer_buffer; + int64_t share_buffer_buffer_barrier; + uint32_t context_tapath_outsize; + + while (1) + { + sleep(global_timeout_context); + + pthread_mutex_lock(mutex_workerrec); + for (iworker = 0; iworker < global_max_num_worker; iworker++) + { + if (workerrec[iworker].busy == 1) + { + sprintf(workername, "%s%d", "gpworker", iworker); + gettimeofday(&tv, NULL); + u64time = (long unsigned int) (tv.tv_sec - + workerrec[iworker].context_createtime.tv_sec + ); + + if (u64time > global_timeout_context + && + workerrec[iworker].sessionid_count == 0 + ) + { + in_fd = workerrec[iworker].context_fd; + in_context_addr = workerrec[iworker].context_addr; + ta_path = (unsigned char *) malloc(1024 * sizeof(char)); + ta_path_size = 1024; + memset((char *) ta_path, 0, 1024); + + pthread_mutex_unlock(mutex_workerrec); + + printf("\ngpp method call teec finalizecontext for timeout process \n"); + method_call_teec_fincont( + workername, + + in_fd, + in_ta_path, + in_ta_path_size, + in_session_list_next, + in_session_list_prev, + in_shrd_mem_list_next, + in_shrd_mem_list_prev, + in_share_buffer_buffer, + in_share_buffer_buffer_barrier, + in_context_addr, + + &fd, + ta_path, + ta_path_size, + &session_list_next, + &session_list_prev, + &shrd_mem_list_next, + &shrd_mem_list_prev, + &share_buffer_buffer, + &share_buffer_buffer_barrier, + + &context_tapath_outsize + ); + + if (ta_path != NULL) + { + free(ta_path); + } + + pthread_mutex_lock(mutex_workerrec); + + workerrec[iworker].busy = 0; + pthread_cond_signal(cond_notbusy); + workerrec[iworker].context_fd = 0; + workerrec[iworker].context_addr = 0xffffffff; + workerrec[iworker].sessionid_count = 0; + sin_t *sinIns; + sin_t *sinInsPrev; + sinIns = workerrec[iworker].last; + if (sinIns != NULL) + { + for (;;) + { + sinInsPrev = sinIns->prev; + free(sinIns); + sinIns = sinInsPrev; + if (sinIns == NULL) + { + break; + } + } + } + + } // end of the if timeed out + } // end of the if busy = 1 + } // end of the for iworker + pthread_mutex_unlock(mutex_workerrec); + + } // end of while 1 + } + +private: + std::vector > cq_; + gpp::AsyncService service_; + std::unique_ptr server_; + std::vector server_threads_; + + pthread_mutex_t mutex_workerrec; + pthread_cond_t cond_notbusy; + wr_t *workerrec = new wr_t[global_max_num_worker]; +}; + + +int main(int argc, char **argv) +{ + std::cout << "gpproxy glo_config file = " << global_strcfgfile << std::endl; + check_config(); + ServerImpl server; + + server.RunServer(); + + return 0; +} diff --git a/cc-resource-pooling/teeproxy/gpproxy/gpproxy.h b/cc-resource-pooling/teeproxy/gpproxy/gpproxy.h new file mode 100644 index 0000000..18fe311 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/gpproxy.h @@ -0,0 +1,21 @@ +#ifndef _GPPROXY_H +#define _GPPROXY_H +typedef struct sessionid_node +{ + uint32_t session_id; + struct timeval session_createtime; + struct sessionid_node *next; + struct sessionid_node *prev; +} sin_t; + +typedef struct worker_rec +{ + uint8_t busy; + int32_t context_fd; + uint64_t context_addr; + struct timeval context_createtime; + int sessionid_count; + sin_t *first; + sin_t *last; +} wr_t; +#endif // _GPPROXY_H diff --git a/cc-resource-pooling/teeproxy/gpproxy/protos/gt.proto b/cc-resource-pooling/teeproxy/gpproxy/protos/gt.proto new file mode 100644 index 0000000..3eeff06 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpproxy/protos/gt.proto @@ -0,0 +1,392 @@ +// + +syntax = "proto3"; + +option java_multiple_files = true; +option java_package = "io.grpc.gt"; +option java_outer_classname = "gtProto"; +option objc_class_prefix = "HLW"; + +package gt; + +// The gpp service definition. +service gpp { + rpc TEECC_InitializeContext (Inicont_Request) returns (Inicont_Reply) {} + rpc TEECC_FinalizeContext (Fincont_Request) returns (Fincont_Reply) {} + rpc TEECC_OpenSession (Opes_Request) returns (Opes_Reply) {} + rpc TEECC_InvokeCommand (Invo_Request) returns (Invo_Reply) {} + rpc TEECC_CloseSession (Close_Request) returns (Close_Reply) {} + rpc TEECC_TA(TA_Chunk) returns (TA_Reply) {} + rpc TEECC_SetJwt(Setjwt_Request) returns (Setjwt_Reply) {} +} + + +message Inicont_Request { + uint64 name_size = 1; + string name = 2; + string token = 3; + string taname = 4; +} + +message Inicont_Reply { + uint32 teecresult = 1; + int32 context_fd = 2; + uint64 context_tapath_outsize = 3; + bytes context_tapath = 4; + uint64 context_sessionlist_next = 5; + uint64 context_sessionlist_prev = 6; + uint64 context_shrdmemlist_next = 7; + uint64 context_shrdmemlist_prev = 8; + uint64 context_sharebuffer_buffer = 9; + int64 context_sharebuffer_bufferbarrier = 10; + uint64 context_addr = 11; + int32 flag = 12; +} + +message Fincont_Request { + int32 in_context_fd = 1; + uint64 in_context_tapath_size= 2; + bytes in_context_tapath = 3; + uint64 in_context_sessionlist_next = 4; + uint64 in_context_sessionlist_prev = 5; + uint64 in_context_shrdmemlist_next = 6; + uint64 in_context_shrdmemlist_prev = 7; + uint64 in_context_sharebuffer_buffer = 8; + int64 in_context_sharebuffer_bufferbarrier = 9; + uint64 in_context_addr = 10; + string token = 11; + string taname = 12; +} + +message Fincont_Reply { + int32 context_fd = 1; + uint64 context_tapath_outsize = 2; + bytes context_tapath = 3; + uint64 context_sessionlist_next = 4; + uint64 context_sessionlist_prev = 5; + uint64 context_shrdmemlist_next = 6; + uint64 context_shrdmemlist_prev = 7; + uint64 context_sharebuffer_buffer = 8; + int64 context_sharebuffer_bufferbarrier = 9; + uint64 context_addr = 10; + int32 flag = 11; +} + +message Opes_Request { + int32 in_context_fd = 1; + uint64 in_context_tapath_size= 2; + bytes in_context_tapath = 3; + uint64 in_context_sessionlist_next = 4; + uint64 in_context_sessionlist_prev = 5; + uint64 in_context_shrdmemlist_next = 6; + uint64 in_context_shrdmemlist_prev = 7; + uint64 in_context_sharebuffer_buffer = 8; + int64 in_context_sharebuffer_bufferbarrier = 9; + uint32 in_destination_timelow = 10; + uint32 in_destination_timemid = 11; + uint32 in_destination_timehiandver = 12; + uint64 in_destination_cad_size = 13; + repeated uint32 in_destination_clockseqandnode = 14; + uint32 in_connectionmethod = 15; + uint64 in_connectiondata = 16; + uint32 in_operation_started = 17; + uint32 in_operation_paramtypes = 18; + uint64 in_operation_param1_tmpref_buffer = 19; + uint32 in_operation_param1_tmpref_size = 20; + uint64 in_operation_param1_memref_parent = 21; + uint32 in_operation_param1_memref_size = 22; + uint32 in_operation_param1_memref_offset = 23; + uint32 in_operation_param1_value_a = 24; + uint32 in_operation_param1_value_b = 25; + int32 in_operation_param1_ionref_ionsharefd = 26; + uint32 in_operation_param1_ionref_ionsize = 27; + uint64 in_operation_param2_tmpref_buffer = 28; + uint32 in_operation_param2_tmpref_size = 29; + uint64 in_operation_param2_memref_parent = 30; + uint32 in_operation_param2_memref_size = 31; + uint32 in_operation_param2_memref_offset = 32; + uint32 in_operation_param2_value_a = 33; + uint32 in_operation_param2_value_b = 34; + int32 in_operation_param2_ionref_ionsharefd = 35; + uint32 in_operation_param2_ionref_ionsize = 36; + uint64 in_operation_param3_tmpref_buffer = 37; + uint32 in_operation_param3_tmpref_size = 38; + uint64 in_operation_param3_memref_parent = 39; + uint32 in_operation_param3_memref_size = 40; + uint32 in_operation_param3_memref_offset = 41; + uint32 in_operation_param3_value_a = 42; + uint32 in_operation_param3_value_b = 43; + int32 in_operation_param3_ionref_ionsharefd = 44; + uint32 in_operation_param3_ionref_ionsize = 45; + uint64 in_operation_param4_tmpref_buffer = 46; + uint32 in_operation_param4_tmpref_size = 47; + uint64 in_operation_param4_memref_parent = 48; + uint32 in_operation_param4_memref_size = 49; + uint32 in_operation_param4_memref_offset = 50; + uint32 in_operation_param4_value_a = 51; + uint32 in_operation_param4_value_b = 52; + int32 in_operation_param4_ionref_ionsharefd = 53; + uint32 in_operation_param4_ionref_ionsize = 54; + uint64 in_operation_session = 55; + int32 in_operation_cancelflag = 56; + uint32 in_returnorigin = 57; + uint64 in_context_addr = 58; + string token = 59; + string taname = 60; +} + +message Opes_Reply { + uint32 teecresult = 1; + int32 context_fd = 2; + bytes context_tapath = 3 ; + uint64 context_tapath_outsize = 4; + uint64 context_sessionlist_next = 5; + uint64 context_sessionlist_prev = 6; + uint64 context_shrdmemlist_next = 7; + uint64 context_shrdmemlist_prev = 8; + uint64 context_sharebuffer_buffer = 9; + int64 context_sharebuffer_bufferbarrier = 10; + uint32 session_sessionid = 11; + uint32 session_serviceid_timelow = 12; + uint32 session_serviceid_timemid = 13; + uint32 session_serviceid_timehiandver = 14; + uint64 session_serviceid_clockseqandnode_outsize = 15; + repeated uint32 session_serviceid_clockseqandnode = 16; + uint32 session_opscnt = 17; + uint64 session_head_next = 18; + uint64 session_head_prev = 19; + uint64 session_context = 20; + uint32 operation_started = 21; + uint32 operation_paramtypes = 22; + uint64 operation_param1_tmpref_buffer = 23; + uint32 operation_param1_tmpref_size = 24; + uint64 operation_param1_memref_parent = 25; + uint32 operation_param1_memref_size = 26; + uint32 operation_param1_memref_offset = 27; + uint32 operation_param1_value_a = 28; + uint32 operation_param1_value_b = 29; + int32 operation_param1_ionref_ionsharefd = 30; + uint32 operation_param1_ionref_ionsize = 31; + uint64 operation_param2_tmpref_buffer = 32; + uint32 operation_param2_tmpref_size = 33; + uint64 operation_param2_memref_parent = 34; + uint32 operation_param2_memref_size = 35; + uint32 operation_param2_memref_offset = 36; + uint32 operation_param2_value_a = 37; + uint32 operation_param2_value_b = 38; + int32 operation_param2_ionref_ionsharefd = 39; + uint32 operation_param2_ionref_ionsize = 40; + uint64 operation_param3_tmpref_buffer = 41; + uint32 operation_param3_tmpref_size = 42; + uint64 operation_param3_memref_parent = 43; + uint32 operation_param3_memref_size = 44; + uint32 operation_param3_memref_offset = 45; + uint32 operation_param3_value_a = 46; + uint32 operation_param3_value_b = 47; + int32 operation_param3_ionref_ionsharefd = 48; + uint32 operation_param3_ionref_ionsize = 49; + uint64 operation_param4_tmpref_buffer = 50; + uint32 operation_param4_tmpref_size = 51; + uint64 operation_param4_memref_parent = 52; + uint32 operation_param4_memref_size = 53; + uint32 operation_param4_memref_offset = 54; + uint32 operation_param4_value_a = 55; + uint32 operation_param4_value_b = 56; + int32 operation_param4_ionref_ionsharefd = 57; + uint32 operation_param4_ionref_ionsize = 58; + uint64 operation_session = 59; + int32 operation_cancelflag = 60; + uint32 returnorigin = 61; + int32 flag = 62; +} + +message Invo_Request { + uint32 in_session_sessionid = 1; + uint32 in_session_serviceid_timelow = 2; + uint32 in_session_serviceid_timemid = 3; + uint32 in_session_serviceid_timehiandver = 4; + uint64 in_session_serviceid_cad_size = 5; + repeated uint32 in_session_serviceid_clockseqandnode = 6; + uint32 in_session_opscnt = 7; + uint64 in_session_head_next = 8; + uint64 in_session_head_prev = 9; + uint64 in_session_context = 10; + uint32 in_commandid = 11; + uint32 in_operation_started = 12; + uint32 in_operation_paramtypes = 13; + uint64 in_operation_param1_tmpref_buffer = 14; + uint32 in_operation_param1_tmpref_size = 15; + uint64 in_operation_param1_memref_parent = 16; + uint32 in_operation_param1_memref_parent_flag = 17; + uint32 in_operation_param1_memref_size = 18; + uint32 in_operation_param1_memref_offset = 19; + uint32 in_operation_param1_value_a = 20; + uint32 in_operation_param1_value_b = 21; + int32 in_operation_param1_ionref_ionsharefd = 22; + uint32 in_operation_param1_ionref_ionsize = 23; + uint64 in_operation_param2_tmpref_buffer = 24; + uint32 in_operation_param2_tmpref_size = 25; + uint64 in_operation_param2_memref_parent = 26; + uint32 in_operation_param2_memref_parent_flag = 27; + uint32 in_operation_param2_memref_size = 28; + uint32 in_operation_param2_memref_offset = 29; + uint32 in_operation_param2_value_a = 30; + uint32 in_operation_param2_value_b = 31; + int32 in_operation_param2_ionref_ionsharefd = 32; + uint32 in_operation_param2_ionref_ionsize = 33; + uint64 in_operation_param3_tmpref_buffer = 34; + uint32 in_operation_param3_tmpref_size = 35; + uint64 in_operation_param3_memref_parent = 36; + uint32 in_operation_param3_memref_parent_flag = 37; + uint32 in_operation_param3_memref_size = 38; + uint32 in_operation_param3_memref_offset = 39; + uint32 in_operation_param3_value_a = 40; + uint32 in_operation_param3_value_b = 41; + int32 in_operation_param3_ionref_ionsharefd = 42; + uint32 in_operation_param3_ionref_ionsize = 43; + uint64 in_operation_param4_tmpref_buffer = 44; + uint32 in_operation_param4_tmpref_size = 45; + uint64 in_operation_param4_memref_parent = 46; + uint32 in_operation_param4_memref_parent_flag = 47; + uint32 in_operation_param4_memref_size = 48; + uint32 in_operation_param4_memref_offset = 49; + uint32 in_operation_param4_value_a = 50; + uint32 in_operation_param4_value_b = 51; + int32 in_operation_param4_ionref_ionsharefd = 52; + uint32 in_operation_param4_ionref_ionsize = 53; + uint64 in_operation_session = 54; + int32 in_operation_cancelflag = 55; + uint32 in_returnorigin = 56; + uint64 in_bufer1_size = 57; + repeated uint32 in_buffer1 = 58; + uint64 in_bufer2_size = 59; + repeated uint32 in_buffer2 = 60; + uint64 in_bufer3_size = 61; + repeated uint32 in_buffer3 = 62; + uint64 in_bufer4_size = 63; + repeated uint32 in_buffer4 = 64; + string token = 65; + string taname = 66; +} + +message Invo_Reply { + uint32 teecresult = 1; + uint32 session_sessionid = 2; + uint32 session_serviceid_timelow = 3; + uint32 session_serviceid_timemid = 4; + uint32 session_serviceid_timehiandver = 5; + uint64 session_serviceid_clockseqandnode_outsize = 6; + repeated uint32 session_serviceid_clockseqandnode = 7; + uint32 session_opscnt = 8; + uint64 session_head_next = 9; + uint64 session_head_prev = 10; + uint64 session_context = 11; + uint32 operation_started = 12; + uint32 operation_paramtypes = 13; + uint64 operation_param1_tmpref_buffer = 14; + uint32 operation_param1_tmpref_size = 15; + uint64 operation_param1_memref_parent = 16; + uint32 operation_param1_memref_parent_flag = 17; + uint32 operation_param1_memref_size = 18; + uint32 operation_param1_memref_offset = 19; + uint32 operation_param1_value_a = 20; + uint32 operation_param1_value_b = 21; + int32 operation_param1_ionref_ionsharefd = 22; + uint32 operation_param1_ionref_ionsize = 23; + uint64 operation_param2_tmpref_buffer = 24; + uint32 operation_param2_tmpref_size = 25; + uint64 operation_param2_memref_parent = 26; + uint32 operation_param2_memref_parent_flag = 27; + uint32 operation_param2_memref_size = 28; + uint32 operation_param2_memref_offset = 29; + uint32 operation_param2_value_a = 30; + uint32 operation_param2_value_b = 31; + int32 operation_param2_ionref_ionsharefd = 32; + uint32 operation_param2_ionref_ionsize = 33; + uint64 operation_param3_tmpref_buffer = 34; + uint32 operation_param3_tmpref_size = 35; + uint64 operation_param3_memref_parent = 36; + uint32 operation_param3_memref_parent_flag = 37; + uint32 operation_param3_memref_size = 38; + uint32 operation_param3_memref_offset = 39; + uint32 operation_param3_value_a = 40; + uint32 operation_param3_value_b = 41; + int32 operation_param3_ionref_ionsharefd = 42; + uint32 operation_param3_ionref_ionsize = 43; + uint64 operation_param4_tmpref_buffer = 44; + uint32 operation_param4_tmpref_size = 45; + uint64 operation_param4_memref_parent = 46; + uint32 operation_param4_memref_parent_flag = 47; + uint32 operation_param4_memref_size = 48; + uint32 operation_param4_memref_offset = 49; + uint32 operation_param4_value_a = 50; + uint32 operation_param4_value_b = 51; + int32 operation_param4_ionref_ionsharefd = 52; + uint32 operation_param4_ionref_ionsize = 53; + uint64 operation_session = 54; + int32 operation_cancelflag = 55; + uint32 returnorigin = 56; + + uint64 buffer1_outsize = 57; + uint64 buffer2_outsize = 58; + uint64 buffer3_outsize = 59; + uint64 buffer4_outsize = 60; + + repeated uint32 buffer1 = 61; + repeated uint32 buffer2 = 62; + repeated uint32 buffer3 = 63; + repeated uint32 buffer4 = 64; + int32 flag = 65; +} + +message Close_Request { + uint32 in_session_sessionid = 1; + uint32 in_session_serviceid_timelow = 2; + uint32 in_session_serviceid_timemid = 3; + uint32 in_session_serviceid_timehiandver = 4; + uint64 in_session_serviceid_cad_size = 5; + repeated uint32 in_session_serviceid_clockseqandnode = 6; + uint32 in_session_opscnt = 7; + uint64 in_session_head_next = 8; + uint64 in_session_head_prev = 9; + uint64 in_session_context = 10; + string token = 11; + string taname = 12; +} + +message Close_Reply { + uint32 session_sessionid = 1; + uint32 session_serviceid_timelow = 2; + uint32 session_serviceid_timemid = 3; + uint32 session_serviceid_timehiandver = 4; + uint64 session_serviceid_cad_outsize = 5; + repeated uint32 session_serviceid_clockseqandnode = 6; + uint32 session_opscnt = 7; + uint64 session_head_next = 8; + uint64 session_head_prev = 9; + uint64 session_context = 10; + int32 flag = 11; +} + +message TA_Chunk{ + string name = 1; + bytes buffer = 2; + string token = 3; + string taname = 4; + bytes sha256 = 5; + string subdir = 6; +} + +message TA_Reply{ + int32 code = 1; + int32 flag = 2; +} + +message Setjwt_Request{ + string taname = 1; + string token = 2; +} + +message Setjwt_Reply{ + int32 retcode = 1; +} diff --git a/cc-resource-pooling/teeproxy/gpworker/README b/cc-resource-pooling/teeproxy/gpworker/README new file mode 100644 index 0000000..28ceb87 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpworker/README @@ -0,0 +1,8 @@ +DBus IPC + +packages installed: +dbus +libdbus-1-3 +libdbus-1-dev +libdbus-glib-1-2 + diff --git a/cc-resource-pooling/teeproxy/gpworker/build/Makefile b/cc-resource-pooling/teeproxy/gpworker/build/Makefile new file mode 100644 index 0000000..45cd212 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpworker/build/Makefile @@ -0,0 +1,28 @@ +CUR_DIR=$(shell pwd) +iTrustee_SDK_PATH=${CUR_DIR}/../../../.. + +TARGET_APP := gpworker + +APP_SOURCES := ../gpworker.c ../threadpool.c ../condition.c ../tzcp_dbus.c + +# APP_SOURCES += $(iTrustee_SDK_PATH)/src/CA/cloud/libteec_adaptor.c + +APP_CFLAGS += -fstack-protector-strong -fPIC -g + +APP_CFLAGS += -I$(iTrustee_SDK_PATH)/include/CA -I$(iTrustee_SDK_PATH)/thirdparty/open_source/libboundscheck/include + +APP_CFLAGS += -I/usr/include/dbus-1.0 -I/usr/lib64/dbus-1.0/include + +APP_LDFLAGS += -ldl -lpthread -lboundscheck -lteec -lm + +APP_LDFLAGS += -z text -z now -z relro -z noexecstack -pie + +APP_LDFLAGS += `pkg-config --libs --cflags dbus-1` + +APP_OBJECTS := $(APP_SOURCES:.c=.o) +$(TARGET_APP): $(APP_SOURCES) + @$(CC) $(APP_CFLAGS) -o $@ $(APP_SOURCES) $(APP_LDFLAGS) +# aarch64-linux-gnu-gcc $(APP_CFLAGS) -o $@ $(APP_SOURCES) $(APP_LDFLAGS) + +clean: + rm -f *.o $(TARGET_APP) diff --git a/cc-resource-pooling/teeproxy/gpworker/build/r.sh b/cc-resource-pooling/teeproxy/gpworker/build/r.sh new file mode 100644 index 0000000..5f02fd2 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpworker/build/r.sh @@ -0,0 +1,7 @@ +#!bin/bash + +pkill gpworker +cp -r gpworker /vendor/bin/gpworker +rm -f *.log + +parallel -j 128 --ungroup /vendor/bin/gpworker gpworker{} ::: {0..127} diff --git a/cc-resource-pooling/teeproxy/gpworker/changelog.md b/cc-resource-pooling/teeproxy/gpworker/changelog.md new file mode 100644 index 0000000..f66c4e1 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpworker/changelog.md @@ -0,0 +1,7 @@ +# 更新日志 + +## [1.0.0] - 2022-10-11 + +### 新增 + +* 项目初始化,上传第一版 diff --git a/cc-resource-pooling/teeproxy/gpworker/condition.c b/cc-resource-pooling/teeproxy/gpworker/condition.c new file mode 100644 index 0000000..cf135cc --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpworker/condition.c @@ -0,0 +1,55 @@ +#include "condition.h" + +int condition_init(condition_t *cond) +{ + int status; + if ((status = pthread_mutex_init(&cond->pmutex, NULL))) + return status; + + if ((status = pthread_cond_init(&cond->pcond, NULL))) + return status; + + return 0; +} + +int condition_lock(condition_t *cond) +{ + return pthread_mutex_lock(&cond->pmutex); +} + +int condition_unlock(condition_t *cond) +{ + return pthread_mutex_unlock(&cond->pmutex); +} + +int condition_wait(condition_t *cond) +{ + return pthread_cond_wait(&cond->pcond, &cond->pmutex); +} + +int condition_timedwait(condition_t *cond, const struct timespec *abstime) +{ + return pthread_cond_timedwait(&cond->pcond, &cond->pmutex, abstime); +} + +int condition_signal(condition_t *cond) +{ + return pthread_cond_signal(&cond->pcond); +} + +int condition_broadcast(condition_t *cond) +{ + return pthread_cond_broadcast(&cond->pcond); +} + +int condition_destroy(condition_t *cond) +{ + int status; + if ((status = pthread_mutex_destroy(&cond->pmutex))) + return status; + + if ((status = pthread_cond_destroy(&cond->pcond))) + return status; + + return 0; +} diff --git a/cc-resource-pooling/teeproxy/gpworker/condition.h b/cc-resource-pooling/teeproxy/gpworker/condition.h new file mode 100644 index 0000000..8c89945 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpworker/condition.h @@ -0,0 +1,28 @@ +#ifndef _CONDITION_H_ +#define _CONDITION_H_ + +#include + +typedef struct condition +{ + pthread_mutex_t pmutex; + pthread_cond_t pcond; +} condition_t; + +int condition_init(condition_t *cond); + +int condition_lock(condition_t *cond); + +int condition_unlock(condition_t *cond); + +int condition_wait(condition_t *cond); + +int condition_timedwait(condition_t *cond, const struct timespec *abstime); + +int condition_signal(condition_t *cond); + +int condition_broadcast(condition_t *cond); + +int condition_destroy(condition_t *cond); + +#endif /* _CONDITION_H_ */ diff --git a/cc-resource-pooling/teeproxy/gpworker/gpworker.c b/cc-resource-pooling/teeproxy/gpworker/gpworker.c new file mode 100644 index 0000000..838a0f9 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpworker/gpworker.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. + * Description: rsa-demo + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "tee_client_api.h" + +#include "tzcp_dbus.h" +#include "threadpool.h" + + +int main(int argc, char *argv[]) +{ + threadpool_t pool; + pthread_mutex_t mutex_tcl; + pthread_mutex_t mutex_tsl; + tcl_t tcl; + tsl_t tsl; + + if (argc < 2) + { + printf("There is no argument as a worker name. \n"); + return -1; + } + if (argc > 2) + { + printf("Only need one argument as a worker name. \n"); + return -1; + } + + receive_methodcall( + &pool, + &mutex_tcl, + &mutex_tsl, + &tcl, + &tsl, + argv[1] + ); + + return 0; +} diff --git a/cc-resource-pooling/teeproxy/gpworker/threadpool.c b/cc-resource-pooling/teeproxy/gpworker/threadpool.c new file mode 100644 index 0000000..265d4b7 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpworker/threadpool.c @@ -0,0 +1,155 @@ +#include "threadpool.h" +#include +#include +#include +#include +#include + + +void *thread_routine(void *arg) +{ + // struct timespec abstime; + int timeout; + printf("\n"); + printf("thread 0x%x is starting\n", (int) pthread_self()); + threadpool_t *pool = (threadpool_t *) arg; + while (1) + { + timeout = 0; + condition_lock(&pool->ready); + pool->idle++; + // 等待队列有任务到来或者线程池销毁通知 + while (pool->first == NULL && !pool->quit) + { + printf("thread 0x%x is waiting\n", (int) pthread_self()); + condition_wait(&pool->ready); + } + + // 等待到条件,处于工作状态 + pool->idle--; + + // 等待到任务 + if (pool->first != NULL) + { + // 从队头取出任务 + task_t *t = pool->first; + pool->first = t->next; + // 执行任务需要一定的时间,所以要先解锁,以便生产者进程 + // 能够往队列中添加任务,其它消费者线程能够进入等待任务 + condition_unlock(&pool->ready); + printf("thread 0x%x is working\n", (int) pthread_self()); + t->run(t->arg); + printf("\n"); + printf("thread 0x%x work done \n", (int) pthread_self()); + free(t); + condition_lock(&pool->ready); + } + // 如果等待到线程池销毁通知, 且任务都执行完毕 + if (pool->quit && pool->first == NULL) + { + pool->counter--; + if (pool->counter == 0) + condition_signal(&pool->ready); + + condition_unlock(&pool->ready); + // 跳出循环之前要记得解锁 + break; + } + + if (timeout && pool->first == NULL) + { + pool->counter--; + condition_unlock(&pool->ready); + // 跳出循环之前要记得解锁 + break; + } + condition_unlock(&pool->ready); + } + + printf("thread 0x%x is exting\n", (int) pthread_self()); + return NULL; + +} + + +// 初始化线程池 +void threadpool_init( + threadpool_t *pool, + int threads, + tcl_t *tcl, + tsl_t *tsl +) +{ + // 对线程池中的各个字段初始化 + condition_init(&pool->ready); + pool->first = NULL; + pool->last = NULL; + pool->counter = 0; + pool->idle = 0; + pool->max_threads = threads; + pool->quit = 0; + + tcl->first = NULL; + tcl->last = NULL; + tcl->count = 0; + + tsl->first = NULL; + tsl->last = NULL; + tsl->count = 0; +} + + +// 往线程池中添加任务 +void threadpool_add_task(threadpool_t *pool, void *(*run)(void *arg), void *arg) +{ + // 生成新任务 + task_t *newtask = (task_t *) malloc(sizeof(task_t)); + newtask->run = run; + newtask->arg = arg; + newtask->next = NULL; + + condition_lock(&pool->ready); + // 将任务添加到队列 + if (pool->first == NULL) + pool->first = newtask; + else + pool->last->next = newtask; + pool->last = newtask; + + // 如果有等待线程,则唤醒其中一个 + if (pool->idle > 0) + condition_signal(&pool->ready); + else if (pool->counter < pool->max_threads) + { + // 没有等待线程,并且当前线程数不超过最大线程数,则创建一个新线程 + pthread_t tid; + pthread_create(&tid, NULL, thread_routine, pool); + pool->counter++; + } + condition_unlock(&pool->ready); +} + + +// 销毁线程池 +void threadpool_destroy(threadpool_t *pool) +{ + if (pool->quit) + { + return; + } + condition_lock(&pool->ready); + pool->quit = 1; + if (pool->counter > 0) + { + if (pool->idle > 0) + condition_broadcast(&pool->ready); + + // 处于执行任务状态中的线程,不会收到广播 + // 线程池需要等待执行任务状态中的线程全部退出 + + while (pool->counter > 0) + condition_wait(&pool->ready); + } + condition_unlock(&pool->ready); + condition_destroy(&pool->ready); +} diff --git a/cc-resource-pooling/teeproxy/gpworker/threadpool.h b/cc-resource-pooling/teeproxy/gpworker/threadpool.h new file mode 100644 index 0000000..f70b3d1 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpworker/threadpool.h @@ -0,0 +1,108 @@ +#ifndef _THREAD_POOL_H_ +#define _THREAD_POOL_H_ + +#include "condition.h" + +#define GP_WORKER 3 + +#ifdef GP_WORKER + +#include "tee_client_api.h" +#include "tee_client_list.h" + +#endif + + + +#ifdef GP_PROXY +typedef struct sessionid_node +{ + uint32_t session_id; + struct timeval session_createtime; + struct sessionid_node * next; + struct sessionid_node * prev; +} sin_t; + +typedef struct worker_rec +{ + uint8_t busy; + int32_t context_fd; + uint64_t context_addr; + struct timeval context_createtime; + int sessionid_count; + sin_t * first; + sin_t * last; +} wr_t; +#endif + +#ifdef GP_WORKER +typedef struct teec_session_node +{ + TEEC_Session *self; + struct timeval createtime; + struct teec_session_node *next; + struct teec_session_node *prev; +} tsn_t; + +typedef struct teec_session_list +{ + int count; // 线程池中当前线程数 + tsn_t *first; + tsn_t *last; +} tsl_t; + +typedef struct teec_context_node +{ + TEEC_Context *self; + struct timeval createtime; + struct teec_context_node *next; + struct teec_context_node *prev; +} tcn_t; + +typedef struct teec_context_list +{ + int count; // 线程池中当前线程数 + tcn_t *first; + tcn_t *last; +} tcl_t; +#endif + + +// 任务结构体,将任务放入队列由线程池中的线程来执行 +typedef struct task +{ + void *(*run)(void *arg); // 任务回调函数 + void *arg; // 回调函数参数 + struct task *next; +} task_t; + +// 线程池结构体 +typedef struct threadpool +{ + condition_t ready; // mutex and condition var, 任务准备就绪或者线程池销毁通知 + task_t *first; // 任务队列头指针 + task_t *last; // 任务队列尾指针 + int counter; // 线程池中当前线程数 + int idle; // 线程池中当前正在等待任务的线程数 + int max_threads; // 线程池中最大允许的线程数 + int quit; // 销毁线程池的时候置1 +} threadpool_t; + +// 初始化线程池 +void threadpool_init( + threadpool_t *pool, + int threads +#ifdef GP_WORKER + , + tcl_t *tcl, + tsl_t *tsl +#endif +); + +// 往线程池中添加任务 +void threadpool_add_task(threadpool_t *pool, void *(*run)(void *arg), void *arg); + +// 销毁线程池 +void threadpool_destroy(threadpool_t *pool); + +#endif /* _THREAD_POOL_H_ */ diff --git a/cc-resource-pooling/teeproxy/gpworker/tzcp_dbus.c b/cc-resource-pooling/teeproxy/gpworker/tzcp_dbus.c new file mode 100644 index 0000000..345ece1 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpworker/tzcp_dbus.c @@ -0,0 +1,22889 @@ +/* + * Using low-level D-Bus C API code. + * Written by + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tzcp_dbus.h" + +#ifdef GP_PROXY_WORKER + +#include "threadpool.h" + +#ifdef GP_WORKER + +#include "tee_client_api.h" +#include "tee_client_list.h" + +#endif +#endif + + +/** + * Listens for signals on the bus + */ +void +receive_signal(void) +{ + DBusMessage *msg; + DBusMessageIter args; + DBusConnection *conn; + DBusError err; + int ret; + char *sigvalue; + + printf("Listening for signals\n"); + + // initialise the errors + dbus_error_init(&err); + + // connect to the bus and check for errors + conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + exit(1); + } + + // request our name on the bus and check for errors + ret = dbus_bus_request_name(conn, "test.signal.sink", DBUS_NAME_FLAG_REPLACE_EXISTING, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + exit(1); + } + + // add a rule for which messages we want to see + dbus_bus_add_match(conn, "type='signal',interface='test.signal.Type'", &err); + // see signals from the given interface + dbus_connection_flush(conn); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Match Error (%s)\n", err.message); + exit(1); + } + // printf("Match rule sent\n"); + + // loop listening for signals being emmitted + while (true) + { + + // non blocking read of the next available message + dbus_connection_read_write(conn, 0); + msg = dbus_connection_pop_message(conn); + + // loop again if we haven't read a message + if (NULL == msg) + { + usleep(10000); + continue; + } + + // check if the message is a signal from the correct interface and with the correct name + if (dbus_message_is_signal(msg, "test.signal.Type", "Test")) + { + + // read the parameters + if (!dbus_message_iter_init(msg, &args)) + fprintf(stderr, "Message Has No Parameters\n"); + else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) + fprintf(stderr, "Argument is not string!\n"); + else + dbus_message_iter_get_basic(&args, &sigvalue); + + printf("Got Signal with value %s\n", sigvalue); + } + + // free the message + dbus_message_unref(msg); + } +} + + +/** + * Connect to the DBUS bus and send a broadcast signal + */ +void +send_signal( + char *sigvalue +) +{ + DBusMessage *msg; + DBusMessageIter args; + DBusConnection *conn; + DBusError err; + int ret; + dbus_uint32_t sigserial = 0; + + printf("Sending signal with value %s\n", sigvalue); + + // initialise the error value + dbus_error_init(&err); + + // connect to the DBUS system bus, and check for errors + conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + exit(1); + } + + // register our name on the bus, and check for errors + ret = dbus_bus_request_name(conn, "test.signal.source", DBUS_NAME_FLAG_REPLACE_EXISTING, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + exit(1); + } + + // create a signal & check for errors + msg = dbus_message_new_signal("/test/signal/Object", // object name of the signal + "test.signal.Type", // interface name of the signal + "Test"); // name of the signal + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + exit(1); + } + + // append arguments onto signal + dbus_message_iter_init_append(msg, &args); + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &sigvalue)) + { + fprintf(stderr, "Out Of Memory!\n"); + exit(1); + } + + // send the message and flush the connection + if (!dbus_connection_send(conn, msg, &sigserial)) + { + fprintf(stderr, "Out Of Memory!\n"); + exit(1); + } + dbus_connection_flush(conn); + + printf("Signal Sent\n"); + + // free the message + dbus_message_unref(msg); +} + + +#ifdef GP_PROXY_WORKER + +/** + * Server that exposes a method call and waits for it to be called + */ +void +receive_methodcall( + threadpool_t *pool, + pthread_mutex_t *mutex_tcl, + pthread_mutex_t *mutex_tsl, + tcl_t *tcl, + tsl_t *tsl, + char *workername +) +{ + DBusMessage *msg; + DBusConnection *conn; + DBusError err; + int ret; + dbus_bool_t bResult; + + threadpool_init(pool, +#ifdef GP_PROXY + MAX_NUM_THREAD + 2 +#endif +#ifdef GP_WORKER + MAX_NUM_THREAD, tcl, tsl +#endif + ); + +#ifdef GP_WORKER + pthread_mutex_init(mutex_tcl, NULL); + pthread_mutex_init(mutex_tsl, NULL); +#endif + +#ifdef GP_PROXY + pthread_mutex_init(mutex_workerrec, NULL); + pthread_cond_init(cond_notbusy, NULL); + for (int iworker = 0; iworker < MAX_NUM_WORKER; iworker++) + { + workerrec[iworker].busy = 0; + workerrec[iworker].context_fd = 0; + // workerrec[iworker].context_addr = 0; + workerrec[iworker].context_addr = 0xffffffff; + workerrec[iworker].sessionid_count = 0; + workerrec[iworker].first = NULL; + workerrec[iworker].last = NULL; + } + + DBusMsgConn* thdfargs_stp = (DBusMsgConn*)malloc(sizeof(DBusMsgConn)); + thdfargs_stp->mutex_workerrec = mutex_workerrec; + thdfargs_stp->workerrec = workerrec; + threadpool_add_task( + pool, + session_timeout_process, + thdfargs_stp + ); + + DBusMsgConn* thdfargs_ctp = (DBusMsgConn*)malloc(sizeof(DBusMsgConn)); + thdfargs_ctp->mutex_workerrec = mutex_workerrec; + thdfargs_ctp->workerrec = workerrec; + thdfargs_ctp->cond_notbusy = cond_notbusy; + threadpool_add_task( + pool, + context_timeout_process, + thdfargs_ctp + ); +#endif + + printf("%s is listening for method calls ... \n", workername); + + // initialise the error + dbus_error_init(&err); + + dbus_threads_init_default(); + + // connect to the bus and check for errors + conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + // conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + fprintf(stderr, "Connection Null\n"); + exit(1); + } + + char dbusname[1024]; + memset((char *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + int64_t workernum = 0; + for (int iind = 0; iind < strlen(workername) - 6; iind++) + { + workernum = workernum + + (workername[strlen(workername) - 1 - iind] - '0') * pow(10, iind); +#if 0 + printf( + "workername[%d] = %c. \n", + strlen(workername) - 1 - iind, + workername[strlen(workername) - 1 - iind] + ); +#endif + } + // printf("The worker num is 0x %16.16lx. \n", workernum); + // request our name on the bus and check for errors + ret = + dbus_bus_request_name( + conn, + // "test.method.server", + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + fprintf(stderr, "Not Primary Owner (%d)\n", ret); + exit(1); + } + + // loop, testing for new messages + memset((char *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.Type", workername); + while (true) + { + // non blocking read of the next available message + dbus_connection_read_write(conn, 0); + msg = dbus_connection_pop_message(conn); + + // loop again if we haven't got a message + if (NULL == msg) + { + usleep(10000); + continue; + } + + // check this is a method call for the right interface & method + bResult = dbus_message_is_method_call( + msg, + // "test.method.Type", + dbusname, + "TEEC_InitializeContext" + ); + if (bResult == TRUE) + { + DBusMsgConn *thdfargs = (DBusMsgConn *) malloc(sizeof(DBusMsgConn)); + thdfargs->msg = msg; + thdfargs->conn = conn; +#ifdef GP_PROXY + thdfargs->mutex_workerrec = mutex_workerrec; + thdfargs->cond_notbusy = cond_notbusy; + thdfargs->workerrec = workerrec; +#endif +#ifdef GP_WORKER + thdfargs->workernum = workernum; + thdfargs->mutex_tcl = mutex_tcl; + thdfargs->mutex_tsl = mutex_tsl; + thdfargs->tcl = tcl; + thdfargs->tsl = tsl; +#endif + threadpool_add_task( + pool, + reply_to_method_call_teec_inicont, + thdfargs + ); + } + + // check this is a method call for the right interface & method + bResult = dbus_message_is_method_call( + msg, + // "test.method.Type", + dbusname, + "TEEC_FinalizeContext" + ); + if (bResult == TRUE) + { + DBusMsgConn *thdfargs = (DBusMsgConn *) malloc(sizeof(DBusMsgConn)); + thdfargs->msg = msg; + thdfargs->conn = conn; +#ifdef GP_PROXY + thdfargs->mutex_workerrec = mutex_workerrec; + thdfargs->cond_notbusy = cond_notbusy; + thdfargs->workerrec = workerrec; +#endif +#ifdef GP_WORKER + thdfargs->workernum = workernum; + thdfargs->mutex_tcl = mutex_tcl; + thdfargs->mutex_tsl = mutex_tsl; + thdfargs->tcl = tcl; + thdfargs->tsl = tsl; +#endif + threadpool_add_task( + pool, + reply_to_method_call_teec_fincont, + thdfargs + ); + } + + // check this is a method call for the right interface & method + bResult = dbus_message_is_method_call( + msg, + // "test.method.Type", + dbusname, + "TEEC_OpenSession" + ); + if (bResult == TRUE) + { + DBusMsgConn *thdfargs = (DBusMsgConn *) malloc(sizeof(DBusMsgConn)); + thdfargs->msg = msg; + thdfargs->conn = conn; +#ifdef GP_PROXY + thdfargs->mutex_workerrec = mutex_workerrec; + thdfargs->cond_notbusy = cond_notbusy; + thdfargs->workerrec = workerrec; +#endif +#ifdef GP_WORKER + thdfargs->workernum = workernum; + thdfargs->mutex_tcl = mutex_tcl; + thdfargs->mutex_tsl = mutex_tsl; + thdfargs->tcl = tcl; + thdfargs->tsl = tsl; +#endif + threadpool_add_task( + pool, + reply_to_method_call_teec_opensession, + thdfargs + ); + } + + // check this is a method call for the right interface & method + bResult = dbus_message_is_method_call( + msg, + // "test.method.Type", + dbusname, + "TEEC_CloseSession" + ); + if (bResult == TRUE) + { + DBusMsgConn *thdfargs = (DBusMsgConn *) malloc(sizeof(DBusMsgConn)); + thdfargs->msg = msg; + thdfargs->conn = conn; +#ifdef GP_PROXY + thdfargs->mutex_workerrec = mutex_workerrec; + thdfargs->cond_notbusy = cond_notbusy; + thdfargs->workerrec = workerrec; +#endif +#ifdef GP_WORKER + thdfargs->workernum = workernum; + thdfargs->mutex_tcl = mutex_tcl; + thdfargs->mutex_tsl = mutex_tsl; + thdfargs->tcl = tcl; + thdfargs->tsl = tsl; +#endif + threadpool_add_task( + pool, + reply_to_method_call_teec_closesession, + thdfargs + ); + } + + bResult = dbus_message_is_method_call( + msg, + // "test.method.Type", + dbusname, + "TEEC_InvokeCommand" + ); + if (bResult == TRUE) + { + DBusMsgConn *thdfargs = (DBusMsgConn *) malloc(sizeof(DBusMsgConn)); + thdfargs->msg = msg; + thdfargs->conn = conn; +#ifdef GP_PROXY + thdfargs->mutex_workerrec = mutex_workerrec; + thdfargs->cond_notbusy = cond_notbusy; + thdfargs->workerrec = workerrec; +#endif +#ifdef GP_WORKER + thdfargs->workernum = workernum; + thdfargs->mutex_tcl = mutex_tcl; + thdfargs->mutex_tsl = mutex_tsl; + thdfargs->tcl = tcl; + thdfargs->tsl = tsl; +#endif + threadpool_add_task( + pool, + reply_to_method_call_teec_invokecommand, + thdfargs + ); + } + + // check this is a method call for the right interface & method + bResult = dbus_message_is_method_call( + msg, + // "test.method.Type", + dbusname, + "Destroy" + ); + if (bResult == TRUE) + { + reply_to_method_call_destroy_threadpool( + msg, + conn, + pool +#ifdef GP_WORKER + , + mutex_tcl, + mutex_tsl +#endif + +#ifdef GP_PROXY + , + mutex_workerrec, + cond_notbusy +#endif + ); + } + + // free the message + // dbus_message_unref(msg); + + } // end of the while true +} // end of the function +#endif + + + +/** + * Call a method on a remote object + */ +int32_t +method_call_teec_inicont( + const char *workername, + + const uint8_t *name, size_t name_size, + int32_t in_context_fd, + const uint8_t *in_context_tapath, size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + + uint32_t *teecresult, + int32_t *context_fd, + uint8_t *context_tapath, size_t context_tapath_insize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + uint64_t *context_addr, + uint32_t *context_tapath_outsize +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + DBusMessageIter structIter; + int ret; + int iType; + unsigned char *context_tapath_temp = NULL; + dbus_int32_t di32Temp; + dbus_uint32_t dui32Temp; + dbus_int64_t di64Temp; + dbus_uint64_t dui64Temp; + + // initialiset the errors + dbus_error_init(&err); + + dbus_threads_init_default(); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + // conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return -1; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return -1; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "TEEC_InitializeContext" // method name + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return -1; + } + + // append arguments + dbus_message_iter_init_append(msg, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + di32Temp = name_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (name_size > 0 && name != NULL) + { + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &name + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + } + + di32Temp = in_context_fd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_context_tapath_size > 0 && + in_context_tapath != NULL && + strlen((const char *) in_context_tapath) > 0 + ) + { + if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) + { + di32Temp = strlen((const char *) in_context_tapath); + } else + { + di32Temp = 0; + } + } else + { + di32Temp = 0; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + // if (in_context_tapath_size > 0 && in_context_tapath != NULL) + if (di32Temp > 0) + { + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &in_context_tapath + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + } + + dui64Temp = in_context_sessionlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sessionlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sharebuffer_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di64Temp = in_context_sharebuffer_bufferbarrier; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT64, + &di64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_connection_flush(conn); + dbus_message_unref(msg); + + printf("\n"); + printf("Method Call Teec Init Contex Sent. \n"); + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + return -1; + } + // free the pending message handle + dbus_pending_call_unref(pending); + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *teecresult = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *context_fd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *context_tapath_outsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + if (*context_tapath_outsize > 0) + { + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_STRING + ) + { + fprintf(stderr, "Argument is not STRING.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &context_tapath_temp); + + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sharebuffer_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT64 + ) + { + fprintf(stderr, "Argument is not INT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di64Temp + ); + *context_sharebuffer_bufferbarrier = di64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_addr = dui64Temp; + + printf("Got Reply of Method Call Teec Init Contex: \n"); + printf(" teecresult = 0x %8.8x \n", *teecresult); + printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); + printf(" ta_path = %s \n", context_tapath_temp); + printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); +#if 0 + printf(" TEEC_Context session_list.next = 0x %16.16lx \n", + *context_sessionlist_next + ); + printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", + *context_sessionlist_prev + ); + printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", + *context_shrdmemlist_next + ); + printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", + *context_shrdmemlist_prev + ); + printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", + *context_sharebuffer_buffer + ); + printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", + (long unsigned int)*context_sharebuffer_bufferbarrier + ); +#endif + printf(" context addr = 0x %16.16lx \n", + (long unsigned int) *context_addr + ); + + if ( + context_tapath_insize > *context_tapath_outsize && + *context_tapath_outsize > 0 && + context_tapath != NULL && + context_tapath_temp != NULL + ) + { + memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); + *(context_tapath + *context_tapath_outsize) = 0; + } else + { + // dbus_message_unref(msg); + // return -1; + *(context_tapath + 0) = 0; + } + + // free msg + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return 0; +} + + +/** + * Call a method on a remote object + */ +int32_t +method_call_teec_fincont( + const char *workername, + + int32_t in_context_fd, + const uint8_t *in_context_tapath, size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + uint64_t in_context_addr, + + int32_t *context_fd, + uint8_t *context_tapath, size_t context_tapath_insize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + uint32_t *context_tapath_outsize +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + DBusMessageIter structIter; + int ret; + int iType; + unsigned char *context_tapath_temp = NULL; + dbus_int32_t di32Temp; + dbus_uint32_t dui32Temp; + dbus_int64_t di64Temp; + dbus_uint64_t dui64Temp; + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return -1; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return -1; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "TEEC_FinalizeContext" + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return -1; + } + + // append arguments + dbus_message_iter_init_append(msg, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + di32Temp = in_context_fd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_context_tapath_size > 0 && + in_context_tapath != NULL && + strlen((const char *) in_context_tapath) > 0 + ) + { + if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) + { + di32Temp = strlen((const char *) in_context_tapath); + } else + { + di32Temp = 0; + } + } else + { + di32Temp = 0; + } + + // fprintf(stderr, "in_context_tapath_size = %ld \n", in_context_tapath_size); + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + // if (in_context_tapath_size > 0 && in_context_tapath != NULL) + if (di32Temp > 0) + { + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &in_context_tapath + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + } + + dui64Temp = in_context_sessionlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sessionlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sharebuffer_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di64Temp = in_context_sharebuffer_bufferbarrier; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT64, + &di64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_addr; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_connection_flush(conn); + dbus_message_unref(msg); + + printf("\n"); + printf("Method Call Teec Fin Contex Sent. \n"); + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + return -1; + } + // free the pending message handle + dbus_pending_call_unref(pending); + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *context_fd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *context_tapath_outsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + if (*context_tapath_outsize > 0) + { + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_STRING + ) + { + fprintf(stderr, "Argument is not STRING.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &context_tapath_temp); + + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sharebuffer_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT64 + ) + { + fprintf(stderr, "Argument is not INT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di64Temp + ); + *context_sharebuffer_bufferbarrier = di64Temp; + + printf("Got Reply of Method Call Teec Fin Contex: \n"); + printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); + printf(" ta_path = %s \n", context_tapath_temp); + printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); +#if 0 + printf(" TEEC_Context session_list.next = 0x %16.16lx \n", + *context_sessionlist_next + ); + printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", + *context_sessionlist_prev + ); + printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", + *context_shrdmemlist_next + ); + printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", + *context_shrdmemlist_prev + ); + printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", + *context_sharebuffer_buffer + ); + printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", + (long unsigned int)*context_sharebuffer_bufferbarrier + ); +#endif + + if ( + context_tapath_insize > *context_tapath_outsize && + *context_tapath_outsize > 0 && + context_tapath != NULL && + context_tapath_temp != NULL + ) + { + memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); + *(context_tapath + *context_tapath_outsize) = 0; + } else + { + // dbus_message_unref(msg); + // return -1; + *(context_tapath + 0) = 0; + } + + // free msg + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return 0; +} + + +/** + * Call a method on a remote object + */ +int32_t +method_call_teec_opensession( + const char *workername, + + int32_t in_context_fd, + const uint8_t *in_context_tapath, + size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + + uint32_t in_destination_timelow, + uint32_t in_destination_timemid, + uint32_t in_destination_timehiandver, + uint32_t *in_destination_clockseqandnode, + int32_t in_destination_clockseqandnode_size, + + uint32_t in_connectionmethod, + uint64_t in_connectiondata, + + uint32_t in_operation_started, + uint32_t in_operation_paramtypes, + + uint64_t in_operation_param1_tmpref_buffer, + uint32_t in_operation_param1_tmpref_size, + uint64_t in_operation_param1_memref_parent, + uint32_t in_operation_param1_memref_size, + uint32_t in_operation_param1_memref_offset, + uint32_t in_operation_param1_value_a, + uint32_t in_operation_param1_value_b, + int32_t in_operation_param1_ionref_ionsharefd, + uint32_t in_operation_param1_ionref_ionsize, + + uint64_t in_operation_param2_tmpref_buffer, + uint32_t in_operation_param2_tmpref_size, + uint64_t in_operation_param2_memref_parent, + uint32_t in_operation_param2_memref_size, + uint32_t in_operation_param2_memref_offset, + uint32_t in_operation_param2_value_a, + uint32_t in_operation_param2_value_b, + int32_t in_operation_param2_ionref_ionsharefd, + uint32_t in_operation_param2_ionref_ionsize, + + uint64_t in_operation_param3_tmpref_buffer, + uint32_t in_operation_param3_tmpref_size, + uint64_t in_operation_param3_memref_parent, + uint32_t in_operation_param3_memref_size, + uint32_t in_operation_param3_memref_offset, + uint32_t in_operation_param3_value_a, + uint32_t in_operation_param3_value_b, + int32_t in_operation_param3_ionref_ionsharefd, + uint32_t in_operation_param3_ionref_ionsize, + + uint64_t in_operation_param4_tmpref_buffer, + uint32_t in_operation_param4_tmpref_size, + uint64_t in_operation_param4_memref_parent, + uint32_t in_operation_param4_memref_size, + uint32_t in_operation_param4_memref_offset, + uint32_t in_operation_param4_value_a, + uint32_t in_operation_param4_value_b, + int32_t in_operation_param4_ionref_ionsharefd, + uint32_t in_operation_param4_ionref_ionsize, + + uint64_t in_operation_session, + int32_t in_operation_cancelflag, + + uint32_t in_returnorigin, + + uint64_t in_context_addr, + + + uint32_t *teecresult, + + int32_t *context_fd, + uint8_t *context_tapath, + size_t context_tapath_size, + uint32_t *context_tapath_outsize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + + uint32_t *session_seesionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context, + + uint32_t *operation_started, + uint32_t *operation_paramtypes, + + uint64_t *operation_param1_tmpref_buffer, + uint32_t *operation_param1_tmpref_size, + uint64_t *operation_param1_memref_parent, + uint32_t *operation_param1_memref_size, + uint32_t *operation_param1_memref_offset, + uint32_t *operation_param1_value_a, + uint32_t *operation_param1_value_b, + int32_t *operation_param1_ionref_ionsharefd, + uint32_t *operation_param1_ionref_ionsize, + + uint64_t *operation_param2_tmpref_buffer, + uint32_t *operation_param2_tmpref_size, + uint64_t *operation_param2_memref_parent, + uint32_t *operation_param2_memref_size, + uint32_t *operation_param2_memref_offset, + uint32_t *operation_param2_value_a, + uint32_t *operation_param2_value_b, + int32_t *operation_param2_ionref_ionsharefd, + uint32_t *operation_param2_ionref_ionsize, + + uint64_t *operation_param3_tmpref_buffer, + uint32_t *operation_param3_tmpref_size, + uint64_t *operation_param3_memref_parent, + uint32_t *operation_param3_memref_size, + uint32_t *operation_param3_memref_offset, + uint32_t *operation_param3_value_a, + uint32_t *operation_param3_value_b, + int32_t *operation_param3_ionref_ionsharefd, + uint32_t *operation_param3_ionref_ionsize, + + uint64_t *operation_param4_tmpref_buffer, + uint32_t *operation_param4_tmpref_size, + uint64_t *operation_param4_memref_parent, + uint32_t *operation_param4_memref_size, + uint32_t *operation_param4_memref_offset, + uint32_t *operation_param4_value_a, + uint32_t *operation_param4_value_b, + int32_t *operation_param4_ionref_ionsharefd, + uint32_t *operation_param4_ionref_ionsize, + + uint64_t *operation_session, + int32_t *operation_cancelflag, + + uint32_t *returnorigin +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + DBusMessageIter structIter; + DBusMessageIter ArrayIter; + int ret; + int iType; + unsigned char *context_tapath_temp = NULL; + dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; + int session_serviceid_clockseqandnode_realsize; + dbus_int32_t di32Temp; + dbus_uint32_t dui32Temp; + dbus_int64_t di64Temp; + dbus_uint64_t dui64Temp; + char buf[2]; + buf[0] = DBUS_TYPE_UINT32; + buf[1] = '\0'; + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return -1; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return -1; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "TEEC_OpenSession" + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return -1; + } + + // append arguments + dbus_message_iter_init_append(msg, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + di32Temp = in_context_fd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_context_tapath_size > 0 && + in_context_tapath != NULL && + strlen((const char *) in_context_tapath) > 0 + ) + { + if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) + { + di32Temp = strlen((const char *) in_context_tapath); + } else + { + di32Temp = 0; + } + } else + { + di32Temp = 0; + } + + // fprintf(stderr, "in_context_tapath_size = %ld \n", in_context_tapath_size); + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + // if (in_context_tapath_size > 0 && in_context_tapath != NULL) + if (di32Temp > 0) + { + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &in_context_tapath + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + } + + dui64Temp = in_context_sessionlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sessionlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sharebuffer_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di64Temp = in_context_sharebuffer_bufferbarrier; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT64, + &di64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_destination_timelow; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_destination_timemid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_destination_timehiandver; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_destination_clockseqandnode_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_destination_clockseqandnode_size > 0 && + in_destination_clockseqandnode != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_destination_clockseqandnode, + in_destination_clockseqandnode_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_connectionmethod; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_connectiondata; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + + dui32Temp = in_operation_started; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_paramtypes; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param1_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param1_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param1_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param2_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param2_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param2_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param3_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param3_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param3_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param4_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param4_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param4_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_session; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_cancelflag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_returnorigin; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_addr; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + /////////////////////////////////////////////////////////////////// + + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_connection_flush(conn); + dbus_message_unref(msg); + + printf("\n"); + printf("Method Call Teec Open Session Sent. \n"); + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + return -1; + } + + // free the pending message handle + dbus_pending_call_unref(pending); + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *teecresult = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *context_fd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *context_tapath_outsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + if (*context_tapath_outsize > 0) + { + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_STRING + ) + { + fprintf(stderr, "Argument is not STRING.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &context_tapath_temp); + + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sharebuffer_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT64 + ) + { + fprintf(stderr, "Argument is not INT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di64Temp + ); + *context_sharebuffer_bufferbarrier = di64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_seesionid = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timelow = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timemid = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timehiandver = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_clockseqandnode_outsize = dui32Temp; + + if (*session_serviceid_clockseqandnode_outsize > 0) + { + bResult = + dbus_message_iter_next( + &structIter + ); + + dbus_message_iter_recurse( + &structIter, + &ArrayIter); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &session_serviceid_clockseqandnode_temp, + &session_serviceid_clockseqandnode_realsize + ); + } + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_opscnt = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_context = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_started = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_paramtypes = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param1_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param1_memref_parent = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param1_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param2_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param2_memref_parent = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param2_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param3_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param3_memref_parent = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param3_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param4_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param4_memref_parent = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param4_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_session = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_cancelflag = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *returnorigin = dui32Temp; + + printf("Got Reply of Method Call Teec Open Session: \n"); + printf(" teecresult = 0x %8.8x \n", *teecresult); + printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); + printf(" ta_path = %s \n", context_tapath_temp); + printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); + printf(" session_seesionid = 0x %8.8x \n", + *session_seesionid + ); +#if 0 + printf(" TEEC_Context session_list.next = 0x %16.16lx \n", + *context_sessionlist_next + ); + printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", + *context_sessionlist_prev + ); + printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", + *context_shrdmemlist_next + ); + printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", + *context_shrdmemlist_prev + ); + printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", + *context_sharebuffer_buffer + ); + printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", + (long unsigned int)*context_sharebuffer_bufferbarrier + ); + + printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", + *session_serviceid_timelow + ); + printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", + *session_serviceid_timehiandver + ); + + printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); + if (*session_serviceid_clockseqandnode_outsize > 0 && + session_serviceid_clockseqandnode_temp != NULL) + { + printf(" "); + for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { + printf(" %2.2x", + session_serviceid_clockseqandnode_temp[i] + ); + } + printf("\n"); + } + printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", + *session_serviceid_clockseqandnode_outsize + ); + + printf(" TEEC_Session session_opscnt = 0x %8.8x \n", + *session_opscnt + ); + printf(" TEEC_Session session_head_next = 0x %16.16lx \n", + *session_head_next + ); + printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", + *session_head_prev + ); + printf(" TEEC_Session session_context = 0x %16.16lx \n", + *session_context + ); + printf(" TEEC_Session operation_started = 0x %8.8x \n", + *operation_started + ); + printf(" TEEC_Session operation_paramtypes = 0x %8.8x \n", + *operation_paramtypes + ); + + printf(" TEEC_Session operation_param1_tmpref_buffer = 0x %16.16lx \n", + *operation_param1_tmpref_buffer + ); + printf(" TEEC_Session operation_param1_tmpref_size = 0x %8.8x \n", + *operation_param1_tmpref_size + ); + printf(" TEEC_Session operation_param1_memref_parent = 0x %16.16lx \n", + *operation_param1_memref_parent + ); + printf(" TEEC_Session operation_param1_memref_size = 0x %8.8x \n", + *operation_param1_memref_size + ); + printf(" TEEC_Session operation_param1_memref_offse = 0x %8.8x \n", + *operation_param1_memref_offset + ); + printf(" TEEC_Session operation_param1_value_a = 0x %8.8x \n", + *operation_param1_value_a + ); + printf(" TEEC_Session operation_param1_value_b = 0x %8.8x \n", + *operation_param1_value_b + ); + printf(" TEEC_Session operation_param1_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param1_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param1_ionref_ionsize = 0x %8.8x \n", + *operation_param1_ionref_ionsize + ); + + printf(" TEEC_Session operation_param2_tmpref_buffer = 0x %16.16lx \n", + *operation_param2_tmpref_buffer + ); + printf(" TEEC_Session operation_param2_tmpref_size = 0x %8.8x \n", + *operation_param2_tmpref_size + ); + printf(" TEEC_Session operation_param2_memref_parent = 0x %16.16lx \n", + *operation_param2_memref_parent + ); + printf(" TEEC_Session operation_param2_memref_size = 0x %8.8x \n", + *operation_param2_memref_size + ); + printf(" TEEC_Session operation_param2_memref_offset = 0x %8.8x \n", + *operation_param2_memref_offset + ); + printf(" TEEC_Session operation_param2_value_a = 0x %8.8x \n", + *operation_param2_value_a + ); + printf(" TEEC_Session operation_param2_value_b = 0x %8.8x \n", + *operation_param2_value_b + ); + printf(" TEEC_Session operation_param2_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param2_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param2_ionref_ionsize = 0x %8.8x \n", + *operation_param2_ionref_ionsize + ); + + printf(" TEEC_Session operation_param3_tmpref_buffer = 0x %16.16lx \n", + *operation_param3_tmpref_buffer + ); + printf(" TEEC_Session operation_param3_tmpref_size = 0x %8.8x \n", + *operation_param3_tmpref_size + ); + printf(" TEEC_Session operation_param3_memref_parent = 0x %16.16lx \n", + *operation_param3_memref_parent + ); + printf(" TEEC_Session operation_param3_memref_size = 0x %8.8x \n", + *operation_param3_memref_size + ); + printf(" TEEC_Session operation_param3_memref_offset = 0x %8.8x \n", + *operation_param3_memref_offset + ); + printf(" TEEC_Session operation_param3_value_a = 0x %8.8x \n", + *operation_param3_value_a + ); + printf(" TEEC_Session operation_param3_value_b = 0x %8.8x \n", + *operation_param3_value_b + ); + printf(" TEEC_Session operation_param3_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param3_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param3_ionref_ionsize = 0x %8.8x \n", + *operation_param3_ionref_ionsize + ); + + printf(" TEEC_Session operation_param4_tmpref_buffer = 0x %16.16lx \n", + *operation_param4_tmpref_buffer + ); + printf(" TEEC_Session operation_param4_tmpref_size = 0x %8.8x \n", + *operation_param4_tmpref_size + ); + printf(" TEEC_Session operation_param4_memref_parent = 0x %16.16lx \n", + *operation_param4_memref_parent + ); + printf(" TEEC_Session operation_param4_memref_size = 0x %8.8x \n", + *operation_param4_memref_size + ); + printf(" TEEC_Session operation_param4_memref_offset = 0x %8.8x \n", + *operation_param4_memref_offset + ); + printf(" TEEC_Session operation_param4_value_a = 0x %8.8x \n", + *operation_param4_value_a + ); + printf(" TEEC_Session operation_param4_value_b = 0x %8.8x \n", + *operation_param4_value_b + ); + printf(" TEEC_Session operation_param4_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param4_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param4_ionref_ionsize = 0x %8.8x \n", + *operation_param4_ionref_ionsize + ); + + printf(" TEEC_Session operation_session = 0x %16.16lx \n", + *operation_session + ); + printf(" TEEC_Session operation_cancelflag = 0x %8.8x \n", + (unsigned int)*operation_cancelflag + ); + printf(" TEEC_Session returnorigin = 0x %8.8x \n", + *returnorigin + ); +#endif + + if (context_tapath_size > *context_tapath_outsize) + { + memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); + *(context_tapath + *context_tapath_outsize) = 0; + } else + { + dbus_message_unref(msg); + return -1; + } + + if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && + session_serviceid_clockseqandnode_temp != NULL && + session_serviceid_clockseqandnode_realsize > 0 + ) + { + for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) + { + session_serviceid_clockseqandnode[i] = + session_serviceid_clockseqandnode_temp[i]; + + } + *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *session_serviceid_clockseqandnode_outsize = 0; + } + + // free msg + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return 0; +} + + +int32_t +method_call_teec_closesession( + const char *workername, + + uint32_t in_session_seesionid, + uint32_t in_session_serviceid_timelow, + uint32_t in_session_serviceid_timemid, + uint32_t in_session_serviceid_timehiandver, + uint32_t *in_session_serviceid_clockseqandnode, + int32_t in_session_serviceid_clockseqandnode_size, + uint32_t in_session_opscnt, + uint64_t in_session_head_next, + uint64_t in_session_head_prev, + uint64_t in_session_context, + + uint32_t *session_seesionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + DBusMessageIter structIter; + DBusMessageIter ArrayIter; + int ret; + int iType; + dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; + int session_serviceid_clockseqandnode_realsize; + dbus_int32_t di32Temp; + dbus_uint32_t dui32Temp; + dbus_uint64_t dui64Temp; + char buf[2]; + buf[0] = DBUS_TYPE_UINT32; + buf[1] = '\0'; + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return -1; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return -1; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "TEEC_CloseSession" + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return -1; + } + + // append arguments + dbus_message_iter_init_append(msg, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + dui32Temp = in_session_seesionid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timelow; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timemid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timehiandver; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_session_serviceid_clockseqandnode_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_session_serviceid_clockseqandnode_size > 0 && + in_session_serviceid_clockseqandnode != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_session_opscnt; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + + dui64Temp = in_session_head_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_session_head_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_session_context; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_connection_flush(conn); + dbus_message_unref(msg); + + printf("\n"); + printf("Method Call Teec Close Session Sent. \n"); + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + return -1; + } + + // free the pending message handle + dbus_pending_call_unref(pending); + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_seesionid = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timelow = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timemid = dui32Temp; + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timehiandver = dui32Temp; + + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_clockseqandnode_outsize = dui32Temp; + + if (*session_serviceid_clockseqandnode_outsize > 0) + { + bResult = + dbus_message_iter_next( + &structIter + ); + + dbus_message_iter_recurse( + &structIter, + &ArrayIter); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &session_serviceid_clockseqandnode_temp, + &session_serviceid_clockseqandnode_realsize + ); + } + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_opscnt = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_context = dui64Temp; + + + printf("Got Reply of Method Call Teec Close Session: \n"); + printf(" session_seesionid = 0x %8.8x \n", + *session_seesionid + ); +#if 0 + printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", + *session_serviceid_timelow + ); + printf(" TEEC_Session session_serviceid_timemid = 0x %8.8x \n", + *session_serviceid_timemid + ); + printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", + *session_serviceid_timehiandver + ); + printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); + printf(" "); + for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { + printf(" %2.2x", + session_serviceid_clockseqandnode_temp[i] + ); + } + printf("\n"); + printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", + *session_serviceid_clockseqandnode_outsize + ); + printf(" TEEC_Session session_opscnt = 0x %8.8x \n", + *session_opscnt + ); + printf(" TEEC_Session session_head_next = 0x %16.16lx \n", + *session_head_next + ); + printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", + *session_head_prev + ); +#endif + printf(" session_context = 0x %16.16lx \n", + *session_context + ); + + if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && + session_serviceid_clockseqandnode_temp != NULL && + session_serviceid_clockseqandnode_realsize > 0 + ) + { + memcpy( + session_serviceid_clockseqandnode, + session_serviceid_clockseqandnode_temp, + session_serviceid_clockseqandnode_realsize * sizeof(uint32_t) + ); + *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *session_serviceid_clockseqandnode_outsize = 0; + } + + // free msg + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return 0; +} + + +int32_t +method_call_teec_invokecommand( + const char *workername, + + uint32_t in_session_sessionid, + uint32_t in_session_serviceid_timelow, + uint32_t in_session_serviceid_timemid, + uint32_t in_session_serviceid_timehiandver, + uint32_t *in_session_serviceid_clockseqandnode, + uint32_t in_session_serviceid_clockseqandnode_size, + uint32_t in_session_opscnt, + uint64_t in_session_head_next, + uint64_t in_session_head_prev, + uint64_t in_session_context, + + uint32_t commandid, + + uint32_t in_operation_started, + uint32_t in_operation_paramtypes, + + uint64_t in_operation_param1_tmpref_buffer, + uint32_t in_operation_param1_tmpref_size, + uint64_t in_operation_param1_memref_parent, + uint32_t in_operation_param1_memref_parent_flag, + uint32_t in_operation_param1_memref_size, + uint32_t in_operation_param1_memref_offset, + uint32_t in_operation_param1_value_a, + uint32_t in_operation_param1_value_b, + int32_t in_operation_param1_ionref_ionsharefd, + uint32_t in_operation_param1_ionref_ionsize, + + uint64_t in_operation_param2_tmpref_buffer, + uint32_t in_operation_param2_tmpref_size, + uint64_t in_operation_param2_memref_parent, + uint32_t in_operation_param2_memref_parent_flag, + uint32_t in_operation_param2_memref_size, + uint32_t in_operation_param2_memref_offset, + uint32_t in_operation_param2_value_a, + uint32_t in_operation_param2_value_b, + int32_t in_operation_param2_ionref_ionsharefd, + uint32_t in_operation_param2_ionref_ionsize, + + uint64_t in_operation_param3_tmpref_buffer, + uint32_t in_operation_param3_tmpref_size, + uint64_t in_operation_param3_memref_parent, + uint32_t in_operation_param3_memref_parent_flag, + uint32_t in_operation_param3_memref_size, + uint32_t in_operation_param3_memref_offset, + uint32_t in_operation_param3_value_a, + uint32_t in_operation_param3_value_b, + int32_t in_operation_param3_ionref_ionsharefd, + uint32_t in_operation_param3_ionref_ionsize, + + uint64_t in_operation_param4_tmpref_buffer, + uint32_t in_operation_param4_tmpref_size, + uint64_t in_operation_param4_memref_parent, + uint32_t in_operation_param4_memref_parent_flag, + uint32_t in_operation_param4_memref_size, + uint32_t in_operation_param4_memref_offset, + uint32_t in_operation_param4_value_a, + uint32_t in_operation_param4_value_b, + int32_t in_operation_param4_ionref_ionsharefd, + uint32_t in_operation_param4_ionref_ionsize, + + uint64_t in_operation_session, + int32_t in_operation_cancelflag, + + uint32_t in_returnorigin, + + uint32_t *in_buffer1, + uint32_t in_buffer1_size, + uint32_t *in_buffer2, + uint32_t in_buffer2_size, + uint32_t *in_buffer3, + uint32_t in_buffer3_size, + uint32_t *in_buffer4, + uint32_t in_buffer4_size, + + + uint32_t *teecresult, + + uint32_t *session_sessionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context, + + uint32_t *operation_started, + uint32_t *operation_paramtypes, + + uint64_t *operation_param1_tmpref_buffer, + uint32_t *operation_param1_tmpref_size, + uint64_t *operation_param1_memref_parent, + uint32_t *operation_param1_memref_parent_flag, + uint32_t *operation_param1_memref_size, + uint32_t *operation_param1_memref_offset, + uint32_t *operation_param1_value_a, + uint32_t *operation_param1_value_b, + int32_t *operation_param1_ionref_ionsharefd, + uint32_t *operation_param1_ionref_ionsize, + + uint64_t *operation_param2_tmpref_buffer, + uint32_t *operation_param2_tmpref_size, + uint64_t *operation_param2_memref_parent, + uint32_t *operation_param2_memref_parent_flag, + uint32_t *operation_param2_memref_size, + uint32_t *operation_param2_memref_offset, + uint32_t *operation_param2_value_a, + uint32_t *operation_param2_value_b, + int32_t *operation_param2_ionref_ionsharefd, + uint32_t *operation_param2_ionref_ionsize, + + uint64_t *operation_param3_tmpref_buffer, + uint32_t *operation_param3_tmpref_size, + uint64_t *operation_param3_memref_parent, + uint32_t *operation_param3_memref_parent_flag, + uint32_t *operation_param3_memref_size, + uint32_t *operation_param3_memref_offset, + uint32_t *operation_param3_value_a, + uint32_t *operation_param3_value_b, + int32_t *operation_param3_ionref_ionsharefd, + uint32_t *operation_param3_ionref_ionsize, + + uint64_t *operation_param4_tmpref_buffer, + uint32_t *operation_param4_tmpref_size, + uint64_t *operation_param4_memref_parent, + uint32_t *operation_param4_memref_parent_flag, + uint32_t *operation_param4_memref_size, + uint32_t *operation_param4_memref_offset, + uint32_t *operation_param4_value_a, + uint32_t *operation_param4_value_b, + int32_t *operation_param4_ionref_ionsharefd, + uint32_t *operation_param4_ionref_ionsize, + + uint64_t *operation_session, + int32_t *operation_cancelflag, + + uint32_t *returnorigin, + + uint32_t *buffer1, + uint32_t buffer1_size, + uint32_t *buffer1_outsize, + uint32_t *buffer2, + uint32_t buffer2_size, + uint32_t *buffer2_outsize, + uint32_t *buffer3, + uint32_t buffer3_size, + uint32_t *buffer3_outsize, + uint32_t *buffer4, + uint32_t buffer4_size, + uint32_t *buffer4_outsize +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + DBusMessageIter structIter; + DBusMessageIter ArrayIter; + int ret; + int iType; + dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; + int session_serviceid_clockseqandnode_realsize; + dbus_int32_t di32Temp; + dbus_uint32_t dui32Temp; + dbus_uint64_t dui64Temp; + char buf[2]; + buf[0] = DBUS_TYPE_UINT32; + buf[1] = '\0'; + + dbus_uint32_t *buffer1_temp = NULL; + int buffer1_realsize; + dbus_uint32_t *buffer2_temp = NULL; + int buffer2_realsize; + dbus_uint32_t *buffer3_temp = NULL; + int buffer3_realsize; + dbus_uint32_t *buffer4_temp = NULL; + int buffer4_realsize; + + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return -1; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return -1; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "TEEC_InvokeCommand" + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return -1; + } + + + // append arguments + dbus_message_iter_init_append(msg, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + + dui32Temp = in_session_sessionid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timelow; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timemid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timehiandver; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_clockseqandnode_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_session_serviceid_clockseqandnode_size > 0 && + in_session_serviceid_clockseqandnode != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_session_opscnt; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_session_head_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_session_head_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_session_context; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + + dui32Temp = commandid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + + dui32Temp = in_operation_started; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_paramtypes; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param1_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param1_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_memref_parent_flag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param1_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param2_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param2_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_memref_parent_flag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param2_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param3_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param3_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_memref_parent_flag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param3_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param4_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param4_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_memref_parent_flag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param4_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_session; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_cancelflag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_returnorigin; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_buffer1_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_buffer1_size > 0 && + in_buffer1 != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_buffer1, + in_buffer1_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_buffer2_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_buffer2_size > 0 && + in_buffer2 != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_buffer2, + in_buffer2_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_buffer3_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_buffer3_size > 0 && + in_buffer3 != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_buffer3, + in_buffer3_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_buffer4_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_buffer4_size > 0 && + in_buffer4 != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_buffer4, + in_buffer4_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_connection_flush(conn); + dbus_message_unref(msg); + + printf("\n"); + printf("Method Call Teec Invoke Command Sent. \n"); + + ///////////////////////////////////////////////////////////////////////////////////// + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + return -1; + } + + // free the pending message handle + dbus_pending_call_unref(pending); + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *teecresult = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_sessionid = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timelow = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timemid = dui32Temp; + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timehiandver = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_clockseqandnode_outsize = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + if (*session_serviceid_clockseqandnode_outsize > 0) + { + + dbus_message_iter_recurse( + &structIter, + &ArrayIter + ); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &session_serviceid_clockseqandnode_temp, + &session_serviceid_clockseqandnode_realsize + ); + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_opscnt = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_context = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_started = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_paramtypes = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param1_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param1_memref_parent = dui64Temp; + + bResult = dbus_message_iter_next(&structIter); + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_memref_parent_flag = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param1_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param2_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param2_memref_parent = dui64Temp; + + bResult = dbus_message_iter_next(&structIter); + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_memref_parent_flag = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param2_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param3_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param3_memref_parent = dui64Temp; + + bResult = dbus_message_iter_next(&structIter); + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_memref_parent_flag = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param3_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param4_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param4_memref_parent = dui64Temp; + + bResult = dbus_message_iter_next(&structIter); + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_memref_parent_flag = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param4_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_session = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_cancelflag = di32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *returnorigin = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *buffer1_outsize = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + if (*buffer1_outsize > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter + ); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &buffer1_temp, + &buffer1_realsize + ); + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *buffer2_outsize = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + if (*buffer2_outsize > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter + ); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &buffer2_temp, + &buffer2_realsize + ); + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *buffer3_outsize = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + if (*buffer3_outsize > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter + ); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &buffer3_temp, + &buffer3_realsize + ); + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *buffer4_outsize = dui32Temp; + + if (*buffer4_outsize > 0) + { + bResult = + dbus_message_iter_next( + &structIter + ); + + dbus_message_iter_recurse( + &structIter, + &ArrayIter + ); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &buffer4_temp, + &buffer4_realsize + ); + } + + + printf("Got Reply of Method Call Teec Invoke Command: \n"); + printf(" teecresult = 0x %8.8x \n", + *teecresult); + printf(" session_seesionid = 0x %8.8x \n", + *session_sessionid + ); +#if 0 + printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", + *session_serviceid_timelow + ); + printf(" TEEC_Session session_serviceid_timemid = 0x %8.8x \n", + *session_serviceid_timemid + ); + printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", + *session_serviceid_timehiandver + ); + printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); + if ( *session_serviceid_clockseqandnode_outsize > 0 && + session_serviceid_clockseqandnode_temp != NULL + ) + { + for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { + printf(" %2.2x", + session_serviceid_clockseqandnode_temp[i] + ); + } + printf("\n"); + } + printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", + *session_serviceid_clockseqandnode_outsize + ); + printf(" TEEC_Session session_opscnt = 0x %8.8x \n", + *session_opscnt + ); + printf(" TEEC_Session session_head_next = 0x %16.16lx \n", + *session_head_next + ); + printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", + *session_head_prev + ); + printf(" TEEC_Session session_context = 0x %16.16lx \n", + *session_context + ); + printf(" TEEC_Session session_context = 0x %16.16lx \n", + *session_context + ); + printf(" TEEC_Session operation_started = 0x %8.8x \n", + *operation_started + ); + printf(" TEEC_Session operation_paramtypes = 0x %8.8x \n", + *operation_paramtypes + ); + printf(" TEEC_Session operation_param1_tmpref_buffer = 0x %16.16lx \n", + *operation_param1_tmpref_buffer + ); + printf(" TEEC_Session operation_param1_tmpref_size = 0x %8.8x \n", + *operation_param1_tmpref_size + ); + printf(" TEEC_Session operation_param1_memref_parent = 0x %16.16lx \n", + *operation_param1_memref_parent + ); + printf(" TEEC_Session operation_param1_memref_size = 0x %8.8x \n", + *operation_param1_memref_size + ); + printf(" TEEC_Session operation_param1_memref_offse = 0x %8.8x \n", + *operation_param1_memref_offset + ); + printf(" TEEC_Session operation_param1_value_a = 0x %8.8x \n", + *operation_param1_value_a + ); + printf(" TEEC_Session operation_param1_value_b = 0x %8.8x \n", + *operation_param1_value_b + ); + printf(" TEEC_Session operation_param1_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param1_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param1_ionref_ionsize = 0x %8.8x \n", + *operation_param1_ionref_ionsize + ); + + printf(" TEEC_Session operation_param2_tmpref_buffer = 0x %16.16lx \n", + *operation_param2_tmpref_buffer + ); + printf(" TEEC_Session operation_param2_tmpref_size = 0x %8.8x \n", + *operation_param2_tmpref_size + ); + printf(" TEEC_Session operation_param2_memref_parent = 0x %16.16lx \n", + *operation_param2_memref_parent + ); + printf(" TEEC_Session operation_param2_memref_size = 0x %8.8x \n", + *operation_param2_memref_size + ); + printf(" TEEC_Session operation_param2_memref_offset = 0x %8.8x \n", + *operation_param2_memref_offset + ); + printf(" TEEC_Session operation_param2_value_a = 0x %8.8x \n", + *operation_param2_value_a + ); + printf(" TEEC_Session operation_param2_value_b = 0x %8.8x \n", + *operation_param2_value_b + ); + printf(" TEEC_Session operation_param2_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param2_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param2_ionref_ionsize = 0x %8.8x \n", + *operation_param2_ionref_ionsize + ); + + printf(" TEEC_Session operation_param3_tmpref_buffer = 0x %16.16lx \n", + *operation_param3_tmpref_buffer + ); + printf(" TEEC_Session operation_param3_tmpref_size = 0x %8.8x \n", + *operation_param3_tmpref_size + ); + printf(" TEEC_Session operation_param3_memref_parent = 0x %16.16lx \n", + *operation_param3_memref_parent + ); + printf(" TEEC_Session operation_param3_memref_size = 0x %8.8x \n", + *operation_param3_memref_size + ); + printf(" TEEC_Session operation_param3_memref_offset = 0x %8.8x \n", + *operation_param3_memref_offset + ); + printf(" TEEC_Session operation_param3_value_a = 0x %8.8x \n", + *operation_param3_value_a + ); + printf(" TEEC_Session operation_param3_value_b = 0x %8.8x \n", + *operation_param3_value_b + ); + printf(" TEEC_Session operation_param3_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param3_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param3_ionref_ionsize = 0x %8.8x \n", + *operation_param3_ionref_ionsize + ); + + printf(" TEEC_Session operation_param4_tmpref_buffer = 0x %16.16lx \n", + *operation_param4_tmpref_buffer + ); + printf(" TEEC_Session operation_param4_tmpref_size = 0x %8.8x \n", + *operation_param4_tmpref_size + ); + printf(" TEEC_Session operation_param4_memref_parent = 0x %16.16lx \n", + *operation_param4_memref_parent + ); + printf(" TEEC_Session operation_param4_memref_size = 0x %8.8x \n", + *operation_param4_memref_size + ); + printf(" TEEC_Session operation_param4_memref_offset = 0x %8.8x \n", + *operation_param4_memref_offset + ); + printf(" TEEC_Session operation_param4_value_a = 0x %8.8x \n", + *operation_param4_value_a + ); + printf(" TEEC_Session operation_param4_value_b = 0x %8.8x \n", + *operation_param4_value_b + ); + printf(" TEEC_Session operation_param4_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param4_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param4_ionref_ionsize = 0x %8.8x \n", + *operation_param4_ionref_ionsize + ); + + printf(" TEEC_Session operation_session = 0x %16.16lx \n", + *operation_session + ); + printf(" TEEC_Session operation_cancelflag = 0x %8.8x \n", + (unsigned int)*operation_cancelflag + ); + printf(" returnorigin = 0x %8.8x \n", + *returnorigin + ); + + printf(" buffer1 = \n"); + if (buffer1_temp != NULL) + { + for (int i = 0; i < buffer1_realsize; i++) { + printf(" %2.2x", + buffer1_temp[i] + ); + } + printf("\n"); + } + printf(" buffer1_outsize = 0x %8.8x \n", + *buffer1_outsize + ); + + printf(" buffer2 = \n"); + if (buffer2_temp != NULL) + { + for (int i = 0; i < buffer2_realsize; i++) { + printf(" %2.2x", + buffer2_temp[i] + ); + } + printf("\n"); + } + printf(" buffer2_outsize = 0x %8.8x \n", + *buffer2_outsize + ); + + printf(" buffer3 = \n"); + if (buffer3_temp != NULL) + { + for (int i = 0; i < buffer3_realsize; i++) { + printf(" %2.2x", + buffer3_temp[i] + ); + } + printf("\n"); + } + printf(" buffer3_outsize = 0x %8.8x \n", + *buffer3_outsize + ); + + if (buffer4_temp != NULL) + { + printf(" buffer4 = \n"); + for (int i = 0; i < buffer4_realsize; i++) { + printf(" %2.2x", + buffer4_temp[i] + ); + } + printf("\n"); + } + printf(" buffer4_outsize = 0x %8.8x \n", + *buffer4_outsize + ); +#endif + + if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && + session_serviceid_clockseqandnode != NULL && + session_serviceid_clockseqandnode_temp != NULL && + session_serviceid_clockseqandnode_realsize > 0 + ) + { + memcpy( + session_serviceid_clockseqandnode, + session_serviceid_clockseqandnode_temp, + session_serviceid_clockseqandnode_realsize * sizeof(uint32_t) + ); + *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *session_serviceid_clockseqandnode_outsize = 0; + } + + if (buffer1_size >= (uint32_t) buffer1_realsize && + buffer1 != NULL && + buffer1_temp != NULL && + buffer1_realsize > 0 + ) + { + memcpy( + buffer1, + buffer1_temp, + buffer1_realsize * sizeof(uint32_t) + ); + *buffer1_outsize = buffer1_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *buffer1_outsize = 0; + } + + if (buffer2_size >= (uint32_t) buffer2_realsize && + buffer2 != NULL && + buffer2_temp != NULL && + buffer2_realsize > 0 + ) + { + memcpy( + buffer2, + buffer2_temp, + buffer2_realsize * sizeof(uint32_t) + ); + *buffer2_outsize = buffer2_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *buffer2_outsize = 0; + } + + if (buffer3_size >= (uint32_t) buffer3_realsize && + buffer3 != NULL && + buffer3_temp != NULL && + buffer3_realsize > 0 + ) + { + memcpy( + buffer3, + buffer3_temp, + buffer3_realsize * sizeof(uint32_t) + ); + *buffer3_outsize = buffer3_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *buffer3_outsize = 0; + } + + if (buffer4_size >= (uint32_t) buffer4_realsize && + buffer4 != NULL && + buffer4_temp != NULL && + buffer4_realsize > 0 + ) + { + memcpy( + buffer4, + buffer4_temp, + buffer4_realsize * sizeof(uint32_t) + ); + *buffer4_outsize = buffer4_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *buffer4_outsize = 0; + } + + + // free msg + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return 0; +} + + +/** + * Call a method on a remote object + */ +void +method_call_destroy_threadpool( + const char *workername +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + // DBusConnection* conn; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + int ret; + int iType; + unsigned char name[] = "threadpool"; + unsigned char *charp; + dbus_uint32_t retcode; + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "Destroy" // method name + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return; + } + + + // append arguments + dbus_message_iter_init_append(msg, &args); + + charp = name; + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &charp)) + { + fprintf(stderr, "Out Of Memory!\n"); + exit(1); + } + + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + exit(1); + } + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + exit(1); + } + dbus_connection_flush(conn); + + printf("\n"); + printf("Method Call Destroy Threadpool Sent. \n"); + + // free message + dbus_message_unref(msg); + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + exit(1); + } + // free the pending message handle + dbus_pending_call_unref(pending); + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + exit(1); + } + + iType = + dbus_message_iter_get_arg_type( + &args + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + exit(1); + } + dbus_message_iter_get_basic( + &args, + &retcode + ); + + printf("Got Reply of Method Call Destroy Threadpool: \n"); + printf(" retcode = 0x%8x \n", retcode); + + // free reply + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); +} + + +#ifdef GP_PROXY_WORKER + +void * +reply_to_method_call_teec_inicont( + // DBusMessage* msg, + // DBusConnection* conn + void *thdfargs +) +{ + DBusMsgConn *DBusMCP; + DBusMessage *msg; + DBusConnection *conn; + DBusMessage *reply; + DBusMessageIter args; + dbus_bool_t bResult; + DBusMessageIter structIter; + int iType; + unsigned char *charp; + // char* param = ""; + unsigned char *name = NULL; + dbus_int32_t name_size; + dbus_int32_t in_fd; + unsigned char *in_ta_path = NULL; + dbus_int32_t in_ta_path_size; + dbus_uint64_t in_session_list_next; + dbus_uint64_t in_session_list_prev; + dbus_uint64_t in_shrd_mem_list_next; + dbus_uint64_t in_shrd_mem_list_prev; + dbus_uint64_t in_share_buffer_buffer; + dbus_int64_t in_share_buffer_buffer_barrier; + dbus_uint32_t teecresult; + dbus_int32_t fd; + // unsigned char ta_path[] = "/vendor/bin/rsa_demo_ta"; + // dbus_int32_t ta_path_size = strlen((const char *)ta_path); + unsigned char *ta_path = NULL; + dbus_int32_t ta_path_size = 0; + dbus_uint64_t session_list_next; + dbus_uint64_t session_list_prev; + dbus_uint64_t shrd_mem_list_next; + dbus_uint64_t shrd_mem_list_prev; + dbus_uint64_t share_buffer_buffer; + dbus_int64_t share_buffer_buffer_barrier; + dbus_uint64_t context_addr; + dbus_uint32_t serial = 0; + +#ifdef GP_PROXY + pthread_mutex_t * mutex_workerrec; + pthread_cond_t * cond_notbusy; + wr_t * workerrec; +#endif + +#ifdef GP_WORKER + pthread_mutex_t *mutex_tcl; + pthread_mutex_t *mutex_tsl; + tcl_t *tcl; + tsl_t *tsl; +#endif + + DBusMCP = (DBusMsgConn *) thdfargs; + msg = DBusMCP->msg; + conn = DBusMCP->conn; +#ifdef GP_PROXY + mutex_workerrec = DBusMCP->mutex_workerrec; + cond_notbusy = DBusMCP->cond_notbusy; + workerrec = DBusMCP->workerrec; +#endif +#ifdef GP_WORKER + mutex_tcl = DBusMCP->mutex_tcl; + mutex_tsl = DBusMCP->mutex_tsl; + tcl = DBusMCP->tcl; + tsl = DBusMCP->tsl; +#endif + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &name_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (name_size > 0) + { + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_STRING + ) + { + fprintf(stderr, "Argument is not STRING.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &name); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_fd); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_ta_path_size + ); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + // fprintf(stderr, "Debug in_ta_path_size = %d \n", in_ta_path_size); + if (in_ta_path_size > 0) + { + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_STRING + ) + { + fprintf(stderr, "Argument is not STRING.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_ta_path); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_list_next); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_list_prev); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_shrd_mem_list_next); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_shrd_mem_list_prev); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_share_buffer_buffer); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT64 + ) + { + fprintf(stderr, "Argument is not INT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_share_buffer_buffer_barrier); + + printf("Received method call Teec Initialize Context: \n"); + printf(" in name = %s \n", name); + printf(" in name_size = %d \n", name_size); + printf(" in_fd = 0x %8.8x \n", in_fd); + printf(" in_ta_path = %s \n", in_ta_path); + printf(" in_ta_path_size = %d \n", in_ta_path_size); +#if 0 + printf(" in_session_list_next = 0x %16.16lx \n", in_session_list_next); + printf(" in_session_list_prev = 0x %16.16lx \n", in_session_list_prev); + printf(" in_shrd_mem_list_next = 0x %16.16lx \n", in_shrd_mem_list_next); + printf(" in_shrd_mem_list_prev = 0x %16.16lx \n", in_shrd_mem_list_prev); + printf(" in_share_buffer_buffer = 0x %16.16lx \n", in_share_buffer_buffer); + printf(" in_share_buffer_buffer_barrier = 0x %16.16lx \n", in_share_buffer_buffer_barrier); +#endif + +#ifdef GP_WORKER + //////////////////////////////////////////////////////////////////////////////////////////////// + TEEC_Context *contextIns = (TEEC_Context *) malloc(sizeof(TEEC_Context)); + + TEEC_Result result; + + contextIns->fd = in_fd; + contextIns->ta_path = in_ta_path; + contextIns->session_list.next = (struct ListNode *) in_session_list_next; + contextIns->session_list.prev = (struct ListNode *) in_session_list_prev; + contextIns->shrd_mem_list.next = (struct ListNode *) in_shrd_mem_list_next; + contextIns->shrd_mem_list.prev = (struct ListNode *) in_shrd_mem_list_prev; + contextIns->share_buffer.buffer = (void *) in_share_buffer_buffer; + contextIns->share_buffer.buffer_barrier.__align = (long long int) in_share_buffer_buffer_barrier; + // typedef struct { + // volatile int __val[4*sizeof(long)/sizeof(int)]; + // } sem_t; + // + // typedef union + // { + // char __size[__SIZEOF_SEM_T]; + // long long int __align; + // } sem_t; + struct timeval start, end; + gettimeofday(&start, NULL); + result = TEEC_InitializeContext(NULL, contextIns); + gettimeofday(&end, NULL); + uint32_t cost = 0; + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + if (result != TEEC_SUCCESS) + { + printf("Teec InitilizeContext Failed.\n"); + printf(" teecresult = 0x %8.8x.\n", result); + + teecresult = result; + fd = 0; + ta_path_size = 0; + ta_path = NULL; + charp = ta_path; + session_list_next = 0; + session_list_prev = 0; + shrd_mem_list_next = 0; + shrd_mem_list_prev = 0; + share_buffer_buffer = 0; + share_buffer_buffer_barrier = 0; + context_addr = 0; + } else + { + printf("Teec InitilizeContext Succed, cost time: %ld us \n", cost); + + tcn_t *tcnIns = (tcn_t *) malloc(sizeof(tcn_t)); + tcnIns->self = contextIns; + struct timeval tvcreate; + gettimeofday(&tvcreate, NULL); + tcnIns->createtime = tvcreate; + + pthread_mutex_lock(mutex_tcl); + if (tcl->first == NULL) + { + tcnIns->next = NULL; + tcnIns->prev = NULL; + tcl->first = tcnIns; + tcl->last = tcnIns; + tcl->count = 1; + } else + { + tcnIns->prev = tcl->last; + tcnIns->next = NULL; + tcl->last->next = tcnIns; + tcl->last = tcnIns; + tcl->count = tcl->count + 1; + } + pthread_mutex_unlock(mutex_tcl); + + teecresult = result; + fd = contextIns->fd; + if (contextIns->ta_path != NULL) + { + ta_path_size = strlen((const char *) contextIns->ta_path); + } else + { + ta_path_size = 0; + } + ta_path = contextIns->ta_path; + charp = ta_path; + session_list_next = (dbus_uint64_t) contextIns->session_list.next; + session_list_prev = (dbus_uint64_t) contextIns->session_list.prev; + shrd_mem_list_next = (dbus_uint64_t) contextIns->shrd_mem_list.next; + shrd_mem_list_prev = (dbus_uint64_t) contextIns->shrd_mem_list.prev; + share_buffer_buffer = (dbus_uint64_t) contextIns->share_buffer.buffer; + share_buffer_buffer_barrier = contextIns->share_buffer.buffer_barrier.__align; + + // context_addr = (dbus_uint64_t)contextIns; + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + context_addr = (dbus_uint64_t) DBusMCP->workernum + + u64time + + (long unsigned int) rand(); + + printf(" context fd = 0x %8.8x \n", contextIns->fd); + printf(" context address = 0x %16.16lx \n", context_addr); + } + + // TEEC_FinalizeContext(&contextIns); + // printf("Teec FinalizedContext.\n"); + //////////////////////////////////////////////////////////////////////////////////////////////// +#else + ta_path = (unsigned char *)malloc(1024 * sizeof(char)); + ta_path_size = 1024; + memset((char *)ta_path, 0, 1024); + uint32_t context_tapath_outsize; + + char workername[1024]; + memset((char *)workername, 0, 1024); + int ifound = 0; + int iworker; + for( ; ; ) + { + pthread_mutex_lock(mutex_workerrec); + for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) + { + if (workerrec[iworker].busy == 0) + { + sprintf(workername, "%s%d", "gpworker", iworker); + workerrec[iworker].busy = 1; + ifound = 1; + break; + } + } + if (ifound == 0) + { + pthread_cond_wait(cond_notbusy, mutex_workerrec); + } + pthread_mutex_unlock(mutex_workerrec); + + if (ifound == 1) + { + break; + } + } + + method_call_teec_inicont( + workername, + + name, + name_size, + in_fd, + in_ta_path, + in_ta_path_size, + in_session_list_next, + in_session_list_prev, + in_shrd_mem_list_next, + in_shrd_mem_list_prev, + in_share_buffer_buffer, + in_share_buffer_buffer_barrier, + + + &teecresult, + + &fd, + ta_path, + ta_path_size, + &session_list_next, + &session_list_prev, + &shrd_mem_list_next, + &shrd_mem_list_prev, + &share_buffer_buffer, + &share_buffer_buffer_barrier, + &context_addr, + + &context_tapath_outsize + ); + + if (teecresult == 0) + { + pthread_mutex_lock(mutex_workerrec); + workerrec[iworker].context_fd = fd; + workerrec[iworker].context_addr = context_addr; + workerrec[iworker].first = NULL; + workerrec[iworker].last = NULL; + workerrec[iworker].sessionid_count = 0; + struct timeval tvcreate; + gettimeofday(&tvcreate, NULL); + workerrec[iworker].context_createtime = tvcreate; + pthread_mutex_unlock(mutex_workerrec); + } + else + { + workerrec[iworker].busy = 0; + } + + if (ta_path_size >= context_tapath_outsize) { + ta_path_size = context_tapath_outsize; + charp = ta_path; + } + else + { + ta_path_size = 0; + charp = NULL; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// +#endif + + // create a reply from the message + reply = dbus_message_new_method_return(msg); + +#if 0 + teecresult = 0; + fd = 0x04; + charp = ta_path; + session_list_next = 0xea3500a8; + session_list_prev = 0xea3500a8; + shrd_mem_list_next = 0xea3500b8; + shrd_mem_list_prev = 0xea3500b8; + share_buffer_buffer = 0; + share_buffer_buffer_barrier = 0xdd901c10; +#endif + + // add the arguments to the reply + dbus_message_iter_init_append(reply, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &teecresult + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &fd + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + DBusError err; + // initialise the errors + dbus_error_init(&err); + + if (ta_path_size > 0 && + charp != NULL && + strlen((const char *) charp) > 0 + ) + { + if (dbus_validate_utf8((const char *) charp, &err) == true) + { + ta_path_size = strlen((const char *) charp); + } else + { + ta_path_size = 0; + } + } else + { + ta_path_size = 0; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &ta_path_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (ta_path_size > 0) + { + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &charp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &session_list_next + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &session_list_prev + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &shrd_mem_list_prev + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &shrd_mem_list_next + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &share_buffer_buffer + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT64, + &share_buffer_buffer_barrier + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &context_addr + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + // send the reply && flush the connection + serial = 100; + if (!dbus_connection_send(conn, reply, &serial)) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_unref(reply); + dbus_message_unref(msg); + dbus_connection_flush(conn); + // dbus_connection_close(conn); + // dbus_connection_unref(conn); + + free(thdfargs); + + // sleep(2); + +#if 0 + #ifdef GP_WORKER + +#else + if (ta_path == NULL) + { + free(ta_path); + } +#endif +#endif + + return NULL; +} + + +void * +reply_to_method_call_teec_fincont( + void *thdfargs +) +{ + DBusMsgConn *DBusMCP; + DBusMessage *msg; + DBusConnection *conn; + DBusMessage *reply; + DBusMessageIter args; + dbus_bool_t bResult; + DBusMessageIter structIter; + int iType; + unsigned char *charp; + // char* param = ""; + dbus_int32_t in_fd; + unsigned char *in_ta_path = NULL; + dbus_int32_t in_ta_path_size; + dbus_uint64_t in_session_list_next; + dbus_uint64_t in_session_list_prev; + dbus_uint64_t in_shrd_mem_list_next; + dbus_uint64_t in_shrd_mem_list_prev; + dbus_uint64_t in_share_buffer_buffer; + dbus_int64_t in_share_buffer_buffer_barrier; + dbus_uint64_t in_context_addr; + + dbus_int32_t fd; + dbus_int32_t ta_path_size = 0; + dbus_uint64_t session_list_next; + dbus_uint64_t session_list_prev; + dbus_uint64_t shrd_mem_list_next; + dbus_uint64_t shrd_mem_list_prev; + dbus_uint64_t share_buffer_buffer; + dbus_int64_t share_buffer_buffer_barrier; + dbus_uint32_t serial = 0; + +#ifdef GP_PROXY + pthread_mutex_t * mutex_workerrec; + pthread_cond_t * cond_notbusy; + wr_t * workerrec; +#endif + +#ifdef GP_WORKER + pthread_mutex_t *mutex_tcl; + tcl_t *tcl; + tsl_t *tsl; +#endif + + DBusMCP = (DBusMsgConn *) thdfargs; + msg = DBusMCP->msg; + conn = DBusMCP->conn; +#ifdef GP_PROXY + mutex_workerrec = DBusMCP->mutex_workerrec; + cond_notbusy = DBusMCP->cond_notbusy; + workerrec = DBusMCP->workerrec; +#endif +#ifdef GP_WORKER + mutex_tcl = DBusMCP->mutex_tcl; + tcl = DBusMCP->tcl; + tsl = DBusMCP->tsl; +#endif + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_fd); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_ta_path_size + ); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + // fprintf(stderr, "Debug in_ta_path_size = %d \n", in_ta_path_size); + if (in_ta_path_size > 0) + { + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_STRING + ) + { + fprintf(stderr, "Argument is not STRING.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_ta_path); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_list_next); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_list_prev); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_shrd_mem_list_next); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_shrd_mem_list_prev); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_share_buffer_buffer); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT64 + ) + { + fprintf(stderr, "Argument is not INT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_share_buffer_buffer_barrier); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_context_addr); + + printf("Received method call Teec Finalize Context: \n"); + printf(" in_fd = 0x %8.8x \n", in_fd); + printf(" in_ta_path_size = %d \n", in_ta_path_size); + + DBusError err; + dbus_error_init(&err); + if (in_ta_path_size > 0 && in_ta_path != NULL && dbus_validate_path((const char *) in_ta_path, &err) == true) + { + printf(" in_ta_path = %s \n", in_ta_path); + } +#if 0 + printf(" in_session_list_next = 0x %16.16lx \n", in_session_list_next); + printf(" in_session_list_prev = 0x %16.16lx \n", in_session_list_prev); + printf(" in_shrd_mem_list_next = 0x %16.16lx \n", in_shrd_mem_list_next); + printf(" in_shrd_mem_list_prev = 0x %16.16lx \n", in_shrd_mem_list_prev); + printf(" in_share_buffer_buffer = 0x %16.16lx \n", in_share_buffer_buffer); + printf(" in_share_buffer_buffer_barrier = 0x %16.16lx \n", in_share_buffer_buffer_barrier); +#endif + printf(" in_context_addr = 0x %16.16lx \n", in_context_addr); + + + unsigned char *ta_path = NULL; +#ifdef GP_WORKER + //////////////////////////////////////////////////////////////////////////////////////////////// + TEEC_Context *contextIns; + tcn_t *tcnIns; + TEEC_Result result; + + contextIns = NULL; + pthread_mutex_lock(mutex_tcl); + if (tcl->first != NULL) + { + tcnIns = tcl->first; + do + { + if (tcnIns->self->fd == in_fd) + { + contextIns = tcnIns->self; + break; + } + tcnIns = tcnIns->next; + } while (tcnIns != NULL); + } + pthread_mutex_unlock(mutex_tcl); + + if (contextIns == NULL) + { + if (tcl->first == NULL) + { + printf("The teec context list is null. \n"); + // teecresult = TEEC_ERROR_CONTEXT_LIST_NULL; + } else + { + printf("Can't find the teec context. \n"); + // teecresult = TEEC_ERROR_NO_CONTEXT_MATCH; + } + + fd = 0; + ta_path_size = 0; + charp = NULL; + session_list_prev = 0; + shrd_mem_list_next = 0; + shrd_mem_list_prev = 0; + share_buffer_buffer = 0; + share_buffer_buffer_barrier = 0; + } else + { + // contextIns.fd = in_fd; + contextIns->ta_path = in_ta_path; + contextIns->session_list.next = (struct ListNode *) in_session_list_next; + contextIns->session_list.prev = (struct ListNode *) in_session_list_prev; + contextIns->shrd_mem_list.next = (struct ListNode *) in_shrd_mem_list_next; + contextIns->shrd_mem_list.prev = (struct ListNode *) in_shrd_mem_list_prev; + contextIns->share_buffer.buffer = (void *) in_share_buffer_buffer; + contextIns->share_buffer.buffer_barrier.__align = (long long int) in_share_buffer_buffer_barrier; + // typedef struct { + // volatile int __val[4*sizeof(long)/sizeof(int)]; + // } sem_t; + // + // typedef union + // { + // char __size[__SIZEOF_SEM_T]; + // long long int __align; + // } sem_t; + + struct timeval start, end; + gettimeofday(&start, NULL); + TEEC_FinalizeContext(contextIns); + gettimeofday(&end, NULL); + uint32_t cost = 0; + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + printf("Teec FinalizeContext executed, cost time: %ld us \n", cost); + + fd = contextIns->fd; + if (contextIns->ta_path != NULL) + { + ta_path_size = strlen((const char *) contextIns->ta_path); + ta_path = contextIns->ta_path; + } else + { + ta_path_size = 0; + ta_path = NULL; + } + charp = ta_path; + session_list_next = (dbus_uint64_t) contextIns->session_list.next; + session_list_prev = (dbus_uint64_t) contextIns->session_list.prev; + shrd_mem_list_next = (dbus_uint64_t) contextIns->shrd_mem_list.next; + shrd_mem_list_prev = (dbus_uint64_t) contextIns->shrd_mem_list.prev; + share_buffer_buffer = (dbus_uint64_t) contextIns->share_buffer.buffer; + share_buffer_buffer_barrier = contextIns->share_buffer.buffer_barrier.__align; + + tcn_t *tcnTemp; + tcnTemp = tcnIns->prev; + if (tcnTemp != NULL) + { + tcnTemp->next = tcnIns->next; + } + tcnTemp = tcnIns->next; + if (tcnTemp != NULL) + { + tcnTemp->prev = tcnIns->prev; + } + pthread_mutex_lock(mutex_tcl); + if (tcl->last == tcnIns) + { + tcl->last = tcnIns->prev; + } + if (tcl->first == tcnIns) + { + tcl->first = tcnIns->next; + } + tcl->count = tcl->count - 1; + pthread_mutex_unlock(mutex_tcl); + free(contextIns); + free(tcnIns); + } + //////////////////////////////////////////////////////////////////////////////////////////////// +#else + ta_path = (unsigned char *)malloc(1024 * sizeof(char)); + ta_path_size = 1024; + memset((char *)ta_path, 0, 1024); + uint32_t context_tapath_outsize; + + char workername[1024]; + memset((char *)workername, 0, 1024); + int ifound = 0; + int iworker; + + pthread_mutex_lock(mutex_workerrec); + for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) + { + if (workerrec[iworker].context_fd == in_fd && + workerrec[iworker].context_addr == in_context_addr + ) + { + sprintf(workername, "%s%d", "gpworker", iworker); + ifound = 1; + break; + } + } + pthread_mutex_unlock(mutex_workerrec); + + if (ifound == 0) + { + printf("Can't find the worker for the context. \n"); + + // teecresult = 0xAAAA0017; + + fd = 0; + ta_path_size = 0; + charp = NULL; + session_list_prev = 0; + shrd_mem_list_next = 0; + shrd_mem_list_prev = 0; + share_buffer_buffer = 0; + share_buffer_buffer_barrier = 0; + } + else + { + pthread_mutex_unlock(mutex_workerrec); + sin_t * sinIns = NULL; + sin_t * sinInsPrev = NULL; + sinIns = workerrec[iworker].last; + if (sinIns != NULL) + { + dbus_uint32_t in_session_seesionid; + dbus_uint32_t in_session_serviceid_timelow = 0; + dbus_uint32_t in_session_serviceid_timemid = 0; + dbus_uint32_t in_session_serviceid_timehiandver = 0; + dbus_uint32_t in_session_serviceid_clockseqandnode_size = 8; + dbus_uint32_t in_session_serviceid_clockseqandnode[8]; + dbus_uint32_t in_session_opscnt = 0; + dbus_uint64_t in_session_head_next = 0; + dbus_uint64_t in_session_head_prev = 0; + dbus_uint64_t in_session_context; + + dbus_uint32_t seesionid; + dbus_uint32_t serviceid_timelow; + dbus_uint32_t serviceid_timemid; + dbus_uint32_t serviceid_timehiandver; + dbus_uint32_t * serviceid_clockseqandnode; + int serviceid_clockseqandnode_realsize; + dbus_uint32_t opscnt; + dbus_uint64_t head_next; + dbus_uint64_t head_prev; + dbus_uint64_t context; + + for ( ; ; ) + { + in_session_seesionid = sinIns->session_id; + in_session_context = workerrec[iworker].context_addr; + + pthread_mutex_unlock(mutex_workerrec); + + for (int iind = 0; iind < 8; iind++) + { + in_session_serviceid_clockseqandnode[iind] = 0; + } + + uint32_t serviceid_clockseqandnode_outsize_temp; + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (dbus_uint32_t *)malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + + printf("\nMethod call teec closesession. (Called by Proxy before fin context) \n"); + + method_call_teec_closesession( + workername, + + in_session_seesionid, + in_session_serviceid_timelow, + in_session_serviceid_timemid, + in_session_serviceid_timehiandver, + in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_size, + in_session_opscnt, + in_session_head_next, + in_session_head_prev, + in_session_context, + + &seesionid, + &serviceid_timelow, + &serviceid_timemid, + &serviceid_timehiandver, + serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize, + &serviceid_clockseqandnode_outsize_temp, + &opscnt, + &head_next, + &head_prev, + &context + ); + + if (serviceid_clockseqandnode != NULL) { + free(serviceid_clockseqandnode); + } + + pthread_mutex_lock(mutex_workerrec); + + sinInsPrev = sinIns->prev; + free(sinIns); + if (sinInsPrev == NULL) + // if (sinIns == workerrec[iworker].first) + { + // free(sinIns); + break; + } + sinIns = sinInsPrev; + } + } + pthread_mutex_unlock(mutex_workerrec); + + method_call_teec_fincont( + workername, + + in_fd, + in_ta_path, + in_ta_path_size, + in_session_list_next, + in_session_list_prev, + in_shrd_mem_list_next, + in_shrd_mem_list_prev, + in_share_buffer_buffer, + in_share_buffer_buffer_barrier, + in_context_addr, + + &fd, + ta_path, + ta_path_size, + &session_list_next, + &session_list_prev, + &shrd_mem_list_next, + &shrd_mem_list_prev, + &share_buffer_buffer, + &share_buffer_buffer_barrier, + + &context_tapath_outsize + ); + + pthread_mutex_lock(mutex_workerrec); + workerrec[iworker].busy = 0; + pthread_cond_signal(cond_notbusy); + workerrec[iworker].context_fd = 0; + workerrec[iworker].context_addr = 0xffffffff; + workerrec[iworker].sessionid_count = 0; + workerrec[iworker].first = NULL; + workerrec[iworker].last = NULL; + pthread_mutex_unlock(mutex_workerrec); + + if (ta_path_size >= context_tapath_outsize) { + ta_path_size = context_tapath_outsize; + charp = ta_path; + } + else + { + ta_path_size = 0; + charp = NULL; + } + + } // end of else found == 1 + //////////////////////////////////////////////////////////////////////////////////////////////// + +#endif + + // create a reply from the message + reply = dbus_message_new_method_return(msg); + + // add the arguments to the reply + dbus_message_iter_init_append(reply, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &fd + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + // DBusError err; + // initialise the errors + // dbus_error_init(&err); + + if (ta_path_size > 0 && + charp != NULL + // && strlen((const char *) charp) > 0 + ) + { + // if (dbus_validate_utf8((const char *) charp, &err) == true) + if (dbus_validate_path((const char *) charp, &err) == true) + { + ta_path_size = strlen((const char *) charp); + } else + { + ta_path_size = 0; + } + } else + { + ta_path_size = 0; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &ta_path_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + fprintf(stderr, "%s %d: reply fincont, tapath size = %d \n", __FILE__, __LINE__, ta_path_size); + if (ta_path_size > 0) + { + fprintf(stderr, "%s %d: reply fincont, tapath = %s \n", __FILE__, __LINE__, charp); + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &charp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &session_list_next + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &session_list_prev + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &shrd_mem_list_prev + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &shrd_mem_list_next + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &share_buffer_buffer + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT64, + &share_buffer_buffer_barrier + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + // send the reply && flush the connection + serial = 100; + if (!dbus_connection_send(conn, reply, &serial)) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_unref(reply); + dbus_message_unref(msg); + dbus_connection_flush(conn); + // dbus_connection_close(conn); + // dbus_connection_unref(conn); + free(thdfargs); + + // sleep(2); + +#if 0 + #ifdef GP_WORKER + +#else + if (ta_path == NULL) + { + free(ta_path); + } +#endif +#endif + + return NULL; +} + + +void * +reply_to_method_call_teec_opensession( + void *thdfargs +) +{ + DBusMsgConn *DBusMCP; + DBusMessage *msg; + DBusConnection *conn; + DBusMessage *reply; + DBusMessageIter args; + dbus_bool_t bResult; + DBusMessageIter structIter; + DBusMessageIter ArrayIter; + int iType; + unsigned char *charp; + char buf[2]; + buf[0] = DBUS_TYPE_UINT32; + buf[1] = '\0'; + + // char* param = ""; + dbus_int32_t in_fd; + unsigned char *in_ta_path = NULL; + dbus_int32_t in_ta_path_size; + dbus_uint64_t in_session_list_next; + dbus_uint64_t in_session_list_prev; + dbus_uint64_t in_shrd_mem_list_next; + dbus_uint64_t in_shrd_mem_list_prev; + dbus_uint64_t in_share_buffer_buffer; + dbus_int64_t in_share_buffer_buffer_barrier; + dbus_uint32_t teecresult; + dbus_int32_t fd; + + dbus_uint32_t in_destination_timelow; + dbus_uint32_t in_destination_timemid; + dbus_uint32_t in_destination_timehiandver; + + dbus_uint32_t in_connectionmethod; + dbus_uint64_t in_connectiondata; + dbus_uint32_t in_operation_started; + dbus_uint32_t in_operation_paramtypes; + dbus_int32_t in_destination_clockseqandnode_size; + int in_destination_clockseqandnode_realsize; + dbus_uint32_t *in_destination_clockseqandnode; + + dbus_uint64_t in_operation_param1_tmpref_buffer; + dbus_uint32_t in_operation_param1_tmpref_size; + dbus_uint64_t in_operation_param1_memref_parent; + dbus_uint32_t in_operation_param1_memref_size; + dbus_uint32_t in_operation_param1_memref_offset; + dbus_uint32_t in_operation_param1_value_a; + dbus_uint32_t in_operation_param1_value_b; + dbus_int32_t in_operation_param1_ionref_ionsharefd; + dbus_uint32_t in_operation_param1_ionref_ionsize; + + dbus_uint64_t in_operation_param2_tmpref_buffer; + dbus_uint32_t in_operation_param2_tmpref_size; + dbus_uint64_t in_operation_param2_memref_parent; + dbus_uint32_t in_operation_param2_memref_size; + dbus_uint32_t in_operation_param2_memref_offset; + dbus_uint32_t in_operation_param2_value_a; + dbus_uint32_t in_operation_param2_value_b; + dbus_int32_t in_operation_param2_ionref_ionsharefd; + dbus_uint32_t in_operation_param2_ionref_ionsize; + + dbus_uint64_t in_operation_param3_tmpref_buffer; + dbus_uint32_t in_operation_param3_tmpref_size; + dbus_uint64_t in_operation_param3_memref_parent; + dbus_uint32_t in_operation_param3_memref_size; + dbus_uint32_t in_operation_param3_memref_offset; + dbus_uint32_t in_operation_param3_value_a; + dbus_uint32_t in_operation_param3_value_b; + dbus_int32_t in_operation_param3_ionref_ionsharefd; + dbus_uint32_t in_operation_param3_ionref_ionsize; + + dbus_uint64_t in_operation_param4_tmpref_buffer; + dbus_uint32_t in_operation_param4_tmpref_size; + dbus_uint64_t in_operation_param4_memref_parent; + dbus_uint32_t in_operation_param4_memref_size; + dbus_uint32_t in_operation_param4_memref_offset; + dbus_uint32_t in_operation_param4_value_a; + dbus_uint32_t in_operation_param4_value_b; + dbus_int32_t in_operation_param4_ionref_ionsharefd; + dbus_uint32_t in_operation_param4_ionref_ionsize; + + dbus_uint64_t in_operation_session; + dbus_int32_t in_operation_cancelflag; + dbus_uint32_t in_returnorigin; + + dbus_uint64_t in_context_addr; + + // unsigned char ta_path[] = "/vendor/bin/rsa_demo_ta"; + // dbus_int32_t ta_path_size = strlen((const char *)ta_path); + unsigned char *ta_path; + dbus_int32_t ta_path_size; + dbus_uint64_t session_list_next; + dbus_uint64_t session_list_prev; + dbus_uint64_t shrd_mem_list_next; + dbus_uint64_t shrd_mem_list_prev; + dbus_uint64_t share_buffer_buffer; + dbus_int64_t share_buffer_buffer_barrier; + + dbus_uint32_t seesionid; + dbus_uint32_t serviceid_timelow; + dbus_uint32_t serviceid_timemid; + dbus_uint32_t serviceid_timehiandver; + dbus_uint32_t *serviceid_clockseqandnode; + int serviceid_clockseqandnode_realsize; + dbus_int32_t serviceid_clockseqandnode_outsize; + dbus_uint32_t opscnt; + dbus_uint64_t head_next; + dbus_uint64_t head_prev; + dbus_uint64_t context; + + dbus_uint32_t started; + dbus_uint32_t paramtypes; + + dbus_uint64_t operation_param1_tmpref_buffer; + dbus_uint32_t operation_param1_tmpref_size; + dbus_uint64_t operation_param1_memref_parent; + dbus_uint32_t operation_param1_memref_size; + dbus_uint32_t operation_param1_memref_offset; + dbus_uint32_t operation_param1_value_a; + dbus_uint32_t operation_param1_value_b; + dbus_int32_t operation_param1_ionref_ionsharefd; + dbus_uint32_t operation_param1_ionref_ionsize; + + dbus_uint64_t operation_param2_tmpref_buffer; + dbus_uint32_t operation_param2_tmpref_size; + dbus_uint64_t operation_param2_memref_parent; + dbus_uint32_t operation_param2_memref_size; + dbus_uint32_t operation_param2_memref_offset; + dbus_uint32_t operation_param2_value_a; + dbus_uint32_t operation_param2_value_b; + dbus_int32_t operation_param2_ionref_ionsharefd; + dbus_uint32_t operation_param2_ionref_ionsize; + + dbus_uint64_t operation_param3_tmpref_buffer; + dbus_uint32_t operation_param3_tmpref_size; + dbus_uint64_t operation_param3_memref_parent; + dbus_uint32_t operation_param3_memref_size; + dbus_uint32_t operation_param3_memref_offset; + dbus_uint32_t operation_param3_value_a; + dbus_uint32_t operation_param3_value_b; + dbus_int32_t operation_param3_ionref_ionsharefd; + dbus_uint32_t operation_param3_ionref_ionsize; + + dbus_uint64_t operation_param4_tmpref_buffer; + dbus_uint32_t operation_param4_tmpref_size; + dbus_uint64_t operation_param4_memref_parent; + dbus_uint32_t operation_param4_memref_size; + dbus_uint32_t operation_param4_memref_offset; + dbus_uint32_t operation_param4_value_a; + dbus_uint32_t operation_param4_value_b; + dbus_int32_t operation_param4_ionref_ionsharefd; + dbus_uint32_t operation_param4_ionref_ionsize; + + dbus_uint64_t operation_session; + dbus_int32_t operation_cancelflag; + dbus_uint32_t returnorigin; + dbus_uint32_t serial = 0; + +#ifdef GP_PROXY + pthread_mutex_t * mutex_workerrec; + wr_t * workerrec; +#endif + +#ifdef GP_WORKER + pthread_mutex_t *mutex_tcl; + pthread_mutex_t *mutex_tsl; + tcl_t *tcl; + tsl_t *tsl; +#endif + + DBusMCP = (DBusMsgConn *) thdfargs; + msg = DBusMCP->msg; + conn = DBusMCP->conn; +#ifdef GP_PROXY + mutex_workerrec = DBusMCP->mutex_workerrec; + workerrec = DBusMCP->workerrec; +#endif +#ifdef GP_WORKER + mutex_tcl = DBusMCP->mutex_tcl; + mutex_tsl = DBusMCP->mutex_tsl; + tcl = DBusMCP->tcl; + tsl = DBusMCP->tsl; +#endif + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_get_basic( + &structIter, + &in_fd); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_ta_path_size + ); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + // fprintf(stderr, "Debug in_ta_path_size = %d \n", in_ta_path_size); + if (in_ta_path_size > 0) + { + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_STRING + ) + { + fprintf(stderr, "Argument is not STRING.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_ta_path); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_list_next); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_list_prev); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_shrd_mem_list_next); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_shrd_mem_list_prev); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_share_buffer_buffer); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT64 + ) + { + fprintf(stderr, "Argument is not INT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_share_buffer_buffer_barrier); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_destination_timelow); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_destination_timemid); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_destination_timehiandver); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_destination_clockseqandnode_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (in_destination_clockseqandnode_size > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &in_destination_clockseqandnode, + &in_destination_clockseqandnode_realsize + ); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_get_basic( + &structIter, + &in_connectionmethod); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_connectiondata); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_started); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_paramtypes); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_tmpref_buffer); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_tmpref_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_memref_parent); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_memref_size); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_memref_offset); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_value_a); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_value_b); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_ionref_ionsharefd); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_ionref_ionsize); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_tmpref_buffer); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_tmpref_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_memref_parent); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_memref_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_memref_offset); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_value_a); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_value_b); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_ionref_ionsharefd); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_ionref_ionsize); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_tmpref_buffer); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_tmpref_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_memref_parent); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_memref_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_memref_offset); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_value_a); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_value_b); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_ionref_ionsharefd); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_ionref_ionsize); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_tmpref_buffer); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_tmpref_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_memref_parent); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_memref_size); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_memref_offset); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_value_a); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_value_b); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_ionref_ionsharefd); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_ionref_ionsize); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_session); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_cancelflag); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_returnorigin); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_context_addr); + + printf("Received method call Teec Open Session: \n"); + printf(" in_fd = 0x %8.8x \n", in_fd); + printf(" in_ta_path = %s \n", in_ta_path); + printf(" in_ta_path_size = %d \n", in_ta_path_size); +#if 0 + printf(" in_session_list_next = 0x %16.16lx \n", in_session_list_next); + printf(" in_session_list_prev = 0x %16.16lx \n", in_session_list_prev); + printf(" in_shrd_mem_list_next = 0x %16.16lx \n", in_shrd_mem_list_next); + printf(" in_shrd_mem_list_prev = 0x %16.16lx \n", in_shrd_mem_list_prev); + printf(" in_share_buffer_buffer = 0x %16.16lx \n", in_share_buffer_buffer); + printf(" in_share_buffer_buffer_barrier = 0x %16.16lx \n", in_share_buffer_buffer_barrier); + + printf(" in_destination_timelow = 0x %8.8x \n", in_destination_timelow); + printf(" in_destination_timemid = 0x %8.8x \n", in_destination_timemid); + printf(" in_destination_timehiandver = 0x %8.8x \n", in_destination_timehiandver); + if ( in_destination_clockseqandnode_realsize > 0 ) + { + printf(" in_destination_clockseqandnode = \n"); + printf(" "); + for (int i = 0; i < in_destination_clockseqandnode_realsize; i++) { + printf(" %8.8x", in_destination_clockseqandnode[i]); + } + printf("\n"); + } + else + { + printf(" in_destination_clockseqandnode addr = 0x %16.16lx \n", + (long unsigned int)in_destination_clockseqandnode + ); + } + printf(" in_destination_clockseqandnode_size = 0x %8.8x \n", in_destination_clockseqandnode_size); + + printf(" in_connectionmethod = 0x %8.8x \n", in_connectionmethod); + printf(" in_connectiondata = 0x %16.16lx \n", in_connectiondata); + + printf(" in_operation_started = 0x %8.8x \n", in_operation_started); + printf(" in_operation_paramtypes = 0x %8.8x \n", in_operation_paramtypes); + + printf(" in_operation_param1_tmpref_buffer = 0x %16.16lx \n", in_operation_param1_tmpref_buffer); + printf(" in_operation_param1_tmpref_size = 0x %8.8x \n", in_operation_param1_tmpref_size); + printf(" in_operation_param1_memref_parent = 0x %16.16lx \n", in_operation_param1_memref_parent); + printf(" in_operation_param1_memref_size = 0x %8.8x \n", in_operation_param1_memref_size); + printf(" in_operation_param1_memref_offset = 0x %8.8x \n", in_operation_param1_memref_offset); + printf(" in_operation_param1_value_a = 0x %8.8x \n", in_operation_param1_value_a); + printf(" in_operation_param1_value_b = 0x %8.8x \n", in_operation_param1_value_b); + printf(" in_operation_param1_ionref_ionsharefd = 0x %8.8x \n", + in_operation_param1_ionref_ionsharefd); + printf(" in_operation_param1_ionref_ionsize = 0x %8.8x \n", in_operation_param1_ionref_ionsize); + + printf(" in_operation_param2_tmpref_buffer = 0x %16.16lx \n", in_operation_param2_tmpref_buffer); + printf(" in_operation_param2_tmpref_size = 0x %8.8x \n", in_operation_param2_tmpref_size); + printf(" in_operation_param2_memref_parent = 0x %16.16lx \n", in_operation_param2_memref_parent); + printf(" in_operation_param2_memref_size = 0x %8.8x \n", in_operation_param2_memref_size); + printf(" in_operation_param2_memref_offset = 0x %8.8x \n", in_operation_param2_memref_offset); + printf(" in_operation_param2_value_a = 0x %8.8x \n", in_operation_param3_value_a); + printf(" in_operation_param2_value_b = 0x %8.8x \n", in_operation_param3_value_b); + printf(" in_operation_param2_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); + printf(" in_operation_param2_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); + + printf(" in_operation_param3_tmpref_buffer = 0x %16.16lx \n", in_operation_param3_tmpref_buffer); + printf(" in_operation_param3_tmpref_size = 0x %8.8x \n", in_operation_param3_tmpref_size); + printf(" in_operation_param3_memref_parent = 0x %16.16lx \n", in_operation_param3_memref_parent); + printf(" in_operation_param3_memref_size = 0x %8.8x \n", in_operation_param3_memref_size); + printf(" in_operation_param3_memref_offset = 0x %8.8x \n", in_operation_param3_memref_offset); + printf(" in_operation_param3_value_a = 0x %8.8x \n", in_operation_param3_value_a); + printf(" in_operation_param3_value_b = 0x %8.8x \n", in_operation_param3_value_b); + printf(" in_operation_param3_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); + printf(" in_operation_param3_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); + + printf(" in_operation_param4_tmpref_buffer = 0x %16.16lx \n", in_operation_param4_tmpref_buffer); + printf(" in_operation_param4_tmpref_size = 0x %8.8x \n", in_operation_param4_tmpref_size); + printf(" in_operation_param4_memref_parent = 0x %16.16lx \n", in_operation_param4_memref_parent); + printf(" in_operation_param4_memref_size = 0x %8.8x \n", in_operation_param4_memref_size); + printf(" in_operation_param4_memref_offset = 0x %8.8x \n", in_operation_param4_memref_offset); + printf(" in_operation_param4_value_a = 0x %8.8x \n", in_operation_param4_value_a); + printf(" in_operation_param4_value_b = 0x %8.8x \n", in_operation_param4_value_b); + printf(" in_operation_param4_ionref_ionsharefd = 0x %8.8x \n", in_operation_param4_ionref_ionsharefd); + printf(" in_operation_param4_ionref_ionsize = 0x %8.8x \n", in_operation_param4_ionref_ionsize); + + printf(" in_operation_session = 0x %16.16lx \n", in_operation_session); + printf(" in_operation_cancelflag = 0x %8.8x \n", in_operation_cancelflag); + + printf(" in_returnorigin = 0x %8.8x \n", in_returnorigin); +#endif + printf(" in_context_addr = 0x %16.16lx \n", in_context_addr); + +#ifdef GP_WORKER + //////////////////////////////////////////////////////////////////////////////////////////////// + + TEEC_Context *contextIns; + tcn_t *tcnIns; + + TEEC_UUID destinationIns; + void *in_connectiondata_temp; + TEEC_Operation operationIns; + uint32_t origin; + TEEC_Result result; + + contextIns = NULL; + pthread_mutex_lock(mutex_tcl); + if (tcl->first != NULL) + { + tcnIns = tcl->first; + do + { + if (tcnIns->self->fd == in_fd) + { + contextIns = tcnIns->self; + break; + } + tcnIns = tcnIns->next; + } while (tcnIns != NULL); + } + pthread_mutex_unlock(mutex_tcl); + + if (contextIns == NULL) + { + if (tcl->first == NULL) + { + printf("The teec context list is null. \n"); + teecresult = TEEC_ERROR_CONTEXT_LIST_NULL; + } else + { + printf("Can't find the teec context. \n"); + teecresult = TEEC_ERROR_NO_CONTEXT_MATCH; + } + + fd = 0; + ta_path_size = 0; + ta_path = NULL; + charp = ta_path; + session_list_next = 0; + session_list_prev = 0; + shrd_mem_list_next = 0; + shrd_mem_list_prev = 0; + share_buffer_buffer = 0; + share_buffer_buffer_barrier = 0; + + seesionid = 0; + serviceid_timelow = 0; + serviceid_timemid = 0; + serviceid_timehiandver = 0; + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode = NULL; + serviceid_clockseqandnode_outsize = 0; + opscnt = 0; + head_next = 0; + head_prev = 0; + context = 0; + + started = 0; + paramtypes = 0; + + operation_param1_tmpref_buffer = 0; + operation_param1_tmpref_size = 0; + operation_param1_memref_parent = 0; + operation_param1_memref_size = 0; + operation_param1_memref_offset = 0; + operation_param1_value_a = 0; + operation_param1_value_b = 0; + operation_param1_ionref_ionsharefd = 0; + operation_param1_ionref_ionsize = 0; + + operation_param2_tmpref_buffer = 0; + operation_param2_tmpref_size = 0; + operation_param2_memref_parent = 0; + operation_param2_memref_size = 0; + operation_param2_memref_offset = 0; + operation_param2_value_a = 0; + operation_param2_value_b = 0; + operation_param2_ionref_ionsharefd = 0; + operation_param2_ionref_ionsize = 0; + + operation_param3_tmpref_buffer = 0; + operation_param3_tmpref_size = 0; + operation_param3_memref_parent = 0; + operation_param3_memref_size = 0; + operation_param3_memref_offset = 0; + operation_param3_value_a = 0; + operation_param3_value_b = 0; + operation_param3_ionref_ionsharefd = 0; + operation_param3_ionref_ionsize = 0; + + operation_param4_tmpref_buffer = 0; + operation_param4_tmpref_size = 0; + operation_param4_memref_parent = 0; + operation_param4_memref_size = 0; + operation_param4_memref_offset = 0; + operation_param4_value_a = 0; + operation_param4_value_b = 0; + operation_param4_ionref_ionsharefd = 0; + operation_param4_ionref_ionsize = 0; + + operation_session = 0; + operation_cancelflag = 0; + + returnorigin = 0; + } else + { + TEEC_Session *sessionIns = (TEEC_Session *) malloc(sizeof(TEEC_Session)); + + // contextIns->fd = in_fd; + contextIns->ta_path = in_ta_path; + // typedef struct { + // volatile int __val[4*sizeof(long)/sizeof(int)]; + // } sem_t; + // + // typedef union + // { + // char __size[__SIZEOF_SEM_T]; + // long long int __align; + // } sem_t; + + destinationIns.timeLow = in_destination_timelow; + destinationIns.timeMid = in_destination_timemid; + destinationIns.timeHiAndVersion = in_destination_timehiandver; + for (int i = 0; + i < in_destination_clockseqandnode_size; + i++) + { + destinationIns.clockSeqAndNode[i] = in_destination_clockseqandnode[i]; + } + + in_connectiondata_temp = (void *) in_connectiondata; + // in_connectiondata_temp = NULL; + + + memset(&operationIns, 0, sizeof(operationIns)); + operationIns.started = in_operation_started; + operationIns.paramTypes = in_operation_paramtypes; + + origin = in_returnorigin; + + struct timeval start, end; + gettimeofday(&start, NULL); + result = + TEEC_OpenSession( + contextIns, + sessionIns, + &destinationIns, + in_connectionmethod, + in_connectiondata_temp, // NULL + &operationIns, + &origin + ); + gettimeofday(&end, NULL); + uint32_t cost = 0; + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + if (result != TEEC_SUCCESS) + { + printf("Teec OpenSession Failed. \n"); + printf(" teecresult = 0x %8.8x.\n", result); + + teecresult = result; + + fd = 0; + ta_path_size = 0; + ta_path = NULL; + charp = ta_path; + session_list_next = 0; + session_list_prev = 0; + shrd_mem_list_next = 0; + shrd_mem_list_prev = 0; + share_buffer_buffer = 0; + share_buffer_buffer_barrier = 0; + + seesionid = 0; + serviceid_timelow = 0; + serviceid_timemid = 0; + serviceid_timehiandver = 0; + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode = NULL; + serviceid_clockseqandnode_outsize = 0; + opscnt = 0; + head_next = 0; + head_prev = 0; + context = 0; + + started = 0; + paramtypes = 0; + + operation_param1_tmpref_buffer = 0; + operation_param1_tmpref_size = 0; + operation_param1_memref_parent = 0; + operation_param1_memref_size = 0; + operation_param1_memref_offset = 0; + operation_param1_value_a = 0; + operation_param1_value_b = 0; + operation_param1_ionref_ionsharefd = 0; + operation_param1_ionref_ionsize = 0; + + operation_param2_tmpref_buffer = 0; + operation_param2_tmpref_size = 0; + operation_param2_memref_parent = 0; + operation_param2_memref_size = 0; + operation_param2_memref_offset = 0; + operation_param2_value_a = 0; + operation_param2_value_b = 0; + operation_param2_ionref_ionsharefd = 0; + operation_param2_ionref_ionsize = 0; + + operation_param3_tmpref_buffer = 0; + operation_param3_tmpref_size = 0; + operation_param3_memref_parent = 0; + operation_param3_memref_size = 0; + operation_param3_memref_offset = 0; + operation_param3_value_a = 0; + operation_param3_value_b = 0; + operation_param3_ionref_ionsharefd = 0; + operation_param3_ionref_ionsize = 0; + + operation_param4_tmpref_buffer = 0; + operation_param4_tmpref_size = 0; + operation_param4_memref_parent = 0; + operation_param4_memref_size = 0; + operation_param4_memref_offset = 0; + operation_param4_value_a = 0; + operation_param4_value_b = 0; + operation_param4_ionref_ionsharefd = 0; + operation_param4_ionref_ionsize = 0; + + operation_session = 0; + operation_cancelflag = 0; + + returnorigin = 0; + } else + { + printf("Teec OpenSession Succed, cost time: %ld us \n", cost); + + tsn_t *tsnIns = (tsn_t *) malloc(sizeof(tsn_t)); + tsnIns->self = sessionIns; + struct timeval tvcreate; + gettimeofday(&tvcreate, NULL); + tsnIns->createtime = tvcreate; + pthread_mutex_lock(mutex_tsl); + if (tsl->first == NULL) + { + tsnIns->next = NULL; + tsnIns->prev = NULL; + tsl->first = tsnIns; + tsl->last = tsnIns; + tsl->count = 1; + } else + { + tsnIns->prev = tsl->last; + tsnIns->next = NULL; + tsl->last->next = tsnIns; + tsl->last = tsnIns; + tsl->count = tsl->count + 1; + } + pthread_mutex_unlock(mutex_tsl); + + teecresult = result; + + fd = contextIns->fd; + if (contextIns->ta_path != NULL) + { + ta_path_size = strlen((const char *) contextIns->ta_path); + } else + { + ta_path_size = 0; + } + ta_path = contextIns->ta_path; + charp = ta_path; + session_list_next = (dbus_uint64_t) contextIns->session_list.next; + session_list_prev = (dbus_uint64_t) contextIns->session_list.prev; + shrd_mem_list_next = (dbus_uint64_t) contextIns->shrd_mem_list.next; + shrd_mem_list_prev = (dbus_uint64_t) contextIns->shrd_mem_list.prev; + share_buffer_buffer = (dbus_uint64_t) contextIns->share_buffer.buffer; + share_buffer_buffer_barrier = contextIns->share_buffer.buffer_barrier.__align; + + seesionid = sessionIns->session_id; + serviceid_timelow = sessionIns->service_id.timeLow; + serviceid_timemid = sessionIns->service_id.timeMid; + serviceid_timehiandver = sessionIns->service_id.timeHiAndVersion; + if (sessionIns->service_id.clockSeqAndNode != NULL) + { + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (dbus_uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + for (int iind = 0; iind < 8; iind++) + { + uint8_t u8Temp; + u8Temp = sessionIns->service_id.clockSeqAndNode[iind]; + serviceid_clockseqandnode[iind] = (dbus_uint32_t) u8Temp; + } + serviceid_clockseqandnode_outsize = 8; + } else + { + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode = NULL; + serviceid_clockseqandnode_outsize = 0; + } + opscnt = sessionIns->ops_cnt; + head_next = (dbus_uint64_t) sessionIns->head.next; + head_prev = (dbus_uint64_t) sessionIns->head.prev; + context = (dbus_uint64_t) sessionIns->context; + + started = operationIns.started; + paramtypes = operationIns.paramTypes; + + operation_param1_tmpref_buffer = (dbus_uint64_t) operationIns.params[0].tmpref.buffer; + operation_param1_tmpref_size = operationIns.params[0].tmpref.size; + operation_param1_memref_parent = (dbus_uint64_t) operationIns.params[0].memref.parent; + operation_param1_memref_size = operationIns.params[0].memref.size; + operation_param1_memref_offset = operationIns.params[0].memref.offset; + operation_param1_value_a = operationIns.params[0].value.a; + operation_param1_value_b = operationIns.params[0].value.b; + operation_param1_ionref_ionsharefd = operationIns.params[0].ionref.ion_share_fd; + operation_param1_ionref_ionsize = operationIns.params[0].ionref.ion_size; + + operation_param2_tmpref_buffer = (dbus_uint64_t) operationIns.params[1].tmpref.buffer; + operation_param2_tmpref_size = operationIns.params[1].tmpref.size; + operation_param2_memref_parent = (dbus_uint64_t) operationIns.params[1].memref.parent; + operation_param2_memref_size = operationIns.params[1].memref.size; + operation_param2_memref_offset = operationIns.params[1].memref.offset; + operation_param2_value_a = operationIns.params[1].value.a; + operation_param2_value_b = operationIns.params[1].value.b; + operation_param2_ionref_ionsharefd = operationIns.params[1].ionref.ion_share_fd; + operation_param2_ionref_ionsize = operationIns.params[1].ionref.ion_size; + + operation_param3_tmpref_buffer = (dbus_uint64_t) operationIns.params[2].tmpref.buffer; + operation_param3_tmpref_size = operationIns.params[2].tmpref.size; + operation_param3_memref_parent = (dbus_uint64_t) operationIns.params[2].memref.parent; + operation_param3_memref_size = operationIns.params[2].memref.size; + operation_param3_memref_offset = operationIns.params[2].memref.offset; + operation_param3_value_a = operationIns.params[2].value.a; + operation_param3_value_b = operationIns.params[2].value.b; + operation_param3_ionref_ionsharefd = operationIns.params[2].ionref.ion_share_fd; + operation_param3_ionref_ionsize = operationIns.params[2].ionref.ion_size; + + operation_param4_tmpref_buffer = (dbus_uint64_t) operationIns.params[3].tmpref.buffer; + operation_param4_tmpref_size = operationIns.params[3].tmpref.size; + operation_param4_memref_parent = (dbus_uint64_t) operationIns.params[3].memref.parent; + operation_param4_memref_size = operationIns.params[3].memref.size; + operation_param4_memref_offset = operationIns.params[3].memref.offset; + operation_param4_value_a = operationIns.params[3].value.a; + operation_param4_value_b = operationIns.params[3].value.b; + operation_param4_ionref_ionsharefd = operationIns.params[3].ionref.ion_share_fd; + operation_param4_ionref_ionsize = operationIns.params[3].ionref.ion_size; + + operation_session = (dbus_uint64_t) operationIns.session; + operation_cancelflag = operationIns.cancel_flag; + + returnorigin = origin; + + printf(" ret sessionid = 0x %8.8x \n", seesionid); + printf(" ret context = 0x %16.16lx \n", context); + +#if 0 + printf("Call TEEC_CloseSession inputs: \n"); + printf(" session_seesionid = 0x %8.8x \n", sessionIns->session_id); + printf(" session_serviceid_timelow = 0x %8.8x \n", sessionIns->service_id.timeLow); + printf(" session_serviceid_timemid = 0x %4.4x \n", sessionIns->service_id.timeMid); + printf(" session_serviceid_timehiandver = 0x %4.4x \n", + sessionIns->service_id.timeHiAndVersion); + printf(" session_serviceid_clockseqandnode = \n"); + printf(" "); + for (int i = 0; i < 8; i++) { + printf(" %2.2x", sessionIns->service_id.clockSeqAndNode[i]); + } + printf("\n"); + printf(" session_opscnt = 0x %8.8x \n", sessionIns->ops_cnt); + printf(" session_head_next = 0x %16.16lx \n", sessionIns->head.next); + printf(" session_head_prev = 0x %16.16lx \n", sessionIns->head.prev); + printf(" session_context = 0x %16.16lx \n", sessionIns->context); + + // TEEC_CloseSession(sessionIns); + // printf("Teec CloseSession. \n"); +#endif + } + } + //////////////////////////////////////////////////////////////////////////////////////////////// +#else + ta_path = (unsigned char *)malloc(1024 * sizeof(char)); + ta_path_size = 1024; + memset((char *)ta_path, 0, 1024); + uint32_t context_tapath_outsize; + uint32_t serviceid_clockseqandnode_outsize_temp; + uint32_t returnorigin_temp; + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (dbus_uint32_t *)malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + + char workername[1024]; + memset((char *)workername, 0, 1024); + int ifound = 0; + int iworker; + + pthread_mutex_lock(mutex_workerrec); + for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) + { + if (workerrec[iworker].context_fd == in_fd && + workerrec[iworker].context_addr == in_context_addr + ) + { + sprintf(workername, "%s%d", "gpworker", iworker); + ifound = 1; + break; + } + } + pthread_mutex_unlock(mutex_workerrec); + + if (ifound == 0) + { + printf("Can't find the woker for the context. \n"); + + teecresult = 0xAAAA0017; + + fd = 0x0; + ta_path = NULL; + charp = ta_path; + session_list_next = 0x0; + session_list_prev = 0x0; + shrd_mem_list_next = 0x0; + shrd_mem_list_prev = 0x0; + share_buffer_buffer = 0; + share_buffer_buffer_barrier = 0x0; + + seesionid = 0x0; + serviceid_timelow = 0x0; + serviceid_timemid = 0x0; + serviceid_timehiandver = 0x0; + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode = + (dbus_uint32_t *)malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + for (int i = 0; i < serviceid_clockseqandnode_realsize ; i++) { + serviceid_clockseqandnode[i] = 0x0; + } + serviceid_clockseqandnode_outsize = 0; + opscnt = 0x0; + head_next = 0x0; + head_prev = 0x0; + context = 0x0; + + started = 0x0; + paramtypes = 0x0; + + operation_param1_tmpref_buffer = 0x0; + operation_param1_tmpref_size = 0x0; + operation_param1_memref_parent = 0x0; + operation_param1_memref_size = 0x0; + operation_param1_memref_offset = 0x0; + operation_param1_value_a = 0x0; + operation_param1_value_b = 0x0; + operation_param1_ionref_ionsharefd = 0x0; + operation_param1_ionref_ionsize = 0x0; + + operation_param2_tmpref_buffer = 0x0; + operation_param2_tmpref_size = 0x0; + operation_param2_memref_parent = 0x0; + operation_param2_memref_size = 0x0; + operation_param2_memref_offset = 0x0; + operation_param2_value_a = 0x0; + operation_param2_value_b = 0x0; + operation_param2_ionref_ionsharefd = 0x0; + operation_param2_ionref_ionsize = 0x0; + + operation_param3_tmpref_buffer = 0x0; + operation_param3_tmpref_size = 0x0; + operation_param3_memref_parent = 0x0; + operation_param3_memref_size = 0x0; + operation_param3_memref_offset = 0x0; + operation_param3_value_a = 0x0; + operation_param3_value_b = 0x0; + operation_param3_ionref_ionsharefd = 0x0; + operation_param3_ionref_ionsize = 0x0; + + operation_param4_tmpref_buffer = 0x0; + operation_param4_tmpref_size = 0x0; + operation_param4_memref_parent = 0x0; + operation_param4_memref_size = 0x0; + operation_param4_memref_offset = 0x0; + operation_param4_value_a = 0x0; + operation_param4_value_b = 0x0; + operation_param4_ionref_ionsharefd = 0x0; + operation_param4_ionref_ionsize = 0x0; + + operation_session = 0x0; + operation_cancelflag = 0x0; + + returnorigin = 0x0; + } + else + { + method_call_teec_opensession( + workername, + + in_fd, + in_ta_path, + in_ta_path_size, + in_session_list_next, + in_session_list_prev, + in_shrd_mem_list_next, + in_shrd_mem_list_prev, + in_share_buffer_buffer, + in_share_buffer_buffer_barrier, + + in_destination_timelow, + in_destination_timemid, + in_destination_timehiandver, + in_destination_clockseqandnode, + in_destination_clockseqandnode_realsize, + + in_connectionmethod, + in_connectiondata, + + in_operation_started, + in_operation_paramtypes, + + in_operation_param1_tmpref_buffer, + in_operation_param1_tmpref_size, + in_operation_param1_memref_parent, + in_operation_param1_memref_size, + in_operation_param1_memref_offset, + in_operation_param1_value_a, + in_operation_param1_value_b, + in_operation_param1_ionref_ionsharefd, + in_operation_param1_ionref_ionsize, + + in_operation_param2_tmpref_buffer, + in_operation_param2_tmpref_size, + in_operation_param2_memref_parent, + in_operation_param2_memref_size, + in_operation_param2_memref_offset, + in_operation_param2_value_a, + in_operation_param2_value_b, + in_operation_param2_ionref_ionsharefd, + in_operation_param2_ionref_ionsize, + + in_operation_param3_tmpref_buffer, + in_operation_param3_tmpref_size, + in_operation_param3_memref_parent, + in_operation_param3_memref_size, + in_operation_param3_memref_offset, + in_operation_param3_value_a, + in_operation_param3_value_b, + in_operation_param3_ionref_ionsharefd, + in_operation_param3_ionref_ionsize, + + in_operation_param4_tmpref_buffer, + in_operation_param4_tmpref_size, + in_operation_param4_memref_parent, + in_operation_param4_memref_size, + in_operation_param4_memref_offset, + in_operation_param4_value_a, + in_operation_param4_value_b, + in_operation_param4_ionref_ionsharefd, + in_operation_param4_ionref_ionsize, + + in_operation_session, + in_operation_cancelflag, + + in_returnorigin, + + in_context_addr, + + + &teecresult, + + &fd, + ta_path, + ta_path_size, + &context_tapath_outsize, + &session_list_next, + &session_list_prev, + &shrd_mem_list_next, + &shrd_mem_list_prev, + &share_buffer_buffer, + &share_buffer_buffer_barrier, + + &seesionid, + &serviceid_timelow, + &serviceid_timemid, + &serviceid_timehiandver, + serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize, + &serviceid_clockseqandnode_outsize_temp, + &opscnt, + &head_next, + &head_prev, + &context, + + &started, + ¶mtypes, + + &operation_param1_tmpref_buffer, + &operation_param1_tmpref_size, + &operation_param1_memref_parent, + &operation_param1_memref_size, + &operation_param1_memref_offset, + &operation_param1_value_a, + &operation_param1_value_b, + &operation_param1_ionref_ionsharefd, + &operation_param1_ionref_ionsize, + + &operation_param2_tmpref_buffer, + &operation_param2_tmpref_size, + &operation_param2_memref_parent, + &operation_param2_memref_size, + &operation_param2_memref_offset, + &operation_param2_value_a, + &operation_param2_value_b, + &operation_param2_ionref_ionsharefd, + &operation_param2_ionref_ionsize, + + &operation_param3_tmpref_buffer, + &operation_param3_tmpref_size, + &operation_param3_memref_parent, + &operation_param3_memref_size, + &operation_param3_memref_offset, + &operation_param3_value_a, + &operation_param3_value_b, + &operation_param3_ionref_ionsharefd, + &operation_param3_ionref_ionsize, + + &operation_param4_tmpref_buffer, + &operation_param4_tmpref_size, + &operation_param4_memref_parent, + &operation_param4_memref_size, + &operation_param4_memref_offset, + &operation_param4_value_a, + &operation_param4_value_b, + &operation_param4_ionref_ionsharefd, + &operation_param4_ionref_ionsize, + + &operation_session, + &operation_cancelflag, + + &returnorigin_temp + ); + + if (teecresult == 0) { + pthread_mutex_lock(mutex_workerrec); + + sin_t * sinIns = (sin_t *)malloc(sizeof(sin_t)); + sinIns->session_id = seesionid; + struct timeval tvcreate; + gettimeofday(&tvcreate, NULL); + sinIns->session_createtime = tvcreate; + if (workerrec[iworker].first == NULL) + { + sinIns->next = NULL; + sinIns->prev = NULL; + workerrec[iworker].first = sinIns; + workerrec[iworker].last = sinIns; + workerrec[iworker].sessionid_count = 1; + } + else + { + sinIns->prev = workerrec[iworker].last; + sinIns->next = NULL; + workerrec[iworker].last->next = sinIns; + workerrec[iworker].last = sinIns; + workerrec[iworker].sessionid_count = + workerrec[iworker].sessionid_count + 1; + } + pthread_mutex_unlock(mutex_workerrec); + } + + serviceid_clockseqandnode_outsize = + serviceid_clockseqandnode_outsize_temp; + returnorigin = returnorigin_temp; + + if (ta_path_size >= context_tapath_outsize) { + ta_path_size = context_tapath_outsize; + charp = ta_path; + } + else + { + ta_path_size = 0; + charp = NULL; + } + + if ( + serviceid_clockseqandnode_realsize >= serviceid_clockseqandnode_outsize && + 8 >= serviceid_clockseqandnode_outsize + ) + { + serviceid_clockseqandnode_realsize = serviceid_clockseqandnode_outsize; + } + else + { + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode_outsize = 0; + } + + } // end of else found == 1 + + //////////////////////////////////////////////////////////////////////////////////////////////// +#endif + + + // create a reply from the message + reply = dbus_message_new_method_return(msg); + + // add the arguments to the reply + dbus_message_iter_init_append(reply, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &teecresult + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &fd + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + DBusError err; + // initialise the errors + dbus_error_init(&err); + + if (ta_path_size > 0 && + charp != NULL && + strlen((const char *) charp) > 0 + ) + { + if (dbus_validate_utf8((const char *) charp, &err) == true) + { + ta_path_size = strlen((const char *) charp); + } else + { + ta_path_size = 0; + } + } else + { + ta_path_size = 0; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &ta_path_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (ta_path_size > 0) + { + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &charp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &session_list_next + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &session_list_prev + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &shrd_mem_list_prev + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &shrd_mem_list_next + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &share_buffer_buffer + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT64, + &share_buffer_buffer_barrier + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &seesionid + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_timelow + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_timemid + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_timehiandver + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_clockseqandnode_outsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (serviceid_clockseqandnode_outsize > 0 && + serviceid_clockseqandnode != NULL + ) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize + ); + + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return NULL; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &opscnt + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &head_next + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &head_prev + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &context + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &started + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + ¶mtypes + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param1_tmpref_buffer + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_tmpref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param1_memref_parent + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_memref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_memref_offset + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_value_a + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_value_b + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &operation_param1_ionref_ionsharefd + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_ionref_ionsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param2_tmpref_buffer + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_tmpref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param2_memref_parent + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_memref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_memref_offset + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_value_a + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_value_b + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &operation_param2_ionref_ionsharefd + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_ionref_ionsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param3_tmpref_buffer + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_tmpref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param3_memref_parent + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_memref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_memref_offset + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_value_a + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_value_b + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &operation_param3_ionref_ionsharefd + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_ionref_ionsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param4_tmpref_buffer + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_tmpref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param4_memref_parent + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_memref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_memref_offset + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_value_a + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_value_b + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &operation_param4_ionref_ionsharefd + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_ionref_ionsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_session + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &operation_cancelflag + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &returnorigin + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + // send the reply && flush the connection + serial = 100; + if (!dbus_connection_send(conn, reply, &serial)) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + // dbus_connection_close(conn); + // dbus_connection_unref(conn); + free(thdfargs); + + // sleep(2); + +#if 0 + #ifdef GP_WORKER + +#else + if (ta_path == NULL) + { + free(ta_path); + } + if (serviceid_clockseqandnode == NULL) + { + free(serviceid_clockseqandnode); + } +#endif +#endif + + return NULL; +} + + +void * +reply_to_method_call_teec_closesession( + void *thdfargs +) +{ + DBusMsgConn *DBusMCP; + DBusMessage *msg; + DBusConnection *conn; + DBusMessage *reply; + DBusMessageIter args; + dbus_bool_t bResult; + DBusMessageIter structIter; + DBusMessageIter ArrayIter; + int iType; + char buf[2]; + buf[0] = DBUS_TYPE_UINT32; + buf[1] = '\0'; + + dbus_uint32_t in_session_seesionid; + dbus_uint32_t in_session_serviceid_timelow; + dbus_uint32_t in_session_serviceid_timemid; + dbus_uint32_t in_session_serviceid_timehiandver; + dbus_uint32_t in_session_serviceid_clockseqandnode_size; + dbus_uint32_t *in_session_serviceid_clockseqandnode; + int in_session_serviceid_clockseqandnode_realsize; + dbus_uint32_t in_session_opscnt; + dbus_uint64_t in_session_head_next; + dbus_uint64_t in_session_head_prev; + dbus_uint64_t in_session_context; + + dbus_uint32_t seesionid; + dbus_uint32_t serviceid_timelow; + dbus_uint32_t serviceid_timemid; + dbus_uint32_t serviceid_timehiandver; + dbus_uint32_t *serviceid_clockseqandnode; + int serviceid_clockseqandnode_realsize; + dbus_int32_t serviceid_clockseqandnode_outsize; + dbus_uint32_t opscnt; + dbus_uint64_t head_next; + dbus_uint64_t head_prev; + dbus_uint64_t context; + + dbus_uint32_t serial = 0; + +#ifdef GP_PROXY + pthread_mutex_t * mutex_workerrec; + wr_t * workerrec; +#endif + +#ifdef GP_WORKER + pthread_mutex_t *mutex_tcl; + pthread_mutex_t *mutex_tsl; + tcl_t *tcl; + tsl_t *tsl; +#endif + + DBusMCP = (DBusMsgConn *) thdfargs; + msg = DBusMCP->msg; + conn = DBusMCP->conn; +#ifdef GP_PROXY + mutex_workerrec = DBusMCP->mutex_workerrec; + workerrec = DBusMCP->workerrec; +#endif +#ifdef GP_WORKER + mutex_tcl = DBusMCP->mutex_tcl; + mutex_tsl = DBusMCP->mutex_tsl; + tcl = DBusMCP->tcl; + tsl = DBusMCP->tsl; +#endif + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_get_basic( + &structIter, + &in_session_seesionid); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_serviceid_timelow + ); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_serviceid_timemid); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_serviceid_timehiandver); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_serviceid_clockseqandnode_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (in_session_serviceid_clockseqandnode_size > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &in_session_serviceid_clockseqandnode, + &in_session_serviceid_clockseqandnode_realsize + ); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_get_basic( + &structIter, + &in_session_opscnt); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_head_next); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_head_prev); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_context); + + printf("Received method call Teec Close Session: \n"); + printf(" in_session_seesionid = 0x %8.8x \n", in_session_seesionid); +#if 0 + printf(" in_session_serviceid_timelow = 0x %8.8x \n", in_session_serviceid_timelow); + printf(" in_session_serviceid_timemid = 0x %8.8x \n", in_session_serviceid_timemid); + printf(" in_session_serviceid_timehiandver = 0x %8.8x \n", + in_session_serviceid_timehiandver); + printf(" in_session_serviceid_clockseqandnode = \n"); + printf(" "); + for (int i = 0; i < in_session_serviceid_clockseqandnode_realsize; i++) { + printf(" %8.8x", in_session_serviceid_clockseqandnode[i]); + } + printf("\n"); + printf(" in_session_serviceid_clockseqandnode_size = 0x %8.8x \n", + in_session_serviceid_clockseqandnode_size); + printf(" in_session_opscnt = 0x %8.8x \n", in_session_opscnt); + printf(" in_session_head_next = 0x %16.16lx \n", in_session_head_next); + printf(" in_session_head_prev = 0x %16.16lx \n", in_session_head_prev); +#endif + printf(" in_session_context = 0x %16.16lx \n", in_session_context); + + +#ifdef GP_WORKER + //////////////////////////////////////////////////////////////////////////////////////////////// + + + TEEC_Session *sessionIns; + tsn_t *tsnIns; + + sessionIns = NULL; + pthread_mutex_lock(mutex_tsl); + if (tsl->first != NULL) + { + tsnIns = tsl->first; + do + { + if (tsnIns->self->session_id == in_session_seesionid) + { + sessionIns = tsnIns->self; + break; + } + tsnIns = tsnIns->next; + } while (tsnIns != NULL); + } + pthread_mutex_unlock(mutex_tsl); + + if (sessionIns == NULL) + { + if (tsl->first == NULL) + { + printf("The teec session list is null. \n"); + // teecresult = TEEC_ERROR_SESSION_LIST_NULL; + } else + { + printf("Can't find the teec session. \n"); + // teecresult = TEEC_ERROR_NO_SESSION_MATCH; + } + + seesionid = 0x0; + serviceid_timelow = 0x0; + serviceid_timemid = 0x0; + serviceid_timehiandver = 0x0; + opscnt = 0x0; + head_next = 0x0; + head_prev = 0x0; + context = 0x0; + + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (dbus_uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + for (int i = 0; i < serviceid_clockseqandnode_realsize; i++) + { + serviceid_clockseqandnode[i] = 0x0; + } + serviceid_clockseqandnode_outsize = 8; + } else + { + sessionIns->session_id = in_session_seesionid; +#if 0 + sessionIns->service_id.timeLow = in_session_serviceid_timelow; + sessionIns->service_id.timeMid = in_session_serviceid_timemid; + sessionIns->service_id.timeHiAndVersion = in_session_serviceid_timehiandver; + if ( in_session_serviceid_clockseqandnode_realsize <= 8 && + in_session_serviceid_clockseqandnode_realsize > 0 && + in_session_serviceid_clockseqandnode != NULL + ) + { + for (int i = 0; i < in_session_serviceid_clockseqandnode_realsize; i++) { + sessionIns->service_id.clockSeqAndNode[i] = + (uint8_t)(in_session_serviceid_clockseqandnode[i] & 0x000000ff); + } + } + else + { + for (int i = 0; i < 8; i++) { + sessionIns->service_id.clockSeqAndNode[i] = 0; + } + } + sessionIns->ops_cnt = in_session_opscnt; + sessionIns->head.next = (struct ListNode *)in_session_head_next; + sessionIns->head.prev = (struct ListNode *)in_session_head_prev; + // sessionIns->context = (TEEC_Context *)in_session_context; +#endif + +#if 0 + printf("Call TEEC_CloseSession inputs: \n"); + printf(" session_seesionid = 0x %8.8x \n", sessionIns->session_id); + printf(" session_serviceid_timelow = 0x %8.8x \n", sessionIns->service_id.timeLow); + printf(" session_serviceid_timemid = 0x %4.4x \n", sessionIns->service_id.timeMid); + printf(" session_serviceid_timehiandver = 0x %4.4x \n", + sessionIns->service_id.timeHiAndVersion); + printf(" session_serviceid_clockseqandnode = \n"); + printf(" "); + for (int i = 0; i < 8; i++) { + printf(" %2.2x", sessionIns->service_id.clockSeqAndNode[i]); + } + printf("\n"); + printf(" session_opscnt = 0x %8.8x \n", sessionIns->ops_cnt); + printf(" session_head_next = 0x %16.16lx \n", sessionIns->head.next); + printf(" session_head_prev = 0x %16.16lx \n", sessionIns->head.prev); + printf(" session_context = 0x %16.16lx \n", sessionIns->context); +#endif + struct timeval start, end; + gettimeofday(&start, NULL); + TEEC_CloseSession( + sessionIns + ); + gettimeofday(&end, NULL); + uint32_t cost = 0; + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + printf("Teec CloseSession executed, cost time: %ld us \n", cost); + + seesionid = sessionIns->session_id; + serviceid_timelow = sessionIns->service_id.timeLow; + serviceid_timemid = sessionIns->service_id.timeMid; + serviceid_timehiandver = sessionIns->service_id.timeHiAndVersion; +#if 0 + printf(" in_session_serviceid_clockseqandnode = \n"); + printf(" "); + for (int i = 0; i < 8; i++) { + printf(" %2.2x", in_session_serviceid_clockseqandnode[i]); + } + printf("\n"); +#endif + if (sessionIns->service_id.clockSeqAndNode != NULL) + { + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (dbus_uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + for (int iind = 0; iind < 8; iind++) + { + uint8_t u8Temp; + u8Temp = sessionIns->service_id.clockSeqAndNode[iind]; + serviceid_clockseqandnode[iind] = (dbus_uint32_t) u8Temp; + } + serviceid_clockseqandnode_outsize = 8; + } else + { + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode = NULL; + serviceid_clockseqandnode_outsize = 0; + } + opscnt = sessionIns->ops_cnt; + head_next = (dbus_uint64_t) sessionIns->head.next; + head_prev = (dbus_uint64_t) sessionIns->head.prev; + context = (dbus_uint64_t) sessionIns->context; + + printf(" ret sessionid = 0x %8.8x \n", seesionid); + printf(" ret context = 0x %16.16lx \n", context); + + tsn_t *tsnTemp; + tsnTemp = tsnIns->prev; + if (tsnTemp != NULL) + { + tsnTemp->next = tsnIns->next; + } + tsnTemp = tsnIns->next; + if (tsnTemp != NULL) + { + tsnTemp->prev = tsnIns->prev; + } + pthread_mutex_lock(mutex_tsl); + if (tsl->last == tsnIns) + { + tsl->last = tsnIns->prev; + } + if (tsl->first == tsnIns) + { + tsl->first = tsnIns->next; + } + tsl->count = tsl->count - 1; + pthread_mutex_unlock(mutex_tsl); + free(sessionIns); + free(tsnIns); + } + //////////////////////////////////////////////////////////////////////////////////////////////// +#else + + uint32_t serviceid_clockseqandnode_outsize_temp; + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (dbus_uint32_t *)malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + + char workername[1024]; + memset((char *)workername, 0, 1024); + // sprintf(workername, "%s", "gpworker1"); + int ifound = 0; + int iworker; + sin_t * sinIns; + + pthread_mutex_lock(mutex_workerrec); + for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) + { + if (workerrec[iworker].context_addr == in_session_context) + { + sinIns = NULL; + if (workerrec[iworker].first != NULL) + { + sinIns = workerrec[iworker].first; + do + { + if (sinIns->session_id == in_session_seesionid) + { + sprintf(workername, "%s%d", "gpworker", iworker); + ifound = 1; + break; + } + sinIns = sinIns->next; + }while (sinIns != NULL); + + + if ( ifound == 1 ) + { + break; + } + } + } + } + pthread_mutex_unlock(mutex_workerrec); + + + if (ifound == 0) + { + printf("Can't find the worker for the session and the context. \n"); + + seesionid = 0x0; + serviceid_timelow = 0x0; + serviceid_timemid = 0x0; + serviceid_timehiandver = 0x0; + opscnt = 0x0; + head_next = 0x0; + head_prev = 0x0; + context = 0x0; + + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (dbus_uint32_t *)malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + for (int i = 0; i < serviceid_clockseqandnode_realsize ; i++) { + serviceid_clockseqandnode[i] = 0x0; + } + serviceid_clockseqandnode_outsize = 8; + } + else + { + method_call_teec_closesession( + workername, + + in_session_seesionid, + in_session_serviceid_timelow, + in_session_serviceid_timemid, + in_session_serviceid_timehiandver, + in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_realsize, + in_session_opscnt, + in_session_head_next, + in_session_head_prev, + in_session_context, + + &seesionid, + &serviceid_timelow, + &serviceid_timemid, + &serviceid_timehiandver, + serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize, + &serviceid_clockseqandnode_outsize_temp, + &opscnt, + &head_next, + &head_prev, + &context + ); + + pthread_mutex_lock(mutex_workerrec); + sin_t * sinTemp; + sinTemp = sinIns->prev; + if (sinTemp != NULL) + { + sinTemp->next = sinIns->next; + } + sinTemp = sinIns->next; + if (sinTemp != NULL) + { + sinTemp->prev = sinIns->prev; + } + if (workerrec[iworker].last == sinIns) + { + workerrec[iworker].last = sinIns->prev; + } + if (workerrec[iworker].first == sinIns) + { + workerrec[iworker].first = sinIns->next; + } + free(sinIns); + workerrec[iworker].sessionid_count = + workerrec[iworker].sessionid_count - 1; + pthread_mutex_unlock(mutex_workerrec); + + serviceid_clockseqandnode_outsize = serviceid_clockseqandnode_outsize_temp; + + if ( + serviceid_clockseqandnode_realsize >= serviceid_clockseqandnode_outsize && + 8 >= serviceid_clockseqandnode_outsize + ) + { + serviceid_clockseqandnode_realsize = serviceid_clockseqandnode_outsize; + } + else + { + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode_outsize = 0; + } + + }// end of else found == 1 +#endif + + + // create a reply from the message + reply = dbus_message_new_method_return(msg); + + // add the arguments to the reply + dbus_message_iter_init_append(reply, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &seesionid + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_timelow + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_timemid + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_timehiandver + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_clockseqandnode_outsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (serviceid_clockseqandnode_outsize > 0 && + serviceid_clockseqandnode != NULL + ) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize + ); + + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return NULL; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &opscnt + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &head_next + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &head_prev + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &context + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + // send the reply && flush the connection + serial = 100; + if (!dbus_connection_send(conn, reply, &serial)) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + // dbus_connection_close(conn); + // dbus_connection_unref(conn); + free(thdfargs); + + // sleep(2); + + return NULL; +} + + +void * +reply_to_method_call_teec_invokecommand( + void *thdfargs +) +{ + DBusMsgConn *DBusMCP; + DBusMessage *msg; + DBusConnection *conn; + DBusMessage *reply; + DBusMessageIter args; + dbus_bool_t bResult; + DBusMessageIter structIter; + DBusMessageIter ArrayIter; + int iType; + char buf[2]; + buf[0] = DBUS_TYPE_UINT32; + buf[1] = '\0'; + + dbus_uint32_t in_session_sessionid; + dbus_uint32_t in_session_serviceid_timelow; + dbus_uint32_t in_session_serviceid_timemid; + dbus_uint32_t in_session_serviceid_timehiandver; + dbus_uint32_t in_session_serviceid_clockseqandnode_size; + dbus_uint32_t *in_session_serviceid_clockseqandnode; + int in_session_serviceid_clockseqandnode_realsize; + dbus_uint32_t in_session_opscnt; + dbus_uint64_t in_session_head_next; + dbus_uint64_t in_session_head_prev; + dbus_uint64_t in_session_context; + + dbus_uint32_t in_commandid; + + dbus_uint32_t in_operation_started; + dbus_uint32_t in_operation_paramtypes; + + dbus_uint64_t in_operation_param1_tmpref_buffer; + dbus_uint32_t in_operation_param1_tmpref_size; + dbus_uint64_t in_operation_param1_memref_parent; + dbus_uint32_t in_operation_param1_memref_parent_flag; + dbus_uint32_t in_operation_param1_memref_size; + dbus_uint32_t in_operation_param1_memref_offset; + dbus_uint32_t in_operation_param1_value_a; + dbus_uint32_t in_operation_param1_value_b; + dbus_int32_t in_operation_param1_ionref_ionsharefd; + dbus_uint32_t in_operation_param1_ionref_ionsize; + + dbus_uint64_t in_operation_param2_tmpref_buffer; + dbus_uint32_t in_operation_param2_tmpref_size; + dbus_uint64_t in_operation_param2_memref_parent; + dbus_uint32_t in_operation_param2_memref_parent_flag; + dbus_uint32_t in_operation_param2_memref_size; + dbus_uint32_t in_operation_param2_memref_offset; + dbus_uint32_t in_operation_param2_value_a; + dbus_uint32_t in_operation_param2_value_b; + dbus_int32_t in_operation_param2_ionref_ionsharefd; + dbus_uint32_t in_operation_param2_ionref_ionsize; + + dbus_uint64_t in_operation_param3_tmpref_buffer; + dbus_uint32_t in_operation_param3_tmpref_size; + dbus_uint64_t in_operation_param3_memref_parent; + dbus_uint32_t in_operation_param3_memref_parent_flag; + dbus_uint32_t in_operation_param3_memref_size; + dbus_uint32_t in_operation_param3_memref_offset; + dbus_uint32_t in_operation_param3_value_a; + dbus_uint32_t in_operation_param3_value_b; + dbus_int32_t in_operation_param3_ionref_ionsharefd; + dbus_uint32_t in_operation_param3_ionref_ionsize; + + dbus_uint64_t in_operation_param4_tmpref_buffer; + dbus_uint32_t in_operation_param4_tmpref_size; + dbus_uint64_t in_operation_param4_memref_parent; + dbus_uint32_t in_operation_param4_memref_parent_flag; + dbus_uint32_t in_operation_param4_memref_size; + dbus_uint32_t in_operation_param4_memref_offset; + dbus_uint32_t in_operation_param4_value_a; + dbus_uint32_t in_operation_param4_value_b; + dbus_int32_t in_operation_param4_ionref_ionsharefd; + dbus_uint32_t in_operation_param4_ionref_ionsize; + + dbus_uint64_t in_operation_session; + dbus_int32_t in_operation_cancelflag; + + dbus_uint32_t in_returnorigin; + + dbus_uint32_t in_buffer1_size; + dbus_uint32_t *in_buffer1; + int in_buffer1_realsize; + dbus_uint32_t in_buffer2_size; + dbus_uint32_t *in_buffer2; + int in_buffer2_realsize; + dbus_uint32_t in_buffer3_size; + dbus_uint32_t *in_buffer3; + int in_buffer3_realsize; + dbus_uint32_t in_buffer4_size; + dbus_uint32_t *in_buffer4; + int in_buffer4_realsize; + + dbus_uint32_t teecresult; + + dbus_uint32_t sessionid; + dbus_uint32_t serviceid_timelow; + dbus_uint32_t serviceid_timemid; + dbus_uint32_t serviceid_timehiandver; + dbus_uint32_t *serviceid_clockseqandnode; + int serviceid_clockseqandnode_realsize; + dbus_uint32_t serviceid_clockseqandnode_outsize; + dbus_uint32_t opscnt; + dbus_uint64_t head_next; + dbus_uint64_t head_prev; + dbus_uint64_t context; + + dbus_uint32_t started; + dbus_uint32_t paramtypes; + + dbus_uint64_t operation_param1_tmpref_buffer; + dbus_uint32_t operation_param1_tmpref_size; + dbus_uint64_t operation_param1_memref_parent; + dbus_uint32_t operation_param1_memref_parent_flag; + dbus_uint32_t operation_param1_memref_size; + dbus_uint32_t operation_param1_memref_offset; + dbus_uint32_t operation_param1_value_a; + dbus_uint32_t operation_param1_value_b; + dbus_int32_t operation_param1_ionref_ionsharefd; + dbus_uint32_t operation_param1_ionref_ionsize; + + dbus_uint64_t operation_param2_tmpref_buffer; + dbus_uint32_t operation_param2_tmpref_size; + dbus_uint64_t operation_param2_memref_parent; + dbus_uint32_t operation_param2_memref_parent_flag; + dbus_uint32_t operation_param2_memref_size; + dbus_uint32_t operation_param2_memref_offset; + dbus_uint32_t operation_param2_value_a; + dbus_uint32_t operation_param2_value_b; + dbus_int32_t operation_param2_ionref_ionsharefd; + dbus_uint32_t operation_param2_ionref_ionsize; + + dbus_uint64_t operation_param3_tmpref_buffer; + dbus_uint32_t operation_param3_tmpref_size; + dbus_uint64_t operation_param3_memref_parent; + dbus_uint32_t operation_param3_memref_parent_flag; + dbus_uint32_t operation_param3_memref_size; + dbus_uint32_t operation_param3_memref_offset; + dbus_uint32_t operation_param3_value_a; + dbus_uint32_t operation_param3_value_b; + dbus_int32_t operation_param3_ionref_ionsharefd; + dbus_uint32_t operation_param3_ionref_ionsize; + + dbus_uint64_t operation_param4_tmpref_buffer; + dbus_uint32_t operation_param4_tmpref_size; + dbus_uint64_t operation_param4_memref_parent; + dbus_uint32_t operation_param4_memref_parent_flag; + dbus_uint32_t operation_param4_memref_size; + dbus_uint32_t operation_param4_memref_offset; + dbus_uint32_t operation_param4_value_a; + dbus_uint32_t operation_param4_value_b; + dbus_int32_t operation_param4_ionref_ionsharefd; + dbus_uint32_t operation_param4_ionref_ionsize; + + dbus_uint64_t operation_session; + dbus_int32_t operation_cancelflag; + + dbus_uint32_t returnorigin; + + dbus_uint32_t *buffer1; + int buffer1_realsize; + dbus_uint32_t buffer1_outsize; + dbus_uint32_t *buffer2; + int buffer2_realsize; + dbus_uint32_t buffer2_outsize; + dbus_uint32_t *buffer3; + int buffer3_realsize; + dbus_uint32_t buffer3_outsize; + dbus_uint32_t *buffer4; + int buffer4_realsize; + dbus_uint32_t buffer4_outsize; + + dbus_uint32_t serial = 0; + +#ifdef GP_PROXY + pthread_mutex_t * mutex_workerrec; + wr_t * workerrec; +#endif + +#ifdef GP_WORKER + pthread_mutex_t *mutex_tcl; + pthread_mutex_t *mutex_tsl; + tcl_t *tcl; + tsl_t *tsl; +#endif + + DBusMCP = (DBusMsgConn *) thdfargs; + msg = DBusMCP->msg; + conn = DBusMCP->conn; +#ifdef GP_PROXY + mutex_workerrec = DBusMCP->mutex_workerrec; + workerrec = DBusMCP->workerrec; +#endif +#ifdef GP_WORKER + mutex_tcl = DBusMCP->mutex_tcl; + mutex_tsl = DBusMCP->mutex_tsl; + tcl = DBusMCP->tcl; + tsl = DBusMCP->tsl; +#endif + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_sessionid); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_serviceid_timelow + ); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_serviceid_timemid); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_serviceid_timehiandver); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_serviceid_clockseqandnode_size); + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (in_session_serviceid_clockseqandnode_size > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &in_session_serviceid_clockseqandnode, + &in_session_serviceid_clockseqandnode_realsize + ); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_get_basic( + &structIter, + &in_session_opscnt); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_head_next); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_head_prev); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_session_context); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_commandid); + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_started); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_paramtypes); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_tmpref_buffer); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_tmpref_size); + + bResult = dbus_message_iter_next(&structIter); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT64) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_memref_parent); + + bResult = dbus_message_iter_next(&structIter); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32. \n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_memref_parent_flag); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_memref_size); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_memref_offset); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_value_a); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_value_b); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_ionref_ionsharefd); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param1_ionref_ionsize); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_tmpref_buffer); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_tmpref_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_memref_parent); + + bResult = dbus_message_iter_next(&structIter); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32. \n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_memref_parent_flag); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_memref_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_memref_offset); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_value_a); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_value_b); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_ionref_ionsharefd); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param2_ionref_ionsize); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_tmpref_buffer); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_tmpref_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_memref_parent); + + bResult = dbus_message_iter_next(&structIter); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32. \n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_memref_parent_flag); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_memref_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_memref_offset); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_value_a); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_value_b); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_ionref_ionsharefd); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param3_ionref_ionsize); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_tmpref_buffer); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_tmpref_size); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_memref_parent); + + bResult = dbus_message_iter_next(&structIter); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32. \n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_memref_parent_flag); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_memref_size); + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_memref_offset); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_value_a); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_value_b); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_ionref_ionsharefd); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_param4_ionref_ionsize); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_session); + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_operation_cancelflag); + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_returnorigin); + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_buffer1_size); + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (in_buffer1_size > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &in_buffer1, + &in_buffer1_realsize + ); + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_buffer2_size); + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (in_buffer2_size > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &in_buffer2, + &in_buffer2_realsize + ); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_buffer3_size); + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (in_buffer3_size > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &in_buffer3, + &in_buffer3_realsize + ); + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_basic( + &structIter, + &in_buffer4_size); + + if (in_buffer4_size > 0) + { + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_iter_recurse( + &structIter, + &ArrayIter); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &in_buffer4, + &in_buffer4_realsize + ); + } + + printf("Received method call TEEC_InvokeCommand: \n"); + printf(" in_session_sessionid = 0x %8.8x \n", in_session_sessionid); +#if 0 + printf(" in_session_serviceid_timelow = 0x %8.8x \n", in_session_serviceid_timelow); + printf(" in_session_serviceid_timemid = 0x %8.8x \n", in_session_serviceid_timemid); + printf(" in_session_serviceid_timehiandver = 0x %8.8x \n", + in_session_serviceid_timehiandver); + printf(" in_session_serviceid_clockseqandnode = \n"); + printf(" "); + for (int i = 0; i < in_session_serviceid_clockseqandnode_realsize; i++) { + printf(" %2.2x", in_session_serviceid_clockseqandnode[i]); + } + printf("\n"); + printf(" in serviceid_clockseqandnode_size = 0x %8.8x \n", + in_session_serviceid_clockseqandnode_size); + printf(" in_session_opscnt = 0x %8.8x \n", in_session_opscnt); + printf(" in_session_head_next = 0x %16.16lx \n", in_session_head_next); + printf(" in_session_head_prev = 0x %16.16lx \n", in_session_head_prev); +#endif + printf(" in_session_context = 0x %16.16lx \n", in_session_context); +#if 0 + printf(" commandid = 0x %8.8x \n", in_commandid); + + printf(" in_operation_started = 0x %8.8x \n", in_operation_started); + printf(" in_operation_paramtypes = 0x %8.8x \n", in_operation_paramtypes); + + printf(" in_operation_param1_tmpref_buffer = 0x %16.16lx \n", in_operation_param1_tmpref_buffer); + printf(" in_operation_param1_tmpref_size = 0x %8.8x \n", in_operation_param1_tmpref_size); + printf(" in_operation_param1_memref_parent = 0x %16.16lx \n", in_operation_param1_memref_parent); + printf(" in_operation_param1_memref_size = 0x %8.8x \n", in_operation_param1_memref_size); + printf(" in_operation_param1_memref_offset = 0x %8.8x \n", in_operation_param1_memref_offset); + printf(" in_operation_param1_value_a = 0x %8.8x \n", in_operation_param1_value_a); + printf(" in_operation_param1_value_b = 0x %8.8x \n", in_operation_param1_value_b); + printf(" in_operation_param1_ionref_ionsharefd = 0x %8.8x \n",in_operation_param2_ionref_ionsharefd); + printf(" in_operation_param1_ionref_ionsize = 0x %8.8x \n", in_operation_param2_ionref_ionsize); + + printf(" in_operation_param2_tmpref_buffer = 0x %16.16lx \n", in_operation_param2_tmpref_buffer); + printf(" in_operation_param2_tmpref_size = 0x %8.8x \n", in_operation_param2_tmpref_size); + printf(" in_operation_param2_memref_parent = 0x %16.16lx \n", in_operation_param2_memref_parent); + printf(" in_operation_param2_memref_size = 0x %8.8x \n", in_operation_param2_memref_size); + printf(" in_operation_param2_memref_offset = 0x %8.8x \n", in_operation_param2_memref_offset); + printf(" in_operation_param2_value_a = 0x %8.8x \n", in_operation_param3_value_a); + printf(" in_operation_param2_value_b = 0x %8.8x \n", in_operation_param3_value_b); + printf(" in_operation_param2_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); + printf(" in_operation_param2_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); + + printf(" in_operation_param3_tmpref_buffer = 0x %16.16lx \n", in_operation_param3_tmpref_buffer); + printf(" in_operation_param3_tmpref_size = 0x %8.8x \n", in_operation_param3_tmpref_size); + printf(" in_operation_param3_memref_parent = 0x %16.16lx \n", in_operation_param3_memref_parent); + printf(" in_operation_param3_memref_size = 0x %8.8x \n", in_operation_param3_memref_size); + printf(" in_operation_param3_memref_offset = 0x %8.8x \n", in_operation_param3_memref_offset); + printf(" in_operation_param3_value_a = 0x %8.8x \n", in_operation_param3_value_a); + printf(" in_operation_param3_value_b = 0x %8.8x \n", in_operation_param3_value_b); + printf(" in_operation_param3_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); + printf(" in_operation_param3_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); + + printf(" in_operation_param4_tmpref_buffer = 0x %16.16lx \n", in_operation_param4_tmpref_buffer); + printf(" in_operation_param4_tmpref_size = 0x %8.8x \n", in_operation_param4_tmpref_size); + printf(" in_operation_param4_memref_parent = 0x %16.16lx \n", in_operation_param4_memref_parent); + printf(" in_operation_param4_memref_size = 0x %8.8x \n", in_operation_param4_memref_size); + printf(" in_operation_param4_memref_offset = 0x %8.8x \n", in_operation_param4_memref_offset); + printf(" in_operation_param4_value_a = 0x %8.8x \n", in_operation_param4_value_a); + printf(" in_operation_param4_value_b = 0x %8.8x \n", in_operation_param4_value_b); + printf(" in_operation_param4_ionref_ionsharefd = 0x %8.8x \n", in_operation_param4_ionref_ionsharefd); + printf(" in_operation_param4_ionref_ionsize = 0x %8.8x \n", in_operation_param4_ionref_ionsize); + + printf(" in_operation_session = 0x %16.16lx \n", in_operation_session); + printf(" in_operation_cancelflag = 0x %8.8x \n", in_operation_cancelflag); + + printf(" in_returnorigin = 0x %8.8x \n", in_returnorigin); + + printf(" in_buffer1 = \n"); + if (in_buffer1_size > 0) { + printf(" "); + for (int i = 0; i < in_buffer1_realsize; i++) { + printf(" %2.2x", in_buffer1[i]); + } + printf("\n"); + } +#endif + +#if 0 + printf(" in_buffer1_size = 0x %8.8x \n", + in_buffer1_size); +#endif + +#if 0 + printf(" in_buffer2 = \n"); + if (in_buffer2_size > 0) { + printf(" "); + for (int i = 0; i < in_buffer2_realsize; i++) { + printf(" %2.2x", in_buffer2[i]); + } + printf("\n"); + } + printf(" in_buffer2_size = 0x %8.8x \n", + in_buffer2_size); + + printf(" in_buffer3 = \n"); + if (in_buffer3_size > 0) { + printf(" "); + for (int i = 0; i < in_buffer3_realsize; i++) { + printf(" %2.2x", in_buffer3[i]); + } + printf("\n"); + } + printf(" in_buffer3_size = 0x %8.8x \n", + in_buffer3_size); + + printf(" in_buffer4 = \n"); + if (in_buffer4_size > 0) { + printf(" "); + for (int i = 0; i < in_buffer4_realsize; i++) { + printf(" %2.2x", in_buffer4[i]); + } + printf("\n"); + } + printf(" in_buffer4_size = 0x %8.8x \n", + in_buffer4_size); +#endif + +#ifdef GP_WORKER + ////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////// + TEEC_Session *sessionIns; + tsn_t *tsnIns; + + sessionIns = NULL; + pthread_mutex_lock(mutex_tsl); + if (tsl->first != NULL) + { + tsnIns = tsl->first; + do + { + if (tsnIns->self->session_id == in_session_sessionid) + { + sessionIns = tsnIns->self; + break; + } + tsnIns = tsnIns->next; + } while (tsnIns != NULL); + } + pthread_mutex_unlock(mutex_tsl); + + TEEC_Context *contextIns; + tcn_t *tcnIns; + + contextIns = NULL; + if (sessionIns != NULL) + { + pthread_mutex_lock(mutex_tcl); + if (tcl->first != NULL) + { + tcnIns = tcl->first; + do + { + contextIns = tcnIns->self; + if (contextIns == sessionIns->context) + { + break; + } + tcnIns = tcnIns->next; + } while (tcnIns != NULL); + } + pthread_mutex_unlock(mutex_tcl); + } + + if (sessionIns == NULL || contextIns == NULL) + { + if (sessionIns == NULL) + { + if (tsl->first == NULL) + { + printf("The teec session list is null. \n"); + teecresult = TEEC_ERROR_SESSION_LIST_NULL; + } else + { + printf("Can't find the teec session. \n"); + teecresult = TEEC_ERROR_NO_SESSION_MATCH; + } + } + + if (contextIns == NULL) + { + if (tcl->first == NULL) + { + printf("The teec context list is null. \n"); + teecresult = TEEC_ERROR_CONTEXT_LIST_NULL; + } else + { + printf("Can't find the teec context. \n"); + teecresult = TEEC_ERROR_NO_CONTEXT_MATCH; + } + } + + sessionid = 0; + serviceid_timelow = 0; + serviceid_timemid = 0; + serviceid_timehiandver = 0; + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode = NULL; + serviceid_clockseqandnode_outsize = 0; + opscnt = 0; + head_next = 0; + head_prev = 0; + context = 0; + + started = 0; + paramtypes = 0; + + operation_param1_tmpref_buffer = 0; + operation_param1_tmpref_size = 0; + operation_param1_memref_parent = 0; + operation_param1_memref_parent_flag = 0; + operation_param1_memref_size = 0; + operation_param1_memref_offset = 0; + operation_param1_value_a = 0; + operation_param1_value_b = 0; + operation_param1_ionref_ionsharefd = 0; + operation_param1_ionref_ionsize = 0; + + operation_param2_tmpref_buffer = 0; + operation_param2_tmpref_size = 0; + operation_param2_memref_parent = 0; + operation_param2_memref_parent_flag = 0; + operation_param2_memref_size = 0; + operation_param2_memref_offset = 0; + operation_param2_value_a = 0; + operation_param2_value_b = 0; + operation_param2_ionref_ionsharefd = 0; + operation_param2_ionref_ionsize = 0; + + operation_param3_tmpref_buffer = 0; + operation_param3_tmpref_size = 0; + operation_param3_memref_parent = 0; + operation_param3_memref_parent_flag = 0; + operation_param3_memref_size = 0; + operation_param3_memref_offset = 0; + operation_param3_value_a = 0; + operation_param3_value_b = 0; + operation_param3_ionref_ionsharefd = 0; + operation_param3_ionref_ionsize = 0; + + operation_param4_tmpref_buffer = 0; + operation_param4_tmpref_size = 0; + operation_param4_memref_parent = 0; + operation_param4_memref_parent_flag = 0; + operation_param4_memref_size = 0; + operation_param4_memref_offset = 0; + operation_param4_value_a = 0; + operation_param4_value_b = 0; + operation_param4_ionref_ionsharefd = 0; + operation_param4_ionref_ionsize = 0; + + operation_session = 0; + operation_cancelflag = 0; + + returnorigin = 0xff; + + buffer1_realsize = 0; + buffer1 = NULL; + buffer1_outsize = 0; + buffer2_realsize = 0; + buffer2 = NULL; + buffer2_outsize = 0; + buffer3_realsize = 0; + buffer3 = NULL; + buffer3_outsize = 0; + buffer4_realsize = 0; + buffer4 = NULL; + buffer4_outsize = 0; + } else + { + teecresult = TEEC_SUCCESS; + + sessionIns->session_id = in_session_sessionid; + sessionIns->service_id.timeLow = in_session_serviceid_timelow; + sessionIns->service_id.timeMid = in_session_serviceid_timemid; + sessionIns->service_id.timeHiAndVersion = in_session_serviceid_timehiandver; + if (in_session_serviceid_clockseqandnode_realsize <= 8 && + in_session_serviceid_clockseqandnode_realsize > 0 && + in_session_serviceid_clockseqandnode != NULL + ) + { + for (int i = 0; i < in_session_serviceid_clockseqandnode_realsize; i++) + { + sessionIns->service_id.clockSeqAndNode[i] = + (uint8_t)(in_session_serviceid_clockseqandnode[i] & 0x000000ff); + } + } else + { + for (int i = 0; i < 8; i++) + { + sessionIns->service_id.clockSeqAndNode[i] = 0; + } + } + sessionIns->ops_cnt = in_session_opscnt; + sessionIns->head.next = (struct ListNode *) in_session_head_next; + sessionIns->head.prev = (struct ListNode *) in_session_head_prev; + // sessionIns->context = (TEEC_Context *)in_session_context; + + + TEEC_Operation operationIns; + + operationIns.started = in_operation_started; + operationIns.paramTypes = in_operation_paramtypes; + + ///////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////// + + uint8_t *buffer1_temp = NULL; + TEEC_SharedMemory shareBuffer1; + bool sb1AllReged = false; + switch ( + TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 0) + ) + { + case TEEC_VALUE_INPUT: + case TEEC_VALUE_INOUT: + { + operationIns.params[0].value.a = in_operation_param1_value_a; + operationIns.params[0].value.b = in_operation_param1_value_b; + + break; + } + + case TEEC_MEMREF_TEMP_INPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if ( + in_buffer1 != NULL && + in_buffer1_size > 0 + ) + { + uint32_t buffer1_temp_size; + buffer1_temp_size = in_buffer1_size; + buffer1_temp = (uint8_t *) malloc(buffer1_temp_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer1_size; isize++) + { + buffer1_temp[isize] = (uint8_t)(in_buffer1[isize] & 0x000000ff); + } + + operationIns.params[0].tmpref.buffer = (void *) buffer1_temp; + operationIns.params[0].tmpref.size = buffer1_temp_size; + } + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + { + if ( + in_operation_param1_tmpref_size > 0 + ) + { + buffer1_temp = (uint8_t *) malloc(in_operation_param1_tmpref_size * sizeof(uint8_t)); + operationIns.params[0].tmpref.buffer = (void *) buffer1_temp; + operationIns.params[0].tmpref.size = in_operation_param1_tmpref_size; + } + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + switch (in_operation_param1_memref_parent_flag) + { + case TEEC_MEM_INPUT: + case TEEC_MEM_INOUT: + { + if ( + in_buffer1 != NULL && + in_buffer1_size > 0 + ) + { + memset(&shareBuffer1, 0, sizeof(shareBuffer1)); + shareBuffer1.size = in_buffer1_size; + shareBuffer1.flags = in_operation_param1_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer1); + if (retASM) + { + printf("Alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb1AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + memset(shareBuffer1.buffer, 0, shareBuffer1.size); + for (int isize = 0; isize < in_buffer1_size; isize++) + { + *((uint8_t * )(shareBuffer1.buffer) + isize) = + (uint8_t)(in_buffer1[isize] & 0x000000ff); + } + operationIns.params[0].memref.parent = &shareBuffer1; + // operationIns.params[0].memref.parent->flags = + // in_operation_param1_memref_parent_flag; + operationIns.params[0].memref.size = shareBuffer1.size; + } + } + + break; + } + + case TEEC_MEM_OUTPUT: + { + if ( + in_operation_param1_memref_size > 0 + ) + { + memset(&shareBuffer1, 0, sizeof(shareBuffer1)); + shareBuffer1.size = in_operation_param1_memref_size; + shareBuffer1.flags = in_operation_param1_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer1); + if (retASM) + { + printf("Alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb1AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + operationIns.params[0].memref.parent = &shareBuffer1; + operationIns.params[0].memref.size = shareBuffer1.size; + } + + } + + break; + } + + default: + break; + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_INPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if ( + in_buffer1 != NULL && + in_buffer1_size > 0 + ) + { + memset(&shareBuffer1, 0, sizeof(shareBuffer1)); + shareBuffer1.size = in_buffer1_size; + shareBuffer1.flags = in_operation_param1_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer1); + if (retASM) + { + printf("Alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb1AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + memset(shareBuffer1.buffer, 0, shareBuffer1.size); + for (int isize = 0; isize < in_buffer1_size; isize++) + { + *((uint8_t * )(shareBuffer1.buffer) + isize) = + (uint8_t)(in_buffer1[isize] & 0x000000ff); + } + operationIns.params[0].memref.parent = &shareBuffer1; + operationIns.params[0].memref.offset = in_operation_param1_memref_offset; + operationIns.params[0].memref.size = in_operation_param1_memref_size; + } + } + + break; + } + + case TEEC_MEMREF_PARTIAL_OUTPUT: + { + if (in_operation_param1_memref_size > 0) + { + memset(&shareBuffer1, 0, sizeof(shareBuffer1)); + shareBuffer1.size = in_buffer1_size; + shareBuffer1.flags = in_operation_param1_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer1); + if (retASM) + { + printf("Alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb1AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + operationIns.params[0].memref.parent = &shareBuffer1; + operationIns.params[0].memref.offset = in_operation_param1_memref_offset; + operationIns.params[0].memref.size = in_operation_param1_memref_size; + } + + } + + break; + } + + + default: + break; + } + + ///////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////// + + uint8_t *buffer2_temp = NULL; + TEEC_SharedMemory shareBuffer2; + bool sb2AllReged = false; + switch ( + TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 1) + ) + { + case TEEC_VALUE_INPUT: + case TEEC_VALUE_INOUT: + { + operationIns.params[1].value.a = in_operation_param2_value_a; + operationIns.params[1].value.b = in_operation_param2_value_b; + + break; + } + + case TEEC_MEMREF_TEMP_INPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if ( + in_buffer2 != NULL && + in_buffer2_size > 0 + ) + { + uint32_t buffer2_temp_size; + buffer2_temp_size = in_buffer2_size; + buffer2_temp = (uint8_t *) malloc(buffer2_temp_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer2_size; isize++) + { + buffer2_temp[isize] = (uint8_t)(in_buffer2[isize] & 0x000000ff); + } + + operationIns.params[1].tmpref.buffer = (void *) buffer2_temp; + operationIns.params[1].tmpref.size = buffer2_temp_size; + } + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + { + if ( + in_operation_param2_tmpref_size > 0 + ) + { + buffer2_temp = (uint8_t *) malloc(in_operation_param2_tmpref_size * sizeof(uint8_t)); + operationIns.params[1].tmpref.buffer = (void *) buffer2_temp; + operationIns.params[1].tmpref.size = in_operation_param2_tmpref_size; + } + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + switch (in_operation_param2_memref_parent_flag) + { + case TEEC_MEM_INPUT: + case TEEC_MEM_INOUT: + { + if ( + in_buffer2 != NULL && + in_buffer2_size > 0 + ) + { + memset(&shareBuffer2, 0, sizeof(shareBuffer2)); + shareBuffer2.size = in_buffer2_size; + shareBuffer2.flags = in_operation_param2_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer2); + if (retASM) + { + printf("alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb2AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + memset(shareBuffer2.buffer, 0, shareBuffer2.size); + for (int isize = 0; isize < in_buffer2_size; isize++) + { + *((uint8_t * )(shareBuffer2.buffer) + isize) = + (uint8_t)(in_buffer2[isize] & 0x000000ff); + } + operationIns.params[1].memref.parent = &shareBuffer2; + // operationIns.params[1].memref.parent->flags = + // in_operation_param2_memref_parent_flag; + operationIns.params[1].memref.size = shareBuffer2.size; + } + } + + break; + } + + case TEEC_MEM_OUTPUT: + { + if ( + in_operation_param2_memref_size > 0 + ) + { + memset(&shareBuffer2, 0, sizeof(shareBuffer2)); + shareBuffer2.size = in_operation_param2_memref_size; + shareBuffer2.flags = in_operation_param2_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer2); + if (retASM) + { + printf("alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb2AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + operationIns.params[1].memref.parent = &shareBuffer2; + // operationIns.params[1].memref.parent->flags = + // in_operation_param2_memref_parent_flag; + operationIns.params[1].memref.size = shareBuffer2.size; + } + + } + + break; + } + + default: + break; + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_INPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if ( + in_buffer2 != NULL && + in_buffer2_size > 0 + ) + { + memset(&shareBuffer2, 0, sizeof(shareBuffer2)); + shareBuffer2.size = in_buffer2_size; + shareBuffer2.flags = in_operation_param2_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer2); + if (retASM) + { + printf("Alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb2AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + memset(shareBuffer2.buffer, 0, shareBuffer2.size); + for (int isize = 0; isize < in_buffer2_size; isize++) + { + *((uint8_t * )(shareBuffer2.buffer) + isize) = + (uint8_t)(in_buffer2[isize] & 0x000000ff); + } + operationIns.params[1].memref.parent = &shareBuffer2; + operationIns.params[1].memref.offset = in_operation_param2_memref_offset; + operationIns.params[1].memref.size = in_operation_param2_memref_size; + } + } + + break; + } + + case TEEC_MEMREF_PARTIAL_OUTPUT: + { + if (in_operation_param2_memref_size > 0) + { + memset(&shareBuffer2, 0, sizeof(shareBuffer2)); + shareBuffer2.size = in_buffer2_size; + shareBuffer2.flags = in_operation_param2_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer2); + if (retASM) + { + printf("Alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb2AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + operationIns.params[1].memref.parent = &shareBuffer2; + operationIns.params[1].memref.offset = in_operation_param2_memref_offset; + operationIns.params[1].memref.size = in_operation_param2_memref_size; + } + + } + + break; + } + + + default: + break; + } + + ///////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////// + + uint8_t *buffer3_temp = NULL; + TEEC_SharedMemory shareBuffer3; + bool sb3AllReged = false; + switch ( + TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 2) + ) + { + case TEEC_VALUE_INPUT: + case TEEC_VALUE_INOUT: + { + operationIns.params[2].value.a = in_operation_param3_value_a; + operationIns.params[2].value.b = in_operation_param3_value_b; + + break; + } + + case TEEC_MEMREF_TEMP_INPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if ( + in_buffer3 != NULL && + in_buffer3_size > 0 + ) + { + uint32_t buffer3_temp_size; + buffer3_temp_size = in_buffer3_size; + buffer3_temp = (uint8_t *) malloc(buffer3_temp_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer3_size; isize++) + { + buffer3_temp[isize] = (uint8_t)(in_buffer3[isize] & 0x000000ff); + } + + operationIns.params[2].tmpref.buffer = (void *) buffer3_temp; + operationIns.params[2].tmpref.size = buffer3_temp_size; + } + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + { + if ( + in_operation_param3_tmpref_size > 0 + ) + { + buffer3_temp = (uint8_t *) malloc(in_operation_param3_tmpref_size * sizeof(uint8_t)); + operationIns.params[2].tmpref.buffer = (void *) buffer3_temp; + operationIns.params[2].tmpref.size = in_operation_param3_tmpref_size; + } + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + switch (in_operation_param3_memref_parent_flag) + { + case TEEC_MEM_INPUT: + case TEEC_MEM_INOUT: + { + if ( + in_buffer3 != NULL && + in_buffer3_size > 0 + ) + { + memset(&shareBuffer3, 0, sizeof(shareBuffer3)); + shareBuffer3.size = in_buffer3_size; + shareBuffer3.flags = in_operation_param3_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer3); + if (retASM) + { + printf("alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb3AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + memset(shareBuffer3.buffer, 0, shareBuffer3.size); + for (int isize = 0; isize < in_buffer3_size; isize++) + { + *((uint8_t * )(shareBuffer3.buffer) + isize) = + (uint8_t)(in_buffer3[isize] & 0x000000ff); + } + operationIns.params[2].memref.parent = &shareBuffer3; + // operationIns.params[2].memref.parent->flags = + // in_operation_param3_memref_parent_flag; + operationIns.params[2].memref.size = shareBuffer3.size; + } + } + + break; + } + + case TEEC_MEM_OUTPUT: + { + if ( + in_operation_param3_memref_size > 0 + ) + { + memset(&shareBuffer3, 0, sizeof(shareBuffer3)); + shareBuffer3.size = in_operation_param3_memref_size; + shareBuffer3.flags = in_operation_param3_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer3); + if (retASM) + { + printf("alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb3AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + operationIns.params[2].memref.parent = &shareBuffer3; + // operationIns.params[2].memref.parent->flags = + // in_operation_param3_memref_parent_flag; + operationIns.params[2].memref.size = shareBuffer3.size; + } + + } + + break; + } + + default: + break; + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_INPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if ( + in_buffer3 != NULL && + in_buffer3_size > 0 + ) + { + memset(&shareBuffer3, 0, sizeof(shareBuffer3)); + shareBuffer3.size = in_buffer3_size; + shareBuffer3.flags = in_operation_param3_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer3); + if (retASM) + { + printf("Alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb3AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + memset(shareBuffer3.buffer, 0, shareBuffer3.size); + for (int isize = 0; isize < in_buffer3_size; isize++) + { + *((uint8_t * )(shareBuffer3.buffer) + isize) = + (uint8_t)(in_buffer3[isize] & 0x000000ff); + } + operationIns.params[2].memref.parent = &shareBuffer3; + operationIns.params[2].memref.offset = in_operation_param3_memref_offset; + operationIns.params[2].memref.size = in_operation_param3_memref_size; + } + } + + break; + } + + case TEEC_MEMREF_PARTIAL_OUTPUT: + { + if (in_operation_param3_memref_size > 0) + { + memset(&shareBuffer3, 0, sizeof(shareBuffer3)); + shareBuffer3.size = in_buffer3_size; + shareBuffer3.flags = in_operation_param3_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer3); + if (retASM) + { + printf("Alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb3AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + operationIns.params[2].memref.parent = &shareBuffer3; + operationIns.params[2].memref.offset = in_operation_param3_memref_offset; + operationIns.params[2].memref.size = in_operation_param3_memref_size; + } + + } + + break; + } + + + default: + break; + } + + ///////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////// + + uint8_t *buffer4_temp = NULL; + TEEC_SharedMemory shareBuffer4; + bool sb4AllReged = false; + switch ( + TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 3) + ) + { + case TEEC_VALUE_INPUT: + case TEEC_VALUE_INOUT: + { + operationIns.params[3].value.a = in_operation_param4_value_a; + operationIns.params[3].value.b = in_operation_param4_value_b; + + break; + } + + case TEEC_MEMREF_TEMP_INPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if ( + in_buffer4 != NULL && + in_buffer4_size > 0 + ) + { + uint32_t buffer4_temp_size; + buffer4_temp_size = in_buffer4_size; + buffer4_temp = (uint8_t *) malloc(buffer4_temp_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer4_size; isize++) + { + buffer4_temp[isize] = (uint8_t)(in_buffer4[isize] & 0x000000ff); + } + + operationIns.params[3].tmpref.buffer = (void *) buffer4_temp; + operationIns.params[3].tmpref.size = buffer4_temp_size; + } + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + { + if ( + in_operation_param4_tmpref_size > 0 + ) + { + buffer4_temp = (uint8_t *) malloc(in_operation_param4_tmpref_size * sizeof(uint8_t)); + operationIns.params[3].tmpref.buffer = (void *) buffer4_temp; + operationIns.params[3].tmpref.size = in_operation_param4_tmpref_size; + } + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + switch (in_operation_param4_memref_parent_flag) + { + case TEEC_MEM_INPUT: + case TEEC_MEM_INOUT: + { + if ( + in_buffer4 != NULL && + in_buffer4_size > 0 + ) + { + memset(&shareBuffer4, 0, sizeof(shareBuffer4)); + shareBuffer4.size = in_buffer4_size; + shareBuffer4.flags = in_operation_param4_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer4); + if (retASM) + { + printf("alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb4AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + memset(shareBuffer4.buffer, 0, shareBuffer4.size); + for (int isize = 0; isize < in_buffer4_size; isize++) + { + *((uint8_t * )(shareBuffer4.buffer) + isize) = + (uint8_t)(in_buffer4[isize] & 0x000000ff); + } + operationIns.params[3].memref.parent = &shareBuffer4; + // operationIns.params[3].memref.parent->flags = + // in_operation_param4_memref_parent_flag; + operationIns.params[3].memref.size = shareBuffer4.size; + } + } + + break; + } + + case TEEC_MEM_OUTPUT: + { + if ( + in_operation_param4_memref_size > 0 + ) + { + memset(&shareBuffer4, 0, sizeof(shareBuffer4)); + shareBuffer4.size = in_operation_param4_memref_size; + shareBuffer4.flags = in_operation_param4_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer4); + if (retASM) + { + printf("alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb4AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + operationIns.params[3].memref.parent = &shareBuffer4; + // operationIns.params[3].memref.parent->flags = + // in_operation_param4_memref_parent_flag; + operationIns.params[3].memref.size = shareBuffer4.size; + } + + } + + break; + } + + default: + break; + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_INPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if ( + in_buffer4 != NULL && + in_buffer4_size > 0 + ) + { + memset(&shareBuffer4, 0, sizeof(shareBuffer4)); + shareBuffer4.size = in_buffer4_size; + shareBuffer4.flags = in_operation_param4_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer4); + if (retASM) + { + printf("Alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb4AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + memset(shareBuffer4.buffer, 0, shareBuffer4.size); + for (int isize = 0; isize < in_buffer4_size; isize++) + { + *((uint8_t * )(shareBuffer4.buffer) + isize) = + (uint8_t)(in_buffer4[isize] & 0x000000ff); + } + operationIns.params[3].memref.parent = &shareBuffer4; + operationIns.params[3].memref.offset = in_operation_param4_memref_offset; + operationIns.params[3].memref.size = in_operation_param4_memref_size; + } + } + + break; + } + + case TEEC_MEMREF_PARTIAL_OUTPUT: + { + if (in_operation_param4_memref_size > 0) + { + memset(&shareBuffer4, 0, sizeof(shareBuffer4)); + shareBuffer4.size = in_buffer4_size; + shareBuffer4.flags = in_operation_param4_memref_parent_flag; + TEEC_Result retASM = 0; + retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer4); + if (retASM) + { + printf("Alloc share memory failed, ret=0x%x.\n", retASM); + teecresult = retASM; + } else + { + sb4AllReged = true; + printf("TEEC_AllocateSharedMemory succecced. \n"); + operationIns.params[3].memref.parent = &shareBuffer4; + operationIns.params[3].memref.offset = in_operation_param4_memref_offset; + operationIns.params[3].memref.size = in_operation_param4_memref_size; + } + + } + + break; + } + + + default: + break; + } + + ///////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////// + + if (teecresult != TEEC_SUCCESS) + { + sessionid = 0; + serviceid_timelow = 0; + serviceid_timemid = 0; + serviceid_timehiandver = 0; + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode = NULL; + serviceid_clockseqandnode_outsize = 0; + opscnt = 0; + head_next = 0; + head_prev = 0; + context = 0; + + started = 0; + paramtypes = 0; + + operation_param1_tmpref_buffer = 0; + operation_param1_tmpref_size = 0; + operation_param1_memref_parent = 0; + operation_param1_memref_parent_flag = 0; + operation_param1_memref_size = 0; + operation_param1_memref_offset = 0; + operation_param1_value_a = 0; + operation_param1_value_b = 0; + operation_param1_ionref_ionsharefd = 0; + operation_param1_ionref_ionsize = 0; + + operation_param2_tmpref_buffer = 0; + operation_param2_tmpref_size = 0; + operation_param2_memref_parent = 0; + operation_param2_memref_parent_flag = 0; + operation_param2_memref_size = 0; + operation_param2_memref_offset = 0; + operation_param2_value_a = 0; + operation_param2_value_b = 0; + operation_param2_ionref_ionsharefd = 0; + operation_param2_ionref_ionsize = 0; + + operation_param3_tmpref_buffer = 0; + operation_param3_tmpref_size = 0; + operation_param3_memref_parent = 0; + operation_param3_memref_parent_flag = 0; + operation_param3_memref_size = 0; + operation_param3_memref_offset = 0; + operation_param3_value_a = 0; + operation_param3_value_b = 0; + operation_param3_ionref_ionsharefd = 0; + operation_param3_ionref_ionsize = 0; + + operation_param4_tmpref_buffer = 0; + operation_param4_tmpref_size = 0; + operation_param4_memref_parent = 0; + operation_param4_memref_parent_flag = 0; + operation_param4_memref_size = 0; + operation_param4_memref_offset = 0; + operation_param4_value_a = 0; + operation_param4_value_b = 0; + operation_param4_ionref_ionsharefd = 0; + operation_param4_ionref_ionsize = 0; + + operation_session = 0; + operation_cancelflag = 0; + + returnorigin = 0xff; + + buffer1_realsize = 0; + buffer1 = NULL; + buffer1_outsize = 0; + buffer2_realsize = 0; + buffer2 = NULL; + buffer2_outsize = 0; + buffer3_realsize = 0; + buffer3 = NULL; + buffer3_outsize = 0; + buffer4_realsize = 0; + buffer4 = NULL; + buffer4_outsize = 0; + } else + { //start of the input parameter operation success +#if 0 + operationIns.params[0].ionref.ion_share_fd = in_operation_param1_ionref_ionsharefd; + operationIns.params[0].ionref.ion_size = in_operation_param1_ionref_ionsize; + + operationIns.params[1].ionref.ion_share_fd = in_operation_param2_ionref_ionsharefd; + operationIns.params[1].ionref.ion_size = in_operation_param2_ionref_ionsize; + + operationIns.params[2].ionref.ion_share_fd = in_operation_param3_ionref_ionsharefd; + operationIns.params[2].ionref.ion_size = in_operation_param3_ionref_ionsize; + + operationIns.params[3].ionref.ion_share_fd = in_operation_param4_ionref_ionsharefd; + operationIns.params[3].ionref.ion_size = in_operation_param4_ionref_ionsize; +#endif + + operationIns.session = sessionIns; + operationIns.cancel_flag = in_operation_cancelflag; + + uint32_t origin; + origin = in_returnorigin; + + TEEC_Result result; + + struct timeval start, end; + gettimeofday(&start, NULL); + result = + TEEC_InvokeCommand( + sessionIns, + in_commandid, + &operationIns, + &origin + ); + gettimeofday(&end, NULL); + uint32_t cost = 0; + cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); + + if (result != TEEC_SUCCESS) + { + printf("Teec InvokeCommand Failed. \n"); + printf(" teecresult = 0x %8.8x.\n", result); + + teecresult = result; + + sessionid = 0; + serviceid_timelow = 0; + serviceid_timemid = 0; + serviceid_timehiandver = 0; + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode = NULL; + serviceid_clockseqandnode_outsize = 0; + opscnt = 0; + head_next = 0; + head_prev = 0; + context = 0; + + started = 0; + paramtypes = 0; + + operation_param1_tmpref_buffer = 0; + operation_param1_tmpref_size = 0; + operation_param1_memref_parent = 0; + operation_param1_memref_parent_flag = 0; + operation_param1_memref_size = 0; + operation_param1_memref_offset = 0; + operation_param1_value_a = 0; + operation_param1_value_b = 0; + operation_param1_ionref_ionsharefd = 0; + operation_param1_ionref_ionsize = 0; + + operation_param2_tmpref_buffer = 0; + operation_param2_tmpref_size = 0; + operation_param2_memref_parent = 0; + operation_param2_memref_parent_flag = 0; + operation_param2_memref_size = 0; + operation_param2_memref_offset = 0; + operation_param2_value_a = 0; + operation_param2_value_b = 0; + operation_param2_ionref_ionsharefd = 0; + operation_param2_ionref_ionsize = 0; + + operation_param3_tmpref_buffer = 0; + operation_param3_tmpref_size = 0; + operation_param3_memref_parent = 0; + operation_param3_memref_parent_flag = 0; + operation_param3_memref_size = 0; + operation_param3_memref_offset = 0; + operation_param3_value_a = 0; + operation_param3_value_b = 0; + operation_param3_ionref_ionsharefd = 0; + operation_param3_ionref_ionsize = 0; + + operation_param4_tmpref_buffer = 0; + operation_param4_tmpref_size = 0; + operation_param4_memref_parent = 0; + operation_param4_memref_parent_flag = 0; + operation_param4_memref_size = 0; + operation_param4_memref_offset = 0; + operation_param4_value_a = 0; + operation_param4_value_b = 0; + operation_param4_ionref_ionsharefd = 0; + operation_param4_ionref_ionsize = 0; + + operation_session = 0; + operation_cancelflag = 0; + + returnorigin = 0xff; + + buffer1_realsize = 0; + buffer1 = NULL; + buffer1_outsize = 0; + buffer2_realsize = 0; + buffer2 = NULL; + buffer2_outsize = 0; + buffer3_realsize = 0; + buffer3 = NULL; + buffer3_outsize = 0; + buffer4_realsize = 0; + buffer4 = NULL; + buffer4_outsize = 0; + } else + { // start of the invoke command success + printf("Teec InvokeCommand Succed, cost time: %ld us \n", cost); + + teecresult = result; + + sessionid = sessionIns->session_id; + serviceid_timelow = sessionIns->service_id.timeLow; + serviceid_timemid = sessionIns->service_id.timeMid; + serviceid_timehiandver = sessionIns->service_id.timeHiAndVersion; + if (sessionIns->service_id.clockSeqAndNode != NULL) + { + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (dbus_uint32_t *) malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + for (int iind = 0; iind < 8; iind++) + { + uint8_t u8Temp; + u8Temp = sessionIns->service_id.clockSeqAndNode[iind]; + serviceid_clockseqandnode[iind] = (dbus_uint32_t) u8Temp; + } + serviceid_clockseqandnode_outsize = 8; + } else + { + serviceid_clockseqandnode_realsize = 0; + serviceid_clockseqandnode = NULL; + serviceid_clockseqandnode_outsize = 0; + } + opscnt = sessionIns->ops_cnt; + head_next = (dbus_uint64_t) sessionIns->head.next; + head_prev = (dbus_uint64_t) sessionIns->head.prev; + context = (dbus_uint64_t) sessionIns->context; + + started = operationIns.started; + paramtypes = operationIns.paramTypes; + + ////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////// + + switch ( + TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 0) + ) + { + case TEEC_VALUE_INOUT: + case TEEC_VALUE_OUTPUT: + { + operation_param1_value_a = operationIns.params[0].value.a; + operation_param1_value_b = operationIns.params[0].value.b; + + buffer1_realsize = 0; + buffer1 = NULL; + buffer1_outsize = 0; + + break; + } + + case TEEC_MEMREF_TEMP_INOUT: + case TEEC_MEMREF_TEMP_OUTPUT: + { + if (operationIns.params[0].tmpref.buffer != NULL && + operationIns.params[0].tmpref.size > 0 + ) + { + buffer1_realsize = operationIns.params[0].tmpref.size; + buffer1 = + (dbus_uint32_t *) malloc( + buffer1_realsize * sizeof(dbus_uint32_t) + ); + for (int iind = 0; iind < buffer1_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * )(operationIns.params[0].tmpref.buffer) + iind); + buffer1[iind] = (dbus_uint32_t) u8Temp; + } + buffer1_outsize = buffer1_realsize; + } else + { + buffer1_realsize = 0; + buffer1 = NULL; + buffer1_outsize = 0; + } + + operation_param1_tmpref_buffer = (dbus_uint64_t) operationIns.params[0].tmpref.buffer; + operation_param1_tmpref_size = operationIns.params[0].tmpref.size; + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + switch (operationIns.params[0].memref.parent->flags) + { + case TEEC_MEM_OUTPUT: + case TEEC_MEM_INOUT: + { + + if (operationIns.params[0].memref.parent->buffer != NULL && + operationIns.params[0].memref.parent->size > 0 + ) + { + buffer1_realsize = operationIns.params[0].memref.parent->size; + buffer1 = + (dbus_uint32_t *) malloc( + buffer1_realsize * sizeof(dbus_uint32_t) + ); + for (int iind = 0; iind < buffer1_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * ) + (operationIns.params[0].memref.parent->buffer) + iind); + buffer1[iind] = (dbus_uint32_t) u8Temp; + } + buffer1_outsize = buffer1_realsize; + } else + { + buffer1_realsize = 0; + buffer1 = NULL; + buffer1_outsize = 0; + } + + operation_param1_memref_parent = + (dbus_uint64_t) operationIns.params[0].memref.parent->buffer; + operation_param1_memref_parent_flag = + (dbus_uint32_t) operationIns.params[0].memref.parent->flags; + operation_param1_memref_size = + operationIns.params[0].memref.parent->size; + + break; + } + + default: + break; + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operationIns.params[0].memref.parent->buffer != NULL && + operationIns.params[0].memref.parent->size > 0 + ) + { + buffer1_realsize = operationIns.params[0].memref.parent->size; + buffer1 = + (dbus_uint32_t *) malloc(buffer1_realsize * sizeof(dbus_uint32_t)); + for (int iind = 0; iind < buffer1_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * ) + (operationIns.params[0].memref.parent->buffer) + iind); + buffer1[iind] = (dbus_uint32_t) u8Temp; + } + buffer1_outsize = buffer1_realsize; + } else + { + buffer1_realsize = 0; + buffer1 = NULL; + buffer1_outsize = 0; + } + + operation_param1_memref_parent = + (dbus_uint64_t) operationIns.params[0].memref.parent->buffer; + operation_param1_memref_parent_flag = + (dbus_uint32_t) operationIns.params[0].memref.parent->flags; + operation_param1_memref_offset = operationIns.params[0].memref.offset; + operation_param1_memref_size = + operationIns.params[0].memref.size; + + break; + } + + + default: + { + buffer1_realsize = 0; + buffer1 = NULL; + buffer1_outsize = 0; + } + } + + operation_param1_ionref_ionsharefd = operationIns.params[0].ionref.ion_share_fd; + operation_param1_ionref_ionsize = operationIns.params[0].ionref.ion_size; + + ////////////////////////////////////////////////////////////////////////////////// + + switch ( + TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 1) + ) + { + case TEEC_VALUE_INOUT: + case TEEC_VALUE_OUTPUT: + { + operation_param2_value_a = operationIns.params[1].value.a; + operation_param2_value_b = operationIns.params[1].value.b; + + buffer2_realsize = 0; + buffer2 = NULL; + buffer2_outsize = 0; + + break; + } + + case TEEC_MEMREF_TEMP_INOUT: + case TEEC_MEMREF_TEMP_OUTPUT: + { + if (operationIns.params[1].tmpref.buffer != NULL && + operationIns.params[1].tmpref.size > 0 + ) + { + buffer2_realsize = operationIns.params[1].tmpref.size; + buffer2 = + (dbus_uint32_t *) malloc( + buffer2_realsize * sizeof(dbus_uint32_t) + ); + for (int iind = 0; iind < buffer2_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * )(operationIns.params[1].tmpref.buffer) + iind); + buffer2[iind] = (dbus_uint32_t) u8Temp; + } + buffer2_outsize = buffer2_realsize; + } else + { + buffer2_realsize = 0; + buffer2 = NULL; + buffer2_outsize = 0; + } + + operation_param2_tmpref_buffer = (dbus_uint64_t) operationIns.params[1].tmpref.buffer; + operation_param2_tmpref_size = operationIns.params[1].tmpref.size; + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + switch (operationIns.params[1].memref.parent->flags) + { + case TEEC_MEM_OUTPUT: + case TEEC_MEM_INOUT: + { + + if (operationIns.params[1].memref.parent->buffer != NULL && + operationIns.params[1].memref.parent->size > 0 + ) + { + buffer2_realsize = operationIns.params[1].memref.parent->size; + buffer2 = + (dbus_uint32_t *) malloc( + buffer2_realsize * sizeof(dbus_uint32_t) + ); + for (int iind = 0; iind < buffer2_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * ) + (operationIns.params[1].memref.parent->buffer) + iind); + buffer2[iind] = (dbus_uint32_t) u8Temp; + } + buffer2_outsize = buffer2_realsize; + } else + { + buffer2_realsize = 0; + buffer2 = NULL; + buffer2_outsize = 0; + } + + operation_param2_memref_parent = + (dbus_uint64_t) operationIns.params[1].memref.parent->buffer; + operation_param2_memref_parent_flag = + (dbus_uint32_t) operationIns.params[1].memref.parent->flags; + operation_param2_memref_size = + operationIns.params[1].memref.parent->size; + + break; + } + + default: + break; + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operationIns.params[1].memref.parent->buffer != NULL && + operationIns.params[1].memref.parent->size > 0 + ) + { + buffer2_realsize = operationIns.params[1].memref.parent->size; + buffer2 = + (dbus_uint32_t *) malloc(buffer2_realsize * sizeof(dbus_uint32_t)); + for (int iind = 0; iind < buffer2_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * ) + (operationIns.params[1].memref.parent->buffer) + iind); + buffer2[iind] = (dbus_uint32_t) u8Temp; + } + buffer2_outsize = buffer2_realsize; + } else + { + buffer2_realsize = 0; + buffer2 = NULL; + buffer2_outsize = 0; + } + + operation_param2_memref_parent = + (dbus_uint64_t) operationIns.params[1].memref.parent->buffer; + operation_param2_memref_parent_flag = + (dbus_uint32_t) operationIns.params[1].memref.parent->flags; + operation_param2_memref_offset = operationIns.params[1].memref.offset; + operation_param2_memref_size = + operationIns.params[1].memref.size; + + break; + } + + + default: + { + buffer2_realsize = 0; + buffer2 = NULL; + buffer2_outsize = 0; + } + } + + operation_param2_ionref_ionsharefd = operationIns.params[1].ionref.ion_share_fd; + operation_param2_ionref_ionsize = operationIns.params[1].ionref.ion_size; + + ////////////////////////////////////////////////////////////////////////////////// + + switch ( + TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 2) + ) + { + case TEEC_VALUE_INOUT: + case TEEC_VALUE_OUTPUT: + { + operation_param3_value_a = operationIns.params[2].value.a; + operation_param3_value_b = operationIns.params[2].value.b; + + buffer3_realsize = 0; + buffer3 = NULL; + buffer3_outsize = 0; + + break; + } + + case TEEC_MEMREF_TEMP_INOUT: + case TEEC_MEMREF_TEMP_OUTPUT: + { + if (operationIns.params[2].tmpref.buffer != NULL && + operationIns.params[2].tmpref.size > 0 + ) + { + buffer3_realsize = operationIns.params[2].tmpref.size; + buffer3 = + (dbus_uint32_t *) malloc( + buffer3_realsize * sizeof(dbus_uint32_t) + ); + for (int iind = 0; iind < buffer3_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * )(operationIns.params[2].tmpref.buffer) + iind); + buffer3[iind] = (dbus_uint32_t) u8Temp; + } + buffer3_outsize = buffer3_realsize; + } else + { + buffer3_realsize = 0; + buffer3 = NULL; + buffer3_outsize = 0; + } + + operation_param3_tmpref_buffer = (dbus_uint64_t) operationIns.params[2].tmpref.buffer; + operation_param3_tmpref_size = operationIns.params[2].tmpref.size; + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + switch (operationIns.params[2].memref.parent->flags) + { + case TEEC_MEM_OUTPUT: + case TEEC_MEM_INOUT: + { + + if (operationIns.params[2].memref.parent->buffer != NULL && + operationIns.params[2].memref.parent->size > 0 + ) + { + buffer3_realsize = operationIns.params[2].memref.parent->size; + buffer3 = + (dbus_uint32_t *) malloc( + buffer3_realsize * sizeof(dbus_uint32_t) + ); + for (int iind = 0; iind < buffer3_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * ) + (operationIns.params[2].memref.parent->buffer) + iind); + buffer3[iind] = (dbus_uint32_t) u8Temp; + } + buffer3_outsize = buffer3_realsize; + } else + { + buffer3_realsize = 0; + buffer3 = NULL; + buffer3_outsize = 0; + } + + operation_param3_memref_parent = + (dbus_uint64_t) operationIns.params[2].memref.parent->buffer; + operation_param3_memref_parent_flag = + (dbus_uint32_t) operationIns.params[2].memref.parent->flags; + operation_param3_memref_size = + operationIns.params[2].memref.parent->size; + + break; + } + + default: + break; + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operationIns.params[2].memref.parent->buffer != NULL && + operationIns.params[2].memref.parent->size > 0 + ) + { + buffer3_realsize = operationIns.params[2].memref.parent->size; + buffer3 = + (dbus_uint32_t *) malloc(buffer3_realsize * sizeof(dbus_uint32_t)); + for (int iind = 0; iind < buffer3_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * ) + (operationIns.params[2].memref.parent->buffer) + iind); + buffer3[iind] = (dbus_uint32_t) u8Temp; + } + buffer3_outsize = buffer3_realsize; + } else + { + buffer3_realsize = 0; + buffer3 = NULL; + buffer3_outsize = 0; + } + + operation_param3_memref_parent = + (dbus_uint64_t) operationIns.params[2].memref.parent->buffer; + operation_param3_memref_parent_flag = + (dbus_uint32_t) operationIns.params[2].memref.parent->flags; + operation_param3_memref_offset = operationIns.params[2].memref.offset; + operation_param3_memref_size = + operationIns.params[2].memref.size; + + break; + } + + + default: + { + buffer3_realsize = 0; + buffer3 = NULL; + buffer3_outsize = 0; + } + } + + operation_param3_ionref_ionsharefd = operationIns.params[2].ionref.ion_share_fd; + operation_param3_ionref_ionsize = operationIns.params[2].ionref.ion_size; + + ////////////////////////////////////////////////////////////////////////////////// + + switch ( + TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 3) + ) + { + case TEEC_VALUE_INOUT: + case TEEC_VALUE_OUTPUT: + { + operation_param4_value_a = operationIns.params[3].value.a; + operation_param4_value_b = operationIns.params[3].value.b; + + buffer4_realsize = 0; + buffer4 = NULL; + buffer4_outsize = 0; + + break; + } + + case TEEC_MEMREF_TEMP_INOUT: + case TEEC_MEMREF_TEMP_OUTPUT: + { + if (operationIns.params[3].tmpref.buffer != NULL && + operationIns.params[3].tmpref.size > 0 + ) + { + buffer4_realsize = operationIns.params[3].tmpref.size; + buffer4 = + (dbus_uint32_t *) malloc( + buffer4_realsize * sizeof(dbus_uint32_t) + ); + for (int iind = 0; iind < buffer4_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * )(operationIns.params[3].tmpref.buffer) + iind); + buffer4[iind] = (dbus_uint32_t) u8Temp; + } + buffer4_outsize = buffer4_realsize; + } else + { + buffer4_realsize = 0; + buffer4 = NULL; + buffer4_outsize = 0; + } + + operation_param4_tmpref_buffer = (dbus_uint64_t) operationIns.params[3].tmpref.buffer; + operation_param4_tmpref_size = operationIns.params[3].tmpref.size; + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + switch (operationIns.params[3].memref.parent->flags) + { + case TEEC_MEM_OUTPUT: + case TEEC_MEM_INOUT: + { + + if (operationIns.params[3].memref.parent->buffer != NULL && + operationIns.params[3].memref.parent->size > 0 + ) + { + buffer4_realsize = operationIns.params[3].memref.parent->size; + buffer4 = + (dbus_uint32_t *) malloc( + buffer4_realsize * sizeof(dbus_uint32_t) + ); + for (int iind = 0; iind < buffer4_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * ) + (operationIns.params[3].memref.parent->buffer) + iind); + buffer4[iind] = (dbus_uint32_t) u8Temp; + } + buffer4_outsize = buffer4_realsize; + } else + { + buffer4_realsize = 0; + buffer4 = NULL; + buffer4_outsize = 0; + } + + operation_param4_memref_parent = + (dbus_uint64_t) operationIns.params[3].memref.parent->buffer; + operation_param4_memref_parent_flag = + (dbus_uint32_t) operationIns.params[3].memref.parent->flags; + operation_param4_memref_size = + operationIns.params[3].memref.parent->size; + + break; + } + + default: + break; + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operationIns.params[3].memref.parent->buffer != NULL && + operationIns.params[3].memref.parent->size > 0 + ) + { + buffer4_realsize = operationIns.params[3].memref.parent->size; + buffer4 = + (dbus_uint32_t *) malloc(buffer4_realsize * sizeof(dbus_uint32_t)); + for (int iind = 0; iind < buffer4_realsize; iind++) + { + uint8_t u8Temp; + u8Temp = (uint8_t) * ((uint8_t * ) + (operationIns.params[3].memref.parent->buffer) + iind); + buffer4[iind] = (dbus_uint32_t) u8Temp; + } + buffer4_outsize = buffer4_realsize; + } else + { + buffer4_realsize = 0; + buffer4 = NULL; + buffer4_outsize = 0; + } + + operation_param4_memref_parent = + (dbus_uint64_t) operationIns.params[3].memref.parent->buffer; + operation_param4_memref_parent_flag = + (dbus_uint32_t) operationIns.params[3].memref.parent->flags; + operation_param4_memref_offset = operationIns.params[3].memref.offset; + operation_param4_memref_size = + operationIns.params[3].memref.size; + + break; + } + + + default: + { + buffer4_realsize = 0; + buffer4 = NULL; + buffer4_outsize = 0; + } + } + + operation_param4_ionref_ionsharefd = operationIns.params[3].ionref.ion_share_fd; + operation_param4_ionref_ionsize = operationIns.params[3].ionref.ion_size; + + ////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////// + + operation_session = (dbus_uint64_t) operationIns.session; + operation_cancelflag = operationIns.cancel_flag; + + returnorigin = origin; + } + + if (buffer1_temp != NULL) + { + free(buffer1_temp); + } + if (buffer2_temp != NULL) + { + free(buffer2_temp); + } + if (buffer3_temp != NULL) + { + free(buffer3_temp); + } + if (buffer4_temp != NULL) + { + free(buffer4_temp); + } + + if (sb1AllReged == true) + { + TEEC_ReleaseSharedMemory(&shareBuffer1); + printf("TEEC_ReleaseSharedMemory. \n"); + } + + if (sb2AllReged == true) + { + TEEC_ReleaseSharedMemory(&shareBuffer2); + printf("TEEC_ReleaseSharedMemory. \n"); + } + + if (sb3AllReged == true) + { + TEEC_ReleaseSharedMemory(&shareBuffer3); + printf("TEEC_ReleaseSharedMemory. \n"); + } + + if (sb4AllReged == true) + { + TEEC_ReleaseSharedMemory(&shareBuffer4); + printf("TEEC_ReleaseSharedMemory. \n"); + } + + } // end of the invoke command success + + } // end of the input parameter operation success + + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////// +#else + if (in_buffer1_size > 0) { + } + else + { + in_buffer1_realsize = 0; + } + if (in_buffer2_size > 0) { + } + else + { + in_buffer2_realsize = 0; + } + if (in_buffer3_size > 0) { + } + else + { + in_buffer3_realsize = 0; + } + if (in_buffer4_size > 0) { + } + else + { + in_buffer4_realsize = 0; + } + + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (dbus_uint32_t *)malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + uint32_t serviceid_clockseqandnode_outsize_temp; + uint32_t returnorigin_temp; + + uint32_t * buffer1_temp = NULL; + uint32_t buffer1_size = 4096; + uint32_t buffer1_outsize_temp; + buffer1_temp = + (uint32_t *)malloc( buffer1_size * sizeof(uint32_t) ); + + uint32_t buffer2_size = 4096; + uint32_t * buffer2_temp = NULL; + uint32_t buffer2_outsize_temp; + buffer2_temp = + (uint32_t *)malloc( buffer2_size * sizeof(uint32_t) ); + + uint32_t buffer3_size = 4096; + uint32_t * buffer3_temp = NULL; + uint32_t buffer3_outsize_temp; + buffer3_temp = + (uint32_t *)malloc( buffer3_size * sizeof(uint32_t) ); + + uint32_t buffer4_size = 4096; + uint32_t * buffer4_temp = NULL; + uint32_t buffer4_outsize_temp; + buffer4_temp = + (uint32_t *)malloc( buffer4_size * sizeof(uint32_t) ); + + char workername[1024]; + memset((char *)workername, 0, 1024); + int ifound = 0; + int iworker; + sin_t * sinIns; + + pthread_mutex_lock(mutex_workerrec); + for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) + { + if (workerrec[iworker].context_addr == in_session_context) + { + sinIns = NULL; + if (workerrec[iworker].first != NULL) + { + sinIns = workerrec[iworker].first; + do + { + if (sinIns->session_id == in_session_sessionid) + { + sprintf(workername, "%s%d", "gpworker", iworker); + ifound = 1; + break; + } + sinIns = sinIns->next; + }while (sinIns != NULL); + + if ( ifound == 1 ) + { + break; + } + } + } + } + pthread_mutex_unlock(mutex_workerrec); + + if (ifound == 0) + { + printf("Can't find the worker for the session and the context. \n"); + + teecresult = 0xAAAA0017; + + sessionid = 0x0; + serviceid_timelow = 0x0; + serviceid_timemid = 0x0; + serviceid_timehiandver = 0x0; + opscnt = 0x0; + head_next = 0x0; + head_prev = 0x0; + context = 0x0; + started = 0x0; + paramtypes = 0x0; + + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (dbus_uint32_t *)malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + for (int i = 0; i < serviceid_clockseqandnode_realsize ; i++) { + serviceid_clockseqandnode[i] = 0x0; + } + serviceid_clockseqandnode_outsize = 8; + + operation_param1_tmpref_buffer = 0x0; + operation_param1_tmpref_size = 0x0; + operation_param1_memref_parent = 0x0; + operation_param1_memref_size = 0x0; + operation_param1_memref_offset = 0x0; + operation_param1_value_a = 0x0; + operation_param1_value_b = 0x0; + operation_param1_ionref_ionsharefd = 0x0; + operation_param1_ionref_ionsize = 0x0; + + operation_param2_tmpref_buffer = 0x0; + operation_param2_tmpref_size = 0x0; + operation_param2_memref_parent = 0x0; + operation_param2_memref_size = 0x0; + operation_param2_memref_offset = 0x0; + operation_param2_value_a = 0x0; + operation_param2_value_b = 0x0; + operation_param2_ionref_ionsharefd = 0x0; + operation_param2_ionref_ionsize = 0x0; + + operation_param3_tmpref_buffer = 0x0; + operation_param3_tmpref_size = 0x0; + operation_param3_memref_parent = 0x0; + operation_param3_memref_size = 0x0; + operation_param3_memref_offset = 0x0; + operation_param3_value_a = 0x0; + operation_param3_value_b = 0x0; + operation_param3_ionref_ionsharefd = 0x0; + operation_param3_ionref_ionsize = 0x0; + + operation_param4_tmpref_buffer = 0x0; + operation_param4_tmpref_size = 0x0; + operation_param4_memref_parent = 0x0; + operation_param4_memref_size = 0x0; + operation_param4_memref_offset = 0x0; + operation_param4_value_a = 0x0; + operation_param4_value_b = 0x0; + operation_param4_ionref_ionsharefd = 0x0; + operation_param4_ionref_ionsize = 0x0; + + operation_session = 0x0; + operation_cancelflag = 0x0; + + returnorigin = 0x0; + + buffer1_realsize = 0; + buffer1_outsize = buffer1_realsize; + + buffer2_realsize = 0; + buffer2_outsize = buffer2_realsize; + + buffer3_realsize = 0; + buffer3_outsize = buffer3_realsize; + + buffer4_realsize = 0; + buffer4_outsize = buffer4_realsize; + } + else + { + method_call_teec_invokecommand( + workername, + + in_session_sessionid, + in_session_serviceid_timelow, + in_session_serviceid_timemid, + in_session_serviceid_timehiandver, + in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_realsize, + in_session_opscnt, + in_session_head_next, + in_session_head_prev, + in_session_context, + + in_commandid, + + in_operation_started, + in_operation_paramtypes, + + in_operation_param1_tmpref_buffer, + in_operation_param1_tmpref_size, + in_operation_param1_memref_parent, + in_operation_param1_memref_parent_flag, + in_operation_param1_memref_size, + in_operation_param1_memref_offset, + in_operation_param1_value_a, + in_operation_param1_value_b, + in_operation_param1_ionref_ionsharefd, + in_operation_param1_ionref_ionsize, + + in_operation_param2_tmpref_buffer, + in_operation_param2_tmpref_size, + in_operation_param2_memref_parent, + in_operation_param2_memref_parent_flag, + in_operation_param2_memref_size, + in_operation_param2_memref_offset, + in_operation_param2_value_a, + in_operation_param2_value_b, + in_operation_param2_ionref_ionsharefd, + in_operation_param2_ionref_ionsize, + + in_operation_param3_tmpref_buffer, + in_operation_param3_tmpref_size, + in_operation_param3_memref_parent, + in_operation_param3_memref_parent_flag, + in_operation_param3_memref_size, + in_operation_param3_memref_offset, + in_operation_param3_value_a, + in_operation_param3_value_b, + in_operation_param3_ionref_ionsharefd, + in_operation_param3_ionref_ionsize, + + in_operation_param4_tmpref_buffer, + in_operation_param4_tmpref_size, + in_operation_param4_memref_parent, + in_operation_param4_memref_parent_flag, + in_operation_param4_memref_size, + in_operation_param4_memref_offset, + in_operation_param4_value_a, + in_operation_param4_value_b, + in_operation_param4_ionref_ionsharefd, + in_operation_param4_ionref_ionsize, + + in_operation_session, + in_operation_cancelflag, + + in_returnorigin, + + in_buffer1, + in_buffer1_realsize, + in_buffer2, + in_buffer2_realsize, + in_buffer3, + in_buffer3_realsize, + in_buffer4, + in_buffer4_realsize, + + + &teecresult, + + &sessionid, + &serviceid_timelow, + &serviceid_timemid, + &serviceid_timehiandver, + serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize, + &serviceid_clockseqandnode_outsize_temp, + + &opscnt, + &head_next, + &head_prev, + &context, + + &started, + ¶mtypes, + + &operation_param1_tmpref_buffer, + &operation_param1_tmpref_size, + &operation_param1_memref_parent, + &operation_param1_memref_parent_flag, + &operation_param1_memref_size, + &operation_param1_memref_offset, + &operation_param1_value_a, + &operation_param1_value_b, + &operation_param1_ionref_ionsharefd, + &operation_param1_ionref_ionsize, + + &operation_param2_tmpref_buffer, + &operation_param2_tmpref_size, + &operation_param2_memref_parent, + &operation_param2_memref_parent_flag, + &operation_param2_memref_size, + &operation_param2_memref_offset, + &operation_param2_value_a, + &operation_param2_value_b, + &operation_param2_ionref_ionsharefd, + &operation_param2_ionref_ionsize, + + &operation_param3_tmpref_buffer, + &operation_param3_tmpref_size, + &operation_param3_memref_parent, + &operation_param3_memref_parent_flag, + &operation_param3_memref_size, + &operation_param3_memref_offset, + &operation_param3_value_a, + &operation_param3_value_b, + &operation_param3_ionref_ionsharefd, + &operation_param3_ionref_ionsize, + + &operation_param4_tmpref_buffer, + &operation_param4_tmpref_size, + &operation_param4_memref_parent, + &operation_param4_memref_parent_flag, + &operation_param4_memref_size, + &operation_param4_memref_offset, + &operation_param4_value_a, + &operation_param4_value_b, + &operation_param4_ionref_ionsharefd, + &operation_param4_ionref_ionsize, + + &operation_session, + &operation_cancelflag, + + &returnorigin_temp, + + buffer1_temp, + buffer1_size, + &buffer1_outsize_temp, + buffer2_temp, + buffer2_size, + &buffer2_outsize_temp, + buffer3_temp, + buffer3_size, + &buffer3_outsize_temp, + buffer4_temp, + buffer4_size, + &buffer4_outsize_temp + ); + + serviceid_clockseqandnode_outsize = + serviceid_clockseqandnode_outsize_temp; + + returnorigin = returnorigin_temp; + + buffer1_outsize = buffer1_outsize_temp; + buffer2_outsize = buffer2_outsize_temp; + buffer3_outsize = buffer3_outsize_temp; + buffer4_outsize = buffer4_outsize_temp; + + buffer1_realsize = buffer1_outsize; + if (buffer1_realsize > 0) + { + buffer1 = + (dbus_uint32_t *)malloc( + buffer1_realsize * sizeof(dbus_uint32_t) + ); + for (int i = 0; i < buffer1_realsize ; i++) { + buffer1[i] = (dbus_uint32_t)buffer1_temp[i]; + } + } + + buffer2_realsize = buffer2_outsize; + if (buffer2_realsize > 0) + { + buffer2 = + (dbus_uint32_t *)malloc( + buffer2_realsize * sizeof(dbus_uint32_t) + ); + for (int i = 0; i < buffer2_realsize ; i++) { + buffer2[i] = (dbus_uint32_t)buffer2_temp[i]; + } + } + + buffer3_realsize = buffer3_outsize; + if (buffer3_realsize > 0) + { + buffer3 = + (dbus_uint32_t *)malloc( + buffer3_realsize * sizeof(dbus_uint32_t) + ); + for (int i = 0; i < buffer3_realsize ; i++) { + buffer3[i] = (dbus_uint32_t)buffer3_temp[i]; + } + } + + buffer4_realsize = buffer4_outsize; + if (buffer4_realsize > 0) + { + buffer4 = + (dbus_uint32_t *)malloc( + buffer4_realsize * sizeof(dbus_uint32_t) + ); + for (int i = 0; i < buffer4_realsize ; i++) { + buffer4[i] = (dbus_uint32_t)buffer4_temp[i]; + } + } + + } // end of the else found == 1 + + if ( buffer1_temp != NULL ) + { + free(buffer1_temp); + } + if ( buffer2_temp != NULL ) + { + free(buffer2_temp); + } + if ( buffer3_temp != NULL ) + { + free(buffer3_temp); + } + if ( buffer4_temp != NULL ) + { + free(buffer4_temp); + } +#endif + /////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////// + + // create a reply from the message + reply = dbus_message_new_method_return(msg); + + + // add the arguments to the reply + dbus_message_iter_init_append(reply, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &teecresult + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &sessionid + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_timelow + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_timemid + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_timehiandver + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &serviceid_clockseqandnode_outsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (serviceid_clockseqandnode_outsize > 0 && + serviceid_clockseqandnode != NULL + ) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize + ); + + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return NULL; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &opscnt + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &head_next + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &head_prev + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &context + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &started + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + ¶mtypes + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param1_tmpref_buffer + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_tmpref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param1_memref_parent + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_memref_parent_flag + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_memref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_memref_offset + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_value_a + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_value_b + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &operation_param1_ionref_ionsharefd + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param1_ionref_ionsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param2_tmpref_buffer + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_tmpref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param2_memref_parent + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_memref_parent_flag + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_memref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_memref_offset + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_value_a + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_value_b + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &operation_param2_ionref_ionsharefd + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param2_ionref_ionsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param3_tmpref_buffer + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_tmpref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param3_memref_parent + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_memref_parent_flag + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_memref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_memref_offset + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_value_a + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_value_b + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &operation_param3_ionref_ionsharefd + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param3_ionref_ionsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param4_tmpref_buffer + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_tmpref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_param4_memref_parent + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_memref_parent_flag + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_memref_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_memref_offset + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_value_a + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_value_b + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &operation_param4_ionref_ionsharefd + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &operation_param4_ionref_ionsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &operation_session + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &operation_cancelflag + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &returnorigin + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &buffer1_outsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (buffer1_outsize > 0 && + buffer1 != NULL + ) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &buffer1, + buffer1_realsize + ); + + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return NULL; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &buffer2_outsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (buffer2_outsize > 0 && + buffer2 != NULL + ) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &buffer2, + buffer2_realsize + ); + + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return NULL; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &buffer3_outsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (buffer3_outsize > 0 && + buffer3 != NULL + ) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &buffer3, + buffer3_realsize + ); + + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return NULL; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &buffer4_outsize + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + if (buffer4_outsize > 0 && + buffer4 != NULL + ) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &buffer4, + buffer4_realsize + ); + + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return NULL; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + // send the reply && flush the connection + serial = 100; + if (!dbus_connection_send(conn, reply, &serial)) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + free(thdfargs); + return NULL; + } + + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + // dbus_connection_close(conn); + // dbus_connection_unref(conn); + free(thdfargs); + + // sleep(2); + + return NULL; +} + + +#ifdef GP_PROXY + void* +session_timeout_process ( + void* thdfargs +) +{ + DBusMsgConn* DBusMCP; + pthread_mutex_t * mutex_workerrec; + wr_t * workerrec; + + DBusMCP = (DBusMsgConn*)thdfargs; + mutex_workerrec = DBusMCP->mutex_workerrec; + workerrec = DBusMCP->workerrec; + + struct timeval tv; + uint64_t u64time; + + char workername[1024]; + memset((char *)workername, 0, 1024); + int iworker; + + dbus_uint32_t in_session_seesionid; + dbus_uint32_t in_session_serviceid_timelow = 0; + dbus_uint32_t in_session_serviceid_timemid = 0; + dbus_uint32_t in_session_serviceid_timehiandver = 0; + dbus_uint32_t in_session_serviceid_clockseqandnode_size = 8; + dbus_uint32_t in_session_serviceid_clockseqandnode[8]; + dbus_uint32_t in_session_opscnt = 0; + dbus_uint64_t in_session_head_next = 0; + dbus_uint64_t in_session_head_prev = 0; + dbus_uint64_t in_session_context; + + dbus_uint32_t seesionid; + dbus_uint32_t serviceid_timelow; + dbus_uint32_t serviceid_timemid; + dbus_uint32_t serviceid_timehiandver; + dbus_uint32_t * serviceid_clockseqandnode; + int serviceid_clockseqandnode_realsize; + dbus_uint32_t opscnt; + dbus_uint64_t head_next; + dbus_uint64_t head_prev; + dbus_uint64_t context; + + sin_t * sinIns; + + while (1) + { + sleep(TIMEDOUT_SESSION); + + pthread_mutex_lock(mutex_workerrec); + for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) + { + if (workerrec[iworker].busy == 1) + { + sinIns = NULL; + if (workerrec[iworker].first != NULL) + { + sinIns = workerrec[iworker].first; + do + { + gettimeofday(&tv, NULL); + u64time = (long unsigned int)(tv.tv_sec - + sinIns->session_createtime.tv_sec + ); + sin_t * sinTemp = NULL; + + if (u64time > TIMEDOUT_SESSION) + { + sprintf(workername, "%s%d", "gpworker", iworker); + + in_session_seesionid = sinIns->session_id; + in_session_context = workerrec[iworker].context_addr; + + for (int iind = 0; iind < 8; iind++) + { + in_session_serviceid_clockseqandnode[iind] = 0; + } + + pthread_mutex_unlock(mutex_workerrec); + + uint32_t serviceid_clockseqandnode_outsize_temp; + serviceid_clockseqandnode_realsize = 8; + serviceid_clockseqandnode = + (dbus_uint32_t *)malloc( + serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) + ); + + printf("\nMethod call teec closesession. (Called by Proxy for timeout process) \n"); + method_call_teec_closesession( + workername, + + in_session_seesionid, + in_session_serviceid_timelow, + in_session_serviceid_timemid, + in_session_serviceid_timehiandver, + in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_size, + in_session_opscnt, + in_session_head_next, + in_session_head_prev, + in_session_context, + + &seesionid, + &serviceid_timelow, + &serviceid_timemid, + &serviceid_timehiandver, + serviceid_clockseqandnode, + serviceid_clockseqandnode_realsize, + &serviceid_clockseqandnode_outsize_temp, + &opscnt, + &head_next, + &head_prev, + &context + ); + + if (serviceid_clockseqandnode != NULL) { + free(serviceid_clockseqandnode); + } + + pthread_mutex_lock(mutex_workerrec); + + sinTemp = sinIns->prev; + if (sinTemp != NULL) + { + sinTemp->next = sinIns->next; + } + sinTemp = sinIns->next; + if (sinTemp != NULL) + { + sinTemp->prev = sinIns->prev; + } + if (workerrec[iworker].last == sinIns) + { + workerrec[iworker].last = sinIns->prev; + } + if (workerrec[iworker].first == sinIns) + { + workerrec[iworker].first = sinIns->next; + } + + // free(sinIns); + sinTemp = sinIns; + workerrec[iworker].sessionid_count = + workerrec[iworker].sessionid_count - 1; + + } // end of if timedout + sinIns = sinIns->next; + if (sinTemp != NULL) + { + free(sinTemp); + } + }while (sinIns != NULL); + + + } // end of the first not null + } // end of the busy = 1 + } // end of the for iworker + pthread_mutex_unlock(mutex_workerrec); + + } // end of while 1 + + + free(thdfargs); + return NULL; +} + + +void* +context_timeout_process ( + void* thdfargs +) +{ + DBusMsgConn* DBusMCP; + pthread_mutex_t * mutex_workerrec; + pthread_cond_t * cond_notbusy; + wr_t * workerrec; + + DBusMCP = (DBusMsgConn*)thdfargs; + mutex_workerrec = DBusMCP->mutex_workerrec; + cond_notbusy = DBusMCP->cond_notbusy; + workerrec = DBusMCP->workerrec; + + + + struct timeval tv; + uint64_t u64time; + + char workername[1024]; + memset((char *)workername, 0, 1024); + int iworker; + + dbus_int32_t in_fd; + unsigned char * in_ta_path = NULL; + dbus_int32_t in_ta_path_size = 0; + dbus_uint64_t in_session_list_next = 0; + dbus_uint64_t in_session_list_prev = 0; + dbus_uint64_t in_shrd_mem_list_next = 0; + dbus_uint64_t in_shrd_mem_list_prev = 0; + dbus_uint64_t in_share_buffer_buffer = 0; + dbus_int64_t in_share_buffer_buffer_barrier = 0; + dbus_uint64_t in_context_addr; + + dbus_int32_t fd; + unsigned char * ta_path; + dbus_int32_t ta_path_size; + dbus_uint64_t session_list_next; + dbus_uint64_t session_list_prev; + dbus_uint64_t shrd_mem_list_next; + dbus_uint64_t shrd_mem_list_prev; + dbus_uint64_t share_buffer_buffer; + dbus_int64_t share_buffer_buffer_barrier; + uint32_t context_tapath_outsize; + + while(1) + { + sleep(TIMEDOUT_CONTEXT); + + pthread_mutex_lock(mutex_workerrec); + for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) + { + if (workerrec[iworker].busy == 1) + { + sprintf(workername, "%s%d", "gpworker", iworker); + gettimeofday(&tv, NULL); + u64time = (long unsigned int)(tv.tv_sec - + workerrec[iworker].context_createtime.tv_sec + ); + if (u64time > TIMEDOUT_CONTEXT + && + workerrec[iworker].sessionid_count == 0 + ) + { + in_fd = workerrec[iworker].context_fd; + in_context_addr = workerrec[iworker].context_addr; + ta_path = (unsigned char *)malloc(1024 * sizeof(char)); + ta_path_size = 1024; + memset((char *)ta_path, 0, 1024); + + pthread_mutex_unlock(mutex_workerrec); + + printf("\nMethod call teec fincont. (Called by Proxy for timeout process) \n"); + method_call_teec_fincont( + workername, + + in_fd, + in_ta_path, + in_ta_path_size, + in_session_list_next, + in_session_list_prev, + in_shrd_mem_list_next, + in_shrd_mem_list_prev, + in_share_buffer_buffer, + in_share_buffer_buffer_barrier, + in_context_addr, + + &fd, + ta_path, + ta_path_size, + &session_list_next, + &session_list_prev, + &shrd_mem_list_next, + &shrd_mem_list_prev, + &share_buffer_buffer, + &share_buffer_buffer_barrier, + + &context_tapath_outsize + ); + + if (ta_path != NULL) + { + free(ta_path); + } + + pthread_mutex_lock(mutex_workerrec); + + workerrec[iworker].busy = 0; + pthread_cond_signal(cond_notbusy); + workerrec[iworker].context_fd = 0; + workerrec[iworker].context_addr = 0xffffffff; + workerrec[iworker].sessionid_count = 0; + sin_t * sinIns; + sin_t * sinInsPrev; + sinIns = workerrec[iworker].last; + if (sinIns != NULL) + { + for ( ; ; ) + { + sinInsPrev = sinIns->prev; + free(sinIns); + sinIns = sinInsPrev; + if (sinIns == NULL) + { + break; + } + } + } + + } // end of the if timeed out + } // end of the if busy = 1 + } // end of the for iworker + pthread_mutex_unlock(mutex_workerrec); + + } // end of while 1 + + free(thdfargs); + return NULL; +} +#endif + + +void * +reply_to_method_call_destroy_threadpool( + DBusMessage *msg, + DBusConnection *conn, + threadpool_t *pool +#ifdef GP_WORKER + , + pthread_mutex_t *mutex_tcl, + pthread_mutex_t *mutex_tsl +#endif + +#ifdef GP_PROXY + , + pthread_mutex_t * mutex_workerrec, + pthread_cond_t * cond_notbusy +#endif +) +{ + DBusMessage *reply; + DBusMessageIter args; + // char* param = ""; + char *param = NULL; + dbus_bool_t bResult; + dbus_uint32_t retcode; + dbus_uint32_t serial = 0; + + // read the arguments + if (!dbus_message_iter_init(msg, &args)) + fprintf(stderr, "Message has no arguments!\n"); + else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) + fprintf(stderr, "Argument is not string!\n"); + else + dbus_message_iter_get_basic(&args, ¶m); + + printf("\n"); + printf("Received mechod call Destroy: \n"); + printf(" param = %s \n", param); + printf("\n"); + + // create a reply from the message + reply = dbus_message_new_method_return(msg); + + retcode = 0x00; + + // add the arguments to the reply + dbus_message_iter_init_append(reply, &args); + bResult = + dbus_message_iter_append_basic( + &args, + DBUS_TYPE_UINT32, + &retcode + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return NULL; + } + + serial = 100; + if (!dbus_connection_send(conn, reply, &serial)) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return NULL; + } + + dbus_message_unref(reply); + dbus_connection_flush(conn); + dbus_message_unref(msg); + // dbus_connection_close(conn); + // dbus_connection_unref(conn); + + + threadpool_destroy(pool); + +#ifdef GP_WORKER + pthread_mutex_destroy(mutex_tcl); + pthread_mutex_destroy(mutex_tsl); +#endif + +#ifdef GP_PROXY + pthread_mutex_destroy(mutex_workerrec); + pthread_cond_destroy(cond_notbusy); +#endif + + printf("\n"); + printf("This process exits. \n"); + printf("\n"); + + exit(1); + + return NULL; +} + +#endif diff --git a/cc-resource-pooling/teeproxy/gpworker/tzcp_dbus.h b/cc-resource-pooling/teeproxy/gpworker/tzcp_dbus.h new file mode 100644 index 0000000..d92f224 --- /dev/null +++ b/cc-resource-pooling/teeproxy/gpworker/tzcp_dbus.h @@ -0,0 +1,550 @@ +#ifndef _TZCP_DBUS_H_ +#define _TZCP_DBUS_H_ + +#include +#include + +#define GP_PROXY_WORKER 1 +// #define GP_PROXY 2 +#define GP_WORKER 3 + +#ifdef GP_PROXY_WORKER + +#include "threadpool.h" + +#define MAX_NUM_THREAD 128 +#define MAX_NUM_WORKER 128 +#define TIMEDOUT_SESSION 60 //seconds +#define TIMEDOUT_CONTEXT 90 //seconds + +#define TEEC_ERROR_CONTEXT_NULL 0xAAAA0001 /* null context */ +#define TEEC_ERROR_CONTEXT_TAPATH_NULL 0xAAAA0002 /* null context ta path */ +#define TEEC_ERROR_PARAM0_TEMPMEM_NULL 0xAAAA0003 /* null param0 tempmem buf */ +#define TEEC_ERROR_PARAM0_TEMPMEM_LESS 0xAAAA0004 /* param0 tempmem buf is less */ +#define TEEC_ERROR_PARAM1_TEMPMEM_NULL 0xAAAA0005 /* null param1 tempmem buf */ +#define TEEC_ERROR_PARAM1_TEMPMEM_LESS 0xAAAA0006 /* param1 tempmem buf is less */ +#define TEEC_ERROR_PARAM2_TEMPMEM_NULL 0xAAAA0007 /* null param2 tempmem buf */ +#define TEEC_ERROR_PARAM2_TEMPMEM_LESS 0xAAAA0008 /* param2 tempmem buf is less */ +#define TEEC_ERROR_PARAM3_TEMPMEM_NULL 0xAAAA0009 /* null param3 tempmem buf */ +#define TEEC_ERROR_PARAM3_TEMPMEM_LESS 0xAAAA000A /* param3 tempmem buf is less */ +#define TEEC_ERROR_CONTEXT_LIST_NULL 0xAAAA000B /* null context list in woker */ +#define TEEC_ERROR_NO_CONTEXT_MATCH 0xAAAA000C /* no context match in woker */ +#define TEEC_ERROR_SESSION_LIST_NULL 0xAAAA000D /* null session list in woker */ +#define TEEC_ERROR_NO_SESSION_MATCH 0xAAAA000E /* no session match in woker */ +#define TEEC_ERROR_PARAM0_MEMREF_NULL 0xAAAA000F /* null param0 memref buf */ +#define TEEC_ERROR_PARAM0_MEMREF_LESS 0xAAAA0010 /* param0 memref buf is less */ +#define TEEC_ERROR_PARAM1_MEMREF_NULL 0xAAAA0011 /* null param1 memref buf */ +#define TEEC_ERROR_PARAM1_MEMREF_LESS 0xAAAA0012 /* param1 memref buf is less */ +#define TEEC_ERROR_PARAM2_MEMREF_NULL 0xAAAA0013 /* null param2 memref buf */ +#define TEEC_ERROR_PARAM2_MEMREF_LESS 0xAAAA0014 /* param2 memref buf is less */ +#define TEEC_ERROR_PARAM3_MEMREF_NULL 0xAAAA0015 /* null param3 memref buf */ +#define TEEC_ERROR_PARAM3_MEMREF_LESS 0xAAAA0016 /* param3 memref buf is less */ +#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 /* No woker mateched with the context or/and session */ +#define TEEC_ERROR_SESSION_NULL 0xAAAA0018 /* null session */ +#define TEEC_ERROR_NO_SHAREMEMFLAG 0xAAAA0019 /* no share memmory flag */ + +#endif + + +#ifdef GP_PROXY_WORKER +typedef struct +{ + DBusMessage *msg; + DBusConnection *conn; +#ifdef GP_PROXY + pthread_mutex_t * mutex_workerrec; + pthread_cond_t * cond_notbusy; + wr_t * workerrec; +#endif +#ifdef GP_WORKER + int64_t workernum; + pthread_mutex_t *mutex_tcl; + pthread_mutex_t *mutex_tsl; + tcl_t *tcl; + tsl_t *tsl; +#endif +} DBusMsgConn; +#endif + +void +receive_signal(void); + +void +send_signal( + char *sigvalue +); + +#ifdef GP_PROXY_WORKER + +void +receive_methodcall( + threadpool_t *pool, +#ifdef GP_WORKER + pthread_mutex_t *mutex_tcl, + pthread_mutex_t *mutex_tsl, + tcl_t *tcl, + tsl_t *tsl, +#endif + char *workername + +#ifdef GP_PROXY + , + pthread_mutex_t * mutex_workerrec, + pthread_cond_t * cond_notbusy, + wr_t * workerrec +#endif +); + +#endif + +int32_t +method_call_teec_inicont( + const char *workername, + + const uint8_t *name, size_t name_size, + int32_t in_context_fd, + const uint8_t *in_context_tapath, size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + + uint32_t *teecresult, + int32_t *context_fd, + uint8_t *context_tapath, size_t context_tapath_insize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + uint64_t *context_addr, + uint32_t *context_tapath_outsize +); + +int32_t +method_call_teec_fincont( + const char *workername, + + int32_t in_context_fd, + const uint8_t *in_context_tapath, size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + uint64_t in_context_addr, + + int32_t *context_fd, + uint8_t *context_tapath, size_t context_tapath_insize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + uint32_t *context_tapath_outsize +); + +int32_t +method_call_teec_opensession( + const char *workername, + + int32_t in_context_fd, + const uint8_t *in_context_tapath, + size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + + uint32_t in_destination_timelow, + uint32_t in_destination_timemid, + uint32_t in_destination_timehiandver, + uint32_t *in_destination_clockseqandnode, + int32_t in_destination_clockseqandnode_size, + uint32_t in_connectionmethod, + uint64_t in_connectiondata, + uint32_t in_operation_started, + uint32_t in_operation_paramtypes, + + uint64_t in_operation_param1_tmpref_buffer, + uint32_t in_operation_param1_tmpref_size, + uint64_t in_operation_param1_memref_parent, + uint32_t in_operation_param1_memref_size, + uint32_t in_operation_param1_memref_offset, + uint32_t in_operation_param1_value_a, + uint32_t in_operation_param1_value_b, + int32_t in_operation_param1_ionref_ionsharefd, + uint32_t in_operation_param1_ionref_ionsize, + + uint64_t in_operation_param2_tmpref_buffer, + uint32_t in_operation_param2_tmpref_size, + uint64_t in_operation_param2_memref_parent, + uint32_t in_operation_param2_memref_size, + uint32_t in_operation_param2_memref_offset, + uint32_t in_operation_param2_value_a, + uint32_t in_operation_param2_value_b, + int32_t in_operation_param2_ionref_ionsharefd, + uint32_t in_operation_param2_ionref_ionsize, + + uint64_t in_operation_param3_tmpref_buffer, + uint32_t in_operation_param3_tmpref_size, + uint64_t in_operation_param3_memref_parent, + uint32_t in_operation_param3_memref_size, + uint32_t in_operation_param3_memref_offset, + uint32_t in_operation_param3_value_a, + uint32_t in_operation_param3_value_b, + int32_t in_operation_param3_ionref_ionsharefd, + uint32_t in_operation_param3_ionref_ionsize, + + uint64_t in_operation_param4_tmpref_buffer, + uint32_t in_operation_param4_tmpref_size, + uint64_t in_operation_param4_memref_parent, + uint32_t in_operation_param4_memref_size, + uint32_t in_operation_param4_memref_offset, + uint32_t in_operation_param4_value_a, + uint32_t in_operation_param4_value_b, + int32_t in_operation_param4_ionref_ionsharefd, + uint32_t in_operation_param4_ionref_ionsize, + + uint64_t in_operation_session, + int32_t in_operation_cancelflag, + + uint32_t in_returnorigin, + + uint64_t in_context_addr, + + + uint32_t *teecresult, + + int32_t *context_fd, + uint8_t *context_tapath, + size_t context_tapath_size, + uint32_t *context_tapath_outsize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + + uint32_t *session_seesionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context, + + uint32_t *operation_started, + uint32_t *operation_paramtypes, + + uint64_t *operation_param1_tmpref_buffer, + uint32_t *operation_param1_tmpref_size, + uint64_t *operation_param1_memref_parent, + uint32_t *operation_param1_memref_size, + uint32_t *operation_param1_memref_offset, + uint32_t *operation_param1_value_a, + uint32_t *operation_param1_value_b, + int32_t *operation_param1_ionref_ionsharefd, + uint32_t *operation_param1_ionref_ionsize, + + uint64_t *operation_param2_tmpref_buffer, + uint32_t *operation_param2_tmpref_size, + uint64_t *operation_param2_memref_parent, + uint32_t *operation_param2_memref_size, + uint32_t *operation_param2_memref_offset, + uint32_t *operation_param2_value_a, + uint32_t *operation_param2_value_b, + int32_t *operation_param2_ionref_ionsharefd, + uint32_t *operation_param2_ionref_ionsize, + + uint64_t *operation_param3_tmpref_buffer, + uint32_t *operation_param3_tmpref_size, + uint64_t *operation_param3_memref_parent, + uint32_t *operation_param3_memref_size, + uint32_t *operation_param3_memref_offset, + uint32_t *operation_param3_value_a, + uint32_t *operation_param3_value_b, + int32_t *operation_param3_ionref_ionsharefd, + uint32_t *operation_param3_ionref_ionsize, + + uint64_t *operation_param4_tmpref_buffer, + uint32_t *operation_param4_tmpref_size, + uint64_t *operation_param4_memref_parent, + uint32_t *operation_param4_memref_size, + uint32_t *operation_param4_memref_offset, + uint32_t *operation_param4_value_a, + uint32_t *operation_param4_value_b, + int32_t *operation_param4_ionref_ionsharefd, + uint32_t *operation_param4_ionref_ionsize, + + uint64_t *operation_session, + int32_t *operation_cancelflag, + + uint32_t *returnorigin +); + +int32_t +method_call_teec_closesession( + const char *workername, + + uint32_t in_session_seesionid, + uint32_t in_session_serviceid_timelow, + uint32_t in_session_serviceid_timemid, + uint32_t in_session_serviceid_timehiandver, + uint32_t *in_session_serviceid_clockseqandnode, + int32_t in_session_serviceid_clockseqandnode_size, + uint32_t in_session_opscnt, + uint64_t in_session_head_next, + uint64_t in_session_head_prev, + uint64_t in_session_context, + + uint32_t *session_seesionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context +); + +int32_t +method_call_teec_invokecommand( + const char *workername, + + uint32_t in_session_seesionid, + uint32_t in_session_serviceid_timelow, + uint32_t in_session_serviceid_timemid, + uint32_t in_session_serviceid_timehiandver, + uint32_t *in_session_serviceid_clockseqandnode, + uint32_t in_session_serviceid_clockseqandnode_size, + uint32_t in_session_opscnt, + uint64_t in_session_head_next, + uint64_t in_session_head_prev, + uint64_t in_session_context, + + uint32_t commandid, + + uint32_t in_operation_started, + uint32_t in_operation_paramtypes, + + uint64_t in_operation_param1_tmpref_buffer, + uint32_t in_operation_param1_tmpref_size, + uint64_t in_operation_param1_memref_parent, + uint32_t in_operation_param1_memref_parent_flag, + uint32_t in_operation_param1_memref_size, + uint32_t in_operation_param1_memref_offset, + uint32_t in_operation_param1_value_a, + uint32_t in_operation_param1_value_b, + int32_t in_operation_param1_ionref_ionsharefd, + uint32_t in_operation_param1_ionref_ionsize, + + uint64_t in_operation_param2_tmpref_buffer, + uint32_t in_operation_param2_tmpref_size, + uint64_t in_operation_param2_memref_parent, + uint32_t in_operation_param2_memref_parent_flag, + uint32_t in_operation_param2_memref_size, + uint32_t in_operation_param2_memref_offset, + uint32_t in_operation_param2_value_a, + uint32_t in_operation_param2_value_b, + int32_t in_operation_param2_ionref_ionsharefd, + uint32_t in_operation_param2_ionref_ionsize, + + uint64_t in_operation_param3_tmpref_buffer, + uint32_t in_operation_param3_tmpref_size, + uint64_t in_operation_param3_memref_parent, + uint32_t in_operation_param3_memref_parent_flag, + uint32_t in_operation_param3_memref_size, + uint32_t in_operation_param3_memref_offset, + uint32_t in_operation_param3_value_a, + uint32_t in_operation_param3_value_b, + int32_t in_operation_param3_ionref_ionsharefd, + uint32_t in_operation_param3_ionref_ionsize, + + uint64_t in_operation_param4_tmpref_buffer, + uint32_t in_operation_param4_tmpref_size, + uint64_t in_operation_param4_memref_parent, + uint32_t in_operation_param4_memref_parent_flag, + uint32_t in_operation_param4_memref_size, + uint32_t in_operation_param4_memref_offset, + uint32_t in_operation_param4_value_a, + uint32_t in_operation_param4_value_b, + int32_t in_operation_param4_ionref_ionsharefd, + uint32_t in_operation_param4_ionref_ionsize, + + uint64_t in_operation_session, + int32_t in_operation_cancelflag, + + uint32_t in_returnorigin, + + uint32_t *in_buffer1, + uint32_t in_buffer1_size, + uint32_t *in_buffer2, + uint32_t in_buffer2_size, + uint32_t *in_buffer3, + uint32_t in_buffer3_size, + uint32_t *in_buffer4, + uint32_t in_buffer4_size, + + + uint32_t *teecresult, + + uint32_t *session_seesionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context, + + uint32_t *operation_started, + uint32_t *operation_paramtypes, + + uint64_t *operation_param1_tmpref_buffer, + uint32_t *operation_param1_tmpref_size, + uint64_t *operation_param1_memref_parent, + uint32_t *operation_param1_memref_parent_flag, + uint32_t *operation_param1_memref_size, + uint32_t *operation_param1_memref_offset, + uint32_t *operation_param1_value_a, + uint32_t *operation_param1_value_b, + int32_t *operation_param1_ionref_ionsharefd, + uint32_t *operation_param1_ionref_ionsize, + + uint64_t *operation_param2_tmpref_buffer, + uint32_t *operation_param2_tmpref_size, + uint64_t *operation_param2_memref_parent, + uint32_t *operation_param2_memref_parent_flag, + uint32_t *operation_param2_memref_size, + uint32_t *operation_param2_memref_offset, + uint32_t *operation_param2_value_a, + uint32_t *operation_param2_value_b, + int32_t *operation_param2_ionref_ionsharefd, + uint32_t *operation_param2_ionref_ionsize, + + uint64_t *operation_param3_tmpref_buffer, + uint32_t *operation_param3_tmpref_size, + uint64_t *operation_param3_memref_parent, + uint32_t *operation_param3_memref_parent_flag, + uint32_t *operation_param3_memref_size, + uint32_t *operation_param3_memref_offset, + uint32_t *operation_param3_value_a, + uint32_t *operation_param3_value_b, + int32_t *operation_param3_ionref_ionsharefd, + uint32_t *operation_param3_ionref_ionsize, + + uint64_t *operation_param4_tmpref_buffer, + uint32_t *operation_param4_tmpref_size, + uint64_t *operation_param4_memref_parent, + uint32_t *operation_param4_memref_parent_flag, + uint32_t *operation_param4_memref_size, + uint32_t *operation_param4_memref_offset, + uint32_t *operation_param4_value_a, + uint32_t *operation_param4_value_b, + int32_t *operation_param4_ionref_ionsharefd, + uint32_t *operation_param4_ionref_ionsize, + + uint64_t *operation_session, + int32_t *operation_cancelflag, + + uint32_t *returnorigin, + + uint32_t *buffer1, + uint32_t buffer1_size, + uint32_t *buffer1_outsize, + uint32_t *buffer2, + uint32_t buffer2_size, + uint32_t *buffer2_outsize, + uint32_t *buffer3, + uint32_t buffer3_size, + uint32_t *buffer3_outsize, + uint32_t *buffer4, + uint32_t buffer4_size, + uint32_t *buffer4_outsize +); + +void +method_call_destroy_threadpool( + const char *workername +); + + +#ifdef GP_PROXY_WORKER + +void * +reply_to_method_call_teec_inicont( + void *thdfargs +); + +void * +reply_to_method_call_teec_fincont( + void *thdfargs +); + +void * +reply_to_method_call_teec_opensession( + void *thdfargs +); + +void * +reply_to_method_call_teec_closesession( + void *thdfargs +); + +void * +reply_to_method_call_teec_invokecommand( + void *thdfargs +); + +#ifdef GP_PROXY +void* +session_timeout_process ( + void* thdfargs +); + +void* +context_timeout_process ( + void* thdfargs +); +#endif + +void * +reply_to_method_call_destroy_threadpool( + DBusMessage *msg, + DBusConnection *conn, + threadpool_t *pool +#ifdef GP_WORKER + , + pthread_mutex_t *mutex_tcl, + pthread_mutex_t *mutex_tsl +#endif +#ifdef GP_PROXY + , + pthread_mutex_t * mutex_workerbusy, + pthread_cond_t * cond_notbusy +#endif +); + +#endif + + +#endif /* _TZCP_DBUS_H_ */ diff --git a/cc-resource-pooling/teeproxy/libdbuscgpw/CMakeLists.txt b/cc-resource-pooling/teeproxy/libdbuscgpw/CMakeLists.txt new file mode 100644 index 0000000..236a2ec --- /dev/null +++ b/cc-resource-pooling/teeproxy/libdbuscgpw/CMakeLists.txt @@ -0,0 +1,45 @@ +# + +cmake_minimum_required(VERSION 3.5.1) + +project(libdbusc_gpw C CXX) + +# set(CMAKE_C_FLAGS "${CMAKE_}") +# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) + +include_directories("${CMAKE_CURRENT_BINARY_DIR}") +# include_directories(${CMAKE_CURRENT_BINARY_DIR}/../include/) +include_directories(/usr/include/dbus-1.0/) +include_directories(/usr/lib64/dbus-1.0/include/) + +# Introduce variables: +# - CMAKE_INSTALL_LIBDIR +# - CMAKE_INSTALL_BINDIR +# - CMAKE_INSTALL_INCLUDEDIR +include(GNUInstallDirs) + +set(LIB_DBUSC_GPW + ${PROJECT_SOURCE_DIR}/dbusc_gpw.c +) +# Install Headers: +set(HEADERS_DBUSC_GPW + dbusc_gpw.h +) +install( + FILES ${HEADERS_DBUSC_GPW} + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${TARGET_NAME}" +) + +add_library(dbusc_gpw SHARED ${LIB_DBUSC_GPW}) +target_link_libraries(dbusc_gpw + libdbus-1.so +) +# set_target_properties(dbusc_gpw +# PROPERTIES IMPORTED_LOCATION +# ) + +# Install lib: +install( + TARGETS "dbusc_gpw" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" +) diff --git a/cc-resource-pooling/teeproxy/libdbuscgpw/build/cmake.sh b/cc-resource-pooling/teeproxy/libdbuscgpw/build/cmake.sh new file mode 100644 index 0000000..bef7b3e --- /dev/null +++ b/cc-resource-pooling/teeproxy/libdbuscgpw/build/cmake.sh @@ -0,0 +1 @@ +cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/cc-resource-pooling/teeproxy/libdbuscgpw/dbusc_gpw.c b/cc-resource-pooling/teeproxy/libdbuscgpw/dbusc_gpw.c new file mode 100644 index 0000000..1069929 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libdbuscgpw/dbusc_gpw.c @@ -0,0 +1,9291 @@ +/* + * Using low-level D-Bus C API code. + * Written by + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dbusc_gpw.h" + + +/** + * Listens for signals on the bus + */ +void +receive_signal(void) +{ + DBusMessage *msg; + DBusMessageIter args; + DBusConnection *conn; + DBusError err; + int ret; + char *sigvalue; + + printf("Listening for signals\n"); + + // initialise the errors + dbus_error_init(&err); + + // connect to the bus and check for errors + conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + exit(1); + } + + // request our name on the bus and check for errors + ret = dbus_bus_request_name(conn, "test.signal.sink", DBUS_NAME_FLAG_REPLACE_EXISTING, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + exit(1); + } + + // add a rule for which messages we want to see + dbus_bus_add_match(conn, "type='signal',interface='test.signal.Type'", &err); + // see signals from the given interface + dbus_connection_flush(conn); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Match Error (%s)\n", err.message); + exit(1); + } + // printf("Match rule sent\n"); + + // loop listening for signals being emmitted + while (true) + { + + // non blocking read of the next available message + dbus_connection_read_write(conn, 0); + msg = dbus_connection_pop_message(conn); + + // loop again if we haven't read a message + if (NULL == msg) + { + usleep(10000); + continue; + } + + // check if the message is a signal from the correct interface and with the correct name + if (dbus_message_is_signal(msg, "test.signal.Type", "Test")) + { + + // read the parameters + if (!dbus_message_iter_init(msg, &args)) + fprintf(stderr, "Message Has No Parameters\n"); + else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) + fprintf(stderr, "Argument is not string!\n"); + else + dbus_message_iter_get_basic(&args, &sigvalue); + + printf("Got Signal with value %s\n", sigvalue); + } + + // free the message + dbus_message_unref(msg); + } +} + + +/** + * Connect to the DBUS bus and send a broadcast signal + */ +void +send_signal( + char *sigvalue +) +{ + DBusMessage *msg; + DBusMessageIter args; + DBusConnection *conn; + DBusError err; + int ret; + dbus_uint32_t sigserial = 0; + + printf("Sending signal with value %s\n", sigvalue); + + // initialise the error value + dbus_error_init(&err); + + // connect to the DBUS system bus, and check for errors + conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + exit(1); + } + + // register our name on the bus, and check for errors + ret = dbus_bus_request_name(conn, "test.signal.source", DBUS_NAME_FLAG_REPLACE_EXISTING, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + exit(1); + } + + // create a signal & check for errors + msg = dbus_message_new_signal("/test/signal/Object", // object name of the signal + "test.signal.Type", // interface name of the signal + "Test"); // name of the signal + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + exit(1); + } + + // append arguments onto signal + dbus_message_iter_init_append(msg, &args); + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &sigvalue)) + { + fprintf(stderr, "Out Of Memory!\n"); + exit(1); + } + + // send the message and flush the connection + if (!dbus_connection_send(conn, msg, &sigserial)) + { + fprintf(stderr, "Out Of Memory!\n"); + exit(1); + } + dbus_connection_flush(conn); + + printf("Signal Sent\n"); + + // free the message + dbus_message_unref(msg); +} + + +/** + * Call a method on a remote object + */ +int32_t +method_call_teec_inicont( + const char *workername, + + const uint8_t *name, size_t name_size, + int32_t in_context_fd, + const uint8_t *in_context_tapath, size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + + uint32_t *teecresult, + int32_t *context_fd, + uint8_t *context_tapath, size_t context_tapath_insize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + uint64_t *context_addr, + uint32_t *context_tapath_outsize +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + DBusMessageIter structIter; + int ret; + int iType; + unsigned char *context_tapath_temp = NULL; + dbus_int32_t di32Temp; + dbus_uint32_t dui32Temp; + dbus_int64_t di64Temp; + dbus_uint64_t dui64Temp; + + // initialiset the errors + dbus_error_init(&err); + + dbus_threads_init_default(); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + // conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return -1; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return -1; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "TEEC_InitializeContext" // method name + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return -1; + } + + // append arguments + dbus_message_iter_init_append(msg, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + di32Temp = name_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (name_size > 0 && name != NULL) + { + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &name + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + } + + di32Temp = in_context_fd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_context_tapath_size > 0 && + in_context_tapath != NULL && + strlen((const char *) in_context_tapath) > 0 + ) + { + if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) + { + di32Temp = strlen((const char *) in_context_tapath); + } else + { + di32Temp = 0; + } + } else + { + di32Temp = 0; + } + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + // if (in_context_tapath_size > 0 && in_context_tapath != NULL) + if (di32Temp > 0) + { + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &in_context_tapath + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + } + + dui64Temp = in_context_sessionlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sessionlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sharebuffer_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di64Temp = in_context_sharebuffer_bufferbarrier; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT64, + &di64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + /* + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_connection_flush(conn); + dbus_message_unref(msg); + + printf("\n"); + printf("Method Call Teec Init Contex Sent. \n"); + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + return -1; + } + // free the pending message handle + dbus_pending_call_unref(pending); + */ + + // printf("\n"); + printf("libdbuscgpw method call teec init contex sent. \n"); + + DBusMessage *reply; + reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "libdbuscgpw: initcontext send_with_reply_and_block error, %s \n", err.message); + dbus_error_free(&err); + + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return -1; + } + if (reply == NULL) + { + fprintf(stderr, "libdbuscgpw: initcontext dbus reply error \n"); + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return -1; + } + + dbus_message_unref(msg); + dbus_connection_flush(conn); + msg = reply; + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *teecresult = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *context_fd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *context_tapath_outsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + if (*context_tapath_outsize > 0) + { + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_STRING + ) + { + fprintf(stderr, "Argument is not STRING.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &context_tapath_temp); + + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sharebuffer_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT64 + ) + { + fprintf(stderr, "Argument is not INT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di64Temp + ); + *context_sharebuffer_bufferbarrier = di64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_addr = dui64Temp; + + printf("libdbuscgpw got reply of method call teec init contex: \n"); + printf(" teecresult = 0x %8.8x \n", *teecresult); + printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); + printf(" ta_path = %s \n", context_tapath_temp); + printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); +#if 0 + printf(" TEEC_Context session_list.next = 0x %16.16lx \n", + *context_sessionlist_next + ); + printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", + *context_sessionlist_prev + ); + printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", + *context_shrdmemlist_next + ); + printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", + *context_shrdmemlist_prev + ); + printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", + *context_sharebuffer_buffer + ); + printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", + (long unsigned int)*context_sharebuffer_bufferbarrier + ); +#endif + printf(" context addr = 0x %16.16lx \n", + (long unsigned int) *context_addr + ); + + if ( + context_tapath_insize > *context_tapath_outsize && + *context_tapath_outsize > 0 && + context_tapath != NULL && + context_tapath_temp != NULL + ) + { + memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); + *(context_tapath + *context_tapath_outsize) = 0; + } else + { + // dbus_message_unref(msg); + // return -1; + *(context_tapath + 0) = 0; + } + + // free msg + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return 0; +} + + +/** + * Call a method on a remote object + */ +int32_t +method_call_teec_fincont( + const char *workername, + + int32_t in_context_fd, + const uint8_t *in_context_tapath, size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + uint64_t in_context_addr, + + int32_t *context_fd, + uint8_t *context_tapath, size_t context_tapath_insize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + uint32_t *context_tapath_outsize +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + DBusMessageIter structIter; + int ret; + int iType; + unsigned char *context_tapath_temp = NULL; + dbus_int32_t di32Temp; + dbus_uint32_t dui32Temp; + dbus_int64_t di64Temp; + dbus_uint64_t dui64Temp; + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return -1; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return -1; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "TEEC_FinalizeContext" + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return -1; + } + + // append arguments + dbus_message_iter_init_append(msg, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + di32Temp = in_context_fd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_context_tapath_size > 0 && + in_context_tapath != NULL && + strlen((const char *) in_context_tapath) > 0 + ) + { + // if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) + if (dbus_validate_path((const char *) in_context_tapath, &err) == true) + { + di32Temp = strlen((const char *) in_context_tapath); + } else + { + di32Temp = 0; + } + } else + { + di32Temp = 0; + } + + fprintf(stderr, "libdbuscgpw finalizecontext, in_context_tapath_size, di32Temp = %ld \n", di32Temp); + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + // if (in_context_tapath_size > 0 && in_context_tapath != NULL) + if (di32Temp > 0) + { + fprintf(stderr, "libdbuscgpw finalizecontext, in_context_tapath = %s \n", in_context_tapath); + + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &in_context_tapath + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + } + + dui64Temp = in_context_sessionlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sessionlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sharebuffer_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di64Temp = in_context_sharebuffer_bufferbarrier; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT64, + &di64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_addr; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + + /* + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_connection_flush(conn); + dbus_message_unref(msg); + + // printf("\n"); + printf("libdbuscgpw method call teec fin contex sent. \n"); + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + return -1; + } + // free the pending message handle + dbus_pending_call_unref(pending); + */ + + + // printf("\n"); + printf("libdbuscgpw method call teec fin contex sent. \n"); + + dbus_error_init(&err); + DBusMessage *reply; + reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "libdbuscgpw: finalizecontext send_with_reply_and_block error, %s \n", err.message); + dbus_error_free(&err); + + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return -1; + } + if (reply == NULL) + { + fprintf(stderr, "libdbuscgpw: finalizecontext dbus reply error \n"); + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return -1; + } + + dbus_message_unref(msg); + dbus_connection_flush(conn); + msg = reply; + + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *context_fd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *context_tapath_outsize = dui32Temp; + + if (*context_tapath_outsize > 0) + { + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_STRING + ) + { + fprintf(stderr, "Argument is not STRING.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &context_tapath_temp); + + } + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sharebuffer_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT64 + ) + { + fprintf(stderr, "Argument is not INT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di64Temp + ); + *context_sharebuffer_bufferbarrier = di64Temp; + + printf("libdbuscgpw got reply of method call teec fin contex: \n"); + printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); + printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); + if ((int) *context_tapath_outsize > 0 && context_tapath_temp != NULL && + dbus_validate_path((const char *) context_tapath_temp, &err) == true) + { + printf(" ta_path = %s \n", context_tapath_temp); + } +#if 0 + printf(" TEEC_Context session_list.next = 0x %16.16lx \n", + *context_sessionlist_next + ); + printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", + *context_sessionlist_prev + ); + printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", + *context_shrdmemlist_next + ); + printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", + *context_shrdmemlist_prev + ); + printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", + *context_sharebuffer_buffer + ); + printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", + (long unsigned int)*context_sharebuffer_bufferbarrier + ); +#endif + + if ( + context_tapath_insize > *context_tapath_outsize && + *context_tapath_outsize > 0 && + context_tapath != NULL && + context_tapath_temp != NULL + ) + { + memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); + *(context_tapath + *context_tapath_outsize) = 0; + } else + { + // dbus_message_unref(msg); + // return -1; + *(context_tapath + 0) = 0; + } + + // free msg + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return 0; +} + + +/** + * Call a method on a remote object + */ +int32_t +method_call_teec_opensession( + const char *workername, + + int32_t in_context_fd, + const uint8_t *in_context_tapath, + size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + + uint32_t in_destination_timelow, + uint32_t in_destination_timemid, + uint32_t in_destination_timehiandver, + uint32_t *in_destination_clockseqandnode, + int32_t in_destination_clockseqandnode_size, + + uint32_t in_connectionmethod, + uint64_t in_connectiondata, + + uint32_t in_operation_started, + uint32_t in_operation_paramtypes, + + uint64_t in_operation_param1_tmpref_buffer, + uint32_t in_operation_param1_tmpref_size, + uint64_t in_operation_param1_memref_parent, + uint32_t in_operation_param1_memref_size, + uint32_t in_operation_param1_memref_offset, + uint32_t in_operation_param1_value_a, + uint32_t in_operation_param1_value_b, + int32_t in_operation_param1_ionref_ionsharefd, + uint32_t in_operation_param1_ionref_ionsize, + + uint64_t in_operation_param2_tmpref_buffer, + uint32_t in_operation_param2_tmpref_size, + uint64_t in_operation_param2_memref_parent, + uint32_t in_operation_param2_memref_size, + uint32_t in_operation_param2_memref_offset, + uint32_t in_operation_param2_value_a, + uint32_t in_operation_param2_value_b, + int32_t in_operation_param2_ionref_ionsharefd, + uint32_t in_operation_param2_ionref_ionsize, + + uint64_t in_operation_param3_tmpref_buffer, + uint32_t in_operation_param3_tmpref_size, + uint64_t in_operation_param3_memref_parent, + uint32_t in_operation_param3_memref_size, + uint32_t in_operation_param3_memref_offset, + uint32_t in_operation_param3_value_a, + uint32_t in_operation_param3_value_b, + int32_t in_operation_param3_ionref_ionsharefd, + uint32_t in_operation_param3_ionref_ionsize, + + uint64_t in_operation_param4_tmpref_buffer, + uint32_t in_operation_param4_tmpref_size, + uint64_t in_operation_param4_memref_parent, + uint32_t in_operation_param4_memref_size, + uint32_t in_operation_param4_memref_offset, + uint32_t in_operation_param4_value_a, + uint32_t in_operation_param4_value_b, + int32_t in_operation_param4_ionref_ionsharefd, + uint32_t in_operation_param4_ionref_ionsize, + + uint64_t in_operation_session, + int32_t in_operation_cancelflag, + + uint32_t in_returnorigin, + + uint64_t in_context_addr, + + + uint32_t *teecresult, + + int32_t *context_fd, + uint8_t *context_tapath, + size_t context_tapath_size, + uint32_t *context_tapath_outsize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + + uint32_t *session_seesionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context, + + uint32_t *operation_started, + uint32_t *operation_paramtypes, + + uint64_t *operation_param1_tmpref_buffer, + uint32_t *operation_param1_tmpref_size, + uint64_t *operation_param1_memref_parent, + uint32_t *operation_param1_memref_size, + uint32_t *operation_param1_memref_offset, + uint32_t *operation_param1_value_a, + uint32_t *operation_param1_value_b, + int32_t *operation_param1_ionref_ionsharefd, + uint32_t *operation_param1_ionref_ionsize, + + uint64_t *operation_param2_tmpref_buffer, + uint32_t *operation_param2_tmpref_size, + uint64_t *operation_param2_memref_parent, + uint32_t *operation_param2_memref_size, + uint32_t *operation_param2_memref_offset, + uint32_t *operation_param2_value_a, + uint32_t *operation_param2_value_b, + int32_t *operation_param2_ionref_ionsharefd, + uint32_t *operation_param2_ionref_ionsize, + + uint64_t *operation_param3_tmpref_buffer, + uint32_t *operation_param3_tmpref_size, + uint64_t *operation_param3_memref_parent, + uint32_t *operation_param3_memref_size, + uint32_t *operation_param3_memref_offset, + uint32_t *operation_param3_value_a, + uint32_t *operation_param3_value_b, + int32_t *operation_param3_ionref_ionsharefd, + uint32_t *operation_param3_ionref_ionsize, + + uint64_t *operation_param4_tmpref_buffer, + uint32_t *operation_param4_tmpref_size, + uint64_t *operation_param4_memref_parent, + uint32_t *operation_param4_memref_size, + uint32_t *operation_param4_memref_offset, + uint32_t *operation_param4_value_a, + uint32_t *operation_param4_value_b, + int32_t *operation_param4_ionref_ionsharefd, + uint32_t *operation_param4_ionref_ionsize, + + uint64_t *operation_session, + int32_t *operation_cancelflag, + + uint32_t *returnorigin +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + DBusMessageIter structIter; + DBusMessageIter ArrayIter; + int ret; + int iType; + unsigned char *context_tapath_temp = NULL; + dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; + int session_serviceid_clockseqandnode_realsize; + dbus_int32_t di32Temp; + dbus_uint32_t dui32Temp; + dbus_int64_t di64Temp; + dbus_uint64_t dui64Temp; + char buf[2]; + buf[0] = DBUS_TYPE_UINT32; + buf[1] = '\0'; + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return -1; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return -1; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "TEEC_OpenSession" + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return -1; + } + + // append arguments + dbus_message_iter_init_append(msg, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + di32Temp = in_context_fd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_context_tapath_size > 0 && + in_context_tapath != NULL && + strlen((const char *) in_context_tapath) > 0 + ) + { + if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) + { + di32Temp = strlen((const char *) in_context_tapath); + } else + { + di32Temp = 0; + } + } else + { + di32Temp = 0; + } + + // fprintf(stderr, "in_context_tapath_size = %ld \n", in_context_tapath_size); + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + // if (in_context_tapath_size > 0 && in_context_tapath != NULL) + if (di32Temp > 0) + { + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_STRING, + &in_context_tapath + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + } + + dui64Temp = in_context_sessionlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sessionlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_shrdmemlist_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_sharebuffer_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di64Temp = in_context_sharebuffer_bufferbarrier; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT64, + &di64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_destination_timelow; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_destination_timemid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_destination_timehiandver; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_destination_clockseqandnode_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_destination_clockseqandnode_size > 0 && + in_destination_clockseqandnode != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_destination_clockseqandnode, + in_destination_clockseqandnode_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_connectionmethod; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_connectiondata; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + + dui32Temp = in_operation_started; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_paramtypes; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param1_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param1_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param1_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param2_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param2_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param2_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param3_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param3_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param3_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param4_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param4_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param4_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_session; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_cancelflag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_returnorigin; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_context_addr; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + /////////////////////////////////////////////////////////////////// + + /* + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_connection_flush(conn); + dbus_message_unref(msg); + + printf("\n"); + printf("Method Call Teec Open Session Sent. \n"); + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + return -1; + } + + // free the pending message handle + dbus_pending_call_unref(pending); + */ + + // printf("\n"); + printf("libdbuscgpw method call teec open session sent. \n"); + + DBusMessage *reply; + reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "libdbuscgpw: opensession send_with_reply_and_block error, %s \n", err.message); + dbus_error_free(&err); + + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return -1; + } + if (reply == NULL) + { + fprintf(stderr, "libdbuscgpw: opensession dbus reply error \n"); + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return -1; + } + + dbus_message_unref(msg); + dbus_connection_flush(conn); + msg = reply; + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *teecresult = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *context_fd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *context_tapath_outsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + if (*context_tapath_outsize > 0) + { + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_STRING + ) + { + fprintf(stderr, "Argument is not STRING.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &context_tapath_temp); + + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sessionlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_shrdmemlist_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *context_sharebuffer_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT64 + ) + { + fprintf(stderr, "Argument is not INT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di64Temp + ); + *context_sharebuffer_bufferbarrier = di64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_seesionid = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timelow = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timemid = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timehiandver = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_clockseqandnode_outsize = dui32Temp; + + if (*session_serviceid_clockseqandnode_outsize > 0) + { + bResult = + dbus_message_iter_next( + &structIter + ); + + dbus_message_iter_recurse( + &structIter, + &ArrayIter); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &session_serviceid_clockseqandnode_temp, + &session_serviceid_clockseqandnode_realsize + ); + } + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_opscnt = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_context = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_started = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_paramtypes = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param1_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param1_memref_parent = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param1_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param2_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param2_memref_parent = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param2_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param3_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param3_memref_parent = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param3_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param4_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param4_memref_parent = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param4_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_session = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_cancelflag = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *returnorigin = dui32Temp; + + printf("libdbuscgpw got reply of method call teec open session: \n"); + printf(" teecresult = 0x %8.8x \n", *teecresult); + printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); + printf(" ta_path = %s \n", context_tapath_temp); + printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); + printf(" session_seesionid = 0x %8.8x \n", + *session_seesionid + ); +#if 0 + printf(" TEEC_Context session_list.next = 0x %16.16lx \n", + *context_sessionlist_next + ); + printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", + *context_sessionlist_prev + ); + printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", + *context_shrdmemlist_next + ); + printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", + *context_shrdmemlist_prev + ); + printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", + *context_sharebuffer_buffer + ); + printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", + (long unsigned int)*context_sharebuffer_bufferbarrier + ); + + printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", + *session_serviceid_timelow + ); + printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", + *session_serviceid_timehiandver + ); + + printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); + if (*session_serviceid_clockseqandnode_outsize > 0 && + session_serviceid_clockseqandnode_temp != NULL) + { + printf(" "); + for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { + printf(" %2.2x", + session_serviceid_clockseqandnode_temp[i] + ); + } + printf("\n"); + } + printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", + *session_serviceid_clockseqandnode_outsize + ); + + printf(" TEEC_Session session_opscnt = 0x %8.8x \n", + *session_opscnt + ); + printf(" TEEC_Session session_head_next = 0x %16.16lx \n", + *session_head_next + ); + printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", + *session_head_prev + ); + printf(" TEEC_Session session_context = 0x %16.16lx \n", + *session_context + ); + printf(" TEEC_Session operation_started = 0x %8.8x \n", + *operation_started + ); + printf(" TEEC_Session operation_paramtypes = 0x %8.8x \n", + *operation_paramtypes + ); + + printf(" TEEC_Session operation_param1_tmpref_buffer = 0x %16.16lx \n", + *operation_param1_tmpref_buffer + ); + printf(" TEEC_Session operation_param1_tmpref_size = 0x %8.8x \n", + *operation_param1_tmpref_size + ); + printf(" TEEC_Session operation_param1_memref_parent = 0x %16.16lx \n", + *operation_param1_memref_parent + ); + printf(" TEEC_Session operation_param1_memref_size = 0x %8.8x \n", + *operation_param1_memref_size + ); + printf(" TEEC_Session operation_param1_memref_offse = 0x %8.8x \n", + *operation_param1_memref_offset + ); + printf(" TEEC_Session operation_param1_value_a = 0x %8.8x \n", + *operation_param1_value_a + ); + printf(" TEEC_Session operation_param1_value_b = 0x %8.8x \n", + *operation_param1_value_b + ); + printf(" TEEC_Session operation_param1_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param1_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param1_ionref_ionsize = 0x %8.8x \n", + *operation_param1_ionref_ionsize + ); + + printf(" TEEC_Session operation_param2_tmpref_buffer = 0x %16.16lx \n", + *operation_param2_tmpref_buffer + ); + printf(" TEEC_Session operation_param2_tmpref_size = 0x %8.8x \n", + *operation_param2_tmpref_size + ); + printf(" TEEC_Session operation_param2_memref_parent = 0x %16.16lx \n", + *operation_param2_memref_parent + ); + printf(" TEEC_Session operation_param2_memref_size = 0x %8.8x \n", + *operation_param2_memref_size + ); + printf(" TEEC_Session operation_param2_memref_offset = 0x %8.8x \n", + *operation_param2_memref_offset + ); + printf(" TEEC_Session operation_param2_value_a = 0x %8.8x \n", + *operation_param2_value_a + ); + printf(" TEEC_Session operation_param2_value_b = 0x %8.8x \n", + *operation_param2_value_b + ); + printf(" TEEC_Session operation_param2_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param2_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param2_ionref_ionsize = 0x %8.8x \n", + *operation_param2_ionref_ionsize + ); + + printf(" TEEC_Session operation_param3_tmpref_buffer = 0x %16.16lx \n", + *operation_param3_tmpref_buffer + ); + printf(" TEEC_Session operation_param3_tmpref_size = 0x %8.8x \n", + *operation_param3_tmpref_size + ); + printf(" TEEC_Session operation_param3_memref_parent = 0x %16.16lx \n", + *operation_param3_memref_parent + ); + printf(" TEEC_Session operation_param3_memref_size = 0x %8.8x \n", + *operation_param3_memref_size + ); + printf(" TEEC_Session operation_param3_memref_offset = 0x %8.8x \n", + *operation_param3_memref_offset + ); + printf(" TEEC_Session operation_param3_value_a = 0x %8.8x \n", + *operation_param3_value_a + ); + printf(" TEEC_Session operation_param3_value_b = 0x %8.8x \n", + *operation_param3_value_b + ); + printf(" TEEC_Session operation_param3_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param3_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param3_ionref_ionsize = 0x %8.8x \n", + *operation_param3_ionref_ionsize + ); + + printf(" TEEC_Session operation_param4_tmpref_buffer = 0x %16.16lx \n", + *operation_param4_tmpref_buffer + ); + printf(" TEEC_Session operation_param4_tmpref_size = 0x %8.8x \n", + *operation_param4_tmpref_size + ); + printf(" TEEC_Session operation_param4_memref_parent = 0x %16.16lx \n", + *operation_param4_memref_parent + ); + printf(" TEEC_Session operation_param4_memref_size = 0x %8.8x \n", + *operation_param4_memref_size + ); + printf(" TEEC_Session operation_param4_memref_offset = 0x %8.8x \n", + *operation_param4_memref_offset + ); + printf(" TEEC_Session operation_param4_value_a = 0x %8.8x \n", + *operation_param4_value_a + ); + printf(" TEEC_Session operation_param4_value_b = 0x %8.8x \n", + *operation_param4_value_b + ); + printf(" TEEC_Session operation_param4_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param4_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param4_ionref_ionsize = 0x %8.8x \n", + *operation_param4_ionref_ionsize + ); + + printf(" TEEC_Session operation_session = 0x %16.16lx \n", + *operation_session + ); + printf(" TEEC_Session operation_cancelflag = 0x %8.8x \n", + (unsigned int)*operation_cancelflag + ); + printf(" TEEC_Session returnorigin = 0x %8.8x \n", + *returnorigin + ); +#endif + + if (context_tapath_size > *context_tapath_outsize) + { + memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); + *(context_tapath + *context_tapath_outsize) = 0; + } else + { + dbus_message_unref(msg); + return -1; + } + + if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && + session_serviceid_clockseqandnode_temp != NULL && + session_serviceid_clockseqandnode_realsize > 0 + ) + { + /* + memcpy( + session_serviceid_clockseqandnode, + session_serviceid_clockseqandnode_temp, + session_serviceid_clockseqandnode_realsize + ); + */ + for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) + { + session_serviceid_clockseqandnode[i] = + session_serviceid_clockseqandnode_temp[i]; + + } + *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *session_serviceid_clockseqandnode_outsize = 0; + } + + // free msg + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return 0; +} + + +int32_t +method_call_teec_closesession( + const char *workername, + + uint32_t in_session_seesionid, + uint32_t in_session_serviceid_timelow, + uint32_t in_session_serviceid_timemid, + uint32_t in_session_serviceid_timehiandver, + uint32_t *in_session_serviceid_clockseqandnode, + int32_t in_session_serviceid_clockseqandnode_size, + uint32_t in_session_opscnt, + uint64_t in_session_head_next, + uint64_t in_session_head_prev, + uint64_t in_session_context, + + uint32_t *session_seesionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + DBusMessageIter structIter; + DBusMessageIter ArrayIter; + int ret; + int iType; + dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; + int session_serviceid_clockseqandnode_realsize; + dbus_int32_t di32Temp; + dbus_uint32_t dui32Temp; + dbus_uint64_t dui64Temp; + char buf[2]; + buf[0] = DBUS_TYPE_UINT32; + buf[1] = '\0'; + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return -1; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return -1; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "TEEC_CloseSession" + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return -1; + } + + // append arguments + dbus_message_iter_init_append(msg, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + dui32Temp = in_session_seesionid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timelow; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timemid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timehiandver; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_session_serviceid_clockseqandnode_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_session_serviceid_clockseqandnode_size > 0 && + in_session_serviceid_clockseqandnode != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_session_opscnt; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + + dui64Temp = in_session_head_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_session_head_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_session_context; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + /* + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_connection_flush(conn); + dbus_message_unref(msg); + + printf("\n"); + printf("Method Call Teec Close Session Sent. \n"); + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + return -1; + } + + // free the pending message handle + dbus_pending_call_unref(pending); + */ + + // printf("\n"); + printf("libdbuscgpw method call teec close session sent. \n"); + + DBusMessage *reply; + reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "libdbuscgpw: closesession send_with_reply_and_block error, %s \n", err.message); + dbus_error_free(&err); + + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return -1; + } + if (reply == NULL) + { + fprintf(stderr, "libdbuscgpw: closesession dbus reply error \n"); + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return -1; + } + + dbus_message_unref(msg); + dbus_connection_flush(conn); + msg = reply; + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_seesionid = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timelow = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timemid = dui32Temp; + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timehiandver = dui32Temp; + + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_clockseqandnode_outsize = dui32Temp; + + if (*session_serviceid_clockseqandnode_outsize > 0) + { + bResult = + dbus_message_iter_next( + &structIter + ); + + dbus_message_iter_recurse( + &structIter, + &ArrayIter); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &session_serviceid_clockseqandnode_temp, + &session_serviceid_clockseqandnode_realsize + ); + } + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_opscnt = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_context = dui64Temp; + + + printf("libdbuscgpw got reply of method call teec close session: \n"); + printf(" session_seesionid = 0x %8.8x \n", + *session_seesionid + ); +#if 0 + printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", + *session_serviceid_timelow + ); + printf(" TEEC_Session session_serviceid_timemid = 0x %8.8x \n", + *session_serviceid_timemid + ); + printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", + *session_serviceid_timehiandver + ); + printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); + printf(" "); + for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { + printf(" %2.2x", + session_serviceid_clockseqandnode_temp[i] + ); + } + printf("\n"); + printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", + *session_serviceid_clockseqandnode_outsize + ); + printf(" TEEC_Session session_opscnt = 0x %8.8x \n", + *session_opscnt + ); + printf(" TEEC_Session session_head_next = 0x %16.16lx \n", + *session_head_next + ); + printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", + *session_head_prev + ); +#endif + printf(" session_context = 0x %16.16lx \n", + *session_context + ); + + if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && + session_serviceid_clockseqandnode_temp != NULL && + session_serviceid_clockseqandnode_realsize > 0 + ) + { + memcpy( + session_serviceid_clockseqandnode, + session_serviceid_clockseqandnode_temp, + session_serviceid_clockseqandnode_realsize * sizeof(uint32_t) + ); + *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *session_serviceid_clockseqandnode_outsize = 0; + } + + // free msg + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return 0; +} + + +int32_t +method_call_teec_invokecommand( + const char *workername, + + uint32_t in_session_sessionid, + uint32_t in_session_serviceid_timelow, + uint32_t in_session_serviceid_timemid, + uint32_t in_session_serviceid_timehiandver, + uint32_t *in_session_serviceid_clockseqandnode, + uint32_t in_session_serviceid_clockseqandnode_size, + uint32_t in_session_opscnt, + uint64_t in_session_head_next, + uint64_t in_session_head_prev, + uint64_t in_session_context, + + uint32_t commandid, + + uint32_t in_operation_started, + uint32_t in_operation_paramtypes, + + uint64_t in_operation_param1_tmpref_buffer, + uint32_t in_operation_param1_tmpref_size, + uint64_t in_operation_param1_memref_parent, + uint32_t in_operation_param1_memref_parent_flag, + uint32_t in_operation_param1_memref_size, + uint32_t in_operation_param1_memref_offset, + uint32_t in_operation_param1_value_a, + uint32_t in_operation_param1_value_b, + int32_t in_operation_param1_ionref_ionsharefd, + uint32_t in_operation_param1_ionref_ionsize, + + uint64_t in_operation_param2_tmpref_buffer, + uint32_t in_operation_param2_tmpref_size, + uint64_t in_operation_param2_memref_parent, + uint32_t in_operation_param2_memref_parent_flag, + uint32_t in_operation_param2_memref_size, + uint32_t in_operation_param2_memref_offset, + uint32_t in_operation_param2_value_a, + uint32_t in_operation_param2_value_b, + int32_t in_operation_param2_ionref_ionsharefd, + uint32_t in_operation_param2_ionref_ionsize, + + uint64_t in_operation_param3_tmpref_buffer, + uint32_t in_operation_param3_tmpref_size, + uint64_t in_operation_param3_memref_parent, + uint32_t in_operation_param3_memref_parent_flag, + uint32_t in_operation_param3_memref_size, + uint32_t in_operation_param3_memref_offset, + uint32_t in_operation_param3_value_a, + uint32_t in_operation_param3_value_b, + int32_t in_operation_param3_ionref_ionsharefd, + uint32_t in_operation_param3_ionref_ionsize, + + uint64_t in_operation_param4_tmpref_buffer, + uint32_t in_operation_param4_tmpref_size, + uint64_t in_operation_param4_memref_parent, + uint32_t in_operation_param4_memref_parent_flag, + uint32_t in_operation_param4_memref_size, + uint32_t in_operation_param4_memref_offset, + uint32_t in_operation_param4_value_a, + uint32_t in_operation_param4_value_b, + int32_t in_operation_param4_ionref_ionsharefd, + uint32_t in_operation_param4_ionref_ionsize, + + uint64_t in_operation_session, + int32_t in_operation_cancelflag, + + uint32_t in_returnorigin, + + uint32_t *in_buffer1, + uint32_t in_buffer1_size, + uint32_t *in_buffer2, + uint32_t in_buffer2_size, + uint32_t *in_buffer3, + uint32_t in_buffer3_size, + uint32_t *in_buffer4, + uint32_t in_buffer4_size, + + + uint32_t *teecresult, + + uint32_t *session_sessionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context, + + uint32_t *operation_started, + uint32_t *operation_paramtypes, + + uint64_t *operation_param1_tmpref_buffer, + uint32_t *operation_param1_tmpref_size, + uint64_t *operation_param1_memref_parent, + uint32_t *operation_param1_memref_parent_flag, + uint32_t *operation_param1_memref_size, + uint32_t *operation_param1_memref_offset, + uint32_t *operation_param1_value_a, + uint32_t *operation_param1_value_b, + int32_t *operation_param1_ionref_ionsharefd, + uint32_t *operation_param1_ionref_ionsize, + + uint64_t *operation_param2_tmpref_buffer, + uint32_t *operation_param2_tmpref_size, + uint64_t *operation_param2_memref_parent, + uint32_t *operation_param2_memref_parent_flag, + uint32_t *operation_param2_memref_size, + uint32_t *operation_param2_memref_offset, + uint32_t *operation_param2_value_a, + uint32_t *operation_param2_value_b, + int32_t *operation_param2_ionref_ionsharefd, + uint32_t *operation_param2_ionref_ionsize, + + uint64_t *operation_param3_tmpref_buffer, + uint32_t *operation_param3_tmpref_size, + uint64_t *operation_param3_memref_parent, + uint32_t *operation_param3_memref_parent_flag, + uint32_t *operation_param3_memref_size, + uint32_t *operation_param3_memref_offset, + uint32_t *operation_param3_value_a, + uint32_t *operation_param3_value_b, + int32_t *operation_param3_ionref_ionsharefd, + uint32_t *operation_param3_ionref_ionsize, + + uint64_t *operation_param4_tmpref_buffer, + uint32_t *operation_param4_tmpref_size, + uint64_t *operation_param4_memref_parent, + uint32_t *operation_param4_memref_parent_flag, + uint32_t *operation_param4_memref_size, + uint32_t *operation_param4_memref_offset, + uint32_t *operation_param4_value_a, + uint32_t *operation_param4_value_b, + int32_t *operation_param4_ionref_ionsharefd, + uint32_t *operation_param4_ionref_ionsize, + + uint64_t *operation_session, + int32_t *operation_cancelflag, + + uint32_t *returnorigin, + + uint32_t *buffer1, + uint32_t buffer1_size, + uint32_t *buffer1_outsize, + uint32_t *buffer2, + uint32_t buffer2_size, + uint32_t *buffer2_outsize, + uint32_t *buffer3, + uint32_t buffer3_size, + uint32_t *buffer3_outsize, + uint32_t *buffer4, + uint32_t buffer4_size, + uint32_t *buffer4_outsize +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + DBusMessageIter structIter; + DBusMessageIter ArrayIter; + int ret; + int iType; + dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; + int session_serviceid_clockseqandnode_realsize; + dbus_int32_t di32Temp; + dbus_uint32_t dui32Temp; + dbus_uint64_t dui64Temp; + char buf[2]; + buf[0] = DBUS_TYPE_UINT32; + buf[1] = '\0'; + + dbus_uint32_t *buffer1_temp = NULL; + int buffer1_realsize; + dbus_uint32_t *buffer2_temp = NULL; + int buffer2_realsize; + dbus_uint32_t *buffer3_temp = NULL; + int buffer3_realsize; + dbus_uint32_t *buffer4_temp = NULL; + int buffer4_realsize; + + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return -1; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return -1; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "TEEC_InvokeCommand" + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return -1; + } + + + // append arguments + dbus_message_iter_init_append(msg, &args); + dbus_message_iter_open_container( + &args, + DBUS_TYPE_STRUCT, + NULL, + &structIter + ); + + + dui32Temp = in_session_sessionid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timelow; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timemid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_timehiandver; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_session_serviceid_clockseqandnode_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_session_serviceid_clockseqandnode_size > 0 && + in_session_serviceid_clockseqandnode != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_session_opscnt; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_session_head_next; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_session_head_prev; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_session_context; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + + dui32Temp = commandid; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + + dui32Temp = in_operation_started; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_paramtypes; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param1_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param1_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_memref_parent_flag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param1_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param1_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param2_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param2_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_memref_parent_flag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param2_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param2_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param3_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param3_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_memref_parent_flag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param3_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param3_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param4_tmpref_buffer; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_tmpref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_param4_memref_parent; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_memref_parent_flag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_memref_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_memref_offset; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_value_a; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_value_b; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_param4_ionref_ionsharefd; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_operation_param4_ionref_ionsize; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui64Temp = in_operation_session; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT64, + &dui64Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + di32Temp = in_operation_cancelflag; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_INT32, + &di32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_returnorigin; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dui32Temp = in_buffer1_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_buffer1_size > 0 && + in_buffer1 != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_buffer1, + in_buffer1_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_buffer2_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_buffer2_size > 0 && + in_buffer2 != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_buffer2, + in_buffer2_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_buffer3_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_buffer3_size > 0 && + in_buffer3 != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_buffer3, + in_buffer3_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dui32Temp = in_buffer4_size; + bResult = + dbus_message_iter_append_basic( + &structIter, + DBUS_TYPE_UINT32, + &dui32Temp + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + if (in_buffer4_size > 0 && + in_buffer4 != NULL) + { + dbus_message_iter_open_container( + &structIter, + DBUS_TYPE_ARRAY, + buf, + &ArrayIter + ); + + bResult = + dbus_message_iter_append_fixed_array( + &ArrayIter, + DBUS_TYPE_UINT32, + &in_buffer4, + in_buffer4_size + ); + if (!bResult) + { + fprintf(stderr, "Out Of Memory!\n"); + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + dbus_message_iter_close_container( + &args, + &structIter + ); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_close_container( + &structIter, + &ArrayIter + ); + } + + dbus_message_iter_close_container( + &args, + &structIter + ); + + /* + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + dbus_connection_flush(conn); + dbus_message_unref(msg); + return -1; + } + + dbus_connection_flush(conn); + dbus_message_unref(msg); + + printf("\n"); + printf("Method Call Teec Invoke Command Sent. \n"); + + ///////////////////////////////////////////////////////////////////////////////////// + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + return -1; + } + + // free the pending message handle + dbus_pending_call_unref(pending); + */ + + // printf("\n"); + printf("libdbuscgpw method call teec invoke command sent. \n"); + + DBusMessage *reply; + reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "libdbuscgpw: invokecommand send_with_reply_and_block error, %s \n", err.message); + dbus_error_free(&err); + + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return -1; + } + if (reply == NULL) + { + fprintf(stderr, "libdbuscgpw: invokecommand dbus reply error \n"); + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return -1; + } + + dbus_message_unref(msg); + dbus_connection_flush(conn); + msg = reply; + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + dbus_message_iter_recurse( + &args, + &structIter + ); + + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *teecresult = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_sessionid = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timelow = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timemid = dui32Temp; + + + bResult = + dbus_message_iter_next( + &structIter + ); + if (!bResult) + { + fprintf(stderr, "Message has too few arguments!\n"); + dbus_message_unref(msg); + return -1; + } + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_timehiandver = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_serviceid_clockseqandnode_outsize = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + if (*session_serviceid_clockseqandnode_outsize > 0) + { + + dbus_message_iter_recurse( + &structIter, + &ArrayIter + ); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &session_serviceid_clockseqandnode_temp, + &session_serviceid_clockseqandnode_realsize + ); + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *session_opscnt = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_next = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_head_prev = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *session_context = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_started = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_paramtypes = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param1_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param1_memref_parent = dui64Temp; + + bResult = dbus_message_iter_next(&structIter); + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_memref_parent_flag = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param1_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param1_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param2_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param2_memref_parent = dui64Temp; + + bResult = dbus_message_iter_next(&structIter); + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_memref_parent_flag = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param2_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param2_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param3_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param3_memref_parent = dui64Temp; + + bResult = dbus_message_iter_next(&structIter); + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_memref_parent_flag = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param3_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param3_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param4_tmpref_buffer = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_tmpref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_param4_memref_parent = dui64Temp; + + bResult = dbus_message_iter_next(&structIter); + iType = dbus_message_iter_get_arg_type(&structIter); + if (iType != DBUS_TYPE_UINT32) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_memref_parent_flag = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_memref_size = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_memref_offset = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_value_a = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_value_b = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_param4_ionref_ionsharefd = di32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *operation_param4_ionref_ionsize = dui32Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT64 + ) + { + fprintf(stderr, "Argument is not UINT64.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui64Temp + ); + *operation_session = dui64Temp; + + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_INT32 + ) + { + fprintf(stderr, "Argument is not INT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &di32Temp + ); + *operation_cancelflag = di32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *returnorigin = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *buffer1_outsize = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + if (*buffer1_outsize > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter + ); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &buffer1_temp, + &buffer1_realsize + ); + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *buffer2_outsize = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + if (*buffer2_outsize > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter + ); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &buffer2_temp, + &buffer2_realsize + ); + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *buffer3_outsize = dui32Temp; + bResult = + dbus_message_iter_next( + &structIter + ); + + if (*buffer3_outsize > 0) + { + dbus_message_iter_recurse( + &structIter, + &ArrayIter + ); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &buffer3_temp, + &buffer3_realsize + ); + bResult = + dbus_message_iter_next( + &structIter + ); + } + + iType = + dbus_message_iter_get_arg_type( + &structIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_basic( + &structIter, + &dui32Temp + ); + *buffer4_outsize = dui32Temp; + + if (*buffer4_outsize > 0) + { + bResult = + dbus_message_iter_next( + &structIter + ); + + dbus_message_iter_recurse( + &structIter, + &ArrayIter + ); + + iType = + dbus_message_iter_get_arg_type( + &ArrayIter + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + dbus_message_unref(msg); + return -1; + } + dbus_message_iter_get_fixed_array( + &ArrayIter, + &buffer4_temp, + &buffer4_realsize + ); + } + + + printf("libdbuscgpw got reply of method call teec invoke command: \n"); + printf(" teecresult = 0x %8.8x \n", + *teecresult); + printf(" session_seesionid = 0x %8.8x \n", + *session_sessionid + ); +#if 0 + printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", + *session_serviceid_timelow + ); + printf(" TEEC_Session session_serviceid_timemid = 0x %8.8x \n", + *session_serviceid_timemid + ); + printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", + *session_serviceid_timehiandver + ); + printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); + if ( *session_serviceid_clockseqandnode_outsize > 0 && + session_serviceid_clockseqandnode_temp != NULL + ) + { + for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { + printf(" %2.2x", + session_serviceid_clockseqandnode_temp[i] + ); + } + printf("\n"); + } + printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", + *session_serviceid_clockseqandnode_outsize + ); + printf(" TEEC_Session session_opscnt = 0x %8.8x \n", + *session_opscnt + ); + printf(" TEEC_Session session_head_next = 0x %16.16lx \n", + *session_head_next + ); + printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", + *session_head_prev + ); + printf(" TEEC_Session session_context = 0x %16.16lx \n", + *session_context + ); + printf(" TEEC_Session session_context = 0x %16.16lx \n", + *session_context + ); + printf(" TEEC_Session operation_started = 0x %8.8x \n", + *operation_started + ); + printf(" TEEC_Session operation_paramtypes = 0x %8.8x \n", + *operation_paramtypes + ); + printf(" TEEC_Session operation_param1_tmpref_buffer = 0x %16.16lx \n", + *operation_param1_tmpref_buffer + ); + printf(" TEEC_Session operation_param1_tmpref_size = 0x %8.8x \n", + *operation_param1_tmpref_size + ); + printf(" TEEC_Session operation_param1_memref_parent = 0x %16.16lx \n", + *operation_param1_memref_parent + ); + printf(" TEEC_Session operation_param1_memref_size = 0x %8.8x \n", + *operation_param1_memref_size + ); + printf(" TEEC_Session operation_param1_memref_offse = 0x %8.8x \n", + *operation_param1_memref_offset + ); + printf(" TEEC_Session operation_param1_value_a = 0x %8.8x \n", + *operation_param1_value_a + ); + printf(" TEEC_Session operation_param1_value_b = 0x %8.8x \n", + *operation_param1_value_b + ); + printf(" TEEC_Session operation_param1_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param1_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param1_ionref_ionsize = 0x %8.8x \n", + *operation_param1_ionref_ionsize + ); + + printf(" TEEC_Session operation_param2_tmpref_buffer = 0x %16.16lx \n", + *operation_param2_tmpref_buffer + ); + printf(" TEEC_Session operation_param2_tmpref_size = 0x %8.8x \n", + *operation_param2_tmpref_size + ); + printf(" TEEC_Session operation_param2_memref_parent = 0x %16.16lx \n", + *operation_param2_memref_parent + ); + printf(" TEEC_Session operation_param2_memref_size = 0x %8.8x \n", + *operation_param2_memref_size + ); + printf(" TEEC_Session operation_param2_memref_offset = 0x %8.8x \n", + *operation_param2_memref_offset + ); + printf(" TEEC_Session operation_param2_value_a = 0x %8.8x \n", + *operation_param2_value_a + ); + printf(" TEEC_Session operation_param2_value_b = 0x %8.8x \n", + *operation_param2_value_b + ); + printf(" TEEC_Session operation_param2_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param2_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param2_ionref_ionsize = 0x %8.8x \n", + *operation_param2_ionref_ionsize + ); + + printf(" TEEC_Session operation_param3_tmpref_buffer = 0x %16.16lx \n", + *operation_param3_tmpref_buffer + ); + printf(" TEEC_Session operation_param3_tmpref_size = 0x %8.8x \n", + *operation_param3_tmpref_size + ); + printf(" TEEC_Session operation_param3_memref_parent = 0x %16.16lx \n", + *operation_param3_memref_parent + ); + printf(" TEEC_Session operation_param3_memref_size = 0x %8.8x \n", + *operation_param3_memref_size + ); + printf(" TEEC_Session operation_param3_memref_offset = 0x %8.8x \n", + *operation_param3_memref_offset + ); + printf(" TEEC_Session operation_param3_value_a = 0x %8.8x \n", + *operation_param3_value_a + ); + printf(" TEEC_Session operation_param3_value_b = 0x %8.8x \n", + *operation_param3_value_b + ); + printf(" TEEC_Session operation_param3_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param3_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param3_ionref_ionsize = 0x %8.8x \n", + *operation_param3_ionref_ionsize + ); + + printf(" TEEC_Session operation_param4_tmpref_buffer = 0x %16.16lx \n", + *operation_param4_tmpref_buffer + ); + printf(" TEEC_Session operation_param4_tmpref_size = 0x %8.8x \n", + *operation_param4_tmpref_size + ); + printf(" TEEC_Session operation_param4_memref_parent = 0x %16.16lx \n", + *operation_param4_memref_parent + ); + printf(" TEEC_Session operation_param4_memref_size = 0x %8.8x \n", + *operation_param4_memref_size + ); + printf(" TEEC_Session operation_param4_memref_offset = 0x %8.8x \n", + *operation_param4_memref_offset + ); + printf(" TEEC_Session operation_param4_value_a = 0x %8.8x \n", + *operation_param4_value_a + ); + printf(" TEEC_Session operation_param4_value_b = 0x %8.8x \n", + *operation_param4_value_b + ); + printf(" TEEC_Session operation_param4_ionref_ionsharefd = 0x %8.8x \n", + (unsigned int)*operation_param4_ionref_ionsharefd + ); + printf(" TEEC_Session operation_param4_ionref_ionsize = 0x %8.8x \n", + *operation_param4_ionref_ionsize + ); + + printf(" TEEC_Session operation_session = 0x %16.16lx \n", + *operation_session + ); + printf(" TEEC_Session operation_cancelflag = 0x %8.8x \n", + (unsigned int)*operation_cancelflag + ); + printf(" returnorigin = 0x %8.8x \n", + *returnorigin + ); + + printf(" buffer1 = \n"); + if (buffer1_temp != NULL) + { + for (int i = 0; i < buffer1_realsize; i++) { + printf(" %2.2x", + buffer1_temp[i] + ); + } + printf("\n"); + } + printf(" buffer1_outsize = 0x %8.8x \n", + *buffer1_outsize + ); + + printf(" buffer2 = \n"); + if (buffer2_temp != NULL) + { + for (int i = 0; i < buffer2_realsize; i++) { + printf(" %2.2x", + buffer2_temp[i] + ); + } + printf("\n"); + } + printf(" buffer2_outsize = 0x %8.8x \n", + *buffer2_outsize + ); + + printf(" buffer3 = \n"); + if (buffer3_temp != NULL) + { + for (int i = 0; i < buffer3_realsize; i++) { + printf(" %2.2x", + buffer3_temp[i] + ); + } + printf("\n"); + } + printf(" buffer3_outsize = 0x %8.8x \n", + *buffer3_outsize + ); + + if (buffer4_temp != NULL) + { + printf(" buffer4 = \n"); + for (int i = 0; i < buffer4_realsize; i++) { + printf(" %2.2x", + buffer4_temp[i] + ); + } + printf("\n"); + } + printf(" buffer4_outsize = 0x %8.8x \n", + *buffer4_outsize + ); +#endif + + if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && + session_serviceid_clockseqandnode != NULL && + session_serviceid_clockseqandnode_temp != NULL && + session_serviceid_clockseqandnode_realsize > 0 + ) + { + memcpy( + session_serviceid_clockseqandnode, + session_serviceid_clockseqandnode_temp, + session_serviceid_clockseqandnode_realsize * sizeof(uint32_t) + ); + *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *session_serviceid_clockseqandnode_outsize = 0; + } + + if (buffer1_size >= (uint32_t) buffer1_realsize && + buffer1 != NULL && + buffer1_temp != NULL && + buffer1_realsize > 0 + ) + { + memcpy( + buffer1, + buffer1_temp, + buffer1_realsize * sizeof(uint32_t) + ); + *buffer1_outsize = buffer1_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *buffer1_outsize = 0; + } + + if (buffer2_size >= (uint32_t) buffer2_realsize && + buffer2 != NULL && + buffer2_temp != NULL && + buffer2_realsize > 0 + ) + { + memcpy( + buffer2, + buffer2_temp, + buffer2_realsize * sizeof(uint32_t) + ); + *buffer2_outsize = buffer2_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *buffer2_outsize = 0; + } + + if (buffer3_size >= (uint32_t) buffer3_realsize && + buffer3 != NULL && + buffer3_temp != NULL && + buffer3_realsize > 0 + ) + { + memcpy( + buffer3, + buffer3_temp, + buffer3_realsize * sizeof(uint32_t) + ); + *buffer3_outsize = buffer3_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *buffer3_outsize = 0; + } + + if (buffer4_size >= (uint32_t) buffer4_realsize && + buffer4 != NULL && + buffer4_temp != NULL && + buffer4_realsize > 0 + ) + { + memcpy( + buffer4, + buffer4_temp, + buffer4_realsize * sizeof(uint32_t) + ); + *buffer4_outsize = buffer4_realsize; + } else + { + // dbus_message_unref(msg); + // return -1; + *buffer4_outsize = 0; + } + + + // free msg + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); + + return 0; +} + + +/** + * Call a method on a remote object + */ +void +method_call_destroy_threadpool( + const char *workername +) +{ + DBusConnection *conn = NULL; + DBusMessage *msg; + DBusMessageIter args; + // DBusConnection* conn; + DBusError err; + DBusPendingCall *pending; + dbus_bool_t bResult; + int ret; + int iType; + unsigned char name[] = "threadpool"; + unsigned char *charp; + dbus_uint32_t retcode; + + // initialiset the errors + dbus_error_init(&err); + + char dbusname[1024]; + if (conn == NULL) + { + // connect to the system bus and check for errors + conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Connection Error (%s)\n", err.message); + dbus_error_free(&err); + } + if (NULL == conn) + { + return; + } + + memset((uint8_t *) dbusname, 0, 1024); + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); + srand(u64time); + sprintf(dbusname, + "%s.method.caller%16.16lx%16.16lx", + workername, + u64time, + (long unsigned int) rand() + ); + // request our name on the bus + ret = + dbus_bus_request_name( + conn, + dbusname, + DBUS_NAME_FLAG_REPLACE_EXISTING, + &err + ); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "Name Error (%s)\n", err.message); + dbus_error_free(&err); + dbus_connection_flush(conn); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + dbus_connection_flush(conn); + return; + } + } + + // create a new method call and check for errors + char objname[1024]; + char interfacename[1024]; + memset((uint8_t *) dbusname, 0, 1024); + sprintf(dbusname, "%s.method.server", workername); + memset((uint8_t *) objname, 0, 1024); + sprintf(objname, "/%s/method/Object", workername); + memset((uint8_t *) interfacename, 0, 1024); + sprintf(interfacename, "%s.method.Type", workername); + msg = + dbus_message_new_method_call( + // "test.method.server", // target for the method call + dbusname, + // "/test/method/Object", // object to call on + objname, + // "test.method.Type", // interface to call on + interfacename, + "Destroy" // method name + ); + if (NULL == msg) + { + fprintf(stderr, "Message Null\n"); + dbus_connection_flush(conn); + return; + } + + // append arguments + dbus_message_iter_init_append(msg, &args); + + charp = name; + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &charp)) + { + fprintf(stderr, "Out Of Memory!\n"); + return; + } + + /* + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) + { // -1 is default timeout + fprintf(stderr, "Out Of Memory!\n"); + return; + } + if (NULL == pending) + { + fprintf(stderr, "Pending Call Null\n"); + return; + } + dbus_connection_flush(conn); + + printf("\n"); + printf("Method Call Destroy Threadpool Sent. \n"); + + // free message + dbus_message_unref(msg); + + // block until we recieve a reply + dbus_pending_call_block(pending); + + // get the reply message + msg = dbus_pending_call_steal_reply(pending); + if (NULL == msg) + { + fprintf(stderr, "Reply Null\n"); + return; + } + // free the pending message handle + dbus_pending_call_unref(pending); + */ + + // printf("\n"); + printf("libdbuscgpw method call destroygpw sent. \n"); + + DBusMessage *reply; + reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); + if (dbus_error_is_set(&err)) + { + fprintf(stderr, "libdbuscgpw: destroygpw send_with_reply_and_block error, %s \n", err.message); + dbus_error_free(&err); + + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return; + } + if (reply == NULL) + { + fprintf(stderr, "libdbuscgpw: destroygpw dbus reply error \n"); + dbus_message_unref(msg); + dbus_connection_flush(conn); + dbus_connection_close(conn); + dbus_connection_unref(conn); + return; + } + + dbus_message_unref(msg); + dbus_connection_flush(conn); + msg = reply; + + // read the parameters + bResult = + dbus_message_iter_init( + msg, + &args + ); + if (!bResult) + { + fprintf(stderr, "Message has no arguments!\n"); + return; + } + + iType = + dbus_message_iter_get_arg_type( + &args + ); + if ( + iType != DBUS_TYPE_UINT32 + ) + { + fprintf(stderr, "Argument is not UINT32.\n"); + return; + } + dbus_message_iter_get_basic( + &args, + &retcode + ); + + printf("libdbusgpw got reply of method call destroygpw: \n"); + printf(" retcode = 0x%8x \n", retcode); + + // free reply + dbus_message_unref(msg); + + dbus_connection_close(conn); + dbus_connection_unref(conn); +} diff --git a/cc-resource-pooling/teeproxy/libdbuscgpw/dbusc_gpw.h b/cc-resource-pooling/teeproxy/libdbuscgpw/dbusc_gpw.h new file mode 100644 index 0000000..714c08c --- /dev/null +++ b/cc-resource-pooling/teeproxy/libdbuscgpw/dbusc_gpw.h @@ -0,0 +1,406 @@ +#ifndef _DBUSC_GPW_H_ +#define _DBUSC_GPW_H_ + +#include +#include + + +void +receive_signal(void); + +void +send_signal( + char *sigvalue +); + +int32_t +method_call_teec_inicont( + const char *workername, + + const uint8_t *name, size_t name_size, + int32_t in_context_fd, + const uint8_t *in_context_tapath, size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + + uint32_t *teecresult, + int32_t *context_fd, + uint8_t *context_tapath, size_t context_tapath_insize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + uint64_t *context_addr, + uint32_t *context_tapath_outsize +); + +int32_t +method_call_teec_fincont( + const char *workername, + + int32_t in_context_fd, + const uint8_t *in_context_tapath, size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + uint64_t in_context_addr, + + int32_t *context_fd, + uint8_t *context_tapath, size_t context_tapath_insize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + uint32_t *context_tapath_outsize +); + +int32_t +method_call_teec_opensession( + const char *workername, + + int32_t in_context_fd, + const uint8_t *in_context_tapath, + size_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + + uint32_t in_destination_timelow, + uint32_t in_destination_timemid, + uint32_t in_destination_timehiandver, + uint32_t *in_destination_clockseqandnode, + int32_t in_destination_clockseqandnode_size, + uint32_t in_connectionmethod, + uint64_t in_connectiondata, + uint32_t in_operation_started, + uint32_t in_operation_paramtypes, + + uint64_t in_operation_param1_tmpref_buffer, + uint32_t in_operation_param1_tmpref_size, + uint64_t in_operation_param1_memref_parent, + uint32_t in_operation_param1_memref_size, + uint32_t in_operation_param1_memref_offset, + uint32_t in_operation_param1_value_a, + uint32_t in_operation_param1_value_b, + int32_t in_operation_param1_ionref_ionsharefd, + uint32_t in_operation_param1_ionref_ionsize, + + uint64_t in_operation_param2_tmpref_buffer, + uint32_t in_operation_param2_tmpref_size, + uint64_t in_operation_param2_memref_parent, + uint32_t in_operation_param2_memref_size, + uint32_t in_operation_param2_memref_offset, + uint32_t in_operation_param2_value_a, + uint32_t in_operation_param2_value_b, + int32_t in_operation_param2_ionref_ionsharefd, + uint32_t in_operation_param2_ionref_ionsize, + + uint64_t in_operation_param3_tmpref_buffer, + uint32_t in_operation_param3_tmpref_size, + uint64_t in_operation_param3_memref_parent, + uint32_t in_operation_param3_memref_size, + uint32_t in_operation_param3_memref_offset, + uint32_t in_operation_param3_value_a, + uint32_t in_operation_param3_value_b, + int32_t in_operation_param3_ionref_ionsharefd, + uint32_t in_operation_param3_ionref_ionsize, + + uint64_t in_operation_param4_tmpref_buffer, + uint32_t in_operation_param4_tmpref_size, + uint64_t in_operation_param4_memref_parent, + uint32_t in_operation_param4_memref_size, + uint32_t in_operation_param4_memref_offset, + uint32_t in_operation_param4_value_a, + uint32_t in_operation_param4_value_b, + int32_t in_operation_param4_ionref_ionsharefd, + uint32_t in_operation_param4_ionref_ionsize, + + uint64_t in_operation_session, + int32_t in_operation_cancelflag, + + uint32_t in_returnorigin, + + uint64_t in_context_addr, + + + uint32_t *teecresult, + + int32_t *context_fd, + uint8_t *context_tapath, + size_t context_tapath_size, + uint32_t *context_tapath_outsize, + uint64_t *context_sessionlist_next, + uint64_t *context_sessionlist_prev, + uint64_t *context_shrdmemlist_next, + uint64_t *context_shrdmemlist_prev, + uint64_t *context_sharebuffer_buffer, + int64_t *context_sharebuffer_bufferbarrier, + + uint32_t *session_seesionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context, + + uint32_t *operation_started, + uint32_t *operation_paramtypes, + + uint64_t *operation_param1_tmpref_buffer, + uint32_t *operation_param1_tmpref_size, + uint64_t *operation_param1_memref_parent, + uint32_t *operation_param1_memref_size, + uint32_t *operation_param1_memref_offset, + uint32_t *operation_param1_value_a, + uint32_t *operation_param1_value_b, + int32_t *operation_param1_ionref_ionsharefd, + uint32_t *operation_param1_ionref_ionsize, + + uint64_t *operation_param2_tmpref_buffer, + uint32_t *operation_param2_tmpref_size, + uint64_t *operation_param2_memref_parent, + uint32_t *operation_param2_memref_size, + uint32_t *operation_param2_memref_offset, + uint32_t *operation_param2_value_a, + uint32_t *operation_param2_value_b, + int32_t *operation_param2_ionref_ionsharefd, + uint32_t *operation_param2_ionref_ionsize, + + uint64_t *operation_param3_tmpref_buffer, + uint32_t *operation_param3_tmpref_size, + uint64_t *operation_param3_memref_parent, + uint32_t *operation_param3_memref_size, + uint32_t *operation_param3_memref_offset, + uint32_t *operation_param3_value_a, + uint32_t *operation_param3_value_b, + int32_t *operation_param3_ionref_ionsharefd, + uint32_t *operation_param3_ionref_ionsize, + + uint64_t *operation_param4_tmpref_buffer, + uint32_t *operation_param4_tmpref_size, + uint64_t *operation_param4_memref_parent, + uint32_t *operation_param4_memref_size, + uint32_t *operation_param4_memref_offset, + uint32_t *operation_param4_value_a, + uint32_t *operation_param4_value_b, + int32_t *operation_param4_ionref_ionsharefd, + uint32_t *operation_param4_ionref_ionsize, + + uint64_t *operation_session, + int32_t *operation_cancelflag, + + uint32_t *returnorigin +); + +int32_t +method_call_teec_closesession( + const char *workername, + + uint32_t in_session_seesionid, + uint32_t in_session_serviceid_timelow, + uint32_t in_session_serviceid_timemid, + uint32_t in_session_serviceid_timehiandver, + uint32_t *in_session_serviceid_clockseqandnode, + int32_t in_session_serviceid_clockseqandnode_size, + uint32_t in_session_opscnt, + uint64_t in_session_head_next, + uint64_t in_session_head_prev, + uint64_t in_session_context, + + uint32_t *session_seesionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context +); + +int32_t +method_call_teec_invokecommand( + const char *workername, + + uint32_t in_session_seesionid, + uint32_t in_session_serviceid_timelow, + uint32_t in_session_serviceid_timemid, + uint32_t in_session_serviceid_timehiandver, + uint32_t *in_session_serviceid_clockseqandnode, + uint32_t in_session_serviceid_clockseqandnode_size, + uint32_t in_session_opscnt, + uint64_t in_session_head_next, + uint64_t in_session_head_prev, + uint64_t in_session_context, + + uint32_t commandid, + + uint32_t in_operation_started, + uint32_t in_operation_paramtypes, + + uint64_t in_operation_param1_tmpref_buffer, + uint32_t in_operation_param1_tmpref_size, + uint64_t in_operation_param1_memref_parent, + uint32_t in_operation_param1_memref_parent_flag, + uint32_t in_operation_param1_memref_size, + uint32_t in_operation_param1_memref_offset, + uint32_t in_operation_param1_value_a, + uint32_t in_operation_param1_value_b, + int32_t in_operation_param1_ionref_ionsharefd, + uint32_t in_operation_param1_ionref_ionsize, + + uint64_t in_operation_param2_tmpref_buffer, + uint32_t in_operation_param2_tmpref_size, + uint64_t in_operation_param2_memref_parent, + uint32_t in_operation_param2_memref_parent_flag, + uint32_t in_operation_param2_memref_size, + uint32_t in_operation_param2_memref_offset, + uint32_t in_operation_param2_value_a, + uint32_t in_operation_param2_value_b, + int32_t in_operation_param2_ionref_ionsharefd, + uint32_t in_operation_param2_ionref_ionsize, + + uint64_t in_operation_param3_tmpref_buffer, + uint32_t in_operation_param3_tmpref_size, + uint64_t in_operation_param3_memref_parent, + uint32_t in_operation_param3_memref_parent_flag, + uint32_t in_operation_param3_memref_size, + uint32_t in_operation_param3_memref_offset, + uint32_t in_operation_param3_value_a, + uint32_t in_operation_param3_value_b, + int32_t in_operation_param3_ionref_ionsharefd, + uint32_t in_operation_param3_ionref_ionsize, + + uint64_t in_operation_param4_tmpref_buffer, + uint32_t in_operation_param4_tmpref_size, + uint64_t in_operation_param4_memref_parent, + uint32_t in_operation_param4_memref_parent_flag, + uint32_t in_operation_param4_memref_size, + uint32_t in_operation_param4_memref_offset, + uint32_t in_operation_param4_value_a, + uint32_t in_operation_param4_value_b, + int32_t in_operation_param4_ionref_ionsharefd, + uint32_t in_operation_param4_ionref_ionsize, + + uint64_t in_operation_session, + int32_t in_operation_cancelflag, + + uint32_t in_returnorigin, + + uint32_t *in_buffer1, + uint32_t in_buffer1_size, + uint32_t *in_buffer2, + uint32_t in_buffer2_size, + uint32_t *in_buffer3, + uint32_t in_buffer3_size, + uint32_t *in_buffer4, + uint32_t in_buffer4_size, + + + uint32_t *teecresult, + + uint32_t *session_seesionid, + uint32_t *session_serviceid_timelow, + uint32_t *session_serviceid_timemid, + uint32_t *session_serviceid_timehiandver, + uint32_t *session_serviceid_clockseqandnode, + int32_t session_serviceid_clockseqandnode_size, + uint32_t *session_serviceid_clockseqandnode_outsize, + uint32_t *session_opscnt, + uint64_t *session_head_next, + uint64_t *session_head_prev, + uint64_t *session_context, + + uint32_t *operation_started, + uint32_t *operation_paramtypes, + + uint64_t *operation_param1_tmpref_buffer, + uint32_t *operation_param1_tmpref_size, + uint64_t *operation_param1_memref_parent, + uint32_t *operation_param1_memref_parent_flag, + uint32_t *operation_param1_memref_size, + uint32_t *operation_param1_memref_offset, + uint32_t *operation_param1_value_a, + uint32_t *operation_param1_value_b, + int32_t *operation_param1_ionref_ionsharefd, + uint32_t *operation_param1_ionref_ionsize, + + uint64_t *operation_param2_tmpref_buffer, + uint32_t *operation_param2_tmpref_size, + uint64_t *operation_param2_memref_parent, + uint32_t *operation_param2_memref_parent_flag, + uint32_t *operation_param2_memref_size, + uint32_t *operation_param2_memref_offset, + uint32_t *operation_param2_value_a, + uint32_t *operation_param2_value_b, + int32_t *operation_param2_ionref_ionsharefd, + uint32_t *operation_param2_ionref_ionsize, + + uint64_t *operation_param3_tmpref_buffer, + uint32_t *operation_param3_tmpref_size, + uint64_t *operation_param3_memref_parent, + uint32_t *operation_param3_memref_parent_flag, + uint32_t *operation_param3_memref_size, + uint32_t *operation_param3_memref_offset, + uint32_t *operation_param3_value_a, + uint32_t *operation_param3_value_b, + int32_t *operation_param3_ionref_ionsharefd, + uint32_t *operation_param3_ionref_ionsize, + + uint64_t *operation_param4_tmpref_buffer, + uint32_t *operation_param4_tmpref_size, + uint64_t *operation_param4_memref_parent, + uint32_t *operation_param4_memref_parent_flag, + uint32_t *operation_param4_memref_size, + uint32_t *operation_param4_memref_offset, + uint32_t *operation_param4_value_a, + uint32_t *operation_param4_value_b, + int32_t *operation_param4_ionref_ionsharefd, + uint32_t *operation_param4_ionref_ionsize, + + uint64_t *operation_session, + int32_t *operation_cancelflag, + + uint32_t *returnorigin, + + uint32_t *buffer1, + uint32_t buffer1_size, + uint32_t *buffer1_outsize, + uint32_t *buffer2, + uint32_t buffer2_size, + uint32_t *buffer2_outsize, + uint32_t *buffer3, + uint32_t buffer3_size, + uint32_t *buffer3_outsize, + uint32_t *buffer4, + uint32_t buffer4_size, + uint32_t *buffer4_outsize +); + +void +method_call_destroy_threadpool( + const char *workername +); + +#endif /* _DBUSC_GPW_H_ */ diff --git a/cc-resource-pooling/teeproxy/libteecc/CMakeLists.txt b/cc-resource-pooling/teeproxy/libteecc/CMakeLists.txt new file mode 100644 index 0000000..d27d391 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/CMakeLists.txt @@ -0,0 +1,119 @@ +# +# + +cmake_minimum_required(VERSION 3.5.1) + +project(teecc C CXX) + +include(common.cmake) + +# Proto file +get_filename_component(gt_proto "./protos/gt.proto" ABSOLUTE) +get_filename_component(gt_proto_path "${gt_proto}" PATH) +# [[get_filename_component(proto "../protos/${proto_name}.proto" ABSOLUTE) +# get_filename_component(proto_dir "${proto}" DIRECTORY)]] + +# Generated sources +set(gt_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/gt.pb.cc") +set(gt_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/gt.pb.h") +set(gt_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/gt.grpc.pb.cc") +set(gt_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/gt.grpc.pb.h") + +add_custom_command( + OUTPUT "${gt_proto_srcs}" "${gt_proto_hdrs}" "${gt_grpc_srcs}" "${gt_grpc_hdrs}" + COMMAND ${_PROTOBUF_PROTOC} + ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}" + --cpp_out "${CMAKE_CURRENT_BINARY_DIR}" + -I "${gt_proto_path}" + --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" + "${gt_proto}" + DEPENDS "${gt_proto}" +) + +# Include generated *.pb.h files +include_directories("${CMAKE_CURRENT_BINARY_DIR}") +include_directories(/usr/include/dbus-1.0/) +include_directories(/usr/lib64/dbus-1.0/include/) +include_directories(${CMAKE_CURRENT_BINARY_DIR}/../include) + +# Introduce variables: +# - CMAKE_INSTALL_LIBDIR +# - CMAKE_INSTALL_BINDIR +# - CMAKE_INSTALL_INCLUDEDIR +include(GNUInstallDirs) + + +set(TEECC_NAME "teecc") +set(LIB_TEECC + ${PROJECT_SOURCE_DIR}/teecc.cc + ${gt_grpc_srcs} + ${gt_proto_srcs} +) +# Install Headers: +set(HEADERS_TEECC + ${PROJECT_SOURCE_DIR}/include/teecc/teec_client_api.h + ${PROJECT_SOURCE_DIR}/include/teecc/tee_client_constants.h + ${PROJECT_SOURCE_DIR}/include/teecc/tee_client_list.h + ${PROJECT_SOURCE_DIR}/include/teecc/tee_client_log.h + ${PROJECT_SOURCE_DIR}/include/teecc/tee_client_type.h +) +install( + FILES ${HEADERS_TEECC} + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${TEECC_NAME}/${TARGET_NAME}" +) + + +# gt_grpc_proto +add_library(gt_grpc_proto + ${gt_grpc_srcs} + ${gt_grpc_hdrs} + ${gt_proto_srcs} + ${gt_proto_hdrs} +) +target_link_libraries(gt_grpc_proto + ${_REFLECTION} + ${_GRPC_GRPCPP} + ${_PROTOBUF_LIBPROTOBUF} +) + + + +add_library(teecc SHARED + ${LIB_TEECC} +) +target_link_libraries(teecc + gt_grpc_proto + ${_REFLECTION} + ${_GRPC_GRPCPP} + ${_PROTOBUF_LIBPROTOBUF} + yaml-cpp.a +) + +# Install lib +install( + TARGETS "teecc" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" +) +# Install config file +set(teecc_config_dir "$ENV{HOME}/.teecc") +# install( +# DIRECTORY +# DESTINATION ${gpp_config_dir}) +install( + FILES "conf/teecc_config.yaml" + DESTINATION ${teecc_config_dir} +) +# Install certs +set(teecc_certs_dir "$ENV{HOME}/.teecc/certs") +install( + FILES + "certs/ca_crt.pem" + "certs/client_key.pem" + "certs/client_crt.pem" + "certs/gen_client_keycsr.sh" + "certs/msg.txt" + "certs/check_ca_crt.sh" + "certs/check_client_key.sh" + "certs/check_client_crt.sh" + DESTINATION ${teecc_certs_dir} +) diff --git a/cc-resource-pooling/teeproxy/libteecc/build/cmake.sh b/cc-resource-pooling/teeproxy/libteecc/build/cmake.sh new file mode 100644 index 0000000..4511f00 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/build/cmake.sh @@ -0,0 +1,3 @@ +# cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR .. +cmake -DCMAKE_BUILD_TYPE=Debug .. + diff --git a/cc-resource-pooling/teeproxy/libteecc/certs/ca_crt.pem b/cc-resource-pooling/teeproxy/libteecc/certs/ca_crt.pem new file mode 100644 index 0000000..c1f851a --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/certs/ca_crt.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDozCCAougAwIBAgIUZoRrQX6TrtP0Reyf9DbHVJRNDoQwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBUh1YmVpMQ4wDAYDVQQHDAVXdWhh +bjESMBAGA1UECgwJVHJ1c3RDdXRlMQ0wCwYDVQQLDARnUlBDMQ8wDQYDVQQDDAZj +YS5vcmcwHhcNMjIwODIwMDQ1OTUyWhcNMzIwODE3MDQ1OTUyWjBhMQswCQYDVQQG +EwJDTjEOMAwGA1UECAwFSHViZWkxDjAMBgNVBAcMBVd1aGFuMRIwEAYDVQQKDAlU +cnVzdEN1dGUxDTALBgNVBAsMBGdSUEMxDzANBgNVBAMMBmNhLm9yZzCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMYdYD9GChLzSOWmaIcHMqx8itp/7Zvx +7y2qgb23EWCWIz01kPQaCXpuSOi38dFipXFBWo5o3GaezIoSCp66eN3kHGpcluu2 +0nbyh7zdUVCSXhNWbEiwlhC53DDs2SBYWr2KGTRDEcJEXli110v8sEGZQvkj3XGF +B6IbTczMbhpVfJ82RMqGqNYSJ5jCvqw3XOX6xoN4CP3PuAKC6MtEkLLkXQOS72oL +TSE9XoZNqlyhmymAVwQwCV1zT28W/hwKbCN4tVoO+1bwc3togNYO0W7x1GgOoNoZ +va1UNDX1sfW6B041TgSTGQ0OhGzgKWadKHm2UpG2d5NLkaiBUPpvuokCAwEAAaNT +MFEwHQYDVR0OBBYEFKrFU5qoBe2AkvvTiOfwY24T36zTMB8GA1UdIwQYMBaAFKrF +U5qoBe2AkvvTiOfwY24T36zTMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACjfqOa6G596NbFfAAhBFFS+RIueRWdDkBxR7kk+eQ3Z5j4hIBmrA0OS +R6KCrvmvnXxqSBRmuwRfs0e7G76jkUAFFHkslTPLwgklWCarsGXeAkrdgQU7WL4n +NYBNnjUNK11JREUdAXgvzyuLOhjf4l5UvhujWivhviChFB8xpTQfq2d1oE9jsotv +r2opic4ynu69LXd8HZiShabXgQ60/BNOX8D+wb1YzoZlUCKzSH15QRuuEbkj4/Hy +R2+qxUODbuwfqI4fkOvQIIrD2NO89nHpWFtui4ByQEQaeTesus8M8corCekrxr08 +VkxuOGg2U3zWUlLuSZMD2G7KWuDXU78= +-----END CERTIFICATE----- diff --git a/cc-resource-pooling/teeproxy/libteecc/certs/check_ca_crt.sh b/cc-resource-pooling/teeproxy/libteecc/certs/check_ca_crt.sh new file mode 100644 index 0000000..83cffa1 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/certs/check_ca_crt.sh @@ -0,0 +1,42 @@ +#! /bin/sh +# Purpose: Alert sysadmin/developer about the cert expiry date in advance +# Author: under license +# ------------------------------------------------------------------------------- + + +_openssl="openssl" + + +# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem +# REGENCRTSCRIPT=${HOME}/gen_ca_crt.sh +CUR_DIR=$( dirname -- "$0"; ) +CACRTPEM=$CUR_DIR/ca_crt.pem +REGENCRTSCRIPT=${CUR_DIR}/gen_ca_crt.sh + +# 7 days in seconds +DAYS="604800" + +# Email settings +_sub=$CACRTPEM" will expire within $DAYS seconds (7 days)" +# _sub="${CACRTPEM} will expire within $DAYS seconds (7 days)" +_from="system-account@your-dommain" +_to="sysadmin@your-domain" + +echo -e '\n'get date of $CACRTPEM: +openssl x509 -in $CACRTPEM -noout -dates + +echo -e '\n'check expiry of $CACRTPEM: +$_openssl x509 -enddate -noout -in "$CACRTPEM" -checkend "$DAYS" +$_openssl x509 -enddate -noout -in "$CACRTPEM" -checkend "$DAYS" | grep -q 'Certificate will expire' +# If will expire, regenerate key and certifcate +# // , and send email +if [ $? -eq 0 ] +then + echo "${_sub}" + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${REGENCRTSCRIPT} +fi diff --git a/cc-resource-pooling/teeproxy/libteecc/certs/check_client_crt.sh b/cc-resource-pooling/teeproxy/libteecc/certs/check_client_crt.sh new file mode 100644 index 0000000..769041a --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/certs/check_client_crt.sh @@ -0,0 +1,43 @@ +#! /bin/sh +# Purpose: Alert sysadmin/developer about the cert expiry date in advance +# Author: under license +# ------------------------------------------------------------------------------- + + +_openssl="openssl" + + +# CRTPEM=$HOME/.gpp/certs/client_crt.pem +# REGENCRTSCRIPT=${HOME}/gen_client_crt.sh +CUR_DIR=$( dirname -- "$0"; ) +CRTPEM=$CUR_DIR/client_crt.pem +REGENCRTSCRIPT=${CUR_DIR}/gen_client_crt.sh + +# 7 days in seconds +DAYS="604800" + +# Email settings +_sub=$CRTPEM" will expire within $DAYS seconds (7 days)" +# _sub="${CRTPEM} will expire within $DAYS seconds (7 days)" +_from="system-account@your-dommain" +_to="sysadmin@your-domain" + + +echo -e '\n'get date of $CRTPEM: +openssl x509 -in $CRTPEM -noout -dates + +echo -e '\n'check expiry of $CRTPEM: +$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" +$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" | grep -q 'Certificate will expire' +# If will expire, regenerate key and certifcate +# // , and send email +if [ $? -eq 0 ] +then + echo "${_sub}" + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${REGENCRTSCRIPT} +fi diff --git a/cc-resource-pooling/teeproxy/libteecc/certs/check_client_key.sh b/cc-resource-pooling/teeproxy/libteecc/certs/check_client_key.sh new file mode 100644 index 0000000..c62d32c --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/certs/check_client_key.sh @@ -0,0 +1,62 @@ +#! /bin/sh +# Purpose: Alert sysadmin/developer about the interity of key in advance +# Author: under license +# ------------------------------------------------------------------------------- + + +_openssl="openssl" + + +# KEYPEM=$HOME/.gpp/certs/client_key.pem +# PUBPEM=$HOME/.gpp/certs/client_pubkey.pem +# CRTPEM=$HOME/.gpp/certs/client_crt.pem +# MSGTXT=$HOME/.gpp/certs/msg.txt +# MSGSIG=$HOME/.gpp/certs/msg.sig +# GENKEYCRTSCRIPT=${HOME}/.gpp/certs/gen_client_keycrt.sh +CUR_DIR=$( dirname -- "$0"; ) +KEYPEM=$CUR_DIR/client_key.pem +PUBPEM=$CUR_DIR/client_pubkey.pem +CRTPEM=$CUR_DIR/client_crt.pem +MSGTXT=${CUR_DIR}/msg.txt +MSGSIG=${CUR_DIR}/msg.sig +GENKEYCRTSCRIPT=${CUR_DIR}/gen_client_keycrt.sh + +echo -e '\n'check integrity of ${KEYPEM}: +# ${_openssl} rsa -in ${KEYPEM} -passin pass:111111 -check -noout +# ${_openssl} rsa -in ${KEYPEM} -check -noout +${_openssl} rsa -in ${KEYPEM} -check -noout | grep -q 'RSA key ok' +if [ $? -ne 0 ] +then + echo "the integrity of "${KEYPEM}" is broken" + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${GENKEYCRTSCRIPT} +else + echo -e "RSA key ok" +fi + +echo -e '\n'use private ${KEYPEM} to sign ${MSGTXT}: +# ${_openssl} dgst -sha256 -sign ${KEYPEM} -passin pass:111111 -out msg.sig msg.txt +${_openssl} dgst -sha256 -sign ${KEYPEM} -out ${MSGSIG} ${MSGTXT} + +echo -e '\n'get public key from ${CRTPEM}: +${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} + +echo -e '\n'use public key in ${CRTPEM} to verify signature of ${MSGTXT}: +# ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt +${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} +${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} | grep -q 'Verified OK' +if [ $? -ne 0 ] +then + echo ${KEYPEM}" is not matched with "${CRTPEM} + # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" + # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # + # source ~/bin/cli_app.sh + # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null + + # bash ${GENKEYCRTSCRIPT} +fi +rm -f ${PUBPEM} diff --git a/cc-resource-pooling/teeproxy/libteecc/certs/client_crt.pem b/cc-resource-pooling/teeproxy/libteecc/certs/client_crt.pem new file mode 100644 index 0000000..4056b74 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/certs/client_crt.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDTzCCAjcCFD3UsYh/aU1yUsNsej6x2MjHaxBOMA0GCSqGSIb3DQEBCwUAMGEx +CzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIdWJlaTEOMAwGA1UEBwwFV3VoYW4xEjAQ +BgNVBAoMCVRydXN0Q3V0ZTENMAsGA1UECwwEZ1JQQzEPMA0GA1UEAwwGY2Eub3Jn +MB4XDTIyMDgyMDA1MDYzNVoXDTMyMDgxNzA1MDYzNVowZzELMAkGA1UEBhMCQ04x +DjAMBgNVBAgMBUh1YmVpMQ4wDAYDVQQHDAVXdWhhbjESMBAGA1UECgwJVHJ1c3RD +dXRlMQ0wCwYDVQQLDARnUlBDMRUwEwYDVQQDDAxncGNsaWVudC5vcmcwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCi8gFUTU1Fd5quFIUvmO/ViRrN416n +EaDyzt1qFfMU7CMyp6vmw5+xb7+z0bsSlucdCtWTHNFBt7ovZuAuUqRHAUm6Of7B +JNCpLY9aaWnhhwfCBO20wQs82djcMhVpWLfWAwUTrdkPubVpC+5pKUM1e7qWkF5Y +72edrtYjBkmhteq5mc3sZyHz4W0BjdO7vnYJ1PSqNvZt+z5krV1KNJ9D+HPC6CjH +syugS7hYSBVSMvGRk/B6VhhjcEV4QABZV7tCt1z9pfV28N7ODFw3kPbZo1rgAd+O +Os0XaUJx/exoVj9Ky93SPyIVh/pNdNtUFaoSx9VGg8osBFawPDEagPD3AgMBAAEw +DQYJKoZIhvcNAQELBQADggEBAIigZPrS0XsUQ38SSCSjMmqRx4bJcAdjkFnmwCAf +NiEjfdreKF67ID/DuXwNUSp0imNnlpb8Zvim4TiSU+YoT6zPr1o9+KTiE0FHK+lE ++FTyNlKthbIC+x0hShFSQFoxjQzPZXQNcSWWHiGbapzjW5VTa807YUp7rmXopvrP +f3gTw6gzuZKUN+FSTv284kEqrPYA4KsuLJgsZz78uaH1RgHnRwqCRmwNdBLI2Mr8 ++G/mVOL/3gmi87mhqXdxWjCnoPQN+3stop8ZaZOPKtkR9e1vbdPfNZhuUTCG45zf +AyhVFCa2ykfFTE7rP10iGLH8Ek7AYOueImH3esVB5KpJSzM= +-----END CERTIFICATE----- diff --git a/cc-resource-pooling/teeproxy/libteecc/certs/client_key.pem b/cc-resource-pooling/teeproxy/libteecc/certs/client_key.pem new file mode 100644 index 0000000..d0a2b54 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/certs/client_key.pem @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-192-CBC,4C084D8A0A073B8F63DD51AEE7F3EF9F + +mQNTKrxaKmWUhzJxNTW9Q74HZ+e9q+oJ1NqlkM5+qQTdoXo/JAblgSDuAWWRby1Y +RgmoFerqp+MDu8SpOHpWr0msvUgGSZ8tDrcjw4762qEnu/aT+q1FAq7tHM1waOtK +Euse0FFXrN4a0vesjQi3u/N4lrv53cl9fXDfg/eVhn+MncrR6sQo+XzhDPskKKhU +ecMn2cEtfb9ozXkSU3VfmOukM6FeA6zIcEr8QjLIP1n258TJmoxilUdebacZZZoO +N2t1gzTLxXmvUKYBt7CIJOeJhY8edQHByUQGCjzt2ZV3hv1AX+eNGYN5Sod/76aT +VbJhKgSXI4necPSc5l8UWV304gQEqcVk+aCyZJiXBF3Z46Fqw8LOQV0llsAsjiPs +llLbKQay8/NeF9XWRKclMeuDfQnU5qGuBblfM5YjWZqmxkC9MFVYgPrMrIxqXZnV +/ZTiApFvE25HJBlbiBo2JIv1jTWRduedq2XchtyUVUCcJ+U0xutpQ3A862Kygaa3 +IBA61BgpmJyrE7V2obgH+W6dY2D5N8W1PVFGONiCdU2ejXXuzuRT+0+TYfkvZHaR +dIvQwF35hzm4GlpHU73q/ZO5axqkPpyaLb6Y8I2+8JZi7Ns2eWjGRNjvs9kbOd0N +WI5JkjYdTPXDAjxA6pOntD2yx0Da9hgPbRf3HBazHUQg8RUQGRg9+mkJOfK720l0 +8DEUq29CUvYfAcWT+bIcZL+DDoHmLmNRi//+tmC0kRs9goRmm8FmgXSl8mQfAm4K +IYBFOd2KEmKItPklCuGWhzneri4qVAzhI8fODGzyLNaEXJkn2CFavgQRo2LIL26V +hGMiafuvtoQOj3HJg9yf5rinodo8agtxlnN0ZI5Li377b9vHJqLBvNdotpscXZk5 +qTlBeWhznFbK+p/VOESk1Lav2oFO7nxph6pV3gOhgRON2BMRp3LlqBsbLaxiNcp2 +RuQSp8QjBOypldmHn1SmTMXqlTxYI7/nzJrLOzlVGOkPJjDeZ3Kf9mvnXsolxjlS +GrhrBcdypG0bsQZO7PcqXr4p9NSlZZHHZXu78hvWZszoWWNHSUdpqnwnxHAn4AsK +X2Ge1n/XBzYCtXbofhjB7uaUqIdoR3O0CaWxl/MKw89v+64tU90fTzbSqKScmBgZ +oM7MEgdRQ/MmJ1kGb9GLVbJuhLdfwocjzRAFyrMI1jScSKP61qqwBNbxDe1n/zC/ +6OPQYh4g35kLBYR/Aht/9KlZ6Yfu5/bX4VZZ+ZgM3skryJsidafdNLttjVz8Nm5l +aqrJepxmCBuUz1r274gtTewEyjLHGkaoUSJ/Z+Q8P99dJ0mnp3yXghx3FNQCdKzU +gqjLk6tauCith9OEskzoZcOPNiigIaqY5J9JWr0VRscOkKaPHFo4rYK9GFBc+WlP +oaUbpBqxG1aGwida62l5gXJ3s9L7GHdea/7J/QJHu4bqWrBJ+PCwqkjaJdvnpIiI +EdcQXy3wbQJPkP2HdusF/FnC/9aSk4PR+X6gX+owDD/qAKNurss7XP0yHm4PRKI9 +kLa/+8sfFNCsny9KJTRYRV8lWz0sag52c3qUlZSRD/63ghKEI2mZdcouTMabCS4F +-----END RSA PRIVATE KEY----- diff --git a/cc-resource-pooling/teeproxy/libteecc/certs/gen_client_keycsr.sh b/cc-resource-pooling/teeproxy/libteecc/certs/gen_client_keycsr.sh new file mode 100644 index 0000000..cbf8077 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/certs/gen_client_keycsr.sh @@ -0,0 +1,22 @@ +#! /bin/sh + +_openssl="openssl" + +CUR_DIR=$( dirname -- "$0"; ) + + +# KEYPEM=$HOME/.teecc/certs/client_key.pem +# CSRPEM=$HOME/.teecc/certs/client_csr.pem +KEYPEM=$CUR_DIR/client_key.pem +CSRPEM=$CUR_DIR/client_csr.pem +RSAKEYLEN=2048 +SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=gpclient.org" + +echo -e '\n'generate $KEYPEM: +# $_openssl genrsa -passout pass:111111 -aes192 -out $KEYPEM ${RSAKEYLEN} +$_openssl genrsa -aes192 -out $KEYPEM ${RSAKEYLEN} + +echo -e '\n'generate certgen request $CSRPEM: +# $_openssl req -passin pass:111111 -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} +$_openssl req -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} + diff --git a/cc-resource-pooling/teeproxy/libteecc/certs/msg.txt b/cc-resource-pooling/teeproxy/libteecc/certs/msg.txt new file mode 100644 index 0000000..93388ad --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/certs/msg.txt @@ -0,0 +1 @@ +verify the integrity of a certificate and private key pair diff --git a/cc-resource-pooling/teeproxy/libteecc/changelog.md b/cc-resource-pooling/teeproxy/libteecc/changelog.md new file mode 100644 index 0000000..f66c4e1 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/changelog.md @@ -0,0 +1,7 @@ +# 更新日志 + +## [1.0.0] - 2022-10-11 + +### 新增 + +* 项目初始化,上传第一版 diff --git a/cc-resource-pooling/teeproxy/libteecc/common.cmake b/cc-resource-pooling/teeproxy/libteecc/common.cmake new file mode 100644 index 0000000..62099c5 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/common.cmake @@ -0,0 +1,129 @@ +# Copyright 2018 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# cmake build file for C++ route_guide example. +# Assumes protobuf and gRPC have been installed using cmake. +# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build +# that automatically builds all the dependencies before building route_guide. + +cmake_minimum_required(VERSION 3.5.1) + +# set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD 14) + +set (GRPC_FETCHCONTENT 1) + + +if(MSVC) + add_definitions(-D_WIN32_WINNT=0x600) +endif() + +find_package(Threads REQUIRED) + +if(GRPC_AS_SUBMODULE) + # One way to build a projects that uses gRPC is to just include the + # entire gRPC project tree via "add_subdirectory". + # This approach is very simple to use, but the are some potential + # disadvantages: + # * it includes gRPC's CMakeLists.txt directly into your build script + # without and that can make gRPC's internal setting interfere with your + # own build. + # * depending on what's installed on your system, the contents of submodules + # in gRPC's third_party/* might need to be available (and there might be + # additional prerequisites required to build them). Consider using + # the gRPC_*_PROVIDER options to fine-tune the expected behavior. + # + # A more robust approach to add dependency on gRPC is using + # cmake's ExternalProject_Add (see cmake_externalproject/CMakeLists.txt). + + # Include the gRPC's cmake build (normally grpc source code would live + # in a git submodule called "third_party/grpc", but this example lives in + # the same repository as gRPC sources, so we just look a few directories up) + add_subdirectory(../../.. ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL) + message(STATUS "Using gRPC via add_subdirectory.") + + # After using add_subdirectory, we can now use the grpc targets directly from + # this build. + set(_PROTOBUF_LIBPROTOBUF libprotobuf) + set(_REFLECTION grpc++_reflection) + if(CMAKE_CROSSCOMPILING) + find_program(_PROTOBUF_PROTOC protoc) + else() + set(_PROTOBUF_PROTOC $) + endif() + set(_GRPC_GRPCPP grpc++) + if(CMAKE_CROSSCOMPILING) + find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) + else() + set(_GRPC_CPP_PLUGIN_EXECUTABLE $) + endif() +elseif(GRPC_FETCHCONTENT) + # Another way is to use CMake's FetchContent module to clone gRPC at + # configure time. This makes gRPC's source code available to your project, + # similar to a git submodule. + message(STATUS "Using gRPC via add_subdirectory (FetchContent).") + include(FetchContent) + FetchContent_Declare( + grpc + GIT_REPOSITORY https://github.com/grpc/grpc.git + # when using gRPC, you will actually set this to an existing tag, such as + # v1.25.0, v1.26.0 etc.. + # For the purpose of testing, we override the tag used to the commit + # that's currently under test. + # GIT_TAG vGRPC_TAG_VERSION_OF_YOUR_CHOICE + GIT_TAG v1.48.0 + ) + FetchContent_MakeAvailable(grpc) + + # Since FetchContent uses add_subdirectory under the hood, we can use + # the grpc targets directly from this build. + set(_PROTOBUF_LIBPROTOBUF libprotobuf) + set(_REFLECTION grpc++_reflection) + set(_PROTOBUF_PROTOC $) + set(_GRPC_GRPCPP grpc++) + if(CMAKE_CROSSCOMPILING) + find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) + else() + set(_GRPC_CPP_PLUGIN_EXECUTABLE $) + endif() +else() + # This branch assumes that gRPC and all its dependencies are already installed + # on this system, so they can be located by find_package(). + + # Find Protobuf installation + # Looks for protobuf-config.cmake file installed by Protobuf's cmake installation. + set(protobuf_MODULE_COMPATIBLE TRUE) + find_package(Protobuf CONFIG REQUIRED) + message(STATUS "Using protobuf ${Protobuf_VERSION}") + + set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) + set(_REFLECTION gRPC::grpc++_reflection) + if(CMAKE_CROSSCOMPILING) + find_program(_PROTOBUF_PROTOC protoc) + else() + set(_PROTOBUF_PROTOC $) + endif() + + # Find gRPC installation + # Looks for gRPCConfig.cmake file installed by gRPC's cmake installation. + find_package(gRPC CONFIG REQUIRED) + message(STATUS "Using gRPC ${gRPC_VERSION}") + + set(_GRPC_GRPCPP gRPC::grpc++) + if(CMAKE_CROSSCOMPILING) + find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) + else() + set(_GRPC_CPP_PLUGIN_EXECUTABLE $) + endif() +endif() diff --git a/cc-resource-pooling/teeproxy/libteecc/conf/teecc_config.yaml b/cc-resource-pooling/teeproxy/libteecc/conf/teecc_config.yaml new file mode 100644 index 0000000..a9cfe64 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/conf/teecc_config.yaml @@ -0,0 +1,10 @@ +GPPROXY_ADDRESS: "gpserver.org:50051" + +NAME_SERVERCA_CERT: "ca_crt.pem" +NAME_CLIENT_KEY: "client_key.pem" +NAME_CLIENT_CERT: "client_crt.pem" + +# 0, no tls +# 1, only server certificate +# 2, server and client certificates +GRPC_TLS: 1 diff --git a/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_api.h b/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_api.h new file mode 100644 index 0000000..2cdc80a --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_api.h @@ -0,0 +1,184 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved. + * iTrustee licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: TEE client API definitions + */ + +#ifndef _TEE_CLIENT_API_H_ +#define _TEE_CLIENT_API_H_ + +#ifndef LOG_TAG +#define LOG_TAG NULL +#endif + +#ifdef LOG_NDEBUG +#undef LOG_NDEBUG +#endif +#define LOG_NDEBUG 0 + +#include +#include "tee_client_type.h" +#include "tee_client_log.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define S_VAR_NOT_USED(variable) do { (void)(variable); } while (0) + +#define TEEC_PARAM_TYPES(param0Type, param1Type, param2Type, param3Type) \ + ((param3Type) << 12 | (param2Type) << 8 | (param1Type) << 4 | (param0Type)) + +#define TEEC_PARAM_TYPE_GET(paramTypes, index) \ + (((paramTypes) >> (4*(index))) & 0x0F) + +#define TEEC_VALUE_UNDEF 0xFFFFFFFF + +/* + * initializes a new TEE Context, forming a connection between this Client Application and the TEE + * + * @param name [IN] TEE name (unused) + * @param context [IN/OUT] pointer to TEEC_Context to be initialized + * + * @return TEEC_SUCCESS operation success + * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter + * @return TEEC_ERROR_GENERIC system error unhandled + */ +TEEC_Result TEEC_InitializeContext( + const char *name, + TEEC_Context *context); + +/* + * finalizes an initialized TEE Context, closing the connection between the Client Application and the TEE + * + * @param context [IN/OUT] pointer to TEEC_Context initialized by TEEC_InitializeContext + * + * @return void + */ +void TEEC_FinalizeContext( + TEEC_Context *context); + +/* + * opens a new Session between the Client Application and the specified Trusted Application + * + * @param context [IN/OUT] a pointer to an initialized TEE Context + * @param session [OUT] a pointer to a Session structure to be opened + * @param destination [IN] a pointer to a structure containing the UUID of the destination Trusted Application + * @param connectionMethod [IN] the method of connection to use + * @param connectionData [IN] any necessary data required to support the connection method + * @param operation [IN/OUT] a pointer to an Operation containing a set of Parameters to exchange with the + * Trusted Application + * @param returnOrigin [IN/OUT] a pointer to a variable which will contain the return origin, This field may be NULL + * if the return origin is not needed + * + * @return TEEC_SUCCESS operation success + * @return TEEC_ERROR_BAD_PARAMETERS invalid parametercontext or session or destination is NULL + * @return TEEC_ERROR_ACCESS_DENIED client Application's connection request is denied + * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use + * @return TEEC_ERROR_TRUSTED_APP_LOAD_ERROR load Trusted Application failed + * @return others refer TEEC_ReturnCode + */ +TEEC_Result TEEC_OpenSession( + TEEC_Context *context, + TEEC_Session *session, + const TEEC_UUID *destination, + uint32_t connectionMethod, + const void *connectionData, + TEEC_Operation *operation, + uint32_t *returnOrigin); + +/* + * closes a Session which has been opened with a Trusted Application + * + * @param session [IN/OUT] pointer to a session to be closed + * + * @return void + */ +void TEEC_CloseSession( + TEEC_Session *session); + +/* + * invokes a Command within the specified Session + * + * @param session [IN/OUT] the open Session in which the command will be invoked + * @param commandID [IN] the identifier of the Command within the Trusted Application to invoke + * @param operation [IN/OUT] a pointer to a Client Application initialized TEEC_Operation structure + * @param returnOrigin [IN/OUT] a pointer to a variable which will contain the return origin + * + * @return TEEC_SUCCESS operation success + * @return TEEC_ERROR_BAD_PARAMETERS invalid parametersession is NULL or operation data invalid + * @return TEEC_ERROR_ACCESS_DENIED invoke command operation is denied + * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use + * @return others refer TEEC_ReturnCode + */ +TEEC_Result TEEC_InvokeCommand( + TEEC_Session *session, + uint32_t commandID, + TEEC_Operation *operation, + uint32_t *returnOrigin); + +/* + * registers a block of existing Client Application memory as a block of Shared Memory within + * the scope of the specified TEE Context, in accordance with the parameters which have been set by the + * Client Application inside the sharedMem structure (don't support 0 size data) + * + * @param context [IN/OUT] a pointer to an initialized TEE Context + * @param sharedMem [IN/OUT] a pointer to a Shared Memory structure to register + * + * @return TEEC_SUCCESS operation success + * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter, context or sharedMem is NULL + */ +TEEC_Result TEEC_RegisterSharedMemory( + TEEC_Context *context, + TEEC_SharedMemory *sharedMem); + +/* + * allocates a new block of memory as a block of Shared Memory within the scope of the specified TEE Context + * size of sharedMem should not be 0 + * + * @param context [IN/OUT] a pointer to an initialized TEE Context + * @param sharedMem [IN/OUT] a pointer to a Shared Memory structure to allocate + * + * @return TEEC_SUCCESS operation success + * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter, context or sharedMem is NULL + * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use + */ +TEEC_Result TEEC_AllocateSharedMemory( + TEEC_Context *context, + TEEC_SharedMemory *sharedMem); + +/* + * deregisters or deallocates a previously initialized block of Shared Memory + * if memory is allocated by TEEC_AllocateSharedMemory, system will free this memory + * if memory is registered by TEEC_RegisterSharedMemory, system will not free this memory + * + * @param sharedMem [IN/OUT] a pointer to a valid Shared Memory structure + * + * @return void + */ +void TEEC_ReleaseSharedMemory( + TEEC_SharedMemory *sharedMem); + +/* + * requests the cancellation of a pending open Session operation or a Command invocation operation + * this operation is not supported currently + * + * @param operation [IN/OUT] a pointer to a Client Application instantiated Operation structure + * + * @return void + */ +void TEEC_RequestCancellation( + TEEC_Operation *operation); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_constants.h b/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_constants.h new file mode 100644 index 0000000..eb31c89 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_constants.h @@ -0,0 +1,165 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved. + * iTrustee licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: static definitions of client API + */ + +#ifndef _TEE_CLIENT_CONSTANTS_H_ +#define _TEE_CLIENT_CONSTANTS_H_ + +enum TEEC_ReturnCode { + TEEC_SUCCESS = 0x0, /* success */ + TEEC_ERROR_INVALID_CMD, /* invalid command */ + TEEC_ERROR_SERVICE_NOT_EXIST, /* target service is not exist */ + TEEC_ERROR_SESSION_NOT_EXIST, /* session between client and service is not exist */ + TEEC_ERROR_SESSION_MAXIMUM, /* exceed max num of sessions */ + TEEC_ERROR_REGISTER_EXIST_SERVICE, /* cannot register the service which already exist */ + TEEC_ERROR_TAGET_DEAD_FATAL, /* system error occurs in TEE */ + TEEC_ERROR_READ_DATA, /* failed to read data in file */ + TEEC_ERROR_WRITE_DATA, /* failed to write data to file */ + TEEC_ERROR_TRUNCATE_OBJECT, /* data is truncated */ + TEEC_ERROR_SEEK_DATA, /* failed to seek data in file */ + TEEC_ERROR_FSYNC_DATA, /* failed to sync data in file */ + TEEC_ERROR_RENAME_OBJECT, /* failed to rename file */ + TEEC_ERROR_TRUSTED_APP_LOAD_ERROR, /* failed to load Trusted Application */ + TEEC_ERROR_GENERIC = 0xFFFF0000, /* generic error occurs */ + TEEC_ERROR_ACCESS_DENIED = 0xFFFF0001, /* permission check failed, in initilize context or + open session or invoke commnad */ + TEEC_ERROR_CANCEL = 0xFFFF0002, /* operation is already canceled */ + TEEC_ERROR_ACCESS_CONFLICT = 0xFFFF0003, /* confilct occurs in concurrent access to data, + error occurs in file operaions generally */ + TEEC_ERROR_EXCESS_DATA = 0xFFFF0004, /* exceed max data to be handled by system */ + TEEC_ERROR_BAD_FORMAT = 0xFFFF0005, /* data format is invalid, Trusted Application cannot + handle it */ + TEEC_ERROR_BAD_PARAMETERS = 0xFFFF0006, /* invalid parameters */ + TEEC_ERROR_BAD_STATE = 0xFFFF0007, /* operation failed in current state, when try to access + storage without initilize storage service */ + TEEC_ERROR_ITEM_NOT_FOUND = 0xFFFF0008, /* cannot find target item */ + TEEC_ERROR_NOT_IMPLEMENTED = 0xFFFF0009, /* request operation is not implemented */ + TEEC_ERROR_NOT_SUPPORTED = 0xFFFF000A, /* request operation is not supported */ + TEEC_ERROR_NO_DATA = 0xFFFF000B, /* no data present for current operation */ + TEEC_ERROR_OUT_OF_MEMORY = 0xFFFF000C, /* system resource if out of use */ + TEEC_ERROR_BUSY = 0xFFFF000D, /* system is too busy to handle current operation */ + TEEC_ERROR_COMMUNICATION = 0xFFFF000E, /* error occurs when client try to communicate + with Trusted Application */ + TEEC_ERROR_SECURITY = 0xFFFF000F, /* security error occurs */ + TEEC_ERROR_SHORT_BUFFER = 0xFFFF0010, /* out buffer is not enough for current request */ + TEEC_ERROR_MAC_INVALID = 0xFFFF3071, /* MAC value check failed */ + TEEC_ERROR_TARGET_DEAD = 0xFFFF3024, /* Trusted Application is crashed */ + TEEC_FAIL = 0xFFFF5002, /* common error */ + TEEC_ERROR_EXTERNAL_CANCEL = 0xFFFF0011, /* used by adapt only, event caused User Interface operation aborted */ + TEEC_ERROR_OVERFLOW = 0xFFFF300F, /* used by adapt only */ + TEEC_ERROR_STORAGE_NO_SPACE = 0xFFFF3041, /* used by adapt only */ + TEEC_ERROR_SIGNATURE_INVALID = 0xFFFF3072, /* used by adapt only */ + TEEC_ERROR_TIME_NOT_SET = 0xFFFF5000, /* used by adapt only */ + TEEC_ERROR_TIME_NEEDS_RESET = 0xFFFF5001, /* used by adapt only */ + + TEEC_ERROR_CONTEXT_NULL = 0xAAAA0001, /* null context */ + TEEC_ERROR_CONTEXT_TAPATH_NULL = 0xAAAA0002, /* null context ta path */ + TEEC_ERROR_PARAM0_TEMPMEM_NULL = 0xAAAA0003, /* null param0 tempmem buf */ + TEEC_ERROR_PARAM0_TEMPMEM_LESS = 0xAAAA0004, /* param0 tempmem buf is less */ + TEEC_ERROR_PARAM1_TEMPMEM_NULL = 0xAAAA0005, /* null param1 tempmem buf */ + TEEC_ERROR_PARAM1_TEMPMEM_LESS = 0xAAAA0006, /* param1 tempmem buf is less */ + TEEC_ERROR_PARAM2_TEMPMEM_NULL = 0xAAAA0007, /* null param2 tempmem buf */ + TEEC_ERROR_PARAM2_TEMPMEM_LESS = 0xAAAA0008, /* param2 tempmem buf is less */ + TEEC_ERROR_PARAM3_TEMPMEM_NULL = 0xAAAA0009, /* null param3 tempmem buf */ + TEEC_ERROR_PARAM3_TEMPMEM_LESS = 0xAAAA000A, /* param3 tempmem buf is less */ + TEEC_ERROR_CONTEXT_LIST_NULL = 0xAAAA000B, /* null context list in woker */ + TEEC_ERROR_NO_CONTEXT_MATCH = 0xAAAA000C, /* no context match in woker */ + TEEC_ERROR_SESSION_LIST_NULL = 0xAAAA000D, /* null session list in woker */ + TEEC_ERROR_NO_SESSION_MATCH = 0xAAAA000E, /* no session match in woker */ + TEEC_ERROR_PARAM0_MEMREF_NULL = 0xAAAA000F, /* null param0 memref buf */ + TEEC_ERROR_PARAM0_MEMREF_LESS = 0xAAAA0010, /* param0 memref buf is less */ + TEEC_ERROR_PARAM1_MEMREF_NULL = 0xAAAA0011, /* null param1 memref buf */ + TEEC_ERROR_PARAM1_MEMREF_LESS = 0xAAAA0012, /* param1 memref buf is less */ + TEEC_ERROR_PARAM2_MEMREF_NULL = 0xAAAA0013, /* null param2 memref buf */ + TEEC_ERROR_PARAM2_MEMREF_LESS = 0xAAAA0014, /* param2 memref buf is less */ + TEEC_ERROR_PARAM3_MEMREF_NULL = 0xAAAA0015, /* null param3 memref buf */ + TEEC_ERROR_PARAM3_MEMREF_LESS = 0xAAAA0016, /* param3 memref buf is less */ + TEEC_ERROR_NO_WORKER_MATCHED = 0xAAAA0017, /* No woker mateched with the context or/and session */ + TEEC_ERROR_SESSION_NULL = 0xAAAA0018, /* null session */ + TEEC_ERROR_NO_SHAREMEMFLAG = 0xAAAA0019, /* no share memmory flag */ + + TEEC_ERROR_JWTVALIDATE_FAIL = 0xAAAA0020, /* jwt validate fail */ + TEEC_ERROR_GRPC_ERROR = 0xAAAA0021, /* grpc transmission error */ + TEEC_ERROR_DBUS_CONN_NULL = 0xAAAA0022, /* dbus connection null */ + TEEC_ERROR_DBUS_NAME_ERROR = 0xAAAA0023, /* dbus name set is error */ + TEEC_ERROR_DBUS_MSG_NULL = 0xAAAA0024, /* dbus message is null */ + TEEC_ERROR_DBUS_APPEND_ERROR = 0xAAAA0025, /* dbus append argument error */ + TEEC_ERROR_DBUS_REPLY_ERROR = 0xAAAA0026, /* dbus send with reply error */ + TEEC_ERROR_DBUS_ARG_NULL = 0xAAAA0027, /* dbus argument is null */ + TEEC_ERROR_DBUS_ARG_TYPE_ERROR = 0xAAAA0028, /* dbus argument type error */ + TEEC_ERROR_TOKEN_NULL = 0xAAAA0029, /* fetch token is null */ + TEEC_ERROR_TOKEN_SIZE_ERROR = 0xAAAA0030, /* token size is error */ + TEEC_ERROR_FETCHJWT_ERROR = 0xAAAA0031, /* fetch jwt error */ + TEEC_INFILE_PATH_NULL = 0xAAAA0032, /* deployta infile path is null*/ + TEEC_INFILE_NOT_FOUND = 0xAAAA0033 /* deployta infile is not found*/ +}; + +enum TEEC_ReturnCodeOrigin { + TEEC_ORIGIN_API = 0x1, /* error occurs in handling client API */ + TEEC_ORIGIN_COMMS = 0x2, /* error occurs in communicating between REE and TEE */ + TEEC_ORIGIN_TEE = 0x3, /* error occurs in TEE */ + TEEC_ORIGIN_TRUSTED_APP = 0x4, /* error occurs in Trusted Application */ +}; + +enum TEEC_SharedMemCtl { + TEEC_MEM_INPUT = 0x1, /* input type of memroy */ + TEEC_MEM_OUTPUT = 0x2, /* output type of memory */ + TEEC_MEM_INOUT = 0x3, /* memory is used as both input and output */ +}; + +enum TEEC_ParamType { + TEEC_NONE = 0x0, /* unused parameter */ + TEEC_VALUE_INPUT = 0x01, /* input type of value, refer TEEC_Value */ + TEEC_VALUE_OUTPUT = 0x02, /* output type of value, refer TEEC_Value */ + TEEC_VALUE_INOUT = 0x03, /* value is used as both input and output, refer TEEC_Value */ + TEEC_MEMREF_TEMP_INPUT = 0x05, /* input type of temp memory reference, refer TEEC_TempMemoryReference */ + TEEC_MEMREF_TEMP_OUTPUT = 0x06, /* output type of temp memory reference, refer TEEC_TempMemoryReference */ + TEEC_MEMREF_TEMP_INOUT = 0x07, /* temp memory reference used as both input and output, + refer TEEC_TempMemoryReference */ + TEEC_ION_INPUT = 0x08, /* input type of icon memory reference, refer TEEC_IonReference */ + TEEC_ION_SGLIST_INPUT = 0x09, /* input type of ion memory block reference, refer TEEC_IonSglistReference */ + TEEC_MEMREF_WHOLE = 0xc, /* use whole memory block, refer TEEC_RegisteredMemoryReference */ + TEEC_MEMREF_PARTIAL_INPUT = 0xd, /* input type of memory reference, refer TEEC_RegisteredMemoryReference */ + TEEC_MEMREF_PARTIAL_OUTPUT = 0xe, /* output type of memory reference, refer TEEC_RegisteredMemoryReference */ + TEEC_MEMREF_PARTIAL_INOUT = 0xf /* memory reference used as both input and output, + refer TEEC_RegisteredMemoryReference */ +}; + +/**************************************************** + * Session Login Methods + ****************************************************/ +enum TEEC_LoginMethod { + TEEC_LOGIN_PUBLIC = 0x0, /* no Login data is provided */ + TEEC_LOGIN_USER, /* Login data about the user running the + Client Application process is provided */ + TEEC_LOGIN_GROUP, /* Login data about the group running + the Client Application process is provided */ + TEEC_LOGIN_APPLICATION = 0x4, /* Login data about the running Client + Application itself is provided */ + TEEC_LOGIN_USER_APPLICATION = 0x5, /* Login data about the user running the + Client Application and about the + Client Application itself is provided */ + TEEC_LOGIN_GROUP_APPLICATION = 0x6, /* Login data about the group running + the Client Application and about the + Client Application itself is provided */ + TEEC_LOGIN_IDENTIFY = 0x7, /* Login data is provided by REE system */ +}; +enum TST_CMD_ID { + TST_CMD_ID_01 = 1, + TST_CMD_ID_02, + TST_CMD_ID_03, + TST_CMD_ID_04, + TST_CMD_ID_05 +}; + +#define TEEC_PARAM_NUM 4 /* teec param max number */ +#endif diff --git a/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_list.h b/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_list.h new file mode 100644 index 0000000..03e295f --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_list.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved. + * iTrustee licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: linked list data types and basic operations + */ + +#ifndef TEE_CLIENT_LIST_H +#define TEE_CLIENT_LIST_H + +struct ListNode { + struct ListNode *next; /* point to next node */ + struct ListNode *prev; /* point to prev node */ +}; + +#define OFFSET_OF(type, member) (unsigned long)(&(((type *)0)->member)) +#define CONTAINER_OF(pos, type, member) (type *)(((char *)(pos)) - OFFSET_OF(type, member)) + +#define LIST_DECLARE(name) \ + struct ListNode name = { \ + .next = &name, \ + .prev = &name, \ + } + +static inline void ListInit(struct ListNode *list) +{ + list->next = list; + list->prev = list; +} + +#define LIST_HEAD(list) ((list)->next) +#define LIST_TAIL(list) ((list)->prev) +#define LIST_EMPTY(list) ((list) == (list)->next) + +static inline void ListInsertHead(struct ListNode *list, struct ListNode *entry) +{ + list->next->prev = entry; + entry->next = list->next; + entry->prev = list; + list->next = entry; +} + +static inline void ListInsertTail(struct ListNode *list, struct ListNode *entry) +{ + entry->next = list; + entry->prev = list->prev; + list->prev->next = entry; + list->prev = entry; +} + +static inline void ListRemoveEntry(struct ListNode *entry) +{ + entry->prev->next = entry->next; + entry->next->prev = entry->prev; +} + +static inline struct ListNode *ListRemoveHead(struct ListNode *list) +{ + struct ListNode *entry = NULL; + if (!LIST_EMPTY(list)) { + entry = list->next; + ListRemoveEntry(entry); + } + return entry; +} + +static inline struct ListNode *ListRemoveTail(struct ListNode *list) +{ + struct ListNode *entry = NULL; + if (!LIST_EMPTY(list)) { + entry = list->prev; + ListRemoveEntry(entry); + } + return entry; +} + +#define LIST_ENTRY(ptr, type, member) \ + ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) + +#define LIST_FOR_EACH(pos, list) \ + for (pos = (list)->next; pos != (list); pos = pos->next) + +#define LIST_FOR_EACH_SAFE(pos, n, list) \ + for ((pos) = (list)->next, (n) = (pos)->next; (pos) != (list); (pos) = (n), (n) = (pos)->next) + +#define LIST_FOR_EACH_ENTRY(pos, list, member) \ + for (pos = LIST_ENTRY((list)->next, typeof(*pos), member); &pos->member != (list); \ + pos = LIST_ENTRY(pos->member.next, typeof(*pos), member)) + +#define LIST_FOR_EACH_ENTRY_SAFE(pos, n, list, member) \ + for (pos = LIST_ENTRY((list)->next, typeof(*pos), member), n = LIST_ENTRY(pos->member.next, typeof(*pos), \ + member); &pos->member != (list); pos = n, n = LIST_ENTRY(n->member.next, typeof(*n), member)) + +#endif diff --git a/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_log.h b/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_log.h new file mode 100644 index 0000000..9ba1fda --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_log.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. + * iTrustee licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: TEE client log api + */ + +#ifndef TEE_CLIENT_LOG_H +#define TEE_CLIENT_LOG_H + +#include + +// #define TEEC_DEBUG + +#ifdef TEEC_DEBUG +#define TEEC_Debug(...) syslog(LOG_USER | LOG_INFO, __VA_ARGS__); +#else +#define TEEC_Debug(...) +#endif + +#define TEEC_Error(...) syslog(LOG_USER | LOG_INFO, __VA_ARGS__); + +#endif diff --git a/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_type.h b/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_type.h new file mode 100644 index 0000000..f590615 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/include/teecc/tee_client_type.h @@ -0,0 +1,150 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved. + * iTrustee licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: data type and structure definition according to GP + */ + +#ifndef _TEE_CLIENT_TYPE_H_ +#define _TEE_CLIENT_TYPE_H_ + +#include +#include +#include +#include +#include "tee_client_list.h" +#include "tee_client_constants.h" + +#ifndef __cplusplus +#ifndef bool +#define bool uint8_t +#endif +#endif + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +typedef enum TEEC_ReturnCode TEEC_Result; + +typedef struct { + uint32_t timeLow; + uint16_t timeMid; + uint16_t timeHiAndVersion; + uint8_t clockSeqAndNode[8]; +} TEEC_UUID; + +typedef struct { + int32_t fd; + uint8_t *ta_path; + struct ListNode session_list; + struct ListNode shrd_mem_list; + union { + struct { + void *buffer; + sem_t buffer_barrier; + } share_buffer; + uint64_t imp; /* for adapt */ + }; +} TEEC_Context; + +typedef struct { + uint32_t session_id; + TEEC_UUID service_id; + uint32_t ops_cnt; + union { + struct ListNode head; + uint64_t imp; /* for adapt */ + }; + TEEC_Context *context; +} TEEC_Session; + +typedef struct { + void *buffer; + uint32_t size; + uint32_t flags; /* reference to TEEC_SharedMemCtl */ + uint32_t ops_cnt; + bool is_allocated; /* identify whether the memory is registered or allocated */ + union { + struct ListNode head; + void* imp; /* for adapt, imp is not used by system CA, only for vendor CA */ + }; + TEEC_Context *context; +} TEEC_SharedMemory; + +/* + * the corresponding param types are + * TEEC_MEMREF_TEMP_INPUT/TEEC_MEMREF_TEMP_OUTPUT/TEEC_MEMREF_TEMP_INOUT + */ +typedef struct { + void *buffer; + uint32_t size; +} TEEC_TempMemoryReference; + +/* + * the corresponding param types are + * TEEC_MEMREF_WHOLE/TEEC_MEMREF_PARTIAL_INPUT + * TEEC_MEMREF_PARTIAL_OUTPUT/TEEC_MEMREF_PARTIAL_INOUT + */ +typedef struct { + TEEC_SharedMemory *parent; + uint32_t size; + uint32_t offset; +} TEEC_RegisteredMemoryReference; + +/* + * the corresponding param types are + * TEEC_VALUE_INPUT/TEEC_VALUE_OUTPUT/TEEC_VALUE_INOUT + */ +typedef struct { + uint32_t a; + uint32_t b; +} TEEC_Value; + +typedef struct { + int ion_share_fd; + uint32_t ion_size; +} TEEC_IonReference; + +typedef union { + TEEC_TempMemoryReference tmpref; + TEEC_RegisteredMemoryReference memref; + TEEC_Value value; + TEEC_IonReference ionref; +} TEEC_Parameter; + +typedef struct { + uint32_t event_type; /* Tui event type */ + uint32_t value; /* return value, is keycode if tui event is getKeycode */ + uint32_t notch; /* notch size of the screen for tui */ + uint32_t width; /* width of foldable screen */ + uint32_t height; /* height of foldable screen */ + uint32_t fold_state; /* state of foldable screen */ + uint32_t display_state; /* one state of folded state */ + uint32_t phy_width; /* real width of the mobile */ + uint32_t phy_height; /* real height of the mobile */ +} TEEC_TUI_Parameter; + +typedef struct { + uint32_t started; /* 0 means cancel this operation, others mean to perform this operation */ + uint32_t paramTypes; /* use TEEC_PARAM_TYPES to construct this value */ + TEEC_Parameter params[TEEC_PARAM_NUM]; + TEEC_Session *session; + bool cancel_flag; +} TEEC_Operation; + +#endif diff --git a/cc-resource-pooling/teeproxy/libteecc/include/teecc/teec_client_api.h b/cc-resource-pooling/teeproxy/libteecc/include/teecc/teec_client_api.h new file mode 100644 index 0000000..996b5e7 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/include/teecc/teec_client_api.h @@ -0,0 +1,192 @@ +#ifndef teec_client_api_h__ +#define teec_client_api_h__ + +#include "tee_client_type.h" +#include "tee_client_log.h" + + +#define TEEC_PARAM_TYPES(param0Type, param1Type, param2Type, param3Type) \ + ((param3Type) << 12 | (param2Type) << 8 | (param1Type) << 4 | (param0Type)) + +#define TEEC_PARAM_TYPE_GET(paramTypes, index) \ + (((paramTypes) >> (4*(index))) & 0x0F) + +#ifdef __cplusplus +extern "C"{ +#endif + +/* + * initializes a new TEE Context, forming a connection between this Client Application and the TEE + * + * @param name [IN] TEE name (unused) + * @param context [IN/OUT] pointer to TEEC_Context to be initialized + * + * @return TEEC_SUCCESS operation success + * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter + * @return TEEC_ERROR_GENERIC system error unhandled + */ +extern TEEC_Result +TEEC_InitializeContext( + const char *name, + TEEC_Context *context); + + +/* + * finalizes an initialized TEE Context, closing the connection between the Client Application and the TEE + * + * @param context [IN/OUT] pointer to TEEC_Context initialized by TEEC_InitializeContext + * @param context_addr [IN] the context address in gp woker process + * + * @return void + */ +extern void +TEEC_FinalizeContext( + TEEC_Context *context); + + +/* + * opens a new Session between the Client Application and the specified Trusted Application + * + * @param context [IN/OUT] a pointer to an initialized TEE Context + * @param context_addr [IN] the context address in gp woker process + * @param session [OUT] a pointer to a Session structure to be opened + * @param destination [IN] a pointer to a structure containing the UUID of the destination Trusted Application + * @param connectionMethod [IN] the method of connection to use + * @param connectionData [IN] any necessary data required to support the connection method + * @param operation [IN/OUT] a pointer to an Operation containing a set of Parameters to exchange with the + * Trusted Application + * @param returnOrigin [IN/OUT] a pointer to a variable which will contain the return origin, This field may be NULL + * if the return origin is not needed + * + * @return TEEC_SUCCESS operation success + * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter£¬context or session or destination is NULL + * @return TEEC_ERROR_ACCESS_DENIED client Application's connection request is denied + * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use + * @return TEEC_ERROR_TRUSTED_APP_LOAD_ERROR load Trusted Application failed + * @return others refer TEEC_ReturnCode + */ +extern TEEC_Result +TEEC_OpenSession( + TEEC_Context *context, + TEEC_Session *session, + const TEEC_UUID *destination, + uint32_t connectionMethod, + const void *connectionData, + TEEC_Operation *operation, + uint32_t *returnOrigin); + + +/* + * closes a Session which has been opened with a Trusted Application + * + * @param session [IN/OUT] pointer to a session to be closed + * + * @return void + */ +extern void +TEEC_CloseSession( + TEEC_Session *session); + + +/* + * invokes a Command within the specified Session + * + * @param session [IN/OUT] the open Session in which the command will be invoked + * @param commandID [IN] the identifier of the Command within the Trusted Application to invoke + * @param operation [IN/OUT] a pointer to a Client Application initialized TEEC_Operation structure + * @param returnOrigin [IN/OUT] a pointer to a variable which will contain the return origin + * + * @return TEEC_SUCCESS operation success + * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter£¬session is NULL or operation data invalid + * @return TEEC_ERROR_ACCESS_DENIED invoke command operation is denied + * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use + * @return others refer TEEC_ReturnCode + */ +extern TEEC_Result +TEEC_InvokeCommand( + TEEC_Session *session, + uint32_t commandID, + TEEC_Operation *operation, + uint32_t *returnOrigin); + + +/* + * allocates a new block of memory as a block of Shared Memory within the scope of the specified TEE Context + * size of sharedMem should not be 0 + * + * @param context [IN/OUT] a pointer to an initialized TEE Context + * @param sharedMem [IN/OUT] a pointer to a Shared Memory structure to allocate + * + * @return TEEC_SUCCESS operation success + * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter, context or sharedMem is NULL + * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use + */ +TEEC_Result TEEC_AllocateSharedMemory( + TEEC_Context *context, + TEEC_SharedMemory *sharedMem); + + +/* + * registers a block of existing Client Application memory as a block of Shared Memory within + * the scope of the specified TEE Context, in accordance with the parameters which have been set by the + * Client Application inside the sharedMem structure (don't support 0 size data) + * + * @param context [IN/OUT] a pointer to an initialized TEE Context + * @param sharedMem [IN/OUT] a pointer to a Shared Memory structure to register + * + * @return TEEC_SUCCESS operation success + * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter, context or sharedMem is NULL + */ +TEEC_Result TEEC_RegisterSharedMemory( + TEEC_Context *context, + TEEC_SharedMemory *sharedMem); + + +/* + * deregisters or deallocates a previously initialized block of Shared Memory + * if memory is allocated by TEEC_AllocateSharedMemory, system will free this memory + * if memory is registered by TEEC_RegisterSharedMemory, system will not free this memory + * + * @param sharedMem [IN/OUT] a pointer to a valid Shared Memory structure + * + * @return void + */ +extern +void TEEC_ReleaseSharedMemory( + TEEC_SharedMemory *sharedMem); + + +/* + */ +extern +TEEC_Result +TEEC_DeployTa( + char * infile_path, + char * subdir, + char * outfile_name +); + + +/* + */ +extern +TEEC_Result +TEEC_SetJwt( + char * token +); + + +/* + */ +extern +TEEC_Result +TEEC_UnsetJwt( +); + + + +#ifdef __cplusplus +} +#endif + +#endif // teec_client_api_h__ diff --git a/cc-resource-pooling/teeproxy/libteecc/protos/gt.proto b/cc-resource-pooling/teeproxy/libteecc/protos/gt.proto new file mode 100644 index 0000000..3eeff06 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/protos/gt.proto @@ -0,0 +1,392 @@ +// + +syntax = "proto3"; + +option java_multiple_files = true; +option java_package = "io.grpc.gt"; +option java_outer_classname = "gtProto"; +option objc_class_prefix = "HLW"; + +package gt; + +// The gpp service definition. +service gpp { + rpc TEECC_InitializeContext (Inicont_Request) returns (Inicont_Reply) {} + rpc TEECC_FinalizeContext (Fincont_Request) returns (Fincont_Reply) {} + rpc TEECC_OpenSession (Opes_Request) returns (Opes_Reply) {} + rpc TEECC_InvokeCommand (Invo_Request) returns (Invo_Reply) {} + rpc TEECC_CloseSession (Close_Request) returns (Close_Reply) {} + rpc TEECC_TA(TA_Chunk) returns (TA_Reply) {} + rpc TEECC_SetJwt(Setjwt_Request) returns (Setjwt_Reply) {} +} + + +message Inicont_Request { + uint64 name_size = 1; + string name = 2; + string token = 3; + string taname = 4; +} + +message Inicont_Reply { + uint32 teecresult = 1; + int32 context_fd = 2; + uint64 context_tapath_outsize = 3; + bytes context_tapath = 4; + uint64 context_sessionlist_next = 5; + uint64 context_sessionlist_prev = 6; + uint64 context_shrdmemlist_next = 7; + uint64 context_shrdmemlist_prev = 8; + uint64 context_sharebuffer_buffer = 9; + int64 context_sharebuffer_bufferbarrier = 10; + uint64 context_addr = 11; + int32 flag = 12; +} + +message Fincont_Request { + int32 in_context_fd = 1; + uint64 in_context_tapath_size= 2; + bytes in_context_tapath = 3; + uint64 in_context_sessionlist_next = 4; + uint64 in_context_sessionlist_prev = 5; + uint64 in_context_shrdmemlist_next = 6; + uint64 in_context_shrdmemlist_prev = 7; + uint64 in_context_sharebuffer_buffer = 8; + int64 in_context_sharebuffer_bufferbarrier = 9; + uint64 in_context_addr = 10; + string token = 11; + string taname = 12; +} + +message Fincont_Reply { + int32 context_fd = 1; + uint64 context_tapath_outsize = 2; + bytes context_tapath = 3; + uint64 context_sessionlist_next = 4; + uint64 context_sessionlist_prev = 5; + uint64 context_shrdmemlist_next = 6; + uint64 context_shrdmemlist_prev = 7; + uint64 context_sharebuffer_buffer = 8; + int64 context_sharebuffer_bufferbarrier = 9; + uint64 context_addr = 10; + int32 flag = 11; +} + +message Opes_Request { + int32 in_context_fd = 1; + uint64 in_context_tapath_size= 2; + bytes in_context_tapath = 3; + uint64 in_context_sessionlist_next = 4; + uint64 in_context_sessionlist_prev = 5; + uint64 in_context_shrdmemlist_next = 6; + uint64 in_context_shrdmemlist_prev = 7; + uint64 in_context_sharebuffer_buffer = 8; + int64 in_context_sharebuffer_bufferbarrier = 9; + uint32 in_destination_timelow = 10; + uint32 in_destination_timemid = 11; + uint32 in_destination_timehiandver = 12; + uint64 in_destination_cad_size = 13; + repeated uint32 in_destination_clockseqandnode = 14; + uint32 in_connectionmethod = 15; + uint64 in_connectiondata = 16; + uint32 in_operation_started = 17; + uint32 in_operation_paramtypes = 18; + uint64 in_operation_param1_tmpref_buffer = 19; + uint32 in_operation_param1_tmpref_size = 20; + uint64 in_operation_param1_memref_parent = 21; + uint32 in_operation_param1_memref_size = 22; + uint32 in_operation_param1_memref_offset = 23; + uint32 in_operation_param1_value_a = 24; + uint32 in_operation_param1_value_b = 25; + int32 in_operation_param1_ionref_ionsharefd = 26; + uint32 in_operation_param1_ionref_ionsize = 27; + uint64 in_operation_param2_tmpref_buffer = 28; + uint32 in_operation_param2_tmpref_size = 29; + uint64 in_operation_param2_memref_parent = 30; + uint32 in_operation_param2_memref_size = 31; + uint32 in_operation_param2_memref_offset = 32; + uint32 in_operation_param2_value_a = 33; + uint32 in_operation_param2_value_b = 34; + int32 in_operation_param2_ionref_ionsharefd = 35; + uint32 in_operation_param2_ionref_ionsize = 36; + uint64 in_operation_param3_tmpref_buffer = 37; + uint32 in_operation_param3_tmpref_size = 38; + uint64 in_operation_param3_memref_parent = 39; + uint32 in_operation_param3_memref_size = 40; + uint32 in_operation_param3_memref_offset = 41; + uint32 in_operation_param3_value_a = 42; + uint32 in_operation_param3_value_b = 43; + int32 in_operation_param3_ionref_ionsharefd = 44; + uint32 in_operation_param3_ionref_ionsize = 45; + uint64 in_operation_param4_tmpref_buffer = 46; + uint32 in_operation_param4_tmpref_size = 47; + uint64 in_operation_param4_memref_parent = 48; + uint32 in_operation_param4_memref_size = 49; + uint32 in_operation_param4_memref_offset = 50; + uint32 in_operation_param4_value_a = 51; + uint32 in_operation_param4_value_b = 52; + int32 in_operation_param4_ionref_ionsharefd = 53; + uint32 in_operation_param4_ionref_ionsize = 54; + uint64 in_operation_session = 55; + int32 in_operation_cancelflag = 56; + uint32 in_returnorigin = 57; + uint64 in_context_addr = 58; + string token = 59; + string taname = 60; +} + +message Opes_Reply { + uint32 teecresult = 1; + int32 context_fd = 2; + bytes context_tapath = 3 ; + uint64 context_tapath_outsize = 4; + uint64 context_sessionlist_next = 5; + uint64 context_sessionlist_prev = 6; + uint64 context_shrdmemlist_next = 7; + uint64 context_shrdmemlist_prev = 8; + uint64 context_sharebuffer_buffer = 9; + int64 context_sharebuffer_bufferbarrier = 10; + uint32 session_sessionid = 11; + uint32 session_serviceid_timelow = 12; + uint32 session_serviceid_timemid = 13; + uint32 session_serviceid_timehiandver = 14; + uint64 session_serviceid_clockseqandnode_outsize = 15; + repeated uint32 session_serviceid_clockseqandnode = 16; + uint32 session_opscnt = 17; + uint64 session_head_next = 18; + uint64 session_head_prev = 19; + uint64 session_context = 20; + uint32 operation_started = 21; + uint32 operation_paramtypes = 22; + uint64 operation_param1_tmpref_buffer = 23; + uint32 operation_param1_tmpref_size = 24; + uint64 operation_param1_memref_parent = 25; + uint32 operation_param1_memref_size = 26; + uint32 operation_param1_memref_offset = 27; + uint32 operation_param1_value_a = 28; + uint32 operation_param1_value_b = 29; + int32 operation_param1_ionref_ionsharefd = 30; + uint32 operation_param1_ionref_ionsize = 31; + uint64 operation_param2_tmpref_buffer = 32; + uint32 operation_param2_tmpref_size = 33; + uint64 operation_param2_memref_parent = 34; + uint32 operation_param2_memref_size = 35; + uint32 operation_param2_memref_offset = 36; + uint32 operation_param2_value_a = 37; + uint32 operation_param2_value_b = 38; + int32 operation_param2_ionref_ionsharefd = 39; + uint32 operation_param2_ionref_ionsize = 40; + uint64 operation_param3_tmpref_buffer = 41; + uint32 operation_param3_tmpref_size = 42; + uint64 operation_param3_memref_parent = 43; + uint32 operation_param3_memref_size = 44; + uint32 operation_param3_memref_offset = 45; + uint32 operation_param3_value_a = 46; + uint32 operation_param3_value_b = 47; + int32 operation_param3_ionref_ionsharefd = 48; + uint32 operation_param3_ionref_ionsize = 49; + uint64 operation_param4_tmpref_buffer = 50; + uint32 operation_param4_tmpref_size = 51; + uint64 operation_param4_memref_parent = 52; + uint32 operation_param4_memref_size = 53; + uint32 operation_param4_memref_offset = 54; + uint32 operation_param4_value_a = 55; + uint32 operation_param4_value_b = 56; + int32 operation_param4_ionref_ionsharefd = 57; + uint32 operation_param4_ionref_ionsize = 58; + uint64 operation_session = 59; + int32 operation_cancelflag = 60; + uint32 returnorigin = 61; + int32 flag = 62; +} + +message Invo_Request { + uint32 in_session_sessionid = 1; + uint32 in_session_serviceid_timelow = 2; + uint32 in_session_serviceid_timemid = 3; + uint32 in_session_serviceid_timehiandver = 4; + uint64 in_session_serviceid_cad_size = 5; + repeated uint32 in_session_serviceid_clockseqandnode = 6; + uint32 in_session_opscnt = 7; + uint64 in_session_head_next = 8; + uint64 in_session_head_prev = 9; + uint64 in_session_context = 10; + uint32 in_commandid = 11; + uint32 in_operation_started = 12; + uint32 in_operation_paramtypes = 13; + uint64 in_operation_param1_tmpref_buffer = 14; + uint32 in_operation_param1_tmpref_size = 15; + uint64 in_operation_param1_memref_parent = 16; + uint32 in_operation_param1_memref_parent_flag = 17; + uint32 in_operation_param1_memref_size = 18; + uint32 in_operation_param1_memref_offset = 19; + uint32 in_operation_param1_value_a = 20; + uint32 in_operation_param1_value_b = 21; + int32 in_operation_param1_ionref_ionsharefd = 22; + uint32 in_operation_param1_ionref_ionsize = 23; + uint64 in_operation_param2_tmpref_buffer = 24; + uint32 in_operation_param2_tmpref_size = 25; + uint64 in_operation_param2_memref_parent = 26; + uint32 in_operation_param2_memref_parent_flag = 27; + uint32 in_operation_param2_memref_size = 28; + uint32 in_operation_param2_memref_offset = 29; + uint32 in_operation_param2_value_a = 30; + uint32 in_operation_param2_value_b = 31; + int32 in_operation_param2_ionref_ionsharefd = 32; + uint32 in_operation_param2_ionref_ionsize = 33; + uint64 in_operation_param3_tmpref_buffer = 34; + uint32 in_operation_param3_tmpref_size = 35; + uint64 in_operation_param3_memref_parent = 36; + uint32 in_operation_param3_memref_parent_flag = 37; + uint32 in_operation_param3_memref_size = 38; + uint32 in_operation_param3_memref_offset = 39; + uint32 in_operation_param3_value_a = 40; + uint32 in_operation_param3_value_b = 41; + int32 in_operation_param3_ionref_ionsharefd = 42; + uint32 in_operation_param3_ionref_ionsize = 43; + uint64 in_operation_param4_tmpref_buffer = 44; + uint32 in_operation_param4_tmpref_size = 45; + uint64 in_operation_param4_memref_parent = 46; + uint32 in_operation_param4_memref_parent_flag = 47; + uint32 in_operation_param4_memref_size = 48; + uint32 in_operation_param4_memref_offset = 49; + uint32 in_operation_param4_value_a = 50; + uint32 in_operation_param4_value_b = 51; + int32 in_operation_param4_ionref_ionsharefd = 52; + uint32 in_operation_param4_ionref_ionsize = 53; + uint64 in_operation_session = 54; + int32 in_operation_cancelflag = 55; + uint32 in_returnorigin = 56; + uint64 in_bufer1_size = 57; + repeated uint32 in_buffer1 = 58; + uint64 in_bufer2_size = 59; + repeated uint32 in_buffer2 = 60; + uint64 in_bufer3_size = 61; + repeated uint32 in_buffer3 = 62; + uint64 in_bufer4_size = 63; + repeated uint32 in_buffer4 = 64; + string token = 65; + string taname = 66; +} + +message Invo_Reply { + uint32 teecresult = 1; + uint32 session_sessionid = 2; + uint32 session_serviceid_timelow = 3; + uint32 session_serviceid_timemid = 4; + uint32 session_serviceid_timehiandver = 5; + uint64 session_serviceid_clockseqandnode_outsize = 6; + repeated uint32 session_serviceid_clockseqandnode = 7; + uint32 session_opscnt = 8; + uint64 session_head_next = 9; + uint64 session_head_prev = 10; + uint64 session_context = 11; + uint32 operation_started = 12; + uint32 operation_paramtypes = 13; + uint64 operation_param1_tmpref_buffer = 14; + uint32 operation_param1_tmpref_size = 15; + uint64 operation_param1_memref_parent = 16; + uint32 operation_param1_memref_parent_flag = 17; + uint32 operation_param1_memref_size = 18; + uint32 operation_param1_memref_offset = 19; + uint32 operation_param1_value_a = 20; + uint32 operation_param1_value_b = 21; + int32 operation_param1_ionref_ionsharefd = 22; + uint32 operation_param1_ionref_ionsize = 23; + uint64 operation_param2_tmpref_buffer = 24; + uint32 operation_param2_tmpref_size = 25; + uint64 operation_param2_memref_parent = 26; + uint32 operation_param2_memref_parent_flag = 27; + uint32 operation_param2_memref_size = 28; + uint32 operation_param2_memref_offset = 29; + uint32 operation_param2_value_a = 30; + uint32 operation_param2_value_b = 31; + int32 operation_param2_ionref_ionsharefd = 32; + uint32 operation_param2_ionref_ionsize = 33; + uint64 operation_param3_tmpref_buffer = 34; + uint32 operation_param3_tmpref_size = 35; + uint64 operation_param3_memref_parent = 36; + uint32 operation_param3_memref_parent_flag = 37; + uint32 operation_param3_memref_size = 38; + uint32 operation_param3_memref_offset = 39; + uint32 operation_param3_value_a = 40; + uint32 operation_param3_value_b = 41; + int32 operation_param3_ionref_ionsharefd = 42; + uint32 operation_param3_ionref_ionsize = 43; + uint64 operation_param4_tmpref_buffer = 44; + uint32 operation_param4_tmpref_size = 45; + uint64 operation_param4_memref_parent = 46; + uint32 operation_param4_memref_parent_flag = 47; + uint32 operation_param4_memref_size = 48; + uint32 operation_param4_memref_offset = 49; + uint32 operation_param4_value_a = 50; + uint32 operation_param4_value_b = 51; + int32 operation_param4_ionref_ionsharefd = 52; + uint32 operation_param4_ionref_ionsize = 53; + uint64 operation_session = 54; + int32 operation_cancelflag = 55; + uint32 returnorigin = 56; + + uint64 buffer1_outsize = 57; + uint64 buffer2_outsize = 58; + uint64 buffer3_outsize = 59; + uint64 buffer4_outsize = 60; + + repeated uint32 buffer1 = 61; + repeated uint32 buffer2 = 62; + repeated uint32 buffer3 = 63; + repeated uint32 buffer4 = 64; + int32 flag = 65; +} + +message Close_Request { + uint32 in_session_sessionid = 1; + uint32 in_session_serviceid_timelow = 2; + uint32 in_session_serviceid_timemid = 3; + uint32 in_session_serviceid_timehiandver = 4; + uint64 in_session_serviceid_cad_size = 5; + repeated uint32 in_session_serviceid_clockseqandnode = 6; + uint32 in_session_opscnt = 7; + uint64 in_session_head_next = 8; + uint64 in_session_head_prev = 9; + uint64 in_session_context = 10; + string token = 11; + string taname = 12; +} + +message Close_Reply { + uint32 session_sessionid = 1; + uint32 session_serviceid_timelow = 2; + uint32 session_serviceid_timemid = 3; + uint32 session_serviceid_timehiandver = 4; + uint64 session_serviceid_cad_outsize = 5; + repeated uint32 session_serviceid_clockseqandnode = 6; + uint32 session_opscnt = 7; + uint64 session_head_next = 8; + uint64 session_head_prev = 9; + uint64 session_context = 10; + int32 flag = 11; +} + +message TA_Chunk{ + string name = 1; + bytes buffer = 2; + string token = 3; + string taname = 4; + bytes sha256 = 5; + string subdir = 6; +} + +message TA_Reply{ + int32 code = 1; + int32 flag = 2; +} + +message Setjwt_Request{ + string taname = 1; + string token = 2; +} + +message Setjwt_Reply{ + int32 retcode = 1; +} diff --git a/cc-resource-pooling/teeproxy/libteecc/teecc.cc b/cc-resource-pooling/teeproxy/libteecc/teecc.cc new file mode 100644 index 0000000..c4a6617 --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/teecc.cc @@ -0,0 +1,4148 @@ +/* + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "gt.grpc.pb.h" + +#include "teecc.h" +#include "teecc/teec_client_api.h" +#include "yaml-cpp/yaml.h" + +#ifdef __cplusplus +extern "C" { +#endif + +using grpc::Channel; +using grpc::ChannelArguments; +using grpc::experimental::AltsCredentials; +using grpc::experimental::AltsCredentialsOptions; +using grpc::ClientContext; +using grpc::Status; +using grpc::ClientWriter; +using gt::gpp; +using gt::Inicont_Reply; +using gt::Inicont_Request; +using gt::Fincont_Reply; +using gt::Fincont_Request; +using gt::Opes_Reply; +using gt::Opes_Request; +using gt::Invo_Reply; +using gt::Invo_Request; +using gt::Close_Reply; +using gt::Close_Request; +using gt::TA_Chunk; +using gt::TA_Reply; + + +char glo_token[1024] = "noToken"; + + +bool utf8_check_is_valid(std::string &string) +{ + int c, i, ix, n, j; + for (i = 0, ix = string.length(); i < ix; i++) + { + c = (unsigned char) string[i]; + //if (c==0x09 || c==0x0a || c==0x0d || (0x20 <= c && c <= 0x7e) ) n = 0; // is_printable_ascii + if (0x00 <= c && c <= 0x7f) n = 0; // 0bbbbbbb + else if ((c & 0xE0) == 0xC0) n = 1; // 110bbbbb + else if (c == 0xed && i < (ix - 1) && ((unsigned char) string[i + 1] & 0xa0) == 0xa0) + return false; //U+d800 to U+dfff + else if ((c & 0xF0) == 0xE0) n = 2; // 1110bbbb + else if ((c & 0xF8) == 0xF0) n = 3; // 11110bbb + //else if (($c & 0xFC) == 0xF8) n=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8 + //else if (($c & 0xFE) == 0xFC) n=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8 + else return false; + for (j = 0; j < n && i < ix; j++) + { // n bytes matching 10bbbbbb follow ? + if ((++i == ix) || (((unsigned char) string[i] & 0xC0) != 0x80)) + return false; + } + } + return true; +} + +#define MAX_DATA_LEN 50*1024 +#define SHA256_LENTH 32 + +int get_file_sha256(char *file_path, char *val) +{ + SHA256_CTX sha256_ctx; + FILE *fp = NULL; + char *strFilePath = file_path; + unsigned char SHA256result[SHA256_LENTH]; + char DataBuff[MAX_DATA_LEN]; + int len; + int t = 0; + int i; + std::string sha256; + + + fp = fopen(strFilePath, "rb"); + + SHA256_Init(&sha256_ctx); + + while (!feof(fp)) + { + memset(DataBuff, 0x00, sizeof(DataBuff)); + + len = fread(DataBuff, 1, MAX_DATA_LEN, fp); + if (len) + { + t += len; + SHA256_Update(&sha256_ctx, DataBuff, len); + } + } + + fclose(fp); + SHA256_Final(SHA256result, &sha256_ctx); + + + if (val == NULL || sizeof(val) * 4 < SHA256_LENTH) + { + return -1; + } else + { + memset(val, 0, sizeof(val)); + for (int itemp = 0; itemp < SHA256_LENTH; itemp++) + { + val[itemp] = SHA256result[itemp]; + } + + } + + return 0; +} + + +class GppClient +{ +public: + GppClient(std::shared_ptr channel) + : stub_(gpp::NewStub(channel)) + {} + + // Assembles the client's payload, + // sends it and presents the response back from the server. + retstru_teec_inicont externc_teec_initializecontext( + std::uint8_t *name, + std::size_t name_size + ) + { + // Data we are sending to the server. + Inicont_Request request; + request.set_name_size(name_size); + if (name_size > 0) + { + std::string name_temp((char *) name); + request.set_name(name_temp); + } + request.set_token(glo_token); + + // Container for the data we expect from the server. + Inicont_Reply reply; + + ClientContext context; + retstru_teec_inicont rreply; + + // The actual RPC. + Status status = stub_->TEECC_InitializeContext(&context, request, &reply); + retstru_teec_inicont error; + + rreply.teecresult = reply.teecresult(); + rreply.context_fd = reply.context_fd(); + rreply.context_tapath_outsize = reply.context_tapath_outsize(); + if (rreply.context_tapath_outsize > 0) + { + rreply.context_tapath = (uint8_t *) malloc((rreply.context_tapath_outsize + 1) * sizeof(uint8_t));; + reply.context_tapath().copy((char *) rreply.context_tapath, rreply.context_tapath_outsize, 0); + } + rreply.context_sessionlist_next = reply.context_sessionlist_next(); + rreply.context_sessionlist_prev = reply.context_sessionlist_prev(); + rreply.context_shrdmemlist_prev = reply.context_shrdmemlist_prev(); + rreply.context_shrdmemlist_next = reply.context_shrdmemlist_next(); + rreply.context_sharebuffer_buffer = reply.context_sharebuffer_buffer(); + rreply.context_sharebuffer_bufferbarrier = reply.context_sharebuffer_bufferbarrier(); + rreply.context_addr = reply.context_addr(); + rreply.flag = reply.flag(); + // Act upon its status. + if (status.ok()) + { + return rreply; + } else + { + std::cout << "libteecc initcontext grpc error: " << status.error_code() << ", " << status.error_message() + << std::endl; + return error; + } + } + + retstru_teec_fincont externc_teec_finalizecontext( + std::int32_t in_context_fd, + std::uint8_t *in_context_tapath, + std::int32_t in_context_tapath_size, + std::uint64_t in_context_sessionlist_next, + std::uint64_t in_context_sessionlist_prev, + std::uint64_t in_context_shrdmemlist_next, + std::uint64_t in_context_shrdmemlist_prev, + std::uint64_t in_context_sharebuffer_buffer, + std::int64_t in_context_sharebuffer_bufferbarrier, + std::uint64_t in_context_addr + ) + { + // Data we are sending to the server. + Fincont_Request request; + + request.set_in_context_fd(in_context_fd); + request.set_in_context_tapath_size(in_context_tapath_size); + if (in_context_tapath_size > 0) + { + std::string in_context_tapath_temp((char *) in_context_tapath); + request.set_in_context_tapath(in_context_tapath_temp); + } + request.set_in_context_sessionlist_next(in_context_sessionlist_next); + request.set_in_context_sessionlist_prev(in_context_sessionlist_prev); + request.set_in_context_shrdmemlist_prev(in_context_shrdmemlist_prev); + request.set_in_context_shrdmemlist_next(in_context_shrdmemlist_next); + request.set_in_context_sharebuffer_buffer(in_context_sharebuffer_buffer); + request.set_in_context_sharebuffer_bufferbarrier(in_context_sharebuffer_bufferbarrier); + request.set_in_context_addr(in_context_addr); + request.set_token(glo_token); + + //questntainer for the data we expect from the server. + Fincont_Reply reply; + ClientContext context; + retstru_teec_fincont rreply; + + // The actual RPC. + Status status = stub_->TEECC_FinalizeContext(&context, request, &reply); + retstru_teec_fincont error; + + rreply.context_fd = reply.context_fd(); + rreply.context_tapath_outsize = reply.context_tapath_outsize(); + if (rreply.context_tapath_outsize > 0) + { + rreply.context_tapath = (uint8_t *) malloc((rreply.context_tapath_outsize + 1) * sizeof(uint8_t));; + reply.context_tapath().copy((char *) rreply.context_tapath, rreply.context_tapath_outsize, 0); + } + rreply.context_sessionlist_next = reply.context_sessionlist_next(); + rreply.context_sessionlist_prev = reply.context_sessionlist_prev(); + rreply.context_shrdmemlist_prev = reply.context_shrdmemlist_prev(); + rreply.context_shrdmemlist_next = reply.context_shrdmemlist_next(); + rreply.context_sharebuffer_buffer = reply.context_sharebuffer_buffer(); + rreply.context_sharebuffer_bufferbarrier = reply.context_sharebuffer_bufferbarrier(); + rreply.flag = reply.flag(); + // Act upon its status. + if (status.ok()) + { + return rreply; + } else + { + std::cout << "libteecc finalizecontext grpc error: " << status.error_code() << ", " << status.error_message() + << std::endl; + return error; + } + } + + retstru_teec_opensession externc_teec_opensession( + std::int32_t in_context_fd, + std::uint8_t *in_context_tapath, + std::int32_t in_context_tapath_size, + std::uint64_t in_context_sessionlist_next, + std::uint64_t in_context_sessionlist_prev, + std::uint64_t in_context_shrdmemlist_next, + std::uint64_t in_context_shrdmemlist_prev, + std::uint64_t in_context_sharebuffer_buffer, + std::int64_t in_context_sharebuffer_bufferbarrier, + std::uint32_t in_destination_timelow, + std::uint32_t in_destination_timemid, + std::uint32_t in_destination_timehiandver, + std::uint8_t *in_destination_clockseqandnode, + std::int32_t in_destination_clockseqandnode_size, + std::uint32_t in_connectionmethod, + std::uint64_t in_connectiondata, + std::uint32_t in_operation_started, + std::uint32_t in_operation_paramtypes, + std::uint64_t in_operation_param1_tmpref_buffer, + std::uint32_t in_operation_param1_tmpref_size, + std::uint64_t in_operation_param1_memref_parent, + std::uint32_t in_operation_param1_memref_size, + std::uint32_t in_operation_param1_memref_offset, + std::uint32_t in_operation_param1_value_a, + std::uint32_t in_operation_param1_value_b, + std::int32_t in_operation_param1_ionref_ionsharefd, + std::uint32_t in_operation_param1_ionref_ionsize, + std::uint64_t in_operation_param2_tmpref_buffer, + std::uint32_t in_operation_param2_tmpref_size, + std::uint64_t in_operation_param2_memref_parent, + std::uint32_t in_operation_param2_memref_size, + std::uint32_t in_operation_param2_memref_offset, + std::uint32_t in_operation_param2_value_a, + std::uint32_t in_operation_param2_value_b, + std::int32_t in_operation_param2_ionref_ionsharefd, + std::uint32_t in_operation_param2_ionref_ionsize, + std::uint64_t in_operation_param3_tmpref_buffer, + std::uint32_t in_operation_param3_tmpref_size, + std::uint64_t in_operation_param3_memref_parent, + std::uint32_t in_operation_param3_memref_size, + std::uint32_t in_operation_param3_memref_offset, + std::uint32_t in_operation_param3_value_a, + std::uint32_t in_operation_param3_value_b, + std::int32_t in_operation_param3_ionref_ionsharefd, + std::uint32_t in_operation_param3_ionref_ionsize, + std::uint64_t in_operation_param4_tmpref_buffer, + std::uint32_t in_operation_param4_tmpref_size, + std::uint64_t in_operation_param4_memref_parent, + std::uint32_t in_operation_param4_memref_size, + std::uint32_t in_operation_param4_memref_offset, + std::uint32_t in_operation_param4_value_a, + std::uint32_t in_operation_param4_value_b, + std::int32_t in_operation_param4_ionref_ionsharefd, + std::uint32_t in_operation_param4_ionref_ionsize, + std::uint64_t in_operation_session, + std::int32_t in_operation_cancelflag, + std::uint32_t in_returnorigin, + std::uint64_t in_context_addr + ) + { + // Data we are sending to the server. + Opes_Request request; + request.set_in_context_fd(in_context_fd); + request.set_in_context_tapath_size(in_context_tapath_size); + if (in_context_tapath_size > 0) + { + std::string in_context_tapath_temp((char *) in_context_tapath); + request.set_in_context_tapath(in_context_tapath_temp); + } + request.set_in_context_sessionlist_next(in_context_sessionlist_next); + request.set_in_context_sessionlist_prev(in_context_sessionlist_prev); + request.set_in_context_shrdmemlist_prev(in_context_shrdmemlist_prev); + request.set_in_context_shrdmemlist_next(in_context_shrdmemlist_next); + request.set_in_context_sharebuffer_buffer(in_context_sharebuffer_buffer); + request.set_in_context_sharebuffer_bufferbarrier(in_context_sharebuffer_bufferbarrier); + request.set_in_destination_timelow(in_destination_timelow); + request.set_in_destination_timemid(in_destination_timemid); + request.set_in_destination_timehiandver(in_destination_timehiandver); + request.set_in_destination_cad_size(in_destination_clockseqandnode_size); + if (in_destination_clockseqandnode_size > 0) + { + for (int i = 0; i < in_destination_clockseqandnode_size; i++) + { + request.add_in_destination_clockseqandnode(in_destination_clockseqandnode[i]); + } + + } + request.set_in_connectionmethod(in_connectionmethod); + request.set_in_connectiondata(in_connectiondata); + request.set_in_operation_started(in_operation_started); + request.set_in_operation_paramtypes(in_operation_paramtypes); + request.set_in_operation_param1_tmpref_buffer(in_operation_param1_tmpref_buffer); + request.set_in_operation_param1_tmpref_size(in_operation_param1_tmpref_size); + request.set_in_operation_param1_memref_parent(in_operation_param1_memref_parent); + request.set_in_operation_param1_memref_size(in_operation_param1_memref_size); + request.set_in_operation_param1_memref_offset(in_operation_param1_memref_offset); + request.set_in_operation_param1_value_a(in_operation_param1_value_a); + request.set_in_operation_param1_value_b(in_operation_param1_value_b); + request.set_in_operation_param1_ionref_ionsharefd(in_operation_param1_ionref_ionsharefd); + request.set_in_operation_param1_ionref_ionsize(in_operation_param1_ionref_ionsize); + request.set_in_operation_param2_tmpref_buffer(in_operation_param2_tmpref_buffer); + request.set_in_operation_param2_tmpref_size(in_operation_param2_tmpref_size); + request.set_in_operation_param2_memref_parent(in_operation_param2_memref_parent); + request.set_in_operation_param2_memref_size(in_operation_param2_memref_size); + request.set_in_operation_param2_memref_offset(in_operation_param2_memref_offset); + request.set_in_operation_param2_value_a(in_operation_param2_value_a); + request.set_in_operation_param2_value_b(in_operation_param2_value_b); + request.set_in_operation_param2_ionref_ionsharefd(in_operation_param2_ionref_ionsharefd); + request.set_in_operation_param2_ionref_ionsize(in_operation_param2_ionref_ionsize); + request.set_in_operation_param3_tmpref_buffer(in_operation_param3_tmpref_buffer); + request.set_in_operation_param3_tmpref_size(in_operation_param3_tmpref_size); + request.set_in_operation_param3_memref_parent(in_operation_param3_memref_parent); + request.set_in_operation_param3_memref_size(in_operation_param3_memref_size); + request.set_in_operation_param3_memref_offset(in_operation_param3_memref_offset); + request.set_in_operation_param3_value_a(in_operation_param3_value_a); + request.set_in_operation_param3_value_b(in_operation_param3_value_b); + request.set_in_operation_param3_ionref_ionsharefd(in_operation_param3_ionref_ionsharefd); + request.set_in_operation_param3_ionref_ionsize(in_operation_param3_ionref_ionsize); + request.set_in_operation_param4_tmpref_buffer(in_operation_param4_tmpref_buffer); + request.set_in_operation_param4_tmpref_size(in_operation_param4_tmpref_size); + request.set_in_operation_param4_memref_parent(in_operation_param4_memref_parent); + request.set_in_operation_param4_memref_size(in_operation_param4_memref_size); + request.set_in_operation_param4_memref_offset(in_operation_param4_memref_offset); + request.set_in_operation_param4_value_a(in_operation_param4_value_a); + request.set_in_operation_param4_value_b(in_operation_param4_value_b); + request.set_in_operation_param4_ionref_ionsharefd(in_operation_param4_ionref_ionsharefd); + request.set_in_operation_param4_ionref_ionsize(in_operation_param4_ionref_ionsize); + request.set_in_operation_session(in_operation_session); + request.set_in_operation_cancelflag(in_operation_cancelflag); + request.set_in_returnorigin(in_returnorigin); + request.set_in_context_addr(in_context_addr); + + request.set_token(glo_token); + //questntainer for the data we expect from the server. + Opes_Reply reply; + ClientContext context; + retstru_teec_opensession rreply; + + // The actual RPC. + Status status = stub_->TEECC_OpenSession(&context, request, &reply); + retstru_teec_opensession error; + + rreply.teecresult = reply.teecresult(); + rreply.context_fd = reply.context_fd(); + rreply.context_tapath_outsize = reply.context_tapath_outsize(); + if (rreply.context_tapath_outsize > 0) + { + rreply.context_tapath = (uint8_t *) malloc((rreply.context_tapath_outsize + 1) * sizeof(uint8_t));; + reply.context_tapath().copy((char *) rreply.context_tapath, rreply.context_tapath_outsize, 0); + } + rreply.context_sessionlist_next = reply.context_sessionlist_next(); + rreply.context_sessionlist_prev = reply.context_sessionlist_prev(); + rreply.context_shrdmemlist_prev = reply.context_shrdmemlist_prev(); + rreply.context_shrdmemlist_next = reply.context_shrdmemlist_next(); + rreply.context_sharebuffer_buffer = reply.context_sharebuffer_buffer(); + rreply.session_sessionid = reply.session_sessionid(); + rreply.session_serviceid_timelow = reply.session_serviceid_timelow(); + rreply.session_serviceid_timemid = reply.session_serviceid_timemid(); + rreply.session_serviceid_timehiandver = reply.session_serviceid_timehiandver(); + rreply.session_serviceid_clockseqandnode_outsize = reply.session_serviceid_clockseqandnode_outsize(); + if (rreply.session_serviceid_clockseqandnode_outsize > 0) + { + rreply.session_serviceid_clockseqandnode = new uint8_t[rreply.session_serviceid_clockseqandnode_outsize]; + for (int i = 0; i < rreply.session_serviceid_clockseqandnode_outsize; i++) + { + rreply.session_serviceid_clockseqandnode[i] = reply.session_serviceid_clockseqandnode(i); + } + } + rreply.session_opscnt = reply.session_opscnt(); + rreply.session_head_next = reply.session_head_next(); + rreply.session_head_prev = reply.session_head_prev(); + rreply.session_context = reply.session_context(); + rreply.operation_started = reply.operation_started(); + rreply.operation_paramtypes = reply.operation_paramtypes(); + rreply.operation_param1_tmpref_buffer = reply.operation_param1_tmpref_buffer(); + rreply.operation_param1_tmpref_size = reply.operation_param1_tmpref_size(); + rreply.operation_param1_memref_parent = reply.operation_param1_memref_parent(); + rreply.operation_param1_memref_size = reply.operation_param1_memref_size(); + rreply.operation_param1_memref_offset = reply.operation_param1_memref_offset(); + rreply.operation_param1_value_a = reply.operation_param1_value_a(); + rreply.operation_param1_value_b = reply.operation_param1_value_b(); + rreply.operation_param1_ionref_ionsharefd = reply.operation_param1_ionref_ionsharefd(); + rreply.operation_param1_ionref_ionsize = reply.operation_param1_ionref_ionsize(); + rreply.operation_param2_tmpref_buffer = reply.operation_param2_tmpref_buffer(); + rreply.operation_param2_tmpref_size = reply.operation_param2_tmpref_size(); + rreply.operation_param2_memref_parent = reply.operation_param2_memref_parent(); + rreply.operation_param2_memref_size = reply.operation_param2_memref_size(); + rreply.operation_param2_memref_offset = reply.operation_param2_memref_offset(); + rreply.operation_param2_value_a = reply.operation_param2_value_a(); + rreply.operation_param2_value_b = reply.operation_param2_value_b(); + rreply.operation_param2_ionref_ionsharefd = reply.operation_param2_ionref_ionsharefd(); + rreply.operation_param2_ionref_ionsize = reply.operation_param2_ionref_ionsize(); + rreply.operation_param3_tmpref_buffer = reply.operation_param3_tmpref_buffer(); + rreply.operation_param3_tmpref_size = reply.operation_param3_tmpref_size(); + rreply.operation_param3_memref_parent = reply.operation_param3_memref_parent(); + rreply.operation_param3_memref_size = reply.operation_param3_memref_size(); + rreply.operation_param3_memref_offset = reply.operation_param3_memref_offset(); + rreply.operation_param3_value_a = reply.operation_param3_value_a(); + rreply.operation_param3_value_b = reply.operation_param3_value_b(); + rreply.operation_param3_ionref_ionsharefd = reply.operation_param3_ionref_ionsharefd(); + rreply.operation_param3_ionref_ionsize = reply.operation_param3_ionref_ionsize(); + rreply.operation_param4_tmpref_buffer = reply.operation_param4_tmpref_buffer(); + rreply.operation_param4_tmpref_size = reply.operation_param4_tmpref_size(); + rreply.operation_param4_memref_parent = reply.operation_param4_memref_parent(); + rreply.operation_param4_memref_size = reply.operation_param4_memref_size(); + rreply.operation_param4_memref_offset = reply.operation_param4_memref_offset(); + rreply.operation_param4_value_a = reply.operation_param4_value_a(); + rreply.operation_param4_value_b = reply.operation_param4_value_b(); + rreply.operation_param4_ionref_ionsharefd = reply.operation_param4_ionref_ionsharefd(); + rreply.operation_param4_ionref_ionsize = reply.operation_param4_ionref_ionsize(); + rreply.operation_session = reply.operation_session(); + rreply.operation_cancelflag = reply.operation_cancelflag(); + rreply.returnorigin = reply.returnorigin(); + rreply.flag = reply.flag(); + + // Act upon its status. + if (status.ok()) + { + return rreply; + } else + { + std::cout << "libteecc opensession grpc error: " << status.error_code() << ", " << status.error_message() + << std::endl; + return error; + } + } + + retstru_teec_invokecommand externc_teec_invokecommand( + std::uint32_t in_session_sessionid, + std::uint32_t in_session_serviceid_timelow, + std::uint32_t in_session_serviceid_timemid, + std::uint32_t in_session_serviceid_timehiandver, + std::uint8_t *in_session_serviceid_clockseqandnode, + std::uintptr_t in_session_serviceid_clockseqandnode_size, + std::uint32_t in_session_opscnt, + std::uint64_t in_session_head_next, + std::uint64_t in_session_head_prev, + std::uint64_t in_session_context, + std::uint32_t in_commandid, + std::uint32_t in_operation_started, + std::uint32_t in_operation_paramtypes, + std::uint64_t in_operation_param1_tmpref_buffer, + std::uint32_t in_operation_param1_tmpref_size, + std::uint64_t in_operation_param1_memref_parent, + std::uint32_t in_operation_param1_memref_parent_flag, + std::uint32_t in_operation_param1_memref_size, + std::uint32_t in_operation_param1_memref_offset, + std::uint32_t in_operation_param1_value_a, + std::uint32_t in_operation_param1_value_b, + std::int32_t in_operation_param1_ionref_ionsharefd, + std::uint32_t in_operation_param1_ionref_ionsize, + std::uint64_t in_operation_param2_tmpref_buffer, + std::uint32_t in_operation_param2_tmpref_size, + std::uint64_t in_operation_param2_memref_parent, + std::uint32_t in_operation_param2_memref_parent_flag, + std::uint32_t in_operation_param2_memref_size, + std::uint32_t in_operation_param2_memref_offset, + std::uint32_t in_operation_param2_value_a, + std::uint32_t in_operation_param2_value_b, + std::int32_t in_operation_param2_ionref_ionsharefd, + std::uint32_t in_operation_param2_ionref_ionsize, + std::uint64_t in_operation_param3_tmpref_buffer, + std::uint32_t in_operation_param3_tmpref_size, + std::uint64_t in_operation_param3_memref_parent, + std::uint32_t in_operation_param3_memref_parent_flag, + std::uint32_t in_operation_param3_memref_size, + std::uint32_t in_operation_param3_memref_offset, + std::uint32_t in_operation_param3_value_a, + std::uint32_t in_operation_param3_value_b, + std::int32_t in_operation_param3_ionref_ionsharefd, + std::uint32_t in_operation_param3_ionref_ionsize, + std::uint64_t in_operation_param4_tmpref_buffer, + std::uint32_t in_operation_param4_tmpref_size, + std::uint64_t in_operation_param4_memref_parent, + std::uint32_t in_operation_param4_memref_parent_flag, + std::uint32_t in_operation_param4_memref_size, + std::uint32_t in_operation_param4_memref_offset, + std::uint32_t in_operation_param4_value_a, + std::uint32_t in_operation_param4_value_b, + std::int32_t in_operation_param4_ionref_ionsharefd, + std::uint32_t in_operation_param4_ionref_ionsize, + std::uint64_t in_operation_session, + std::int32_t in_operation_cancelflag, + std::uint32_t in_returnorigin, + std::uint8_t *in_buffer1, + std::uintptr_t in_buffer1_size, + std::uint8_t *in_buffer2, + std::uintptr_t in_buffer2_size, + std::uint8_t *in_buffer3, + std::uintptr_t in_buffer3_size, + std::uint8_t *in_buffer4, + std::uintptr_t in_buffer4_size + ) + { + // Data we are sending to the server. + Invo_Request request; + request.set_in_session_sessionid(in_session_sessionid); + + request.set_in_session_serviceid_timelow(in_session_serviceid_timelow); + request.set_in_session_serviceid_timemid(in_session_serviceid_timemid); + request.set_in_session_serviceid_timehiandver(in_session_serviceid_timehiandver); + request.set_in_session_serviceid_cad_size(in_session_serviceid_clockseqandnode_size); + if (in_session_serviceid_clockseqandnode_size > 0) + { + for (int i = 0; i < in_session_serviceid_clockseqandnode_size; i++) + { + request.add_in_session_serviceid_clockseqandnode(in_session_serviceid_clockseqandnode[i]); + } + + } + request.set_in_session_opscnt(in_session_opscnt); + request.set_in_session_head_next(in_session_head_next); + request.set_in_session_head_prev(in_session_head_prev); + request.set_in_session_context(in_session_context); + request.set_in_commandid(in_commandid); + request.set_in_operation_started(in_operation_started); + request.set_in_operation_paramtypes(in_operation_paramtypes); + request.set_in_operation_param1_tmpref_buffer(in_operation_param1_tmpref_buffer); + request.set_in_operation_param1_tmpref_size(in_operation_param1_tmpref_size); + request.set_in_operation_param1_memref_parent(in_operation_param1_memref_parent); + request.set_in_operation_param1_memref_parent_flag(in_operation_param1_memref_parent_flag); + request.set_in_operation_param1_memref_size(in_operation_param1_memref_size); + request.set_in_operation_param1_memref_offset(in_operation_param1_memref_offset); + request.set_in_operation_param1_value_a(in_operation_param1_value_a); + request.set_in_operation_param1_value_b(in_operation_param1_value_b); + request.set_in_operation_param1_ionref_ionsharefd(in_operation_param1_ionref_ionsharefd); + request.set_in_operation_param1_ionref_ionsize(in_operation_param1_ionref_ionsize); + request.set_in_operation_param2_tmpref_buffer(in_operation_param2_tmpref_buffer); + request.set_in_operation_param2_tmpref_size(in_operation_param2_tmpref_size); + request.set_in_operation_param2_memref_parent(in_operation_param2_memref_parent); + request.set_in_operation_param2_memref_parent_flag(in_operation_param2_memref_parent_flag); + request.set_in_operation_param2_memref_size(in_operation_param2_memref_size); + request.set_in_operation_param2_memref_offset(in_operation_param2_memref_offset); + request.set_in_operation_param2_value_a(in_operation_param2_value_a); + request.set_in_operation_param2_value_b(in_operation_param2_value_b); + request.set_in_operation_param2_ionref_ionsharefd(in_operation_param2_ionref_ionsharefd); + request.set_in_operation_param2_ionref_ionsize(in_operation_param2_ionref_ionsize); + request.set_in_operation_param3_tmpref_buffer(in_operation_param3_tmpref_buffer); + request.set_in_operation_param3_tmpref_size(in_operation_param3_tmpref_size); + request.set_in_operation_param3_memref_parent(in_operation_param3_memref_parent); + request.set_in_operation_param3_memref_parent_flag(in_operation_param3_memref_parent_flag); + request.set_in_operation_param3_memref_size(in_operation_param3_memref_size); + request.set_in_operation_param3_memref_offset(in_operation_param3_memref_offset); + request.set_in_operation_param3_value_a(in_operation_param3_value_a); + request.set_in_operation_param3_value_b(in_operation_param3_value_b); + request.set_in_operation_param3_ionref_ionsharefd(in_operation_param3_ionref_ionsharefd); + request.set_in_operation_param3_ionref_ionsize(in_operation_param3_ionref_ionsize); + request.set_in_operation_param4_tmpref_buffer(in_operation_param4_tmpref_buffer); + request.set_in_operation_param4_tmpref_size(in_operation_param4_tmpref_size); + request.set_in_operation_param4_memref_parent(in_operation_param4_memref_parent); + request.set_in_operation_param4_memref_parent_flag(in_operation_param4_memref_parent_flag); + request.set_in_operation_param4_memref_size(in_operation_param4_memref_size); + request.set_in_operation_param4_memref_offset(in_operation_param4_memref_offset); + request.set_in_operation_param4_value_a(in_operation_param4_value_a); + request.set_in_operation_param4_value_b(in_operation_param4_value_b); + request.set_in_operation_param4_ionref_ionsharefd(in_operation_param4_ionref_ionsharefd); + request.set_in_operation_param4_ionref_ionsize(in_operation_param4_ionref_ionsize); + request.set_in_operation_session(in_operation_session); + request.set_in_operation_cancelflag(in_operation_cancelflag); + request.set_in_returnorigin(in_returnorigin); + request.set_in_bufer1_size(in_buffer1_size); + if (in_buffer1_size > 0) + { + for (int i = 0; i < in_buffer1_size; i++) + { + request.add_in_buffer1(in_buffer1[i]); + } + } + request.set_in_bufer2_size(in_buffer2_size); + if (in_buffer2_size > 0) + { + for (int i = 0; i < in_buffer2_size; i++) + { + request.add_in_buffer2(in_buffer2[i]); + } + } + request.set_in_bufer3_size(in_buffer3_size); + if (in_buffer3_size > 0) + { + for (int i = 0; i < in_buffer3_size; i++) + { + request.add_in_buffer3(in_buffer3[i]); + } + } + request.set_in_bufer4_size(in_buffer4_size); + if (in_buffer4_size > 0) + { + for (int i = 0; i < in_buffer4_size; i++) + { + request.add_in_buffer4(in_buffer4[i]); + } + } + request.set_token(glo_token); + //questntainer for the data we expect from the server. + Invo_Reply reply; + ClientContext context; + retstru_teec_invokecommand rreply; + + // The actual RPC. + Status status = stub_->TEECC_InvokeCommand(&context, request, &reply); + retstru_teec_invokecommand error; + + rreply.teecresult = reply.teecresult(); + rreply.session_sessionid = reply.session_sessionid(); + rreply.session_serviceid_timelow = reply.session_serviceid_timelow(); + rreply.session_serviceid_timemid = reply.session_serviceid_timemid(); + rreply.session_serviceid_timehiandver = reply.session_serviceid_timehiandver(); + rreply.session_serviceid_clockseqandnode_outsize = reply.session_serviceid_clockseqandnode_outsize(); + if (rreply.session_serviceid_clockseqandnode_outsize > 0) + { + rreply.session_serviceid_clockseqandnode = new uint8_t[rreply.session_serviceid_clockseqandnode_outsize]; + for (int i = 0; i < rreply.session_serviceid_clockseqandnode_outsize; i++) + { + rreply.session_serviceid_clockseqandnode[i] = reply.session_serviceid_clockseqandnode(i); + } + } + rreply.session_opscnt = reply.session_opscnt(); + rreply.session_head_next = reply.session_head_next(); + rreply.session_head_prev = reply.session_head_prev(); + rreply.session_context = reply.session_context(); + rreply.operation_started = reply.operation_started(); + rreply.operation_paramtypes = reply.operation_paramtypes(); + rreply.operation_param1_tmpref_buffer = reply.operation_param1_tmpref_buffer(); + rreply.operation_param1_tmpref_size = reply.operation_param1_tmpref_size(); + rreply.operation_param1_memref_parent = reply.operation_param1_memref_parent(); + rreply.operation_param1_memref_parent_flag = reply.operation_param1_memref_parent_flag(); + rreply.operation_param1_memref_size = reply.operation_param1_memref_size(); + rreply.operation_param1_memref_offset = reply.operation_param1_memref_offset(); + rreply.operation_param1_value_a = reply.operation_param1_value_a(); + rreply.operation_param1_value_b = reply.operation_param1_value_b(); + rreply.operation_param1_ionref_ionsharefd = reply.operation_param1_ionref_ionsharefd(); + rreply.operation_param1_ionref_ionsize = reply.operation_param1_ionref_ionsize(); + + rreply.operation_param2_tmpref_buffer = reply.operation_param2_tmpref_buffer(); + rreply.operation_param2_tmpref_size = reply.operation_param2_tmpref_size(); + rreply.operation_param2_memref_parent = reply.operation_param2_memref_parent(); + rreply.operation_param2_memref_parent_flag = reply.operation_param2_memref_parent_flag(); + rreply.operation_param2_memref_size = reply.operation_param2_memref_size(); + rreply.operation_param2_memref_offset = reply.operation_param2_memref_offset(); + rreply.operation_param2_value_a = reply.operation_param2_value_a(); + rreply.operation_param2_value_b = reply.operation_param2_value_b(); + rreply.operation_param2_ionref_ionsharefd = reply.operation_param2_ionref_ionsharefd(); + rreply.operation_param2_ionref_ionsize = reply.operation_param2_ionref_ionsize(); + + rreply.operation_param3_tmpref_buffer = reply.operation_param3_tmpref_buffer(); + rreply.operation_param3_tmpref_size = reply.operation_param3_tmpref_size(); + rreply.operation_param3_memref_parent = reply.operation_param3_memref_parent(); + rreply.operation_param3_memref_parent_flag = reply.operation_param3_memref_parent_flag(); + rreply.operation_param3_memref_size = reply.operation_param3_memref_size(); + rreply.operation_param3_memref_offset = reply.operation_param3_memref_offset(); + rreply.operation_param3_value_a = reply.operation_param3_value_a(); + rreply.operation_param3_value_b = reply.operation_param3_value_b(); + rreply.operation_param3_ionref_ionsharefd = reply.operation_param3_ionref_ionsharefd(); + rreply.operation_param3_ionref_ionsize = reply.operation_param3_ionref_ionsize(); + + rreply.operation_param4_tmpref_buffer = reply.operation_param4_tmpref_buffer(); + rreply.operation_param4_tmpref_size = reply.operation_param4_tmpref_size(); + rreply.operation_param4_memref_parent = reply.operation_param4_memref_parent(); + rreply.operation_param4_memref_parent_flag = reply.operation_param4_memref_parent_flag(); + rreply.operation_param4_memref_size = reply.operation_param4_memref_size(); + rreply.operation_param4_memref_offset = reply.operation_param4_memref_offset(); + rreply.operation_param4_value_a = reply.operation_param4_value_a(); + rreply.operation_param4_value_b = reply.operation_param4_value_b(); + rreply.operation_param4_ionref_ionsharefd = reply.operation_param4_ionref_ionsharefd(); + rreply.operation_param4_ionref_ionsize = reply.operation_param4_ionref_ionsize(); + + rreply.operation_session = reply.operation_session(); + rreply.operation_cancelflag = reply.operation_cancelflag(); + rreply.returnorigin = reply.returnorigin(); + rreply.buffer1_outsize = reply.buffer1_outsize(); + if (rreply.buffer1_outsize > 0) + { + rreply.buffer1 = new uint8_t[rreply.buffer1_outsize]; + for (int i = 0; i < rreply.buffer1_outsize; i++) + { + rreply.buffer1[i] = reply.buffer1(i); + } + } + rreply.buffer2_outsize = reply.buffer2_outsize(); + if (rreply.buffer2_outsize > 0) + { + rreply.buffer2 = new uint8_t[rreply.buffer2_outsize]; + for (int i = 0; i < rreply.buffer2_outsize; i++) + { + rreply.buffer2[i] = reply.buffer2(i); + } + } + rreply.buffer3_outsize = reply.buffer3_outsize(); + if (rreply.buffer3_outsize > 0) + { + rreply.buffer3 = new uint8_t[rreply.buffer3_outsize]; + for (int i = 0; i < rreply.buffer3_outsize; i++) + { + rreply.buffer3[i] = reply.buffer3(i); + } + } + rreply.buffer4_outsize = reply.buffer4_outsize(); + if (rreply.buffer4_outsize > 0) + { + rreply.buffer4 = new uint8_t[rreply.buffer4_outsize]; + for (int i = 0; i < rreply.buffer4_outsize; i++) + { + rreply.buffer4[i] = reply.buffer4(i); + } + } + rreply.flag = reply.flag(); + + // Act upon its status. + if (status.ok()) + { + return rreply; + } else + { + std::cout << "libteec invokecommand grpc error: " << status.error_code() << ", " << status.error_message() + << std::endl; + return error; + } + } + + retstru_teec_closesession externc_teec_closesession( + std::uint32_t in_session_sessionid, + std::uint32_t in_session_serviceid_timelow, + std::uint32_t in_session_serviceid_timemid, + std::uint32_t in_session_serviceid_timehiandver, + std::uint8_t *in_session_serviceid_clockseqandnode, + std::uintptr_t in_session_serviceid_clockseqandnode_size, + std::uint32_t in_session_opscnt, + std::uint64_t in_session_head_next, + std::uint64_t in_session_head_prev, + std::uint64_t in_session_context + ) + { + Close_Request request; + + request.set_in_session_sessionid(in_session_sessionid); + request.set_in_session_serviceid_timelow(in_session_serviceid_timelow); + request.set_in_session_serviceid_timemid(in_session_serviceid_timemid); + request.set_in_session_serviceid_timehiandver(in_session_serviceid_timehiandver); + request.set_in_session_serviceid_cad_size(in_session_serviceid_clockseqandnode_size); + if (in_session_serviceid_clockseqandnode_size > 0) + { + for (int i = 0; i < in_session_serviceid_clockseqandnode_size; i++) + { + request.add_in_session_serviceid_clockseqandnode(in_session_serviceid_clockseqandnode[i]); + } + } + request.set_in_session_opscnt(in_session_opscnt); + request.set_in_session_head_next(in_session_head_next); + request.set_in_session_head_prev(in_session_head_prev); + request.set_in_session_context(in_session_context); + request.set_token(glo_token); + + Close_Reply reply; + ClientContext context; + retstru_teec_closesession rreply; + // The actual RPC. + Status status = stub_->TEECC_CloseSession(&context, request, &reply); + retstru_teec_closesession error; + + rreply.session_sessionid = reply.session_sessionid(); + rreply.session_serviceid_timelow = reply.session_serviceid_timelow(); + rreply.session_serviceid_timemid = reply.session_serviceid_timemid(); + rreply.session_serviceid_timehiandver = reply.session_serviceid_timehiandver(); + rreply.session_serviceid_clockseqandnode_outsize = reply.session_serviceid_cad_outsize(); + + if (rreply.session_serviceid_clockseqandnode_outsize > 0) + { + rreply.session_serviceid_clockseqandnode = new uint8_t[rreply.session_serviceid_clockseqandnode_outsize]; + for (int i = 0; i < rreply.session_serviceid_clockseqandnode_outsize; i++) + { + rreply.session_serviceid_clockseqandnode[i] = reply.session_serviceid_clockseqandnode(i); + } + } + + rreply.session_opscnt = reply.session_opscnt(); + rreply.session_head_next = reply.session_head_next(); + rreply.session_head_prev = reply.session_head_prev(); + rreply.session_context = reply.session_context(); + rreply.flag = reply.flag(); + + // Act upon its status. + if (status.ok()) + { + return rreply; + } else + { + std::cout << "libteec closesession grpc error: " << status.error_code() << ", " << status.error_message() + << std::endl; + return error; + } + } + + + int + Upload( + std::string infile_path, + std::string subdir, + std::string outfile_name + ) + { + TA_Chunk chunk; + TA_Reply stats; + ClientContext context; + const char *filename = infile_path.data(); + std::ifstream infile; + int retcode = 0; + + struct timeval start, end; + gettimeofday(&start, NULL); + + infile.open(filename, std::ifstream::in | std::ifstream::binary); + if (!infile) + { + return TEEC_INFILE_NOT_FOUND; + } + + long beginoffset, endoffset; + beginoffset = infile.tellg(); + infile.seekg(0, std::ios::end); + endoffset = infile.tellg(); + long filesize = endoffset - beginoffset; + infile.seekg(0, std::ios::beg); + char *data = new char[filesize]; + infile.read(data, filesize); + + chunk.set_buffer(data, infile.gcount()); + + delete[]data; + infile.close(); + + if (subdir.empty()) + { + std::string strsubdirdefault("default"); + chunk.set_subdir(strsubdirdefault); + } else + { + bool bResult; + bResult = utf8_check_is_valid(subdir); + if (bResult == false) + { + return TEEC_FAIL; + } + + chunk.set_subdir(subdir); + } + + std::string stroutname; + std::string infile_path_temp = infile_path; + if (outfile_name.empty()) + { + char *filenametemp = const_cast(infile_path_temp.data()); + const char slash[] = "/"; + char *nametemp = strtok(filenametemp, slash); + while (nametemp != NULL) + { + stroutname = std::string(nametemp); + nametemp = strtok(NULL, slash); + } + chunk.set_name(stroutname); + } else + { + chunk.set_name(outfile_name); + } + + chunk.set_token(glo_token); + + char sha256[SHA256_LENTH]; + int iRet; + iRet = get_file_sha256((char *) filename, sha256); + if (iRet != 0) + { + return TEEC_FAIL; + } + + chunk.set_sha256(sha256, SHA256_LENTH); + + Status status = stub_->TEECC_TA(&context, chunk, &stats); + + + if (status.ok()) + { + retcode = stats.code(); + + if (stats.code() == 0) + { + retcode = 0; + } else if (stats.code() == -1) + { + std::cout << "libteeccc: deployta jwt validate error" << std::endl; + retcode = TEEC_ERROR_JWTVALIDATE_FAIL; + } else + { + retcode = TEEC_FAIL; + } + } else + { + std::cout << "libteec deployta grpc error: " << status.error_code() << ", " + << status.error_message() << std::endl; + retcode = TEEC_FAIL; + } + + return retcode; + } + + // Out of the passed in Channel comes the stub, stored here, our view of the + // server's exposed services. + std::unique_ptr stub_; +}; + + +static GppClient *client = NULL; +std::shared_ptr gpp_channel = NULL; + + +std::string global_strcfgfiletemp = getenv("HOME"); +std::string global_strcfgfile = global_strcfgfiletemp + "/.teecc/teecc_config.yaml"; +YAML::Node glo_config = YAML::LoadFile(global_strcfgfile); +std::string global_target_str = glo_config["GPPROXY_ADDRESS"].as(); +std::string global_servercacert_path = global_strcfgfiletemp + "/.teecc/certs/" + glo_config["NAME_SERVERCA_CERT"].as(); +std::string global_clientkey_path = global_strcfgfiletemp + "/.teecc/certs/" + glo_config["NAME_CLIENT_KEY"].as(); +std::string global_clientcert_path = global_strcfgfiletemp + "/.teecc/certs/" + glo_config["NAME_CLIENT_CERT"].as(); +int grpc_tls = glo_config["GRPC_TLS"].as(); + + +int64_t glob_scontaddr; + +bool isFileExists_ifstream(std::string &name) +{ + std::ifstream f(name.c_str()); + return f.good(); +} + +static std::string get_file_contents(std::string fpath) +{ + std::ifstream finstream(fpath); + std::string contents; + contents.assign((std::istreambuf_iterator(finstream)), + std::istreambuf_iterator()); + finstream.close(); + return contents; +} + + +TEEC_Result +TEEC_InitializeContext(const char *name, TEEC_Context *context) +{ + if (gpp_channel == NULL) + { + int igrpctls = grpc_tls; + + if (grpc_tls != 0 && grpc_tls != 1 && grpc_tls != 2) + { + std::cout << global_strcfgfile << " grpc_tls should be 0 or 1 or 2 " << std::endl; + return TEEC_FAIL; + } + + switch (igrpctls) + { + case 0: + { + gpp_channel = grpc::CreateChannel(global_target_str, grpc::InsecureChannelCredentials()); + + break; + } + + case 1: + { + if (!isFileExists_ifstream(global_servercacert_path)) + { + std::cout << "error file : " << global_servercacert_path << " is not exist " << std::endl; + return TEEC_FAIL; + } + + std::string strcmd; + FILE *pipe; + char buffer[128]; + std::string result; + + std::string strdayseconds; + char *resulttemp; + const char slash[] = "\n"; + char *parresult; + std::string strparresult; + std::string willexpire("Certificate will expire"); + + // 7 days in seconds + strdayseconds = "604800"; + strcmd = "openssl x509 -enddate -noout -in " + global_servercacert_path + " -checkend " + strdayseconds; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + resulttemp = const_cast(result.data()); + parresult = strtok(resulttemp, slash); + while (parresult != NULL) + { + strparresult = std::string(parresult); + parresult = strtok(NULL, slash); + } + if (strparresult.compare(willexpire) == 0) + { + std::cout << "gpp '" << global_servercacert_path << "' will expire in 7 days, please reget it" << std::endl; + return TEEC_FAIL; + } + + auto servercacert = get_file_contents(global_servercacert_path); + grpc::SslCredentialsOptions ssl_opts; + ssl_opts.pem_root_certs = servercacert; + std::shared_ptr creds = grpc::SslCredentials(ssl_opts); + gpp_channel = grpc::CreateChannel(global_target_str, creds); + + break; + } + + case 2: + { + if (!isFileExists_ifstream(global_servercacert_path)) + { + std::cout << "error file : " << global_servercacert_path << " is not exist " << std::endl; + return TEEC_FAIL; + } + if (!isFileExists_ifstream(global_clientkey_path)) + { + std::cout << "error file : " << global_clientkey_path << " is not exist " << std::endl; + return TEEC_FAIL; + } + if (!isFileExists_ifstream(global_clientcert_path)) + { + std::cout << "error file : " << global_clientcert_path << " is not exist " << std::endl; + return TEEC_FAIL; + } + + std::string strcmd; + FILE *pipe; + char buffer[128]; + std::string result; + + std::string strdayseconds; + char *resulttemp; + const char slash[] = "\n"; + char *parresult; + std::string strparresult; + std::string willexpire("Certificate will expire"); + + // 7 days in seconds + strdayseconds = "604800"; + strcmd = "openssl x509 -enddate -noout -in " + global_servercacert_path + " -checkend " + strdayseconds; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + resulttemp = const_cast(result.data()); + parresult = strtok(resulttemp, slash); + while (parresult != NULL) + { + strparresult = std::string(parresult); + parresult = strtok(NULL, slash); + } + if (strparresult.compare(willexpire) == 0) + { + std::cout << "libteecc '" << global_servercacert_path << "' will expire in 7 days, please reget it" + << std::endl; + return TEEC_FAIL; + } + + // 7 days in seconds + strdayseconds = "604800"; + strcmd = "openssl x509 -enddate -noout -in " + global_clientcert_path + " -checkend " + strdayseconds; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + resulttemp = const_cast(result.data()); + parresult = strtok(resulttemp, slash); + while (parresult != NULL) + { + strparresult = std::string(parresult); + parresult = strtok(NULL, slash); + } + if (strparresult.compare(willexpire) == 0) + { + std::cout << "libteecc '" << global_clientcert_path << "' will expire in 7 days, please reget it" << std::endl; + return TEEC_FAIL; + } + + strcmd = "openssl rsa -in " + global_clientkey_path + " -out " + + global_clientkey_path + ".nopass"; + std::string nopass_clientkey_path = global_clientkey_path + ".nopass"; + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + + strcmd = "openssl rsa -in " + nopass_clientkey_path + " -check -noout"; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + std::string keyok("RSA key ok\n"); + if (result.compare(keyok) != 0) + { + std::cout << "libteecc '" + global_clientkey_path + "' integrity is broken" << std::endl; + return TEEC_FAIL; + } + + std::string sigfile_path = global_strcfgfiletemp + "/.teecc/certs/msg.sig"; + std::string msgfile_path = global_strcfgfiletemp + "/.teecc/certs/msg.txt"; + strcmd = + "openssl dgst -sha256 -sign " + nopass_clientkey_path + " -out " + sigfile_path + " " + msgfile_path; + system(strcmd.c_str()); + // ${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} + std::string pubkeyfile_path = global_strcfgfiletemp + "/.teecc/certs/client_pubkey.pem"; + strcmd = "openssl x509 -in " + global_clientcert_path + " -pubkey -out " + pubkeyfile_path; + system(strcmd.c_str()); + + // ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt + strcmd = "openssl dgst -sha256 -verify " + pubkeyfile_path + " -signature " + sigfile_path + " " + + msgfile_path; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + // std::cout << "gpp popen " << strcmd << " succed, result: " << result < creds = grpc::SslCredentials(ssl_opts); + gpp_channel = grpc::CreateChannel(global_target_str, creds); + + break; + } + + default: + { + gpp_channel = grpc::CreateChannel(global_target_str, grpc::InsecureChannelCredentials()); + } + } + + client = new GppClient( + gpp_channel + ); + } + + std::uint8_t *name_temp = NULL; + std::uint32_t name_size; + struct retstru_teec_inicont rs_inicont_ins; + + if (name != NULL) + { + name_temp = (uint8_t *) name; + name_size = strlen(name); + } else + { + name_size = 0; + } + + if (context == NULL) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + rs_inicont_ins = client->externc_teec_initializecontext(name_temp, + name_size + ); + if (rs_inicont_ins.flag == 1) + { + std::cout << "libteecc: inicont token null" << std::endl; + + return TEEC_ERROR_BAD_PARAMETERS; + } + if (rs_inicont_ins.flag == 2) + { + std::cout << "libteecc: inicont jwt validate error" << std::endl; + return TEEC_ERROR_BAD_PARAMETERS; + } + + if (rs_inicont_ins.teecresult == TEEC_SUCCESS) + { + context->fd = rs_inicont_ins.context_fd; + + if ( + rs_inicont_ins.context_tapath_outsize > 0 && + rs_inicont_ins.context_tapath != NULL + ) + { + if (context->ta_path == NULL) + { + return TEEC_ERROR_CONTEXT_TAPATH_NULL; + } else + { + memcpy( + context->ta_path, + rs_inicont_ins.context_tapath, + rs_inicont_ins.context_tapath_outsize + ); + *(context->ta_path + rs_inicont_ins.context_tapath_outsize) = 0; + } + } else + { + context->ta_path = NULL; + } + context->session_list.next = (struct ListNode *) rs_inicont_ins.context_sessionlist_next; + context->session_list.prev = (struct ListNode *) rs_inicont_ins.context_sessionlist_prev; + context->shrd_mem_list.next = (struct ListNode *) rs_inicont_ins.context_shrdmemlist_next; + context->shrd_mem_list.prev = (struct ListNode *) rs_inicont_ins.context_shrdmemlist_prev; + context->share_buffer.buffer = (void *) rs_inicont_ins.context_sharebuffer_buffer; + context->share_buffer.buffer_barrier.__align = rs_inicont_ins.context_sharebuffer_bufferbarrier; + glob_scontaddr = rs_inicont_ins.context_addr; + } + return static_cast(rs_inicont_ins.teecresult); +} + +void +TEEC_FinalizeContext(TEEC_Context *context) +{ + std::int32_t in_context_fd; + std::uint8_t *in_context_tapath; + std::int32_t in_context_tapath_size; + std::uint64_t in_context_sessionlist_next; + std::uint64_t in_context_sessionlist_prev; + std::uint64_t in_context_shrdmemlist_next; + std::uint64_t in_context_shrdmemlist_prev; + std::uint64_t in_context_sharebuffer_buffer; + std::int64_t in_context_sharebuffer_bufferbarrier; + struct retstru_teec_fincont rs_fincont_ins; + + + if (gpp_channel == NULL) + { + std::cout << "libteecc: the grpc client or channel is null, when executing TEEC_FinalizeContext." << std::endl; + return; + } + + if (context == NULL) + { + return; + } + + in_context_fd = context->fd; + in_context_tapath = context->ta_path; + if (in_context_tapath == NULL) + { + in_context_tapath_size = 0; + } else + { + std::string strtmp((char *) in_context_tapath); + bool bResult; + bResult = utf8_check_is_valid(strtmp); + if (bResult == true) + { + in_context_tapath_size = strtmp.length(); + } else + { + in_context_tapath_size = 0; + } + } + in_context_sessionlist_next = (uint64_t) context->session_list.next; + in_context_sessionlist_prev = (uint64_t) context->session_list.prev; + in_context_shrdmemlist_next = (uint64_t) context->shrd_mem_list.next; + in_context_shrdmemlist_prev = (uint64_t) context->shrd_mem_list.prev; + in_context_sharebuffer_buffer = (uint64_t) context->share_buffer.buffer; + in_context_sharebuffer_bufferbarrier = context->share_buffer.buffer_barrier.__align; + + rs_fincont_ins = client->externc_teec_finalizecontext(in_context_fd, + in_context_tapath, + in_context_tapath_size, + in_context_sessionlist_next, + in_context_sessionlist_prev, + in_context_shrdmemlist_next, + in_context_shrdmemlist_prev, + in_context_sharebuffer_buffer, + in_context_sharebuffer_bufferbarrier, + glob_scontaddr); + if (rs_fincont_ins.flag == 1) + { + std::cout << "libteecc: fincont token null" << std::endl; + return; + } + if (rs_fincont_ins.flag == 2) + { + std::cout << "libteecc: fincont jwt validate error" << std::endl; + return; + } +#if 0 + std::cout << "externc_teec_finalizecontext: " << std::endl; + std::cout << "gpp reply context_fd: " << rs_fincont_ins.context_fd < 0){ + std::cout << "gpp reply context_tapath: " << rs_fincont_ins.context_tapath <fd = rs_fincont_ins.context_fd; + if ( + rs_fincont_ins.context_tapath_outsize > 0 && + rs_fincont_ins.context_tapath != NULL + ) + { + if (context->ta_path == NULL) + { + return; + } + } + context->session_list.next = (struct ListNode *) rs_fincont_ins.context_sessionlist_next; + context->session_list.prev = (struct ListNode *) rs_fincont_ins.context_sessionlist_prev; + context->shrd_mem_list.next = (struct ListNode *) rs_fincont_ins.context_shrdmemlist_next; + context->shrd_mem_list.prev = (struct ListNode *) rs_fincont_ins.context_shrdmemlist_prev; + context->share_buffer.buffer = (void *) rs_fincont_ins.context_sharebuffer_buffer; + context->share_buffer.buffer_barrier.__align = rs_fincont_ins.context_sharebuffer_bufferbarrier; + + gpp_channel.reset(); + delete gpp_channel.get(); + delete client; +} + +TEEC_Result +TEEC_OpenSession(TEEC_Context *context, + TEEC_Session *session, + const TEEC_UUID *destination, + uint32_t connectionMethod, + const void *connectionData, + TEEC_Operation *operation, + uint32_t *returnOrigin +) +{ + + std::int32_t in_context_fd; + std::uint8_t *in_context_tapath; + std::int32_t in_context_tapath_size; + std::uint64_t in_context_sessionlist_next; + std::uint64_t in_context_sessionlist_prev; + std::uint64_t in_context_shrdmemlist_next; + std::uint64_t in_context_shrdmemlist_prev; + std::uint64_t in_context_sharebuffer_buffer; + std::int64_t in_context_sharebuffer_bufferbarrier; + + if (gpp_channel == NULL) + { + std::cout << "libteecc: the grpc client or channel is null, when executing TEEC_OpenSession." << std::endl; + return TEEC_ERROR_GRPC_ERROR; + } + + if (context == NULL) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + + if (session == NULL) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + + if (destination == NULL) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + + in_context_fd = context->fd; + in_context_tapath = context->ta_path; + + if (in_context_tapath == NULL) + { + in_context_tapath_size = 0; + } else + { + in_context_tapath_size = strlen((const char *) in_context_tapath); + } + in_context_sessionlist_next = (uint64_t) context->session_list.next; + in_context_sessionlist_prev = (uint64_t) context->session_list.prev; + in_context_shrdmemlist_next = (uint64_t) context->shrd_mem_list.next; + in_context_shrdmemlist_prev = (uint64_t) context->shrd_mem_list.prev; + in_context_sharebuffer_buffer = (uint64_t) context->share_buffer.buffer; + in_context_sharebuffer_bufferbarrier = context->share_buffer.buffer_barrier.__align; + + uint32_t in_destination_timelow; + uint32_t in_destination_timemid; + uint32_t in_destination_timehiandver; + uint8_t in_destination_clockseqandnode[8]; + int32_t in_destination_clockseqandnode_size; + + uint32_t in_connectionmethod; + uint64_t in_connectiondata; + + uint32_t in_operation_started; + uint32_t in_operation_paramtypes; + + uint64_t in_operation_param1_tmpref_buffer; + uint32_t in_operation_param1_tmpref_size; + uint64_t in_operation_param1_memref_parent; + uint32_t in_operation_param1_memref_size; + uint32_t in_operation_param1_memref_offset; + uint32_t in_operation_param1_value_a; + uint32_t in_operation_param1_value_b; + int32_t in_operation_param1_ionref_ionsharefd; + uint32_t in_operation_param1_ionref_ionsize; + + uint64_t in_operation_param2_tmpref_buffer; + uint32_t in_operation_param2_tmpref_size; + uint64_t in_operation_param2_memref_parent; + uint32_t in_operation_param2_memref_size; + uint32_t in_operation_param2_memref_offset; + uint32_t in_operation_param2_value_a; + uint32_t in_operation_param2_value_b; + int32_t in_operation_param2_ionref_ionsharefd; + uint32_t in_operation_param2_ionref_ionsize; + + uint64_t in_operation_param3_tmpref_buffer; + uint32_t in_operation_param3_tmpref_size; + uint64_t in_operation_param3_memref_parent; + uint32_t in_operation_param3_memref_size; + uint32_t in_operation_param3_memref_offset; + uint32_t in_operation_param3_value_a; + uint32_t in_operation_param3_value_b; + int32_t in_operation_param3_ionref_ionsharefd; + uint32_t in_operation_param3_ionref_ionsize; + + uint64_t in_operation_param4_tmpref_buffer; + uint32_t in_operation_param4_tmpref_size; + uint64_t in_operation_param4_memref_parent; + uint32_t in_operation_param4_memref_size; + uint32_t in_operation_param4_memref_offset; + uint32_t in_operation_param4_value_a; + uint32_t in_operation_param4_value_b; + int32_t in_operation_param4_ionref_ionsharefd; + uint32_t in_operation_param4_ionref_ionsize; + + uint64_t in_operation_session; + int32_t in_operation_cancelflag; + + uint32_t in_returnorigin; + + struct retstru_teec_opensession rs_opensession_ins; + + + in_destination_timelow = destination->timeLow; + in_destination_timemid = destination->timeMid; + in_destination_timehiandver = destination->timeHiAndVersion; + for (int i = 0; i < 8; i++) + { + in_destination_clockseqandnode[i] = destination->clockSeqAndNode[i]; + } + in_destination_clockseqandnode_size = 8; + + in_connectionmethod = connectionMethod; + in_connectiondata = (uint64_t) connectionData; + + in_operation_started = operation->started; + in_operation_paramtypes = operation->paramTypes; + + in_operation_param1_tmpref_buffer = (uint64_t) operation->params[0].tmpref.buffer; + in_operation_param1_tmpref_size = operation->params[0].tmpref.size; + in_operation_param1_memref_parent = (uint64_t) operation->params[0].memref.parent; + in_operation_param1_memref_size = operation->params[0].memref.size; + in_operation_param1_memref_offset = operation->params[0].memref.offset; + in_operation_param1_value_a = operation->params[0].value.a; + in_operation_param1_value_b = operation->params[0].value.b; + in_operation_param1_ionref_ionsharefd = operation->params[0].ionref.ion_share_fd; + in_operation_param1_ionref_ionsize = operation->params[0].ionref.ion_size; + + in_operation_param2_tmpref_buffer = (uint64_t) operation->params[1].tmpref.buffer; + in_operation_param2_tmpref_size = operation->params[1].tmpref.size; + in_operation_param2_memref_parent = (uint64_t) operation->params[1].memref.parent; + in_operation_param2_memref_size = operation->params[1].memref.size; + in_operation_param2_memref_offset = operation->params[1].memref.offset; + in_operation_param2_value_a = operation->params[1].value.a; + in_operation_param2_value_b = operation->params[1].value.b; + in_operation_param2_ionref_ionsharefd = operation->params[1].ionref.ion_share_fd; + in_operation_param2_ionref_ionsize = operation->params[1].ionref.ion_size; + + in_operation_param3_tmpref_buffer = (uint64_t) operation->params[2].tmpref.buffer; + in_operation_param3_tmpref_size = operation->params[2].tmpref.size; + in_operation_param3_memref_parent = (uint64_t) operation->params[2].memref.parent; + in_operation_param3_memref_size = operation->params[2].memref.size; + in_operation_param3_memref_offset = operation->params[2].memref.offset; + in_operation_param3_value_a = operation->params[2].value.a; + in_operation_param3_value_b = operation->params[2].value.b; + in_operation_param3_ionref_ionsharefd = operation->params[2].ionref.ion_share_fd; + in_operation_param3_ionref_ionsize = operation->params[2].ionref.ion_size; + + in_operation_param4_tmpref_buffer = (uint64_t) operation->params[3].tmpref.buffer; + in_operation_param4_tmpref_size = operation->params[3].tmpref.size; + in_operation_param4_memref_parent = (uint64_t) operation->params[3].memref.parent; + in_operation_param4_memref_size = operation->params[3].memref.size; + in_operation_param4_memref_offset = operation->params[3].memref.offset; + in_operation_param4_value_a = operation->params[3].value.a; + in_operation_param4_value_b = operation->params[3].value.b; + in_operation_param4_ionref_ionsharefd = operation->params[3].ionref.ion_share_fd; + in_operation_param4_ionref_ionsize = operation->params[3].ionref.ion_size; + + in_operation_session = (uint64_t) operation->session; + in_operation_cancelflag = operation->cancel_flag; + + in_returnorigin = *returnOrigin; + + rs_opensession_ins = + client->externc_teec_opensession( + in_context_fd, + in_context_tapath, + in_context_tapath_size, + in_context_sessionlist_next, + in_context_sessionlist_prev, + in_context_shrdmemlist_next, + in_context_shrdmemlist_prev, + in_context_sharebuffer_buffer, + in_context_sharebuffer_bufferbarrier, + + in_destination_timelow, + in_destination_timemid, + in_destination_timehiandver, + in_destination_clockseqandnode, + in_destination_clockseqandnode_size, + + in_connectionmethod, + in_connectiondata, + + in_operation_started, + in_operation_paramtypes, + + in_operation_param1_tmpref_buffer, + in_operation_param1_tmpref_size, + in_operation_param1_memref_parent, + in_operation_param1_memref_size, + in_operation_param1_memref_offset, + in_operation_param1_value_a, + in_operation_param1_value_b, + in_operation_param1_ionref_ionsharefd, + in_operation_param1_ionref_ionsize, + + in_operation_param2_tmpref_buffer, + in_operation_param2_tmpref_size, + in_operation_param2_memref_parent, + in_operation_param2_memref_size, + in_operation_param2_memref_offset, + in_operation_param2_value_a, + in_operation_param2_value_b, + in_operation_param2_ionref_ionsharefd, + in_operation_param2_ionref_ionsize, + + in_operation_param3_tmpref_buffer, + in_operation_param3_tmpref_size, + in_operation_param3_memref_parent, + in_operation_param3_memref_size, + in_operation_param3_memref_offset, + in_operation_param3_value_a, + in_operation_param3_value_b, + in_operation_param3_ionref_ionsharefd, + in_operation_param3_ionref_ionsize, + + in_operation_param4_tmpref_buffer, + in_operation_param4_tmpref_size, + in_operation_param4_memref_parent, + in_operation_param4_memref_size, + in_operation_param4_memref_offset, + in_operation_param4_value_a, + in_operation_param4_value_b, + in_operation_param4_ionref_ionsharefd, + in_operation_param4_ionref_ionsize, + + in_operation_session, + in_operation_cancelflag, + in_returnorigin, + glob_scontaddr + ); + if (rs_opensession_ins.flag == 1) + { + std::cout << "libteecc: opensession token null" << std::endl; + return TEEC_ERROR_BAD_PARAMETERS; + } + if (rs_opensession_ins.flag == 2) + { + std::cout << "libteecc: opensession jwt validate error" << std::endl; + return TEEC_ERROR_BAD_PARAMETERS; + } + +#if 0 + std::cout << "externc_teec_opensession:" << std::endl; + std::cout << "gpp request in_context_fd: 0x " << std::hex << std::setfill('0') << std::setw(8) << in_context_fd + << std::endl; + std::cout << "gpp request in_context_addr: 0x" << std::hex << std::setfill('0') << std::setw(8) + << (unsigned long) glob_scontaddr << std::endl; + std::cout << "gpp reply teecresult: " << std::hex << std::setfill('0') << std::setw(8) + << rs_opensession_ins.teecresult << std::endl; + std::cout << "gpp reply context_fd: " << std::hex << std::setfill('0') << std::setw(8) + << rs_opensession_ins.context_fd << std::endl; + + if ( + rs_opensession_ins.context_tapath_outsize > 0 + && + rs_opensession_ins.context_tapath != NULL + ) + { + std::cout << "gpp reply context_tapath: " << rs_opensession_ins.context_tapath << std::endl; + } + printf("gpp reply context_tapath outsize = %ld\n", + rs_opensession_ins.context_tapath_outsize); +#endif + +#if 0 + printf("ret context_sessionlist_next = 0x %16.16lx\n", + rs_opensession_ins.context_sessionlist_next); + printf("ret context_sessionlist_prev = 0x %16.16lx\n", + rs_opensession_ins.context_sessionlist_prev); + printf("ret context_shrdmemlist_next = 0x %16.16lx\n", + rs_opensession_ins.context_shrdmemlist_next); + printf("ret context_shrdmemlist_prev = 0x %16.16lx\n", + rs_opensession_ins.context_shrdmemlist_prev); + printf("ret context_sharebuffer_buffer = 0x %16.16lx\n", + rs_opensession_ins.context_sharebuffer_buffer); + printf("ret context_sharebuffer_bufferbarrier = 0x %16.16lx\n", + (long unsigned int) rs_opensession_ins.context_sharebuffer_bufferbarrier); +#endif + +#if 0 + std::cout << "gpp reply session_sessionid: 0x " << std::hex << std::setfill('0') << std::setw(8) + << rs_opensession_ins.session_sessionid << std::endl; +#endif + +#if 0 + printf("ret session_serviceid_timelow = 0x %8.8x\n", + rs_opensession_ins.session_serviceid_timelow); + printf("ret session_serviceid_timemid = 0x %8.8x\n", + rs_opensession_ins.session_serviceid_timemid); + printf("ret session_serviceid_timehiandver = 0x %8.8x\n", + rs_opensession_ins.session_serviceid_timehiandver); + if ( + rs_opensession_ins.session_serviceid_clockseqandnode_outsize > 0 + && + rs_opensession_ins.session_serviceid_clockseqandnode != NULL + ) { + printf("ret session_serviceid_clockseqandnode = \n"); + for (uintptr_t uisize = 0; + uisize < rs_opensession_ins.session_serviceid_clockseqandnode_outsize; + uisize++) { + printf(" %2.2x", *(rs_opensession_ins.session_serviceid_clockseqandnode + uisize)); + } + printf("\n"); + } else { + printf("ret clockseqandnode addr = 0x %16.16lx\n", + (unsigned long) rs_opensession_ins.session_serviceid_clockseqandnode); + } + printf("ret clockseqandnode_outsize = %ld\n", + rs_opensession_ins.session_serviceid_clockseqandnode_outsize); + printf("ret session_opscnt = 0x %8.8x\n", + rs_opensession_ins.session_opscnt); + printf("ret session_head_next = 0x %16.16lx\n", + rs_opensession_ins.session_head_next); + printf("ret session_head_prev = 0x %16.16lx\n", + rs_opensession_ins.session_head_prev); +#endif + +#if 0 + std::cout << "gpp reply session_context: 0x " << std::hex << std::setfill('0') << std::setw(16) + << rs_opensession_ins.session_context << std::endl; +#endif + if (rs_opensession_ins.teecresult == TEEC_SUCCESS) + { + context->fd = rs_opensession_ins.context_fd; + + if ( + rs_opensession_ins.context_tapath_outsize > 0 && + rs_opensession_ins.context_tapath != NULL + ) + { + if (context->ta_path == NULL) + { + return TEEC_ERROR_CONTEXT_TAPATH_NULL; + } + } + context->session_list.next = (struct ListNode *) rs_opensession_ins.context_sessionlist_next; + context->session_list.prev = (struct ListNode *) rs_opensession_ins.context_sessionlist_prev; + context->shrd_mem_list.next = (struct ListNode *) rs_opensession_ins.context_shrdmemlist_next; + context->shrd_mem_list.prev = (struct ListNode *) rs_opensession_ins.context_shrdmemlist_prev; + context->share_buffer.buffer = (void *) rs_opensession_ins.context_sharebuffer_buffer; + context->share_buffer.buffer_barrier.__align = rs_opensession_ins.context_sharebuffer_bufferbarrier; + + session->session_id = rs_opensession_ins.session_sessionid; + session->service_id.timeLow = rs_opensession_ins.session_serviceid_timelow; + session->service_id.timeMid = rs_opensession_ins.session_serviceid_timemid; + session->service_id.timeHiAndVersion = rs_opensession_ins.session_serviceid_timehiandver; + + if (rs_opensession_ins.session_serviceid_clockseqandnode_outsize <= 8 && + rs_opensession_ins.session_serviceid_clockseqandnode_outsize > 0 && + rs_opensession_ins.session_serviceid_clockseqandnode != NULL && + session->service_id.clockSeqAndNode != NULL + ) + { + for (int i = 0; i < rs_opensession_ins.session_serviceid_clockseqandnode_outsize; i++) + { + session->service_id.clockSeqAndNode[i] = + (uint8_t)(rs_opensession_ins.session_serviceid_clockseqandnode[i] & 0x000000ff); + } + } else + { + for (int i = 0; i < 8; i++) + { + session->service_id.clockSeqAndNode[i] = 0; + } + } + session->ops_cnt = rs_opensession_ins.session_opscnt; + session->head.next = (struct ListNode *) rs_opensession_ins.session_head_next; + session->head.prev = (struct ListNode *) rs_opensession_ins.session_head_prev; + session->context = (TEEC_Context *) rs_opensession_ins.session_context; + + + operation->started = rs_opensession_ins.operation_started; + operation->paramTypes = rs_opensession_ins.operation_paramtypes; + +#if 0 + uint32_t * buffer1_temp = NULL; + if ( + (rs_opensession_ins.operation_paramtypes & 0x000000ff) == TEEC_MEMREF_TEMP_OUTPUT || + (rs_opensession_ins.operation_paramtypes & 0x000000ff) == TEEC_MEMREF_TEMP_INOUT + ) + { + if (operation->params[0].tmpref.buffer == NULL) + { + externc_retstru_teec_opensession_free(rs_opensession_ins); + return TEEC_ERROR_PARAM0_TEMPMEM_NULL; + } + } +#endif + + operation->params[0].tmpref.buffer = (void *) rs_opensession_ins.operation_param1_tmpref_buffer; + operation->params[0].tmpref.size = rs_opensession_ins.operation_param1_tmpref_size; + operation->params[0].memref.parent = + (TEEC_SharedMemory *) rs_opensession_ins.operation_param1_memref_parent; + operation->params[0].memref.size = rs_opensession_ins.operation_param1_memref_size; + operation->params[0].memref.offset = rs_opensession_ins.operation_param1_memref_offset; + operation->params[0].value.a = rs_opensession_ins.operation_param1_value_a; + operation->params[0].value.b = rs_opensession_ins.operation_param1_value_b; + operation->params[0].ionref.ion_share_fd = rs_opensession_ins.operation_param1_ionref_ionsharefd; + operation->params[0].ionref.ion_size = rs_opensession_ins.operation_param1_ionref_ionsize; + + operation->params[1].tmpref.buffer = (void *) rs_opensession_ins.operation_param2_tmpref_buffer; + operation->params[1].tmpref.size = rs_opensession_ins.operation_param2_tmpref_size; + operation->params[1].memref.parent = + (TEEC_SharedMemory *) rs_opensession_ins.operation_param2_memref_parent; + operation->params[1].memref.size = rs_opensession_ins.operation_param2_memref_size; + operation->params[1].memref.offset = rs_opensession_ins.operation_param2_memref_offset; + operation->params[1].value.a = rs_opensession_ins.operation_param2_value_a; + operation->params[1].value.b = rs_opensession_ins.operation_param2_value_b; + operation->params[1].ionref.ion_share_fd = rs_opensession_ins.operation_param2_ionref_ionsharefd; + operation->params[1].ionref.ion_size = rs_opensession_ins.operation_param2_ionref_ionsize; + + operation->params[2].tmpref.buffer = (void *) rs_opensession_ins.operation_param3_tmpref_buffer; + operation->params[2].tmpref.size = rs_opensession_ins.operation_param3_tmpref_size; + operation->params[2].memref.parent = + (TEEC_SharedMemory *) rs_opensession_ins.operation_param3_memref_parent; + operation->params[2].memref.size = rs_opensession_ins.operation_param3_memref_size; + operation->params[2].memref.offset = rs_opensession_ins.operation_param3_memref_offset; + operation->params[2].value.a = rs_opensession_ins.operation_param3_value_a; + operation->params[2].value.b = rs_opensession_ins.operation_param3_value_b; + operation->params[2].ionref.ion_share_fd = rs_opensession_ins.operation_param3_ionref_ionsharefd; + operation->params[2].ionref.ion_size = rs_opensession_ins.operation_param3_ionref_ionsize; + + operation->params[3].tmpref.buffer = (void *) rs_opensession_ins.operation_param4_tmpref_buffer; + operation->params[3].tmpref.size = rs_opensession_ins.operation_param4_tmpref_size; + operation->params[3].memref.parent = + (TEEC_SharedMemory *) rs_opensession_ins.operation_param4_memref_parent; + operation->params[3].memref.size = rs_opensession_ins.operation_param4_memref_size; + operation->params[3].memref.offset = rs_opensession_ins.operation_param4_memref_offset; + operation->params[3].value.a = rs_opensession_ins.operation_param4_value_a; + operation->params[3].value.b = rs_opensession_ins.operation_param4_value_b; + operation->params[3].ionref.ion_share_fd = rs_opensession_ins.operation_param4_ionref_ionsharefd; + operation->params[3].ionref.ion_size = rs_opensession_ins.operation_param4_ionref_ionsize; + + operation->session = (TEEC_Session *) rs_opensession_ins.operation_session; + operation->cancel_flag = rs_opensession_ins.operation_cancelflag; + + *returnOrigin = in_returnorigin; + } + return static_cast(rs_opensession_ins.teecresult); +} + +extern +TEEC_Result +TEEC_InvokeCommand(TEEC_Session *session, + uint32_t commandID, + TEEC_Operation *operation, + uint32_t *returnOrigin +) +{ + uint32_t in_session_sessionid; + uint32_t in_session_serviceid_timelow; + uint32_t in_session_serviceid_timemid; + uint32_t in_session_serviceid_timehiandver; + uint8_t in_session_serviceid_clockseqandnode[8]; + uintptr_t in_session_serviceid_clockseqandnode_size; + uint32_t in_session_opscnt; + uint64_t in_session_head_next; + int64_t in_session_head_prev; + uint64_t in_session_context; + + uint32_t in_commandid; + + uint32_t in_operation_started; + uint32_t in_operation_paramtypes; + + uint64_t in_operation_param1_tmpref_buffer; + uint32_t in_operation_param1_tmpref_size; + uint64_t in_operation_param1_memref_parent; + uint32_t in_operation_param1_memref_parent_flag; + uint32_t in_operation_param1_memref_size; + uint32_t in_operation_param1_memref_offset; + uint32_t in_operation_param1_value_a; + uint32_t in_operation_param1_value_b; + int32_t in_operation_param1_ionref_ionsharefd; + uint32_t in_operation_param1_ionref_ionsize; + + uint64_t in_operation_param2_tmpref_buffer; + uint32_t in_operation_param2_tmpref_size; + uint64_t in_operation_param2_memref_parent; + uint32_t in_operation_param2_memref_parent_flag; + uint32_t in_operation_param2_memref_size; + uint32_t in_operation_param2_memref_offset; + uint32_t in_operation_param2_value_a; + uint32_t in_operation_param2_value_b; + int32_t in_operation_param2_ionref_ionsharefd; + uint32_t in_operation_param2_ionref_ionsize; + + uint64_t in_operation_param3_tmpref_buffer; + uint32_t in_operation_param3_tmpref_size; + uint64_t in_operation_param3_memref_parent; + uint32_t in_operation_param3_memref_parent_flag; + uint32_t in_operation_param3_memref_size; + uint32_t in_operation_param3_memref_offset; + uint32_t in_operation_param3_value_a; + uint32_t in_operation_param3_value_b; + int32_t in_operation_param3_ionref_ionsharefd; + uint32_t in_operation_param3_ionref_ionsize; + + uint64_t in_operation_param4_tmpref_buffer; + uint32_t in_operation_param4_tmpref_size; + uint64_t in_operation_param4_memref_parent; + uint32_t in_operation_param4_memref_parent_flag; + uint32_t in_operation_param4_memref_size; + uint32_t in_operation_param4_memref_offset; + uint32_t in_operation_param4_value_a; + uint32_t in_operation_param4_value_b; + int32_t in_operation_param4_ionref_ionsharefd; + uint32_t in_operation_param4_ionref_ionsize; + + uint64_t in_operation_session; + int32_t in_operation_cancelflag; + + uint32_t in_returnorigin; + struct retstru_teec_invokecommand rs_invokecommand_ins; + + if (gpp_channel == NULL) + { + std::cout << "libteecc: the grpc client or channel is null, when executing TEEC_InvokeCommand." << std::endl; + return TEEC_ERROR_GRPC_ERROR; + } + + if (session == NULL) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + + if (operation == NULL) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + + in_session_sessionid = session->session_id; + in_session_serviceid_timelow = session->service_id.timeLow; + in_session_serviceid_timemid = session->service_id.timeMid; + in_session_serviceid_timehiandver = session->service_id.timeHiAndVersion; + if ( + session->service_id.clockSeqAndNode != NULL + ) + { + for (int i = 0; i < 8; i++) + { + in_session_serviceid_clockseqandnode[i] = + session->service_id.clockSeqAndNode[i]; + } + } else + { + for (int i = 0; i < 8; i++) + { + in_session_serviceid_clockseqandnode[i] = 0; + } + } + in_session_serviceid_clockseqandnode_size = 8; + in_session_opscnt = session->ops_cnt; + in_session_head_next = (uint64_t) session->head.next; + in_session_head_prev = (uint64_t) session->head.prev; + in_session_context = glob_scontaddr; + + in_commandid = commandID; + + in_operation_started = operation->started; + in_operation_paramtypes = operation->paramTypes; + + in_operation_param1_ionref_ionsharefd = operation->params[0].ionref.ion_share_fd; + in_operation_param1_ionref_ionsize = operation->params[0].ionref.ion_size; + + in_operation_param2_ionref_ionsharefd = operation->params[1].ionref.ion_share_fd; + in_operation_param2_ionref_ionsize = operation->params[1].ionref.ion_size; + + in_operation_param3_ionref_ionsharefd = operation->params[2].ionref.ion_share_fd; + in_operation_param3_ionref_ionsize = operation->params[2].ionref.ion_size; + + in_operation_param4_ionref_ionsharefd = operation->params[3].ionref.ion_share_fd; + in_operation_param4_ionref_ionsize = operation->params[3].ionref.ion_size; + + uint8_t *in_buffer1 = NULL; + uintptr_t in_buffer1_size = 0; + + switch ( + TEEC_PARAM_TYPE_GET(operation->paramTypes, 0) + ) + { + case TEEC_VALUE_INPUT: + case TEEC_VALUE_INOUT: + { + in_operation_param1_value_a = operation->params[0].value.a; + in_operation_param1_value_b = operation->params[0].value.b; + + break; + } + case TEEC_MEMREF_TEMP_INPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if ( + operation->params[0].tmpref.buffer == NULL + ) + { + return TEEC_ERROR_PARAM0_TEMPMEM_NULL; + } + if ( + operation->params[0].tmpref.size <= 0 + ) + { + return TEEC_ERROR_PARAM0_TEMPMEM_LESS; + } + + in_operation_param1_tmpref_buffer = (uint64_t) operation->params[0].tmpref.buffer; + in_operation_param1_tmpref_size = operation->params[0].tmpref.size; + + in_buffer1_size = operation->params[0].tmpref.size; + in_buffer1 = (uint8_t *) malloc(in_buffer1_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer1_size; isize++) + { + in_buffer1[isize] = (uint8_t) * ((uint8_t * )(operation->params[0].tmpref.buffer) + isize); + } + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + { + if ( + operation->params[0].tmpref.buffer == NULL + ) + { + return TEEC_ERROR_PARAM0_TEMPMEM_NULL; + } + if ( + operation->params[0].tmpref.size <= 0 + ) + { + return TEEC_ERROR_PARAM0_TEMPMEM_LESS; + } + + in_operation_param1_tmpref_buffer = (uint64_t) operation->params[0].tmpref.buffer; + in_operation_param1_tmpref_size = operation->params[0].tmpref.size; + + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + switch (operation->params[0].memref.parent->flags) + { + case TEEC_MEM_INPUT: + case TEEC_MEM_INOUT: + { + if ( + operation->params[0].memref.parent->buffer == NULL || + operation->params[0].memref.parent->ops_cnt != 0xfffe + ) + { + return TEEC_ERROR_PARAM0_MEMREF_NULL; + } + if ( + operation->params[0].memref.parent->size <= 0 + ) + { + return TEEC_ERROR_PARAM0_MEMREF_LESS; + } + + in_operation_param1_memref_parent = + (uint64_t) operation->params[0].memref.parent->buffer; + in_operation_param1_memref_parent_flag = + (uint32_t) operation->params[0].memref.parent->flags; + in_operation_param1_memref_size = operation->params[0].memref.size; + + in_buffer1_size = operation->params[0].memref.parent->size; + in_buffer1 = (uint8_t *) malloc(in_buffer1_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer1_size; isize++) + { + in_buffer1[isize] = + (uint8_t) * ((uint8_t * )( + operation->params[0].memref.parent->buffer + ) + + isize + ); + } + + break; + } + + case TEEC_MEM_OUTPUT: + { + if ( + operation->params[0].memref.parent->buffer == NULL || + operation->params[0].memref.parent->ops_cnt != 0xfffe + ) + { + return TEEC_ERROR_PARAM0_MEMREF_NULL; + } + if ( + operation->params[0].memref.parent->size <= 0 + ) + { + return TEEC_ERROR_PARAM0_MEMREF_LESS; + } + + in_operation_param1_memref_parent = + (uint64_t) operation->params[0].memref.parent->buffer; + in_operation_param1_memref_parent_flag = + (uint32_t) operation->params[0].memref.parent->flags; + in_operation_param1_memref_size = operation->params[0].memref.size; + + break; + } + + default: + { + return TEEC_ERROR_NO_SHAREMEMFLAG; + break; + } + + } // end of switch(operation->params[0].memref.parent->flags) + + break; + } + // end of case TEEC_MEMREF_WHOLE + + + case TEEC_MEMREF_PARTIAL_INPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operation->params[0].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM0_MEMREF_NULL; + } + if (operation->params[0].memref.parent->size <= 0) + { + return TEEC_ERROR_PARAM0_MEMREF_LESS; + } + + in_operation_param1_memref_parent = + (uint64_t) operation->params[0].memref.parent->buffer; + in_operation_param1_memref_parent_flag = + (uint32_t) operation->params[0].memref.parent->flags; + in_operation_param1_memref_offset = operation->params[0].memref.offset; + in_operation_param1_memref_size = operation->params[0].memref.size; + + in_buffer1_size = operation->params[0].memref.parent->size; + in_buffer1 = (uint8_t *) malloc(in_buffer1_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer1_size; isize++) + { + in_buffer1[isize] = + (uint8_t) * ((uint8_t * )(operation->params[0].memref.parent->buffer) + isize); + } + + break; + } + // end of case TEEC_MEMREF_PARTIAL_INPUT INOUT + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + { + if (operation->params[0].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM0_MEMREF_NULL; + } + if (operation->params[0].memref.parent->size <= 0) + { + return TEEC_ERROR_PARAM0_MEMREF_LESS; + } + + in_operation_param1_memref_parent = + (uint64_t) operation->params[0].memref.parent->buffer; + in_operation_param1_memref_parent_flag = + (uint32_t) operation->params[0].memref.parent->flags; + in_operation_param1_memref_offset = operation->params[0].memref.offset; + in_operation_param1_memref_size = operation->params[0].memref.size; + + in_buffer1_size = operation->params[0].memref.parent->size; + in_buffer1 = (uint8_t *) malloc(in_buffer1_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer1_size; isize++) + { + in_buffer1[isize] = 0x0; + } + + + break; + } + // end of case TEEC_MEMREF_PARTIAL_OUTPUT + + + default: + break; + } + + + uint8_t *in_buffer2 = NULL; + uintptr_t in_buffer2_size = 0; + switch ( + TEEC_PARAM_TYPE_GET(operation->paramTypes, 1) + ) + { + case TEEC_VALUE_INPUT: + case TEEC_VALUE_INOUT: + { + in_operation_param2_value_a = operation->params[1].value.a; + in_operation_param2_value_b = operation->params[1].value.b; + + break; + } + + case TEEC_MEMREF_TEMP_INPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if ( + operation->params[1].tmpref.buffer == NULL + ) + { + return TEEC_ERROR_PARAM1_TEMPMEM_NULL; + } + if ( + operation->params[1].tmpref.size <= 0 + ) + { + return TEEC_ERROR_PARAM1_TEMPMEM_LESS; + } + + in_operation_param2_tmpref_buffer = (uint64_t) operation->params[1].tmpref.buffer; + in_operation_param2_tmpref_size = operation->params[1].tmpref.size; + + in_buffer2_size = operation->params[1].tmpref.size; + in_buffer2 = (uint8_t *) malloc(in_buffer2_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer2_size; isize++) + { + in_buffer2[isize] = (uint8_t) * ((uint8_t * )(operation->params[1].tmpref.buffer) + isize); + } + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + { + if ( + operation->params[1].tmpref.buffer == NULL + ) + { + return TEEC_ERROR_PARAM1_TEMPMEM_NULL; + } + if ( + operation->params[1].tmpref.size <= 0 + ) + { + return TEEC_ERROR_PARAM1_TEMPMEM_LESS; + } + + in_operation_param2_tmpref_buffer = (uint64_t) operation->params[1].tmpref.buffer; + in_operation_param2_tmpref_size = operation->params[1].tmpref.size; + + break; + } + + case TEEC_MEMREF_WHOLE: + { + switch (operation->params[1].memref.parent->flags) + { + case TEEC_MEM_INPUT: + case TEEC_MEM_INOUT: + { + if ( + operation->params[1].memref.parent->buffer == NULL + ) + { + return TEEC_ERROR_PARAM1_MEMREF_NULL; + } + if ( + operation->params[1].memref.parent->size <= 0 + ) + { + return TEEC_ERROR_PARAM1_MEMREF_LESS; + } + + in_operation_param2_memref_parent = + (uint64_t) operation->params[1].memref.parent->buffer; + in_operation_param2_memref_parent_flag = + (uint32_t) operation->params[1].memref.parent->flags; + in_operation_param2_memref_size = operation->params[1].memref.size; + + in_buffer2_size = operation->params[1].memref.parent->size; + in_buffer2 = (uint8_t *) malloc(in_buffer2_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer2_size; isize++) + { + in_buffer2[isize] = + (uint8_t) * ((uint8_t * )( + operation->params[1].memref.parent->buffer + ) + + isize + ); + } + + break; + } + + case TEEC_MEM_OUTPUT: + { + if ( + operation->params[1].memref.parent->buffer == NULL + ) + { + return TEEC_ERROR_PARAM1_MEMREF_NULL; + } + if ( + operation->params[1].memref.parent->size <= 0 + ) + { + return TEEC_ERROR_PARAM1_MEMREF_LESS; + } + + in_operation_param2_memref_parent = + (uint64_t) operation->params[1].memref.parent->buffer; + in_operation_param2_memref_parent_flag = + (uint32_t) operation->params[1].memref.parent->flags; + in_operation_param2_memref_size = operation->params[1].memref.size; + + break; + } + + default: + { + return TEEC_ERROR_NO_SHAREMEMFLAG; + break; + } + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_INPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operation->params[1].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM0_MEMREF_NULL; + } + if (operation->params[1].memref.parent->size <= 0) + { + return TEEC_ERROR_PARAM0_MEMREF_LESS; + } + + in_operation_param2_memref_parent = + (uint64_t) operation->params[1].memref.parent->buffer; + in_operation_param2_memref_parent_flag = + (uint32_t) operation->params[1].memref.parent->flags; + in_operation_param2_memref_offset = operation->params[1].memref.offset; + in_operation_param2_memref_size = operation->params[1].memref.size; + + in_buffer2_size = operation->params[1].memref.parent->size; + in_buffer2 = (uint8_t *) malloc(in_buffer2_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer2_size; isize++) + { + in_buffer2[isize] = + (uint8_t) * ((uint8_t * )(operation->params[1].memref.parent->buffer) + isize); + } + + break; + } + // end of case TEEC_MEMREF_PARTIAL_INPUT INOUT + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + { + if (operation->params[1].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM1_MEMREF_NULL; + } + if (operation->params[1].memref.parent->size <= 0) + { + return TEEC_ERROR_PARAM1_MEMREF_LESS; + } + + in_operation_param2_memref_parent = + (uint64_t) operation->params[1].memref.parent->buffer; + in_operation_param2_memref_parent_flag = + (uint32_t) operation->params[1].memref.parent->flags; + in_operation_param2_memref_offset = operation->params[1].memref.offset; + in_operation_param2_memref_size = operation->params[1].memref.size; + + in_buffer2_size = operation->params[1].memref.parent->size; + in_buffer2 = (uint8_t *) malloc(in_buffer2_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer2_size; isize++) + { + in_buffer2[isize] = 0x0; + } + + break; + } + // end of case TEEC_MEMREF_PARTIAL_OUTPUT + + + default: + break; + } + + uint8_t *in_buffer3 = NULL; + uintptr_t in_buffer3_size = 0; + switch ( + TEEC_PARAM_TYPE_GET(operation->paramTypes, 2) + ) + { + case TEEC_VALUE_INPUT: + case TEEC_VALUE_INOUT: + { + in_operation_param3_value_a = operation->params[2].value.a; + in_operation_param3_value_b = operation->params[2].value.b; + + break; + } + + case TEEC_MEMREF_TEMP_INPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if ( + operation->params[2].tmpref.buffer == NULL + ) + { + return TEEC_ERROR_PARAM2_TEMPMEM_NULL; + } + if ( + operation->params[2].tmpref.size <= 0 + ) + { + return TEEC_ERROR_PARAM2_TEMPMEM_LESS; + } + + in_operation_param3_tmpref_buffer = (uint64_t) operation->params[2].tmpref.buffer; + in_operation_param3_tmpref_size = operation->params[2].tmpref.size; + + in_buffer3_size = operation->params[2].tmpref.size; + in_buffer3 = (uint8_t *) malloc(in_buffer3_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer3_size; isize++) + { + in_buffer3[isize] = (uint8_t) * ((uint8_t * )(operation->params[2].tmpref.buffer) + isize); + } + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + { + if ( + operation->params[2].tmpref.buffer == NULL + ) + { + return TEEC_ERROR_PARAM2_TEMPMEM_NULL; + } + if ( + operation->params[2].tmpref.size <= 0 + ) + { + return TEEC_ERROR_PARAM2_TEMPMEM_LESS; + } + + in_operation_param3_tmpref_buffer = (uint64_t) operation->params[2].tmpref.buffer; + in_operation_param3_tmpref_size = operation->params[2].tmpref.size; + + break; + } + + case TEEC_MEMREF_WHOLE: + { + switch (operation->params[2].memref.parent->flags) + { + case TEEC_MEM_INPUT: + case TEEC_MEM_INOUT: + { + if ( + operation->params[2].memref.parent->buffer == NULL + ) + { + return TEEC_ERROR_PARAM2_MEMREF_NULL; + } + if ( + operation->params[2].memref.parent->size <= 0 + ) + { + return TEEC_ERROR_PARAM2_MEMREF_LESS; + } + + in_operation_param3_memref_parent = + (uint64_t) operation->params[2].memref.parent->buffer; + in_operation_param3_memref_parent_flag = + (uint32_t) operation->params[2].memref.parent->flags; + in_operation_param3_memref_size = operation->params[2].memref.size; + + in_buffer3_size = operation->params[2].memref.parent->size; + in_buffer3 = (uint8_t *) malloc(in_buffer3_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer3_size; isize++) + { + in_buffer3[isize] = + (uint8_t) * ((uint8_t * )( + operation->params[2].memref.parent->buffer + ) + + isize + ); + } + + break; + } + + case TEEC_MEM_OUTPUT: + { + if ( + operation->params[2].memref.parent->buffer == NULL + ) + { + return TEEC_ERROR_PARAM2_MEMREF_NULL; + } + if ( + operation->params[2].memref.parent->size <= 0 + ) + { + return TEEC_ERROR_PARAM2_MEMREF_LESS; + } + + in_operation_param3_memref_parent = + (uint64_t) operation->params[2].memref.parent->buffer; + in_operation_param3_memref_parent_flag = + (uint32_t) operation->params[2].memref.parent->flags; + in_operation_param3_memref_size = operation->params[2].memref.size; + + break; + } + + default: + { + return TEEC_ERROR_NO_SHAREMEMFLAG; + break; + } + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_INPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operation->params[2].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM2_MEMREF_NULL; + } + if (operation->params[2].memref.parent->size <= 0) + { + return TEEC_ERROR_PARAM2_MEMREF_LESS; + } + + in_operation_param3_memref_parent = + (uint64_t) operation->params[2].memref.parent->buffer; + in_operation_param3_memref_parent_flag = + (uint32_t) operation->params[2].memref.parent->flags; + in_operation_param3_memref_offset = operation->params[2].memref.offset; + in_operation_param3_memref_size = operation->params[2].memref.size; + + in_buffer3_size = operation->params[2].memref.parent->size; + in_buffer3 = (uint8_t *) malloc(in_buffer3_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer3_size; isize++) + { + in_buffer3[isize] = + (uint8_t) * ((uint8_t * )(operation->params[2].memref.parent->buffer) + isize); + } + + break; + } + // end of case TEEC_MEMREF_PARTIAL_INPUT INOUT + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + { + if (operation->params[2].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM0_MEMREF_NULL; + } + if (operation->params[2].memref.parent->size <= 0) + { + return TEEC_ERROR_PARAM0_MEMREF_LESS; + } + + in_operation_param3_memref_parent = + (uint64_t) operation->params[2].memref.parent->buffer; + in_operation_param3_memref_parent_flag = + (uint32_t) operation->params[2].memref.parent->flags; + in_operation_param3_memref_offset = operation->params[2].memref.offset; + in_operation_param3_memref_size = operation->params[2].memref.size; + + in_buffer3_size = operation->params[2].memref.parent->size; + in_buffer3 = (uint8_t *) malloc(in_buffer3_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer3_size; isize++) + { + in_buffer3[isize] = 0x0; + } + + break; + } + // end of case TEEC_MEMREF_PARTIAL_OUTPUT + + default: + break; + } + + + uint8_t *in_buffer4 = NULL; + uintptr_t in_buffer4_size = 0; + switch ( + TEEC_PARAM_TYPE_GET(operation->paramTypes, 3) + ) + { + case TEEC_VALUE_INPUT: + case TEEC_VALUE_INOUT: + { + in_operation_param4_value_a = operation->params[3].value.a; + in_operation_param4_value_b = operation->params[3].value.b; + + break; + } + + case TEEC_MEMREF_TEMP_INPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if ( + operation->params[3].tmpref.buffer == NULL + ) + { + return TEEC_ERROR_PARAM3_TEMPMEM_NULL; + } + if ( + operation->params[3].tmpref.size <= 0 + ) + { + return TEEC_ERROR_PARAM3_TEMPMEM_LESS; + } + + in_operation_param4_tmpref_buffer = (uint64_t) operation->params[3].tmpref.buffer; + in_operation_param4_tmpref_size = operation->params[3].tmpref.size; + + in_buffer4_size = operation->params[3].tmpref.size; + in_buffer4 = (uint8_t *) malloc(in_buffer4_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer4_size; isize++) + { + in_buffer4[isize] = (uint8_t) * ((uint8_t * )(operation->params[3].tmpref.buffer) + isize); + } + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + { + if ( + operation->params[3].tmpref.buffer == NULL + ) + { + return TEEC_ERROR_PARAM3_TEMPMEM_NULL; + } + if ( + operation->params[3].tmpref.size <= 0 + ) + { + return TEEC_ERROR_PARAM3_TEMPMEM_LESS; + } + + in_operation_param4_tmpref_buffer = (uint64_t) operation->params[3].tmpref.buffer; + in_operation_param4_tmpref_size = operation->params[3].tmpref.size; + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + switch (operation->params[3].memref.parent->flags) + { + case TEEC_MEM_INPUT: + case TEEC_MEM_INOUT: + { + if ( + operation->params[3].memref.parent->buffer == NULL + ) + { + return TEEC_ERROR_PARAM3_MEMREF_NULL; + } + if ( + operation->params[3].memref.parent->size <= 0 + ) + { + return TEEC_ERROR_PARAM3_MEMREF_LESS; + } + + in_operation_param4_memref_parent = + (uint64_t) operation->params[3].memref.parent->buffer; + in_operation_param4_memref_parent_flag = + (uint32_t) operation->params[3].memref.parent->flags; + in_operation_param4_memref_size = operation->params[3].memref.size; + + in_buffer4_size = operation->params[3].memref.parent->size; + in_buffer4 = (uint8_t *) malloc(in_buffer4_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer4_size; isize++) + { + in_buffer4[isize] = + (uint8_t) * ((uint8_t * )( + operation->params[3].memref.parent->buffer + ) + + isize + ); + } + + break; + } + + case TEEC_MEM_OUTPUT: + { + if ( + operation->params[3].memref.parent->buffer == NULL + ) + { + return TEEC_ERROR_PARAM3_MEMREF_NULL; + } + if ( + operation->params[3].memref.parent->size <= 0 + ) + { + return TEEC_ERROR_PARAM3_MEMREF_LESS; + } + + in_operation_param4_memref_parent = + (uint64_t) operation->params[3].memref.parent->buffer; + in_operation_param4_memref_parent_flag = + (uint32_t) operation->params[3].memref.parent->flags; + in_operation_param4_memref_size = operation->params[3].memref.size; + + break; + } + + default: + { + return TEEC_ERROR_NO_SHAREMEMFLAG; + break; + } + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_INPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operation->params[3].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM3_MEMREF_NULL; + } + if (operation->params[3].memref.parent->size <= 0) + { + return TEEC_ERROR_PARAM3_MEMREF_LESS; + } + + in_operation_param4_memref_parent = + (uint64_t) operation->params[3].memref.parent->buffer; + in_operation_param4_memref_parent_flag = + (uint32_t) operation->params[3].memref.parent->flags; + in_operation_param4_memref_offset = operation->params[3].memref.offset; + in_operation_param4_memref_size = operation->params[3].memref.size; + + in_buffer4_size = operation->params[3].memref.parent->size; + in_buffer4 = (uint8_t *) malloc(in_buffer4_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer4_size; isize++) + { + in_buffer4[isize] = + (uint8_t) * ((uint8_t * )(operation->params[3].memref.parent->buffer) + isize); + } + + break; + } + // end of case TEEC_MEMREF_PARTIAL_INPUT INOUT + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + { + if (operation->params[3].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM0_MEMREF_NULL; + } + if (operation->params[3].memref.parent->size <= 0) + { + return TEEC_ERROR_PARAM0_MEMREF_LESS; + } + + in_operation_param4_memref_parent = + (uint64_t) operation->params[3].memref.parent->buffer; + in_operation_param4_memref_parent_flag = + (uint32_t) operation->params[3].memref.parent->flags; + in_operation_param4_memref_offset = operation->params[3].memref.offset; + in_operation_param4_memref_size = operation->params[3].memref.size; + + in_buffer4_size = operation->params[3].memref.parent->size; + in_buffer4 = (uint8_t *) malloc(in_buffer4_size * sizeof(uint8_t)); + for (int isize = 0; isize < in_buffer4_size; isize++) + { + in_buffer4[isize] = 0x0; + } + + break; + } + // end of case TEEC_MEMREF_PARTIAL_OUTPUT + + + default: + break; + } + + + in_operation_session = (uint64_t) operation->session; + in_operation_cancelflag = operation->cancel_flag; + + if (returnOrigin == NULL) + { + in_returnorigin = 0; + } else + { + in_returnorigin = *returnOrigin; + } + + rs_invokecommand_ins = + client->externc_teec_invokecommand( + in_session_sessionid, + in_session_serviceid_timelow, + in_session_serviceid_timemid, + in_session_serviceid_timehiandver, + in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_size, + in_session_opscnt, + in_session_head_next, + in_session_head_prev, + in_session_context, + + in_commandid, + + in_operation_started, + in_operation_paramtypes, + + in_operation_param1_tmpref_buffer, + in_operation_param1_tmpref_size, + in_operation_param1_memref_parent, + in_operation_param1_memref_parent_flag, + in_operation_param1_memref_size, + in_operation_param1_memref_offset, + in_operation_param1_value_a, + in_operation_param1_value_b, + in_operation_param1_ionref_ionsharefd, + in_operation_param1_ionref_ionsize, + + in_operation_param2_tmpref_buffer, + in_operation_param2_tmpref_size, + in_operation_param2_memref_parent, + in_operation_param2_memref_parent_flag, + in_operation_param2_memref_size, + in_operation_param2_memref_offset, + in_operation_param2_value_a, + in_operation_param2_value_b, + in_operation_param2_ionref_ionsharefd, + in_operation_param2_ionref_ionsize, + + in_operation_param3_tmpref_buffer, + in_operation_param3_tmpref_size, + in_operation_param3_memref_parent, + in_operation_param3_memref_parent_flag, + in_operation_param3_memref_size, + in_operation_param3_memref_offset, + in_operation_param3_value_a, + in_operation_param3_value_b, + in_operation_param3_ionref_ionsharefd, + in_operation_param3_ionref_ionsize, + + in_operation_param4_tmpref_buffer, + in_operation_param4_tmpref_size, + in_operation_param4_memref_parent, + in_operation_param4_memref_parent_flag, + in_operation_param4_memref_size, + in_operation_param4_memref_offset, + in_operation_param4_value_a, + in_operation_param4_value_b, + in_operation_param4_ionref_ionsharefd, + in_operation_param4_ionref_ionsize, + + in_operation_session, + in_operation_cancelflag, + + in_returnorigin, + + in_buffer1, + in_buffer1_size, + in_buffer2, + in_buffer2_size, + in_buffer3, + in_buffer3_size, + in_buffer4, + in_buffer4_size + ); + if (rs_invokecommand_ins.flag == 1) + { + std::cout << "libteecc: invoke token null" << std::endl; + return TEEC_ERROR_TOKEN_NULL; + } + if (rs_invokecommand_ins.flag == 2) + { + std::cout << "libteecc: invoke jwt validate error" << std::endl; + return TEEC_ERROR_JWTVALIDATE_FAIL; + } + if (rs_invokecommand_ins.teecresult == TEEC_SUCCESS) + { + session->session_id = rs_invokecommand_ins.session_sessionid; + session->service_id.timeLow = rs_invokecommand_ins.session_serviceid_timelow; + session->service_id.timeMid = rs_invokecommand_ins.session_serviceid_timemid; + session->service_id.timeHiAndVersion = rs_invokecommand_ins.session_serviceid_timehiandver; + if (rs_invokecommand_ins.session_serviceid_clockseqandnode_outsize <= 8 && + rs_invokecommand_ins.session_serviceid_clockseqandnode_outsize > 0 && + rs_invokecommand_ins.session_serviceid_clockseqandnode != NULL && + session->service_id.clockSeqAndNode != NULL + ) + { + for (int i = 0; i < rs_invokecommand_ins.session_serviceid_clockseqandnode_outsize; i++) + { + session->service_id.clockSeqAndNode[i] = + (uint8_t)(rs_invokecommand_ins.session_serviceid_clockseqandnode[i] & 0x000000ff); + } + } else + { + for (int i = 0; i < 8; i++) + { + session->service_id.clockSeqAndNode[i] = 0; + } + } + session->ops_cnt = rs_invokecommand_ins.session_opscnt; + session->head.next = (struct ListNode *) rs_invokecommand_ins.session_head_next; + session->head.prev = (struct ListNode *) rs_invokecommand_ins.session_head_prev; + session->context = (TEEC_Context *) rs_invokecommand_ins.session_context; + + operation->started = rs_invokecommand_ins.operation_started; + operation->paramTypes = rs_invokecommand_ins.operation_paramtypes; + + switch ( + TEEC_PARAM_TYPE_GET(rs_invokecommand_ins.operation_paramtypes, 0) + ) + { + case TEEC_VALUE_OUTPUT: + case TEEC_VALUE_INOUT: + { + operation->params[0].value.a = rs_invokecommand_ins.operation_param1_value_a; + operation->params[0].value.b = rs_invokecommand_ins.operation_param1_value_b; + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if (operation->params[0].tmpref.buffer == NULL) + { + return TEEC_ERROR_PARAM0_TEMPMEM_NULL; + } + + if (operation->params[0].tmpref.size < + rs_invokecommand_ins.buffer1_outsize + ) + { + return TEEC_ERROR_PARAM0_TEMPMEM_LESS; + } + + if (rs_invokecommand_ins.buffer1 != NULL && + rs_invokecommand_ins.buffer1_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer1_outsize; iind++) + { + *((uint8_t * )(operation->params[0].tmpref.buffer) + iind) = + *(rs_invokecommand_ins.buffer1 + iind); + } + operation->params[0].tmpref.size = rs_invokecommand_ins.buffer1_outsize; + } + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + operation->params[0].memref.parent->flags = + rs_invokecommand_ins.operation_param1_memref_parent_flag; + switch (operation->params[0].memref.parent->flags) + { + case TEEC_MEM_OUTPUT: + case TEEC_MEM_INOUT: + { + if ( + operation->params[0].memref.parent->buffer == NULL + ) + { + return TEEC_ERROR_PARAM0_MEMREF_NULL; + } + if ( + operation->params[0].memref.parent->size < + rs_invokecommand_ins.buffer1_outsize + ) + { + return TEEC_ERROR_PARAM0_MEMREF_LESS; + } + + if (rs_invokecommand_ins.buffer1 != NULL && + rs_invokecommand_ins.buffer1_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer1_outsize; iind++) + { + *((uint8_t * )(operation->params[0].memref.parent->buffer) + iind) = + *(rs_invokecommand_ins.buffer1 + iind); + } + operation->params[0].memref.size = rs_invokecommand_ins.buffer1_outsize; + operation->params[0].memref.parent->size = rs_invokecommand_ins.buffer1_outsize; + } + + break; + } + + default: + break; + } + + break; + + } + // end of case TEEC_MEMREF_WHOLE: + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operation->params[0].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM0_MEMREF_NULL; + } + if (operation->params[0].memref.parent->size < + rs_invokecommand_ins.buffer1_outsize + ) + { + return TEEC_ERROR_PARAM0_MEMREF_LESS; + } + + if (rs_invokecommand_ins.buffer1 != NULL && + rs_invokecommand_ins.buffer1_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer1_outsize; iind++) + { + *((uint8_t * )(operation->params[0].memref.parent->buffer) + iind) = + *(rs_invokecommand_ins.buffer1 + iind); + } + operation->params[0].memref.parent->size = rs_invokecommand_ins.buffer1_outsize; + + operation->params[0].memref.offset = rs_invokecommand_ins.operation_param1_memref_offset; + operation->params[0].memref.size = rs_invokecommand_ins.operation_param1_memref_size; + } + + break; + } + // end of case TEEC_MEMREF_PARTIAL_OUTPUT, INOUT + + + default: + break; + } + + operation->params[0].ionref.ion_share_fd = rs_invokecommand_ins.operation_param1_ionref_ionsharefd; + operation->params[0].ionref.ion_size = rs_invokecommand_ins.operation_param1_ionref_ionsize; + + + switch ( + TEEC_PARAM_TYPE_GET(rs_invokecommand_ins.operation_paramtypes, 1) + ) + { + case TEEC_VALUE_OUTPUT: + case TEEC_VALUE_INOUT: + { + operation->params[1].value.a = rs_invokecommand_ins.operation_param2_value_a; + operation->params[1].value.b = rs_invokecommand_ins.operation_param2_value_b; + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if (operation->params[1].tmpref.buffer == NULL) + { + return TEEC_ERROR_PARAM0_TEMPMEM_NULL; + } + + if (operation->params[1].tmpref.size < + rs_invokecommand_ins.buffer2_outsize + ) + { + return TEEC_ERROR_PARAM0_TEMPMEM_LESS; + } + + if (rs_invokecommand_ins.buffer2 != NULL && + rs_invokecommand_ins.buffer2_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer2_outsize; iind++) + { + *((uint8_t * )(operation->params[1].tmpref.buffer) + iind) = + *(rs_invokecommand_ins.buffer2 + iind); + } + operation->params[1].tmpref.size = rs_invokecommand_ins.buffer2_outsize; + } + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + operation->params[1].memref.parent->flags = + rs_invokecommand_ins.operation_param2_memref_parent_flag; + switch (operation->params[1].memref.parent->flags) + { + case TEEC_MEM_OUTPUT: + case TEEC_MEM_INOUT: + { + if ( + operation->params[1].memref.parent->buffer == NULL + ) + { + return TEEC_ERROR_PARAM1_MEMREF_NULL; + } + if ( + operation->params[1].memref.parent->size < + rs_invokecommand_ins.buffer2_outsize + ) + { + return TEEC_ERROR_PARAM1_MEMREF_LESS; + } + + if (rs_invokecommand_ins.buffer2 != NULL && + rs_invokecommand_ins.buffer2_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer2_outsize; iind++) + { + *((uint8_t * )(operation->params[1].memref.parent->buffer) + iind) = + *(rs_invokecommand_ins.buffer2 + iind); + } + operation->params[1].memref.size = rs_invokecommand_ins.buffer2_outsize; + operation->params[1].memref.parent->size = rs_invokecommand_ins.buffer2_outsize; + } + + break; + } + + default: + break; + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operation->params[1].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM1_MEMREF_NULL; + } + if (operation->params[1].memref.parent->size < + rs_invokecommand_ins.buffer2_outsize + ) + { + return TEEC_ERROR_PARAM1_MEMREF_LESS; + } + + if (rs_invokecommand_ins.buffer2 != NULL && + rs_invokecommand_ins.buffer2_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer2_outsize; iind++) + { + *((uint8_t * )(operation->params[1].memref.parent->buffer) + iind) = + *(rs_invokecommand_ins.buffer2 + iind); + } + operation->params[1].memref.parent->size = rs_invokecommand_ins.buffer2_outsize; + + operation->params[1].memref.offset = rs_invokecommand_ins.operation_param2_memref_offset; + operation->params[1].memref.size = rs_invokecommand_ins.operation_param2_memref_size; + } + + break; + } + // end of case TEEC_MEMREF_PARTIAL_OUTPUT, INOUT + + + default: + break; + } + + operation->params[1].ionref.ion_share_fd = rs_invokecommand_ins.operation_param2_ionref_ionsharefd; + operation->params[1].ionref.ion_size = rs_invokecommand_ins.operation_param2_ionref_ionsize; + + + switch ( + TEEC_PARAM_TYPE_GET(rs_invokecommand_ins.operation_paramtypes, 2) + ) + { + case TEEC_VALUE_OUTPUT: + case TEEC_VALUE_INOUT: + { + operation->params[2].value.a = rs_invokecommand_ins.operation_param3_value_a; + operation->params[2].value.b = rs_invokecommand_ins.operation_param3_value_b; + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if (operation->params[2].tmpref.buffer == NULL) + { + return TEEC_ERROR_PARAM0_TEMPMEM_NULL; + } + + if (operation->params[2].tmpref.size < + rs_invokecommand_ins.buffer3_outsize + ) + { + return TEEC_ERROR_PARAM0_TEMPMEM_LESS; + } + + if (rs_invokecommand_ins.buffer3 != NULL && + rs_invokecommand_ins.buffer3_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer3_outsize; iind++) + { + *((uint8_t * )(operation->params[2].tmpref.buffer) + iind) = + *(rs_invokecommand_ins.buffer3 + iind); + } + operation->params[2].tmpref.size = rs_invokecommand_ins.buffer3_outsize; + } + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + operation->params[2].memref.parent->flags = + rs_invokecommand_ins.operation_param3_memref_parent_flag; + switch (operation->params[2].memref.parent->flags) + { + case TEEC_MEM_OUTPUT: + case TEEC_MEM_INOUT: + { + if ( + operation->params[2].memref.parent->buffer == NULL + ) + { + return TEEC_ERROR_PARAM2_MEMREF_NULL; + } + if ( + operation->params[2].memref.parent->size < + rs_invokecommand_ins.buffer3_outsize + ) + { + return TEEC_ERROR_PARAM2_MEMREF_LESS; + } + + if (rs_invokecommand_ins.buffer3 != NULL && + rs_invokecommand_ins.buffer3_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer3_outsize; iind++) + { + *((uint8_t * )(operation->params[2].memref.parent->buffer) + iind) = + *(rs_invokecommand_ins.buffer3 + iind); + } + operation->params[2].memref.size = rs_invokecommand_ins.buffer3_outsize; + operation->params[2].memref.parent->size = rs_invokecommand_ins.buffer3_outsize; + } + + break; + } + + default: + break; + } + + break; + + } + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operation->params[2].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM2_MEMREF_NULL; + } + if (operation->params[2].memref.parent->size < + rs_invokecommand_ins.buffer3_outsize + ) + { + return TEEC_ERROR_PARAM2_MEMREF_LESS; + } + + if (rs_invokecommand_ins.buffer3 != NULL && + rs_invokecommand_ins.buffer3_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer3_outsize; iind++) + { + *((uint8_t * )(operation->params[2].memref.parent->buffer) + iind) = + *(rs_invokecommand_ins.buffer3 + iind); + } + operation->params[2].memref.parent->size = rs_invokecommand_ins.buffer3_outsize; + + operation->params[2].memref.offset = rs_invokecommand_ins.operation_param3_memref_offset; + operation->params[2].memref.size = rs_invokecommand_ins.operation_param3_memref_size; + } + + break; + } + // end of case TEEC_MEMREF_PARTIAL_OUTPUT, INOUT + + + default: + break; + } + + operation->params[2].ionref.ion_share_fd = rs_invokecommand_ins.operation_param3_ionref_ionsharefd; + operation->params[2].ionref.ion_size = rs_invokecommand_ins.operation_param3_ionref_ionsize; + + + switch ( + TEEC_PARAM_TYPE_GET(rs_invokecommand_ins.operation_paramtypes, 3) + ) + { + case TEEC_VALUE_OUTPUT: + case TEEC_VALUE_INOUT: + { + operation->params[3].value.a = rs_invokecommand_ins.operation_param4_value_a; + operation->params[3].value.b = rs_invokecommand_ins.operation_param4_value_b; + + break; + } + + case TEEC_MEMREF_TEMP_OUTPUT: + case TEEC_MEMREF_TEMP_INOUT: + { + if (operation->params[3].tmpref.buffer == NULL) + { + return TEEC_ERROR_PARAM0_TEMPMEM_NULL; + } + + if (operation->params[3].tmpref.size < + rs_invokecommand_ins.buffer4_outsize + ) + { + return TEEC_ERROR_PARAM0_TEMPMEM_LESS; + } + + if (rs_invokecommand_ins.buffer4 != NULL && + rs_invokecommand_ins.buffer4_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer4_outsize; iind++) + { + *((uint8_t * )(operation->params[3].tmpref.buffer) + iind) = + *(rs_invokecommand_ins.buffer4 + iind); + } + operation->params[3].tmpref.size = rs_invokecommand_ins.buffer4_outsize; + } + + break; + } + + + case TEEC_MEMREF_WHOLE: + { + operation->params[3].memref.parent->flags = + rs_invokecommand_ins.operation_param4_memref_parent_flag; + switch (operation->params[3].memref.parent->flags) + { + case TEEC_MEM_OUTPUT: + case TEEC_MEM_INOUT: + { + if ( + operation->params[3].memref.parent->buffer == NULL + ) + { + return TEEC_ERROR_PARAM3_MEMREF_NULL; + } + if ( + operation->params[3].memref.parent->size < + rs_invokecommand_ins.buffer4_outsize + ) + { + return TEEC_ERROR_PARAM3_MEMREF_LESS; + } + + if (rs_invokecommand_ins.buffer4 != NULL && + rs_invokecommand_ins.buffer4_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer4_outsize; iind++) + { + *((uint8_t * )(operation->params[3].memref.parent->buffer) + iind) = + *(rs_invokecommand_ins.buffer4 + iind); + } + operation->params[3].memref.size = rs_invokecommand_ins.buffer3_outsize; + operation->params[3].memref.parent->size = rs_invokecommand_ins.buffer3_outsize; + } + + break; + } + + default: + break; + } + + break; + } + + + case TEEC_MEMREF_PARTIAL_OUTPUT: + case TEEC_MEMREF_PARTIAL_INOUT: + { + if (operation->params[3].memref.parent->buffer == NULL) + { + return TEEC_ERROR_PARAM3_MEMREF_NULL; + } + if (operation->params[3].memref.parent->size < + rs_invokecommand_ins.buffer4_outsize + ) + { + return TEEC_ERROR_PARAM3_MEMREF_LESS; + } + + if (rs_invokecommand_ins.buffer4 != NULL && + rs_invokecommand_ins.buffer4_outsize > 0) + { + for (int iind = 0; iind < rs_invokecommand_ins.buffer4_outsize; iind++) + { + *((uint8_t * )(operation->params[3].memref.parent->buffer) + iind) = + *(rs_invokecommand_ins.buffer4 + iind); + } + operation->params[3].memref.parent->size = rs_invokecommand_ins.buffer4_outsize; + + operation->params[3].memref.offset = rs_invokecommand_ins.operation_param4_memref_offset; + operation->params[3].memref.size = rs_invokecommand_ins.operation_param4_memref_size; + } + + break; + } + // end of case TEEC_MEMREF_PARTIAL_OUTPUT, INOUT + + + default: + break; + } + + operation->params[3].ionref.ion_share_fd = rs_invokecommand_ins.operation_param4_ionref_ionsharefd; + operation->params[3].ionref.ion_size = rs_invokecommand_ins.operation_param4_ionref_ionsize; + + + operation->session = (TEEC_Session *) rs_invokecommand_ins.operation_session; + operation->cancel_flag = rs_invokecommand_ins.operation_cancelflag; + + if (returnOrigin != NULL) + { + *returnOrigin = in_returnorigin; + } + } + return static_cast(rs_invokecommand_ins.teecresult); + +} + +void +TEEC_CloseSession(TEEC_Session *session) +{ + if (gpp_channel == NULL) + { + printf("libteec: the grpc client or channel is null, when executing TEEC_CloseSession. \n"); + return; + } + + uint32_t in_session_sessionid; + uint32_t in_session_serviceid_timelow; + uint32_t in_session_serviceid_timemid; + uint32_t in_session_serviceid_timehiandver; + uint8_t in_session_serviceid_clockseqandnode[8]; + uintptr_t in_session_serviceid_clockseqandnode_size; + uint32_t in_session_opscnt; + uint64_t in_session_head_next; + int64_t in_session_head_prev; + uint64_t in_session_context; + + if (session == NULL) + { + return; + } + struct retstru_teec_closesession rs_closesession_ins; + + in_session_sessionid = session->session_id; + in_session_serviceid_timelow = session->service_id.timeLow; + in_session_serviceid_timemid = session->service_id.timeMid; + in_session_serviceid_timehiandver = session->service_id.timeHiAndVersion; + if ( + session->service_id.clockSeqAndNode != NULL + ) + { + for (int i = 0; i < 8; i++) + { + in_session_serviceid_clockseqandnode[i] = + session->service_id.clockSeqAndNode[i]; + } + } else + { + for (int i = 0; i < 8; i++) + { + in_session_serviceid_clockseqandnode[i] = 0; + } + } + in_session_serviceid_clockseqandnode_size = 8; + in_session_opscnt = session->ops_cnt; + in_session_head_next = (uint64_t) session->head.next; + in_session_head_prev = (uint64_t) session->head.prev; + in_session_context = glob_scontaddr; + + rs_closesession_ins = + client->externc_teec_closesession( + in_session_sessionid, + in_session_serviceid_timelow, + in_session_serviceid_timemid, + in_session_serviceid_timehiandver, + in_session_serviceid_clockseqandnode, + in_session_serviceid_clockseqandnode_size, + in_session_opscnt, + in_session_head_next, + in_session_head_prev, + in_session_context + ); + + if (rs_closesession_ins.flag == 1) + { + std::cout << "libteecc: closesession token null" << std::endl; + return; + } + if (rs_closesession_ins.flag == 2) + { + std::cout << "libteecc: closesession jwt validate error" << std::endl; + return; + } +#if 0 + std::cout << "externc_teec_closesession: " << std::endl; + std::cout << "gpp request sessionid: " << in_session_sessionid < 0 + && + rs_closesession_ins.session_serviceid_clockseqandnode != NULL + ) + { + printf("ret session_serviceid_clockseqandnode = \n"); + for (uintptr_t uisize = 0; + uisize < rs_closesession_ins.session_serviceid_clockseqandnode_outsize; + uisize ++) + { + printf(" %2.2x", *(rs_closesession_ins.session_serviceid_clockseqandnode + uisize)); + } + printf("\n"); + } + else + { + printf("ret clockseqandnode addr = 0x %16.16lx\n", + (unsigned long)rs_closesession_ins.session_serviceid_clockseqandnode); + } + printf("ret clockseqandnode_outsize = %ld\n", + rs_closesession_ins.session_serviceid_clockseqandnode_outsize); + printf("ret session_opscnt = 0x %8.8x\n", + rs_closesession_ins.session_opscnt); + printf("ret session_head_next = 0x %16.16lx\n", + rs_closesession_ins.session_head_next); + printf("ret session_head_prev = 0x %16.16lx\n", + rs_closesession_ins.session_head_prev); +#endif + session->session_id = rs_closesession_ins.session_sessionid; + session->service_id.timeLow = rs_closesession_ins.session_serviceid_timelow; + session->service_id.timeMid = rs_closesession_ins.session_serviceid_timemid; + session->service_id.timeHiAndVersion = rs_closesession_ins.session_serviceid_timehiandver; + if (rs_closesession_ins.session_serviceid_clockseqandnode_outsize <= 8 && + rs_closesession_ins.session_serviceid_clockseqandnode_outsize > 0 && + rs_closesession_ins.session_serviceid_clockseqandnode != NULL && + session->service_id.clockSeqAndNode != NULL + ) + { + for (int i = 0; i < rs_closesession_ins.session_serviceid_clockseqandnode_outsize; i++) + { + session->service_id.clockSeqAndNode[i] = + (uint8_t)(rs_closesession_ins.session_serviceid_clockseqandnode[i] & 0x000000ff); + } + } else + { + for (int i = 0; i < 8; i++) + { + session->service_id.clockSeqAndNode[i] = 0; + } + } + session->ops_cnt = rs_closesession_ins.session_opscnt; + session->head.next = (struct ListNode *) rs_closesession_ins.session_head_next; + session->head.prev = (struct ListNode *) rs_closesession_ins.session_head_prev; + session->context = (TEEC_Context *) rs_closesession_ins.session_context; + return; +} + +TEEC_Result +TEEC_AllocateSharedMemory( + TEEC_Context *context, + TEEC_SharedMemory *sharedMem) +{ + if (context == NULL) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + if (sharedMem == NULL) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + if (sharedMem->size <= 0) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + + sharedMem->buffer = (uint8_t *) malloc(sharedMem->size); + if (sharedMem->buffer == NULL) + { + return TEEC_ERROR_OUT_OF_MEMORY; + } + + sharedMem->is_allocated = true; + sharedMem->context = context; + sharedMem->ops_cnt = 0xfffe; + + return TEEC_SUCCESS; +} + +TEEC_Result +TEEC_RegisterSharedMemory( + TEEC_Context *context, + TEEC_SharedMemory *sharedMem) +{ + if (context == NULL) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + if (sharedMem == NULL) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + if (sharedMem->size <= 0) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + + if (sharedMem->buffer == NULL) + { + return TEEC_ERROR_BAD_PARAMETERS; + } + + sharedMem->is_allocated = false; + sharedMem->context = context; + sharedMem->ops_cnt = 0xfffe; + + return TEEC_SUCCESS; +} + +void +TEEC_ReleaseSharedMemory( + TEEC_SharedMemory *sharedMem) +{ + if (sharedMem == NULL) + { + return; + } + if (sharedMem->buffer == NULL) + { + return; + } + + sharedMem->ops_cnt = 0x0; + if (sharedMem->is_allocated == true) + { + free(sharedMem->buffer); + } +} + + +TEEC_Result +TEEC_DeployTa( + char *infile_path, + char *subdir, + char *outfile_name +) +{ + + if (infile_path == NULL) + { + return TEEC_INFILE_PATH_NULL; + } + + std::string str_infile_path(infile_path); + std::string str_subdir; + std::string str_outfile_name; + + if (subdir != NULL) + { + str_subdir = std::string(subdir); + } + + if (outfile_name != NULL) + { + str_outfile_name = std::string(outfile_name); + } + + int iret; + + if (gpp_channel == NULL) + { + int igrpctls = grpc_tls; + + if (grpc_tls != 0 && grpc_tls != 1 && grpc_tls != 2) + { + std::cout << global_strcfgfile << " grpc_tls should be 0 or 1 or 2 " << std::endl; + return TEEC_FAIL; + } + + switch (igrpctls) + { + case 0: + { + gpp_channel = grpc::CreateChannel(global_target_str, grpc::InsecureChannelCredentials()); + + break; + } + + case 1: + { + if (!isFileExists_ifstream(global_servercacert_path)) + { + std::cout << "error file : " << global_servercacert_path << " is not exist " << std::endl; + return TEEC_FAIL; + } + + std::string strcmd; + FILE *pipe; + char buffer[128]; + std::string result; + + std::string strdayseconds; + char *resulttemp; + const char slash[] = "\n"; + char *parresult; + std::string strparresult; + std::string willexpire("Certificate will expire"); + + // 7 days in seconds + strdayseconds = "604800"; + strcmd = "openssl x509 -enddate -noout -in " + global_servercacert_path + " -checkend " + strdayseconds; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + resulttemp = const_cast(result.data()); + parresult = strtok(resulttemp, slash); + while (parresult != NULL) + { + strparresult = std::string(parresult); + parresult = strtok(NULL, slash); + } + if (strparresult.compare(willexpire) == 0) + { + std::cout << "gpp '" << global_servercacert_path << "' will expire in 7 days, please reget it" << std::endl; + return TEEC_FAIL; + } + + auto servercacert = get_file_contents(global_servercacert_path); + grpc::SslCredentialsOptions ssl_opts; + ssl_opts.pem_root_certs = servercacert; + std::shared_ptr creds = grpc::SslCredentials(ssl_opts); + gpp_channel = grpc::CreateChannel(global_target_str, creds); + + break; + } + + case 2: + { + if (!isFileExists_ifstream(global_servercacert_path)) + { + std::cout << "error file : " << global_servercacert_path << " is not exist " << std::endl; + return TEEC_FAIL; + } + if (!isFileExists_ifstream(global_clientkey_path)) + { + std::cout << "error file : " << global_clientkey_path << " is not exist " << std::endl; + return TEEC_FAIL; + } + if (!isFileExists_ifstream(global_clientcert_path)) + { + std::cout << "error file : " << global_clientcert_path << " is not exist " << std::endl; + return TEEC_FAIL; + } + + std::string strcmd; + FILE *pipe; + char buffer[128]; + std::string result; + + std::string strdayseconds; + char *resulttemp; + const char slash[] = "\n"; + char *parresult; + std::string strparresult; + std::string willexpire("Certificate will expire"); + + // 7 days in seconds + strdayseconds = "604800"; + strcmd = "openssl x509 -enddate -noout -in " + global_servercacert_path + " -checkend " + strdayseconds; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + resulttemp = const_cast(result.data()); + parresult = strtok(resulttemp, slash); + while (parresult != NULL) + { + strparresult = std::string(parresult); + parresult = strtok(NULL, slash); + } + if (strparresult.compare(willexpire) == 0) + { + std::cout << "libteecc '" << global_servercacert_path << "' will expire in 7 days, please reget it" + << std::endl; + return TEEC_FAIL; + } + + // 7 days in seconds + strdayseconds = "604800"; + strcmd = "openssl x509 -enddate -noout -in " + global_clientcert_path + " -checkend " + strdayseconds; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + resulttemp = const_cast(result.data()); + parresult = strtok(resulttemp, slash); + while (parresult != NULL) + { + strparresult = std::string(parresult); + parresult = strtok(NULL, slash); + } + if (strparresult.compare(willexpire) == 0) + { + std::cout << "libteecc '" << global_clientcert_path << "' will expire in 7 days, please reget it" << std::endl; + return TEEC_FAIL; + } + strcmd = "openssl rsa -in " + global_clientkey_path + " -out " + + global_clientkey_path + ".nopass"; + std::string nopass_clientkey_path = global_clientkey_path + ".nopass"; + + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + + strcmd = "openssl rsa -in " + nopass_clientkey_path + " -check -noout"; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + std::string keyok("RSA key ok\n"); + if (result.compare(keyok) != 0) + { + std::cout << "libteecc '" + global_clientkey_path + "' integrity is broken" << std::endl; + return TEEC_FAIL; + } + + std::string sigfile_path = global_strcfgfiletemp + "/.teecc/certs/msg.sig"; + std::string msgfile_path = global_strcfgfiletemp + "/.teecc/certs/msg.txt"; + strcmd = + "openssl dgst -sha256 -sign " + nopass_clientkey_path + " -out " + sigfile_path + " " + msgfile_path; + system(strcmd.c_str()); + // ${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} + std::string pubkeyfile_path = global_strcfgfiletemp + "/.teecc/certs/client_pubkey.pem"; + strcmd = "openssl x509 -in " + global_clientcert_path + " -pubkey -out " + pubkeyfile_path; + system(strcmd.c_str()); + + // ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt + strcmd = "openssl dgst -sha256 -verify " + pubkeyfile_path + " -signature " + sigfile_path + " " + + msgfile_path; + // system(strcmd.c_str()); + pipe = popen(strcmd.c_str(), "r"); + if (!pipe) + { + std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; + return TEEC_FAIL; + } + result = ""; + // read till end of process: + while (!feof(pipe)) + { + // use buffer to read and add to result + if (fgets(buffer, 128, pipe) != NULL) + result += buffer; + } + pclose(pipe); + std::string verifyok("Verified OK\n"); + if (result.compare(verifyok) != 0) + { + std::cout << "libteecc '" + global_clientkey_path + "' is not matched with '" + global_clientcert_path + "'" + << std::endl; + return TEEC_FAIL; + } + + auto clientkey = get_file_contents(nopass_clientkey_path); + strcmd = "rm -f " + global_clientkey_path + ".nopass"; + system(strcmd.c_str()); + strcmd = "rm -f " + pubkeyfile_path; + system(strcmd.c_str()); + strcmd = "rm -f " + sigfile_path; + system(strcmd.c_str()); + + auto servercacert = get_file_contents(global_servercacert_path); + auto clientcert = get_file_contents(global_clientcert_path); + grpc::SslCredentialsOptions ssl_opts; + ssl_opts.pem_root_certs = servercacert; + ssl_opts.pem_private_key = clientkey; + ssl_opts.pem_cert_chain = clientcert; + std::shared_ptr creds = grpc::SslCredentials(ssl_opts); + gpp_channel = grpc::CreateChannel(global_target_str, creds); + + break; + } + + default: + { + gpp_channel = grpc::CreateChannel(global_target_str, grpc::InsecureChannelCredentials()); + } + } + + client = new GppClient( + gpp_channel + ); + } + + iret = client->Upload(str_infile_path, str_subdir, str_outfile_name); + + return (TEEC_Result) iret; +} + + +TEEC_Result +TEEC_SetJwt( + char *token +) +{ + if (token == NULL || sizeof(token) > 1024) + { + return TEEC_FAIL; + } + + memset(glo_token, '\0', sizeof(glo_token)); + strcpy(glo_token, token); + + return TEEC_SUCCESS; +} + + +TEEC_Result +TEEC_UnsetJwt( +) +{ + memset(glo_token, '\0', sizeof(glo_token)); + strcpy(glo_token, "noToken"); + + return TEEC_SUCCESS; +} + + +#ifdef __cplusplus +}; +#endif diff --git a/cc-resource-pooling/teeproxy/libteecc/teecc.h b/cc-resource-pooling/teeproxy/libteecc/teecc.h new file mode 100644 index 0000000..47abd0f --- /dev/null +++ b/cc-resource-pooling/teeproxy/libteecc/teecc.h @@ -0,0 +1,351 @@ +#ifndef _TEECC_H +#define _TEECC_H + +#include + +struct retstru_teec_inicont { + uint32_t teecresult; + int32_t context_fd; + uint8_t *context_tapath; + uintptr_t context_tapath_outsize; + uint64_t context_sessionlist_next; + uint64_t context_sessionlist_prev; + uint64_t context_shrdmemlist_next; + uint64_t context_shrdmemlist_prev; + uint64_t context_sharebuffer_buffer; + int64_t context_sharebuffer_bufferbarrier; + uint64_t context_addr; + int32_t flag; +}; + +struct retstru_teec_fincont { + int32_t context_fd; + uint8_t *context_tapath; + uintptr_t context_tapath_outsize; + uint64_t context_sessionlist_next; + uint64_t context_sessionlist_prev; + uint64_t context_shrdmemlist_next; + uint64_t context_shrdmemlist_prev; + uint64_t context_sharebuffer_buffer; + int64_t context_sharebuffer_bufferbarrier; + int32_t flag; +}; + +struct retstru_teec_opensession { + uint32_t teecresult; + int32_t context_fd; + uint8_t *context_tapath; + uintptr_t context_tapath_outsize; + uint64_t context_sessionlist_next; + uint64_t context_sessionlist_prev; + uint64_t context_shrdmemlist_next; + uint64_t context_shrdmemlist_prev; + uint64_t context_sharebuffer_buffer; + int64_t context_sharebuffer_bufferbarrier; + uint32_t session_sessionid; + uint32_t session_serviceid_timelow; + uint32_t session_serviceid_timemid; + uint32_t session_serviceid_timehiandver; + uint8_t *session_serviceid_clockseqandnode; + uintptr_t session_serviceid_clockseqandnode_outsize; + uint32_t session_opscnt; + uint64_t session_head_next; + uint64_t session_head_prev; + uint64_t session_context; + uint32_t operation_started; + uint32_t operation_paramtypes; + uint64_t operation_param1_tmpref_buffer; + uint32_t operation_param1_tmpref_size; + uint64_t operation_param1_memref_parent; + uint32_t operation_param1_memref_size; + uint32_t operation_param1_memref_offset; + uint32_t operation_param1_value_a; + uint32_t operation_param1_value_b; + int32_t operation_param1_ionref_ionsharefd; + uint32_t operation_param1_ionref_ionsize; + uint64_t operation_param2_tmpref_buffer; + uint32_t operation_param2_tmpref_size; + uint64_t operation_param2_memref_parent; + uint32_t operation_param2_memref_size; + uint32_t operation_param2_memref_offset; + uint32_t operation_param2_value_a; + uint32_t operation_param2_value_b; + int32_t operation_param2_ionref_ionsharefd; + uint32_t operation_param2_ionref_ionsize; + uint64_t operation_param3_tmpref_buffer; + uint32_t operation_param3_tmpref_size; + uint64_t operation_param3_memref_parent; + uint32_t operation_param3_memref_size; + uint32_t operation_param3_memref_offset; + uint32_t operation_param3_value_a; + uint32_t operation_param3_value_b; + int32_t operation_param3_ionref_ionsharefd; + uint32_t operation_param3_ionref_ionsize; + uint64_t operation_param4_tmpref_buffer; + uint32_t operation_param4_tmpref_size; + uint64_t operation_param4_memref_parent; + uint32_t operation_param4_memref_size; + uint32_t operation_param4_memref_offset; + uint32_t operation_param4_value_a; + uint32_t operation_param4_value_b; + int32_t operation_param4_ionref_ionsharefd; + uint32_t operation_param4_ionref_ionsize; + uint64_t operation_session; + int32_t operation_cancelflag; + uint32_t returnorigin; + int32_t flag; + +}; + +struct retstru_teec_closesession { + uint32_t session_sessionid; + uint32_t session_serviceid_timelow; + uint32_t session_serviceid_timemid; + uint32_t session_serviceid_timehiandver; + uint8_t *session_serviceid_clockseqandnode; + uintptr_t session_serviceid_clockseqandnode_outsize; + uint32_t session_opscnt; + uint64_t session_head_next; + uint64_t session_head_prev; + uint64_t session_context; + int32_t flag; + +}; + +struct retstru_teec_invokecommand { + uint32_t teecresult; + uint32_t session_sessionid; + uint32_t session_serviceid_timelow; + uint32_t session_serviceid_timemid; + uint32_t session_serviceid_timehiandver; + uint8_t *session_serviceid_clockseqandnode; + uintptr_t session_serviceid_clockseqandnode_outsize; + uint32_t session_opscnt; + uint64_t session_head_next; + uint64_t session_head_prev; + uint64_t session_context; + uint32_t operation_started; + uint32_t operation_paramtypes; + uint64_t operation_param1_tmpref_buffer; + uint32_t operation_param1_tmpref_size; + uint64_t operation_param1_memref_parent; + uint32_t operation_param1_memref_parent_flag; + uint32_t operation_param1_memref_size; + uint32_t operation_param1_memref_offset; + uint32_t operation_param1_value_a; + uint32_t operation_param1_value_b; + int32_t operation_param1_ionref_ionsharefd; + uint32_t operation_param1_ionref_ionsize; + uint64_t operation_param2_tmpref_buffer; + uint32_t operation_param2_tmpref_size; + uint64_t operation_param2_memref_parent; + uint32_t operation_param2_memref_parent_flag; + uint32_t operation_param2_memref_size; + uint32_t operation_param2_memref_offset; + uint32_t operation_param2_value_a; + uint32_t operation_param2_value_b; + int32_t operation_param2_ionref_ionsharefd; + uint32_t operation_param2_ionref_ionsize; + uint64_t operation_param3_tmpref_buffer; + uint32_t operation_param3_tmpref_size; + uint64_t operation_param3_memref_parent; + uint32_t operation_param3_memref_parent_flag; + uint32_t operation_param3_memref_size; + uint32_t operation_param3_memref_offset; + uint32_t operation_param3_value_a; + uint32_t operation_param3_value_b; + int32_t operation_param3_ionref_ionsharefd; + uint32_t operation_param3_ionref_ionsize; + uint64_t operation_param4_tmpref_buffer; + uint32_t operation_param4_tmpref_size; + uint64_t operation_param4_memref_parent; + uint32_t operation_param4_memref_parent_flag; + uint32_t operation_param4_memref_size; + uint32_t operation_param4_memref_offset; + uint32_t operation_param4_value_a; + uint32_t operation_param4_value_b; + int32_t operation_param4_ionref_ionsharefd; + uint32_t operation_param4_ionref_ionsize; + uint64_t operation_session; + int32_t operation_cancelflag; + uint32_t returnorigin; + uint8_t *buffer1; + uintptr_t buffer1_outsize; + uint8_t *buffer2; + uintptr_t buffer2_outsize; + uint8_t *buffer3; + uintptr_t buffer3_outsize; + uint8_t *buffer4; + uintptr_t buffer4_outsize; + int32_t flag; +}; + + +struct retstru_teec_inicont externc_teec_initializecontext(uint8_t *name, + uint32_t name_size, + int32_t in_context_fd, + uint8_t *in_context_tapath, + int32_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier); + +void externc_retstru_teec_inicont_free(struct retstru_teec_inicont rs_ins); + +struct retstru_teec_fincont externc_teec_finalizecontext(int32_t in_context_fd, + uint8_t *in_context_tapath, + int32_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + uint64_t in_context_addr); + +void externc_retstru_teec_fincont_free(struct retstru_teec_fincont rs_ins); + +struct retstru_teec_opensession externc_teec_opensession(int32_t in_context_fd, + uint8_t *in_context_tapath, + int32_t in_context_tapath_size, + uint64_t in_context_sessionlist_next, + uint64_t in_context_sessionlist_prev, + uint64_t in_context_shrdmemlist_next, + uint64_t in_context_shrdmemlist_prev, + uint64_t in_context_sharebuffer_buffer, + int64_t in_context_sharebuffer_bufferbarrier, + uint32_t in_destination_timelow, + uint32_t in_destination_timemid, + uint32_t in_destination_timehiandver, + uint8_t *in_destination_clockseqandnode, + int32_t in_destination_clockseqandnode_size, + uint32_t in_connectionmethod, + uint64_t in_connectiondata, + uint32_t in_operation_started, + uint32_t in_operation_paramtypes, + uint64_t in_operation_param1_tmpref_buffer, + uint32_t in_operation_param1_tmpref_size, + uint64_t in_operation_param1_memref_parent, + uint32_t in_operation_param1_memref_size, + uint32_t in_operation_param1_memref_offset, + uint32_t in_operation_param1_value_a, + uint32_t in_operation_param1_value_b, + int32_t in_operation_param1_ionref_ionsharefd, + uint32_t in_operation_param1_ionref_ionsize, + uint64_t in_operation_param2_tmpref_buffer, + uint32_t in_operation_param2_tmpref_size, + uint64_t in_operation_param2_memref_parent, + uint32_t in_operation_param2_memref_size, + uint32_t in_operation_param2_memref_offset, + uint32_t in_operation_param2_value_a, + uint32_t in_operation_param2_value_b, + int32_t in_operation_param2_ionref_ionsharefd, + uint32_t in_operation_param2_ionref_ionsize, + uint64_t in_operation_param3_tmpref_buffer, + uint32_t in_operation_param3_tmpref_size, + uint64_t in_operation_param3_memref_parent, + uint32_t in_operation_param3_memref_size, + uint32_t in_operation_param3_memref_offset, + uint32_t in_operation_param3_value_a, + uint32_t in_operation_param3_value_b, + int32_t in_operation_param3_ionref_ionsharefd, + uint32_t in_operation_param3_ionref_ionsize, + uint64_t in_operation_param4_tmpref_buffer, + uint32_t in_operation_param4_tmpref_size, + uint64_t in_operation_param4_memref_parent, + uint32_t in_operation_param4_memref_size, + uint32_t in_operation_param4_memref_offset, + uint32_t in_operation_param4_value_a, + uint32_t in_operation_param4_value_b, + int32_t in_operation_param4_ionref_ionsharefd, + uint32_t in_operation_param4_ionref_ionsize, + uint64_t in_operation_session, + int32_t in_operation_cancelflag, + uint32_t in_returnorigin, + uint64_t in_context_addr); + +void externc_retstru_teec_opensession_free(struct retstru_teec_opensession rs_ins); + +struct retstru_teec_closesession externc_teec_closesession(uint32_t in_session_sessionid, + uint32_t in_session_serviceid_timelow, + uint32_t in_session_serviceid_timemid, + uint32_t in_session_serviceid_timehiandver, + uint8_t *in_session_serviceid_clockseqandnode, + uintptr_t in_session_serviceid_clockseqandnode_size, + uint32_t in_session_opscnt, + uint64_t in_session_head_next, + uint64_t in_session_head_prev, + uint64_t in_session_context); + +void externc_retstru_teec_closesession_free(struct retstru_teec_closesession rs_ins); + +struct retstru_teec_invokecommand externc_teec_invokecommand(uint32_t in_session_sessionid, + uint32_t in_session_serviceid_timelow, + uint32_t in_session_serviceid_timemid, + uint32_t in_session_serviceid_timehiandver, + uint8_t *in_session_serviceid_clockseqandnode, + uintptr_t in_session_serviceid_clockseqandnode_size, + uint32_t in_session_opscnt, + uint64_t in_session_head_next, + uint64_t in_session_head_prev, + uint64_t in_session_context, + uint32_t in_commandid, + uint32_t in_operation_started, + uint32_t in_operation_paramtypes, + uint64_t in_operation_param1_tmpref_buffer, + uint32_t in_operation_param1_tmpref_size, + uint64_t in_operation_param1_memref_parent, + uint32_t in_operation_param1_memref_parent_flag, + uint32_t in_operation_param1_memref_size, + uint32_t in_operation_param1_memref_offset, + uint32_t in_operation_param1_value_a, + uint32_t in_operation_param1_value_b, + int32_t in_operation_param1_ionref_ionsharefd, + uint32_t in_operation_param1_ionref_ionsize, + uint64_t in_operation_param2_tmpref_buffer, + uint32_t in_operation_param2_tmpref_size, + uint64_t in_operation_param2_memref_parent, + uint32_t in_operation_param2_memref_parent_flag, + uint32_t in_operation_param2_memref_size, + uint32_t in_operation_param2_memref_offset, + uint32_t in_operation_param2_value_a, + uint32_t in_operation_param2_value_b, + int32_t in_operation_param2_ionref_ionsharefd, + uint32_t in_operation_param2_ionref_ionsize, + uint64_t in_operation_param3_tmpref_buffer, + uint32_t in_operation_param3_tmpref_size, + uint64_t in_operation_param3_memref_parent, + uint32_t in_operation_param3_memref_parent_flag, + uint32_t in_operation_param3_memref_size, + uint32_t in_operation_param3_memref_offset, + uint32_t in_operation_param3_value_a, + uint32_t in_operation_param3_value_b, + int32_t in_operation_param3_ionref_ionsharefd, + uint32_t in_operation_param3_ionref_ionsize, + uint64_t in_operation_param4_tmpref_buffer, + uint32_t in_operation_param4_tmpref_size, + uint64_t in_operation_param4_memref_parent, + uint32_t in_operation_param4_memref_parent_flag, + uint32_t in_operation_param4_memref_size, + uint32_t in_operation_param4_memref_offset, + uint32_t in_operation_param4_value_a, + uint32_t in_operation_param4_value_b, + int32_t in_operation_param4_ionref_ionsharefd, + uint32_t in_operation_param4_ionref_ionsize, + uint64_t in_operation_session, + int32_t in_operation_cancelflag, + uint32_t in_returnorigin, + uint8_t *in_buffer1, + uintptr_t in_buffer1_size, + uint8_t *in_buffer2, + uintptr_t in_buffer2_size, + uint8_t *in_buffer3, + uintptr_t in_buffer3_size, + uint8_t *in_buffer4, + uintptr_t in_buffer4_size); + +void externc_retstru_teec_invokecommand_free(struct retstru_teec_invokecommand rs_ins); +#endif // _TEECC_H \ No newline at end of file -- Gitee From 4d389c2f28f8d0329ffccb06593a692b085e7f40 Mon Sep 17 00:00:00 2001 From: shen-guohua Date: Fri, 28 Apr 2023 11:09:33 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=96=B0=E5=BB=BA=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 127 - README.md | 34 - demo/clientapp/parallel/p.sh | 17 - demo/clientapp/testcase1/CMakeLists.txt | 16 - demo/clientapp/testcase1/build/cmake.sh | 1 - demo/clientapp/testcase1/build/test.sh | 11 - demo/clientapp/testcase1/testcase.c | 1042 - demo/clientapp/testcase1/testcase.h | 39 - demo/clientapp/testcase2/CMakeLists.txt | 16 - demo/clientapp/testcase2/build/cmake.sh | 1 - demo/clientapp/testcase2/build/test.sh | 11 - demo/clientapp/testcase2/testcase.c | 941 - demo/clientapp/testcase2/testcase.h | 39 - demo/clientapp/testcase3/CMakeLists.txt | 16 - demo/clientapp/testcase3/build/cmake.sh | 1 - demo/clientapp/testcase3/build/test.sh | 11 - demo/clientapp/testcase3/testcase.c | 941 - demo/clientapp/testcase3/testcase.h | 39 - demo/clientapp/testcase4/CMakeLists.txt | 16 - demo/clientapp/testcase4/build/cmake.sh | 1 - demo/clientapp/testcase4/build/test.sh | 11 - demo/clientapp/testcase4/testcase.c | 940 - demo/clientapp/testcase4/testcase.h | 39 - demo/clientapp/testcase5/CMakeLists.txt | 16 - demo/clientapp/testcase5/build/cmake.sh | 1 - demo/clientapp/testcase5/build/test.sh | 11 - demo/clientapp/testcase5/testcase.c | 940 - demo/clientapp/testcase5/testcase.h | 39 - demo/clientapp/testcase6/CMakeLists.txt | 16 - demo/clientapp/testcase6/build/cmake.sh | 1 - demo/clientapp/testcase6/build/test.sh | 11 - demo/clientapp/testcase6/testcase.c | 940 - demo/clientapp/testcase6/testcase.h | 39 - demo/clientapp/testcase7/CMakeLists.txt | 16 - demo/clientapp/testcase7/build/cmake.sh | 1 - demo/clientapp/testcase7/build/test.sh | 11 - demo/clientapp/testcase7/testcase.c | 940 - demo/clientapp/testcase7/testcase.h | 39 - demo/clientapp/testcase8/CMakeLists.txt | 16 - demo/clientapp/testcase8/build/cmake.sh | 1 - demo/clientapp/testcase8/build/test.sh | 11 - demo/clientapp/testcase8/testcase.c | 940 - demo/clientapp/testcase8/testcase.h | 39 - demo/clientapp/testcase9/CMakeLists.txt | 16 - demo/clientapp/testcase9/build/cmake.sh | 1 - demo/clientapp/testcase9/build/test.sh | 11 - demo/clientapp/testcase9/testcase.c | 940 - demo/clientapp/testcase9/testcase.h | 39 - demo/dbusjwt/CMakeLists.txt | 71 - demo/dbusjwt/build/cmake.sh | 1 - demo/dbusjwt/dbus_return_code.h | 26 - demo/dbusjwt/dbusc_jwt.c | 458 - demo/dbusjwt/dbusc_jwt.h | 27 - demo/dbusjwt/dbuss_fetchjwt.c | 253 - demo/dbusjwt/dbuss_validatejwt.c | 219 - demo/libspiffejwt/CMakeLists.txt | 56 - demo/libspiffejwt/build/cmake.sh | 1 - demo/libspiffejwt/spiffejwt.c | 254 - demo/libspiffejwt/spiffejwt.h | 13 - demo/libspiffejwt/test_spiffejwt.c | 51 - demo/scripts/dbus.sh | 10 - demo/scripts/spire/createentry_workload.sh | 9 - demo/scripts/spire/gentoken_agent.sh | 1 - demo/scripts/spire/runagent.sh | 1 - demo/scripts/spire/runserver.sh | 1 - demo/scripts/spire/showdelentry.sh | 10 - demo/scripts/tcpdump.sh | 2 - docs/Design/design.docx | Bin 1180936 -> 0 bytes docs/deployment/deployment.docx | Bin 99264 -> 0 bytes docs/pic/arch-II.png | Bin 142683 -> 0 bytes docs/test.docx | Bin 68525 -> 0 bytes patch/c-spiffe_patch | 507 - teeproxy/gpproxy/CMakeLists.txt | 107 - teeproxy/gpproxy/build/cmake.sh | 3 - teeproxy/gpproxy/certs/ca_crt.pem | 22 - teeproxy/gpproxy/certs/ca_key.pem | 30 - teeproxy/gpproxy/certs/check_ca_crt.sh | 42 - teeproxy/gpproxy/certs/check_ca_key.sh | 63 - teeproxy/gpproxy/certs/check_client_crt.sh | 43 - teeproxy/gpproxy/certs/check_client_key.sh | 62 - teeproxy/gpproxy/certs/check_server_crt.sh | 43 - teeproxy/gpproxy/certs/check_server_key.sh | 62 - teeproxy/gpproxy/certs/gen_ca_crt.sh | 22 - teeproxy/gpproxy/certs/gen_ca_keycrt.sh | 22 - teeproxy/gpproxy/certs/gen_client_crt.sh | 22 - teeproxy/gpproxy/certs/gen_client_keycsr.sh | 22 - teeproxy/gpproxy/certs/gen_server_crt.sh | 32 - teeproxy/gpproxy/certs/gen_server_keycrt.sh | 32 - teeproxy/gpproxy/certs/msg.txt | 1 - teeproxy/gpproxy/certs/server_crt.pem | 20 - teeproxy/gpproxy/certs/server_key.pem | 30 - teeproxy/gpproxy/changelog.md | 7 - teeproxy/gpproxy/common.cmake | 129 - teeproxy/gpproxy/conf/gpproxy_config.yaml | 19 - teeproxy/gpproxy/gpproxy.cc | 4195 --- teeproxy/gpproxy/gpproxy.h | 21 - teeproxy/gpproxy/protos/gt.proto | 392 - teeproxy/gpworker/README | 8 - teeproxy/gpworker/build/Makefile | 28 - teeproxy/gpworker/build/r.sh | 7 - teeproxy/gpworker/changelog.md | 7 - teeproxy/gpworker/condition.c | 55 - teeproxy/gpworker/condition.h | 28 - teeproxy/gpworker/gpworker.c | 50 - teeproxy/gpworker/threadpool.c | 155 - teeproxy/gpworker/threadpool.h | 108 - teeproxy/gpworker/tzcp_dbus.c | 22889 ---------------- teeproxy/gpworker/tzcp_dbus.h | 550 - teeproxy/libdbuscgpw/CMakeLists.txt | 45 - teeproxy/libdbuscgpw/build/cmake.sh | 1 - teeproxy/libdbuscgpw/dbusc_gpw.c | 9291 ------- teeproxy/libdbuscgpw/dbusc_gpw.h | 406 - teeproxy/libteecc/CMakeLists.txt | 119 - teeproxy/libteecc/build/cmake.sh | 3 - teeproxy/libteecc/certs/ca_crt.pem | 22 - teeproxy/libteecc/certs/check_ca_crt.sh | 42 - teeproxy/libteecc/certs/check_client_crt.sh | 43 - teeproxy/libteecc/certs/check_client_key.sh | 62 - teeproxy/libteecc/certs/client_crt.pem | 20 - teeproxy/libteecc/certs/client_key.pem | 30 - teeproxy/libteecc/certs/gen_client_keycsr.sh | 22 - teeproxy/libteecc/certs/msg.txt | 1 - teeproxy/libteecc/changelog.md | 7 - teeproxy/libteecc/common.cmake | 129 - teeproxy/libteecc/conf/teecc_config.yaml | 10 - .../libteecc/include/teecc/tee_client_api.h | 184 - .../include/teecc/tee_client_constants.h | 165 - .../libteecc/include/teecc/tee_client_list.h | 100 - .../libteecc/include/teecc/tee_client_log.h | 29 - .../libteecc/include/teecc/tee_client_type.h | 150 - .../libteecc/include/teecc/teec_client_api.h | 192 - teeproxy/libteecc/protos/gt.proto | 392 - teeproxy/libteecc/teecc.cc | 4148 --- teeproxy/libteecc/teecc.h | 351 - 134 files changed, 56608 deletions(-) delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 demo/clientapp/parallel/p.sh delete mode 100644 demo/clientapp/testcase1/CMakeLists.txt delete mode 100644 demo/clientapp/testcase1/build/cmake.sh delete mode 100644 demo/clientapp/testcase1/build/test.sh delete mode 100644 demo/clientapp/testcase1/testcase.c delete mode 100644 demo/clientapp/testcase1/testcase.h delete mode 100644 demo/clientapp/testcase2/CMakeLists.txt delete mode 100644 demo/clientapp/testcase2/build/cmake.sh delete mode 100644 demo/clientapp/testcase2/build/test.sh delete mode 100644 demo/clientapp/testcase2/testcase.c delete mode 100644 demo/clientapp/testcase2/testcase.h delete mode 100644 demo/clientapp/testcase3/CMakeLists.txt delete mode 100644 demo/clientapp/testcase3/build/cmake.sh delete mode 100644 demo/clientapp/testcase3/build/test.sh delete mode 100644 demo/clientapp/testcase3/testcase.c delete mode 100644 demo/clientapp/testcase3/testcase.h delete mode 100644 demo/clientapp/testcase4/CMakeLists.txt delete mode 100644 demo/clientapp/testcase4/build/cmake.sh delete mode 100644 demo/clientapp/testcase4/build/test.sh delete mode 100644 demo/clientapp/testcase4/testcase.c delete mode 100644 demo/clientapp/testcase4/testcase.h delete mode 100644 demo/clientapp/testcase5/CMakeLists.txt delete mode 100644 demo/clientapp/testcase5/build/cmake.sh delete mode 100644 demo/clientapp/testcase5/build/test.sh delete mode 100644 demo/clientapp/testcase5/testcase.c delete mode 100644 demo/clientapp/testcase5/testcase.h delete mode 100644 demo/clientapp/testcase6/CMakeLists.txt delete mode 100644 demo/clientapp/testcase6/build/cmake.sh delete mode 100644 demo/clientapp/testcase6/build/test.sh delete mode 100644 demo/clientapp/testcase6/testcase.c delete mode 100644 demo/clientapp/testcase6/testcase.h delete mode 100644 demo/clientapp/testcase7/CMakeLists.txt delete mode 100644 demo/clientapp/testcase7/build/cmake.sh delete mode 100644 demo/clientapp/testcase7/build/test.sh delete mode 100644 demo/clientapp/testcase7/testcase.c delete mode 100644 demo/clientapp/testcase7/testcase.h delete mode 100644 demo/clientapp/testcase8/CMakeLists.txt delete mode 100644 demo/clientapp/testcase8/build/cmake.sh delete mode 100644 demo/clientapp/testcase8/build/test.sh delete mode 100644 demo/clientapp/testcase8/testcase.c delete mode 100644 demo/clientapp/testcase8/testcase.h delete mode 100644 demo/clientapp/testcase9/CMakeLists.txt delete mode 100644 demo/clientapp/testcase9/build/cmake.sh delete mode 100644 demo/clientapp/testcase9/build/test.sh delete mode 100644 demo/clientapp/testcase9/testcase.c delete mode 100644 demo/clientapp/testcase9/testcase.h delete mode 100644 demo/dbusjwt/CMakeLists.txt delete mode 100644 demo/dbusjwt/build/cmake.sh delete mode 100644 demo/dbusjwt/dbus_return_code.h delete mode 100644 demo/dbusjwt/dbusc_jwt.c delete mode 100644 demo/dbusjwt/dbusc_jwt.h delete mode 100644 demo/dbusjwt/dbuss_fetchjwt.c delete mode 100644 demo/dbusjwt/dbuss_validatejwt.c delete mode 100644 demo/libspiffejwt/CMakeLists.txt delete mode 100644 demo/libspiffejwt/build/cmake.sh delete mode 100644 demo/libspiffejwt/spiffejwt.c delete mode 100644 demo/libspiffejwt/spiffejwt.h delete mode 100644 demo/libspiffejwt/test_spiffejwt.c delete mode 100644 demo/scripts/dbus.sh delete mode 100644 demo/scripts/spire/createentry_workload.sh delete mode 100644 demo/scripts/spire/gentoken_agent.sh delete mode 100644 demo/scripts/spire/runagent.sh delete mode 100644 demo/scripts/spire/runserver.sh delete mode 100644 demo/scripts/spire/showdelentry.sh delete mode 100644 demo/scripts/tcpdump.sh delete mode 100644 docs/Design/design.docx delete mode 100644 docs/deployment/deployment.docx delete mode 100644 docs/pic/arch-II.png delete mode 100644 docs/test.docx delete mode 100644 patch/c-spiffe_patch delete mode 100644 teeproxy/gpproxy/CMakeLists.txt delete mode 100644 teeproxy/gpproxy/build/cmake.sh delete mode 100644 teeproxy/gpproxy/certs/ca_crt.pem delete mode 100644 teeproxy/gpproxy/certs/ca_key.pem delete mode 100644 teeproxy/gpproxy/certs/check_ca_crt.sh delete mode 100644 teeproxy/gpproxy/certs/check_ca_key.sh delete mode 100644 teeproxy/gpproxy/certs/check_client_crt.sh delete mode 100644 teeproxy/gpproxy/certs/check_client_key.sh delete mode 100644 teeproxy/gpproxy/certs/check_server_crt.sh delete mode 100644 teeproxy/gpproxy/certs/check_server_key.sh delete mode 100644 teeproxy/gpproxy/certs/gen_ca_crt.sh delete mode 100644 teeproxy/gpproxy/certs/gen_ca_keycrt.sh delete mode 100644 teeproxy/gpproxy/certs/gen_client_crt.sh delete mode 100644 teeproxy/gpproxy/certs/gen_client_keycsr.sh delete mode 100644 teeproxy/gpproxy/certs/gen_server_crt.sh delete mode 100644 teeproxy/gpproxy/certs/gen_server_keycrt.sh delete mode 100644 teeproxy/gpproxy/certs/msg.txt delete mode 100644 teeproxy/gpproxy/certs/server_crt.pem delete mode 100644 teeproxy/gpproxy/certs/server_key.pem delete mode 100644 teeproxy/gpproxy/changelog.md delete mode 100644 teeproxy/gpproxy/common.cmake delete mode 100644 teeproxy/gpproxy/conf/gpproxy_config.yaml delete mode 100644 teeproxy/gpproxy/gpproxy.cc delete mode 100644 teeproxy/gpproxy/gpproxy.h delete mode 100644 teeproxy/gpproxy/protos/gt.proto delete mode 100644 teeproxy/gpworker/README delete mode 100644 teeproxy/gpworker/build/Makefile delete mode 100644 teeproxy/gpworker/build/r.sh delete mode 100644 teeproxy/gpworker/changelog.md delete mode 100644 teeproxy/gpworker/condition.c delete mode 100644 teeproxy/gpworker/condition.h delete mode 100644 teeproxy/gpworker/gpworker.c delete mode 100644 teeproxy/gpworker/threadpool.c delete mode 100644 teeproxy/gpworker/threadpool.h delete mode 100644 teeproxy/gpworker/tzcp_dbus.c delete mode 100644 teeproxy/gpworker/tzcp_dbus.h delete mode 100644 teeproxy/libdbuscgpw/CMakeLists.txt delete mode 100644 teeproxy/libdbuscgpw/build/cmake.sh delete mode 100644 teeproxy/libdbuscgpw/dbusc_gpw.c delete mode 100644 teeproxy/libdbuscgpw/dbusc_gpw.h delete mode 100644 teeproxy/libteecc/CMakeLists.txt delete mode 100644 teeproxy/libteecc/build/cmake.sh delete mode 100644 teeproxy/libteecc/certs/ca_crt.pem delete mode 100644 teeproxy/libteecc/certs/check_ca_crt.sh delete mode 100644 teeproxy/libteecc/certs/check_client_crt.sh delete mode 100644 teeproxy/libteecc/certs/check_client_key.sh delete mode 100644 teeproxy/libteecc/certs/client_crt.pem delete mode 100644 teeproxy/libteecc/certs/client_key.pem delete mode 100644 teeproxy/libteecc/certs/gen_client_keycsr.sh delete mode 100644 teeproxy/libteecc/certs/msg.txt delete mode 100644 teeproxy/libteecc/changelog.md delete mode 100644 teeproxy/libteecc/common.cmake delete mode 100644 teeproxy/libteecc/conf/teecc_config.yaml delete mode 100644 teeproxy/libteecc/include/teecc/tee_client_api.h delete mode 100644 teeproxy/libteecc/include/teecc/tee_client_constants.h delete mode 100644 teeproxy/libteecc/include/teecc/tee_client_list.h delete mode 100644 teeproxy/libteecc/include/teecc/tee_client_log.h delete mode 100644 teeproxy/libteecc/include/teecc/tee_client_type.h delete mode 100644 teeproxy/libteecc/include/teecc/teec_client_api.h delete mode 100644 teeproxy/libteecc/protos/gt.proto delete mode 100644 teeproxy/libteecc/teecc.cc delete mode 100644 teeproxy/libteecc/teecc.h diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 9e32cde..0000000 --- a/LICENSE +++ /dev/null @@ -1,127 +0,0 @@ - 木兰宽松许可证, 第2版 - - 木兰宽松许可证, 第2版 - 2020年1月 http://license.coscl.org.cn/MulanPSL2 - - - 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: - - 0. 定义 - - “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 - - “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 - - “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 - - “法人实体”是指提交贡献的机构及其“关联实体”。 - - “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 - - 1. 授予版权许可 - - 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 - - 2. 授予专利许可 - - 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 - - 3. 无商标许可 - - “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 - - 4. 分发限制 - - 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 - - 5. 免责声明与责任限制 - - “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 - - 6. 语言 - “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 - - 条款结束 - - 如何将木兰宽松许可证,第2版,应用到您的软件 - - 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: - - 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; - - 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; - - 3, 请将如下声明文本放入每个源文件的头部注释中。 - - Copyright (c) [Year] [name of copyright holder] - [Software Name] is licensed under Mulan PSL v2. - You can use this software according to the terms and conditions of the Mulan PSL v2. - You may obtain a copy of Mulan PSL v2 at: - http://license.coscl.org.cn/MulanPSL2 - THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - See the Mulan PSL v2 for more details. - - - Mulan Permissive Software License,Version 2 - - Mulan Permissive Software License,Version 2 (Mulan PSL v2) - January 2020 http://license.coscl.org.cn/MulanPSL2 - - Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: - - 0. Definition - - Software means the program and related documents which are licensed under this License and comprise all Contribution(s). - - Contribution means the copyrightable work licensed by a particular Contributor under this License. - - Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. - - Legal Entity means the entity making a Contribution and all its Affiliates. - - Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. - - 1. Grant of Copyright License - - Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. - - 2. Grant of Patent License - - Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. - - 3. No Trademark License - - No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. - - 4. Distribution Restriction - - You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. - - 5. Disclaimer of Warranty and Limitation of Liability - - THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - - 6. Language - - THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. - - END OF THE TERMS AND CONDITIONS - - How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software - - To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: - - i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; - - ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; - - iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. - - - Copyright (c) [Year] [name of copyright holder] - [Software Name] is licensed under Mulan PSL v2. - You can use this software according to the terms and conditions of the Mulan PSL v2. - You may obtain a copy of Mulan PSL v2 at: - http://license.coscl.org.cn/MulanPSL2 - THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - See the Mulan PSL v2 for more details. diff --git a/README.md b/README.md deleted file mode 100644 index c4c8912..0000000 --- a/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# cc-resource-pooling - -#### 介绍 -项目(TEE GP Proxy)旨在通过资源池化TrustZone的算力,方便客户在云景中在鲲鹏机密计算的节点部署可信应用。 -详细内容可参考仓库中的设计文档。 - -#### 软件架构 -![TrustZone资源池架构](docs/pic/arch-II.png) - -本项目借助了gRPC这一字节流框架,扩展新创建了可部署在任意位置的GP(Globle Platform) API 库-下文称为GP Client,用于部署在云上的TrustZone的Client APP访问真实的TrustZone TEE。同时在Host上 新建了 GP API proxy,用于接收来自远程的CA的 GP API的调用。 - -GP Client用于序列化CA的GP接口调用,GP Proxy则收到调用合反序列化后,将GP调用转化为本地TEE Client接口调用。考虑到并发处理的情况,GP API Proxy可管理多任时的队列。 -使用此方法,解决在VM或Docker中穿透虚拟化层访问TEE驱动的问题。如果需要,你也可以进一步开发,将多泰山服务器集群化管理。 - - - -#### 安装教程 - -参考部署文档。 - -#### 使用说明 - -1. 本项目原项目中引入了Host端对客户端的认证机制,并在GP API 以及Service侧提供了透传JWT的API,JWT的获取以及确认需要应用实现; -2. 在配置gPRC时,建议启用TLS以及基于证书的双向认证,注意证书私钥为机密数据,在部署系统时需要考虑保护机制; -3. 本项目不包含其它开源项目的代码,涉及的第三方开源组件均需要使用者自行获取。 - - -#### 参与贡献 - - -#### 特技 -1. 项目提供接口与原接口完全适配,用户仅需更换libteec.so文件即可直接使用 -2. 增加了token验证机制,并添加了两个扩展程序,作为token验证的中间件 -3. 性能上相较于一期项目显著提升 diff --git a/demo/clientapp/parallel/p.sh b/demo/clientapp/parallel/p.sh deleted file mode 100644 index de4f582..0000000 --- a/demo/clientapp/parallel/p.sh +++ /dev/null @@ -1,17 +0,0 @@ -# ! /bin/bash - -# set maximal number of parallel jobs -MAX_NUM_LCOUNT=100 -MAX_NUM_CCA=9 -# END_NUM=$(($MAX_NUM_CCA-1)) -END_NUM=$MAX_NUM_CCA - -if true; then -for ((LCOUNT = 0; LCOUNT < $MAX_NUM_LCOUNT; LCOUNT++)) -do - echo -e "\n"remove {}_$LCOUNT.log ::: $(eval echo "{1..$END_NUM}") - parallel -j $MAX_NUM_CCA rm "-f" {}_$LCOUNT.log ::: $(eval echo "{1..$END_NUM}") - parallel -j $MAX_NUM_CCA --ungroup bash ../testcase{}/build/test.sh "| tee" {}_$LCOUNT.log ::: $(eval echo "{1..$END_NUM}") - # parallel -j $MAX_NUM_CCA --ungroup ../testcase0/build/testcase "| tee" {}_$LCOUNT.log ::: $(eval echo "{0..$END_NUM}") -done -fi diff --git a/demo/clientapp/testcase1/CMakeLists.txt b/demo/clientapp/testcase1/CMakeLists.txt deleted file mode 100644 index 80b4384..0000000 --- a/demo/clientapp/testcase1/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.5.1) - -project(testcase C CXX) - -# set(CMAKE_C_FLAGS "${CMAKE_}") -# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) - -# include_directories("${CMAKE_CURRENT_BINARY_DIR}") - -add_executable(testcase testcase.c) -target_link_libraries( - testcase - pthread - libteecc.so - libdbusc_jwt.so -) diff --git a/demo/clientapp/testcase1/build/cmake.sh b/demo/clientapp/testcase1/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/demo/clientapp/testcase1/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/demo/clientapp/testcase1/build/test.sh b/demo/clientapp/testcase1/build/test.sh deleted file mode 100644 index c73734d..0000000 --- a/demo/clientapp/testcase1/build/test.sh +++ /dev/null @@ -1,11 +0,0 @@ -CUR_DIR=$( dirname -- "$0"; ) - -${CUR_DIR}/testcase 1 -${CUR_DIR}/testcase 2 -${CUR_DIR}/testcase 3 -${CUR_DIR}/testcase 4 -# ${CUR_DIR}/testcase 5 -${CUR_DIR}/testcase 6 -${CUR_DIR}/testcase 7 -${CUR_DIR}/testcase 8 -${CUR_DIR}/testcase 9 diff --git a/demo/clientapp/testcase1/testcase.c b/demo/clientapp/testcase1/testcase.c deleted file mode 100644 index 6c4450a..0000000 --- a/demo/clientapp/testcase1/testcase.c +++ /dev/null @@ -1,1042 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo - */ - -#include "testcase.h" -#include -#include -#include -#include -#include -#include -// #include -// #include -// #include -// #include -#include -#include -#include -#include - -// #include "tee_client_api.h" -#include "teecc/teec_client_api.h" -#include "dbusc_jwt.h" - -#define TESTCASE 1 - -#if TESTCASE == 2 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} -}; -#elif TESTCASE == 3 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} -}; -#elif TESTCASE == 4 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} -}; -#elif TESTCASE == 5 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} -}; -#elif TESTCASE == 6 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} -}; -#elif TESTCASE == 7 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} -}; -#elif TESTCASE == 8 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} -}; -#elif TESTCASE == 9 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} -}; -#else -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} -}; -#endif - -static void DumpBuff(const char *buffer, size_t bufLen) -{ - size_t i; - if (buffer == NULL || bufLen == 0) - { - return; - } - - printf("\n--------------------------------------------------\n"); - printf("bufLen = %d\n", bufLen); - for (i = 0; i < bufLen; i++) - { - if (i % PRINTF_SIZE == 0) - { - printf("\n"); - } - printf("%02x ", *(buffer + i)); - } - printf("\n--------------------------------------------------\n"); - return; -} - -static TEEC_Result testcase_1() -{ - TEEC_Context context; - // uint64_t context_addr; - TEEC_Session session; - TEEC_Operation operation; - uint32_t origin; - TEEC_Result ret; - - //Interface_Function-001 - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; - - //Interface_Function-002 - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- no param - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- value param - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_A); - assert(operation.params[0].value.b == VALUE_B); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_B); - assert(operation.params[0].value.b == VALUE_A); - - // Interface_Function-003 -- temp buf param - char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - memset(tmpbuf, 0, TEMP_BUF_SIZE); - memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - //Interface_Function-004 - TEEC_CloseSession(&session); - //Interface_Function-005 - TEEC_FinalizeContext(&context); - if (!ret) - { - printf("interface_testcase pass\n"); - } - return ret; -} - -static void share_mem_test( - TEEC_Session *session, - TEEC_SharedMemory *sharebuf -) -{ - TEEC_Result ret; - TEEC_Operation operation; - uint32_t origin; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); -} - -static TEEC_Result testcase_2() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - char tmpbuf[TEMP_BUF_SIZE]; - uint32_t origin; - TEEC_Result ret; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; - - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Function-006 - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-011 - share_mem_test(&session, &sharebuf); - - // Interface_Function-008 - TEEC_ReleaseSharedMemory(&sharebuf); - - // Interface_Function-007 - memset(&sharebuf, 0, sizeof(sharebuf)); - sharebuf.buffer = tmpbuf; - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_RegisterSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-012 - share_mem_test(&session, &sharebuf); - - TEEC_ReleaseSharedMemory(&sharebuf); - -// exit: - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) - { - printf("sharemem_interface_testcase pass\n"); - } - return ret; -} - - -static void *thread_function(void *param) -{ - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - TEEC_Context *context = (TEEC_Context *) param; - pthread_t tid; - uint32_t origin; - struct timeval start, end, tokenset; - - tid = (pthread_t) pthread_self(); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) - { - printf("thread %u open session failed, ret=%x\n", tid, ret); - goto exit; - } - - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(context, &sharebuf); - if (ret) - { - printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); - goto exit; - } - - printf("begin multi-thread test, during %u\n", TEST_TIME); - gettimeofday(&start, NULL); - gettimeofday(&tokenset, NULL); - while (1) - { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); - memset(sharebuf.buffer, 0, sharebuf.size); - memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - operation.params[0].memref.parent = &sharebuf; - operation.params[1].value.a = 1; - - ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); - if (ret) - { - printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); - break; - } - - if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) - { - printf("thread %u get wrong comptue result.\n", tid); - break; - } - gettimeofday(&end, NULL); - if (end.tv_sec - start.tv_sec > TEST_TIME) - break; - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - - sleep(1); - } - - TEEC_CloseSession(&session); - exit: - return (void *) ret; -} - -static TEEC_Result testcase_3() -{ - TEEC_Result ret; - TEEC_Operation operation; - TEEC_Context context; - pthread_t tid[THREAD_COUNT]; - void *thread_ret = NULL; - uint32_t i; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; - - for (i = 0; i < THREAD_COUNT; i++) - { - pthread_create(&tid[i], NULL, thread_function, (void *) &context); - } - - for (i = 0; i < THREAD_COUNT; i++) - { - pthread_join(tid[i], &thread_ret); - if ((TEEC_Result) thread_ret != TEEC_SUCCESS) - { - printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result) thread_ret); - ret = TEEC_FAIL; - } - } - - exit: - TEEC_FinalizeContext(&context); - if (!ret) - { - printf("multi_thread_testcase pass\n"); - } - return ret; -} - - -// Exception Test -static TEEC_Result testcase_4() -{ -#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharemem; - uint32_t origin; - - // Interface_Exception_001ll - ret = TEEC_InitializeContext(NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - - // Interface_Exception_002 - ret = TEEC_OpenSession(NULL, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - context.ta_path = (uint8_t *) "/data/not_found.sec"; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); - // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); - printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); - assert(ret); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Exception_003 - ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - session.session_id++; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_ACCESS_DENIED); - assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); - - session.session_id--; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = &sharemem; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(ret); - - ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); - assert(!ret); - - // Interface_Exception_004 - TEEC_CloseSession(NULL); - - // Interface_Exception_005 - TEEC_FinalizeContext(NULL); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) - { - printf("exception_testcase pass\n"); - } - return ret; -} - -static TEEC_Result testcase_5() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // CA_KILL_Test_001 - printf("CA Killed Test begin!, process exit!\n"); - exit(0); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_6() -{ - TEEC_Context context; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) - { - gettimeofday(&start, NULL); - ret = TEEC_InitializeContext(NULL, &context); - gettimeofday(&end, NULL); - if (ret) - { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_FinalizeContext(&context); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) - { - printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); - } - return ret; -} - -static TEEC_Result testcase_7() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) - { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) - { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - gettimeofday(&start, NULL); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) - { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_CloseSession(&session); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) - { - printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); - } - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_8(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) - { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) - { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) - { - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - gettimeofday(&start, NULL); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) - { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) - { - printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); - } - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result RsaSignCmd(char *msgBuf, uint32_t msgLen, char *signBuf, uint32_t *bufLen, - TEEC_Session *session) -{ - TEEC_Operation operation; - TEEC_Result result; - uint32_t origin; - - if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) - { - TEEC_Error("invoke RsaSignCmd has wrong params."); - return (TEEC_Result) RSA_INPUT_ERROR_PARAMETER; - } - - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES( - TEEC_VALUE_INPUT, - TEEC_NONE, - TEEC_MEMREF_TEMP_INPUT, - TEEC_MEMREF_TEMP_OUTPUT); - - operation.params[0].value.a = RSA_KEY_1; - operation.params[0].value.b = RSA_ALG_PSS_SHA256; - operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; - operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; - operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; - operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; - - result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); - if (result != TEEC_SUCCESS) - { - TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); - } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) - { - TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", - operation.params[PARAMS_INDEX_3].tmpref.size); - } else - { - printf("signBuf is : \n"); - DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); - *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; - } - - return result; -} - -static TEEC_Result testcase_9(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - char msgBuf[RSA_KEY_SIZE] = {0}; - char signature[RSA_KEY_SIZE] = {0}; - uint32_t bufLen = RSA_KEY_SIZE; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) - { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *) TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) - { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); - printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_10(void) -{ - - TEEC_Result ret; - char infile_path[1024]; - char *subdir = "testcase"; - memset(infile_path, 0, sizeof(infile_path)); - //basic_function - sprintf(infile_path, - "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", - TESTCASE, TESTCASE); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta(size <= 1M) failed. \n"); - return ret; - } else - { - printf("Deploy ta(size <= 1M) succed. \n"); - } - //8M_TA_TEST - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase1/8M_TA_TEST.sec"); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta(size = 8M) failed. \n", TESTCASE); - return ret; - } else - { - printf("Deploy ta(size = 8M) succed. \n", TESTCASE); - } - - //TA_NOT_FOUND - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase1/not_found.sec"); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret == TEEC_INFILE_NOT_FOUND) - { - printf("Deploy ta not found test success\n"); - } else - { - printf("Deploy TA not found test failed \n"); - return ret; - } - - //outfile_path_not_exist - subdir = "not_exist_path"; - sprintf(infile_path, - "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", - TESTCASE, TESTCASE); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta outfile_path_not_exist failed. \n"); - return ret; - } else - { - printf("Deploy ta outfile_path_not_exist succed. \n"); - } - - return ret; -} - -void help_print(void) -{ - printf("Usage: \n \ - 1.function_interface_testcase\n \ - 2.sharemem_interface_testcase\n \ - 3.multi_thread_testcase\n \ - 4.exception_testcase\n \ - 5.client_killed_testcase\n \ - 6.TEEC_InitializeContext perform-test\n \ - 7.TEEC_OpenSession perform-test\n \ - 8.TEEC_InvokeCommand perform-test\n \ - 9.RSA Sign test\n"); -} - -int main(int argc, char **argv) -{ - TEEC_Result ret; - struct timeval start, end; - gettimeofday(&start, NULL); - int choice = -1; - - if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) - { - help_print(); - return 1; - } - -#if 0 - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - return 0; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - return 0; - } - printf("Token set succed. \n"); -#endif - -#if 1 - ret = - TEEC_UnsetJwt( - ); - if (ret != TEEC_SUCCESS) - { - printf("Token unset failed. \n"); - return 0; - } - printf("Token unset succed. \n"); -#endif - - char infile_path[1024]; - char *subdir = "testcase"; - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, - "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", - TESTCASE, TESTCASE); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", TESTCASE); - return 0; - } else - { - printf("Deploy ta %d succed. \n", TESTCASE); - } - - /* - for (int ita = 1; ita < 10; ita ++) - { - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", ita); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", ita); - } - } - */ - - choice = atoi(argv[1]); - - switch (choice) - { - case 1: - ret = testcase_1(); - break; - case 2: - ret = testcase_2(); - break; - case 3: - ret = testcase_3(); - break; - case 4: - ret = testcase_4(); - break; - case 5: - ret = testcase_5(); - break; - case 6: - ret = testcase_6(); - break; - case 7: - ret = testcase_7(); - break; - case 8: - ret = testcase_8(); - break; - case 9: - ret = testcase_9(); - break; - case 10: - ret = testcase_10(); - break; - default: - printf("Error: invalid choice!\n"); - help_print(); - ret = -1; - break; - } - - return ret; -} diff --git a/demo/clientapp/testcase1/testcase.h b/demo/clientapp/testcase1/testcase.h deleted file mode 100644 index 7ced8e2..0000000 --- a/demo/clientapp/testcase1/testcase.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo CA application header file - */ - -#ifndef __MULTI_CORE_CA_H -#define __MULTI_CORE_CA_H - -// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" - -#define VALUE_A 55 -#define VALUE_B 33 -#define REE_TEMP_BUF "hello tee" -#define TEE_TEMP_BUF "hello ree" -#define TEMP_BUF_SIZE 20 -#define THREAD_COUNT 3 - -#define TEST_TIME 10 * 6 -#define EXPIRE_TIME 10 * 6 * 5 - -#define RSA_KEY_SIZE 256 // 2048bits -#define RSA_MASSAGE_SIZE 100 -#define RSA_INPUT_ERROR_PARAMETER 0x10000001 -#define RSA_KEY_1 1 -#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign - -#define PARAMS_INDEX_2 2 // params参数的下标索引 2 -#define PARAMS_INDEX_3 3 // params参数的下标索引 3 -#define PRINTF_SIZE 32 - -enum { - CMD_NULL = 0, - CMD_SHARE_MEM_FULL, - CMD_SHARE_MEM_PATR, - CMD_MUL_THREAD, - CMD_SIGN_PSS_MGF1_SHA256, -}; - -#endif diff --git a/demo/clientapp/testcase2/CMakeLists.txt b/demo/clientapp/testcase2/CMakeLists.txt deleted file mode 100644 index 80b4384..0000000 --- a/demo/clientapp/testcase2/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.5.1) - -project(testcase C CXX) - -# set(CMAKE_C_FLAGS "${CMAKE_}") -# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) - -# include_directories("${CMAKE_CURRENT_BINARY_DIR}") - -add_executable(testcase testcase.c) -target_link_libraries( - testcase - pthread - libteecc.so - libdbusc_jwt.so -) diff --git a/demo/clientapp/testcase2/build/cmake.sh b/demo/clientapp/testcase2/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/demo/clientapp/testcase2/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/demo/clientapp/testcase2/build/test.sh b/demo/clientapp/testcase2/build/test.sh deleted file mode 100644 index c73734d..0000000 --- a/demo/clientapp/testcase2/build/test.sh +++ /dev/null @@ -1,11 +0,0 @@ -CUR_DIR=$( dirname -- "$0"; ) - -${CUR_DIR}/testcase 1 -${CUR_DIR}/testcase 2 -${CUR_DIR}/testcase 3 -${CUR_DIR}/testcase 4 -# ${CUR_DIR}/testcase 5 -${CUR_DIR}/testcase 6 -${CUR_DIR}/testcase 7 -${CUR_DIR}/testcase 8 -${CUR_DIR}/testcase 9 diff --git a/demo/clientapp/testcase2/testcase.c b/demo/clientapp/testcase2/testcase.c deleted file mode 100644 index 9082b63..0000000 --- a/demo/clientapp/testcase2/testcase.c +++ /dev/null @@ -1,941 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo - */ - -#include "testcase.h" -#include -#include -#include -#include -#include -#include -// #include -// #include -// #include -// #include -#include -#include -#include -#include - -// #include "tee_client_api.h" -#include "teecc/teec_client_api.h" -#include "dbusc_jwt.h" - -#define TESTCASE 2 - -#if TESTCASE == 2 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} -}; -#elif TESTCASE == 3 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} -}; -#elif TESTCASE == 4 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} -}; -#elif TESTCASE == 5 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} -}; -#elif TESTCASE == 6 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} -}; -#elif TESTCASE == 7 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} -}; -#elif TESTCASE == 8 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} -}; -#elif TESTCASE == 9 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} -}; -#else -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} -}; -#endif - -static void DumpBuff(const char *buffer, size_t bufLen) -{ - size_t i; - if (buffer == NULL || bufLen == 0) { - return; - } - - printf("\n--------------------------------------------------\n"); - printf("bufLen = %d\n", bufLen); - for (i = 0; i < bufLen; i++) { - if (i % PRINTF_SIZE == 0) { - printf("\n"); - } - printf("%02x ", *(buffer + i)); - } - printf("\n--------------------------------------------------\n"); - return; -} - -static TEEC_Result testcase_1() -{ - TEEC_Context context; - // uint64_t context_addr; - TEEC_Session session; - TEEC_Operation operation; - uint32_t origin; - TEEC_Result ret; - - //Interface_Function-001 - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - //Interface_Function-002 - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- no param - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- value param - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_A); - assert(operation.params[0].value.b == VALUE_B); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_B); - assert(operation.params[0].value.b == VALUE_A); - - // Interface_Function-003 -- temp buf param - char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - memset(tmpbuf, 0, TEMP_BUF_SIZE); - memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - //Interface_Function-004 - TEEC_CloseSession(&session); - //Interface_Function-005 - TEEC_FinalizeContext(&context); - if (!ret) { - printf("interface_testcase pass\n"); - } - return ret; -} - -static void share_mem_test( - TEEC_Session *session, - TEEC_SharedMemory *sharebuf -) -{ - TEEC_Result ret; - TEEC_Operation operation; - uint32_t origin; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); -} - -static TEEC_Result testcase_2() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - char tmpbuf[TEMP_BUF_SIZE]; - uint32_t origin; - TEEC_Result ret; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Function-006 - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-011 - share_mem_test(&session, &sharebuf); - - // Interface_Function-008 - TEEC_ReleaseSharedMemory(&sharebuf); - - // Interface_Function-007 - memset(&sharebuf, 0, sizeof(sharebuf)); - sharebuf.buffer = tmpbuf; - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_RegisterSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-012 - share_mem_test(&session, &sharebuf); - - TEEC_ReleaseSharedMemory(&sharebuf); - -// exit: - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("sharemem_interface_testcase pass\n"); - } - return ret; -} - - -static void *thread_function(void *param) -{ - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - TEEC_Context *context = (TEEC_Context *)param; - pthread_t tid; - uint32_t origin; - struct timeval start, end, tokenset; - - tid = (pthread_t)pthread_self(); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("thread %u open session failed, ret=%x\n", tid, ret); - goto exit; - } - - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(context, &sharebuf); - if (ret) { - printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); - goto exit; - } - - printf("begin multi-thread test, during %u\n", TEST_TIME); - gettimeofday(&start, NULL); - gettimeofday(&tokenset, NULL); - while (1) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); - memset(sharebuf.buffer, 0, sharebuf.size); - memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - operation.params[0].memref.parent = &sharebuf; - operation.params[1].value.a = 1; - - ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); - if (ret) { - printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); - break; - } - - if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { - printf("thread %u get wrong comptue result.\n", tid); - break; - } - gettimeofday(&end, NULL); - if (end.tv_sec - start.tv_sec > TEST_TIME) - break; - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - - sleep(1); - } - - TEEC_CloseSession(&session); -exit: - return (void *)ret; -} - -static TEEC_Result testcase_3() -{ - TEEC_Result ret; - TEEC_Operation operation; - TEEC_Context context; - pthread_t tid[THREAD_COUNT]; - void *thread_ret = NULL; - uint32_t i; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_create(&tid[i], NULL, thread_function, (void *)&context); - } - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_join(tid[i], &thread_ret); - if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { - printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); - ret = TEEC_FAIL; - } - } - -exit: - TEEC_FinalizeContext(&context); - if (!ret) { - printf("multi_thread_testcase pass\n"); - } - return ret; -} - - -// Exception Test -static TEEC_Result testcase_4() -{ -#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharemem; - uint32_t origin; - - // Interface_Exception_001ll - ret = TEEC_InitializeContext(NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - - // Interface_Exception_002 - ret = TEEC_OpenSession(NULL, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - context.ta_path = (uint8_t *)"/data/not_found.sec"; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); - // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); - printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); - assert(ret); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Exception_003 - ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - session.session_id++; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_ACCESS_DENIED); - assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); - - session.session_id--; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = &sharemem; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(ret); - - ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); - assert(!ret); - - // Interface_Exception_004 - TEEC_CloseSession(NULL); - - // Interface_Exception_005 - TEEC_FinalizeContext(NULL); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("exception_testcase pass\n"); - } - return ret; -} - -static TEEC_Result testcase_5() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // CA_KILL_Test_001 - printf("CA Killed Test begin!, process exit!\n"); - exit(0); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_6() -{ - TEEC_Context context; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - gettimeofday(&start, NULL); - ret = TEEC_InitializeContext(NULL, &context); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_FinalizeContext(&context); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); - } - return ret; -} - -static TEEC_Result testcase_7() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - gettimeofday(&start, NULL); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_CloseSession(&session); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); - } - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_8(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - gettimeofday(&start, NULL); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); - } - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, - TEEC_Session *session) -{ - TEEC_Operation operation; - TEEC_Result result; - uint32_t origin; - - if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { - TEEC_Error("invoke RsaSignCmd has wrong params."); - return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; - } - - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES( - TEEC_VALUE_INPUT, - TEEC_NONE, - TEEC_MEMREF_TEMP_INPUT, - TEEC_MEMREF_TEMP_OUTPUT); - - operation.params[0].value.a = RSA_KEY_1; - operation.params[0].value.b = RSA_ALG_PSS_SHA256; - operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; - operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; - operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; - operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; - - result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); - if (result != TEEC_SUCCESS) { - TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); - } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { - TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", - operation.params[PARAMS_INDEX_3].tmpref.size); - } else { - printf("signBuf is : \n"); - DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); - *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; - } - - return result; -} - -static TEEC_Result testcase_9(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - char msgBuf[RSA_KEY_SIZE] = {0}; - char signature[RSA_KEY_SIZE] = {0}; - uint32_t bufLen = RSA_KEY_SIZE; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); - printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -void help_print(void) -{ - printf("Usage: \n \ - 1.function_interface_testcase\n \ - 2.sharemem_interface_testcase\n \ - 3.multi_thread_testcase\n \ - 4.exception_testcase\n \ - 5.client_killed_testcase\n \ - 6.TEEC_InitializeContext perform-test\n \ - 7.TEEC_OpenSession perform-test\n \ - 8.TEEC_InvokeCommand perform-test\n \ - 9.RSA Sign test\n"); -} - -int main(int argc, char **argv) -{ - TEEC_Result ret; - struct timeval start, end; - gettimeofday(&start, NULL); - int choice = -1; - - if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { - help_print(); - return 1; - } - -#if 0 - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - return 0; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - return 0; - } - printf("Token set succed. \n"); -#endif - -#if 1 - ret = - TEEC_UnsetJwt( - ); - if (ret != TEEC_SUCCESS) - { - printf("Token unset failed. \n"); - return 0; - } - printf("Token unset succed. \n"); -#endif - - char infile_path[1024]; - char * subdir = "testcase"; - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", TESTCASE); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", TESTCASE); - } - - /* - for (int ita = 1; ita < 10; ita ++) - { - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", ita); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", ita); - } - } - */ - - choice = atoi(argv[1]); - - switch (choice) { - case 1: - ret = testcase_1(); - break; - case 2: - ret = testcase_2(); - break; - case 3: - ret = testcase_3(); - break; - case 4: - ret = testcase_4(); - break; - case 5: - ret = testcase_5(); - break; - case 6: - ret = testcase_6(); - break; - case 7: - ret = testcase_7(); - break; - case 8: - ret = testcase_8(); - break; - case 9: - ret = testcase_9(); - break; - default: - printf("Error: invalid choice!\n"); - help_print(); - ret = -1; - break; - } - - return ret; -} diff --git a/demo/clientapp/testcase2/testcase.h b/demo/clientapp/testcase2/testcase.h deleted file mode 100644 index 7ced8e2..0000000 --- a/demo/clientapp/testcase2/testcase.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo CA application header file - */ - -#ifndef __MULTI_CORE_CA_H -#define __MULTI_CORE_CA_H - -// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" - -#define VALUE_A 55 -#define VALUE_B 33 -#define REE_TEMP_BUF "hello tee" -#define TEE_TEMP_BUF "hello ree" -#define TEMP_BUF_SIZE 20 -#define THREAD_COUNT 3 - -#define TEST_TIME 10 * 6 -#define EXPIRE_TIME 10 * 6 * 5 - -#define RSA_KEY_SIZE 256 // 2048bits -#define RSA_MASSAGE_SIZE 100 -#define RSA_INPUT_ERROR_PARAMETER 0x10000001 -#define RSA_KEY_1 1 -#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign - -#define PARAMS_INDEX_2 2 // params参数的下标索引 2 -#define PARAMS_INDEX_3 3 // params参数的下标索引 3 -#define PRINTF_SIZE 32 - -enum { - CMD_NULL = 0, - CMD_SHARE_MEM_FULL, - CMD_SHARE_MEM_PATR, - CMD_MUL_THREAD, - CMD_SIGN_PSS_MGF1_SHA256, -}; - -#endif diff --git a/demo/clientapp/testcase3/CMakeLists.txt b/demo/clientapp/testcase3/CMakeLists.txt deleted file mode 100644 index 80b4384..0000000 --- a/demo/clientapp/testcase3/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.5.1) - -project(testcase C CXX) - -# set(CMAKE_C_FLAGS "${CMAKE_}") -# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) - -# include_directories("${CMAKE_CURRENT_BINARY_DIR}") - -add_executable(testcase testcase.c) -target_link_libraries( - testcase - pthread - libteecc.so - libdbusc_jwt.so -) diff --git a/demo/clientapp/testcase3/build/cmake.sh b/demo/clientapp/testcase3/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/demo/clientapp/testcase3/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/demo/clientapp/testcase3/build/test.sh b/demo/clientapp/testcase3/build/test.sh deleted file mode 100644 index c73734d..0000000 --- a/demo/clientapp/testcase3/build/test.sh +++ /dev/null @@ -1,11 +0,0 @@ -CUR_DIR=$( dirname -- "$0"; ) - -${CUR_DIR}/testcase 1 -${CUR_DIR}/testcase 2 -${CUR_DIR}/testcase 3 -${CUR_DIR}/testcase 4 -# ${CUR_DIR}/testcase 5 -${CUR_DIR}/testcase 6 -${CUR_DIR}/testcase 7 -${CUR_DIR}/testcase 8 -${CUR_DIR}/testcase 9 diff --git a/demo/clientapp/testcase3/testcase.c b/demo/clientapp/testcase3/testcase.c deleted file mode 100644 index 918b48d..0000000 --- a/demo/clientapp/testcase3/testcase.c +++ /dev/null @@ -1,941 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo - */ - -#include "testcase.h" -#include -#include -#include -#include -#include -#include -// #include -// #include -// #include -// #include -#include -#include -#include -#include - -// #include "tee_client_api.h" -#include "teecc/teec_client_api.h" -#include "dbusc_jwt.h" - -#define TESTCASE 3 - -#if TESTCASE == 2 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} -}; -#elif TESTCASE == 3 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} -}; -#elif TESTCASE == 4 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} -}; -#elif TESTCASE == 5 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} -}; -#elif TESTCASE == 6 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} -}; -#elif TESTCASE == 7 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} -}; -#elif TESTCASE == 8 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} -}; -#elif TESTCASE == 9 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} -}; -#else -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} -}; -#endif - -static void DumpBuff(const char *buffer, size_t bufLen) -{ - size_t i; - if (buffer == NULL || bufLen == 0) { - return; - } - - printf("\n--------------------------------------------------\n"); - printf("bufLen = %d\n", bufLen); - for (i = 0; i < bufLen; i++) { - if (i % PRINTF_SIZE == 0) { - printf("\n"); - } - printf("%02x ", *(buffer + i)); - } - printf("\n--------------------------------------------------\n"); - return; -} - -static TEEC_Result testcase_1() -{ - TEEC_Context context; - // uint64_t context_addr; - TEEC_Session session; - TEEC_Operation operation; - uint32_t origin; - TEEC_Result ret; - - //Interface_Function-001 - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - //Interface_Function-002 - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- no param - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- value param - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_A); - assert(operation.params[0].value.b == VALUE_B); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_B); - assert(operation.params[0].value.b == VALUE_A); - - // Interface_Function-003 -- temp buf param - char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - memset(tmpbuf, 0, TEMP_BUF_SIZE); - memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - //Interface_Function-004 - TEEC_CloseSession(&session); - //Interface_Function-005 - TEEC_FinalizeContext(&context); - if (!ret) { - printf("interface_testcase pass\n"); - } - return ret; -} - -static void share_mem_test( - TEEC_Session *session, - TEEC_SharedMemory *sharebuf -) -{ - TEEC_Result ret; - TEEC_Operation operation; - uint32_t origin; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); -} - -static TEEC_Result testcase_2() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - char tmpbuf[TEMP_BUF_SIZE]; - uint32_t origin; - TEEC_Result ret; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Function-006 - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-011 - share_mem_test(&session, &sharebuf); - - // Interface_Function-008 - TEEC_ReleaseSharedMemory(&sharebuf); - - // Interface_Function-007 - memset(&sharebuf, 0, sizeof(sharebuf)); - sharebuf.buffer = tmpbuf; - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_RegisterSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-012 - share_mem_test(&session, &sharebuf); - - TEEC_ReleaseSharedMemory(&sharebuf); - -// exit: - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("sharemem_interface_testcase pass\n"); - } - return ret; -} - - -static void *thread_function(void *param) -{ - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - TEEC_Context *context = (TEEC_Context *)param; - pthread_t tid; - uint32_t origin; - struct timeval start, end, tokenset; - - tid = (pthread_t)pthread_self(); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("thread %u open session failed, ret=%x\n", tid, ret); - goto exit; - } - - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(context, &sharebuf); - if (ret) { - printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); - goto exit; - } - - printf("begin multi-thread test, during %u\n", TEST_TIME); - gettimeofday(&start, NULL); - gettimeofday(&tokenset, NULL); - while (1) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); - memset(sharebuf.buffer, 0, sharebuf.size); - memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - operation.params[0].memref.parent = &sharebuf; - operation.params[1].value.a = 1; - - ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); - if (ret) { - printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); - break; - } - - if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { - printf("thread %u get wrong comptue result.\n", tid); - break; - } - gettimeofday(&end, NULL); - if (end.tv_sec - start.tv_sec > TEST_TIME) - break; - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - - sleep(1); - } - - TEEC_CloseSession(&session); -exit: - return (void *)ret; -} - -static TEEC_Result testcase_3() -{ - TEEC_Result ret; - TEEC_Operation operation; - TEEC_Context context; - pthread_t tid[THREAD_COUNT]; - void *thread_ret = NULL; - uint32_t i; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_create(&tid[i], NULL, thread_function, (void *)&context); - } - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_join(tid[i], &thread_ret); - if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { - printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); - ret = TEEC_FAIL; - } - } - -exit: - TEEC_FinalizeContext(&context); - if (!ret) { - printf("multi_thread_testcase pass\n"); - } - return ret; -} - - -// Exception Test -static TEEC_Result testcase_4() -{ -#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharemem; - uint32_t origin; - - // Interface_Exception_001ll - ret = TEEC_InitializeContext(NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - - // Interface_Exception_002 - ret = TEEC_OpenSession(NULL, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - context.ta_path = (uint8_t *)"/data/not_found.sec"; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); - // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); - printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); - assert(ret); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Exception_003 - ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - session.session_id++; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_ACCESS_DENIED); - assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); - - session.session_id--; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = &sharemem; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(ret); - - ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); - assert(!ret); - - // Interface_Exception_004 - TEEC_CloseSession(NULL); - - // Interface_Exception_005 - TEEC_FinalizeContext(NULL); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("exception_testcase pass\n"); - } - return ret; -} - -static TEEC_Result testcase_5() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // CA_KILL_Test_001 - printf("CA Killed Test begin!, process exit!\n"); - exit(0); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_6() -{ - TEEC_Context context; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - gettimeofday(&start, NULL); - ret = TEEC_InitializeContext(NULL, &context); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_FinalizeContext(&context); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); - } - return ret; -} - -static TEEC_Result testcase_7() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - gettimeofday(&start, NULL); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_CloseSession(&session); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); - } - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_8(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - gettimeofday(&start, NULL); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); - } - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, - TEEC_Session *session) -{ - TEEC_Operation operation; - TEEC_Result result; - uint32_t origin; - - if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { - TEEC_Error("invoke RsaSignCmd has wrong params."); - return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; - } - - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES( - TEEC_VALUE_INPUT, - TEEC_NONE, - TEEC_MEMREF_TEMP_INPUT, - TEEC_MEMREF_TEMP_OUTPUT); - - operation.params[0].value.a = RSA_KEY_1; - operation.params[0].value.b = RSA_ALG_PSS_SHA256; - operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; - operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; - operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; - operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; - - result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); - if (result != TEEC_SUCCESS) { - TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); - } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { - TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", - operation.params[PARAMS_INDEX_3].tmpref.size); - } else { - printf("signBuf is : \n"); - DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); - *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; - } - - return result; -} - -static TEEC_Result testcase_9(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - char msgBuf[RSA_KEY_SIZE] = {0}; - char signature[RSA_KEY_SIZE] = {0}; - uint32_t bufLen = RSA_KEY_SIZE; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); - printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -void help_print(void) -{ - printf("Usage: \n \ - 1.function_interface_testcase\n \ - 2.sharemem_interface_testcase\n \ - 3.multi_thread_testcase\n \ - 4.exception_testcase\n \ - 5.client_killed_testcase\n \ - 6.TEEC_InitializeContext perform-test\n \ - 7.TEEC_OpenSession perform-test\n \ - 8.TEEC_InvokeCommand perform-test\n \ - 9.RSA Sign test\n"); -} - -int main(int argc, char **argv) -{ - TEEC_Result ret; - struct timeval start, end; - gettimeofday(&start, NULL); - int choice = -1; - - if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { - help_print(); - return 1; - } - -#if 0 - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - return 0; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - return 0; - } - printf("Token set succed. \n"); -#endif - -#if 1 - ret = - TEEC_UnsetJwt( - ); - if (ret != TEEC_SUCCESS) - { - printf("Token unset failed. \n"); - return 0; - } - printf("Token unset succed. \n"); -#endif - - char infile_path[1024]; - char * subdir = "testcase"; - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", TESTCASE); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", TESTCASE); - } - - /* - for (int ita = 1; ita < 10; ita ++) - { - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", ita); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", ita); - } - } - */ - - choice = atoi(argv[1]); - - switch (choice) { - case 1: - ret = testcase_1(); - break; - case 2: - ret = testcase_2(); - break; - case 3: - ret = testcase_3(); - break; - case 4: - ret = testcase_4(); - break; - case 5: - ret = testcase_5(); - break; - case 6: - ret = testcase_6(); - break; - case 7: - ret = testcase_7(); - break; - case 8: - ret = testcase_8(); - break; - case 9: - ret = testcase_9(); - break; - default: - printf("Error: invalid choice!\n"); - help_print(); - ret = -1; - break; - } - - return ret; -} diff --git a/demo/clientapp/testcase3/testcase.h b/demo/clientapp/testcase3/testcase.h deleted file mode 100644 index 7ced8e2..0000000 --- a/demo/clientapp/testcase3/testcase.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo CA application header file - */ - -#ifndef __MULTI_CORE_CA_H -#define __MULTI_CORE_CA_H - -// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" - -#define VALUE_A 55 -#define VALUE_B 33 -#define REE_TEMP_BUF "hello tee" -#define TEE_TEMP_BUF "hello ree" -#define TEMP_BUF_SIZE 20 -#define THREAD_COUNT 3 - -#define TEST_TIME 10 * 6 -#define EXPIRE_TIME 10 * 6 * 5 - -#define RSA_KEY_SIZE 256 // 2048bits -#define RSA_MASSAGE_SIZE 100 -#define RSA_INPUT_ERROR_PARAMETER 0x10000001 -#define RSA_KEY_1 1 -#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign - -#define PARAMS_INDEX_2 2 // params参数的下标索引 2 -#define PARAMS_INDEX_3 3 // params参数的下标索引 3 -#define PRINTF_SIZE 32 - -enum { - CMD_NULL = 0, - CMD_SHARE_MEM_FULL, - CMD_SHARE_MEM_PATR, - CMD_MUL_THREAD, - CMD_SIGN_PSS_MGF1_SHA256, -}; - -#endif diff --git a/demo/clientapp/testcase4/CMakeLists.txt b/demo/clientapp/testcase4/CMakeLists.txt deleted file mode 100644 index 80b4384..0000000 --- a/demo/clientapp/testcase4/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.5.1) - -project(testcase C CXX) - -# set(CMAKE_C_FLAGS "${CMAKE_}") -# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) - -# include_directories("${CMAKE_CURRENT_BINARY_DIR}") - -add_executable(testcase testcase.c) -target_link_libraries( - testcase - pthread - libteecc.so - libdbusc_jwt.so -) diff --git a/demo/clientapp/testcase4/build/cmake.sh b/demo/clientapp/testcase4/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/demo/clientapp/testcase4/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/demo/clientapp/testcase4/build/test.sh b/demo/clientapp/testcase4/build/test.sh deleted file mode 100644 index c73734d..0000000 --- a/demo/clientapp/testcase4/build/test.sh +++ /dev/null @@ -1,11 +0,0 @@ -CUR_DIR=$( dirname -- "$0"; ) - -${CUR_DIR}/testcase 1 -${CUR_DIR}/testcase 2 -${CUR_DIR}/testcase 3 -${CUR_DIR}/testcase 4 -# ${CUR_DIR}/testcase 5 -${CUR_DIR}/testcase 6 -${CUR_DIR}/testcase 7 -${CUR_DIR}/testcase 8 -${CUR_DIR}/testcase 9 diff --git a/demo/clientapp/testcase4/testcase.c b/demo/clientapp/testcase4/testcase.c deleted file mode 100644 index 44498ac..0000000 --- a/demo/clientapp/testcase4/testcase.c +++ /dev/null @@ -1,940 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo - */ - -#include "testcase.h" -#include -#include -#include -#include -#include -#include -// #include -// #include -// #include -// #include -#include -#include -#include -#include - -// #include "tee_client_api.h" -#include "teecc/teec_client_api.h" -#include "dbusc_jwt.h" - -#define TESTCASE 4 - -#if TESTCASE == 2 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} -}; -#elif TESTCASE == 3 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} -}; -#elif TESTCASE == 4 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} -}; -#elif TESTCASE == 5 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} -}; -#elif TESTCASE == 6 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} -}; -#elif TESTCASE == 7 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} -}; -#elif TESTCASE == 8 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} -}; -#elif TESTCASE == 9 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} -}; -#else -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} -}; -#endif - -static void DumpBuff(const char *buffer, size_t bufLen) -{ - size_t i; - if (buffer == NULL || bufLen == 0) { - return; - } - - printf("\n--------------------------------------------------\n"); - printf("bufLen = %d\n", bufLen); - for (i = 0; i < bufLen; i++) { - if (i % PRINTF_SIZE == 0) { - printf("\n"); - } - printf("%02x ", *(buffer + i)); - } - printf("\n--------------------------------------------------\n"); - return; -} - -static TEEC_Result testcase_1() -{ - TEEC_Context context; - // uint64_t context_addr; - TEEC_Session session; - TEEC_Operation operation; - uint32_t origin; - TEEC_Result ret; - - //Interface_Function-001 - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - //Interface_Function-002 - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- no param - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- value param - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_A); - assert(operation.params[0].value.b == VALUE_B); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_B); - assert(operation.params[0].value.b == VALUE_A); - - // Interface_Function-003 -- temp buf param - char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - memset(tmpbuf, 0, TEMP_BUF_SIZE); - memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - //Interface_Function-004 - TEEC_CloseSession(&session); - //Interface_Function-005 - TEEC_FinalizeContext(&context); - if (!ret) { - printf("interface_testcase pass\n"); - } - return ret; -} - -static void share_mem_test( - TEEC_Session *session, - TEEC_SharedMemory *sharebuf -) -{ - TEEC_Result ret; - TEEC_Operation operation; - uint32_t origin; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); -} - -static TEEC_Result testcase_2() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - char tmpbuf[TEMP_BUF_SIZE]; - uint32_t origin; - TEEC_Result ret; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Function-006 - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-011 - share_mem_test(&session, &sharebuf); - - // Interface_Function-008 - TEEC_ReleaseSharedMemory(&sharebuf); - - // Interface_Function-007 - memset(&sharebuf, 0, sizeof(sharebuf)); - sharebuf.buffer = tmpbuf; - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_RegisterSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-012 - share_mem_test(&session, &sharebuf); - - TEEC_ReleaseSharedMemory(&sharebuf); - -// exit: - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("sharemem_interface_testcase pass\n"); - } - return ret; -} - - -static void *thread_function(void *param) -{ - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - TEEC_Context *context = (TEEC_Context *)param; - pthread_t tid; - uint32_t origin; - struct timeval start, end, tokenset; - - tid = (pthread_t)pthread_self(); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("thread %u open session failed, ret=%x\n", tid, ret); - goto exit; - } - - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(context, &sharebuf); - if (ret) { - printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); - goto exit; - } - - printf("begin multi-thread test, during %u\n", TEST_TIME); - gettimeofday(&start, NULL); - gettimeofday(&tokenset, NULL); - while (1) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); - memset(sharebuf.buffer, 0, sharebuf.size); - memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - operation.params[0].memref.parent = &sharebuf; - operation.params[1].value.a = 1; - - ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); - if (ret) { - printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); - break; - } - - if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { - printf("thread %u get wrong comptue result.\n", tid); - break; - } - gettimeofday(&end, NULL); - if (end.tv_sec - start.tv_sec > TEST_TIME) - break; - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - - sleep(1); - } - - TEEC_CloseSession(&session); -exit: - return (void *)ret; -} - -static TEEC_Result testcase_3() -{ - TEEC_Result ret; - TEEC_Operation operation; - TEEC_Context context; - pthread_t tid[THREAD_COUNT]; - void *thread_ret = NULL; - uint32_t i; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_create(&tid[i], NULL, thread_function, (void *)&context); - } - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_join(tid[i], &thread_ret); - if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { - printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); - ret = TEEC_FAIL; - } - } - -exit: - TEEC_FinalizeContext(&context); - if (!ret) { - printf("multi_thread_testcase pass\n"); - } - return ret; -} - - -// Exception Test -static TEEC_Result testcase_4() -{ -#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharemem; - uint32_t origin; - - // Interface_Exception_001ll - ret = TEEC_InitializeContext(NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - - // Interface_Exception_002 - ret = TEEC_OpenSession(NULL, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - context.ta_path = (uint8_t *)"/data/not_found.sec"; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); - // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); - printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); - assert(ret); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Exception_003 - ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - session.session_id++; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_ACCESS_DENIED); - assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); - - session.session_id--; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = &sharemem; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(ret); - - ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); - assert(!ret); - - // Interface_Exception_004 - TEEC_CloseSession(NULL); - - // Interface_Exception_005 - TEEC_FinalizeContext(NULL); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("exception_testcase pass\n"); - } - return ret; -} - -static TEEC_Result testcase_5() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // CA_KILL_Test_001 - printf("CA Killed Test begin!, process exit!\n"); - exit(0); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_6() -{ - TEEC_Context context; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - gettimeofday(&start, NULL); - ret = TEEC_InitializeContext(NULL, &context); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_FinalizeContext(&context); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); - } - return ret; -} - -static TEEC_Result testcase_7() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - gettimeofday(&start, NULL); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_CloseSession(&session); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); - } - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_8(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - gettimeofday(&start, NULL); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); - } - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, - TEEC_Session *session) -{ - TEEC_Operation operation; - TEEC_Result result; - uint32_t origin; - - if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { - TEEC_Error("invoke RsaSignCmd has wrong params."); - return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; - } - - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES( - TEEC_VALUE_INPUT, - TEEC_NONE, - TEEC_MEMREF_TEMP_INPUT, - TEEC_MEMREF_TEMP_OUTPUT); - - operation.params[0].value.a = RSA_KEY_1; - operation.params[0].value.b = RSA_ALG_PSS_SHA256; - operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; - operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; - operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; - operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; - - result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); - if (result != TEEC_SUCCESS) { - TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); - } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { - TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", - operation.params[PARAMS_INDEX_3].tmpref.size); - } else { - printf("signBuf is : \n"); - DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); - *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; - } - - return result; -} - -static TEEC_Result testcase_9(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - char msgBuf[RSA_KEY_SIZE] = {0}; - char signature[RSA_KEY_SIZE] = {0}; - uint32_t bufLen = RSA_KEY_SIZE; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); - printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -void help_print(void) -{ - printf("Usage: \n \ - 1.function_interface_testcase\n \ - 2.sharemem_interface_testcase\n \ - 3.multi_thread_testcase\n \ - 4.exception_testcase\n \ - 5.client_killed_testcase\n \ - 6.TEEC_InitializeContext perform-test\n \ - 7.TEEC_OpenSession perform-test\n \ - 8.TEEC_InvokeCommand perform-test\n \ - 9.RSA Sign test\n"); -} - -int main(int argc, char **argv) -{ - TEEC_Result ret; - struct timeval start, end; - gettimeofday(&start, NULL); - int choice = -1; - - if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { - help_print(); - return 1; - } - -#if 0 - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - return 0; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - return 0; - } - printf("Token set succed. \n"); -#endif -#if 1 - ret = - TEEC_UnsetJwt( - ); - if (ret != TEEC_SUCCESS) - { - printf("Token unset failed. \n"); - return 0; - } - printf("Token unset succed. \n"); -#endif - - char infile_path[1024]; - char * subdir = "testcase"; - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", TESTCASE); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", TESTCASE); - } - - /* - for (int ita = 1; ita < 10; ita ++) - { - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", ita); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", ita); - } - } - */ - - choice = atoi(argv[1]); - - switch (choice) { - case 1: - ret = testcase_1(); - break; - case 2: - ret = testcase_2(); - break; - case 3: - ret = testcase_3(); - break; - case 4: - ret = testcase_4(); - break; - case 5: - ret = testcase_5(); - break; - case 6: - ret = testcase_6(); - break; - case 7: - ret = testcase_7(); - break; - case 8: - ret = testcase_8(); - break; - case 9: - ret = testcase_9(); - break; - default: - printf("Error: invalid choice!\n"); - help_print(); - ret = -1; - break; - } - - return ret; -} diff --git a/demo/clientapp/testcase4/testcase.h b/demo/clientapp/testcase4/testcase.h deleted file mode 100644 index 7ced8e2..0000000 --- a/demo/clientapp/testcase4/testcase.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo CA application header file - */ - -#ifndef __MULTI_CORE_CA_H -#define __MULTI_CORE_CA_H - -// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" - -#define VALUE_A 55 -#define VALUE_B 33 -#define REE_TEMP_BUF "hello tee" -#define TEE_TEMP_BUF "hello ree" -#define TEMP_BUF_SIZE 20 -#define THREAD_COUNT 3 - -#define TEST_TIME 10 * 6 -#define EXPIRE_TIME 10 * 6 * 5 - -#define RSA_KEY_SIZE 256 // 2048bits -#define RSA_MASSAGE_SIZE 100 -#define RSA_INPUT_ERROR_PARAMETER 0x10000001 -#define RSA_KEY_1 1 -#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign - -#define PARAMS_INDEX_2 2 // params参数的下标索引 2 -#define PARAMS_INDEX_3 3 // params参数的下标索引 3 -#define PRINTF_SIZE 32 - -enum { - CMD_NULL = 0, - CMD_SHARE_MEM_FULL, - CMD_SHARE_MEM_PATR, - CMD_MUL_THREAD, - CMD_SIGN_PSS_MGF1_SHA256, -}; - -#endif diff --git a/demo/clientapp/testcase5/CMakeLists.txt b/demo/clientapp/testcase5/CMakeLists.txt deleted file mode 100644 index 80b4384..0000000 --- a/demo/clientapp/testcase5/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.5.1) - -project(testcase C CXX) - -# set(CMAKE_C_FLAGS "${CMAKE_}") -# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) - -# include_directories("${CMAKE_CURRENT_BINARY_DIR}") - -add_executable(testcase testcase.c) -target_link_libraries( - testcase - pthread - libteecc.so - libdbusc_jwt.so -) diff --git a/demo/clientapp/testcase5/build/cmake.sh b/demo/clientapp/testcase5/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/demo/clientapp/testcase5/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/demo/clientapp/testcase5/build/test.sh b/demo/clientapp/testcase5/build/test.sh deleted file mode 100644 index c73734d..0000000 --- a/demo/clientapp/testcase5/build/test.sh +++ /dev/null @@ -1,11 +0,0 @@ -CUR_DIR=$( dirname -- "$0"; ) - -${CUR_DIR}/testcase 1 -${CUR_DIR}/testcase 2 -${CUR_DIR}/testcase 3 -${CUR_DIR}/testcase 4 -# ${CUR_DIR}/testcase 5 -${CUR_DIR}/testcase 6 -${CUR_DIR}/testcase 7 -${CUR_DIR}/testcase 8 -${CUR_DIR}/testcase 9 diff --git a/demo/clientapp/testcase5/testcase.c b/demo/clientapp/testcase5/testcase.c deleted file mode 100644 index df56bf4..0000000 --- a/demo/clientapp/testcase5/testcase.c +++ /dev/null @@ -1,940 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo - */ - -#include "testcase.h" -#include -#include -#include -#include -#include -#include -// #include -// #include -// #include -// #include -#include -#include -#include -#include - -// #include "tee_client_api.h" -#include "teecc/teec_client_api.h" -#include "dbusc_jwt.h" - -#define TESTCASE 5 - -#if TESTCASE == 2 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} -}; -#elif TESTCASE == 3 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} -}; -#elif TESTCASE == 4 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} -}; -#elif TESTCASE == 5 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} -}; -#elif TESTCASE == 6 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} -}; -#elif TESTCASE == 7 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} -}; -#elif TESTCASE == 8 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} -}; -#elif TESTCASE == 9 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} -}; -#else -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} -}; -#endif - -static void DumpBuff(const char *buffer, size_t bufLen) -{ - size_t i; - if (buffer == NULL || bufLen == 0) { - return; - } - - printf("\n--------------------------------------------------\n"); - printf("bufLen = %d\n", bufLen); - for (i = 0; i < bufLen; i++) { - if (i % PRINTF_SIZE == 0) { - printf("\n"); - } - printf("%02x ", *(buffer + i)); - } - printf("\n--------------------------------------------------\n"); - return; -} - -static TEEC_Result testcase_1() -{ - TEEC_Context context; - // uint64_t context_addr; - TEEC_Session session; - TEEC_Operation operation; - uint32_t origin; - TEEC_Result ret; - - //Interface_Function-001 - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - //Interface_Function-002 - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- no param - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- value param - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_A); - assert(operation.params[0].value.b == VALUE_B); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_B); - assert(operation.params[0].value.b == VALUE_A); - - // Interface_Function-003 -- temp buf param - char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - memset(tmpbuf, 0, TEMP_BUF_SIZE); - memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - //Interface_Function-004 - TEEC_CloseSession(&session); - //Interface_Function-005 - TEEC_FinalizeContext(&context); - if (!ret) { - printf("interface_testcase pass\n"); - } - return ret; -} - -static void share_mem_test( - TEEC_Session *session, - TEEC_SharedMemory *sharebuf -) -{ - TEEC_Result ret; - TEEC_Operation operation; - uint32_t origin; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); -} - -static TEEC_Result testcase_2() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - char tmpbuf[TEMP_BUF_SIZE]; - uint32_t origin; - TEEC_Result ret; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Function-006 - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-011 - share_mem_test(&session, &sharebuf); - - // Interface_Function-008 - TEEC_ReleaseSharedMemory(&sharebuf); - - // Interface_Function-007 - memset(&sharebuf, 0, sizeof(sharebuf)); - sharebuf.buffer = tmpbuf; - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_RegisterSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-012 - share_mem_test(&session, &sharebuf); - - TEEC_ReleaseSharedMemory(&sharebuf); - -// exit: - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("sharemem_interface_testcase pass\n"); - } - return ret; -} - - -static void *thread_function(void *param) -{ - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - TEEC_Context *context = (TEEC_Context *)param; - pthread_t tid; - uint32_t origin; - struct timeval start, end, tokenset; - - tid = (pthread_t)pthread_self(); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("thread %u open session failed, ret=%x\n", tid, ret); - goto exit; - } - - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(context, &sharebuf); - if (ret) { - printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); - goto exit; - } - - printf("begin multi-thread test, during %u\n", TEST_TIME); - gettimeofday(&start, NULL); - gettimeofday(&tokenset, NULL); - while (1) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); - memset(sharebuf.buffer, 0, sharebuf.size); - memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - operation.params[0].memref.parent = &sharebuf; - operation.params[1].value.a = 1; - - ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); - if (ret) { - printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); - break; - } - - if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { - printf("thread %u get wrong comptue result.\n", tid); - break; - } - gettimeofday(&end, NULL); - if (end.tv_sec - start.tv_sec > TEST_TIME) - break; - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - - sleep(1); - } - - TEEC_CloseSession(&session); -exit: - return (void *)ret; -} - -static TEEC_Result testcase_3() -{ - TEEC_Result ret; - TEEC_Operation operation; - TEEC_Context context; - pthread_t tid[THREAD_COUNT]; - void *thread_ret = NULL; - uint32_t i; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_create(&tid[i], NULL, thread_function, (void *)&context); - } - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_join(tid[i], &thread_ret); - if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { - printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); - ret = TEEC_FAIL; - } - } - -exit: - TEEC_FinalizeContext(&context); - if (!ret) { - printf("multi_thread_testcase pass\n"); - } - return ret; -} - - -// Exception Test -static TEEC_Result testcase_4() -{ -#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharemem; - uint32_t origin; - - // Interface_Exception_001ll - ret = TEEC_InitializeContext(NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - - // Interface_Exception_002 - ret = TEEC_OpenSession(NULL, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - context.ta_path = (uint8_t *)"/data/not_found.sec"; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); - // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); - printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); - assert(ret); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Exception_003 - ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - session.session_id++; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_ACCESS_DENIED); - assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); - - session.session_id--; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = &sharemem; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(ret); - - ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); - assert(!ret); - - // Interface_Exception_004 - TEEC_CloseSession(NULL); - - // Interface_Exception_005 - TEEC_FinalizeContext(NULL); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("exception_testcase pass\n"); - } - return ret; -} - -static TEEC_Result testcase_5() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // CA_KILL_Test_001 - printf("CA Killed Test begin!, process exit!\n"); - exit(0); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_6() -{ - TEEC_Context context; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - gettimeofday(&start, NULL); - ret = TEEC_InitializeContext(NULL, &context); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_FinalizeContext(&context); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); - } - return ret; -} - -static TEEC_Result testcase_7() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - gettimeofday(&start, NULL); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_CloseSession(&session); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); - } - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_8(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - gettimeofday(&start, NULL); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); - } - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, - TEEC_Session *session) -{ - TEEC_Operation operation; - TEEC_Result result; - uint32_t origin; - - if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { - TEEC_Error("invoke RsaSignCmd has wrong params."); - return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; - } - - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES( - TEEC_VALUE_INPUT, - TEEC_NONE, - TEEC_MEMREF_TEMP_INPUT, - TEEC_MEMREF_TEMP_OUTPUT); - - operation.params[0].value.a = RSA_KEY_1; - operation.params[0].value.b = RSA_ALG_PSS_SHA256; - operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; - operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; - operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; - operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; - - result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); - if (result != TEEC_SUCCESS) { - TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); - } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { - TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", - operation.params[PARAMS_INDEX_3].tmpref.size); - } else { - printf("signBuf is : \n"); - DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); - *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; - } - - return result; -} - -static TEEC_Result testcase_9(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - char msgBuf[RSA_KEY_SIZE] = {0}; - char signature[RSA_KEY_SIZE] = {0}; - uint32_t bufLen = RSA_KEY_SIZE; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); - printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -void help_print(void) -{ - printf("Usage: \n \ - 1.function_interface_testcase\n \ - 2.sharemem_interface_testcase\n \ - 3.multi_thread_testcase\n \ - 4.exception_testcase\n \ - 5.client_killed_testcase\n \ - 6.TEEC_InitializeContext perform-test\n \ - 7.TEEC_OpenSession perform-test\n \ - 8.TEEC_InvokeCommand perform-test\n \ - 9.RSA Sign test\n"); -} - -int main(int argc, char **argv) -{ - TEEC_Result ret; - struct timeval start, end; - gettimeofday(&start, NULL); - int choice = -1; - - if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { - help_print(); - return 1; - } - -#if 0 - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - return 0; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - return 0; - } - printf("Token set succed. \n"); -#endif -#if 1 - ret = - TEEC_UnsetJwt( - ); - if (ret != TEEC_SUCCESS) - { - printf("Token unset failed. \n"); - return 0; - } - printf("Token unset succed. \n"); -#endif - - char infile_path[1024]; - char * subdir = "testcase"; - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", TESTCASE); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", TESTCASE); - } - - /* - for (int ita = 1; ita < 10; ita ++) - { - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", ita); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", ita); - } - } - */ - - choice = atoi(argv[1]); - - switch (choice) { - case 1: - ret = testcase_1(); - break; - case 2: - ret = testcase_2(); - break; - case 3: - ret = testcase_3(); - break; - case 4: - ret = testcase_4(); - break; - case 5: - ret = testcase_5(); - break; - case 6: - ret = testcase_6(); - break; - case 7: - ret = testcase_7(); - break; - case 8: - ret = testcase_8(); - break; - case 9: - ret = testcase_9(); - break; - default: - printf("Error: invalid choice!\n"); - help_print(); - ret = -1; - break; - } - - return ret; -} diff --git a/demo/clientapp/testcase5/testcase.h b/demo/clientapp/testcase5/testcase.h deleted file mode 100644 index 7ced8e2..0000000 --- a/demo/clientapp/testcase5/testcase.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo CA application header file - */ - -#ifndef __MULTI_CORE_CA_H -#define __MULTI_CORE_CA_H - -// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" - -#define VALUE_A 55 -#define VALUE_B 33 -#define REE_TEMP_BUF "hello tee" -#define TEE_TEMP_BUF "hello ree" -#define TEMP_BUF_SIZE 20 -#define THREAD_COUNT 3 - -#define TEST_TIME 10 * 6 -#define EXPIRE_TIME 10 * 6 * 5 - -#define RSA_KEY_SIZE 256 // 2048bits -#define RSA_MASSAGE_SIZE 100 -#define RSA_INPUT_ERROR_PARAMETER 0x10000001 -#define RSA_KEY_1 1 -#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign - -#define PARAMS_INDEX_2 2 // params参数的下标索引 2 -#define PARAMS_INDEX_3 3 // params参数的下标索引 3 -#define PRINTF_SIZE 32 - -enum { - CMD_NULL = 0, - CMD_SHARE_MEM_FULL, - CMD_SHARE_MEM_PATR, - CMD_MUL_THREAD, - CMD_SIGN_PSS_MGF1_SHA256, -}; - -#endif diff --git a/demo/clientapp/testcase6/CMakeLists.txt b/demo/clientapp/testcase6/CMakeLists.txt deleted file mode 100644 index 80b4384..0000000 --- a/demo/clientapp/testcase6/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.5.1) - -project(testcase C CXX) - -# set(CMAKE_C_FLAGS "${CMAKE_}") -# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) - -# include_directories("${CMAKE_CURRENT_BINARY_DIR}") - -add_executable(testcase testcase.c) -target_link_libraries( - testcase - pthread - libteecc.so - libdbusc_jwt.so -) diff --git a/demo/clientapp/testcase6/build/cmake.sh b/demo/clientapp/testcase6/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/demo/clientapp/testcase6/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/demo/clientapp/testcase6/build/test.sh b/demo/clientapp/testcase6/build/test.sh deleted file mode 100644 index c73734d..0000000 --- a/demo/clientapp/testcase6/build/test.sh +++ /dev/null @@ -1,11 +0,0 @@ -CUR_DIR=$( dirname -- "$0"; ) - -${CUR_DIR}/testcase 1 -${CUR_DIR}/testcase 2 -${CUR_DIR}/testcase 3 -${CUR_DIR}/testcase 4 -# ${CUR_DIR}/testcase 5 -${CUR_DIR}/testcase 6 -${CUR_DIR}/testcase 7 -${CUR_DIR}/testcase 8 -${CUR_DIR}/testcase 9 diff --git a/demo/clientapp/testcase6/testcase.c b/demo/clientapp/testcase6/testcase.c deleted file mode 100644 index 8603324..0000000 --- a/demo/clientapp/testcase6/testcase.c +++ /dev/null @@ -1,940 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo - */ - -#include "testcase.h" -#include -#include -#include -#include -#include -#include -// #include -// #include -// #include -// #include -#include -#include -#include -#include - -// #include "tee_client_api.h" -#include "teecc/teec_client_api.h" -#include "dbusc_jwt.h" - -#define TESTCASE 6 - -#if TESTCASE == 2 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} -}; -#elif TESTCASE == 3 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} -}; -#elif TESTCASE == 4 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} -}; -#elif TESTCASE == 5 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} -}; -#elif TESTCASE == 6 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} -}; -#elif TESTCASE == 7 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} -}; -#elif TESTCASE == 8 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} -}; -#elif TESTCASE == 9 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} -}; -#else -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} -}; -#endif - -static void DumpBuff(const char *buffer, size_t bufLen) -{ - size_t i; - if (buffer == NULL || bufLen == 0) { - return; - } - - printf("\n--------------------------------------------------\n"); - printf("bufLen = %d\n", bufLen); - for (i = 0; i < bufLen; i++) { - if (i % PRINTF_SIZE == 0) { - printf("\n"); - } - printf("%02x ", *(buffer + i)); - } - printf("\n--------------------------------------------------\n"); - return; -} - -static TEEC_Result testcase_1() -{ - TEEC_Context context; - // uint64_t context_addr; - TEEC_Session session; - TEEC_Operation operation; - uint32_t origin; - TEEC_Result ret; - - //Interface_Function-001 - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - //Interface_Function-002 - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- no param - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- value param - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_A); - assert(operation.params[0].value.b == VALUE_B); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_B); - assert(operation.params[0].value.b == VALUE_A); - - // Interface_Function-003 -- temp buf param - char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - memset(tmpbuf, 0, TEMP_BUF_SIZE); - memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - //Interface_Function-004 - TEEC_CloseSession(&session); - //Interface_Function-005 - TEEC_FinalizeContext(&context); - if (!ret) { - printf("interface_testcase pass\n"); - } - return ret; -} - -static void share_mem_test( - TEEC_Session *session, - TEEC_SharedMemory *sharebuf -) -{ - TEEC_Result ret; - TEEC_Operation operation; - uint32_t origin; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); -} - -static TEEC_Result testcase_2() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - char tmpbuf[TEMP_BUF_SIZE]; - uint32_t origin; - TEEC_Result ret; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Function-006 - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-011 - share_mem_test(&session, &sharebuf); - - // Interface_Function-008 - TEEC_ReleaseSharedMemory(&sharebuf); - - // Interface_Function-007 - memset(&sharebuf, 0, sizeof(sharebuf)); - sharebuf.buffer = tmpbuf; - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_RegisterSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-012 - share_mem_test(&session, &sharebuf); - - TEEC_ReleaseSharedMemory(&sharebuf); - -// exit: - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("sharemem_interface_testcase pass\n"); - } - return ret; -} - - -static void *thread_function(void *param) -{ - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - TEEC_Context *context = (TEEC_Context *)param; - pthread_t tid; - uint32_t origin; - struct timeval start, end, tokenset; - - tid = (pthread_t)pthread_self(); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("thread %u open session failed, ret=%x\n", tid, ret); - goto exit; - } - - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(context, &sharebuf); - if (ret) { - printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); - goto exit; - } - - printf("begin multi-thread test, during %u\n", TEST_TIME); - gettimeofday(&start, NULL); - gettimeofday(&tokenset, NULL); - while (1) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); - memset(sharebuf.buffer, 0, sharebuf.size); - memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - operation.params[0].memref.parent = &sharebuf; - operation.params[1].value.a = 1; - - ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); - if (ret) { - printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); - break; - } - - if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { - printf("thread %u get wrong comptue result.\n", tid); - break; - } - gettimeofday(&end, NULL); - if (end.tv_sec - start.tv_sec > TEST_TIME) - break; - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - - sleep(1); - } - - TEEC_CloseSession(&session); -exit: - return (void *)ret; -} - -static TEEC_Result testcase_3() -{ - TEEC_Result ret; - TEEC_Operation operation; - TEEC_Context context; - pthread_t tid[THREAD_COUNT]; - void *thread_ret = NULL; - uint32_t i; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_create(&tid[i], NULL, thread_function, (void *)&context); - } - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_join(tid[i], &thread_ret); - if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { - printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); - ret = TEEC_FAIL; - } - } - -exit: - TEEC_FinalizeContext(&context); - if (!ret) { - printf("multi_thread_testcase pass\n"); - } - return ret; -} - - -// Exception Test -static TEEC_Result testcase_4() -{ -#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharemem; - uint32_t origin; - - // Interface_Exception_001ll - ret = TEEC_InitializeContext(NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - - // Interface_Exception_002 - ret = TEEC_OpenSession(NULL, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - context.ta_path = (uint8_t *)"/data/not_found.sec"; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); - // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); - printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); - assert(ret); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Exception_003 - ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - session.session_id++; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_ACCESS_DENIED); - assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); - - session.session_id--; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = &sharemem; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(ret); - - ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); - assert(!ret); - - // Interface_Exception_004 - TEEC_CloseSession(NULL); - - // Interface_Exception_005 - TEEC_FinalizeContext(NULL); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("exception_testcase pass\n"); - } - return ret; -} - -static TEEC_Result testcase_5() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // CA_KILL_Test_001 - printf("CA Killed Test begin!, process exit!\n"); - exit(0); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_6() -{ - TEEC_Context context; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - gettimeofday(&start, NULL); - ret = TEEC_InitializeContext(NULL, &context); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_FinalizeContext(&context); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); - } - return ret; -} - -static TEEC_Result testcase_7() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - gettimeofday(&start, NULL); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_CloseSession(&session); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); - } - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_8(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - gettimeofday(&start, NULL); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); - } - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, - TEEC_Session *session) -{ - TEEC_Operation operation; - TEEC_Result result; - uint32_t origin; - - if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { - TEEC_Error("invoke RsaSignCmd has wrong params."); - return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; - } - - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES( - TEEC_VALUE_INPUT, - TEEC_NONE, - TEEC_MEMREF_TEMP_INPUT, - TEEC_MEMREF_TEMP_OUTPUT); - - operation.params[0].value.a = RSA_KEY_1; - operation.params[0].value.b = RSA_ALG_PSS_SHA256; - operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; - operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; - operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; - operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; - - result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); - if (result != TEEC_SUCCESS) { - TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); - } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { - TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", - operation.params[PARAMS_INDEX_3].tmpref.size); - } else { - printf("signBuf is : \n"); - DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); - *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; - } - - return result; -} - -static TEEC_Result testcase_9(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - char msgBuf[RSA_KEY_SIZE] = {0}; - char signature[RSA_KEY_SIZE] = {0}; - uint32_t bufLen = RSA_KEY_SIZE; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); - printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -void help_print(void) -{ - printf("Usage: \n \ - 1.function_interface_testcase\n \ - 2.sharemem_interface_testcase\n \ - 3.multi_thread_testcase\n \ - 4.exception_testcase\n \ - 5.client_killed_testcase\n \ - 6.TEEC_InitializeContext perform-test\n \ - 7.TEEC_OpenSession perform-test\n \ - 8.TEEC_InvokeCommand perform-test\n \ - 9.RSA Sign test\n"); -} - -int main(int argc, char **argv) -{ - TEEC_Result ret; - struct timeval start, end; - gettimeofday(&start, NULL); - int choice = -1; - - if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { - help_print(); - return 1; - } - -#if 0 - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - return 0; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - return 0; - } - printf("Token set succed. \n"); -#endif -#if 1 - ret = - TEEC_UnsetJwt( - ); - if (ret != TEEC_SUCCESS) - { - printf("Token unset failed. \n"); - return 0; - } - printf("Token unset succed. \n"); -#endif - - char infile_path[1024]; - char * subdir = "testcase"; - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", TESTCASE); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", TESTCASE); - } - - /* - for (int ita = 1; ita < 10; ita ++) - { - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", ita); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", ita); - } - } - */ - - choice = atoi(argv[1]); - - switch (choice) { - case 1: - ret = testcase_1(); - break; - case 2: - ret = testcase_2(); - break; - case 3: - ret = testcase_3(); - break; - case 4: - ret = testcase_4(); - break; - case 5: - ret = testcase_5(); - break; - case 6: - ret = testcase_6(); - break; - case 7: - ret = testcase_7(); - break; - case 8: - ret = testcase_8(); - break; - case 9: - ret = testcase_9(); - break; - default: - printf("Error: invalid choice!\n"); - help_print(); - ret = -1; - break; - } - - return ret; -} diff --git a/demo/clientapp/testcase6/testcase.h b/demo/clientapp/testcase6/testcase.h deleted file mode 100644 index 7ced8e2..0000000 --- a/demo/clientapp/testcase6/testcase.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo CA application header file - */ - -#ifndef __MULTI_CORE_CA_H -#define __MULTI_CORE_CA_H - -// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" - -#define VALUE_A 55 -#define VALUE_B 33 -#define REE_TEMP_BUF "hello tee" -#define TEE_TEMP_BUF "hello ree" -#define TEMP_BUF_SIZE 20 -#define THREAD_COUNT 3 - -#define TEST_TIME 10 * 6 -#define EXPIRE_TIME 10 * 6 * 5 - -#define RSA_KEY_SIZE 256 // 2048bits -#define RSA_MASSAGE_SIZE 100 -#define RSA_INPUT_ERROR_PARAMETER 0x10000001 -#define RSA_KEY_1 1 -#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign - -#define PARAMS_INDEX_2 2 // params参数的下标索引 2 -#define PARAMS_INDEX_3 3 // params参数的下标索引 3 -#define PRINTF_SIZE 32 - -enum { - CMD_NULL = 0, - CMD_SHARE_MEM_FULL, - CMD_SHARE_MEM_PATR, - CMD_MUL_THREAD, - CMD_SIGN_PSS_MGF1_SHA256, -}; - -#endif diff --git a/demo/clientapp/testcase7/CMakeLists.txt b/demo/clientapp/testcase7/CMakeLists.txt deleted file mode 100644 index 80b4384..0000000 --- a/demo/clientapp/testcase7/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.5.1) - -project(testcase C CXX) - -# set(CMAKE_C_FLAGS "${CMAKE_}") -# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) - -# include_directories("${CMAKE_CURRENT_BINARY_DIR}") - -add_executable(testcase testcase.c) -target_link_libraries( - testcase - pthread - libteecc.so - libdbusc_jwt.so -) diff --git a/demo/clientapp/testcase7/build/cmake.sh b/demo/clientapp/testcase7/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/demo/clientapp/testcase7/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/demo/clientapp/testcase7/build/test.sh b/demo/clientapp/testcase7/build/test.sh deleted file mode 100644 index c73734d..0000000 --- a/demo/clientapp/testcase7/build/test.sh +++ /dev/null @@ -1,11 +0,0 @@ -CUR_DIR=$( dirname -- "$0"; ) - -${CUR_DIR}/testcase 1 -${CUR_DIR}/testcase 2 -${CUR_DIR}/testcase 3 -${CUR_DIR}/testcase 4 -# ${CUR_DIR}/testcase 5 -${CUR_DIR}/testcase 6 -${CUR_DIR}/testcase 7 -${CUR_DIR}/testcase 8 -${CUR_DIR}/testcase 9 diff --git a/demo/clientapp/testcase7/testcase.c b/demo/clientapp/testcase7/testcase.c deleted file mode 100644 index 0078f58..0000000 --- a/demo/clientapp/testcase7/testcase.c +++ /dev/null @@ -1,940 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo - */ - -#include "testcase.h" -#include -#include -#include -#include -#include -#include -// #include -// #include -// #include -// #include -#include -#include -#include -#include - -// #include "tee_client_api.h" -#include "teecc/teec_client_api.h" -#include "dbusc_jwt.h" - -#define TESTCASE 7 - -#if TESTCASE == 2 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} -}; -#elif TESTCASE == 3 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} -}; -#elif TESTCASE == 4 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} -}; -#elif TESTCASE == 5 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} -}; -#elif TESTCASE == 6 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} -}; -#elif TESTCASE == 7 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} -}; -#elif TESTCASE == 8 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} -}; -#elif TESTCASE == 9 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} -}; -#else -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} -}; -#endif - -static void DumpBuff(const char *buffer, size_t bufLen) -{ - size_t i; - if (buffer == NULL || bufLen == 0) { - return; - } - - printf("\n--------------------------------------------------\n"); - printf("bufLen = %d\n", bufLen); - for (i = 0; i < bufLen; i++) { - if (i % PRINTF_SIZE == 0) { - printf("\n"); - } - printf("%02x ", *(buffer + i)); - } - printf("\n--------------------------------------------------\n"); - return; -} - -static TEEC_Result testcase_1() -{ - TEEC_Context context; - // uint64_t context_addr; - TEEC_Session session; - TEEC_Operation operation; - uint32_t origin; - TEEC_Result ret; - - //Interface_Function-001 - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - //Interface_Function-002 - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- no param - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- value param - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_A); - assert(operation.params[0].value.b == VALUE_B); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_B); - assert(operation.params[0].value.b == VALUE_A); - - // Interface_Function-003 -- temp buf param - char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - memset(tmpbuf, 0, TEMP_BUF_SIZE); - memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - //Interface_Function-004 - TEEC_CloseSession(&session); - //Interface_Function-005 - TEEC_FinalizeContext(&context); - if (!ret) { - printf("interface_testcase pass\n"); - } - return ret; -} - -static void share_mem_test( - TEEC_Session *session, - TEEC_SharedMemory *sharebuf -) -{ - TEEC_Result ret; - TEEC_Operation operation; - uint32_t origin; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); -} - -static TEEC_Result testcase_2() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - char tmpbuf[TEMP_BUF_SIZE]; - uint32_t origin; - TEEC_Result ret; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Function-006 - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-011 - share_mem_test(&session, &sharebuf); - - // Interface_Function-008 - TEEC_ReleaseSharedMemory(&sharebuf); - - // Interface_Function-007 - memset(&sharebuf, 0, sizeof(sharebuf)); - sharebuf.buffer = tmpbuf; - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_RegisterSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-012 - share_mem_test(&session, &sharebuf); - - TEEC_ReleaseSharedMemory(&sharebuf); - -// exit: - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("sharemem_interface_testcase pass\n"); - } - return ret; -} - - -static void *thread_function(void *param) -{ - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - TEEC_Context *context = (TEEC_Context *)param; - pthread_t tid; - uint32_t origin; - struct timeval start, end, tokenset; - - tid = (pthread_t)pthread_self(); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("thread %u open session failed, ret=%x\n", tid, ret); - goto exit; - } - - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(context, &sharebuf); - if (ret) { - printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); - goto exit; - } - - printf("begin multi-thread test, during %u\n", TEST_TIME); - gettimeofday(&start, NULL); - gettimeofday(&tokenset, NULL); - while (1) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); - memset(sharebuf.buffer, 0, sharebuf.size); - memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - operation.params[0].memref.parent = &sharebuf; - operation.params[1].value.a = 1; - - ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); - if (ret) { - printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); - break; - } - - if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { - printf("thread %u get wrong comptue result.\n", tid); - break; - } - gettimeofday(&end, NULL); - if (end.tv_sec - start.tv_sec > TEST_TIME) - break; - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - - sleep(1); - } - - TEEC_CloseSession(&session); -exit: - return (void *)ret; -} - -static TEEC_Result testcase_3() -{ - TEEC_Result ret; - TEEC_Operation operation; - TEEC_Context context; - pthread_t tid[THREAD_COUNT]; - void *thread_ret = NULL; - uint32_t i; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_create(&tid[i], NULL, thread_function, (void *)&context); - } - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_join(tid[i], &thread_ret); - if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { - printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); - ret = TEEC_FAIL; - } - } - -exit: - TEEC_FinalizeContext(&context); - if (!ret) { - printf("multi_thread_testcase pass\n"); - } - return ret; -} - - -// Exception Test -static TEEC_Result testcase_4() -{ -#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharemem; - uint32_t origin; - - // Interface_Exception_001ll - ret = TEEC_InitializeContext(NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - - // Interface_Exception_002 - ret = TEEC_OpenSession(NULL, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - context.ta_path = (uint8_t *)"/data/not_found.sec"; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); - // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); - printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); - assert(ret); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Exception_003 - ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - session.session_id++; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_ACCESS_DENIED); - assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); - - session.session_id--; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = &sharemem; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(ret); - - ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); - assert(!ret); - - // Interface_Exception_004 - TEEC_CloseSession(NULL); - - // Interface_Exception_005 - TEEC_FinalizeContext(NULL); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("exception_testcase pass\n"); - } - return ret; -} - -static TEEC_Result testcase_5() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // CA_KILL_Test_001 - printf("CA Killed Test begin!, process exit!\n"); - exit(0); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_6() -{ - TEEC_Context context; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - gettimeofday(&start, NULL); - ret = TEEC_InitializeContext(NULL, &context); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_FinalizeContext(&context); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); - } - return ret; -} - -static TEEC_Result testcase_7() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - gettimeofday(&start, NULL); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_CloseSession(&session); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); - } - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_8(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - gettimeofday(&start, NULL); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); - } - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, - TEEC_Session *session) -{ - TEEC_Operation operation; - TEEC_Result result; - uint32_t origin; - - if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { - TEEC_Error("invoke RsaSignCmd has wrong params."); - return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; - } - - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES( - TEEC_VALUE_INPUT, - TEEC_NONE, - TEEC_MEMREF_TEMP_INPUT, - TEEC_MEMREF_TEMP_OUTPUT); - - operation.params[0].value.a = RSA_KEY_1; - operation.params[0].value.b = RSA_ALG_PSS_SHA256; - operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; - operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; - operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; - operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; - - result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); - if (result != TEEC_SUCCESS) { - TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); - } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { - TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", - operation.params[PARAMS_INDEX_3].tmpref.size); - } else { - printf("signBuf is : \n"); - DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); - *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; - } - - return result; -} - -static TEEC_Result testcase_9(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - char msgBuf[RSA_KEY_SIZE] = {0}; - char signature[RSA_KEY_SIZE] = {0}; - uint32_t bufLen = RSA_KEY_SIZE; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); - printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -void help_print(void) -{ - printf("Usage: \n \ - 1.function_interface_testcase\n \ - 2.sharemem_interface_testcase\n \ - 3.multi_thread_testcase\n \ - 4.exception_testcase\n \ - 5.client_killed_testcase\n \ - 6.TEEC_InitializeContext perform-test\n \ - 7.TEEC_OpenSession perform-test\n \ - 8.TEEC_InvokeCommand perform-test\n \ - 9.RSA Sign test\n"); -} - -int main(int argc, char **argv) -{ - TEEC_Result ret; - struct timeval start, end; - gettimeofday(&start, NULL); - int choice = -1; - - if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { - help_print(); - return 1; - } - -#if 0 - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - return 0; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - return 0; - } - printf("Token set succed. \n"); -#endif -#if 1 - ret = - TEEC_UnsetJwt( - ); - if (ret != TEEC_SUCCESS) - { - printf("Token unset failed. \n"); - return 0; - } - printf("Token unset succed. \n"); -#endif - - char infile_path[1024]; - char * subdir = "testcase"; - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", TESTCASE); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", TESTCASE); - } - - /* - for (int ita = 1; ita < 10; ita ++) - { - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", ita); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", ita); - } - } - */ - - choice = atoi(argv[1]); - - switch (choice) { - case 1: - ret = testcase_1(); - break; - case 2: - ret = testcase_2(); - break; - case 3: - ret = testcase_3(); - break; - case 4: - ret = testcase_4(); - break; - case 5: - ret = testcase_5(); - break; - case 6: - ret = testcase_6(); - break; - case 7: - ret = testcase_7(); - break; - case 8: - ret = testcase_8(); - break; - case 9: - ret = testcase_9(); - break; - default: - printf("Error: invalid choice!\n"); - help_print(); - ret = -1; - break; - } - - return ret; -} diff --git a/demo/clientapp/testcase7/testcase.h b/demo/clientapp/testcase7/testcase.h deleted file mode 100644 index 7ced8e2..0000000 --- a/demo/clientapp/testcase7/testcase.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo CA application header file - */ - -#ifndef __MULTI_CORE_CA_H -#define __MULTI_CORE_CA_H - -// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" - -#define VALUE_A 55 -#define VALUE_B 33 -#define REE_TEMP_BUF "hello tee" -#define TEE_TEMP_BUF "hello ree" -#define TEMP_BUF_SIZE 20 -#define THREAD_COUNT 3 - -#define TEST_TIME 10 * 6 -#define EXPIRE_TIME 10 * 6 * 5 - -#define RSA_KEY_SIZE 256 // 2048bits -#define RSA_MASSAGE_SIZE 100 -#define RSA_INPUT_ERROR_PARAMETER 0x10000001 -#define RSA_KEY_1 1 -#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign - -#define PARAMS_INDEX_2 2 // params参数的下标索引 2 -#define PARAMS_INDEX_3 3 // params参数的下标索引 3 -#define PRINTF_SIZE 32 - -enum { - CMD_NULL = 0, - CMD_SHARE_MEM_FULL, - CMD_SHARE_MEM_PATR, - CMD_MUL_THREAD, - CMD_SIGN_PSS_MGF1_SHA256, -}; - -#endif diff --git a/demo/clientapp/testcase8/CMakeLists.txt b/demo/clientapp/testcase8/CMakeLists.txt deleted file mode 100644 index 80b4384..0000000 --- a/demo/clientapp/testcase8/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.5.1) - -project(testcase C CXX) - -# set(CMAKE_C_FLAGS "${CMAKE_}") -# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) - -# include_directories("${CMAKE_CURRENT_BINARY_DIR}") - -add_executable(testcase testcase.c) -target_link_libraries( - testcase - pthread - libteecc.so - libdbusc_jwt.so -) diff --git a/demo/clientapp/testcase8/build/cmake.sh b/demo/clientapp/testcase8/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/demo/clientapp/testcase8/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/demo/clientapp/testcase8/build/test.sh b/demo/clientapp/testcase8/build/test.sh deleted file mode 100644 index c73734d..0000000 --- a/demo/clientapp/testcase8/build/test.sh +++ /dev/null @@ -1,11 +0,0 @@ -CUR_DIR=$( dirname -- "$0"; ) - -${CUR_DIR}/testcase 1 -${CUR_DIR}/testcase 2 -${CUR_DIR}/testcase 3 -${CUR_DIR}/testcase 4 -# ${CUR_DIR}/testcase 5 -${CUR_DIR}/testcase 6 -${CUR_DIR}/testcase 7 -${CUR_DIR}/testcase 8 -${CUR_DIR}/testcase 9 diff --git a/demo/clientapp/testcase8/testcase.c b/demo/clientapp/testcase8/testcase.c deleted file mode 100644 index 6ac5d90..0000000 --- a/demo/clientapp/testcase8/testcase.c +++ /dev/null @@ -1,940 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo - */ - -#include "testcase.h" -#include -#include -#include -#include -#include -#include -// #include -// #include -// #include -// #include -#include -#include -#include -#include - -// #include "tee_client_api.h" -#include "teecc/teec_client_api.h" -#include "dbusc_jwt.h" - -#define TESTCASE 8 - -#if TESTCASE == 2 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} -}; -#elif TESTCASE == 3 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} -}; -#elif TESTCASE == 4 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} -}; -#elif TESTCASE == 5 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} -}; -#elif TESTCASE == 6 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} -}; -#elif TESTCASE == 7 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} -}; -#elif TESTCASE == 8 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} -}; -#elif TESTCASE == 9 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} -}; -#else -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} -}; -#endif - -static void DumpBuff(const char *buffer, size_t bufLen) -{ - size_t i; - if (buffer == NULL || bufLen == 0) { - return; - } - - printf("\n--------------------------------------------------\n"); - printf("bufLen = %d\n", bufLen); - for (i = 0; i < bufLen; i++) { - if (i % PRINTF_SIZE == 0) { - printf("\n"); - } - printf("%02x ", *(buffer + i)); - } - printf("\n--------------------------------------------------\n"); - return; -} - -static TEEC_Result testcase_1() -{ - TEEC_Context context; - // uint64_t context_addr; - TEEC_Session session; - TEEC_Operation operation; - uint32_t origin; - TEEC_Result ret; - - //Interface_Function-001 - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - //Interface_Function-002 - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- no param - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- value param - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_A); - assert(operation.params[0].value.b == VALUE_B); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_B); - assert(operation.params[0].value.b == VALUE_A); - - // Interface_Function-003 -- temp buf param - char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - memset(tmpbuf, 0, TEMP_BUF_SIZE); - memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - //Interface_Function-004 - TEEC_CloseSession(&session); - //Interface_Function-005 - TEEC_FinalizeContext(&context); - if (!ret) { - printf("interface_testcase pass\n"); - } - return ret; -} - -static void share_mem_test( - TEEC_Session *session, - TEEC_SharedMemory *sharebuf -) -{ - TEEC_Result ret; - TEEC_Operation operation; - uint32_t origin; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); -} - -static TEEC_Result testcase_2() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - char tmpbuf[TEMP_BUF_SIZE]; - uint32_t origin; - TEEC_Result ret; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Function-006 - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-011 - share_mem_test(&session, &sharebuf); - - // Interface_Function-008 - TEEC_ReleaseSharedMemory(&sharebuf); - - // Interface_Function-007 - memset(&sharebuf, 0, sizeof(sharebuf)); - sharebuf.buffer = tmpbuf; - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_RegisterSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-012 - share_mem_test(&session, &sharebuf); - - TEEC_ReleaseSharedMemory(&sharebuf); - -// exit: - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("sharemem_interface_testcase pass\n"); - } - return ret; -} - - -static void *thread_function(void *param) -{ - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - TEEC_Context *context = (TEEC_Context *)param; - pthread_t tid; - uint32_t origin; - struct timeval start, end, tokenset; - - tid = (pthread_t)pthread_self(); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("thread %u open session failed, ret=%x\n", tid, ret); - goto exit; - } - - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(context, &sharebuf); - if (ret) { - printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); - goto exit; - } - - printf("begin multi-thread test, during %u\n", TEST_TIME); - gettimeofday(&start, NULL); - gettimeofday(&tokenset, NULL); - while (1) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); - memset(sharebuf.buffer, 0, sharebuf.size); - memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - operation.params[0].memref.parent = &sharebuf; - operation.params[1].value.a = 1; - - ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); - if (ret) { - printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); - break; - } - - if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { - printf("thread %u get wrong comptue result.\n", tid); - break; - } - gettimeofday(&end, NULL); - if (end.tv_sec - start.tv_sec > TEST_TIME) - break; - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - - sleep(1); - } - - TEEC_CloseSession(&session); -exit: - return (void *)ret; -} - -static TEEC_Result testcase_3() -{ - TEEC_Result ret; - TEEC_Operation operation; - TEEC_Context context; - pthread_t tid[THREAD_COUNT]; - void *thread_ret = NULL; - uint32_t i; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_create(&tid[i], NULL, thread_function, (void *)&context); - } - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_join(tid[i], &thread_ret); - if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { - printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); - ret = TEEC_FAIL; - } - } - -exit: - TEEC_FinalizeContext(&context); - if (!ret) { - printf("multi_thread_testcase pass\n"); - } - return ret; -} - - -// Exception Test -static TEEC_Result testcase_4() -{ -#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharemem; - uint32_t origin; - - // Interface_Exception_001ll - ret = TEEC_InitializeContext(NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - - // Interface_Exception_002 - ret = TEEC_OpenSession(NULL, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - context.ta_path = (uint8_t *)"/data/not_found.sec"; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); - // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); - printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); - assert(ret); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Exception_003 - ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - session.session_id++; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_ACCESS_DENIED); - assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); - - session.session_id--; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = &sharemem; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(ret); - - ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); - assert(!ret); - - // Interface_Exception_004 - TEEC_CloseSession(NULL); - - // Interface_Exception_005 - TEEC_FinalizeContext(NULL); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("exception_testcase pass\n"); - } - return ret; -} - -static TEEC_Result testcase_5() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // CA_KILL_Test_001 - printf("CA Killed Test begin!, process exit!\n"); - exit(0); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_6() -{ - TEEC_Context context; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - gettimeofday(&start, NULL); - ret = TEEC_InitializeContext(NULL, &context); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_FinalizeContext(&context); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); - } - return ret; -} - -static TEEC_Result testcase_7() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - gettimeofday(&start, NULL); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_CloseSession(&session); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); - } - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_8(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - gettimeofday(&start, NULL); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); - } - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, - TEEC_Session *session) -{ - TEEC_Operation operation; - TEEC_Result result; - uint32_t origin; - - if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { - TEEC_Error("invoke RsaSignCmd has wrong params."); - return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; - } - - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES( - TEEC_VALUE_INPUT, - TEEC_NONE, - TEEC_MEMREF_TEMP_INPUT, - TEEC_MEMREF_TEMP_OUTPUT); - - operation.params[0].value.a = RSA_KEY_1; - operation.params[0].value.b = RSA_ALG_PSS_SHA256; - operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; - operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; - operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; - operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; - - result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); - if (result != TEEC_SUCCESS) { - TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); - } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { - TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", - operation.params[PARAMS_INDEX_3].tmpref.size); - } else { - printf("signBuf is : \n"); - DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); - *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; - } - - return result; -} - -static TEEC_Result testcase_9(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - char msgBuf[RSA_KEY_SIZE] = {0}; - char signature[RSA_KEY_SIZE] = {0}; - uint32_t bufLen = RSA_KEY_SIZE; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); - printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -void help_print(void) -{ - printf("Usage: \n \ - 1.function_interface_testcase\n \ - 2.sharemem_interface_testcase\n \ - 3.multi_thread_testcase\n \ - 4.exception_testcase\n \ - 5.client_killed_testcase\n \ - 6.TEEC_InitializeContext perform-test\n \ - 7.TEEC_OpenSession perform-test\n \ - 8.TEEC_InvokeCommand perform-test\n \ - 9.RSA Sign test\n"); -} - -int main(int argc, char **argv) -{ - TEEC_Result ret; - struct timeval start, end; - gettimeofday(&start, NULL); - int choice = -1; - - if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { - help_print(); - return 1; - } - -#if 0 - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - return 0; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - return 0; - } - printf("Token set succed. \n"); -#endif -#if 1 - ret = - TEEC_UnsetJwt( - ); - if (ret != TEEC_SUCCESS) - { - printf("Token unset failed. \n"); - return 0; - } - printf("Token unset succed. \n"); -#endif - - char infile_path[1024]; - char * subdir = "testcase"; - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", TESTCASE); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", TESTCASE); - } - - /* - for (int ita = 1; ita < 10; ita ++) - { - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", ita); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", ita); - } - } - */ - - choice = atoi(argv[1]); - - switch (choice) { - case 1: - ret = testcase_1(); - break; - case 2: - ret = testcase_2(); - break; - case 3: - ret = testcase_3(); - break; - case 4: - ret = testcase_4(); - break; - case 5: - ret = testcase_5(); - break; - case 6: - ret = testcase_6(); - break; - case 7: - ret = testcase_7(); - break; - case 8: - ret = testcase_8(); - break; - case 9: - ret = testcase_9(); - break; - default: - printf("Error: invalid choice!\n"); - help_print(); - ret = -1; - break; - } - - return ret; -} diff --git a/demo/clientapp/testcase8/testcase.h b/demo/clientapp/testcase8/testcase.h deleted file mode 100644 index 7ced8e2..0000000 --- a/demo/clientapp/testcase8/testcase.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo CA application header file - */ - -#ifndef __MULTI_CORE_CA_H -#define __MULTI_CORE_CA_H - -// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" - -#define VALUE_A 55 -#define VALUE_B 33 -#define REE_TEMP_BUF "hello tee" -#define TEE_TEMP_BUF "hello ree" -#define TEMP_BUF_SIZE 20 -#define THREAD_COUNT 3 - -#define TEST_TIME 10 * 6 -#define EXPIRE_TIME 10 * 6 * 5 - -#define RSA_KEY_SIZE 256 // 2048bits -#define RSA_MASSAGE_SIZE 100 -#define RSA_INPUT_ERROR_PARAMETER 0x10000001 -#define RSA_KEY_1 1 -#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign - -#define PARAMS_INDEX_2 2 // params参数的下标索引 2 -#define PARAMS_INDEX_3 3 // params参数的下标索引 3 -#define PRINTF_SIZE 32 - -enum { - CMD_NULL = 0, - CMD_SHARE_MEM_FULL, - CMD_SHARE_MEM_PATR, - CMD_MUL_THREAD, - CMD_SIGN_PSS_MGF1_SHA256, -}; - -#endif diff --git a/demo/clientapp/testcase9/CMakeLists.txt b/demo/clientapp/testcase9/CMakeLists.txt deleted file mode 100644 index 80b4384..0000000 --- a/demo/clientapp/testcase9/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.5.1) - -project(testcase C CXX) - -# set(CMAKE_C_FLAGS "${CMAKE_}") -# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) - -# include_directories("${CMAKE_CURRENT_BINARY_DIR}") - -add_executable(testcase testcase.c) -target_link_libraries( - testcase - pthread - libteecc.so - libdbusc_jwt.so -) diff --git a/demo/clientapp/testcase9/build/cmake.sh b/demo/clientapp/testcase9/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/demo/clientapp/testcase9/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/demo/clientapp/testcase9/build/test.sh b/demo/clientapp/testcase9/build/test.sh deleted file mode 100644 index c73734d..0000000 --- a/demo/clientapp/testcase9/build/test.sh +++ /dev/null @@ -1,11 +0,0 @@ -CUR_DIR=$( dirname -- "$0"; ) - -${CUR_DIR}/testcase 1 -${CUR_DIR}/testcase 2 -${CUR_DIR}/testcase 3 -${CUR_DIR}/testcase 4 -# ${CUR_DIR}/testcase 5 -${CUR_DIR}/testcase 6 -${CUR_DIR}/testcase 7 -${CUR_DIR}/testcase 8 -${CUR_DIR}/testcase 9 diff --git a/demo/clientapp/testcase9/testcase.c b/demo/clientapp/testcase9/testcase.c deleted file mode 100644 index 1181690..0000000 --- a/demo/clientapp/testcase9/testcase.c +++ /dev/null @@ -1,940 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo - */ - -#include "testcase.h" -#include -#include -#include -#include -#include -#include -// #include -// #include -// #include -// #include -#include -#include -#include -#include - -// #include "tee_client_api.h" -#include "teecc/teec_client_api.h" -#include "dbusc_jwt.h" - -#define TESTCASE 9 - -#if TESTCASE == 2 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530002.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x02} -}; -#elif TESTCASE == 3 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530003.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x03} -}; -#elif TESTCASE == 4 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530004.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x04} -}; -#elif TESTCASE == 5 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530005.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x05} -}; -#elif TESTCASE == 6 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530006.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x06} -}; -#elif TESTCASE == 7 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530007.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x07} -}; -#elif TESTCASE == 8 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530008.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x08} -}; -#elif TESTCASE == 9 -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530009.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x09} -}; -#else -#define TEST_CASE_TA_PATH "/data/testcase/b8ff9049-9cbb-46b0-bcae-7aaa02530001.sec" -static const TEEC_UUID TEST_CASE_UUID = { - 0xb8ff9049, 0x9cbb, 0x46b0, - {0xbc, 0xae, 0x7a, 0xaa, 0x02, 0x53, 0x00, 0x01} -}; -#endif - -static void DumpBuff(const char *buffer, size_t bufLen) -{ - size_t i; - if (buffer == NULL || bufLen == 0) { - return; - } - - printf("\n--------------------------------------------------\n"); - printf("bufLen = %d\n", bufLen); - for (i = 0; i < bufLen; i++) { - if (i % PRINTF_SIZE == 0) { - printf("\n"); - } - printf("%02x ", *(buffer + i)); - } - printf("\n--------------------------------------------------\n"); - return; -} - -static TEEC_Result testcase_1() -{ - TEEC_Context context; - // uint64_t context_addr; - TEEC_Session session; - TEEC_Operation operation; - uint32_t origin; - TEEC_Result ret; - - //Interface_Function-001 - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - //Interface_Function-002 - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- no param - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - //Interface_Function-003 -- value param - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_A); - assert(operation.params[0].value.b == VALUE_B); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].value.a = 55; - operation.params[0].value.b = 33; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(operation.params[0].value.a == VALUE_B); - assert(operation.params[0].value.b == VALUE_A); - - // Interface_Function-003 -- temp buf param - char tmpbuf[TEMP_BUF_SIZE] = REE_TEMP_BUF; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].tmpref.buffer = tmpbuf; - operation.params[0].tmpref.size = TEMP_BUF_SIZE; - memset(tmpbuf, 0, TEMP_BUF_SIZE); - memcpy(tmpbuf, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(!ret); - assert(!strcmp(tmpbuf, TEE_TEMP_BUF)); - - //Interface_Function-004 - TEEC_CloseSession(&session); - //Interface_Function-005 - TEEC_FinalizeContext(&context); - if (!ret) { - printf("interface_testcase pass\n"); - } - return ret; -} - -static void share_mem_test( - TEEC_Session *session, - TEEC_SharedMemory *sharebuf -) -{ - TEEC_Result ret; - TEEC_Operation operation; - uint32_t origin; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_FULL, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); - - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = sharebuf; - operation.params[0].memref.offset = 1; - operation.params[0].memref.size = TEMP_BUF_SIZE - 1; - memset(sharebuf->buffer, 0, sharebuf->size); - memcpy(sharebuf->buffer + 1, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - ret = TEEC_InvokeCommand(session, CMD_SHARE_MEM_PATR, &operation, &origin); - assert(!ret); - assert(!strcmp(sharebuf->buffer + 1, TEE_TEMP_BUF)); -} - -static TEEC_Result testcase_2() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - char tmpbuf[TEMP_BUF_SIZE]; - uint32_t origin; - TEEC_Result ret; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Function-006 - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-011 - share_mem_test(&session, &sharebuf); - - // Interface_Function-008 - TEEC_ReleaseSharedMemory(&sharebuf); - - // Interface_Function-007 - memset(&sharebuf, 0, sizeof(sharebuf)); - sharebuf.buffer = tmpbuf; - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_RegisterSharedMemory(&context, &sharebuf); - assert(!ret); - - // Interface_Function-012 - share_mem_test(&session, &sharebuf); - - TEEC_ReleaseSharedMemory(&sharebuf); - -// exit: - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("sharemem_interface_testcase pass\n"); - } - return ret; -} - - -static void *thread_function(void *param) -{ - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharebuf; - TEEC_Context *context = (TEEC_Context *)param; - pthread_t tid; - uint32_t origin; - struct timeval start, end, tokenset; - - tid = (pthread_t)pthread_self(); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - ret = TEEC_OpenSession(context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("thread %u open session failed, ret=%x\n", tid, ret); - goto exit; - } - - sharebuf.size = TEMP_BUF_SIZE; - sharebuf.flags = TEEC_MEM_INOUT; - ret = TEEC_AllocateSharedMemory(context, &sharebuf); - if (ret) { - printf("thread %u share buffer alloc failed, ret=%x\n", tid, ret); - goto exit; - } - - printf("begin multi-thread test, during %u\n", TEST_TIME); - gettimeofday(&start, NULL); - gettimeofday(&tokenset, NULL); - while (1) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); - memset(sharebuf.buffer, 0, sharebuf.size); - memcpy(sharebuf.buffer, REE_TEMP_BUF, strlen(REE_TEMP_BUF)); - operation.params[0].memref.parent = &sharebuf; - operation.params[1].value.a = 1; - - ret = TEEC_InvokeCommand(&session, CMD_MUL_THREAD, &operation, &origin); - if (ret) { - printf("thread %u invoke failed, ret=%x, origin=%u\n", tid, ret, origin); - break; - } - - if (strcmp(sharebuf.buffer, TEE_TEMP_BUF) || operation.params[1].value.a || operation.params[1].value.b != 1) { - printf("thread %u get wrong comptue result.\n", tid); - break; - } - gettimeofday(&end, NULL); - if (end.tv_sec - start.tv_sec > TEST_TIME) - break; - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - - sleep(1); - } - - TEEC_CloseSession(&session); -exit: - return (void *)ret; -} - -static TEEC_Result testcase_3() -{ - TEEC_Result ret; - TEEC_Operation operation; - TEEC_Context context; - pthread_t tid[THREAD_COUNT]; - void *thread_ret = NULL; - uint32_t i; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_create(&tid[i], NULL, thread_function, (void *)&context); - } - - for (i = 0; i < THREAD_COUNT; i++) { - pthread_join(tid[i], &thread_ret); - if ((TEEC_Result)thread_ret != TEEC_SUCCESS) { - printf("thread %u return fail, ret=%x\n", tid[i], (TEEC_Result)thread_ret); - ret = TEEC_FAIL; - } - } - -exit: - TEEC_FinalizeContext(&context); - if (!ret) { - printf("multi_thread_testcase pass\n"); - } - return ret; -} - - -// Exception Test -static TEEC_Result testcase_4() -{ -#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 - TEEC_Result ret = TEEC_SUCCESS; - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_SharedMemory sharemem; - uint32_t origin; - - // Interface_Exception_001ll - ret = TEEC_InitializeContext(NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - - // Interface_Exception_002 - ret = TEEC_OpenSession(NULL, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - NULL, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - ret = TEEC_OpenSession(&context, - &session, NULL, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - context.ta_path = (uint8_t *)"/data/not_found.sec"; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_TRUSTED_APP_LOAD_ERROR); - // assert(ret == TEEC_ERROR_NOT_IMPLEMENTED); - printf("OpenSession tapath not_found.sec case, ret = 0x %16.16lx. \n", ret); - assert(ret); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // Interface_Exception_003 - ret = TEEC_InvokeCommand(NULL, CMD_NULL, &operation, &origin); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - session.session_id++; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - // assert(ret == TEEC_ERROR_ACCESS_DENIED); - assert(ret == TEEC_ERROR_NO_WORKER_MATCHED); - - session.session_id--; - operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); - operation.params[0].memref.parent = &sharemem; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - assert(ret); - - ret = TEEC_InvokeCommand(&session, CMD_NULL, NULL, NULL); - assert(ret == TEEC_ERROR_BAD_PARAMETERS); - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, NULL); - assert(!ret); - - // Interface_Exception_004 - TEEC_CloseSession(NULL); - - // Interface_Exception_005 - TEEC_FinalizeContext(NULL); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - - if (!ret) { - printf("exception_testcase pass\n"); - } - return ret; -} - -static TEEC_Result testcase_5() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - assert(!ret); - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - assert(!ret); - - // CA_KILL_Test_001 - printf("CA Killed Test begin!, process exit!\n"); - exit(0); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_6() -{ - TEEC_Context context; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - gettimeofday(&start, NULL); - ret = TEEC_InitializeContext(NULL, &context); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_FinalizeContext(&context); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InitializeContext cost: %f us\n", cost * 1.0 / count); - } - return ret; -} - -static TEEC_Result testcase_7() -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - gettimeofday(&start, NULL); - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - TEEC_CloseSession(&session); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_OpenSession cost: %f us\n", cost * 1.0 / count); - } - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result testcase_8(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - struct timeval start, end, tokenset; - uint32_t cost = 0; - uint32_t i; - TEEC_Result ret; - uint32_t count = 1000; - uint32_t origin; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - gettimeofday(&tokenset, NULL); - for (i = 0; i < count; i++) { - operation.started = 1; - memset(&operation.paramTypes, 0, sizeof(operation.paramTypes)); - gettimeofday(&start, NULL); - ret = TEEC_InvokeCommand(&session, CMD_NULL, &operation, &origin); - gettimeofday(&end, NULL); - if (ret) { - break; - } - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - if (end.tv_sec - tokenset.tv_sec > EXPIRE_TIME) - { - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - break; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - break; - } - printf("Token set succed. \n"); - gettimeofday(&tokenset, NULL); - } - } - - if (!ret) { - printf("TEEC_InvokeCommand cost: %f us\n", cost * 1.0 / count); - } - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -static TEEC_Result RsaSignCmd(char* msgBuf, uint32_t msgLen, char* signBuf, uint32_t *bufLen, - TEEC_Session *session) -{ - TEEC_Operation operation; - TEEC_Result result; - uint32_t origin; - - if (msgBuf == NULL || signBuf == NULL || (bufLen == NULL)) { - TEEC_Error("invoke RsaSignCmd has wrong params."); - return (TEEC_Result)RSA_INPUT_ERROR_PARAMETER; - } - - operation.started = 1; - operation.paramTypes = TEEC_PARAM_TYPES( - TEEC_VALUE_INPUT, - TEEC_NONE, - TEEC_MEMREF_TEMP_INPUT, - TEEC_MEMREF_TEMP_OUTPUT); - - operation.params[0].value.a = RSA_KEY_1; - operation.params[0].value.b = RSA_ALG_PSS_SHA256; - operation.params[PARAMS_INDEX_2].tmpref.buffer = msgBuf; - operation.params[PARAMS_INDEX_2].tmpref.size = msgLen; - operation.params[PARAMS_INDEX_3].tmpref.buffer = signBuf; - operation.params[PARAMS_INDEX_3].tmpref.size = *bufLen; - - result = TEEC_InvokeCommand(session, CMD_SIGN_PSS_MGF1_SHA256, &operation, &origin); - if (result != TEEC_SUCCESS) { - TEEC_Error("invoke RsaSignCmd failed, codes=0x%x, origin=0x%x.", result, origin); - } else if (operation.params[PARAMS_INDEX_3].tmpref.size != RSA_KEY_SIZE) { - TEEC_Error("invoke RsaSignCmd failed, returned Encrypted data size is %d.", - operation.params[PARAMS_INDEX_3].tmpref.size); - } else { - printf("signBuf is : \n"); - DumpBuff(signBuf, operation.params[PARAMS_INDEX_3].tmpref.size); - *bufLen = operation.params[PARAMS_INDEX_3].tmpref.size; - } - - return result; -} - -static TEEC_Result testcase_9(void) -{ - TEEC_Context context; - TEEC_Session session; - TEEC_Operation operation; - TEEC_Result ret; - uint32_t origin; - char msgBuf[RSA_KEY_SIZE] = {0}; - char signature[RSA_KEY_SIZE] = {0}; - uint32_t bufLen = RSA_KEY_SIZE; - - ret = TEEC_InitializeContext(NULL, &context); - if (ret) { - printf("initail conatext failed\n"); - return ret; - } - context.ta_path = (uint8_t *)TEST_CASE_TA_PATH; - - memset(&operation, 0, sizeof(operation)); - operation.started = 1; - ret = TEEC_OpenSession(&context, - &session, &TEST_CASE_UUID, TEEC_LOGIN_IDENTIFY, NULL, &operation, &origin); - if (ret) { - printf("opensession failed!, ret=%x, origin=%u\n", ret, origin); - TEEC_FinalizeContext(&context); - return ret; - } - - ret = RsaSignCmd(msgBuf, RSA_MASSAGE_SIZE, signature, &bufLen, &session); - printf("TEE RSA Sign %s.\n", ret ? "failed" : "success"); - - TEEC_CloseSession(&session); - TEEC_FinalizeContext(&context); - return ret; -} - -void help_print(void) -{ - printf("Usage: \n \ - 1.function_interface_testcase\n \ - 2.sharemem_interface_testcase\n \ - 3.multi_thread_testcase\n \ - 4.exception_testcase\n \ - 5.client_killed_testcase\n \ - 6.TEEC_InitializeContext perform-test\n \ - 7.TEEC_OpenSession perform-test\n \ - 8.TEEC_InvokeCommand perform-test\n \ - 9.RSA Sign test\n"); -} - -int main(int argc, char **argv) -{ - TEEC_Result ret; - struct timeval start, end; - gettimeofday(&start, NULL); - int choice = -1; - - if (argc == 1 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { - help_print(); - return 1; - } - -#if 0 - char token[1024]; - int iret; - iret = - dbusmethodcall_fetch_jwt( - token - ); - if (iret != 0) - { - printf("Token fetching failed. \n"); - return 0; - } - printf("The fetched token: %s \n", token); - - ret = - TEEC_SetJwt( - token - ); - if (ret != TEEC_SUCCESS) - { - printf("Token set failed. \n"); - return 0; - } - printf("Token set succed. \n"); -#endif -#if 1 - ret = - TEEC_UnsetJwt( - ); - if (ret != TEEC_SUCCESS) - { - printf("Token unset failed. \n"); - return 0; - } - printf("Token unset succed. \n"); -#endif - - char infile_path[1024]; - char * subdir = "testcase"; - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", TESTCASE, TESTCASE); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", TESTCASE); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", TESTCASE); - } - - /* - for (int ita = 1; ita < 10; ita ++) - { - memset(infile_path, 0, sizeof(infile_path)); - sprintf(infile_path, "/home/john/projects/tzc02/09/demo/ta/itrustee_sdk/output/testcase/testcase%d/b8ff9049-9cbb-46b0-bcae-7aaa0253000%d.sec", ita, ita); - ret = TEEC_DeployTa(infile_path, subdir, NULL); - if (ret != TEEC_SUCCESS) - { - printf("Deploy ta %d failed. \n", ita); - return 0; - } - else - { - printf("Deploy ta %d succed. \n", ita); - } - } - */ - - choice = atoi(argv[1]); - - switch (choice) { - case 1: - ret = testcase_1(); - break; - case 2: - ret = testcase_2(); - break; - case 3: - ret = testcase_3(); - break; - case 4: - ret = testcase_4(); - break; - case 5: - ret = testcase_5(); - break; - case 6: - ret = testcase_6(); - break; - case 7: - ret = testcase_7(); - break; - case 8: - ret = testcase_8(); - break; - case 9: - ret = testcase_9(); - break; - default: - printf("Error: invalid choice!\n"); - help_print(); - ret = -1; - break; - } - - return ret; -} diff --git a/demo/clientapp/testcase9/testcase.h b/demo/clientapp/testcase9/testcase.h deleted file mode 100644 index 7ced8e2..0000000 --- a/demo/clientapp/testcase9/testcase.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. - * Description: multi_core_demo CA application header file - */ - -#ifndef __MULTI_CORE_CA_H -#define __MULTI_CORE_CA_H - -// #define TEST_CASE_TA_PATH "/data/ebc87fc2-05dc-41b3-85b9-f9f0ef481bad.sec" - -#define VALUE_A 55 -#define VALUE_B 33 -#define REE_TEMP_BUF "hello tee" -#define TEE_TEMP_BUF "hello ree" -#define TEMP_BUF_SIZE 20 -#define THREAD_COUNT 3 - -#define TEST_TIME 10 * 6 -#define EXPIRE_TIME 10 * 6 * 5 - -#define RSA_KEY_SIZE 256 // 2048bits -#define RSA_MASSAGE_SIZE 100 -#define RSA_INPUT_ERROR_PARAMETER 0x10000001 -#define RSA_KEY_1 1 -#define RSA_ALG_PSS_SHA256 2 // use TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 mode for sign - -#define PARAMS_INDEX_2 2 // params参数的下标索引 2 -#define PARAMS_INDEX_3 3 // params参数的下标索引 3 -#define PRINTF_SIZE 32 - -enum { - CMD_NULL = 0, - CMD_SHARE_MEM_FULL, - CMD_SHARE_MEM_PATR, - CMD_MUL_THREAD, - CMD_SIGN_PSS_MGF1_SHA256, -}; - -#endif diff --git a/demo/dbusjwt/CMakeLists.txt b/demo/dbusjwt/CMakeLists.txt deleted file mode 100644 index 0c23113..0000000 --- a/demo/dbusjwt/CMakeLists.txt +++ /dev/null @@ -1,71 +0,0 @@ -# - -cmake_minimum_required(VERSION 3.5.1) - -project(dbus_jwt C CXX) - -# set(CMAKE_C_FLAGS "${CMAKE_}") -# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) - -# include_directories("${CMAKE_CURRENT_BINARY_DIR}") -# include_directories(${CMAKE_CURRENT_BINARY_DIR}/../include/) -include_directories(/usr/include/dbus-1.0/) -include_directories(/usr/lib64/dbus-1.0/include/) - -# Introduce variables: -# - CMAKE_INSTALL_LIBDIR -# - CMAKE_INSTALL_BINDIR -# - CMAKE_INSTALL_INCLUDEDIR -include(GNUInstallDirs) - - -set(lib_dbusc_jwt - ${PROJECT_SOURCE_DIR}/dbusc_jwt.c -) -# Install Headers: -set(HEADERS_DBUSC_JWT - ${PROJECT_SOURCE_DIR}/dbusc_jwt.h -) -install( - FILES ${HEADERS_DBUSC_JWT} - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${TARGET_NAME}" -) - -add_library(dbusc_jwt SHARED ${lib_dbusc_jwt}) -target_link_libraries( - dbusc_jwt - libdbus-1.so -) - -# Install lib: -install( - TARGETS "dbusc_jwt" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" -) - - -set(dbuss_fetchjwt - ${PROJECT_SOURCE_DIR}/dbuss_fetchjwt.c -) -add_executable(dbuss_fetchjwt "${dbuss_fetchjwt}") -target_link_libraries( - dbuss_fetchjwt - libdbus-1.so - spiffejwt -) - -set(dbuss_validatejwt - ${PROJECT_SOURCE_DIR}/dbuss_validatejwt.c -) -add_executable(dbuss_validatejwt "${dbuss_validatejwt}") -target_link_libraries( - dbuss_validatejwt - libdbus-1.so - spiffejwt -) - -# Install bin: -install( - TARGETS "dbuss_fetchjwt" "dbuss_validatejwt" - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR$}" -) diff --git a/demo/dbusjwt/build/cmake.sh b/demo/dbusjwt/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/demo/dbusjwt/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/demo/dbusjwt/dbus_return_code.h b/demo/dbusjwt/dbus_return_code.h deleted file mode 100644 index e59e9b5..0000000 --- a/demo/dbusjwt/dbus_return_code.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// Created by 62754 on 2022/8/19. -// - -#ifndef _DBUS_RETURN_CODE_H -#define _DBUS_RETURN_CODE_H - -enum TEEC_ReturnCode -{ - TEEC_ERROR_JWTVALIDATE_FAIL = 0xAAAA0020, /* jwt validate fail */ - TEEC_ERROR_GRPC_ERROR = 0xAAAA0021, /* grpc transmission error */ - TEEC_ERROR_DBUS_CONN_NULL = 0xAAAA0022, /* dbus connection null */ - TEEC_ERROR_DBUS_NAME_ERROR = 0xAAAA0023, /* dbus name set is error */ - TEEC_ERROR_DBUS_MSG_NULL = 0xAAAA0024, /* dbus message is null */ - TEEC_ERROR_DBUS_APPEND_ERROR = 0xAAAA0025, /* dbus append argument error */ - TEEC_ERROR_DBUS_REPLY_ERROR = 0xAAAA0026, /* dbus send with reply error */ - TEEC_ERROR_DBUS_ARG_NULL = 0xAAAA0027, /* dbus argument is null */ - TEEC_ERROR_DBUS_ARG_TYPE_ERROR = 0xAAAA0028, /* dbus argument type error */ - TEEC_ERROR_TOKEN_NULL = 0xAAAA0029, /* fetch token is null */ - TEEC_ERROR_TOKEN_SIZE_ERROR = 0xAAAA0030, /* token size is error */ - TEEC_ERROR_FETCHJWT_ERROR = 0xAAAA0031, /* fetch jwt error */ - TEEC_INFILE_PATH_NULL = 0xAAAA0032 /* deployta infile patn is null*/ -}; - -typedef enum TEEC_ReturnCode TEEC_Result; -#endif //_DBUS_RETURN_CODE_H diff --git a/demo/dbusjwt/dbusc_jwt.c b/demo/dbusjwt/dbusc_jwt.c deleted file mode 100644 index 2445602..0000000 --- a/demo/dbusjwt/dbusc_jwt.c +++ /dev/null @@ -1,458 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "dbus_return_code.h" - - -TEEC_Result dbusmethodcall_fetch_jwt( - char *token -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - int ret; - int iType; - - unsigned char *charp; - unsigned char param[12] = "fetchtoken"; - DBusMessageIter structIter; - dbus_uint32_t retcode; - unsigned char *token_temp = NULL; - - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return TEEC_ERROR_DBUS_CONN_NULL; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - "fetchjwt", - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_NAME_ERROR; - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_NAME_ERROR; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", "fetchjwt"); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", "fetchjwt"); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", "fetchjwt"); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "fetch_jwtsvid" // method name - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null \n"); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_MSG_NULL; - } - - // append arguments - dbus_message_iter_init_append(msg, &args); - - charp = param; - if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &charp)) - { - fprintf(stderr, "Out Of Memory. \n"); - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_APPEND_ERROR; - } - - DBusMessage *reply; - reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "libdbusc_jwt: fetchjwt send_with_reply_and_block error %s \n", err.message); - dbus_error_free(&err); - - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_REPLY_ERROR; - } - if (reply == NULL) - { - fprintf(stderr, "libdbusc_jwt: fetchjwt dbus reply error \n"); - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_REPLY_ERROR; - } - - dbus_message_unref(msg); - dbus_connection_flush(conn); - msg = reply; - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments. \n"); - dbus_message_unref(msg); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_ARG_NULL; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32. \n"); - dbus_message_unref(msg); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_ARG_TYPE_ERROR; - } - dbus_message_iter_get_basic( - &structIter, - &retcode - ); - - if (retcode == 0) - { - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments! \n"); - dbus_message_unref(msg); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_ARG_NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_STRING - ) - { - fprintf(stderr, "Argument is not STRING.\n"); - dbus_message_unref(msg); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_ARG_TYPE_ERROR; - } - dbus_message_iter_get_basic( - &structIter, - &token_temp); - - if (token == NULL) - { - dbus_message_unref(msg); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_TOKEN_NULL; - } else - { - if (sizeof(token) < sizeof(token_temp)) - { - dbus_message_unref(msg); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_TOKEN_SIZE_ERROR; - } else - { - memset(token, '\0', sizeof(token)); - strcpy(token, token_temp); - } - } - - } - - // free reply - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return retcode; -} - - -TEEC_Result dbusmethodcall_validate_jwt( - char *token -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - int ret; - int iType; - - unsigned char *charp; - dbus_uint32_t retcode; - - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return TEEC_ERROR_DBUS_CONN_NULL; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - "validatejwt", - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_NAME_ERROR; - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_NAME_ERROR; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", "validatejwt"); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", "validatejwt"); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", "validatejwt"); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "validate_jwtsvid" // method name - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null \n"); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_MSG_NULL; - } - - // append arguments - dbus_message_iter_init_append(msg, &args); - - if (token == NULL) - { - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_TOKEN_NULL; - } - - charp = token; - if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &charp)) - { - fprintf(stderr, "Out Of Memory. \n"); - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_APPEND_ERROR; - } - - - DBusMessage *reply; - reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "libdbusc_jwt: validatejwt send_with_reply_and_block error, %s \n", err.message); - dbus_error_free(&err); - - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_REPLY_ERROR; - } - if (reply == NULL) - { - fprintf(stderr, "libdbusc_jwt: validatejwt dbus reply error \n"); - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_REPLY_ERROR; - } - - dbus_message_unref(msg); - dbus_connection_flush(conn); - msg = reply; - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments. \n"); - dbus_message_unref(msg); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_ARG_NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &args - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32. \n"); - dbus_message_unref(msg); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return TEEC_ERROR_DBUS_ARG_TYPE_ERROR; - } - dbus_message_iter_get_basic( - &args, - &retcode - ); - - printf("libdbusc_jwt: got reply of methodcall validate_jwtsvid \n"); - printf(" retcode = 0x %8x \n", retcode); - - // free reply - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return retcode; -} - diff --git a/demo/dbusjwt/dbusc_jwt.h b/demo/dbusjwt/dbusc_jwt.h deleted file mode 100644 index 5f2b495..0000000 --- a/demo/dbusjwt/dbusc_jwt.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _DBUSC_JWT_H -#define _DBUSC_JWT_H - -#ifdef __cplusplus -extern "C" { -#endif - -int dbusmethodcall_fetch_jwt( - char *token -); - -int dbusmethodcall_validate_jwt( - // const char * taname, - char *token -); - -/* -int dbusmethodcall_restart( - const char * taname -); - */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/demo/dbusjwt/dbuss_fetchjwt.c b/demo/dbusjwt/dbuss_fetchjwt.c deleted file mode 100644 index 7762a1f..0000000 --- a/demo/dbusjwt/dbuss_fetchjwt.c +++ /dev/null @@ -1,253 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include "spiffejwt.h" - -#include "dbus_return_code.h" - -#define NO_ERROR 0 - - -void * -reply_methodcall_fetch_jwtsvid( - DBusMessage *msg, - DBusConnection *conn -) -{ - DBusMessage *reply; - DBusMessageIter args; - dbus_bool_t bResult; - dbus_uint32_t retcode; - dbus_uint32_t serial = 0; - DBusMessageIter structIter; - char token[1024] = "noToken"; - - printf("\n"); - printf("Received mechod call fetch_jwtsvid. \n"); - - // read the arguments - if (!dbus_message_iter_init(msg, &args)) - { - fprintf(stderr, "Message has no arguments!\n"); - retcode = TEEC_ERROR_DBUS_MSG_NULL; - } else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) - { - fprintf(stderr, "Argument is not string!\n"); - retcode = TEEC_ERROR_DBUS_ARG_TYPE_ERROR; - } else - { - dbus_message_iter_get_basic(&args, &token); - - int iResult = spiffe_fetch_jwtsvid( - token - ); - if (iResult == NO_ERROR) - { - printf("Token fetching succed, token = %s \n", token); - retcode = 0; - } else - { - retcode = TEEC_ERROR_FETCHJWT_ERROR; - } - } - - // create a reply from the message - reply = dbus_message_new_method_return(msg); - - // add the arguments to the reply - dbus_message_iter_init_append(reply, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &retcode - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory! \n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - return NULL; - } - - if (retcode == 0) - { - unsigned char *charp; - charp = token; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &charp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory! \n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - return NULL; - } - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - serial = 100; - if (!dbus_connection_send(conn, reply, &serial)) - { - fprintf(stderr, "Out Of Memory! \n"); - dbus_message_unref(reply); - dbus_connection_flush(conn); - return NULL; - } - - dbus_message_unref(reply); - dbus_connection_flush(conn); - - return NULL; -} - -/** - * Server that exposes a method call and waits for it to be called - */ -void -receive_methodcall( -) -{ - DBusMessage *msg; - DBusConnection *conn; - DBusError err; - int ret; - dbus_bool_t bResult; - - - printf("Dbus server for fetching jwt is listening for method calls ... \n"); - - // initialise the error - dbus_error_init(&err); - - dbus_threads_init_default(); - - // connect to the bus and check for errors - conn = dbus_bus_get(DBUS_BUS_SESSION, &err); - // conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - exit(1); - } - - if (NULL == conn) - { - fprintf(stderr, "Connection Null. \n"); - exit(1); - } - - char dbusname[1024]; - memset((char *) dbusname, 0, 1024); - // sprintf(dbusname, "%s.method.server", argv[1]); - sprintf(dbusname, "%s.method.server", "fetchjwt"); - // request our name on the bus and check for errors - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - exit(1); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - fprintf(stderr, "Not Primary Owner (%d)\n", ret); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - exit(1); - } - - // loop, testing for new messages - memset((char *) dbusname, 0, 1024); - // sprintf(dbusname, "%s.method.Type", argv[1]); - sprintf(dbusname, "%s.method.Type", "fetchjwt"); - while (true) - { - // non blocking read of the next available message - dbus_connection_read_write(conn, 0); - msg = dbus_connection_pop_message(conn); - - // loop again if we haven't got a message - if (NULL == msg) - { - usleep(10000); - continue; - } - - // printf("Received one method call. \n"); - - // check this is a method call for the right interface & method - bResult = dbus_message_is_method_call( - msg, - dbusname, - "fetch_jwtsvid" - ); - if (bResult == TRUE) - { - reply_methodcall_fetch_jwtsvid( - msg, - conn - ); - } - - // free the message - dbus_message_unref(msg); - - } // end of the while true - -} // end of the function - - -int main(int argc, char *argv[]) -{ - int iResult; - - iResult = spiffe_start_conn(); - if (iResult != NO_ERROR) - { - fprintf(stderr, "Spiffe start conn failed. \n"); - return -1; - } - - receive_methodcall( - ); - - return 0; -} diff --git a/demo/dbusjwt/dbuss_validatejwt.c b/demo/dbusjwt/dbuss_validatejwt.c deleted file mode 100644 index 87d603a..0000000 --- a/demo/dbusjwt/dbuss_validatejwt.c +++ /dev/null @@ -1,219 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "spiffejwt.h" -#include "dbus_return_code.h" - -#define NO_ERROR 0 - - -void * -reply_methodcall_validate_jwtsvid( - DBusMessage *msg, - DBusConnection *conn -) -{ - DBusMessage *reply; - DBusMessageIter args; - char *token = NULL; - dbus_bool_t bResult; - dbus_uint32_t retcode; - dbus_uint32_t serial = 0; - - // read the arguments - if (!dbus_message_iter_init(msg, &args)) - { - fprintf(stderr, "Message has no arguments!\n"); - retcode = TEEC_ERROR_DBUS_MSG_NULL;; - } else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) - { - fprintf(stderr, "Argument is not string!\n"); - retcode = TEEC_ERROR_DBUS_ARG_TYPE_ERROR;; - } else - { - dbus_message_iter_get_basic(&args, &token); - printf("\n"); - printf("Received mechod call validate_jwtsvid: \n"); - printf(" token = %s \n", token); - struct timeval start, end; - gettimeofday(&start, NULL); - int iResult = spiffe_validate_jwtsvid( - token - ); - gettimeofday(&end, NULL); - int64_t i64Time_jwt; - i64Time_jwt = (end.tv_sec - start.tv_sec) * 1000000 + - (end.tv_usec - start.tv_usec); - printf("spiffe validate jwt used time: %ld us. \n", i64Time_jwt); - - if (iResult == NO_ERROR) - { - printf("Token validate succed \n"); - retcode = NO_ERROR; - } else - { - printf("Token validate failed \n"); - retcode = TEEC_ERROR_JWTVALIDATE_FAIL; - } - } - - // create a reply from the message - reply = dbus_message_new_method_return(msg); - - // add the arguments to the reply - dbus_message_iter_init_append(reply, &args); - bResult = - dbus_message_iter_append_basic( - &args, - DBUS_TYPE_UINT32, - &retcode - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_unref(reply); - dbus_connection_flush(conn); - return NULL; - } - - serial = 100; - if (!dbus_connection_send(conn, reply, &serial)) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_unref(reply); - dbus_connection_flush(conn); - return NULL; - } - - dbus_message_unref(reply); - dbus_connection_flush(conn); - - return NULL; -} - -/** - * Server that exposes a method call and waits for it to be called - */ -void -receive_methodcall( -) -{ - DBusMessage *msg; - DBusConnection *conn; - DBusError err; - int ret; - dbus_bool_t bResult; - - - printf("Dbus server for validating jwt is listening for method calls ... \n"); - - // initialise the error - dbus_error_init(&err); - - dbus_threads_init_default(); - - // connect to the bus and check for errors - conn = dbus_bus_get(DBUS_BUS_SESSION, &err); - // conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - exit(1); - } - - if (NULL == conn) - { - fprintf(stderr, "Connection Null\n"); - exit(1); - } - - char dbusname[1024]; - memset((char *) dbusname, 0, 1024); - // sprintf(dbusname, "%s.method.server", argv[1]); - sprintf(dbusname, "%s.method.server", "validatejwt"); - // request our name on the bus and check for errors - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - exit(1); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - fprintf(stderr, "Not Primary Owner (%d)\n", ret); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - exit(1); - } - - // loop, testing for new messages - memset((char *) dbusname, 0, 1024); - // sprintf(dbusname, "%s.method.Type", argv[1]); - sprintf(dbusname, "%s.method.Type", "validatejwt"); - while (true) - { - // non blocking read of the next available message - dbus_connection_read_write(conn, 0); - msg = dbus_connection_pop_message(conn); - - // loop again if we haven't got a message - if (NULL == msg) - { - usleep(10000); - continue; - } - - // check this is a method call for the right interface & method - bResult = dbus_message_is_method_call( - msg, - dbusname, - "validate_jwtsvid" - ); - if (bResult == TRUE) - { - reply_methodcall_validate_jwtsvid( - msg, - conn - ); - } - - // free the message - dbus_message_unref(msg); - - } // end of the while true - -} // end of the function - - -int main(int argc, char *argv[]) -{ - int iResult; - - iResult = spiffe_start_conn(); - if (iResult != NO_ERROR) - { - fprintf(stderr, "Spiffe start conn failed. \n"); - return -1; - } - - receive_methodcall( - ); - - return 0; -} diff --git a/demo/libspiffejwt/CMakeLists.txt b/demo/libspiffejwt/CMakeLists.txt deleted file mode 100644 index f20ce44..0000000 --- a/demo/libspiffejwt/CMakeLists.txt +++ /dev/null @@ -1,56 +0,0 @@ -# -# - -cmake_minimum_required(VERSION 3.5.1) - -project(spiffejwt C CXX) - -# include_directories("${CMAKE_CURRENT_BINARY_DIR}") - -# Introduce variables: -# - CMAKE_INSTALL_LIBDIR -# - CMAKE_INSTALL_BINDIR -# - CMAKE_INSTALL_INCLUDEDIR -include(GNUInstallDirs) - - -set(LIB_SPIFFEJWT - ${PROJECT_SOURCE_DIR}/spiffejwt.c -) -# Install Headers: -set(HEADERS_SPIFFEJWT - ${PROJECT_SOURCE_DIR}/spiffejwt.h -) -install( - FILES ${HEADERS_SPIFFEJWT} - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${TARGET_NAME}" -) - -add_library(spiffejwt SHARED ${LIB_SPIFFEJWT}) -target_link_libraries(spiffejwt - libclient.so -) - -# Install lib: -install( - TARGETS "spiffejwt" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" -) - -set(TEST_SPIFFEJWT - ${PROJECT_SOURCE_DIR}/test_spiffejwt.c -) -add_executable(test_spiffejwt "${TEST_SPIFFEJWT}") -target_link_libraries( - test_spiffejwt - spiffejwt -) - -# Install bin: -# install( -# TARGETS test_spiffejwt -# RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR$}" -# ) - - - diff --git a/demo/libspiffejwt/build/cmake.sh b/demo/libspiffejwt/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/demo/libspiffejwt/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/demo/libspiffejwt/spiffejwt.c b/demo/libspiffejwt/spiffejwt.c deleted file mode 100644 index 49a060e..0000000 --- a/demo/libspiffejwt/spiffejwt.c +++ /dev/null @@ -1,254 +0,0 @@ -#include -#include -#include - -#include "c-spiffe/workload/client.h" - -#include "spiffejwt.h" - - -workloadapi_Client *client; - - -int spiffe_start_conn() -{ - err_t error = NO_ERROR; - - client = workloadapi_NewClient(&error); - - workloadapi_Client_SetAddress(client, "unix:///tmp/spire-agent/public/api.sock"); - - workloadapi_Client_SetHeader(client, "workload.spiffe.io", "true"); - if (error != NO_ERROR) - { - // printf("client error! %d\n", (int) error); - return error; - } - - error = workloadapi_Client_Connect(client); - if (error != NO_ERROR) - { - // printf("conn error! %d\n", (int) error); - return error; - } - - return NO_ERROR; -} - - -int spiffe_close_conn() -{ - if (client == NULL) - { - return -1; - } - - err_t error = NO_ERROR; - - error = workloadapi_Client_Close(client); - if (error != NO_ERROR) - { - // printf("close error! %d\n", (int) error); - return error; - } - - workloadapi_Client_Free(client); - if (error != NO_ERROR) - { - // printf("client free error! %d\n", (int) error); - return error; - } - - return NO_ERROR; -} - -bool utf8_check_is_valid(const char *string) -{ - if (!string) - return 0; - - const unsigned char *bytes = (const unsigned char *) string; - while (*bytes) - { - if ((// ASCII - // use bytes[0] <= 0x7F to allow ASCII control characters - bytes[0] == 0x09 || - bytes[0] == 0x0A || - bytes[0] == 0x0D || - (0x20 <= bytes[0] && bytes[0] <= 0x7E) - ) - ) - { - bytes += 1; - continue; - } - - if ((// non-overlong 2-byte - (0xC2 <= bytes[0] && bytes[0] <= 0xDF) && - (0x80 <= bytes[1] && bytes[1] <= 0xBF) - ) - ) - { - bytes += 2; - continue; - } - - if ((// excluding overlongs - bytes[0] == 0xE0 && - (0xA0 <= bytes[1] && bytes[1] <= 0xBF) && - (0x80 <= bytes[2] && bytes[2] <= 0xBF) - ) || - (// straight 3-byte - ((0xE1 <= bytes[0] && bytes[0] <= 0xEC) || - bytes[0] == 0xEE || - bytes[0] == 0xEF) && - (0x80 <= bytes[1] && bytes[1] <= 0xBF) && - (0x80 <= bytes[2] && bytes[2] <= 0xBF) - ) || - (// excluding surrogates - bytes[0] == 0xED && - (0x80 <= bytes[1] && bytes[1] <= 0x9F) && - (0x80 <= bytes[2] && bytes[2] <= 0xBF) - ) - ) - { - bytes += 3; - continue; - } - - if ((// planes 1-3 - bytes[0] == 0xF0 && - (0x90 <= bytes[1] && bytes[1] <= 0xBF) && - (0x80 <= bytes[2] && bytes[2] <= 0xBF) && - (0x80 <= bytes[3] && bytes[3] <= 0xBF) - ) || - (// planes 4-15 - (0xF1 <= bytes[0] && bytes[0] <= 0xF3) && - (0x80 <= bytes[1] && bytes[1] <= 0xBF) && - (0x80 <= bytes[2] && bytes[2] <= 0xBF) && - (0x80 <= bytes[3] && bytes[3] <= 0xBF) - ) || - (// plane 16 - bytes[0] == 0xF4 && - (0x80 <= bytes[1] && bytes[1] <= 0x8F) && - (0x80 <= bytes[2] && bytes[2] <= 0xBF) && - (0x80 <= bytes[3] && bytes[3] <= 0xBF) - ) - ) - { - bytes += 4; - continue; - } - - return 0; - } - - return 1; -} - - -int spiffe_fetch_jwtsvid( - char *token -) -{ - err_t error = NO_ERROR; - - if (client == NULL) - { - return -1; - } - - spiffeid_ID id = {string_new("example.org"), - string_new("/myservice")}; - string_t audience = string_new("spiffe://example.org/audience"); - jwtsvid_Params params - = {.audience = audience, .extra_audiences = NULL, .subject = id}; - jwtsvid_SVID *svid - = workloadapi_Client_FetchJWTSVID(client, ¶ms, &error); - if (error != NO_ERROR) - { - // printf("fetch error! %d\n", (int) error); - return error; - } - // printf("Address: %p\n", svid); - - spiffeid_ID_Free(&id); - arrfree(audience); - - if (svid) - { - if (token == NULL) - { - jwtsvid_SVID_Free(svid); - return -1; - } else - { - if (sizeof(token) < sizeof(svid->token)) - { - jwtsvid_SVID_Free(svid); - return -1; - } else - { - bool bResult; - bResult = utf8_check_is_valid(svid->token); - if (bResult == false) - { - return -1; - } - - memset(token, '\0', sizeof(token)); - strcpy(token, svid->token); - jwtsvid_SVID_Free(svid); - } - } - } else - { - return -1; - } - - return NO_ERROR; -} - - -int spiffe_validate_jwtsvid( - char *token -) -{ - err_t error = NO_ERROR; - - if (client == NULL) - { - return -1; - } - - if (token == NULL) - { - return -1; - } - - bool bResult; - bResult = utf8_check_is_valid(token); - if (bResult == false) - { - return -1; - } - - // string_t audience = string_new(audience_name); - string_t audience = string_new("spiffe://example.org/audience"); - jwtsvid_SVID *svid = workloadapi_Client_ValidateJWTSVID( - client, token, audience, &error); - // printf("%s %d: spiffe_validate_jwtsvid error = %d \n", __FILE__, __LINE__, (int)error); - printf("libspiffejwt: spiffe_validate_jwtsvid error = %d \n", (int) error); - if (error != NO_ERROR) - { - return error; - } - - if (svid) - { - jwtsvid_SVID_Free(svid); - } - arrfree(audience); - - return NO_ERROR; -} diff --git a/demo/libspiffejwt/spiffejwt.h b/demo/libspiffejwt/spiffejwt.h deleted file mode 100644 index 0d2e774..0000000 --- a/demo/libspiffejwt/spiffejwt.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _SPIFFEJWT_H -#define _SPIFFEJWT_H - -int spiffe_start_conn(); -int spiffe_close_conn(); -int spiffe_fetch_jwtsvid( - char * token -); -int spiffe_validate_jwtsvid( - char * token -); - -#endif // _SPIFFEJWT_H diff --git a/demo/libspiffejwt/test_spiffejwt.c b/demo/libspiffejwt/test_spiffejwt.c deleted file mode 100644 index b4a3f42..0000000 --- a/demo/libspiffejwt/test_spiffejwt.c +++ /dev/null @@ -1,51 +0,0 @@ -#include -#include -#include -#include - -#include "spiffejwt.h" - - -#define NO_ERROR 0 - - -int main() -{ - char token[1024]; - int iResult; - - - iResult = spiffe_start_conn(); - if (iResult != NO_ERROR) - { - return -1; - } - - iResult = spiffe_fetch_jwtsvid( - token - ); - if (iResult != NO_ERROR) - { - return -1; - } else - { - printf("The feteched token: %s \n", token); - } - - iResult = spiffe_validate_jwtsvid( - token - ); - if (iResult != NO_ERROR) - { - printf("Token validate failed. \n"); - return -1; - } else - { - printf("Token validate succed. \n"); - } - - spiffe_close_conn(); - - return 0; -} - diff --git a/demo/scripts/dbus.sh b/demo/scripts/dbus.sh deleted file mode 100644 index 78602a7..0000000 --- a/demo/scripts/dbus.sh +++ /dev/null @@ -1,10 +0,0 @@ -# export $(dbus-launch) -# echo $DBUS_SESSION_BUS_ADDRESS - - -export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-mE1jFGBAsx,guid=dad6b93cccad1aeca78dd84162f7968b -echo $DBUS_SESSION_BUS_ADDRESS - - -export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-TdbAmwQsui,guid=3556dc166fba4469e0f7f87762f4d56a -echo $DBUS_SESSION_BUS_ADDRESS diff --git a/demo/scripts/spire/createentry_workload.sh b/demo/scripts/spire/createentry_workload.sh deleted file mode 100644 index e18be75..0000000 --- a/demo/scripts/spire/createentry_workload.sh +++ /dev/null @@ -1,9 +0,0 @@ -# bin/spire-server entry create \ -# -parentID spiffe://example.org/myagent \ -# -spiffeID spiffe://example.org/myservice \ -# -selector unix:uid:$(id -u) - -bin/spire-server entry create \ - -parentID spiffe://example.org/myagent \ - -spiffeID spiffe://example.org/myservice \ - -selector unix:uid:1000 diff --git a/demo/scripts/spire/gentoken_agent.sh b/demo/scripts/spire/gentoken_agent.sh deleted file mode 100644 index afda869..0000000 --- a/demo/scripts/spire/gentoken_agent.sh +++ /dev/null @@ -1 +0,0 @@ -bin/spire-server token generate -spiffeID spiffe://example.org/myagent diff --git a/demo/scripts/spire/runagent.sh b/demo/scripts/spire/runagent.sh deleted file mode 100644 index 41918e9..0000000 --- a/demo/scripts/spire/runagent.sh +++ /dev/null @@ -1 +0,0 @@ -bin/spire-agent run -config conf/agent/agent.conf -joinToken 16047f93-a133-494e-865e-033617d33eec diff --git a/demo/scripts/spire/runserver.sh b/demo/scripts/spire/runserver.sh deleted file mode 100644 index 1907eec..0000000 --- a/demo/scripts/spire/runserver.sh +++ /dev/null @@ -1 +0,0 @@ -bin/spire-server run -config conf/server/server.conf diff --git a/demo/scripts/spire/showdelentry.sh b/demo/scripts/spire/showdelentry.sh deleted file mode 100644 index 6a0183f..0000000 --- a/demo/scripts/spire/showdelentry.sh +++ /dev/null @@ -1,10 +0,0 @@ -bin/spire-server entry show - -# bin/spire-server entry delete -entryID - -# rm -f .data/agent_svid.der -# rm -f .data/agent-data.json -# rm -f .data/keys.json -# bin/spire-server entry delete -entryID - -bin/spire-server entry show diff --git a/demo/scripts/tcpdump.sh b/demo/scripts/tcpdump.sh deleted file mode 100644 index a01f5d6..0000000 --- a/demo/scripts/tcpdump.sh +++ /dev/null @@ -1,2 +0,0 @@ -tcpdump -vvvv -XX -i lo '(port 50051)' -w 01.cap -tcpdump -vvv -XX -r 01.cap | more diff --git a/docs/Design/design.docx b/docs/Design/design.docx deleted file mode 100644 index d26d09a258e30e8720ad40b34f9a8e1907056222..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1180936 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�w#hZ-d?cbXL?U%=0~|Z!8>2pY5|+S=5G7iK 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

$ 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 z%0D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

=OKNd`f}eO0BSKsFp#U{m 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¨RH@=By=jRRu#H+K9;G&AsO9zYd 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�RJ!>tzfZ`nN&BNm5TAP6Y??X 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

xc7-xrTA9QQ}e;}&l>LJTM8Qt+zX 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

m)`;o0uN{FI@u1ZBeR`ePy=_ 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 z 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𝔖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

fNm}#RabC4_wWj6oNsNm==J8}?ySJWca6r6 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⪚dP%Mx(#E%7_fCFG$=RLMRy)?x6pHiD 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ÏTu0PuDW{5Kd{utu5!#8{b? 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 V1QzJsJPrU^1VTF?fkFrQ{{V1p doesn't define. */ --#cmakedefine pid_t ${pid_t} -- --/* Define intmax_t and uintmax_t if they are not already defined. */ --#if !defined(HAVE_INTMAX_T) --typedef int64_t intmax_t; --#define INTMAX_MIN INT64_MIN --#define INTMAX_MAX INT64_MAX --#endif -- --#if !defined(HAVE_UINTMAX_T) --typedef uint64_t uintmax_t; --#endif -diff -Nur c-spiffe_orign/cmake/COPYING-CMAKE-SCRIPTS.txt c-spiffe/cmake/COPYING-CMAKE-SCRIPTS.txt ---- c-spiffe_orign/cmake/COPYING-CMAKE-SCRIPTS.txt 2022-08-29 22:07:28.600000000 +0800 -+++ c-spiffe/cmake/COPYING-CMAKE-SCRIPTS.txt 1970-01-01 08:00:00.000000000 +0800 -@@ -1,22 +0,0 @@ --Redistribution and use in source and binary forms, with or without --modification, are permitted provided that the following conditions --are met: -- --1. Redistributions of source code must retain the copyright -- notice, this list of conditions and the following disclaimer. --2. Redistributions in binary form must reproduce the copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. --3. The name of the author may not be used to endorse or promote products -- derived from this software without specific prior written permission. -- --THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR --IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES --OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. --IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, --INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT --NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, --DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY --THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT --(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF --THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -diff -Nur c-spiffe_orign/cmake/FindCheck.cmake c-spiffe/cmake/FindCheck.cmake ---- c-spiffe_orign/cmake/FindCheck.cmake 2022-08-29 22:07:28.600000000 +0800 -+++ c-spiffe/cmake/FindCheck.cmake 1970-01-01 08:00:00.000000000 +0800 -@@ -1,57 +0,0 @@ --# - Try to find the CHECK libraries --# Once done this will define --# --# CHECK_FOUND - system has check --# CHECK_INCLUDE_DIR - the check include directory --# CHECK_LIBRARIES - check library --# --# This configuration file for finding libcheck is originally from --# the opensync project. The originally was downloaded from here: --# opensync.org/browser/branches/3rd-party-cmake-modules/modules/FindCheck.cmake --# --# Copyright (c) 2007 Daniel Gollub --# Copyright (c) 2007 Bjoern Ricks --# --# Redistribution and use is allowed according to the terms of the New --# BSD license. --# For details see the accompanying COPYING-CMAKE-SCRIPTS file. -- -- --INCLUDE( FindPkgConfig ) -- --# Take care about check.pc settings --PKG_SEARCH_MODULE( CHECK Check ) -- --# Look for CHECK include dir and libraries --IF( NOT CHECK_FOUND ) -- IF ( CHECK_INSTALL_DIR ) -- MESSAGE ( STATUS "Using override CHECK_INSTALL_DIR to find Check" ) -- SET ( CHECK_INCLUDE_DIR "${CHECK_INSTALL_DIR}/include" ) -- SET ( CHECK_INCLUDE_DIRS "${CHECK_INCLUDE_DIR}" ) -- FIND_LIBRARY( CHECK_LIBRARY NAMES check PATHS "${CHECK_INSTALL_DIR}/lib" ) -- FIND_LIBRARY( COMPAT_LIBRARY NAMES compat PATHS "${CHECK_INSTALL_DIR}/lib" ) -- SET ( CHECK_LIBRARIES "${CHECK_LIBRARY}" "${COMPAT_LIBRARY}" ) -- ELSE ( CHECK_INSTALL_DIR ) -- FIND_PATH( CHECK_INCLUDE_DIR check.h ) -- FIND_LIBRARY( CHECK_LIBRARIES NAMES check ) -- ENDIF ( CHECK_INSTALL_DIR ) -- -- IF ( CHECK_INCLUDE_DIR AND CHECK_LIBRARIES ) -- SET( CHECK_FOUND 1 ) -- IF ( NOT Check_FIND_QUIETLY ) -- MESSAGE ( STATUS "Found CHECK: ${CHECK_LIBRARIES}" ) -- ENDIF ( NOT Check_FIND_QUIETLY ) -- ELSE ( CHECK_INCLUDE_DIR AND CHECK_LIBRARIES ) -- IF ( Check_FIND_REQUIRED ) -- MESSAGE( FATAL_ERROR "Could NOT find CHECK" ) -- ELSE ( Check_FIND_REQUIRED ) -- IF ( NOT Check_FIND_QUIETLY ) -- MESSAGE( STATUS "Could NOT find CHECK" ) -- ENDIF ( NOT Check_FIND_QUIETLY ) -- ENDIF ( Check_FIND_REQUIRED ) -- ENDIF ( CHECK_INCLUDE_DIR AND CHECK_LIBRARIES ) --ENDIF( NOT CHECK_FOUND ) -- --# Hide advanced variables from CMake GUIs --MARK_AS_ADVANCED( CHECK_INCLUDE_DIR CHECK_LIBRARIES ) -- -diff -Nur c-spiffe_orign/CMakeLists.txt c-spiffe/CMakeLists.txt ---- c-spiffe_orign/CMakeLists.txt 2022-08-29 22:07:28.596000000 +0800 -+++ c-spiffe/CMakeLists.txt 2022-08-29 21:33:28.000000000 +0800 -@@ -28,33 +28,10 @@ - set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - - set(CMAKE_CXX_STANDARD 14) --set(protobuf_MODULE_COMPATIBLE TRUE) - --find_package(Protobuf 3.13.0 REQUIRED) --find_package(gRPC 1.34.0 REQUIRED) - --message(STATUS "Using protobuf ${Protobuf_VERSION}") -+include(common.cmake) - --set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) --set(_REFLECTION gRPC::grpc++_reflection) -- --if(CMAKE_CROSSCOMPILING) -- find_program(_PROTOBUF_PROTOC protoc) --else() -- set(_PROTOBUF_PROTOC $) --endif() -- --# Find gRPC installation --# Looks for gRPCConfig.cmake file installed by gRPC's cmake installation. --find_package(gRPC CONFIG REQUIRED) --message(STATUS "Using gRPC ${gRPC_VERSION}") -- --set(_GRPC_GRPCPP gRPC::grpc++) --if(CMAKE_CROSSCOMPILING) -- find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) --else() -- set(_GRPC_CPP_PLUGIN_EXECUTABLE $) --endif() - - # Enable Coverage Tests - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage -g -O0") -diff -Nur c-spiffe_orign/common.cmake c-spiffe/common.cmake ---- c-spiffe_orign/common.cmake 1970-01-01 08:00:00.000000000 +0800 -+++ c-spiffe/common.cmake 2022-08-29 21:33:28.000000000 +0800 -@@ -0,0 +1,129 @@ -+# Copyright 2018 gRPC authors. -+# -+# Licensed under the Apache License, Version 2.0 (the "License"); -+# you may not use this file except in compliance with the License. -+# You may obtain a copy of the License at -+# -+# http://www.apache.org/licenses/LICENSE-2.0 -+# -+# Unless required by applicable law or agreed to in writing, software -+# distributed under the License is distributed on an "AS IS" BASIS, -+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+# See the License for the specific language governing permissions and -+# limitations under the License. -+# -+# cmake build file for C++ route_guide example. -+# Assumes protobuf and gRPC have been installed using cmake. -+# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build -+# that automatically builds all the dependencies before building route_guide. -+ -+cmake_minimum_required(VERSION 3.5.1) -+ -+# set (CMAKE_CXX_STANDARD 11) -+set (CMAKE_CXX_STANDARD 14) -+ -+set (GRPC_FETCHCONTENT 1) -+ -+ -+if(MSVC) -+ add_definitions(-D_WIN32_WINNT=0x600) -+endif() -+ -+find_package(Threads REQUIRED) -+ -+if(GRPC_AS_SUBMODULE) -+ # One way to build a projects that uses gRPC is to just include the -+ # entire gRPC project tree via "add_subdirectory". -+ # This approach is very simple to use, but the are some potential -+ # disadvantages: -+ # * it includes gRPC's CMakeLists.txt directly into your build script -+ # without and that can make gRPC's internal setting interfere with your -+ # own build. -+ # * depending on what's installed on your system, the contents of submodules -+ # in gRPC's third_party/* might need to be available (and there might be -+ # additional prerequisites required to build them). Consider using -+ # the gRPC_*_PROVIDER options to fine-tune the expected behavior. -+ # -+ # A more robust approach to add dependency on gRPC is using -+ # cmake's ExternalProject_Add (see cmake_externalproject/CMakeLists.txt). -+ -+ # Include the gRPC's cmake build (normally grpc source code would live -+ # in a git submodule called "third_party/grpc", but this example lives in -+ # the same repository as gRPC sources, so we just look a few directories up) -+ add_subdirectory(../../.. ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL) -+ message(STATUS "Using gRPC via add_subdirectory.") -+ -+ # After using add_subdirectory, we can now use the grpc targets directly from -+ # this build. -+ set(_PROTOBUF_LIBPROTOBUF libprotobuf) -+ set(_REFLECTION grpc++_reflection) -+ if(CMAKE_CROSSCOMPILING) -+ find_program(_PROTOBUF_PROTOC protoc) -+ else() -+ set(_PROTOBUF_PROTOC $) -+ endif() -+ set(_GRPC_GRPCPP grpc++) -+ if(CMAKE_CROSSCOMPILING) -+ find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) -+ else() -+ set(_GRPC_CPP_PLUGIN_EXECUTABLE $) -+ endif() -+elseif(GRPC_FETCHCONTENT) -+ # Another way is to use CMake's FetchContent module to clone gRPC at -+ # configure time. This makes gRPC's source code available to your project, -+ # similar to a git submodule. -+ message(STATUS "Using gRPC via add_subdirectory (FetchContent).") -+ include(FetchContent) -+ FetchContent_Declare( -+ grpc -+ GIT_REPOSITORY https://github.com/grpc/grpc.git -+ # when using gRPC, you will actually set this to an existing tag, such as -+ # v1.25.0, v1.26.0 etc.. -+ # For the purpose of testing, we override the tag used to the commit -+ # that's currently under test. -+ # GIT_TAG vGRPC_TAG_VERSION_OF_YOUR_CHOICE) -+ GIT_TAG v1.48.0 -+ ) -+ FetchContent_MakeAvailable(grpc) -+ -+ # Since FetchContent uses add_subdirectory under the hood, we can use -+ # the grpc targets directly from this build. -+ set(_PROTOBUF_LIBPROTOBUF libprotobuf) -+ set(_REFLECTION grpc++_reflection) -+ set(_PROTOBUF_PROTOC $) -+ set(_GRPC_GRPCPP grpc++) -+ if(CMAKE_CROSSCOMPILING) -+ find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) -+ else() -+ set(_GRPC_CPP_PLUGIN_EXECUTABLE $) -+ endif() -+else() -+ # This branch assumes that gRPC and all its dependencies are already installed -+ # on this system, so they can be located by find_package(). -+ -+ # Find Protobuf installation -+ # Looks for protobuf-config.cmake file installed by Protobuf's cmake installation. -+ set(protobuf_MODULE_COMPATIBLE TRUE) -+ find_package(Protobuf CONFIG REQUIRED) -+ message(STATUS "Using protobuf ${Protobuf_VERSION}") -+ -+ set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) -+ set(_REFLECTION gRPC::grpc++_reflection) -+ if(CMAKE_CROSSCOMPILING) -+ find_program(_PROTOBUF_PROTOC protoc) -+ else() -+ set(_PROTOBUF_PROTOC $) -+ endif() -+ -+ # Find gRPC installation -+ # Looks for gRPCConfig.cmake file installed by gRPC's cmake installation. -+ find_package(gRPC CONFIG REQUIRED) -+ message(STATUS "Using gRPC ${gRPC_VERSION}") -+ -+ set(_GRPC_GRPCPP gRPC::grpc++) -+ if(CMAKE_CROSSCOMPILING) -+ find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) -+ else() -+ set(_GRPC_CPP_PLUGIN_EXECUTABLE $) -+ endif() -+endif() -diff -Nur c-spiffe_orign/protos/google/protobuf/struct.proto c-spiffe/protos/google/protobuf/struct.proto ---- c-spiffe_orign/protos/google/protobuf/struct.proto 1970-01-01 08:00:00.000000000 +0800 -+++ c-spiffe/protos/google/protobuf/struct.proto 2022-08-29 21:33:28.000000000 +0800 -@@ -0,0 +1,95 @@ -+// Protocol Buffers - Google's data interchange format -+// Copyright 2008 Google Inc. All rights reserved. -+// https://developers.google.com/protocol-buffers/ -+// -+// Redistribution and use in source and binary forms, with or without -+// modification, are permitted provided that the following conditions are -+// met: -+// -+// * Redistributions of source code must retain the above copyright -+// notice, this list of conditions and the following disclaimer. -+// * Redistributions in binary form must reproduce the above -+// copyright notice, this list of conditions and the following disclaimer -+// in the documentation and/or other materials provided with the -+// distribution. -+// * Neither the name of Google Inc. nor the names of its -+// contributors may be used to endorse or promote products derived from -+// this software without specific prior written permission. -+// -+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+syntax = "proto3"; -+ -+package google.protobuf; -+ -+option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -+option cc_enable_arenas = true; -+option go_package = "google.golang.org/protobuf/types/known/structpb"; -+option java_package = "com.google.protobuf"; -+option java_outer_classname = "StructProto"; -+option java_multiple_files = true; -+option objc_class_prefix = "GPB"; -+ -+// `Struct` represents a structured data value, consisting of fields -+// which map to dynamically typed values. In some languages, `Struct` -+// might be supported by a native representation. For example, in -+// scripting languages like JS a struct is represented as an -+// object. The details of that representation are described together -+// with the proto support for the language. -+// -+// The JSON representation for `Struct` is JSON object. -+message Struct { -+ // Unordered map of dynamically typed values. -+ map fields = 1; -+} -+ -+// `Value` represents a dynamically typed value which can be either -+// null, a number, a string, a boolean, a recursive struct value, or a -+// list of values. A producer of value is expected to set one of these -+// variants. Absence of any variant indicates an error. -+// -+// The JSON representation for `Value` is JSON value. -+message Value { -+ // The kind of value. -+ oneof kind { -+ // Represents a null value. -+ NullValue null_value = 1; -+ // Represents a double value. -+ double number_value = 2; -+ // Represents a string value. -+ string string_value = 3; -+ // Represents a boolean value. -+ bool bool_value = 4; -+ // Represents a structured value. -+ Struct struct_value = 5; -+ // Represents a repeated `Value`. -+ ListValue list_value = 6; -+ } -+} -+ -+// `NullValue` is a singleton enumeration to represent the null value for the -+// `Value` type union. -+// -+// The JSON representation for `NullValue` is JSON `null`. -+enum NullValue { -+ // Null value. -+ NULL_VALUE = 0; -+} -+ -+// `ListValue` is a wrapper around a repeated field of values. -+// -+// The JSON representation for `ListValue` is JSON array. -+message ListValue { -+ // Repeated field of dynamically typed values. -+ repeated Value values = 1; -+} -diff -Nur c-spiffe_orign/spiffetls/CMakeLists.txt c-spiffe/spiffetls/CMakeLists.txt ---- c-spiffe_orign/spiffetls/CMakeLists.txt 2022-08-29 22:07:28.628000000 +0800 -+++ c-spiffe/spiffetls/CMakeLists.txt 2022-08-29 21:33:28.000000000 +0800 -@@ -49,7 +49,7 @@ - - target_link_libraries(${TARGET_NAME} - svid -- ssl -+ # ssl - spiffeid - internal - bundle -@@ -61,7 +61,10 @@ - rt - m - pthread -- crypto) -+ # crypto -+ libcrypto.so -+ libssl.so -+ ) - - # Install Headers: - set(HEADERS_SPIFFETLS -diff -Nur c-spiffe_orign/svid/jwtsvid/parse.c c-spiffe/svid/jwtsvid/parse.c ---- c-spiffe_orign/svid/jwtsvid/parse.c 2022-08-29 22:07:28.632000000 +0800 -+++ c-spiffe/svid/jwtsvid/parse.c 2022-08-29 21:33:28.000000000 +0800 -@@ -85,6 +85,17 @@ - payload_str_len, 0, NULL); - - char *signature = strtok(NULL, dot); -+ ////////////////////////////////////////////////////////////////////// -+ // fjyu@whu.edu.cn debug 2022.07.08 -+ if (signature == NULL) { -+ printf("%s %d: parsed signature is null \n", __FILE__, __LINE__); -+ jwtsvid_JWT_Free(jwt); -+ *err = ERR_PARSING; -+ return NULL; -+ } else { -+ // printf("%s %d: parsed signature is %s \n", __FILE__, __LINE__, signature); -+ } -+ ////////////////////////////////////////////////////////////////////// - signature[-1] = '.'; - jwt->signature = string_new(signature); - free(header_str); -diff -Nur c-spiffe_orign/workload/client.cc c-spiffe/workload/client.cc ---- c-spiffe_orign/workload/client.cc 2022-08-29 22:07:28.636000000 +0800 -+++ c-spiffe/workload/client.cc 2022-08-29 21:33:28.000000000 +0800 -@@ -244,6 +244,7 @@ - return NO_ERROR; - } - -+ - err_t workloadapi_Client_Connect(workloadapi_Client *client) - { - if(!client) { -@@ -252,7 +253,7 @@ - // if client already has a stub, we don't create a new one. - if(!client->stub) { - std::shared_ptr chan = grpc::CreateChannel( -- client->address, grpc::InsecureChannelCredentials()); -+ client->address, grpc::InsecureChannelCredentials()); - if(!chan) { - return ERR_NULL; - } -@@ -737,7 +738,13 @@ - char *token, char *audience, - err_t *err) - { -- grpc::ClientContext ctx; -+ // grpc::ClientContext ctx; -+ grpc::ClientContext *ctx = new grpc::ClientContext(); -+ -+ if(client->headers) { -+ for(int i = 0; i < arrlen(client->headers); i += 2) -+ ctx->AddMetadata(client->headers[i], client->headers[i + 1]); -+ } - - ValidateJWTSVIDRequest req; - req.set_svid(token); -@@ -745,9 +752,10 @@ - - ValidateJWTSVIDResponse resp; - grpc::Status status = ((SpiffeWorkloadAPI::StubInterface *) client->stub) -- ->ValidateJWTSVID(&ctx, req, &resp); -- -+ ->ValidateJWTSVID(ctx, req, &resp); -+ // ->ValidateJWTSVID(&ctx, req, &resp); - if(status.ok()) { -+ // printf("%s %d: workloadapi_Client_ValidateJWTSVID, status ok \n", __FILE__, __LINE__); - // parse response - string_arr_t audiences_array = NULL; - arrput(audiences_array, audience); -@@ -757,6 +765,7 @@ - - return svid; - } else { -+ // printf("%s %d: workloadapi_Client_ValidateJWTSVID, err = %d \n", __FILE__, __LINE__, (int)ERR_BAD_REQUEST); - // could not validate jwt svid - *err = ERR_BAD_REQUEST; - return NULL; -diff -Nur c-spiffe_orign/workload/CMakeLists.txt c-spiffe/workload/CMakeLists.txt ---- c-spiffe_orign/workload/CMakeLists.txt 2022-08-29 22:07:28.636000000 +0800 -+++ c-spiffe/workload/CMakeLists.txt 2022-08-29 21:33:28.000000000 +0800 -@@ -70,7 +70,9 @@ - rt - m - pthread --crypto) -+# crypto -+libcrypto.so -+) - - - # Install Headers: diff --git a/teeproxy/gpproxy/CMakeLists.txt b/teeproxy/gpproxy/CMakeLists.txt deleted file mode 100644 index 2b333c5..0000000 --- a/teeproxy/gpproxy/CMakeLists.txt +++ /dev/null @@ -1,107 +0,0 @@ -# -# - -cmake_minimum_required(VERSION 3.5.1) - -project(gpp C CXX) - -include(common.cmake) - -# Proto file -get_filename_component(gt_proto "./protos/gt.proto" ABSOLUTE) -get_filename_component(gt_proto_path "${gt_proto}" PATH) -# [[get_filename_component(proto "../protos/${proto_name}.proto" ABSOLUTE) -# get_filename_component(proto_dir "${proto}" DIRECTORY)]] - -# Generated sources -set(gt_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/gt.pb.cc") -set(gt_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/gt.pb.h") -set(gt_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/gt.grpc.pb.cc") -set(gt_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/gt.grpc.pb.h") - -add_custom_command( - OUTPUT "${gt_proto_srcs}" "${gt_proto_hdrs}" "${gt_grpc_srcs}" "${gt_grpc_hdrs}" - COMMAND ${_PROTOBUF_PROTOC} - ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}" - --cpp_out "${CMAKE_CURRENT_BINARY_DIR}" - -I "${gt_proto_path}" - --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" - "${gt_proto}" - DEPENDS "${gt_proto}" -) - -# Include generated *.pb.h files -include_directories("${CMAKE_CURRENT_BINARY_DIR}") -include_directories(/usr/include/dbus-1.0/) -include_directories(/usr/lib64/dbus-1.0/include/) -include_directories(${CMAKE_CURRENT_BINARY_DIR}/../include) - -# Introduce variables: -# - CMAKE_INSTALL_LIBDIR -# - CMAKE_INSTALL_BINDIR -# - CMAKE_INSTALL_INCLUDEDIR -include(GNUInstallDirs) - -# gt_grpc_proto -add_library(gt_grpc_proto - ${gt_grpc_srcs} - ${gt_grpc_hdrs} - ${gt_proto_srcs} - ${gt_proto_hdrs} -) -target_link_libraries(gt_grpc_proto - ${_REFLECTION} - ${_GRPC_GRPCPP} - ${_PROTOBUF_LIBPROTOBUF} -) - - -add_executable(gpproxy - "gpproxy.cc" - ${gt_grpc_srcs} - ${gt_proto_srcs} -) -target_link_libraries(gpproxy - gt_grpc_proto - ${_REFLECTION} - ${_GRPC_GRPCPP} - ${_PROTOBUF_LIBPROTOBUF} - libdbusc_gpw.so - libdbusc_jwt.so - yaml-cpp.a -) - -# Install bin -install( - TARGETS gpproxy - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" -) -# Install config file -set(gpp_config_dir "$ENV{HOME}/.gpp") -install( - FILES "conf/gpproxy_config.yaml" - DESTINATION ${gpp_config_dir} -) -# Install certs -set(gpp_certs_dir "$ENV{HOME}/.gpp/certs") -install( - FILES - "certs/server_key.pem" - "certs/server_crt.pem" - "certs/ca_key.pem" - "certs/ca_crt.pem" - "certs/gen_ca_keycrt.sh" - "certs/gen_server_keycrt.sh" - "certs/gen_client_keycsr.sh" - "certs/msg.txt" - "certs/check_ca_key.sh" - "certs/check_ca_crt.sh" - "certs/check_server_key.sh" - "certs/check_server_crt.sh" - "certs/check_client_key.sh" - "certs/check_client_crt.sh" - "certs/gen_ca_crt.sh" - "certs/gen_server_crt.sh" - "certs/gen_client_crt.sh" - DESTINATION ${gpp_certs_dir} -) diff --git a/teeproxy/gpproxy/build/cmake.sh b/teeproxy/gpproxy/build/cmake.sh deleted file mode 100644 index 4511f00..0000000 --- a/teeproxy/gpproxy/build/cmake.sh +++ /dev/null @@ -1,3 +0,0 @@ -# cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR .. -cmake -DCMAKE_BUILD_TYPE=Debug .. - diff --git a/teeproxy/gpproxy/certs/ca_crt.pem b/teeproxy/gpproxy/certs/ca_crt.pem deleted file mode 100644 index c1f851a..0000000 --- a/teeproxy/gpproxy/certs/ca_crt.pem +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDozCCAougAwIBAgIUZoRrQX6TrtP0Reyf9DbHVJRNDoQwDQYJKoZIhvcNAQEL -BQAwYTELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBUh1YmVpMQ4wDAYDVQQHDAVXdWhh -bjESMBAGA1UECgwJVHJ1c3RDdXRlMQ0wCwYDVQQLDARnUlBDMQ8wDQYDVQQDDAZj -YS5vcmcwHhcNMjIwODIwMDQ1OTUyWhcNMzIwODE3MDQ1OTUyWjBhMQswCQYDVQQG -EwJDTjEOMAwGA1UECAwFSHViZWkxDjAMBgNVBAcMBVd1aGFuMRIwEAYDVQQKDAlU -cnVzdEN1dGUxDTALBgNVBAsMBGdSUEMxDzANBgNVBAMMBmNhLm9yZzCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMYdYD9GChLzSOWmaIcHMqx8itp/7Zvx -7y2qgb23EWCWIz01kPQaCXpuSOi38dFipXFBWo5o3GaezIoSCp66eN3kHGpcluu2 -0nbyh7zdUVCSXhNWbEiwlhC53DDs2SBYWr2KGTRDEcJEXli110v8sEGZQvkj3XGF -B6IbTczMbhpVfJ82RMqGqNYSJ5jCvqw3XOX6xoN4CP3PuAKC6MtEkLLkXQOS72oL -TSE9XoZNqlyhmymAVwQwCV1zT28W/hwKbCN4tVoO+1bwc3togNYO0W7x1GgOoNoZ -va1UNDX1sfW6B041TgSTGQ0OhGzgKWadKHm2UpG2d5NLkaiBUPpvuokCAwEAAaNT -MFEwHQYDVR0OBBYEFKrFU5qoBe2AkvvTiOfwY24T36zTMB8GA1UdIwQYMBaAFKrF -U5qoBe2AkvvTiOfwY24T36zTMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACjfqOa6G596NbFfAAhBFFS+RIueRWdDkBxR7kk+eQ3Z5j4hIBmrA0OS -R6KCrvmvnXxqSBRmuwRfs0e7G76jkUAFFHkslTPLwgklWCarsGXeAkrdgQU7WL4n -NYBNnjUNK11JREUdAXgvzyuLOhjf4l5UvhujWivhviChFB8xpTQfq2d1oE9jsotv -r2opic4ynu69LXd8HZiShabXgQ60/BNOX8D+wb1YzoZlUCKzSH15QRuuEbkj4/Hy -R2+qxUODbuwfqI4fkOvQIIrD2NO89nHpWFtui4ByQEQaeTesus8M8corCekrxr08 -VkxuOGg2U3zWUlLuSZMD2G7KWuDXU78= ------END CERTIFICATE----- diff --git a/teeproxy/gpproxy/certs/ca_key.pem b/teeproxy/gpproxy/certs/ca_key.pem deleted file mode 100644 index 8a1fb51..0000000 --- a/teeproxy/gpproxy/certs/ca_key.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: AES-192-CBC,39D9C0B289197FF4451BD03C066C8895 - -HZGExFo0mzCidPeXEb1DWkawC2XnTOZfZoHw7+aZGdTXnnbK8x72UuX7CgfyqVrQ -nVgGHJioD/0TpwhhRhgFCs8xPPVmKWIHssgXKz1ZzSHwQSamby/1aGq1bJtVY7VL -qAgUjkMVClErKIiR4ZAAC/Z95BW3ap/K9GmagAFdcGlaiLyXImS/gC3KRxkTZLNn -5Zfq7+XwBp3tWDjM6SLHvYtvsALs2+g8bJUXZFA9OvRZogPnL9EEaTfrjlYBuN2z -0lf2NSQhuAxPN/Qo80l7u6wKIojM+OnWZITbiMit/QmYAEa6znJbt9EWNEYdnIXr -P1NP0zU9ycBDFELNJwZcEUj+Ua9BxPwN01NgBBbPDuFikpyojzcNzm++ZG/uFc5s -LuSYm3lLuhsENVAXx7iwBTBAAWbQxYf8XOP3Nnhj83K/hgL5rfIKMkaFC2+FMvfo -SnIWitAImbn0IB9XncdRkJ9BTOLks/2VOWuVPknNCEGcNEJuL5p/FWCBHQa0eqeT -a84FdLXhN9wSjPaskb8gk+QDSh0L0bTByJC584u2P4Wwb/aJNPzicBBJWVc2DObL -OUYfad1NOvl7uXoe8vRsdYGQOtcUYjfw82MB1855JsuFj7CQwp+ZnO2tu7crnf0Q -v3YL4FAAIHFUi+/w5w6Vp2By86BTApCiStFuSxI+1VabbfpWLk/rtQE9uMTfFLaF -LFQszev4POfEC1u3XegJc+ccYcADxuXseHj07UtCKQkoqAX/lahvOCK2hk2BYQdh -sHtrcJjZqSjDtm4Ec08pfjSKjISVoT5aWlFK0W9RJFsQNoWip7ZIAZwRy8ZPrVOx -bvBiSTYeuwa3Z7J5uGJZKH0Y0zYbwtsWvfIH8jgB+BRSBLQPKqlbPCCSNSfR8iVy -x446hB/a9HONTot5TCDuJ5T12Kw61mTupWGRLzImg6cm+anTXNSHDopTN9eugHE7 -eUvbzzpVYZ1AJduIdPYvzznOYq6T+jbBPiDTg1zUr3R3eLqOBpYJABnDxJlcOyCD -YHL2Ns/EFSMjLm0EyRGNP6a5NdsYljAFqrHMU2MHdj/GqNKWDzdVtMSZXG/1Xui7 -/Iu5xRMPtE7qEudVIupDFfgMzj9hZfM984N6B5exq6ZGMhwlJ/YBB8VpxRuW4Adi -32VTO5nF4M7m71jcOfFmaKz85u2g6RIctEIzJRZ0F4YmI33bj8HPTodV2bmtxd9V -6jipxZ4gO3zuKUsOUnmCkAp3Y9WgPZXsTS3WksFY4+Q3+vjQAlx3xMsTXpi2wKvi -uxYflNKeWPJQzBsdUAhEsffbIN+RTomnZh9ze4nO+8i1B/Hob3mxlTOVzIP6udvc -6NaZV6n42z1cv/X+5mexB74umFkpicMveNpaSGZO43v8ai6gppI4SaO9Wa7T3gWu -d6dchs+/gG0nZWsrq8XZmoEqywxqUEI/OR2dp/298cQYZug+psw4QJ3kXmRwu8qG -l3qjxpFyak64GLGNcfsd4KYOmsAtEZY/EDfVhVG4lexMInxDNMSziBEphocHbQlR -LpxryE9vfZZHOtbQuN1Bp/6KiH3kuVVLMNvIWrik6aeO8xc7vnT6ExKk8PENGo1L ------END RSA PRIVATE KEY----- diff --git a/teeproxy/gpproxy/certs/check_ca_crt.sh b/teeproxy/gpproxy/certs/check_ca_crt.sh deleted file mode 100644 index 83cffa1..0000000 --- a/teeproxy/gpproxy/certs/check_ca_crt.sh +++ /dev/null @@ -1,42 +0,0 @@ -#! /bin/sh -# Purpose: Alert sysadmin/developer about the cert expiry date in advance -# Author: under license -# ------------------------------------------------------------------------------- - - -_openssl="openssl" - - -# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem -# REGENCRTSCRIPT=${HOME}/gen_ca_crt.sh -CUR_DIR=$( dirname -- "$0"; ) -CACRTPEM=$CUR_DIR/ca_crt.pem -REGENCRTSCRIPT=${CUR_DIR}/gen_ca_crt.sh - -# 7 days in seconds -DAYS="604800" - -# Email settings -_sub=$CACRTPEM" will expire within $DAYS seconds (7 days)" -# _sub="${CACRTPEM} will expire within $DAYS seconds (7 days)" -_from="system-account@your-dommain" -_to="sysadmin@your-domain" - -echo -e '\n'get date of $CACRTPEM: -openssl x509 -in $CACRTPEM -noout -dates - -echo -e '\n'check expiry of $CACRTPEM: -$_openssl x509 -enddate -noout -in "$CACRTPEM" -checkend "$DAYS" -$_openssl x509 -enddate -noout -in "$CACRTPEM" -checkend "$DAYS" | grep -q 'Certificate will expire' -# If will expire, regenerate key and certifcate -# // , and send email -if [ $? -eq 0 ] -then - echo "${_sub}" - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${REGENCRTSCRIPT} -fi diff --git a/teeproxy/gpproxy/certs/check_ca_key.sh b/teeproxy/gpproxy/certs/check_ca_key.sh deleted file mode 100644 index 4461e1f..0000000 --- a/teeproxy/gpproxy/certs/check_ca_key.sh +++ /dev/null @@ -1,63 +0,0 @@ -#! /bin/sh -# Purpose: Alert sysadmin/developer about the interity of key in advance -# Author: under license -# ------------------------------------------------------------------------------- - -_openssl="openssl" - - -CUR_DIR=$( dirname -- "$0"; ) - - -# KEYPEM=$HOME/.gpp/certs/ca_key.pem -# PUBPEM=$HOME/.gpp/certs/ca_pubkey.pem -# CRTPEM=$HOME/.gpp/certs/ca_crt.pem -# MSGTXT=$HOME/.gpp/certs/msg.txt -# MSGSIG=$HOME/.gpp/certs/msg.sig -# GENKEYCRTSCRIPT=${HOME}/.gpp/certs/gen_ca_keycrt.sh -KEYPEM=$CUR_DIR/ca_key.pem -PUBPEM=$CUR_DIR/ca_pubkey.pem -CRTPEM=$CUR_DIR/ca_crt.pem -MSGTXT=${CUR_DIR}/msg.txt -MSGSIG=${CUR_DIR}/msg.sig -GENKEYCRTSCRIPT=${CUR_DIR}/gen_ca_keycrt.sh - -echo -e '\n'check integrity of ${KEYPEM}: -# ${_openssl} rsa -in ${KEYPEM} -passin pass:111111 -check -noout -# ${_openssl} rsa -in ${KEYPEM} -check -noout -${_openssl} rsa -in ${KEYPEM} -check -noout | grep -q 'RSA key ok' -if [ $? -ne 0 ] -then - echo "the integrity of "${KEYPEM}" is broken" - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${GENKEYCRTSCRIPT} -else - echo -e "RSA key ok" -fi - -echo -e '\n'use private ${KEYPEM} to sign ${MSGTXT}: -# ${_openssl} dgst -sha256 -sign ${KEYPEM} -passin pass:111111 -out msg.sig msg.txt -${_openssl} dgst -sha256 -sign ${KEYPEM} -out ${MSGSIG} ${MSGTXT} - -echo -e '\n'get public key from ${CRTPEM}: -${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} - -echo -e '\n'use public key in ${CRTPEM} to verify signature of ${MSGTXT}: -# ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt -${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} -${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} | grep -q 'Verified OK' -if [ $? -ne 0 ] -then - echo ${KEYPEM}" is not matched with "${CRTPEM} - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${GENKEYCRTSCRIPT} -fi -rm -f ${PUBPEM} diff --git a/teeproxy/gpproxy/certs/check_client_crt.sh b/teeproxy/gpproxy/certs/check_client_crt.sh deleted file mode 100644 index 769041a..0000000 --- a/teeproxy/gpproxy/certs/check_client_crt.sh +++ /dev/null @@ -1,43 +0,0 @@ -#! /bin/sh -# Purpose: Alert sysadmin/developer about the cert expiry date in advance -# Author: under license -# ------------------------------------------------------------------------------- - - -_openssl="openssl" - - -# CRTPEM=$HOME/.gpp/certs/client_crt.pem -# REGENCRTSCRIPT=${HOME}/gen_client_crt.sh -CUR_DIR=$( dirname -- "$0"; ) -CRTPEM=$CUR_DIR/client_crt.pem -REGENCRTSCRIPT=${CUR_DIR}/gen_client_crt.sh - -# 7 days in seconds -DAYS="604800" - -# Email settings -_sub=$CRTPEM" will expire within $DAYS seconds (7 days)" -# _sub="${CRTPEM} will expire within $DAYS seconds (7 days)" -_from="system-account@your-dommain" -_to="sysadmin@your-domain" - - -echo -e '\n'get date of $CRTPEM: -openssl x509 -in $CRTPEM -noout -dates - -echo -e '\n'check expiry of $CRTPEM: -$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" -$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" | grep -q 'Certificate will expire' -# If will expire, regenerate key and certifcate -# // , and send email -if [ $? -eq 0 ] -then - echo "${_sub}" - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${REGENCRTSCRIPT} -fi diff --git a/teeproxy/gpproxy/certs/check_client_key.sh b/teeproxy/gpproxy/certs/check_client_key.sh deleted file mode 100644 index c62d32c..0000000 --- a/teeproxy/gpproxy/certs/check_client_key.sh +++ /dev/null @@ -1,62 +0,0 @@ -#! /bin/sh -# Purpose: Alert sysadmin/developer about the interity of key in advance -# Author: under license -# ------------------------------------------------------------------------------- - - -_openssl="openssl" - - -# KEYPEM=$HOME/.gpp/certs/client_key.pem -# PUBPEM=$HOME/.gpp/certs/client_pubkey.pem -# CRTPEM=$HOME/.gpp/certs/client_crt.pem -# MSGTXT=$HOME/.gpp/certs/msg.txt -# MSGSIG=$HOME/.gpp/certs/msg.sig -# GENKEYCRTSCRIPT=${HOME}/.gpp/certs/gen_client_keycrt.sh -CUR_DIR=$( dirname -- "$0"; ) -KEYPEM=$CUR_DIR/client_key.pem -PUBPEM=$CUR_DIR/client_pubkey.pem -CRTPEM=$CUR_DIR/client_crt.pem -MSGTXT=${CUR_DIR}/msg.txt -MSGSIG=${CUR_DIR}/msg.sig -GENKEYCRTSCRIPT=${CUR_DIR}/gen_client_keycrt.sh - -echo -e '\n'check integrity of ${KEYPEM}: -# ${_openssl} rsa -in ${KEYPEM} -passin pass:111111 -check -noout -# ${_openssl} rsa -in ${KEYPEM} -check -noout -${_openssl} rsa -in ${KEYPEM} -check -noout | grep -q 'RSA key ok' -if [ $? -ne 0 ] -then - echo "the integrity of "${KEYPEM}" is broken" - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${GENKEYCRTSCRIPT} -else - echo -e "RSA key ok" -fi - -echo -e '\n'use private ${KEYPEM} to sign ${MSGTXT}: -# ${_openssl} dgst -sha256 -sign ${KEYPEM} -passin pass:111111 -out msg.sig msg.txt -${_openssl} dgst -sha256 -sign ${KEYPEM} -out ${MSGSIG} ${MSGTXT} - -echo -e '\n'get public key from ${CRTPEM}: -${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} - -echo -e '\n'use public key in ${CRTPEM} to verify signature of ${MSGTXT}: -# ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt -${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} -${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} | grep -q 'Verified OK' -if [ $? -ne 0 ] -then - echo ${KEYPEM}" is not matched with "${CRTPEM} - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${GENKEYCRTSCRIPT} -fi -rm -f ${PUBPEM} diff --git a/teeproxy/gpproxy/certs/check_server_crt.sh b/teeproxy/gpproxy/certs/check_server_crt.sh deleted file mode 100644 index acedfce..0000000 --- a/teeproxy/gpproxy/certs/check_server_crt.sh +++ /dev/null @@ -1,43 +0,0 @@ -#! /bin/sh -# Purpose: Alert sysadmin/developer about the cert expiry date in advance -# Author: under license -# ------------------------------------------------------------------------------- - - -_openssl="openssl" - - -# CRTPEM=$HOME/.gpp/certs/server_crt.pem -# REGENCRTSCRIPT=${HOME}/gen_server_crt.sh -CUR_DIR=$( dirname -- "$0"; ) -CRTPEM=$CUR_DIR/server_crt.pem -REGENCRTSCRIPT=${CUR_DIR}/gen_server_crt.sh - -# 7 days in seconds -DAYS="604800" - -# Email settings -_sub=$CRTPEM" will expire within $DAYS seconds (7 days)" -# _sub="${CRTPEM} will expire within $DAYS seconds (7 days)" -_from="system-account@your-dommain" -_to="sysadmin@your-domain" - - -echo -e '\n'get date of $CRTPEM: -openssl x509 -in $CRTPEM -noout -dates - -echo -e '\n'check expiry of $CRTPEM: -$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" -$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" | grep -q 'Certificate will expire' -# If will expire, regenerate key and certifcate -# // , and send email -if [ $? -eq 0 ] -then - echo "${_sub}" - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${REGENCRTSCRIPT} -fi diff --git a/teeproxy/gpproxy/certs/check_server_key.sh b/teeproxy/gpproxy/certs/check_server_key.sh deleted file mode 100644 index 9445f55..0000000 --- a/teeproxy/gpproxy/certs/check_server_key.sh +++ /dev/null @@ -1,62 +0,0 @@ -#! /bin/sh -# Purpose: Alert sysadmin/developer about the interity of key in advance -# Author: under license -# ------------------------------------------------------------------------------- - - -_openssl="openssl" - - -# KEYPEM=$HOME/.gpp/certs/server_key.pem -# PUBPEM=$HOME/.gpp/certs/server_pubkey.pem -# CRTPEM=$HOME/.gpp/certs/server_crt.pem -# MSGTXT=$HOME/.gpp/certs/msg.txt -# MSGSIG=$HOME/.gpp/certs/msg.sig -# GENKEYCRTSCRIPT=${HOME}/.gpp/certs/gen_server_keycrt.sh -CUR_DIR=$( dirname -- "$0"; ) -KEYPEM=$CUR_DIR/server_key.pem -PUBPEM=$CUR_DIR/server_pubkey.pem -CRTPEM=$CUR_DIR/server_crt.pem -MSGTXT=${CUR_DIR}/msg.txt -MSGSIG=${CUR_DIR}/msg.sig -GENKEYCRTSCRIPT=${CUR_DIR}/gen_server_keycrt.sh - -echo -e '\n'check integrity of ${KEYPEM}: -# ${_openssl} rsa -in ${KEYPEM} -passin pass:111111 -check -noout -# ${_openssl} rsa -in ${KEYPEM} -check -noout -${_openssl} rsa -in ${KEYPEM} -check -noout | grep -q 'RSA key ok' -if [ $? -ne 0 ] -then - echo "the integrity of "${KEYPEM}" is broken" - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${GENKEYCRTSCRIPT} -else - echo -e "RSA key ok" -fi - -echo -e '\n'use private ${KEYPEM} to sign ${MSGTXT}: -# ${_openssl} dgst -sha256 -sign ${KEYPEM} -passin pass:111111 -out msg.sig msg.txt -${_openssl} dgst -sha256 -sign ${KEYPEM} -out ${MSGSIG} ${MSGTXT} - -echo -e '\n'get public key from ${CRTPEM}: -${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} - -echo -e '\n'use public key in ${CRTPEM} to verify signature of ${MSGTXT}: -# ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt -${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} -${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} | grep -q 'Verified OK' -if [ $? -ne 0 ] -then - echo ${KEYPEM}" is not matched with "${CRTPEM} - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${GENKEYCRTSCRIPT} -fi -rm -f ${PUBPEM} diff --git a/teeproxy/gpproxy/certs/gen_ca_crt.sh b/teeproxy/gpproxy/certs/gen_ca_crt.sh deleted file mode 100644 index 267cac5..0000000 --- a/teeproxy/gpproxy/certs/gen_ca_crt.sh +++ /dev/null @@ -1,22 +0,0 @@ -#! /bin/sh - -_openssl="openssl" - -CUR_DIR=$( dirname -- "$0"; ) - - -# CAKEYPEM=$HOME/.gpp/certs/ca_key.pem -# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem -CAKEYPEM=$CUR_DIR/ca_key.pem -CACRTPEM=$CUR_DIR/ca_crt.pem -RSAKEYLEN=2048 -EXPIREDAYS=3650 -SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=ca.org" - -# echo -e '\n'generate $CAKEYPEM: -# $_openssl genrsa -passout pass:111111 -aes192 -out $CAKEYPEM ${RSAKEYLEN} -# $_openssl genrsa -aes192 -out $CAKEYPEM ${RSAKEYLEN} - -echo -e '\n'generate $CACRTPEM: -# $_openssl req -passin pass:111111 -new -x509 -days 3650 -key $CAKEYPEM -out $CACRTPEM -subj ${SUBSTR} -$_openssl req -new -x509 -days ${EXPIREDAYS} -key $CAKEYPEM -out $CACRTPEM -subj ${SUBSTR} diff --git a/teeproxy/gpproxy/certs/gen_ca_keycrt.sh b/teeproxy/gpproxy/certs/gen_ca_keycrt.sh deleted file mode 100644 index 5110ba9..0000000 --- a/teeproxy/gpproxy/certs/gen_ca_keycrt.sh +++ /dev/null @@ -1,22 +0,0 @@ -#! /bin/sh - -_openssl="openssl" - -CUR_DIR=$( dirname -- "$0"; ) - - -# CAKEYPEM=$HOME/.gpp/certs/ca_key.pem -# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem -CAKEYPEM=$CUR_DIR/ca_key.pem -CACRTPEM=$CUR_DIR/ca_crt.pem -RSAKEYLEN=2048 -EXPIREDAYS=3650 -SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=ca.org" - -echo -e '\n'generate $CAKEYPEM: -# $_openssl genrsa -passout pass:111111 -aes192 -out $CAKEYPEM ${RSAKEYLEN} -$_openssl genrsa -aes192 -out $CAKEYPEM ${RSAKEYLEN} - -echo -e '\n'generate $CACRTPEM: -# $_openssl req -passin pass:111111 -new -x509 -days 3650 -key $CAKEYPEM -out $CACRTPEM -subj ${SUBSTR} -$_openssl req -new -x509 -days ${EXPIREDAYS} -key $CAKEYPEM -out $CACRTPEM -subj ${SUBSTR} diff --git a/teeproxy/gpproxy/certs/gen_client_crt.sh b/teeproxy/gpproxy/certs/gen_client_crt.sh deleted file mode 100644 index 8bfa94f..0000000 --- a/teeproxy/gpproxy/certs/gen_client_crt.sh +++ /dev/null @@ -1,22 +0,0 @@ -#! /bin/sh - -_openssl="openssl" - -CUR_DIR=$( dirname -- "$0"; ) - - -# CAKEYPEM=$HOME/.gpp/certs/ca_key.pem -# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem -# CSRPEM=$HOME/.gpp/certs/client_csr.pem -# CRTPEM=$HOME/.gpp/certs/client_crt.pem -CAKEYPEM=$CUR_DIR/ca_key.pem -CACRTPEM=$CUR_DIR/ca_crt.pem -CSRPEM=$CUR_DIR/client_csr.pem -CRTPEM=$CUR_DIR/client_crt.pem -RSAKEYLEN=2048 -EXPIREDAYS=3650 -SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=gpclient.org" - -echo -e '\n'generate $CRTPEM: -# ${_openssl} x509 -req -passin pass:111111 -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM -${_openssl} x509 -req -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM diff --git a/teeproxy/gpproxy/certs/gen_client_keycsr.sh b/teeproxy/gpproxy/certs/gen_client_keycsr.sh deleted file mode 100644 index cbf8077..0000000 --- a/teeproxy/gpproxy/certs/gen_client_keycsr.sh +++ /dev/null @@ -1,22 +0,0 @@ -#! /bin/sh - -_openssl="openssl" - -CUR_DIR=$( dirname -- "$0"; ) - - -# KEYPEM=$HOME/.teecc/certs/client_key.pem -# CSRPEM=$HOME/.teecc/certs/client_csr.pem -KEYPEM=$CUR_DIR/client_key.pem -CSRPEM=$CUR_DIR/client_csr.pem -RSAKEYLEN=2048 -SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=gpclient.org" - -echo -e '\n'generate $KEYPEM: -# $_openssl genrsa -passout pass:111111 -aes192 -out $KEYPEM ${RSAKEYLEN} -$_openssl genrsa -aes192 -out $KEYPEM ${RSAKEYLEN} - -echo -e '\n'generate certgen request $CSRPEM: -# $_openssl req -passin pass:111111 -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} -$_openssl req -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} - diff --git a/teeproxy/gpproxy/certs/gen_server_crt.sh b/teeproxy/gpproxy/certs/gen_server_crt.sh deleted file mode 100644 index 56399b0..0000000 --- a/teeproxy/gpproxy/certs/gen_server_crt.sh +++ /dev/null @@ -1,32 +0,0 @@ -#! /bin/sh - -_openssl="openssl" - -CUR_DIR=$( dirname -- "$0"; ) - - -# CAKEYPEM=$HOME/.gpp/certs/ca_key.pem -# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem -# KEYPEM=$HOME/.gpp/certs/server_key.pem -# CSRPEM=$HOME/.gpp/certs/server_csr.pem -# CRTPEM=$HOME/.gpp/certs/server_crt.pem -CAKEYPEM=$CUR_DIR/ca_key.pem -CACRTPEM=$CUR_DIR/ca_crt.pem -KEYPEM=$CUR_DIR/server_key.pem -CSRPEM=$CUR_DIR/server_csr.pem -CRTPEM=$CUR_DIR/server_crt.pem -RSAKEYLEN=2048 -EXPIREDAYS=3650 -SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=gpserver.org" - -# echo -e '\n'generate $KEYPEM: -# $_openssl genrsa -passout pass:111111 -aes192 -out $KEYPEM ${RSAKEYLEN} -# $_openssl genrsa -aes192 -out $KEYPEM ${RSAKEYLEN} - -echo -e '\n'generate certgen request $CSRPEM: -# $_openssl req -passin pass:111111 -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} -$_openssl req -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} - -echo -e '\n'generate $CRTPEM: -# ${_openssl} x509 -req -passin pass:111111 -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM -${_openssl} x509 -req -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM diff --git a/teeproxy/gpproxy/certs/gen_server_keycrt.sh b/teeproxy/gpproxy/certs/gen_server_keycrt.sh deleted file mode 100644 index 977c6fd..0000000 --- a/teeproxy/gpproxy/certs/gen_server_keycrt.sh +++ /dev/null @@ -1,32 +0,0 @@ -#! /bin/sh - -_openssl="openssl" - -CUR_DIR=$( dirname -- "$0"; ) - - -# CAKEYPEM=$HOME/.gpp/certs/ca_key.pem -# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem -# KEYPEM=$HOME/.gpp/certs/server_key.pem -# CSRPEM=$HOME/.gpp/certs/server_csr.pem -# CRTPEM=$HOME/.gpp/certs/server_crt.pem -CAKEYPEM=$CUR_DIR/ca_key.pem -CACRTPEM=$CUR_DIR/ca_crt.pem -KEYPEM=$CUR_DIR/server_key.pem -CSRPEM=$CUR_DIR/server_csr.pem -CRTPEM=$CUR_DIR/server_crt.pem -RSAKEYLEN=2048 -EXPIREDAYS=3650 -SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=gpserver.org" - -echo -e '\n'generate $KEYPEM: -# $_openssl genrsa -passout pass:111111 -aes192 -out $KEYPEM ${RSAKEYLEN} -$_openssl genrsa -aes192 -out $KEYPEM ${RSAKEYLEN} - -echo -e '\n'generate certgen request $CSRPEM: -# $_openssl req -passin pass:111111 -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} -$_openssl req -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} - -echo -e '\n'generate $CRTPEM: -# ${_openssl} x509 -req -passin pass:111111 -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM -${_openssl} x509 -req -days ${EXPIREDAYS} -in $CSRPEM -CA $CACRTPEM -CAkey $CAKEYPEM -CAcreateserial -out $CRTPEM diff --git a/teeproxy/gpproxy/certs/msg.txt b/teeproxy/gpproxy/certs/msg.txt deleted file mode 100644 index 93388ad..0000000 --- a/teeproxy/gpproxy/certs/msg.txt +++ /dev/null @@ -1 +0,0 @@ -verify the integrity of a certificate and private key pair diff --git a/teeproxy/gpproxy/certs/server_crt.pem b/teeproxy/gpproxy/certs/server_crt.pem deleted file mode 100644 index 7c4aef6..0000000 --- a/teeproxy/gpproxy/certs/server_crt.pem +++ /dev/null @@ -1,20 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDTzCCAjcCFD3UsYh/aU1yUsNsej6x2MjHaxBNMA0GCSqGSIb3DQEBCwUAMGEx -CzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIdWJlaTEOMAwGA1UEBwwFV3VoYW4xEjAQ -BgNVBAoMCVRydXN0Q3V0ZTENMAsGA1UECwwEZ1JQQzEPMA0GA1UEAwwGY2Eub3Jn -MB4XDTIyMDgyMDA1MDAwN1oXDTMyMDgxNzA1MDAwN1owZzELMAkGA1UEBhMCQ04x -DjAMBgNVBAgMBUh1YmVpMQ4wDAYDVQQHDAVXdWhhbjESMBAGA1UECgwJVHJ1c3RD -dXRlMQ0wCwYDVQQLDARnUlBDMRUwEwYDVQQDDAxncHNlcnZlci5vcmcwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGXHn+5sLRKB2RUG3PF+rzLbCVfrfW -2Lgq6PB11M0Qg7+yHCKuZJPZYo1M4DyAjVaF/h24IMr7Vg5j/MqVjwW2Q84DMkmI -WkaHgo+7bqfZ2fIOlrRiUo9ilALRDL2S/NJfRF2Z5e6lu4XvchjnRpC+Pu3YrxhB -+2LJ7F061OyKal5ylXfbb0+/TE4zM30nrJR8R4OvPeQvrmea//s5m1DLy6p5R6ZJ -YZH33xRo2zCYLmID6RwHChJHQX6f48e2u2nqXk20Q6wIrBh5jY2ATL3l6b/mqZ5K -U0IdzrPPGrtUz9hiT8H0tnjarnvIp6ffEqx9cBAulNocIAfBSAiOK2zfAgMBAAEw -DQYJKoZIhvcNAQELBQADggEBACS+qheuLHDKewqkyFBoDOy4T16b7ula9oRl0NsZ -Veh7jiu6BT5xcAbSUIAS5oxlhGb+CEzwMHT9r5D5ZBmSk6MWeG8my5SfWq7GKa6Y -DsjwNM2Wm0lM9brQZObr4BWorSYhHz6rfiSc5IfpiDPe7wluTJX0RuHUsp2rbjwO -EPdiEISQYu8ugMbMc8uyTV9L0/3X9Hy210FDIgZ+B9Z7udqsgZkQ/DjmWITXpgd5 -1T8O91v3lp9LuFKv2PvzlD6h3fSc5ITlRqlzY52ql3Xece7jfNCpDsuGEWO00//q -x3hM5EYI8qp0FCLvfxD16TBIq34yCXq3NmdinGc/1PGulLU= ------END CERTIFICATE----- diff --git a/teeproxy/gpproxy/certs/server_key.pem b/teeproxy/gpproxy/certs/server_key.pem deleted file mode 100644 index be30821..0000000 --- a/teeproxy/gpproxy/certs/server_key.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: AES-192-CBC,FE8794441B351ACA7569D5F49605C874 - -YYmoW3nUds/a4CumjFwyZEyXcT5qVXOX3nxpFKnAQRu0oA83CmyLPxxKksKfpmu5 -RbTFCS06XP+1jKpnP7Bx9gT31WdfMdwlb1xQaQJkxWBqAQZNPdUHoY2aiyqy7Mzt -j5P6wmFdVsauOnfvh+lcIDP6AjxGfsLtqTXe7JXtxyR+VVXlNcyRewwRfcy5eEUT -OnSfcsgY9lgHkUT2gbzttvmUfWWhCHU4U+IMpC1pGFZx5njJV/pkKXNzESvoYmeb -PrKu0PN9oKg8i0Iina3/G5/uiRgUl3+EfhpUm2XtTXimNeVJ/s4/9yB/ysFIrura -QqzFMVxyMESD+eoGrcelX1Ow0bj8JKMzGvcQNRIE9dHuZ8htyhd5QV3N7jKzEiAE -wDoQdvOHzhblepibm0pfndi6BTy7tSRYC3wINF2e8rmxoMSVT+jIfTnpRG4finj+ -0ZTFHoDCyitgqvEAztG9+b4gel3lK5Xm1CayyGkBoFLDhl3iWlUIfDkd2mEaUyjf -N/mjs/AXZKZCT9ApNm6X2hzVrNPZBbOgTPdeQfstVJjxj4heCGn/kn2wciEpmZPG -geXAh357+wGngs+kzAy0p/nso1Lp2fYUui3uh5o8Acbc0/D1b1ysWyxvlE3vtkJ3 -uXqz3hgJNFmLLOk1/K8akGnQd9Hc15pQrNoE6of5w9FvkO7r3pIMNOptJDlz/ogj -Jn2TP2UJGC6EwCSJM+lUxum6BKt6nz+4n8Sl8aPGiBpr4tQIrEodWRHsixd+Vy6u -yUffB0DfL41X28O7bGOIpdhcIQG25mE65/idMoTYAtrvExQymZjCCBsbzlBiQcwk -4bzA+Wv5tCWyJjwJKJBKSYFBVcNf3P9micB5YDyIcpDmgwqYZxo5KAj4K4Fmm7er -hYMA+Jzd3SYemH/lUSDSlK438bv9d7P7qIm27QC6TngKW9or4b2F/gDy7iYjXm5Q -Gk7C39xTlIUwSQR/WMVCG8MhkkamuDWTiaj9BEydO8VeIQf7jWEsY5ShGTr+VxtI -3SeUjkmD6whqRrKJBgdlIINuBUpB8dVzVufchhtR9GNPqCWdaMFquVK1JcgWISb6 -LuXAGPmumhFER4oK7xmITmlIRxjgXkld5Qcj9wzmmISO7ChxCWhXKNd/fabPRrO1 -gNO2C41/JbNoshF9qZfyR/0uVJZGLFy+/YsHh0Hk6s7o+g1SxpWYc2QG1fcvPvIS -vPI/I0+J8MUzL0BjdJf8lb/A2kCGRRn2P7AfGiUsbkGT3lnshudWQDe+sEdxJpm4 -OcrFpbyghiJuxYoE6LwDb2wgMbujsHDccL8eKpBvdlqcxU48dl3sF1C6rTjFgRPT -KI8KMcyWxVNfjYn1pMPPLkz3TEQd/mwu8g7yU2JAe3oH79pZE5Qdjji5uPRXSqF/ -c2FAFH10cyct5UISeMofFnECecx7XbxaurjiDQ0wCzcKZ1aO07XIyfLtWoQZHFOi -UlceygZQgISxsofxNLXfx4mur1yI6snOg/BH8dBKzmi7UvaffGv1o0U4JMAGavXT -DyZPod78wf3DImX/FQT1QVCVXH11igUUQl0RrHUc0y+dAKxxFxevSmedNP++wkNm ------END RSA PRIVATE KEY----- diff --git a/teeproxy/gpproxy/changelog.md b/teeproxy/gpproxy/changelog.md deleted file mode 100644 index f66c4e1..0000000 --- a/teeproxy/gpproxy/changelog.md +++ /dev/null @@ -1,7 +0,0 @@ -# 更新日志 - -## [1.0.0] - 2022-10-11 - -### 新增 - -* 项目初始化,上传第一版 diff --git a/teeproxy/gpproxy/common.cmake b/teeproxy/gpproxy/common.cmake deleted file mode 100644 index 62099c5..0000000 --- a/teeproxy/gpproxy/common.cmake +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright 2018 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# cmake build file for C++ route_guide example. -# Assumes protobuf and gRPC have been installed using cmake. -# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build -# that automatically builds all the dependencies before building route_guide. - -cmake_minimum_required(VERSION 3.5.1) - -# set (CMAKE_CXX_STANDARD 11) -set (CMAKE_CXX_STANDARD 14) - -set (GRPC_FETCHCONTENT 1) - - -if(MSVC) - add_definitions(-D_WIN32_WINNT=0x600) -endif() - -find_package(Threads REQUIRED) - -if(GRPC_AS_SUBMODULE) - # One way to build a projects that uses gRPC is to just include the - # entire gRPC project tree via "add_subdirectory". - # This approach is very simple to use, but the are some potential - # disadvantages: - # * it includes gRPC's CMakeLists.txt directly into your build script - # without and that can make gRPC's internal setting interfere with your - # own build. - # * depending on what's installed on your system, the contents of submodules - # in gRPC's third_party/* might need to be available (and there might be - # additional prerequisites required to build them). Consider using - # the gRPC_*_PROVIDER options to fine-tune the expected behavior. - # - # A more robust approach to add dependency on gRPC is using - # cmake's ExternalProject_Add (see cmake_externalproject/CMakeLists.txt). - - # Include the gRPC's cmake build (normally grpc source code would live - # in a git submodule called "third_party/grpc", but this example lives in - # the same repository as gRPC sources, so we just look a few directories up) - add_subdirectory(../../.. ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL) - message(STATUS "Using gRPC via add_subdirectory.") - - # After using add_subdirectory, we can now use the grpc targets directly from - # this build. - set(_PROTOBUF_LIBPROTOBUF libprotobuf) - set(_REFLECTION grpc++_reflection) - if(CMAKE_CROSSCOMPILING) - find_program(_PROTOBUF_PROTOC protoc) - else() - set(_PROTOBUF_PROTOC $) - endif() - set(_GRPC_GRPCPP grpc++) - if(CMAKE_CROSSCOMPILING) - find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) - else() - set(_GRPC_CPP_PLUGIN_EXECUTABLE $) - endif() -elseif(GRPC_FETCHCONTENT) - # Another way is to use CMake's FetchContent module to clone gRPC at - # configure time. This makes gRPC's source code available to your project, - # similar to a git submodule. - message(STATUS "Using gRPC via add_subdirectory (FetchContent).") - include(FetchContent) - FetchContent_Declare( - grpc - GIT_REPOSITORY https://github.com/grpc/grpc.git - # when using gRPC, you will actually set this to an existing tag, such as - # v1.25.0, v1.26.0 etc.. - # For the purpose of testing, we override the tag used to the commit - # that's currently under test. - # GIT_TAG vGRPC_TAG_VERSION_OF_YOUR_CHOICE - GIT_TAG v1.48.0 - ) - FetchContent_MakeAvailable(grpc) - - # Since FetchContent uses add_subdirectory under the hood, we can use - # the grpc targets directly from this build. - set(_PROTOBUF_LIBPROTOBUF libprotobuf) - set(_REFLECTION grpc++_reflection) - set(_PROTOBUF_PROTOC $) - set(_GRPC_GRPCPP grpc++) - if(CMAKE_CROSSCOMPILING) - find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) - else() - set(_GRPC_CPP_PLUGIN_EXECUTABLE $) - endif() -else() - # This branch assumes that gRPC and all its dependencies are already installed - # on this system, so they can be located by find_package(). - - # Find Protobuf installation - # Looks for protobuf-config.cmake file installed by Protobuf's cmake installation. - set(protobuf_MODULE_COMPATIBLE TRUE) - find_package(Protobuf CONFIG REQUIRED) - message(STATUS "Using protobuf ${Protobuf_VERSION}") - - set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) - set(_REFLECTION gRPC::grpc++_reflection) - if(CMAKE_CROSSCOMPILING) - find_program(_PROTOBUF_PROTOC protoc) - else() - set(_PROTOBUF_PROTOC $) - endif() - - # Find gRPC installation - # Looks for gRPCConfig.cmake file installed by gRPC's cmake installation. - find_package(gRPC CONFIG REQUIRED) - message(STATUS "Using gRPC ${gRPC_VERSION}") - - set(_GRPC_GRPCPP gRPC::grpc++) - if(CMAKE_CROSSCOMPILING) - find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) - else() - set(_GRPC_CPP_PLUGIN_EXECUTABLE $) - endif() -endif() diff --git a/teeproxy/gpproxy/conf/gpproxy_config.yaml b/teeproxy/gpproxy/conf/gpproxy_config.yaml deleted file mode 100644 index 978cc84..0000000 --- a/teeproxy/gpproxy/conf/gpproxy_config.yaml +++ /dev/null @@ -1,19 +0,0 @@ -GPPROXY_ADDRESS: "[::]:50051" - -NAME_SERVER_KEY: "server_key.pem" -NAME_SERVER_CERT: "server_crt.pem" -NAME_CLIENTCA_CERT: "ca_crt.pem" - -# 0, no tls -# 1, only server certificate -# 2, server and client certificates -GRPC_TLS: 1 - -# 0, do not validate jwt -# 1, foreced to validate jwt -FORCE_VALIDATE_JWT: 1 - -MAX_NUM_THREAD: 128 -MAX_NUM_WORKER: 128 -TIMEDOUT_SESSION: 60 -TIMEDOUT_CONTEXT: 90 diff --git a/teeproxy/gpproxy/gpproxy.cc b/teeproxy/gpproxy/gpproxy.cc deleted file mode 100644 index b510d08..0000000 --- a/teeproxy/gpproxy/gpproxy.cc +++ /dev/null @@ -1,4195 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "gt.grpc.pb.h" -#include "gt.pb.h" - -#include "gpproxy.h" - -extern "C" { -#include "dbusc_gpw.h" -} - -#include "dbusc_jwt.h" -#include "yaml-cpp/yaml.h" - - -using grpc::Server; -using grpc::ServerBuilder; -using grpc::ServerContext; -using grpc::Status; -using grpc::ServerCompletionQueue; -using grpc::ServerAsyncResponseWriter; -using grpc::ServerAsyncReader; - -using grpc::experimental::AltsServerCredentials; -using grpc::experimental::AltsServerCredentialsOptions; - -using gt::gpp; -using gt::Inicont_Request; -using gt::Inicont_Reply; -using gt::Fincont_Request; -using gt::Fincont_Reply; -using gt::Opes_Reply; -using gt::Opes_Request; -using gt::Close_Reply; -using gt::Close_Request; -using gt::Invo_Reply; -using gt::Invo_Request; -using gt::TA_Chunk; -using gt::TA_Reply; -using gt::Setjwt_Request; -using gt::Setjwt_Reply; - - -#define NO_ERROR 0 - -std::string global_strcfgfiletemp = getenv("HOME"); -std::string global_strcfgfile = global_strcfgfiletemp + "/.gpp/gpproxy_config.yaml"; -YAML::Node glo_config = YAML::LoadFile(global_strcfgfile); -std::string gpproxy_address = glo_config["GPPROXY_ADDRESS"].as(); -std::string global_servercert_path = - global_strcfgfiletemp + "/.gpp/certs/" + glo_config["NAME_SERVER_CERT"].as(); -std::string global_serverkey_path = - global_strcfgfiletemp + "/.gpp/certs/" + glo_config["NAME_SERVER_KEY"].as(); -std::string global_clientcacert_path = - global_strcfgfiletemp + "/.gpp/certs/" + glo_config["NAME_CLIENTCA_CERT"].as(); -int grpc_tls = glo_config["GRPC_TLS"].as(); -int global_force_valideta_jwt = glo_config["FORCE_VALIDATE_JWT"].as(); - -int global_max_num_thread = glo_config["MAX_NUM_THREAD"].as(); -int global_max_num_worker = glo_config["MAX_NUM_WORKER"].as(); -int global_timeout_session = glo_config["TIMEDOUT_SESSION"].as(); -int global_timeout_context = glo_config["TIMEDOUT_CONTEXT"].as(); - - -static std::string get_file_contents(std::string fpath) -{ - std::ifstream finstream(fpath); - std::string contents; - contents.assign((std::istreambuf_iterator(finstream)), - std::istreambuf_iterator()); - finstream.close(); - return contents; -} - -bool utf8_check_is_valid(std::string &string) -{ - int c, i, ix, n, j; - for (i = 0, ix = string.length(); i < ix; i++) - { - c = (unsigned char) string[i]; - //if (c==0x09 || c==0x0a || c==0x0d || (0x20 <= c && c <= 0x7e) ) n = 0; // is_printable_ascii - if (0x00 <= c && c <= 0x7f) n = 0; // 0bbbbbbb - else if ((c & 0xE0) == 0xC0) n = 1; // 110bbbbb - else if (c == 0xed && i < (ix - 1) && ((unsigned char) string[i + 1] & 0xa0) == 0xa0) - return false; //U+d800 to U+dfff - else if ((c & 0xF0) == 0xE0) n = 2; // 1110bbbb - else if ((c & 0xF8) == 0xF0) n = 3; // 11110bbb - //else if (($c & 0xFC) == 0xF8) n=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8 - //else if (($c & 0xFE) == 0xFC) n=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8 - else return false; - for (j = 0; j < n && i < ix; j++) - { // n bytes matching 10bbbbbb follow ? - if ((++i == ix) || (((unsigned char) string[i] & 0xC0) != 0x80)) - return false; - } - } - return true; -} - - -#define MAX_DATA_LEN 50*1024 -#define SHA256_LENTH 32 - -int get_file_sha256(char *file_path, char *val) -{ - SHA256_CTX sha256_ctx; - FILE *fp = NULL; - char *strFilePath = file_path; - unsigned char SHA256result[SHA256_LENTH]; - char DataBuff[MAX_DATA_LEN]; - int len; - int t = 0; - int i; - std::string sha256; - - fp = fopen(strFilePath, "rb"); - - SHA256_Init(&sha256_ctx); - - while (!feof(fp)) - { - memset(DataBuff, 0x00, sizeof(DataBuff)); - - len = fread(DataBuff, 1, MAX_DATA_LEN, fp); - if (len) - { - t += len; - SHA256_Update(&sha256_ctx, DataBuff, len); - } - } - - fclose(fp); - SHA256_Final(SHA256result, &sha256_ctx); - - if (val == NULL || (sizeof(val) * 4) < SHA256_LENTH) - { - return -1; - } else - { - memset(val, 0, sizeof(val)); - memcpy(val, SHA256result, SHA256_LENTH); - } - - return 0; -} - -bool isFileExists_ifstream(std::string &name) -{ - std::ifstream f(name.c_str()); - return f.good(); -} - -void check_config() -{ - if (grpc_tls != 0 && grpc_tls != 1 && grpc_tls != 2) - { - std::cout << global_strcfgfile << " grpc_tls should be 0 or 1 or 2 " << std::endl; - exit(-1); - } - if (global_force_valideta_jwt != 0 && global_force_valideta_jwt != 1) - { - std::cout << global_strcfgfile << " global_force_valideta_jwt should be 0 or 1 " << std::endl; - exit(-1); - } - if (global_max_num_thread < 0 || global_max_num_thread > 128) - { - std::cout << global_strcfgfile << " global_max_num_thread should between 0 and 128 " << std::endl; - exit(-1); - } - if (global_max_num_worker < 0 || global_max_num_worker > 128) - { - std::cout << global_strcfgfile << " global_max_num_worker should between 0 and 128 " << std::endl; - exit(-1); - } - if (global_timeout_session <= 0) - { - std::cout << global_strcfgfile << " global_timeout_session should > 0 " << std::endl; - exit(-1); - } - if (global_timeout_context <= 0) - { - std::cout << global_strcfgfile << " global_timeout_context should > 0 " << std::endl; - exit(-1); - } - if (grpc_tls == 2) - { - if (!isFileExists_ifstream(global_servercert_path)) - { - std::cout << "error file : " << global_servercert_path << " is not exist " << std::endl; - exit(-1); - } - if (!isFileExists_ifstream(global_serverkey_path)) - { - std::cout << "error file : " << global_serverkey_path << " is not exist " << std::endl; - exit(-1); - } - if (!isFileExists_ifstream(global_clientcacert_path)) - { - std::cout << "error file : " << global_clientcacert_path << " is not exist " << std::endl; - exit(-1); - } - } - if (grpc_tls == 1) - { - if (!isFileExists_ifstream(global_servercert_path)) - { - std::cout << "error file : " << global_servercert_path << " is not exist " << std::endl; - exit(-1); - } - if (!isFileExists_ifstream(global_serverkey_path)) - { - std::cout << "error file : " << global_serverkey_path << " is not exist " << std::endl; - exit(-1); - } - } -} - -class ServerImpl final -{ -public: - ~ServerImpl() - { - server_->Shutdown(); - for (auto &cq: cq_) - cq->Shutdown(); - delete[] workerrec; - } - - ServerImpl() - { - pthread_mutex_init(&mutex_workerrec, NULL); - pthread_cond_init(&cond_notbusy, NULL); - for (int iworker = 0; iworker < global_max_num_worker; iworker++) - { - workerrec[iworker].busy = 0; - workerrec[iworker].context_fd = 0; - workerrec[iworker].context_addr = 0xffffffff; - workerrec[iworker].sessionid_count = 0; - workerrec[iworker].first = NULL; - workerrec[iworker].last = NULL; - } - } - - class CallData - { - - public: - - enum ServiceType - { - SS_TEECC_InitializeContext = 0, - SS_TEECC_FinalizeContext = 1, - SS_TEECC_OpenSession = 2, - SS_TEECC_CloseSession = 3, - SS_TEECC_InvokeCommand = 4, - SS_TEECC_TA = 5, - SS_TEECC_SetJwt = 6 - }; - - ~CallData() - { - - } - - CallData(gpp::AsyncService *service, - ServerCompletionQueue *cq, - ServiceType s_type, - pthread_mutex_t *mutex_workerrec, - pthread_cond_t *cond_notbusy, - wr_t *workerrec) - : service_(service), - cq_(cq), - s_type_(s_type), - mutex_workerrec_(mutex_workerrec), - cond_notbusy_(cond_notbusy), - workerrec_(workerrec), - inicont_response(&ctx_), - fincont_response(&ctx_), - opes_response(&ctx_), - close_response(&ctx_), - invo_response(&ctx_), - ta_response(&ctx_), - setjwt_response(&ctx_), - status_(CREATE) - { - Process(); - } - - void Process() - { - if (status_ == CREATE) - { - status_ = PROCESS; - switch (s_type_) - { - case ServerImpl::CallData::SS_TEECC_InitializeContext: - service_->RequestTEECC_InitializeContext(&ctx_, &inicont_request, &inicont_response, cq_, cq_, - this); - break; - case ServerImpl::CallData::SS_TEECC_FinalizeContext: - service_->RequestTEECC_FinalizeContext(&ctx_, &fincont_request, &fincont_response, cq_, cq_, this); - break; - case ServerImpl::CallData::SS_TEECC_OpenSession: - service_->RequestTEECC_OpenSession(&ctx_, &opes_request, &opes_response, cq_, cq_, this); - break; - case ServerImpl::CallData::SS_TEECC_InvokeCommand: - service_->RequestTEECC_InvokeCommand(&ctx_, &invo_request, &invo_response, cq_, cq_, this); - break; - case ServerImpl::CallData::SS_TEECC_CloseSession: - service_->RequestTEECC_CloseSession(&ctx_, &close_request, &close_response, cq_, cq_, this); - break; - case ServerImpl::CallData::SS_TEECC_TA: - service_->RequestTEECC_TA(&ctx_, &ta_chunk, &ta_response, cq_, cq_, this); - break; - case ServerImpl::CallData::SS_TEECC_SetJwt: - service_->RequestTEECC_SetJwt(&ctx_, &setjwt_request, &setjwt_response, cq_, cq_, this); - break; - default: - break; - } - - } else if (status_ == PROCESS) - { - status_ = FINISH; - new CallData(service_, cq_, this->s_type_, mutex_workerrec_, cond_notbusy_, workerrec_); - - switch (s_type_) - { - case ServerImpl::CallData::SS_TEECC_InitializeContext: - { - struct timeval start, end, jwt_validate_start, jwt_validate_end; - gettimeofday(&start, NULL); - - std::string name; - const uint8_t *name_temp = reinterpret_cast(name.c_str()); - std::size_t name_size; - std::int32_t in_context_fd; - std::string in_context_tapath; - const uint8_t *in_context_tapath_temp = NULL; - std::int32_t in_context_tapath_size; - unsigned char *charp = NULL; - std::string charpp; - std::uint64_t in_context_sessionlist_next; - std::uint64_t in_context_sessionlist_prev; - std::uint64_t in_context_shrdmemlist_next; - std::uint64_t in_context_shrdmemlist_prev; - std::uint64_t in_context_sharebuffer_buffer; - std::int64_t in_context_sharebuffer_bufferbarrier; - - std::uint32_t teecresult; - std::int32_t fd; - - unsigned char *ta_path = NULL; - std::int32_t ta_path_size = 0; - - std::uint64_t session_list_next; - std::uint64_t session_list_prev; - std::uint64_t shrd_mem_list_next; - std::uint64_t shrd_mem_list_prev; - std::uint64_t share_buffer_buffer; - std::int64_t share_buffer_buffer_barrier; - std::uint64_t context_addr; - - in_context_fd = 0; - in_context_tapath_size = 0; - in_context_sessionlist_next = 0; - in_context_sessionlist_prev = 0; - in_context_shrdmemlist_next = 0; - in_context_shrdmemlist_prev = 0; - in_context_sharebuffer_buffer = 0; - in_context_sharebuffer_bufferbarrier = 0; - - name_size = inicont_request.name_size(); - if (name_size > 0) - { - name = inicont_request.name(); - std::cout << "gpp received name: " << name << std::endl; - } - - std::uint32_t serial = 0; - std::int32_t flag = 0; - - std::string token; - token = inicont_request.token(); - - std::string noToken("noToken"); - int ivaljwtResult = -1; - int iforceValidateJwt = global_force_valideta_jwt; - - if - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - ) - { - char Token[1024]; - strcpy(Token, (char *) token.data()); - - gettimeofday(&jwt_validate_start, NULL); - ivaljwtResult = - dbusmethodcall_validate_jwt( - Token - ); - gettimeofday(&jwt_validate_end, NULL); - int64_t i64Time_jwt; - i64Time_jwt = (jwt_validate_end.tv_sec - jwt_validate_start.tv_sec) * 1000000 + - (jwt_validate_end.tv_usec - jwt_validate_start.tv_usec); - printf("gpp initcont validate jwt used time: %ld us. \n", i64Time_jwt); - - std::cout << "gpp validate initcont jwtsvid" << std::endl; - } else - { - std::cout << "gpp no validate initcont jwtsvid" << std::endl; - } - - if - ( - iforceValidateJwt != 1 - || - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - && - ivaljwtResult == NO_ERROR - ) - ) - { - std::cout << "gpp does not need validate initcont jwtsvid or validate jwt succed" << std::endl; - std::cout << "gpp received init context" << std::endl; - std::cout << "gpp received namesize: " << name_size << std::endl; - - ta_path = (unsigned char *) malloc(1024 * sizeof(char)); - ta_path_size = 1024; - memset((char *) ta_path, 0, 1024); - uint32_t context_tapath_outsize; - - char workername[1024]; - memset((char *) workername, 0, 1024); - int ifound = 0; - int iworker; - - for (;;) - { - pthread_mutex_lock(mutex_workerrec_); - for (iworker = 0; iworker < global_max_num_worker; iworker++) - { - if (workerrec_[iworker].busy == 0) - { - sprintf(workername, "%s%d", "gpworker", iworker); - std::cout << "gpp method call worker No: " << std::dec << iworker << std::endl; - workerrec_[iworker].busy = 1; - ifound = 1; - break; - } - } - if (ifound == 0) - { - pthread_cond_wait(cond_notbusy_, mutex_workerrec_); - } - pthread_mutex_unlock(mutex_workerrec_); - - if (ifound == 1) - { - break; - } - } - - method_call_teec_inicont( - workername, - - name_temp, - name_size, - in_context_fd, - in_context_tapath_temp, - in_context_tapath_size, - in_context_sessionlist_next, - in_context_sessionlist_prev, - in_context_shrdmemlist_next, - in_context_shrdmemlist_prev, - in_context_sharebuffer_buffer, - in_context_sharebuffer_bufferbarrier, - - &teecresult, - - &fd, - ta_path, - ta_path_size, - &session_list_next, - &session_list_prev, - &shrd_mem_list_next, - &shrd_mem_list_prev, - &share_buffer_buffer, - &share_buffer_buffer_barrier, - &context_addr, - &context_tapath_outsize - ); - - if (teecresult == 0) - { - pthread_mutex_lock(mutex_workerrec_); - workerrec_[iworker].context_fd = fd; - workerrec_[iworker].context_addr = context_addr; - workerrec_[iworker].first = NULL; - workerrec_[iworker].last = NULL; - workerrec_[iworker].sessionid_count = 0; - struct timeval tvcreate; - gettimeofday(&tvcreate, NULL); - workerrec_[iworker].context_createtime = tvcreate; - pthread_mutex_unlock(mutex_workerrec_); - } else - { - workerrec_[iworker].busy = 0; - } - - if (ta_path_size >= context_tapath_outsize) - { - ta_path_size = context_tapath_outsize; - charp = ta_path; - } else - { - ta_path_size = 0; - charp = NULL; - } - inicont_reply.set_teecresult(teecresult); - inicont_reply.set_context_fd(fd); - inicont_reply.set_context_tapath_outsize(ta_path_size); - - if (ta_path_size > 0 && - charp != NULL && - strlen((const char *) charp) > 0 - ) - { - charpp = (const char *) charp; - if (utf8_check_is_valid(charpp)) - { - ta_path_size = strlen((const char *) charp); - } else - { - ta_path_size = 0; - } - } else - { - ta_path_size = 0; - } - if (ta_path_size > 0) - { - inicont_reply.set_context_tapath(charpp); - } - - inicont_reply.set_context_sessionlist_next(session_list_next); - inicont_reply.set_context_sessionlist_prev(session_list_prev); - inicont_reply.set_context_shrdmemlist_prev(shrd_mem_list_prev); - inicont_reply.set_context_shrdmemlist_next(shrd_mem_list_next); - inicont_reply.set_context_sharebuffer_buffer(share_buffer_buffer); - inicont_reply.set_context_sharebuffer_bufferbarrier(share_buffer_buffer_barrier); - inicont_reply.set_context_addr(context_addr); - - status_ = FINISH; - gettimeofday(&end, NULL); - int64_t i64Time; - i64Time = (end.tv_sec - start.tv_sec) * 1000000 + - (end.tv_usec - start.tv_usec); - printf("gpp initcont used time: %ld us. \n", i64Time); - - inicont_response.Finish(inicont_reply, Status::OK, this); - } else - { - std::cout << "gpp receive no initcont jwtsvid or validate jwt failed" << std::endl; - flag = 2; - inicont_reply.set_flag(flag); - status_ = FINISH; - - inicont_response.Finish(inicont_reply, Status::OK, this); - } - break; - } - - case ServerImpl::CallData::SS_TEECC_FinalizeContext: - { - struct timeval start, end, jwt_validate_start, jwt_validate_end; - gettimeofday(&start, NULL); - - std::int32_t in_context_fd; - std::string in_context_tapath; - const uint8_t *in_context_tapath_temp = NULL; - std::int32_t in_context_tapath_size; - unsigned char *charp = NULL; - std::string charpp; - std::uint64_t in_context_sessionlist_next; - std::uint64_t in_context_sessionlist_prev; - std::uint64_t in_context_shrdmemlist_next; - std::uint64_t in_context_shrdmemlist_prev; - std::uint64_t in_context_sharebuffer_buffer; - std::int64_t in_context_sharebuffer_bufferbarrier; - std::uint64_t in_context_addr; - - std::uint32_t teecresult; - std::int32_t fd; - - unsigned char *ta_path = NULL; - std::int32_t ta_path_size = 0; - - std::uint64_t session_list_next; - std::uint64_t session_list_prev; - std::uint64_t shrd_mem_list_next; - std::uint64_t shrd_mem_list_prev; - std::uint64_t share_buffer_buffer; - std::int64_t share_buffer_buffer_barrier; - - std::uint32_t serial = 0; - std::int32_t flag = 0; - std::string token; - token = fincont_request.token(); - std::string noToken("noToken"); - int ivaljwtResult = -1; - int iforceValidateJwt = global_force_valideta_jwt; - if - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - ) - { - char Token[1024]; - strcpy(Token, (char *) token.data()); - - gettimeofday(&jwt_validate_start, NULL); - ivaljwtResult = - dbusmethodcall_validate_jwt( - Token - ); - gettimeofday(&jwt_validate_end, NULL); - int64_t i64Time_jwt; - i64Time_jwt = (jwt_validate_end.tv_sec - jwt_validate_start.tv_sec) * 1000000 + - (jwt_validate_end.tv_usec - jwt_validate_start.tv_usec); - printf("gpp finacont validate jwt used time: %ld us. \n", i64Time_jwt); - - std::cout << "gpp validate finacont jwtsvid" << std::endl; - } else - { - std::cout << "gpp no validate finacont jwtsvid" << std::endl; - } - - if - ( - iforceValidateJwt != 1 - || - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - && - ivaljwtResult == NO_ERROR - ) - ) - { - std::cout << "gpp does not need validate finacont jwtsvid or validate jwt succed" << std::endl; - std::cout << "gpp received fincontext" << std::endl; - in_context_fd = fincont_request.in_context_fd(); - in_context_tapath_size = fincont_request.in_context_tapath_size(); - if (in_context_tapath_size > 0) - { - in_context_tapath = fincont_request.in_context_tapath(); - in_context_tapath_temp = reinterpret_cast(in_context_tapath.c_str()); - std::cout << "gpp received in_context_tapath_temp: " << in_context_tapath_temp - << std::endl; - } - - std::cout << "gpp received in_context_fd: " << in_context_fd << std::endl; - in_context_sessionlist_next = fincont_request.in_context_sessionlist_next(); - in_context_sessionlist_prev = fincont_request.in_context_sessionlist_prev(); - in_context_shrdmemlist_next = fincont_request.in_context_shrdmemlist_next(); - in_context_shrdmemlist_prev = fincont_request.in_context_shrdmemlist_prev(); - in_context_sharebuffer_buffer = fincont_request.in_context_shrdmemlist_prev(); - in_context_sharebuffer_bufferbarrier = fincont_request.in_context_sharebuffer_bufferbarrier(); - in_context_addr = fincont_request.in_context_addr(); - - - ta_path = (unsigned char *) malloc(1024 * sizeof(char)); - ta_path_size = 1024; - memset((char *) ta_path, 0, 1024); - uint32_t context_tapath_outsize; - - char workername[1024]; - memset((char *) workername, 0, 1024); - int ifound = 0; - int iworker; - pthread_mutex_lock(mutex_workerrec_); - for (iworker = 0; iworker < global_max_num_worker; iworker++) - { - if (workerrec_[iworker].context_fd == in_context_fd && - workerrec_[iworker].context_addr == in_context_addr - ) - { - sprintf(workername, "%s%d", "gpworker", iworker); - std::cout << "gpp method call worker No: " << std::dec << iworker << std::endl; - ifound = 1; - break; - } - } - pthread_mutex_unlock(mutex_workerrec_); - - if (ifound == 0) - { - printf("gpp can't find the worker for the context. \n"); - - fd = 0; - ta_path_size = 0; - charp = NULL; - session_list_prev = 0; - shrd_mem_list_next = 0; - shrd_mem_list_prev = 0; - share_buffer_buffer = 0; - share_buffer_buffer_barrier = 0; - - fincont_reply.set_context_fd(fd); - fincont_reply.set_context_tapath_outsize(ta_path_size); - fincont_reply.set_context_sessionlist_prev(session_list_prev); - fincont_reply.set_context_shrdmemlist_prev(shrd_mem_list_prev); - fincont_reply.set_context_shrdmemlist_next(shrd_mem_list_next); - fincont_reply.set_context_sharebuffer_buffer(share_buffer_buffer); - fincont_reply.set_context_sharebuffer_bufferbarrier(share_buffer_buffer_barrier); - - status_ = FINISH; - - fincont_response.Finish(fincont_reply, Status::OK, this); - } else - { - pthread_mutex_unlock(mutex_workerrec_); - sin_t *sinIns = NULL; - sin_t *sinInsPrev = NULL; - sinIns = workerrec_[iworker].last; - if (sinIns != NULL) - { - uint32_t in_session_seesionid; - uint32_t in_session_serviceid_timelow = 0; - uint32_t in_session_serviceid_timemid = 0; - uint32_t in_session_serviceid_timehiandver = 0; - uint32_t in_session_serviceid_clockseqandnode_size = 8; - uint32_t in_session_serviceid_clockseqandnode[8]; - uint32_t in_session_opscnt = 0; - uint64_t in_session_head_next = 0; - uint64_t in_session_head_prev = 0; - uint64_t in_session_context; - - uint32_t seesionid; - uint32_t serviceid_timelow; - uint32_t serviceid_timemid; - uint32_t serviceid_timehiandver; - uint32_t *serviceid_clockseqandnode; - int serviceid_clockseqandnode_realsize; - uint32_t opscnt; - uint64_t head_next; - uint64_t head_prev; - uint64_t session_context; - - for (;;) - { - in_session_seesionid = sinIns->session_id; - in_session_context = workerrec_[iworker].context_addr; - - pthread_mutex_unlock(mutex_workerrec_); - - for (int iind = 0; iind < 8; iind++) - { - in_session_serviceid_clockseqandnode[iind] = 0; - } - - uint32_t serviceid_clockseqandnode_outsize_temp; - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(uint32_t) - ); - - printf("\ngpp self method call teec closesession before finalizecontext \n"); - method_call_teec_closesession( - workername, - - in_session_seesionid, - in_session_serviceid_timelow, - in_session_serviceid_timemid, - in_session_serviceid_timehiandver, - in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_size, - in_session_opscnt, - in_session_head_next, - in_session_head_prev, - in_session_context, - - &seesionid, - &serviceid_timelow, - &serviceid_timemid, - &serviceid_timehiandver, - serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize, - &serviceid_clockseqandnode_outsize_temp, - &opscnt, - &head_next, - &head_prev, - &session_context - ); - - if (serviceid_clockseqandnode != NULL) - { - free(serviceid_clockseqandnode); - } - - pthread_mutex_lock(mutex_workerrec_); - - sinInsPrev = sinIns->prev; - free(sinIns); - if (sinInsPrev == NULL) - { - break; - } - sinIns = sinInsPrev; - } - } - pthread_mutex_unlock(mutex_workerrec_); - - method_call_teec_fincont( - workername, - - in_context_fd, - in_context_tapath_temp, - in_context_tapath_size, - in_context_sessionlist_next, - in_context_sessionlist_prev, - in_context_shrdmemlist_next, - in_context_shrdmemlist_prev, - in_context_sharebuffer_buffer, - in_context_sharebuffer_bufferbarrier, - in_context_addr, - - &fd, - ta_path, - ta_path_size, - &session_list_next, - &session_list_prev, - &shrd_mem_list_next, - &shrd_mem_list_prev, - &share_buffer_buffer, - &share_buffer_buffer_barrier, - &context_tapath_outsize - ); - - pthread_mutex_lock(mutex_workerrec_); - workerrec_[iworker].busy = 0; - pthread_cond_signal(cond_notbusy_); - workerrec_[iworker].context_fd = 0; - workerrec_[iworker].context_addr = 0xffffffff; - workerrec_[iworker].sessionid_count = 0; - workerrec_[iworker].first = NULL; - workerrec_[iworker].last = NULL; - pthread_mutex_unlock(mutex_workerrec_); - - if (ta_path_size >= context_tapath_outsize) - { - ta_path_size = context_tapath_outsize; - charp = ta_path; - } else - { - ta_path_size = 0; - charp = NULL; - } - fincont_reply.set_context_fd(fd); - fincont_reply.set_context_tapath_outsize(ta_path_size); - - if (ta_path_size > 0 && - charp != NULL && - strlen((const char *) charp) > 0 - ) - { - charpp = (const char *) charp; - if (utf8_check_is_valid(charpp)) - { - ta_path_size = strlen((const char *) charp); - } else - { - ta_path_size = 0; - } - } else - { - ta_path_size = 0; - } - if (ta_path_size > 0) - { - fincont_reply.set_context_tapath(charpp); - } - - fincont_reply.set_context_sessionlist_next(session_list_next); - fincont_reply.set_context_sessionlist_prev(session_list_prev); - fincont_reply.set_context_shrdmemlist_prev(shrd_mem_list_prev); - fincont_reply.set_context_shrdmemlist_next(shrd_mem_list_next); - fincont_reply.set_context_sharebuffer_buffer(share_buffer_buffer); - fincont_reply.set_context_sharebuffer_bufferbarrier(share_buffer_buffer_barrier); - - status_ = FINISH; - gettimeofday(&end, NULL); - int64_t i64Time; - i64Time = (end.tv_sec - start.tv_sec) * 1000000 + - (end.tv_usec - start.tv_usec); - printf("gpp finalcontext used time: %ld us. \n", i64Time); - - fincont_response.Finish(fincont_reply, Status::OK, this); - } - }else - { - std::cout << "gpp receive no finacont jwtsvid or validate jwt failed" << std::endl; - flag = 2; - fincont_reply.set_flag(flag); - status_ = FINISH; - fincont_response.Finish(fincont_reply, Status::OK, this); - } - break; - } - - case ServerImpl::CallData::SS_TEECC_OpenSession: - { - struct timeval start, end, jwt_validate_start, jwt_validate_end; - gettimeofday(&start, NULL); - - std::int32_t in_context_fd; - std::string in_context_tapath; - const uint8_t *in_context_tapath_temp = NULL; - std::int32_t in_context_tapath_size; - unsigned char *charp = NULL; - std::string charpp; - std::uint64_t in_context_sessionlist_next; - std::uint64_t in_context_sessionlist_prev; - std::uint64_t in_context_shrdmemlist_next; - std::uint64_t in_context_shrdmemlist_prev; - std::uint64_t in_context_sharebuffer_buffer; - std::int64_t in_context_sharebuffer_bufferbarrier; - - std::uint32_t teecresult; - std::int32_t fd; - - std::uint32_t in_destination_timelow; - std::uint32_t in_destination_timemid; - std::uint32_t in_destination_timehiandver; - - std::uint32_t in_connectionmethod; - std::uint64_t in_connectiondata; - std::uint32_t in_operation_started; - std::uint32_t in_operation_paramtypes; - std::int32_t in_destination_clockseqandnode_size; - std::uint32_t *in_destination_clockseqandnode; - - std::uint64_t in_operation_param1_tmpref_buffer; - std::uint32_t in_operation_param1_tmpref_size; - std::uint64_t in_operation_param1_memref_parent; - std::uint32_t in_operation_param1_memref_size; - std::uint32_t in_operation_param1_memref_offset; - std::uint32_t in_operation_param1_value_a; - std::uint32_t in_operation_param1_value_b; - std::int32_t in_operation_param1_ionref_ionsharefd; - std::uint32_t in_operation_param1_ionref_ionsize; - - std::uint64_t in_operation_param2_tmpref_buffer; - std::uint32_t in_operation_param2_tmpref_size; - std::uint64_t in_operation_param2_memref_parent; - std::uint32_t in_operation_param2_memref_size; - std::uint32_t in_operation_param2_memref_offset; - std::uint32_t in_operation_param2_value_a; - std::uint32_t in_operation_param2_value_b; - std::int32_t in_operation_param2_ionref_ionsharefd; - std::uint32_t in_operation_param2_ionref_ionsize; - - std::uint64_t in_operation_param3_tmpref_buffer; - std::uint32_t in_operation_param3_tmpref_size; - std::uint64_t in_operation_param3_memref_parent; - std::uint32_t in_operation_param3_memref_size; - std::uint32_t in_operation_param3_memref_offset; - std::uint32_t in_operation_param3_value_a; - std::uint32_t in_operation_param3_value_b; - std::int32_t in_operation_param3_ionref_ionsharefd; - std::uint32_t in_operation_param3_ionref_ionsize; - - std::uint64_t in_operation_param4_tmpref_buffer; - std::uint32_t in_operation_param4_tmpref_size; - std::uint64_t in_operation_param4_memref_parent; - std::uint32_t in_operation_param4_memref_size; - std::uint32_t in_operation_param4_memref_offset; - std::uint32_t in_operation_param4_value_a; - std::uint32_t in_operation_param4_value_b; - std::int32_t in_operation_param4_ionref_ionsharefd; - std::uint32_t in_operation_param4_ionref_ionsize; - - std::uint64_t in_operation_session; - std::int32_t in_operation_cancelflag; - std::uint32_t in_returnorigin; - - std::uint64_t in_context_addr; - - unsigned char *ta_path = NULL; - std::int32_t ta_path_size = 0; - - std::uint64_t session_list_next; - std::uint64_t session_list_prev; - std::uint64_t shrd_mem_list_next; - std::uint64_t shrd_mem_list_prev; - std::uint64_t share_buffer_buffer; - std::int64_t share_buffer_buffer_barrier; - - std::uint32_t sessionid; - std::uint32_t serviceid_timelow; - std::uint32_t serviceid_timemid; - std::uint32_t serviceid_timehiandver; - std::uint32_t *serviceid_clockseqandnode; - int serviceid_clockseqandnode_realsize; - std::int32_t serviceid_clockseqandnode_outsize; - std::uint32_t opscnt; - std::uint64_t head_next; - std::uint64_t head_prev; - std::uint64_t session_context; - std::uint32_t started; - std::uint32_t paramtypes; - std::uint64_t operation_param1_tmpref_buffer; - std::uint32_t operation_param1_tmpref_size; - std::uint64_t operation_param1_memref_parent; - std::uint32_t operation_param1_memref_size; - std::uint32_t operation_param1_memref_offset; - std::uint32_t operation_param1_value_a; - std::uint32_t operation_param1_value_b; - std::int32_t operation_param1_ionref_ionsharefd; - std::uint32_t operation_param1_ionref_ionsize; - std::uint64_t operation_param2_tmpref_buffer; - std::uint32_t operation_param2_tmpref_size; - std::uint64_t operation_param2_memref_parent; - std::uint32_t operation_param2_memref_size; - std::uint32_t operation_param2_memref_offset; - std::uint32_t operation_param2_value_a; - std::uint32_t operation_param2_value_b; - std::int32_t operation_param2_ionref_ionsharefd; - std::uint32_t operation_param2_ionref_ionsize; - std::uint64_t operation_param3_tmpref_buffer; - std::uint32_t operation_param3_tmpref_size; - std::uint64_t operation_param3_memref_parent; - std::uint32_t operation_param3_memref_size; - std::uint32_t operation_param3_memref_offset; - std::uint32_t operation_param3_value_a; - std::uint32_t operation_param3_value_b; - std::int32_t operation_param3_ionref_ionsharefd; - std::uint32_t operation_param3_ionref_ionsize; - std::uint64_t operation_param4_tmpref_buffer; - std::uint32_t operation_param4_tmpref_size; - std::uint64_t operation_param4_memref_parent; - std::uint32_t operation_param4_memref_size; - std::uint32_t operation_param4_memref_offset; - std::uint32_t operation_param4_value_a; - std::uint32_t operation_param4_value_b; - std::int32_t operation_param4_ionref_ionsharefd; - std::uint32_t operation_param4_ionref_ionsize; - std::uint64_t operation_session; - std::int32_t operation_cancelflag; - std::uint32_t returnorigin; - - std::uint32_t serial = 0; - std::int32_t flag = 0; - std::string token; - token = opes_request.token(); - - std::string noToken("noToken"); - - int ivaljwtResult = -1; - int iforceValidateJwt = global_force_valideta_jwt; - - if - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - ) - { - char Token[1024]; - strcpy(Token, (char *) token.data()); - gettimeofday(&jwt_validate_start, NULL); - ivaljwtResult = - dbusmethodcall_validate_jwt( - Token - ); - gettimeofday(&jwt_validate_end, NULL); - int64_t i64Time_jwt; - i64Time_jwt = (jwt_validate_end.tv_sec - jwt_validate_start.tv_sec) * 1000000 + - (jwt_validate_end.tv_usec - jwt_validate_start.tv_usec); - printf("gpp opensession validate jwt used time: %ld us. \n", i64Time_jwt); - std::cout << "gpp validate opensession jwtsvid" << std::endl; - } else - { - std::cout << "gpp no validate opensession jwtsvid" << std::endl; - } - - if - ( - iforceValidateJwt != 1 - || - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - && - ivaljwtResult == NO_ERROR - ) - ) - { - std::cout << "gpp does not need validate opensession jwtsvid or validate jwt succed" - << std::endl; - std::cout << "gpp received OpenSession" << std::endl; - in_context_fd = opes_request.in_context_fd(); - in_context_tapath_size = opes_request.in_context_tapath_size(); - if (in_context_tapath_size > 0) - { - in_context_tapath = opes_request.in_context_tapath(); - in_context_tapath_temp = reinterpret_cast(in_context_tapath.c_str()); - std::cout << "gpp received in_context_tapath_temp: " << in_context_tapath_temp - << std::endl; - } - std::cout << "gpp received in_context_fd: " << std::dec << in_context_fd - << std::endl; - std::cout << "gpp received in_context_tapath_size: " << std::dec - << in_context_tapath_size - << std::endl; - in_context_sessionlist_next = opes_request.in_context_sessionlist_next(); - in_context_sessionlist_prev = opes_request.in_context_sessionlist_prev(); - in_context_shrdmemlist_next = opes_request.in_context_shrdmemlist_next(); - in_context_shrdmemlist_prev = opes_request.in_context_shrdmemlist_prev(); - in_context_sharebuffer_buffer = opes_request.in_context_shrdmemlist_prev(); - in_context_sharebuffer_bufferbarrier = opes_request.in_context_sharebuffer_bufferbarrier(); - in_destination_timelow = opes_request.in_destination_timelow(); - in_destination_timemid = opes_request.in_destination_timemid(); - - in_destination_timehiandver = opes_request.in_destination_timehiandver(); - in_destination_clockseqandnode_size = opes_request.in_destination_clockseqandnode_size(); - if (in_destination_clockseqandnode_size > 0) - { - in_destination_clockseqandnode = new uint32_t[in_destination_clockseqandnode_size]; - for (int i = 0; i < in_destination_clockseqandnode_size; i++) - { - in_destination_clockseqandnode[i] = opes_request.in_destination_clockseqandnode( - i); - } - } - - in_connectionmethod = opes_request.in_connectionmethod(); - in_connectiondata = opes_request.in_connectiondata(); - in_operation_started = opes_request.in_operation_started(); - in_operation_paramtypes = opes_request.in_operation_paramtypes(); - in_operation_param1_tmpref_buffer = opes_request.in_operation_param1_tmpref_buffer(); - in_operation_param1_tmpref_size = opes_request.in_operation_param1_tmpref_size(); - in_operation_param1_memref_parent = opes_request.in_operation_param1_memref_parent(); - in_operation_param1_memref_size = opes_request.in_operation_param1_memref_size(); - in_operation_param1_memref_offset = opes_request.in_operation_param1_memref_offset(); - in_operation_param1_value_a = opes_request.in_operation_param1_value_a(); - in_operation_param1_value_b = opes_request.in_operation_param1_value_b(); - in_operation_param1_ionref_ionsharefd = opes_request.in_operation_param1_ionref_ionsharefd(); - in_operation_param1_ionref_ionsize = opes_request.in_operation_param1_ionref_ionsize(); - - in_operation_param2_tmpref_buffer = opes_request.in_operation_param2_tmpref_buffer(); - in_operation_param2_tmpref_size = opes_request.in_operation_param2_tmpref_size(); - in_operation_param2_memref_parent = opes_request.in_operation_param2_memref_parent(); - in_operation_param2_memref_size = opes_request.in_operation_param2_memref_size(); - in_operation_param2_memref_offset = opes_request.in_operation_param2_memref_offset(); - in_operation_param2_value_a = opes_request.in_operation_param2_value_a(); - in_operation_param2_value_b = opes_request.in_operation_param2_value_b(); - in_operation_param2_ionref_ionsharefd = opes_request.in_operation_param2_ionref_ionsharefd(); - in_operation_param2_ionref_ionsize = opes_request.in_operation_param2_ionref_ionsize(); - - in_operation_param3_tmpref_buffer = opes_request.in_operation_param3_tmpref_buffer(); - in_operation_param3_tmpref_size = opes_request.in_operation_param3_tmpref_size(); - in_operation_param3_memref_parent = opes_request.in_operation_param3_memref_parent(); - in_operation_param3_memref_size = opes_request.in_operation_param3_memref_size(); - in_operation_param3_memref_offset = opes_request.in_operation_param3_memref_offset(); - in_operation_param3_value_a = opes_request.in_operation_param3_value_a(); - in_operation_param3_value_b = opes_request.in_operation_param3_value_b(); - in_operation_param3_ionref_ionsharefd = opes_request.in_operation_param3_ionref_ionsharefd(); - in_operation_param3_ionref_ionsize = opes_request.in_operation_param3_ionref_ionsize(); - - in_operation_param4_tmpref_buffer = opes_request.in_operation_param4_tmpref_buffer(); - in_operation_param4_tmpref_size = opes_request.in_operation_param4_tmpref_size(); - in_operation_param4_memref_parent = opes_request.in_operation_param4_memref_parent(); - in_operation_param4_memref_size = opes_request.in_operation_param4_memref_size(); - in_operation_param4_memref_offset = opes_request.in_operation_param4_memref_offset(); - in_operation_param4_value_a = opes_request.in_operation_param4_value_a(); - in_operation_param4_value_b = opes_request.in_operation_param4_value_b(); - in_operation_param4_ionref_ionsharefd = opes_request.in_operation_param4_ionref_ionsharefd(); - in_operation_param4_ionref_ionsize = opes_request.in_operation_param4_ionref_ionsize(); - - in_operation_session = opes_request.in_operation_session(); - in_operation_cancelflag = opes_request.in_operation_cancelflag(); - in_returnorigin = opes_request.in_returnorigin(); - in_context_addr = opes_request.in_context_addr(); -#if 0 - printf(" in_session_list_next = 0x %16.16lx \n", in_context_sessionlist_next); - printf(" in_session_list_prev = 0x %16.16lx \n", in_context_sessionlist_prev); - printf(" in_shrd_mem_list_next = 0x %16.16lx \n", in_context_shrdmemlist_next); - printf(" in_shrd_mem_list_prev = 0x %16.16lx \n", in_context_shrdmemlist_prev); - printf(" in_share_buffer_buffer = 0x %16.16lx \n", in_context_sharebuffer_buffer); - printf(" in_share_buffer_buffer_barrier = 0x %16.16lx \n", in_context_sharebuffer_bufferbarrier); - - printf(" in_destination_timelow = 0x %8.8x \n", in_destination_timelow); - printf(" in_destination_timemid = 0x %8.8x \n", in_destination_timemid); - printf(" in_destination_timehiandver = 0x %8.8x \n", in_destination_timehiandver); - if ( in_destination_clockseqandnode_size > 0 ) - { - printf(" in_destination_clockseqandnode = \n"); - printf(" "); - for (int i = 0; i < in_destination_clockseqandnode_size; i++) { - printf(" %8.8x", in_destination_clockseqandnode[i]); - } - printf("\n"); - } - else - { - printf(" in_destination_clockseqandnode addr = 0x %16.16lx \n", - (long unsigned int)in_destination_clockseqandnode - ); - } - printf(" in_destination_clockseqandnode_size = 0x %8.8x \n", in_destination_clockseqandnode_size); - - printf(" in_connectionmethod = 0x %8.8x \n", in_connectionmethod); - printf(" in_connectiondata = 0x %16.16lx \n", in_connectiondata); - - printf(" in_operation_started = 0x %8.8x \n", in_operation_started); - printf(" in_operation_paramtypes = 0x %8.8x \n", in_operation_paramtypes); - - printf(" in_operation_param1_tmpref_buffer = 0x %16.16lx \n", in_operation_param1_tmpref_buffer); - printf(" in_operation_param1_tmpref_size = 0x %8.8x \n", in_operation_param1_tmpref_size); - printf(" in_operation_param1_memref_parent = 0x %16.16lx \n", in_operation_param1_memref_parent); - printf(" in_operation_param1_memref_size = 0x %8.8x \n", in_operation_param1_memref_size); - printf(" in_operation_param1_memref_offset = 0x %8.8x \n", in_operation_param1_memref_offset); - printf(" in_operation_param1_value_a = 0x %8.8x \n", in_operation_param1_value_a); - printf(" in_operation_param1_value_b = 0x %8.8x \n", in_operation_param1_value_b); - printf(" in_operation_param1_ionref_ionsharefd = 0x %8.8x \n", - in_operation_param1_ionref_ionsharefd); - printf(" in_operation_param1_ionref_ionsize = 0x %8.8x \n", in_operation_param1_ionref_ionsize); - - printf(" in_operation_param2_tmpref_buffer = 0x %16.16lx \n", in_operation_param2_tmpref_buffer); - printf(" in_operation_param2_tmpref_size = 0x %8.8x \n", in_operation_param2_tmpref_size); - printf(" in_operation_param2_memref_parent = 0x %16.16lx \n", in_operation_param2_memref_parent); - printf(" in_operation_param2_memref_size = 0x %8.8x \n", in_operation_param2_memref_size); - printf(" in_operation_param2_memref_offset = 0x %8.8x \n", in_operation_param2_memref_offset); - printf(" in_operation_param2_value_a = 0x %8.8x \n", in_operation_param3_value_a); - printf(" in_operation_param2_value_b = 0x %8.8x \n", in_operation_param3_value_b); - printf(" in_operation_param2_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); - printf(" in_operation_param2_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); - - printf(" in_operation_param3_tmpref_buffer = 0x %16.16lx \n", in_operation_param3_tmpref_buffer); - printf(" in_operation_param3_tmpref_size = 0x %8.8x \n", in_operation_param3_tmpref_size); - printf(" in_operation_param3_memref_parent = 0x %16.16lx \n", in_operation_param3_memref_parent); - printf(" in_operation_param3_memref_size = 0x %8.8x \n", in_operation_param3_memref_size); - printf(" in_operation_param3_memref_offset = 0x %8.8x \n", in_operation_param3_memref_offset); - printf(" in_operation_param3_value_a = 0x %8.8x \n", in_operation_param3_value_a); - printf(" in_operation_param3_value_b = 0x %8.8x \n", in_operation_param3_value_b); - printf(" in_operation_param3_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); - printf(" in_operation_param3_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); - - printf(" in_operation_param4_tmpref_buffer = 0x %16.16lx \n", in_operation_param4_tmpref_buffer); - printf(" in_operation_param4_tmpref_size = 0x %8.8x \n", in_operation_param4_tmpref_size); - printf(" in_operation_param4_memref_parent = 0x %16.16lx \n", in_operation_param4_memref_parent); - printf(" in_operation_param4_memref_size = 0x %8.8x \n", in_operation_param4_memref_size); - printf(" in_operation_param4_memref_offset = 0x %8.8x \n", in_operation_param4_memref_offset); - printf(" in_operation_param4_value_a = 0x %8.8x \n", in_operation_param4_value_a); - printf(" in_operation_param4_value_b = 0x %8.8x \n", in_operation_param4_value_b); - printf(" in_operation_param4_ionref_ionsharefd = 0x %8.8x \n", in_operation_param4_ionref_ionsharefd); - printf(" in_operation_param4_ionref_ionsize = 0x %8.8x \n", in_operation_param4_ionref_ionsize); - - printf(" in_operation_session = 0x %16.16lx \n", in_operation_session); - printf(" in_operation_cancelflag = 0x %8.8x \n", in_operation_cancelflag); - - printf(" in_returnorigin = 0x %8.8x \n", in_returnorigin); -#endif - std::cout << "gpp received in_context_addr: 0x " << std::hex << std::setfill('0') - << std::setw(16) << in_context_addr << std::endl; - ta_path = (unsigned char *) malloc(1024 * sizeof(char)); - ta_path_size = 1024; - memset((char *) ta_path, 0, 1024); - - uint32_t context_tapath_outsize; - uint32_t serviceid_clockseqandnode_outsize_temp; - uint32_t returnorigin_temp; - - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (std::uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(std::uint32_t) - ); - - char workername[1024]; - memset((char *) workername, 0, 1024); - int ifound = 0; - int iworker; - - pthread_mutex_lock(mutex_workerrec_); - for (iworker = 0; iworker < global_max_num_worker; iworker++) - { - if (workerrec_[iworker].context_fd == in_context_fd && - workerrec_[iworker].context_addr == in_context_addr - ) - { - sprintf(workername, "%s%d", "gpworker", iworker); - std::cout << "gpp method call worker No: " << std::dec << iworker << std::endl; - ifound = 1; - break; - } - } - pthread_mutex_unlock(mutex_workerrec_); - if (ifound == 0) - { - printf("gpp can't find the woker for the context. \n"); - - teecresult = 0xAAAA0017; - - fd = 0x0; - ta_path = NULL; - charp = ta_path; - session_list_next = 0x0; - session_list_prev = 0x0; - shrd_mem_list_next = 0x0; - shrd_mem_list_prev = 0x0; - share_buffer_buffer = 0; - share_buffer_buffer_barrier = 0x0; - - sessionid = 0x0; - serviceid_timelow = 0x0; - serviceid_timemid = 0x0; - serviceid_timehiandver = 0x0; - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(uint32_t) - ); - for (int i = 0; i < serviceid_clockseqandnode_realsize; i++) - { - serviceid_clockseqandnode[i] = 0x0; - } - serviceid_clockseqandnode_outsize = 8; - opscnt = 0x0; - head_next = 0x0; - head_prev = 0x0; - session_context = 0x0; - - started = 0x0; - paramtypes = 0x0; - - operation_param1_tmpref_buffer = 0x0; - operation_param1_tmpref_size = 0x0; - operation_param1_memref_parent = 0x0; - operation_param1_memref_size = 0x0; - operation_param1_memref_offset = 0x0; - operation_param1_value_a = 0x0; - operation_param1_value_b = 0x0; - operation_param1_ionref_ionsharefd = 0x0; - operation_param1_ionref_ionsize = 0x0; - - operation_param2_tmpref_buffer = 0x0; - operation_param2_tmpref_size = 0x0; - operation_param2_memref_parent = 0x0; - operation_param2_memref_size = 0x0; - operation_param2_memref_offset = 0x0; - operation_param2_value_a = 0x0; - operation_param2_value_b = 0x0; - operation_param2_ionref_ionsharefd = 0x0; - operation_param2_ionref_ionsize = 0x0; - - operation_param3_tmpref_buffer = 0x0; - operation_param3_tmpref_size = 0x0; - operation_param3_memref_parent = 0x0; - operation_param3_memref_size = 0x0; - operation_param3_memref_offset = 0x0; - operation_param3_value_a = 0x0; - operation_param3_value_b = 0x0; - operation_param3_ionref_ionsharefd = 0x0; - operation_param3_ionref_ionsize = 0x0; - - operation_param4_tmpref_buffer = 0x0; - operation_param4_tmpref_size = 0x0; - operation_param4_memref_parent = 0x0; - operation_param4_memref_size = 0x0; - operation_param4_memref_offset = 0x0; - operation_param4_value_a = 0x0; - operation_param4_value_b = 0x0; - operation_param4_ionref_ionsharefd = 0x0; - operation_param4_ionref_ionsize = 0x0; - - operation_session = 0x0; - operation_cancelflag = 0x0; - - returnorigin = 0x0; - - opes_reply.set_teecresult(teecresult); - opes_reply.set_context_fd(fd); - opes_reply.set_context_tapath_outsize(ta_path_size); - opes_reply.set_context_sessionlist_next(session_list_next); - opes_reply.set_context_sessionlist_prev(session_list_prev); - opes_reply.set_context_shrdmemlist_prev(shrd_mem_list_prev); - opes_reply.set_context_shrdmemlist_next(shrd_mem_list_next); - opes_reply.set_context_sharebuffer_buffer(share_buffer_buffer); - opes_reply.set_context_sharebuffer_bufferbarrier(share_buffer_buffer_barrier); - opes_reply.set_session_sessionid(sessionid); - opes_reply.set_session_serviceid_timelow(serviceid_timelow); - opes_reply.set_session_serviceid_timemid(serviceid_timemid); - opes_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); - opes_reply.set_session_serviceid_clockseqandnode_outsize( - serviceid_clockseqandnode_outsize); - if (serviceid_clockseqandnode_outsize > 0 && - serviceid_clockseqandnode != NULL - ) - { - for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) - opes_reply.add_session_serviceid_clockseqandnode( - serviceid_clockseqandnode[i]); - } - opes_reply.set_session_opscnt(opscnt); - opes_reply.set_session_head_next(head_next); - opes_reply.set_session_head_prev(head_prev); - opes_reply.set_session_context(session_context); - opes_reply.set_operation_started(started); - opes_reply.set_operation_paramtypes(paramtypes); - opes_reply.set_operation_param1_tmpref_buffer(operation_param1_tmpref_buffer); - opes_reply.set_operation_param1_tmpref_size(operation_param1_tmpref_size); - opes_reply.set_operation_param1_memref_parent(operation_param1_memref_parent); - opes_reply.set_operation_param1_memref_size(operation_param1_memref_size); - opes_reply.set_operation_param1_memref_offset(operation_param1_memref_offset); - opes_reply.set_operation_param1_value_a(operation_param1_value_a); - opes_reply.set_operation_param1_value_b(operation_param1_value_b); - opes_reply.set_operation_param1_ionref_ionsharefd( - operation_param1_ionref_ionsharefd); - opes_reply.set_operation_param1_ionref_ionsize(operation_param1_ionref_ionsize); - - opes_reply.set_operation_param2_tmpref_buffer(operation_param2_tmpref_buffer); - opes_reply.set_operation_param2_tmpref_size(operation_param2_tmpref_size); - opes_reply.set_operation_param2_memref_parent(operation_param2_memref_parent); - opes_reply.set_operation_param2_memref_size(operation_param2_memref_size); - opes_reply.set_operation_param2_memref_offset(operation_param2_memref_offset); - opes_reply.set_operation_param2_value_a(operation_param2_value_a); - opes_reply.set_operation_param2_value_b(operation_param2_value_b); - opes_reply.set_operation_param2_ionref_ionsharefd( - operation_param2_ionref_ionsharefd); - opes_reply.set_operation_param2_ionref_ionsize(operation_param2_ionref_ionsize); - - opes_reply.set_operation_param3_tmpref_buffer(operation_param3_tmpref_buffer); - opes_reply.set_operation_param3_tmpref_size(operation_param3_tmpref_size); - opes_reply.set_operation_param3_memref_parent(operation_param3_memref_parent); - opes_reply.set_operation_param3_memref_size(operation_param3_memref_size); - opes_reply.set_operation_param3_memref_offset(operation_param3_memref_offset); - opes_reply.set_operation_param3_value_a(operation_param3_value_a); - opes_reply.set_operation_param3_value_b(operation_param3_value_b); - opes_reply.set_operation_param3_ionref_ionsharefd( - operation_param3_ionref_ionsharefd); - opes_reply.set_operation_param3_ionref_ionsize(operation_param3_ionref_ionsize); - - opes_reply.set_operation_param4_tmpref_buffer(operation_param4_tmpref_buffer); - opes_reply.set_operation_param4_tmpref_size(operation_param4_tmpref_size); - opes_reply.set_operation_param4_memref_parent(operation_param4_memref_parent); - opes_reply.set_operation_param4_memref_size(operation_param4_memref_size); - opes_reply.set_operation_param4_memref_offset(operation_param4_memref_offset); - opes_reply.set_operation_param4_value_a(operation_param4_value_a); - opes_reply.set_operation_param4_value_b(operation_param4_value_b); - opes_reply.set_operation_param4_ionref_ionsharefd( - operation_param4_ionref_ionsharefd); - opes_reply.set_operation_param4_ionref_ionsize(operation_param4_ionref_ionsize); - - opes_reply.set_operation_session(operation_session); - opes_reply.set_operation_cancelflag(operation_cancelflag); - opes_reply.set_returnorigin(returnorigin); - - status_ = FINISH; - - opes_response.Finish(opes_reply, Status::OK, this); - } else - { - method_call_teec_opensession( - workername, - - in_context_fd, - in_context_tapath_temp, - in_context_tapath_size, - in_context_sessionlist_next, - in_context_sessionlist_prev, - in_context_shrdmemlist_next, - in_context_shrdmemlist_prev, - in_context_sharebuffer_buffer, - in_context_sharebuffer_bufferbarrier, - - in_destination_timelow, - in_destination_timemid, - in_destination_timehiandver, - in_destination_clockseqandnode, - in_destination_clockseqandnode_size, - - in_connectionmethod, - in_connectiondata, - - in_operation_started, - in_operation_paramtypes, - - in_operation_param1_tmpref_buffer, - in_operation_param1_tmpref_size, - in_operation_param1_memref_parent, - in_operation_param1_memref_size, - in_operation_param1_memref_offset, - in_operation_param1_value_a, - in_operation_param1_value_b, - in_operation_param1_ionref_ionsharefd, - in_operation_param1_ionref_ionsize, - - in_operation_param2_tmpref_buffer, - in_operation_param2_tmpref_size, - in_operation_param2_memref_parent, - in_operation_param2_memref_size, - in_operation_param2_memref_offset, - in_operation_param2_value_a, - in_operation_param2_value_b, - in_operation_param2_ionref_ionsharefd, - in_operation_param2_ionref_ionsize, - - in_operation_param3_tmpref_buffer, - in_operation_param3_tmpref_size, - in_operation_param3_memref_parent, - in_operation_param3_memref_size, - in_operation_param3_memref_offset, - in_operation_param3_value_a, - in_operation_param3_value_b, - in_operation_param3_ionref_ionsharefd, - in_operation_param3_ionref_ionsize, - - in_operation_param4_tmpref_buffer, - in_operation_param4_tmpref_size, - in_operation_param4_memref_parent, - in_operation_param4_memref_size, - in_operation_param4_memref_offset, - in_operation_param4_value_a, - in_operation_param4_value_b, - in_operation_param4_ionref_ionsharefd, - in_operation_param4_ionref_ionsize, - - in_operation_session, - in_operation_cancelflag, - - in_returnorigin, - - in_context_addr, - - - &teecresult, - - &fd, - ta_path, - ta_path_size, - &context_tapath_outsize, - &session_list_next, - &session_list_prev, - &shrd_mem_list_next, - &shrd_mem_list_prev, - &share_buffer_buffer, - &share_buffer_buffer_barrier, - - &sessionid, - &serviceid_timelow, - &serviceid_timemid, - &serviceid_timehiandver, - serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize, - &serviceid_clockseqandnode_outsize_temp, - &opscnt, - &head_next, - &head_prev, - &session_context, - - &started, - ¶mtypes, - - &operation_param1_tmpref_buffer, - &operation_param1_tmpref_size, - &operation_param1_memref_parent, - &operation_param1_memref_size, - &operation_param1_memref_offset, - &operation_param1_value_a, - &operation_param1_value_b, - &operation_param1_ionref_ionsharefd, - &operation_param1_ionref_ionsize, - - &operation_param2_tmpref_buffer, - &operation_param2_tmpref_size, - &operation_param2_memref_parent, - &operation_param2_memref_size, - &operation_param2_memref_offset, - &operation_param2_value_a, - &operation_param2_value_b, - &operation_param2_ionref_ionsharefd, - &operation_param2_ionref_ionsize, - - &operation_param3_tmpref_buffer, - &operation_param3_tmpref_size, - &operation_param3_memref_parent, - &operation_param3_memref_size, - &operation_param3_memref_offset, - &operation_param3_value_a, - &operation_param3_value_b, - &operation_param3_ionref_ionsharefd, - &operation_param3_ionref_ionsize, - - &operation_param4_tmpref_buffer, - &operation_param4_tmpref_size, - &operation_param4_memref_parent, - &operation_param4_memref_size, - &operation_param4_memref_offset, - &operation_param4_value_a, - &operation_param4_value_b, - &operation_param4_ionref_ionsharefd, - &operation_param4_ionref_ionsize, - - &operation_session, - &operation_cancelflag, - - &returnorigin_temp - ); - if (teecresult == 0) - { - pthread_mutex_lock(mutex_workerrec_); - sin_t *sinIns = (sin_t *) malloc(sizeof(sin_t)); - sinIns->session_id = sessionid; - struct timeval tvcreate; - gettimeofday(&tvcreate, NULL); - sinIns->session_createtime = tvcreate; - workerrec_[iworker].context_createtime = tvcreate; - if (workerrec_[iworker].first == NULL) - { - sinIns->next = NULL; - sinIns->prev = NULL; - workerrec_[iworker].first = sinIns; - workerrec_[iworker].last = sinIns; - workerrec_[iworker].sessionid_count = 1; - } else - { - sinIns->prev = workerrec_[iworker].last; - sinIns->next = NULL; - workerrec_[iworker].last->next = sinIns; - workerrec_[iworker].last = sinIns; - workerrec_[iworker].sessionid_count = - workerrec_[iworker].sessionid_count + 1; - } - pthread_mutex_unlock(mutex_workerrec_); - } - serviceid_clockseqandnode_outsize = - serviceid_clockseqandnode_outsize_temp; - returnorigin = returnorigin_temp; - - if (ta_path_size >= context_tapath_outsize) - { - ta_path_size = context_tapath_outsize; - charp = ta_path; - } else - { - ta_path_size = 0; - charp = NULL; - } - - if ( - serviceid_clockseqandnode_realsize >= serviceid_clockseqandnode_outsize && - 8 >= serviceid_clockseqandnode_outsize - ) - { - serviceid_clockseqandnode_realsize = serviceid_clockseqandnode_outsize; - } else - { - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode_outsize = 0; - } - opes_reply.set_teecresult(teecresult); - opes_reply.set_context_fd(fd); - opes_reply.set_context_tapath_outsize(ta_path_size); - - if (ta_path_size > 0 && - charp != NULL && - strlen((const char *) charp) > 0 - ) - { - charpp = (const char *) charp; - if (utf8_check_is_valid(charpp)) - { - ta_path_size = strlen((const char *) charp); - } else - { - ta_path_size = 0; - } - } else - { - ta_path_size = 0; - } - if (ta_path_size > 0) - { - opes_reply.set_context_tapath(charpp); - } - - opes_reply.set_context_sessionlist_next(session_list_next); - opes_reply.set_context_sessionlist_prev(session_list_prev); - opes_reply.set_context_shrdmemlist_prev(shrd_mem_list_prev); - opes_reply.set_context_shrdmemlist_next(shrd_mem_list_next); - opes_reply.set_context_sharebuffer_buffer(share_buffer_buffer); - opes_reply.set_context_sharebuffer_bufferbarrier(share_buffer_buffer_barrier); - opes_reply.set_session_sessionid(sessionid); - opes_reply.set_session_serviceid_timelow(serviceid_timelow); - opes_reply.set_session_serviceid_timemid(serviceid_timemid); - opes_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); - opes_reply.set_session_serviceid_clockseqandnode_outsize( - serviceid_clockseqandnode_outsize); - if (serviceid_clockseqandnode_outsize > 0 && - serviceid_clockseqandnode != NULL - ) - { - for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) - opes_reply.add_session_serviceid_clockseqandnode( - serviceid_clockseqandnode[i]); - } - opes_reply.set_session_opscnt(opscnt); - opes_reply.set_session_head_next(head_next); - opes_reply.set_session_head_prev(head_prev); - opes_reply.set_session_context(session_context); - opes_reply.set_operation_started(started); - opes_reply.set_operation_paramtypes(paramtypes); - opes_reply.set_operation_param1_tmpref_buffer(operation_param1_tmpref_buffer); - opes_reply.set_operation_param1_tmpref_size(operation_param1_tmpref_size); - opes_reply.set_operation_param1_memref_parent(operation_param1_memref_parent); - opes_reply.set_operation_param1_memref_size(operation_param1_memref_size); - opes_reply.set_operation_param1_memref_offset(operation_param1_memref_offset); - opes_reply.set_operation_param1_value_a(operation_param1_value_a); - opes_reply.set_operation_param1_value_b(operation_param1_value_b); - opes_reply.set_operation_param1_ionref_ionsharefd( - operation_param1_ionref_ionsharefd); - opes_reply.set_operation_param1_ionref_ionsize(operation_param1_ionref_ionsize); - - opes_reply.set_operation_param2_tmpref_buffer(operation_param2_tmpref_buffer); - opes_reply.set_operation_param2_tmpref_size(operation_param2_tmpref_size); - opes_reply.set_operation_param2_memref_parent(operation_param2_memref_parent); - opes_reply.set_operation_param2_memref_size(operation_param2_memref_size); - opes_reply.set_operation_param2_memref_offset(operation_param2_memref_offset); - opes_reply.set_operation_param2_value_a(operation_param2_value_a); - opes_reply.set_operation_param2_value_b(operation_param2_value_b); - opes_reply.set_operation_param2_ionref_ionsharefd( - operation_param2_ionref_ionsharefd); - opes_reply.set_operation_param2_ionref_ionsize(operation_param2_ionref_ionsize); - - opes_reply.set_operation_param3_tmpref_buffer(operation_param3_tmpref_buffer); - opes_reply.set_operation_param3_tmpref_size(operation_param3_tmpref_size); - opes_reply.set_operation_param3_memref_parent(operation_param3_memref_parent); - opes_reply.set_operation_param3_memref_size(operation_param3_memref_size); - opes_reply.set_operation_param3_memref_offset(operation_param3_memref_offset); - opes_reply.set_operation_param3_value_a(operation_param3_value_a); - opes_reply.set_operation_param3_value_b(operation_param3_value_b); - opes_reply.set_operation_param3_ionref_ionsharefd( - operation_param3_ionref_ionsharefd); - opes_reply.set_operation_param3_ionref_ionsize(operation_param3_ionref_ionsize); - - opes_reply.set_operation_param4_tmpref_buffer(operation_param4_tmpref_buffer); - opes_reply.set_operation_param4_tmpref_size(operation_param4_tmpref_size); - opes_reply.set_operation_param4_memref_parent(operation_param4_memref_parent); - opes_reply.set_operation_param4_memref_size(operation_param4_memref_size); - opes_reply.set_operation_param4_memref_offset(operation_param4_memref_offset); - opes_reply.set_operation_param4_value_a(operation_param4_value_a); - opes_reply.set_operation_param4_value_b(operation_param4_value_b); - opes_reply.set_operation_param4_ionref_ionsharefd( - operation_param4_ionref_ionsharefd); - opes_reply.set_operation_param4_ionref_ionsize(operation_param4_ionref_ionsize); - - opes_reply.set_operation_session(operation_session); - opes_reply.set_operation_cancelflag(operation_cancelflag); - opes_reply.set_returnorigin(returnorigin); - - status_ = FINISH; - gettimeofday(&end, NULL); - int64_t i64Time; - i64Time = (end.tv_sec - start.tv_sec) * 1000000 + - (end.tv_usec - start.tv_usec); - printf("gpp opensession used time: %ld us. \n", i64Time); - - status_ = FINISH; - - opes_response.Finish(opes_reply, Status::OK, this); - } - }else - { - std::cout << "gpp receive no opensession jwtsvid or validate jwt failed" << std::endl; - flag = 2; - opes_reply.set_flag(flag); - status_ = FINISH; - opes_response.Finish(opes_reply, Status::OK, this); - } - break; - } - - case ServerImpl::CallData::SS_TEECC_CloseSession: - { - struct timeval start, end, jwt_validate_start, jwt_validate_end; - gettimeofday(&start, NULL); - - std::uint32_t in_session_sessionid; - std::uint32_t in_session_serviceid_timelow; - std::uint32_t in_session_serviceid_timemid; - std::uint32_t in_session_serviceid_timehiandver; - std::uint32_t in_session_serviceid_clockseqandnode_size; - std::uint32_t *in_session_serviceid_clockseqandnode; - std::uint32_t in_session_opscnt; - std::uint64_t in_session_head_next; - std::uint64_t in_session_head_prev; - std::uint64_t in_session_context; - - std::uint32_t sessionid; - std::uint32_t serviceid_timelow; - std::uint32_t serviceid_timemid; - std::uint32_t serviceid_timehiandver; - std::uint32_t *serviceid_clockseqandnode; - std::uint32_t serviceid_clockseqandnode_outsize; - int serviceid_clockseqandnode_realsize; - std::uint32_t opscnt; - std::uint64_t head_next; - std::uint64_t head_prev; - std::uint64_t session_context; - - std::uint32_t serial = 0; - std::int32_t flag = 0; - - std::string token; - token = close_request.token(); - - std::string noToken("noToken"); - int ivaljwtResult = -1; - int iforceValidateJwt = global_force_valideta_jwt; - - if - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - ) - { - char Token[1024]; - strcpy(Token, (char *) token.data()); - gettimeofday(&jwt_validate_start, NULL); - ivaljwtResult = - dbusmethodcall_validate_jwt( - Token - ); - gettimeofday(&jwt_validate_end, NULL); - int64_t i64Time_jwt; - i64Time_jwt = (jwt_validate_end.tv_sec - jwt_validate_start.tv_sec) * 1000000 + - (jwt_validate_end.tv_usec - jwt_validate_start.tv_usec); - printf("gpp closesession validate jwt used time: %ld us. \n", i64Time_jwt); - std::cout << "gpp validate closesession jwtsvid" << std::endl; - } else - { - std::cout << "gpp no validate closesession jwtsvid" << std::endl; - } - - if - ( - iforceValidateJwt != 1 - || - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - && - ivaljwtResult == NO_ERROR - ) - ) - { - std::cout << "gpp does not need validate closesession jwtsvid or validate jwt succed" - << std::endl; - std::cout << "gpp received CloseSesssion " << std::endl; - in_session_sessionid = close_request.in_session_sessionid(); - in_session_serviceid_timelow = close_request.in_session_serviceid_timelow(); - in_session_serviceid_timemid = close_request.in_session_serviceid_timemid(); - in_session_serviceid_timehiandver = close_request.in_session_serviceid_timehiandver(); - in_session_serviceid_clockseqandnode_size = close_request.in_session_serviceid_clockseqandnode_size(); - if (in_session_serviceid_clockseqandnode_size > 0) - { - in_session_serviceid_clockseqandnode = new uint32_t[in_session_serviceid_clockseqandnode_size]; - for (int i = 0; i < in_session_serviceid_clockseqandnode_size; i++) - { - in_session_serviceid_clockseqandnode[i] = close_request.in_session_serviceid_clockseqandnode( - i); - } - } - in_session_opscnt = close_request.in_session_opscnt(); - in_session_head_next = close_request.in_session_head_next(); - in_session_head_prev = close_request.in_session_head_prev(); - in_session_context = close_request.in_session_context(); -#if 0 - printf(" in_session_serviceid_timelow = 0x %8.8x \n", in_session_serviceid_timelow); - printf(" in_session_serviceid_timemid = 0x %8.8x \n", in_session_serviceid_timemid); - printf(" in_session_serviceid_timehiandver = 0x %8.8x \n", - in_session_serviceid_timehiandver); - printf(" in_session_serviceid_clockseqandnode = \n"); - printf(" "); - for (int i = 0; i < in_session_serviceid_clockseqandnode_size; i++) { - printf(" %8.8x", in_session_serviceid_clockseqandnode[i]); - } - printf("\n"); - printf(" in_session_serviceid_clockseqandnode_size = 0x %8.8x \n", - in_session_serviceid_clockseqandnode_size); - printf(" in_session_opscnt = 0x %8.8x \n", in_session_opscnt); - printf(" in_session_head_next = 0x %16.16lx \n", in_session_head_next); - printf(" in_session_head_prev = 0x %16.16lx \n", in_session_head_prev); -#endif - std::cout << "gpp received in_session_sessionid: 0x " << std::hex << std::setfill('0') - << std::setw(8) << in_session_sessionid << std::endl; - std::cout << "gpp received in_session_context: 0x " << std::hex << std::setfill('0') - << std::setw(16) << in_session_context << std::endl; - - uint32_t serviceid_clockseqandnode_outsize_temp; - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (std::uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(std::uint32_t) - ); - char workername[1024]; - memset((char *) workername, 0, 1024); - int ifound = 0; - int iworker; - sin_t *sinIns; - - pthread_mutex_lock(mutex_workerrec_); - for (iworker = 0; iworker < global_max_num_worker; iworker++) - { - if (workerrec_[iworker].context_addr == in_session_context) - { - sinIns = NULL; - if (workerrec_[iworker].first != NULL) - { - sinIns = workerrec_[iworker].first; - do - { - if (sinIns->session_id == in_session_sessionid) - { - sprintf(workername, "%s%d", "gpworker", iworker); - std::cout << "gpp method call worker No: " << std::dec << iworker << std::endl; - ifound = 1; - break; - } - sinIns = sinIns->next; - } while (sinIns != NULL); - - if (ifound == 1) - { - break; - } - } - } - } - pthread_mutex_unlock(mutex_workerrec_); - if (ifound == 0) - { - printf("gpp can't find the worker for the session and the context. \n"); - - sessionid = 0x0; - serviceid_timelow = 0x0; - serviceid_timemid = 0x0; - serviceid_timehiandver = 0x0; - opscnt = 0x0; - head_next = 0x0; - head_prev = 0x0; - session_context = 0x0; - - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(uint32_t) - ); - for (int i = 0; i < serviceid_clockseqandnode_realsize; i++) - { - serviceid_clockseqandnode[i] = 0x0; - } - serviceid_clockseqandnode_outsize = 8; - close_reply.set_session_sessionid(sessionid); - close_reply.set_session_serviceid_timelow(serviceid_timelow); - close_reply.set_session_serviceid_timemid(serviceid_timemid); - close_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); - close_reply.set_session_serviceid_cad_outsize(serviceid_clockseqandnode_outsize); - if (serviceid_clockseqandnode_outsize > 0 && - serviceid_clockseqandnode != NULL - ) - { - for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) - close_reply.add_session_serviceid_clockseqandnode(serviceid_clockseqandnode[i]); - } - close_reply.set_session_opscnt(opscnt); - close_reply.set_session_head_next(head_next); - close_reply.set_session_head_prev(head_prev); - close_reply.set_session_context(session_context); - - status_ = FINISH; - - close_response.Finish(close_reply, Status::OK, this); - } else - { - method_call_teec_closesession( - workername, - - in_session_sessionid, - in_session_serviceid_timelow, - in_session_serviceid_timemid, - in_session_serviceid_timehiandver, - in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_size, - in_session_opscnt, - in_session_head_next, - in_session_head_prev, - in_session_context, - - &sessionid, - &serviceid_timelow, - &serviceid_timemid, - &serviceid_timehiandver, - serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize, - &serviceid_clockseqandnode_outsize_temp, - &opscnt, - &head_next, - &head_prev, - &session_context - ); - pthread_mutex_lock(mutex_workerrec_); - sin_t *sinTemp; - sinTemp = sinIns->prev; - struct timeval tvcreate; - gettimeofday(&tvcreate, NULL); - workerrec_[iworker].context_createtime = tvcreate; - if (sinTemp != NULL) - { - sinTemp->next = sinIns->next; - } - sinTemp = sinIns->next; - if (sinTemp != NULL) - { - sinTemp->prev = sinIns->prev; - } - if (workerrec_[iworker].last == sinIns) - { - workerrec_[iworker].last = sinIns->prev; - } - if (workerrec_[iworker].first == sinIns) - { - workerrec_[iworker].first = sinIns->next; - } - free(sinIns); - workerrec_[iworker].sessionid_count = - workerrec_[iworker].sessionid_count - 1; - pthread_mutex_unlock(mutex_workerrec_); - - serviceid_clockseqandnode_outsize = serviceid_clockseqandnode_outsize_temp; - - if ( - serviceid_clockseqandnode_realsize >= serviceid_clockseqandnode_outsize && - 8 >= serviceid_clockseqandnode_outsize - ) - { - serviceid_clockseqandnode_realsize = serviceid_clockseqandnode_outsize; - } else - { - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode_outsize = 0; - } - close_reply.set_session_sessionid(sessionid); - close_reply.set_session_serviceid_timelow(serviceid_timelow); - close_reply.set_session_serviceid_timemid(serviceid_timemid); - close_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); - close_reply.set_session_serviceid_cad_outsize(serviceid_clockseqandnode_outsize); - if (serviceid_clockseqandnode_outsize > 0 && - serviceid_clockseqandnode != NULL - ) - { - for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) - close_reply.add_session_serviceid_clockseqandnode(serviceid_clockseqandnode[i]); - } - close_reply.set_session_opscnt(opscnt); - close_reply.set_session_head_next(head_next); - close_reply.set_session_head_prev(head_prev); - close_reply.set_session_context(session_context); - - gettimeofday(&end, NULL); - int64_t i64Time; - i64Time = (end.tv_sec - start.tv_sec) * 1000000 + - (end.tv_usec - start.tv_usec); - printf("gpp closesession used time: %ld us. \n", i64Time); - - status_ = FINISH; - - close_response.Finish(close_reply, Status::OK, this); - } - }else - { - std::cout << "gpp receive no closesession jwtsvid or validate jwt failed" << std::endl; - flag = 2; - close_reply.set_flag(flag); - status_ = FINISH; - - close_response.Finish(close_reply, Status::OK, this); - } - - break; - } - - case ServerImpl::CallData::SS_TEECC_InvokeCommand: - { - struct timeval start, end, jwt_validate_start, jwt_validate_end; - gettimeofday(&start, NULL); - - std::uint32_t in_session_sessionid; - std::uint32_t in_session_serviceid_timelow; - std::uint32_t in_session_serviceid_timemid; - std::uint32_t in_session_serviceid_timehiandver; - std::uint32_t in_session_serviceid_clockseqandnode_size; - std::uint32_t *in_session_serviceid_clockseqandnode; - int in_session_serviceid_clockseqandnode_realsize; - std::uint32_t in_session_opscnt; - std::uint64_t in_session_head_next; - std::uint64_t in_session_head_prev; - std::uint64_t in_session_context; - - std::uint32_t in_commandid; - - std::uint32_t in_operation_started; - std::uint32_t in_operation_paramtypes; - - std::uint64_t in_operation_param1_tmpref_buffer; - std::uint32_t in_operation_param1_tmpref_size; - std::uint64_t in_operation_param1_memref_parent; - std::uint32_t in_operation_param1_memref_parent_flag; - std::uint32_t in_operation_param1_memref_size; - std::uint32_t in_operation_param1_memref_offset; - std::uint32_t in_operation_param1_value_a; - std::uint32_t in_operation_param1_value_b; - std::int32_t in_operation_param1_ionref_ionsharefd; - std::uint32_t in_operation_param1_ionref_ionsize; - - std::uint64_t in_operation_param2_tmpref_buffer; - std::uint32_t in_operation_param2_tmpref_size; - std::uint64_t in_operation_param2_memref_parent; - std::uint32_t in_operation_param2_memref_parent_flag; - std::uint32_t in_operation_param2_memref_size; - std::uint32_t in_operation_param2_memref_offset; - std::uint32_t in_operation_param2_value_a; - std::uint32_t in_operation_param2_value_b; - std::int32_t in_operation_param2_ionref_ionsharefd; - std::uint32_t in_operation_param2_ionref_ionsize; - - std::uint64_t in_operation_param3_tmpref_buffer; - std::uint32_t in_operation_param3_tmpref_size; - std::uint64_t in_operation_param3_memref_parent; - std::uint32_t in_operation_param3_memref_parent_flag; - std::uint32_t in_operation_param3_memref_size; - std::uint32_t in_operation_param3_memref_offset; - std::uint32_t in_operation_param3_value_a; - std::uint32_t in_operation_param3_value_b; - std::int32_t in_operation_param3_ionref_ionsharefd; - std::uint32_t in_operation_param3_ionref_ionsize; - - std::uint64_t in_operation_param4_tmpref_buffer; - std::uint32_t in_operation_param4_tmpref_size; - std::uint64_t in_operation_param4_memref_parent; - std::uint32_t in_operation_param4_memref_parent_flag; - std::uint32_t in_operation_param4_memref_size; - std::uint32_t in_operation_param4_memref_offset; - std::uint32_t in_operation_param4_value_a; - std::uint32_t in_operation_param4_value_b; - std::int32_t in_operation_param4_ionref_ionsharefd; - std::uint32_t in_operation_param4_ionref_ionsize; - - std::uint64_t in_operation_session; - std::int32_t in_operation_cancelflag; - - std::uint32_t in_returnorigin; - - std::uint32_t in_buffer1_size; - std::uint32_t *in_buffer1; - int in_buffer1_realsize; - std::uint32_t in_buffer2_size; - std::uint32_t *in_buffer2; - int in_buffer2_realsize; - std::uint32_t in_buffer3_size; - std::uint32_t *in_buffer3; - int in_buffer3_realsize; - std::uint32_t in_buffer4_size; - std::uint32_t *in_buffer4; - int in_buffer4_realsize; - - std::uint32_t teecresult; - - std::uint32_t sessionid; - std::uint32_t serviceid_timelow; - std::uint32_t serviceid_timemid; - std::uint32_t serviceid_timehiandver; - std::uint32_t *serviceid_clockseqandnode; - int serviceid_clockseqandnode_realsize; - std::int32_t serviceid_clockseqandnode_outsize; - std::uint32_t opscnt; - std::uint64_t head_next; - std::uint64_t head_prev; - std::uint64_t session_context; - std::uint32_t started; - std::uint32_t paramtypes; - std::uint64_t operation_param1_tmpref_buffer; - std::uint32_t operation_param1_tmpref_size; - std::uint64_t operation_param1_memref_parent; - std::uint32_t operation_param1_memref_parent_flag; - std::uint32_t operation_param1_memref_size; - std::uint32_t operation_param1_memref_offset; - std::uint32_t operation_param1_value_a; - std::uint32_t operation_param1_value_b; - std::int32_t operation_param1_ionref_ionsharefd; - std::uint32_t operation_param1_ionref_ionsize; - std::uint64_t operation_param2_tmpref_buffer; - std::uint32_t operation_param2_tmpref_size; - std::uint64_t operation_param2_memref_parent; - std::uint32_t operation_param2_memref_parent_flag; - std::uint32_t operation_param2_memref_size; - std::uint32_t operation_param2_memref_offset; - std::uint32_t operation_param2_value_a; - std::uint32_t operation_param2_value_b; - std::int32_t operation_param2_ionref_ionsharefd; - std::uint32_t operation_param2_ionref_ionsize; - std::uint64_t operation_param3_tmpref_buffer; - std::uint32_t operation_param3_tmpref_size; - std::uint64_t operation_param3_memref_parent; - std::uint32_t operation_param3_memref_parent_flag; - std::uint32_t operation_param3_memref_size; - std::uint32_t operation_param3_memref_offset; - std::uint32_t operation_param3_value_a; - std::uint32_t operation_param3_value_b; - std::int32_t operation_param3_ionref_ionsharefd; - std::uint32_t operation_param3_ionref_ionsize; - std::uint64_t operation_param4_tmpref_buffer; - std::uint32_t operation_param4_tmpref_size; - std::uint64_t operation_param4_memref_parent; - std::uint32_t operation_param4_memref_parent_flag; - std::uint32_t operation_param4_memref_size; - std::uint32_t operation_param4_memref_offset; - std::uint32_t operation_param4_value_a; - std::uint32_t operation_param4_value_b; - std::int32_t operation_param4_ionref_ionsharefd; - std::uint32_t operation_param4_ionref_ionsize; - std::uint64_t operation_session; - std::int32_t operation_cancelflag; - std::uint32_t returnorigin; - - std::uint32_t *buffer1; - int buffer1_realsize; - std::uint32_t buffer1_outsize; - std::uint32_t *buffer2; - int buffer2_realsize; - std::uint32_t buffer2_outsize; - std::uint32_t *buffer3; - int buffer3_realsize; - std::uint32_t buffer3_outsize; - std::uint32_t *buffer4; - int buffer4_realsize; - std::uint32_t buffer4_outsize; - - std::uint32_t serial = 0; - std::int32_t flag = 0; - std::string token; - token = invo_request.token(); - - std::string noToken("noToken"); - int ivaljwtResult = -1; - int iforceValidateJwt = global_force_valideta_jwt; - - if - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - ) - { - char Token[1024]; - strcpy(Token, (char *) token.data()); - gettimeofday(&jwt_validate_start, NULL); - ivaljwtResult = - dbusmethodcall_validate_jwt( - Token - ); - gettimeofday(&jwt_validate_end, NULL); - int64_t i64Time_jwt; - i64Time_jwt = (jwt_validate_end.tv_sec - jwt_validate_start.tv_sec) * 1000000 + - (jwt_validate_end.tv_usec - jwt_validate_start.tv_usec); - printf("gpp invokecommand validate jwt used time: %ld us. \n", i64Time_jwt); - std::cout << "gpp validate invokecommand jwtsvid" << std::endl; - } else - { - std::cout << "gpp no validate invokecommand jwtsvid" << std::endl; - } - - if - ( - iforceValidateJwt != 1 - || - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - && - ivaljwtResult == NO_ERROR - ) - ) - { - std::cout << "gpp does not need validate invokecommand jwtsvid or validate jwt succed" - << std::endl; - - in_session_sessionid = invo_request.in_session_sessionid(); - in_session_serviceid_timelow = invo_request.in_session_serviceid_timelow(); - in_session_serviceid_timemid = invo_request.in_session_serviceid_timemid(); - in_session_serviceid_timehiandver = invo_request.in_session_serviceid_timehiandver(); - - in_session_serviceid_clockseqandnode_size = invo_request.in_session_serviceid_clockseqandnode_size(); - in_session_serviceid_clockseqandnode_realsize = in_session_serviceid_clockseqandnode_size; - if (in_session_serviceid_clockseqandnode_size > 0) - { - in_session_serviceid_clockseqandnode = new uint32_t[in_session_serviceid_clockseqandnode_size]; - for (int i = 0; i < in_session_serviceid_clockseqandnode_size; i++) - { - in_session_serviceid_clockseqandnode[i] = invo_request.in_session_serviceid_clockseqandnode( - i); - } - } - in_session_opscnt = invo_request.in_session_opscnt(); - in_session_head_next = invo_request.in_session_head_next(); - in_session_head_prev = invo_request.in_session_head_prev(); - in_session_context = invo_request.in_session_context(); - in_commandid = invo_request.in_commandid(); - in_operation_started = invo_request.in_operation_started(); - in_operation_paramtypes = invo_request.in_operation_paramtypes(); - in_operation_param1_tmpref_buffer = invo_request.in_operation_param1_tmpref_buffer(); - in_operation_param1_tmpref_size = invo_request.in_operation_param1_tmpref_size(); - in_operation_param1_memref_parent_flag = invo_request.in_operation_param1_memref_parent_flag(); - in_operation_param1_memref_parent = invo_request.in_operation_param1_memref_parent(); - in_operation_param1_memref_size = invo_request.in_operation_param1_memref_size(); - in_operation_param1_memref_offset = invo_request.in_operation_param1_memref_offset(); - in_operation_param1_value_a = invo_request.in_operation_param1_value_a(); - in_operation_param1_value_b = invo_request.in_operation_param1_value_b(); - in_operation_param1_ionref_ionsharefd = invo_request.in_operation_param1_ionref_ionsharefd(); - in_operation_param1_ionref_ionsize = invo_request.in_operation_param1_ionref_ionsize(); - - in_operation_param2_tmpref_buffer = invo_request.in_operation_param2_tmpref_buffer(); - in_operation_param2_tmpref_size = invo_request.in_operation_param2_tmpref_size(); - in_operation_param2_memref_parent = invo_request.in_operation_param2_memref_parent(); - in_operation_param2_memref_parent_flag = invo_request.in_operation_param2_memref_parent_flag(); - in_operation_param2_memref_size = invo_request.in_operation_param2_memref_size(); - in_operation_param2_memref_offset = invo_request.in_operation_param2_memref_offset(); - in_operation_param2_value_a = invo_request.in_operation_param2_value_a(); - in_operation_param2_value_b = invo_request.in_operation_param2_value_b(); - in_operation_param2_ionref_ionsharefd = invo_request.in_operation_param2_ionref_ionsharefd(); - in_operation_param2_ionref_ionsize = invo_request.in_operation_param2_ionref_ionsize(); - - in_operation_param3_tmpref_buffer = invo_request.in_operation_param3_tmpref_buffer(); - in_operation_param3_tmpref_size = invo_request.in_operation_param3_tmpref_size(); - in_operation_param3_memref_parent = invo_request.in_operation_param3_memref_parent(); - in_operation_param3_memref_parent_flag = invo_request.in_operation_param3_memref_parent_flag(); - in_operation_param3_memref_size = invo_request.in_operation_param3_memref_size(); - in_operation_param3_memref_offset = invo_request.in_operation_param3_memref_offset(); - in_operation_param3_value_a = invo_request.in_operation_param3_value_a(); - in_operation_param3_value_b = invo_request.in_operation_param3_value_b(); - in_operation_param3_ionref_ionsharefd = invo_request.in_operation_param3_ionref_ionsharefd(); - in_operation_param3_ionref_ionsize = invo_request.in_operation_param3_ionref_ionsize(); - - in_operation_param4_tmpref_buffer = invo_request.in_operation_param4_tmpref_buffer(); - in_operation_param4_tmpref_size = invo_request.in_operation_param4_tmpref_size(); - in_operation_param4_memref_parent = invo_request.in_operation_param4_memref_parent(); - in_operation_param4_memref_parent_flag = invo_request.in_operation_param4_memref_parent_flag(); - in_operation_param4_memref_size = invo_request.in_operation_param4_memref_size(); - in_operation_param4_memref_offset = invo_request.in_operation_param4_memref_offset(); - in_operation_param4_value_a = invo_request.in_operation_param4_value_a(); - in_operation_param4_value_b = invo_request.in_operation_param4_value_b(); - in_operation_param4_ionref_ionsharefd = invo_request.in_operation_param4_ionref_ionsharefd(); - in_operation_param4_ionref_ionsize = invo_request.in_operation_param4_ionref_ionsize(); - - in_operation_session = invo_request.in_operation_session(); - in_operation_cancelflag = invo_request.in_operation_cancelflag(); - in_returnorigin = invo_request.in_returnorigin(); - - in_buffer1_size = invo_request.in_buffer1_size(); - in_buffer1_realsize = in_buffer1_size; - if (in_buffer1_size > 0) - { - in_buffer1 = new uint32_t[in_buffer1_size]; - for (int i = 0; i < in_buffer1_size; i++) - { - in_buffer1[i] = invo_request.in_buffer1(i); - } - } - - in_buffer2_size = invo_request.in_buffer2_size(); - in_buffer2_realsize = in_buffer2_size; - if (in_buffer2_size > 0) - { - in_buffer2 = new uint32_t[in_buffer2_size]; - for (int i = 0; i < in_buffer2_size; i++) - { - in_buffer2[i] = invo_request.in_buffer2(i); - } - } - - in_buffer3_size = invo_request.in_buffer3_size(); - in_buffer3_realsize = in_buffer3_size; - if (in_buffer3_size > 0) - { - in_buffer3 = new uint32_t[in_buffer3_size]; - for (int i = 0; i < in_buffer3_size; i++) - { - in_buffer3[i] = invo_request.in_buffer3(i); - } - } - - in_buffer4_size = invo_request.in_buffer4_size(); - in_buffer4_realsize = in_buffer4_size; - if (in_buffer4_size > 0) - { - in_buffer4 = new uint32_t[in_buffer4_size]; - for (int i = 0; i < in_buffer4_size; i++) - { - in_buffer4[i] = invo_request.in_buffer4(i); - } - } - - std::cout << "gpp received InvokeCommand " << std::endl; - std::cout << "gpp received in_session_sessionid: 0x " - << std::hex << std::setfill('0') << std::setw(8) << in_session_sessionid << std::endl; -#if 0 - printf(" in_session_serviceid_timelow = 0x %8.8x \n", in_session_serviceid_timelow); - printf(" in_session_serviceid_timemid = 0x %8.8x \n", in_session_serviceid_timemid); - printf(" in_session_serviceid_timehiandver = 0x %8.8x \n", - in_session_serviceid_timehiandver); - printf(" in_session_serviceid_clockseqandnode = \n"); - printf(" "); - for (int i = 0; i < in_session_serviceid_clockseqandnode_realsize; i++) { - printf(" %2.2x", in_session_serviceid_clockseqandnode[i]); - } - printf("\n"); - printf(" in serviceid_clockseqandnode_size = 0x %8.8x \n", - in_session_serviceid_clockseqandnode_size); - printf(" in_session_opscnt = 0x %8.8x \n", in_session_opscnt); - printf(" in_session_head_next = 0x %16.16lx \n", in_session_head_next); - printf(" in_session_head_prev = 0x %16.16lx \n", in_session_head_prev); -#endif - std::cout << "gpp received in_session_context: 0x " << std::hex << std::setfill('0') - << std::setw(16) << in_session_context << std::endl; - -#if 0 - printf(" commandid = 0x %8.8x \n", in_commandid); - printf(" in_operation_started = 0x %8.8x \n", in_operation_started); - printf(" in_operation_paramtypes = 0x %8.8x \n", in_operation_paramtypes); - printf(" in_operation_param1_tmpref_buffer = 0x %16.16lx \n", in_operation_param1_tmpref_buffer); - printf(" in_operation_param1_tmpref_size = 0x %8.8x \n", in_operation_param1_tmpref_size); - printf(" in_operation_param1_memref_parent = 0x %16.16lx \n", in_operation_param1_memref_parent); - printf(" in_operation_param1_memref_size = 0x %8.8x \n", in_operation_param1_memref_size); - printf(" in_operation_param1_memref_offset = 0x %8.8x \n", in_operation_param1_memref_offset); - printf(" in_operation_param1_value_a = 0x %8.8x \n", in_operation_param1_value_a); - printf(" in_operation_param1_value_b = 0x %8.8x \n", in_operation_param1_value_b); - printf(" in_operation_param1_ionref_ionsharefd = 0x %8.8x \n",in_operation_param2_ionref_ionsharefd); - printf(" in_operation_param1_ionref_ionsize = 0x %8.8x \n", in_operation_param2_ionref_ionsize); - - printf(" in_operation_param2_tmpref_buffer = 0x %16.16lx \n", in_operation_param2_tmpref_buffer); - printf(" in_operation_param2_tmpref_size = 0x %8.8x \n", in_operation_param2_tmpref_size); - printf(" in_operation_param2_memref_parent = 0x %16.16lx \n", in_operation_param2_memref_parent); - printf(" in_operation_param2_memref_size = 0x %8.8x \n", in_operation_param2_memref_size); - printf(" in_operation_param2_memref_offset = 0x %8.8x \n", in_operation_param2_memref_offset); - printf(" in_operation_param2_value_a = 0x %8.8x \n", in_operation_param3_value_a); - printf(" in_operation_param2_value_b = 0x %8.8x \n", in_operation_param3_value_b); - printf(" in_operation_param2_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); - printf(" in_operation_param2_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); - - printf(" in_operation_param3_tmpref_buffer = 0x %16.16lx \n", in_operation_param3_tmpref_buffer); - printf(" in_operation_param3_tmpref_size = 0x %8.8x \n", in_operation_param3_tmpref_size); - printf(" in_operation_param3_memref_parent = 0x %16.16lx \n", in_operation_param3_memref_parent); - printf(" in_operation_param3_memref_size = 0x %8.8x \n", in_operation_param3_memref_size); - printf(" in_operation_param3_memref_offset = 0x %8.8x \n", in_operation_param3_memref_offset); - printf(" in_operation_param3_value_a = 0x %8.8x \n", in_operation_param3_value_a); - printf(" in_operation_param3_value_b = 0x %8.8x \n", in_operation_param3_value_b); - printf(" in_operation_param3_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); - printf(" in_operation_param3_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); - - printf(" in_operation_param4_tmpref_buffer = 0x %16.16lx \n", in_operation_param4_tmpref_buffer); - printf(" in_operation_param4_tmpref_size = 0x %8.8x \n", in_operation_param4_tmpref_size); - printf(" in_operation_param4_memref_parent = 0x %16.16lx \n", in_operation_param4_memref_parent); - printf(" in_operation_param4_memref_size = 0x %8.8x \n", in_operation_param4_memref_size); - printf(" in_operation_param4_memref_offset = 0x %8.8x \n", in_operation_param4_memref_offset); - printf(" in_operation_param4_value_a = 0x %8.8x \n", in_operation_param4_value_a); - printf(" in_operation_param4_value_b = 0x %8.8x \n", in_operation_param4_value_b); - printf(" in_operation_param4_ionref_ionsharefd = 0x %8.8x \n", in_operation_param4_ionref_ionsharefd); - printf(" in_operation_param4_ionref_ionsize = 0x %8.8x \n", in_operation_param4_ionref_ionsize); - - printf(" in_operation_session = 0x %16.16lx \n", in_operation_session); - printf(" in_operation_cancelflag = 0x %8.8x \n", in_operation_cancelflag); - - printf(" in_returnorigin = 0x %8.8x \n", in_returnorigin); - - printf(" in_buffer1 = \n"); - if (in_buffer1_size > 0) { - printf(" "); - for (int i = 0; i < in_buffer1_realsize; i++) { - printf(" %2.2x", in_buffer1[i]); - } - printf("\n"); - } -#endif - -#if 0 - printf(" in_buffer1_size = 0x %8.8x \n", - in_buffer1_size); -#endif - -#if 0 - printf(" in_buffer2 = \n"); - if (in_buffer2_size > 0) { - printf(" "); - for (int i = 0; i < in_buffer2_realsize; i++) { - printf(" %2.2x", in_buffer2[i]); - } - printf("\n"); - } - printf(" in_buffer2_size = 0x %8.8x \n", - in_buffer2_size); - - printf(" in_buffer3 = \n"); - if (in_buffer3_size > 0) { - printf(" "); - for (int i = 0; i < in_buffer3_realsize; i++) { - printf(" %2.2x", in_buffer3[i]); - } - printf("\n"); - } - printf(" in_buffer3_size = 0x %8.8x \n", - in_buffer3_size); - - printf(" in_buffer4 = \n"); - if (in_buffer4_size > 0) { - printf(" "); - for (int i = 0; i < in_buffer4_realsize; i++) { - printf(" %2.2x", in_buffer4[i]); - } - printf("\n"); - } - printf(" in_buffer4_size = 0x %8.8x \n", - in_buffer4_size); - -#endif - if (in_buffer1_size > 0) - { - } else - { - in_buffer1_realsize = 0; - } - if (in_buffer2_size > 0) - { - } else - { - in_buffer2_realsize = 0; - } - if (in_buffer3_size > 0) - { - } else - { - in_buffer3_realsize = 0; - } - if (in_buffer4_size > 0) - { - } else - { - in_buffer4_realsize = 0; - } - - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(uint32_t) - ); - uint32_t serviceid_clockseqandnode_outsize_temp; - uint32_t returnorigin_temp; - - uint32_t *buffer1_temp = NULL; - uint32_t buffer1_size = 4096; - uint32_t buffer1_outsize_temp; - buffer1_temp = - (uint32_t *) malloc(buffer1_size * sizeof(uint32_t)); - - uint32_t buffer2_size = 4096; - uint32_t *buffer2_temp = NULL; - uint32_t buffer2_outsize_temp; - buffer2_temp = - (uint32_t *) malloc(buffer2_size * sizeof(uint32_t)); - - uint32_t buffer3_size = 4096; - uint32_t *buffer3_temp = NULL; - uint32_t buffer3_outsize_temp; - buffer3_temp = - (uint32_t *) malloc(buffer3_size * sizeof(uint32_t)); - - uint32_t buffer4_size = 4096; - uint32_t *buffer4_temp = NULL; - uint32_t buffer4_outsize_temp; - buffer4_temp = - (uint32_t *) malloc(buffer4_size * sizeof(uint32_t)); - - char workername[1024]; - memset((char *) workername, 0, 1024); - int ifound = 0; - int iworker; - sin_t *sinIns; - - pthread_mutex_lock(mutex_workerrec_); - for (iworker = 0; iworker < global_max_num_worker; iworker++) - { - if (workerrec_[iworker].context_addr == in_session_context) - { - sinIns = NULL; - if (workerrec_[iworker].first != NULL) - { - sinIns = workerrec_[iworker].first; - do - { - if (sinIns->session_id == in_session_sessionid) - { - sprintf(workername, "%s%d", "gpworker", iworker); - std::cout << "gpp method call worker No: " << std::dec << iworker << std::endl; - ifound = 1; - break; - } - sinIns = sinIns->next; - } while (sinIns != NULL); - if (ifound == 1) - { - break; - } - } - } - } - pthread_mutex_unlock(mutex_workerrec_); - - if (ifound == 0) - { - printf("gpp can't find the worker for the session and the context. \n"); - - teecresult = 0xAAAA0017; - - sessionid = 0x0; - serviceid_timelow = 0x0; - serviceid_timemid = 0x0; - serviceid_timehiandver = 0x0; - opscnt = 0x0; - head_next = 0x0; - head_prev = 0x0; - session_context = 0x0; - started = 0x0; - paramtypes = 0x0; - - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(uint32_t) - ); - for (int i = 0; i < serviceid_clockseqandnode_realsize; i++) - { - serviceid_clockseqandnode[i] = 0x0; - } - serviceid_clockseqandnode_outsize = 8; - - operation_param1_tmpref_buffer = 0x0; - operation_param1_tmpref_size = 0x0; - operation_param1_memref_parent = 0x0; - operation_param1_memref_size = 0x0; - operation_param1_memref_offset = 0x0; - operation_param1_value_a = 0x0; - operation_param1_value_b = 0x0; - operation_param1_ionref_ionsharefd = 0x0; - operation_param1_ionref_ionsize = 0x0; - - operation_param2_tmpref_buffer = 0x0; - operation_param2_tmpref_size = 0x0; - operation_param2_memref_parent = 0x0; - operation_param2_memref_size = 0x0; - operation_param2_memref_offset = 0x0; - operation_param2_value_a = 0x0; - operation_param2_value_b = 0x0; - operation_param2_ionref_ionsharefd = 0x0; - operation_param2_ionref_ionsize = 0x0; - - operation_param3_tmpref_buffer = 0x0; - operation_param3_tmpref_size = 0x0; - operation_param3_memref_parent = 0x0; - operation_param3_memref_size = 0x0; - operation_param3_memref_offset = 0x0; - operation_param3_value_a = 0x0; - operation_param3_value_b = 0x0; - operation_param3_ionref_ionsharefd = 0x0; - operation_param3_ionref_ionsize = 0x0; - - operation_param4_tmpref_buffer = 0x0; - operation_param4_tmpref_size = 0x0; - operation_param4_memref_parent = 0x0; - operation_param4_memref_size = 0x0; - operation_param4_memref_offset = 0x0; - operation_param4_value_a = 0x0; - operation_param4_value_b = 0x0; - operation_param4_ionref_ionsharefd = 0x0; - operation_param4_ionref_ionsize = 0x0; - - operation_session = 0x0; - operation_cancelflag = 0x0; - - returnorigin = 0x0; - - buffer1_realsize = 0; - buffer1_outsize = buffer1_realsize; - - buffer2_realsize = 0; - buffer2_outsize = buffer2_realsize; - - buffer3_realsize = 0; - buffer3_outsize = buffer3_realsize; - - buffer4_realsize = 0; - buffer4_outsize = buffer4_realsize; - - invo_reply.set_teecresult(teecresult); - invo_reply.set_session_sessionid(sessionid); - invo_reply.set_session_serviceid_timelow(serviceid_timelow); - invo_reply.set_session_serviceid_timemid(serviceid_timemid); - invo_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); - invo_reply.set_session_serviceid_clockseqandnode_outsize(serviceid_clockseqandnode_outsize); - if (serviceid_clockseqandnode_outsize > 0 && - serviceid_clockseqandnode != NULL - ) - { - for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) - invo_reply.add_session_serviceid_clockseqandnode(serviceid_clockseqandnode[i]); - } - invo_reply.set_session_opscnt(opscnt); - invo_reply.set_session_head_next(head_next); - invo_reply.set_session_head_prev(head_prev); - invo_reply.set_session_context(session_context); - invo_reply.set_operation_started(started); - invo_reply.set_operation_paramtypes(paramtypes); - - invo_reply.set_operation_param1_tmpref_buffer(operation_param1_tmpref_buffer); - invo_reply.set_operation_param1_tmpref_size(operation_param1_tmpref_size); - invo_reply.set_operation_param1_memref_parent(operation_param1_memref_parent); - invo_reply.set_operation_param1_memref_parent_flag(in_operation_param1_memref_parent_flag); - invo_reply.set_operation_param1_memref_size(operation_param1_memref_size); - invo_reply.set_operation_param1_memref_offset(operation_param1_memref_offset); - invo_reply.set_operation_param1_value_a(operation_param1_value_a); - invo_reply.set_operation_param1_value_b(operation_param1_value_b); - invo_reply.set_operation_param1_ionref_ionsharefd(operation_param1_ionref_ionsharefd); - invo_reply.set_operation_param1_ionref_ionsize(operation_param1_ionref_ionsize); - - invo_reply.set_operation_param2_tmpref_buffer(operation_param2_tmpref_buffer); - invo_reply.set_operation_param2_tmpref_size(operation_param2_tmpref_size); - invo_reply.set_operation_param2_memref_parent(operation_param2_memref_parent); - invo_reply.set_operation_param2_memref_parent_flag(in_operation_param2_memref_parent_flag); - invo_reply.set_operation_param2_memref_size(operation_param2_memref_size); - invo_reply.set_operation_param2_memref_offset(operation_param2_memref_offset); - invo_reply.set_operation_param2_value_a(operation_param2_value_a); - invo_reply.set_operation_param2_value_b(operation_param2_value_b); - invo_reply.set_operation_param2_ionref_ionsharefd(operation_param2_ionref_ionsharefd); - invo_reply.set_operation_param2_ionref_ionsize(operation_param2_ionref_ionsize); - - invo_reply.set_operation_param3_tmpref_buffer(operation_param3_tmpref_buffer); - invo_reply.set_operation_param3_tmpref_size(operation_param3_tmpref_size); - invo_reply.set_operation_param3_memref_parent(operation_param3_memref_parent); - invo_reply.set_operation_param3_memref_parent_flag(in_operation_param3_memref_parent_flag); - invo_reply.set_operation_param3_memref_size(operation_param3_memref_size); - invo_reply.set_operation_param3_memref_offset(operation_param3_memref_offset); - invo_reply.set_operation_param3_value_a(operation_param3_value_a); - invo_reply.set_operation_param3_value_b(operation_param3_value_b); - invo_reply.set_operation_param3_ionref_ionsharefd(operation_param3_ionref_ionsharefd); - invo_reply.set_operation_param3_ionref_ionsize(operation_param3_ionref_ionsize); - - invo_reply.set_operation_param4_tmpref_buffer(operation_param4_tmpref_buffer); - invo_reply.set_operation_param4_tmpref_size(operation_param4_tmpref_size); - invo_reply.set_operation_param4_memref_parent(operation_param4_memref_parent); - invo_reply.set_operation_param4_memref_parent_flag(in_operation_param4_memref_parent_flag); - invo_reply.set_operation_param4_memref_size(operation_param4_memref_size); - invo_reply.set_operation_param4_memref_offset(operation_param4_memref_offset); - invo_reply.set_operation_param4_value_a(operation_param4_value_a); - invo_reply.set_operation_param4_value_b(operation_param4_value_b); - invo_reply.set_operation_param4_ionref_ionsharefd(operation_param4_ionref_ionsharefd); - invo_reply.set_operation_param4_ionref_ionsize(operation_param4_ionref_ionsize); - - invo_reply.set_operation_session(operation_session); - invo_reply.set_operation_cancelflag(operation_cancelflag); - invo_reply.set_returnorigin(returnorigin); - - invo_reply.set_buffer1_outsize(buffer1_realsize); - invo_reply.set_buffer2_outsize(buffer2_realsize); - invo_reply.set_buffer3_outsize(buffer3_realsize); - invo_reply.set_buffer4_outsize(buffer4_realsize); - - if (buffer1_realsize > 0 && - buffer1 != NULL - ) - { - for (int i = 0; i < buffer1_realsize; i++) - - invo_reply.add_buffer1(buffer1[i]); - } - - if (buffer2_realsize > 0 && - buffer2 != NULL - ) - { - for (int i = 0; i < buffer2_realsize; i++) - invo_reply.add_buffer2(buffer2[i]); - } - - if (buffer3_realsize > 0 && - buffer3 != NULL - ) - { - for (int i = 0; i < buffer3_realsize; i++) - invo_reply.add_buffer3(buffer3[i]); - } - - if (buffer4_realsize > 0 && - buffer4 != NULL - ) - { - for (int i = 0; i < buffer4_realsize; i++) - invo_reply.add_buffer4(buffer4[i]); - } - status_ = FINISH; - - invo_response.Finish(invo_reply, Status::OK, this); - } else - { - method_call_teec_invokecommand( - workername, - - in_session_sessionid, - in_session_serviceid_timelow, - in_session_serviceid_timemid, - in_session_serviceid_timehiandver, - in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_realsize, - in_session_opscnt, - in_session_head_next, - in_session_head_prev, - in_session_context, - - in_commandid, - - in_operation_started, - in_operation_paramtypes, - - in_operation_param1_tmpref_buffer, - in_operation_param1_tmpref_size, - in_operation_param1_memref_parent, - in_operation_param1_memref_parent_flag, - in_operation_param1_memref_size, - in_operation_param1_memref_offset, - in_operation_param1_value_a, - in_operation_param1_value_b, - in_operation_param1_ionref_ionsharefd, - in_operation_param1_ionref_ionsize, - - in_operation_param2_tmpref_buffer, - in_operation_param2_tmpref_size, - in_operation_param2_memref_parent, - in_operation_param2_memref_parent_flag, - in_operation_param2_memref_size, - in_operation_param2_memref_offset, - in_operation_param2_value_a, - in_operation_param2_value_b, - in_operation_param2_ionref_ionsharefd, - in_operation_param2_ionref_ionsize, - - in_operation_param3_tmpref_buffer, - in_operation_param3_tmpref_size, - in_operation_param3_memref_parent, - in_operation_param3_memref_parent_flag, - in_operation_param3_memref_size, - in_operation_param3_memref_offset, - in_operation_param3_value_a, - in_operation_param3_value_b, - in_operation_param3_ionref_ionsharefd, - in_operation_param3_ionref_ionsize, - - in_operation_param4_tmpref_buffer, - in_operation_param4_tmpref_size, - in_operation_param4_memref_parent, - in_operation_param4_memref_parent_flag, - in_operation_param4_memref_size, - in_operation_param4_memref_offset, - in_operation_param4_value_a, - in_operation_param4_value_b, - in_operation_param4_ionref_ionsharefd, - in_operation_param4_ionref_ionsize, - - in_operation_session, - in_operation_cancelflag, - - in_returnorigin, - - in_buffer1, - in_buffer1_realsize, - in_buffer2, - in_buffer2_realsize, - in_buffer3, - in_buffer3_realsize, - in_buffer4, - in_buffer4_realsize, - - - &teecresult, - - &sessionid, - &serviceid_timelow, - &serviceid_timemid, - &serviceid_timehiandver, - serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize, - &serviceid_clockseqandnode_outsize_temp, - - &opscnt, - &head_next, - &head_prev, - &session_context, - - &started, - ¶mtypes, - - &operation_param1_tmpref_buffer, - &operation_param1_tmpref_size, - &operation_param1_memref_parent, - &operation_param1_memref_parent_flag, - &operation_param1_memref_size, - &operation_param1_memref_offset, - &operation_param1_value_a, - &operation_param1_value_b, - &operation_param1_ionref_ionsharefd, - &operation_param1_ionref_ionsize, - - &operation_param2_tmpref_buffer, - &operation_param2_tmpref_size, - &operation_param2_memref_parent, - &operation_param2_memref_parent_flag, - &operation_param2_memref_size, - &operation_param2_memref_offset, - &operation_param2_value_a, - &operation_param2_value_b, - &operation_param2_ionref_ionsharefd, - &operation_param2_ionref_ionsize, - - &operation_param3_tmpref_buffer, - &operation_param3_tmpref_size, - &operation_param3_memref_parent, - &operation_param3_memref_parent_flag, - &operation_param3_memref_size, - &operation_param3_memref_offset, - &operation_param3_value_a, - &operation_param3_value_b, - &operation_param3_ionref_ionsharefd, - &operation_param3_ionref_ionsize, - - &operation_param4_tmpref_buffer, - &operation_param4_tmpref_size, - &operation_param4_memref_parent, - &operation_param4_memref_parent_flag, - &operation_param4_memref_size, - &operation_param4_memref_offset, - &operation_param4_value_a, - &operation_param4_value_b, - &operation_param4_ionref_ionsharefd, - &operation_param4_ionref_ionsize, - - &operation_session, - &operation_cancelflag, - - &returnorigin_temp, - - buffer1_temp, - buffer1_size, - &buffer1_outsize_temp, - buffer2_temp, - buffer2_size, - &buffer2_outsize_temp, - buffer3_temp, - buffer3_size, - &buffer3_outsize_temp, - buffer4_temp, - buffer4_size, - &buffer4_outsize_temp - ); - - pthread_mutex_lock(mutex_workerrec_); - struct timeval tvcreate; - gettimeofday(&tvcreate, NULL); - workerrec_[iworker].context_createtime = tvcreate; - sinIns->session_createtime = tvcreate; - pthread_mutex_unlock(mutex_workerrec_); - - serviceid_clockseqandnode_outsize = - serviceid_clockseqandnode_outsize_temp; - - returnorigin = returnorigin_temp; - - buffer1_outsize = buffer1_outsize_temp; - buffer2_outsize = buffer2_outsize_temp; - buffer3_outsize = buffer3_outsize_temp; - buffer4_outsize = buffer4_outsize_temp; - - - buffer1_realsize = buffer1_outsize; - if (buffer1_realsize > 0) - { - buffer1 = - (uint32_t *) malloc( - buffer1_realsize * sizeof(uint32_t) - ); - for (int i = 0; i < buffer1_realsize; i++) - { - buffer1[i] = (uint32_t) buffer1_temp[i]; - } - } - buffer2_realsize = buffer2_outsize; - if (buffer2_realsize > 0) - { - buffer2 = - (uint32_t *) malloc( - buffer2_realsize * sizeof(uint32_t) - ); - for (int i = 0; i < buffer2_realsize; i++) - { - buffer2[i] = (uint32_t) buffer2_temp[i]; - } - } - - buffer3_realsize = buffer3_outsize; - if (buffer3_realsize > 0) - { - buffer3 = - (uint32_t *) malloc( - buffer3_realsize * sizeof(uint32_t) - ); - for (int i = 0; i < buffer3_realsize; i++) - { - buffer3[i] = (uint32_t) buffer3_temp[i]; - } - } - - buffer4_realsize = buffer4_outsize; - if (buffer4_realsize > 0) - { - buffer4 = - (uint32_t *) malloc( - buffer4_realsize * sizeof(uint32_t) - ); - for (int i = 0; i < buffer4_realsize; i++) - { - buffer4[i] = (uint32_t) buffer4_temp[i]; - } - } - if (buffer1_temp != NULL) - { - free(buffer1_temp); - } - if (buffer2_temp != NULL) - { - free(buffer2_temp); - } - if (buffer3_temp != NULL) - { - free(buffer3_temp); - } - if (buffer4_temp != NULL) - { - free(buffer4_temp); - } - - invo_reply.set_teecresult(teecresult); - invo_reply.set_session_sessionid(sessionid); - invo_reply.set_session_serviceid_timelow(serviceid_timelow); - invo_reply.set_session_serviceid_timemid(serviceid_timemid); - invo_reply.set_session_serviceid_timehiandver(serviceid_timehiandver); - invo_reply.set_session_serviceid_clockseqandnode_outsize(serviceid_clockseqandnode_outsize); - - if (serviceid_clockseqandnode_outsize > 0 && - serviceid_clockseqandnode != NULL - ) - { - for (int i = 0; i < serviceid_clockseqandnode_outsize; i++) - invo_reply.add_session_serviceid_clockseqandnode(serviceid_clockseqandnode[i]); - } - invo_reply.set_session_opscnt(opscnt); - invo_reply.set_session_head_next(head_next); - invo_reply.set_session_head_prev(head_prev); - invo_reply.set_session_context(session_context); - invo_reply.set_operation_started(started); - invo_reply.set_operation_paramtypes(paramtypes); - - invo_reply.set_operation_param1_tmpref_buffer(operation_param1_tmpref_buffer); - invo_reply.set_operation_param1_tmpref_size(operation_param1_tmpref_size); - invo_reply.set_operation_param1_memref_parent(operation_param1_memref_parent); - invo_reply.set_operation_param1_memref_parent_flag(in_operation_param1_memref_parent_flag); - invo_reply.set_operation_param1_memref_size(operation_param1_memref_size); - invo_reply.set_operation_param1_memref_offset(operation_param1_memref_offset); - invo_reply.set_operation_param1_value_a(operation_param1_value_a); - invo_reply.set_operation_param1_value_b(operation_param1_value_b); - invo_reply.set_operation_param1_ionref_ionsharefd(operation_param1_ionref_ionsharefd); - invo_reply.set_operation_param1_ionref_ionsize(operation_param1_ionref_ionsize); - - invo_reply.set_operation_param2_tmpref_buffer(operation_param2_tmpref_buffer); - invo_reply.set_operation_param2_tmpref_size(operation_param2_tmpref_size); - invo_reply.set_operation_param2_memref_parent(operation_param2_memref_parent); - invo_reply.set_operation_param2_memref_parent_flag(in_operation_param2_memref_parent_flag); - invo_reply.set_operation_param2_memref_size(operation_param2_memref_size); - invo_reply.set_operation_param2_memref_offset(operation_param2_memref_offset); - invo_reply.set_operation_param2_value_a(operation_param2_value_a); - invo_reply.set_operation_param2_value_b(operation_param2_value_b); - invo_reply.set_operation_param2_ionref_ionsharefd(operation_param2_ionref_ionsharefd); - invo_reply.set_operation_param2_ionref_ionsize(operation_param2_ionref_ionsize); - - invo_reply.set_operation_param3_tmpref_buffer(operation_param3_tmpref_buffer); - invo_reply.set_operation_param3_tmpref_size(operation_param3_tmpref_size); - invo_reply.set_operation_param3_memref_parent(operation_param3_memref_parent); - invo_reply.set_operation_param3_memref_parent_flag(in_operation_param3_memref_parent_flag); - invo_reply.set_operation_param3_memref_size(operation_param3_memref_size); - invo_reply.set_operation_param3_memref_offset(operation_param3_memref_offset); - invo_reply.set_operation_param3_value_a(operation_param3_value_a); - invo_reply.set_operation_param3_value_b(operation_param3_value_b); - invo_reply.set_operation_param3_ionref_ionsharefd(operation_param3_ionref_ionsharefd); - invo_reply.set_operation_param3_ionref_ionsize(operation_param3_ionref_ionsize); - - invo_reply.set_operation_param4_tmpref_buffer(operation_param4_tmpref_buffer); - invo_reply.set_operation_param4_tmpref_size(operation_param4_tmpref_size); - invo_reply.set_operation_param4_memref_parent(operation_param4_memref_parent); - invo_reply.set_operation_param4_memref_parent_flag(in_operation_param4_memref_parent_flag); - invo_reply.set_operation_param4_memref_size(operation_param4_memref_size); - invo_reply.set_operation_param4_memref_offset(operation_param4_memref_offset); - invo_reply.set_operation_param4_value_a(operation_param4_value_a); - invo_reply.set_operation_param4_value_b(operation_param4_value_b); - invo_reply.set_operation_param4_ionref_ionsharefd(operation_param4_ionref_ionsharefd); - invo_reply.set_operation_param4_ionref_ionsize(operation_param4_ionref_ionsize); - - invo_reply.set_operation_session(operation_session); - invo_reply.set_operation_cancelflag(operation_cancelflag); - invo_reply.set_returnorigin(returnorigin); - - invo_reply.set_buffer1_outsize(buffer1_realsize); - invo_reply.set_buffer2_outsize(buffer2_realsize); - invo_reply.set_buffer3_outsize(buffer3_realsize); - invo_reply.set_buffer4_outsize(buffer4_realsize); - - if (buffer1_realsize > 0 && - buffer1 != NULL - ) - { - for (int i = 0; i < buffer1_realsize; i++) - - invo_reply.add_buffer1(buffer1[i]); - } - - if (buffer2_realsize > 0 && - buffer2 != NULL - ) - { - for (int i = 0; i < buffer2_realsize; i++) - invo_reply.add_buffer2(buffer2[i]); - } - - if (buffer3_realsize > 0 && - buffer3 != NULL - ) - { - for (int i = 0; i < buffer3_realsize; i++) - invo_reply.add_buffer3(buffer3[i]); - } - - if (buffer4_realsize > 0 && - buffer4 != NULL - ) - { - for (int i = 0; i < buffer4_realsize; i++) - invo_reply.add_buffer4(buffer4[i]); - } - status_ = FINISH; - gettimeofday(&end, NULL); - int64_t i64Time; - i64Time = (end.tv_sec - start.tv_sec) * 1000000 + - (end.tv_usec - start.tv_usec); - printf("gpp invokecommand used time: %ld us. \n", i64Time); - - invo_response.Finish(invo_reply, Status::OK, this); - } - }else - { - std::cout << "gpp receive no invokecommand jwtsvid or validate jwt failed" << std::endl; - flag = 2; - invo_reply.set_flag(flag); - status_ = FINISH; - - invo_response.Finish(invo_reply, Status::OK, this); - } - break; - } - - case ServerImpl::CallData::SS_TEECC_TA: - { - std::string token; - token = ta_chunk.token(); - std::int32_t flag = 0; - - std::string noToken("noToken"); - int ivaljwtResult = -1; - int iforceValidateJwt = global_force_valideta_jwt; - - if - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - ) - { - char Token[1024]; - strcpy(Token, (char *) token.data()); - ivaljwtResult = - dbusmethodcall_validate_jwt( - Token - ); - std::cout << "gpp validate deployta jwtsvid" << std::endl; - } else - { - std::cout << "gpp no validate deployta jwtsvid" << std::endl; - } - - if - ( - iforceValidateJwt != 1 - || - ( - iforceValidateJwt == 1 - && - token.compare(noToken) != 0 - && - ivaljwtResult == NO_ERROR - ) - ) - { - std::cout << "gpp does not need validate deployta jwtsvid or validate jwt succed" << std::endl; - std::cout << "gpp received deployta " << std::endl; - - std::string remote_sha256 = ta_chunk.sha256(); - - std::string subdir = ta_chunk.subdir(); - - std::string name = ta_chunk.name(); - name = "/data/" + subdir + "/" + name; - const char *filename = name.data(); - - std::cout << "gpp deployta, full namepath: " << name << std::endl; - - if (access(name.c_str(), F_OK) != -1) - { - std::cout << "gpp deloyta: ta file exist" << std::endl; - - char *name_temp = const_cast(name.data()); - char local_sha256_temp[SHA256_LENTH]; - int iRet; - iRet = get_file_sha256((char *) name_temp, local_sha256_temp); - if (iRet != 0) - { - ta_reply.set_code(-2); - status_ = FINISH; - - ta_response.Finish(ta_reply, Status::OK, this); - } else - { - - char remote_sha256_temp[SHA256_LENTH + 1]; - strcpy(remote_sha256_temp, remote_sha256.c_str()); - - - - if (memcmp(local_sha256_temp, remote_sha256_temp, SHA256_LENTH) == 0) - { - std::cout << "gpp deloyta: sha256 vals are the same" << std::endl; - - status_ = FINISH; - ta_reply.set_code(0); - - ta_response.Finish(ta_reply, Status::OK, this); - } else - { - std::cout << "gpp deloyta: sha256 vals are different, replace " << filename - << std::endl; - - std::ofstream outfile; - outfile.open(filename, - std::ofstream::out | std::ofstream::trunc | std::ofstream::binary); - - const char *data; - data = ta_chunk.buffer().c_str(); - outfile.write(data, ta_chunk.buffer().length()); - outfile.close(); - - status_ = FINISH; - ta_reply.set_code(0); - - ta_response.Finish(ta_reply, Status::OK, this); - } - - } - } else - { - std::string wholedir; - wholedir = "/data/" + subdir; - const char *charwholedir = wholedir.data(); - - std::cout << "gpp deployta, wholedir: " << wholedir << std::endl; - - struct stat st = {0}; - if (stat(charwholedir, &st) == -1) - { - std::cout << "gpp deployta, make a new dir " << wholedir << std::endl; - - int iResult; - iResult = mkdir(charwholedir, 0600); - - if (iResult != 0) - { - std::cout << "gpp deployta, make a new dir falied" << wholedir << std::endl; - } - } - - if (stat(charwholedir, &st) == 0) - { - std::cout << "gpp deloyta: write a new file " << filename << std::endl; - - std::ofstream outfile; - outfile.open(filename, std::ofstream::out | std::ofstream::trunc | std::ofstream::binary); - - const char *data; - data = ta_chunk.buffer().c_str(); - outfile.write(data, ta_chunk.buffer().length()); - outfile.close(); - - status_ = FINISH; - ta_reply.set_code(0); - - ta_response.Finish(ta_reply, Status::OK, this); - } else - { - ta_reply.set_code(-3); - status_ = FINISH; - - ta_response.Finish(ta_reply, Status::OK, this); - } - } - - }else - { - std::cout << "gpp receive no deployta jwtsvid or validate jwt failed" << std::endl; - ta_reply.set_code(-1); - ta_reply.set_flag(flag); - status_ = FINISH; - - ta_response.Finish(ta_reply, Status::OK, this); - } - - break; - } - - default: - break; - } - } else - { - GPR_ASSERT(status_ == FINISH); - delete this; - std::cout << std::endl; - } - } - - private: - gpp::AsyncService *service_; - ServerCompletionQueue *cq_; - ServerContext ctx_; - ServiceType s_type_; - Inicont_Request inicont_request; - Inicont_Reply inicont_reply; - ServerAsyncResponseWriter inicont_response; - Fincont_Request fincont_request; - Fincont_Reply fincont_reply; - ServerAsyncResponseWriter fincont_response; - Opes_Request opes_request; - Opes_Reply opes_reply; - ServerAsyncResponseWriter opes_response; - Close_Request close_request; - Close_Reply close_reply; - ServerAsyncResponseWriter close_response; - Invo_Request invo_request; - Invo_Reply invo_reply; - ServerAsyncResponseWriter invo_response; - TA_Chunk ta_chunk; - TA_Reply ta_reply; - ServerAsyncResponseWriter ta_response; - Setjwt_Request setjwt_request; - Setjwt_Reply setjwt_reply; - ServerAsyncResponseWriter setjwt_response; - - enum CallStatus - { - CREATE, PROCESS, CHECKCANCEL, FINISH - }; - CallStatus status_; - - pthread_mutex_t *mutex_workerrec_; - pthread_cond_t *cond_notbusy_; - wr_t *workerrec_; - }; - - void RunServer() - { - std::string server_address(gpproxy_address); - grpc::EnableDefaultHealthCheckService(true); - grpc::reflection::InitProtoReflectionServerBuilderPlugin(); - - - ServerBuilder builder; - builder.SetMaxReceiveMessageSize(50 * 1024 * 1024); - - std::cout << "gpproxy server key path = " << global_serverkey_path << std::endl; - std::cout << "gpproxy server cert path = " << global_servercert_path << std::endl; - std::cout << "gpproxy client ca cert path = " << global_clientcacert_path << std::endl; - - int igrpctls = grpc_tls; - switch (igrpctls) - { - case 0: - { - builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); - - break; - } - - case 1: - { - FILE *pipe; - char buffer[128]; - std::string result; - - std::string strcmd = "openssl rsa -in " + global_serverkey_path + " -out " - + global_serverkey_path + ".nopass"; - std::string nopass_serverkey_path = global_serverkey_path + ".nopass"; - - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; - exit(1); - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - - - strcmd = "openssl rsa -in " + nopass_serverkey_path + " -check -noout"; - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; - exit(1); - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - std::string keyok("RSA key ok\n"); - - if (result.compare(keyok) != 0) - { - std::cout << "gpp '" + global_serverkey_path + "' integrity is broken" << std::endl; - exit(1); - } - - std::string sigfile_path = global_strcfgfiletemp + "/.gpp/certs/msg.sig"; - std::string msgfile_path = global_strcfgfiletemp + "/.gpp/certs/msg.txt"; - strcmd = - "openssl dgst -sha256 -sign " + nopass_serverkey_path + " -out " + sigfile_path + " " + msgfile_path; - system(strcmd.c_str()); - // ${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} - std::string pubkeyfile_path = global_strcfgfiletemp + "/.gpp/certs/server_pubkey.pem"; - strcmd = "openssl x509 -in " + global_servercert_path + " -pubkey -out " + pubkeyfile_path; - system(strcmd.c_str()); - - // ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt - strcmd = "openssl dgst -sha256 -verify " + pubkeyfile_path + " -signature " + sigfile_path + " " + - msgfile_path; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; - exit(1); - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - std::string verifyok("Verified OK\n"); - if (result.compare(verifyok) != 0) - { - std::cout << "gpp '" + global_serverkey_path + "' is not matched with '" + global_servercert_path + "'" - << std::endl; - exit(1); - } - - std::string strdayseconds; - char *resulttemp; - const char slash[] = "\n"; - char *parresult; - std::string strparresult; - std::string willexpire("Certificate will expire"); - - // 7 days in seconds - strdayseconds = "604800"; - strcmd = "openssl x509 -enddate -noout -in " + global_servercert_path + " -checkend " + strdayseconds; - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; - exit(1); - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); -; - resulttemp = const_cast(result.data()); - parresult = strtok(resulttemp, slash); - while (parresult != NULL) - { - strparresult = std::string(parresult); - parresult = strtok(NULL, slash); - } - if (strparresult.compare(willexpire) == 0) - { - std::cout << "gpp '" << global_servercert_path << "' will expire in 7 days, please reget it" - << std::endl; - exit(1); - } - - auto serverkey = get_file_contents(nopass_serverkey_path); - strcmd = "rm -f " + global_serverkey_path + ".nopass"; - system(strcmd.c_str()); - strcmd = "rm -f " + pubkeyfile_path; - system(strcmd.c_str()); - strcmd = "rm -f " + sigfile_path; - system(strcmd.c_str()); - - auto servercert = get_file_contents(global_servercert_path); - grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = { - serverkey.c_str(), servercert.c_str() - }; - - grpc::SslServerCredentialsOptions ssl_opts(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE); - ssl_opts.pem_key_cert_pairs.push_back(pkcp); - std::shared_ptr creds; - creds = grpc::SslServerCredentials(ssl_opts); - - builder.AddListeningPort(server_address, creds); - - break; - } - - case 2: - { - FILE *pipe; - char buffer[128]; - std::string result; - - std::string strcmd = "openssl rsa -in " + global_serverkey_path + " -out " - + global_serverkey_path + ".nopass"; - std::string nopass_serverkey_path = global_serverkey_path + ".nopass"; - system(strcmd.c_str()); - - strcmd = "openssl rsa -in " + nopass_serverkey_path + " -check -noout"; - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; - exit(1); - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - std::string keyok("RSA key ok\n"); - if (result.compare(keyok) != 0) - { - std::cout << "gpp '" + global_serverkey_path + "' integrity is broken" << std::endl; - exit(1); - } - - std::string sigfile_path = global_strcfgfiletemp + "/.gpp/certs/msg.sig"; - std::string msgfile_path = global_strcfgfiletemp + "/.gpp/certs/msg.txt"; - strcmd = - "openssl dgst -sha256 -sign " + nopass_serverkey_path + " -out " + sigfile_path + " " + msgfile_path; - system(strcmd.c_str()); - // ${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} - std::string pubkeyfile_path = global_strcfgfiletemp + "/.gpp/certs/server_pubkey.pem"; - strcmd = "openssl x509 -in " + global_servercert_path + " -pubkey -out " + pubkeyfile_path; - system(strcmd.c_str()); - - // ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt - strcmd = "openssl dgst -sha256 -verify " + pubkeyfile_path + " -signature " + sigfile_path + " " + - msgfile_path; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; - exit(1); - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - std::string verifyok("Verified OK\n"); - if (result.compare(verifyok) != 0) - { - std::cout << "gpp '" + global_serverkey_path + "' is not matched with '" + global_servercert_path + "'" - << std::endl; - exit(1); - } - - std::string strdayseconds; - char *resulttemp; - const char slash[] = "\n"; - char *parresult; - std::string strparresult; - std::string willexpire("Certificate will expire"); - - // 7 days in seconds - strdayseconds = "604800"; - strcmd = "openssl x509 -enddate -noout -in " + global_servercert_path + " -checkend " + strdayseconds; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; - exit(1); - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - - resulttemp = const_cast(result.data()); - parresult = strtok(resulttemp, slash); - while (parresult != NULL) - { - strparresult = std::string(parresult); - parresult = strtok(NULL, slash); - } - if (strparresult.compare(willexpire) == 0) - { - std::cout << "gpp '" << global_servercert_path << "' will expire in 7 days, please reget it" - << std::endl; - exit(1); - } - - strdayseconds = "604800"; - strcmd = "openssl x509 -enddate -noout -in " + global_clientcacert_path + " -checkend " + strdayseconds; - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "gpp popen '" << strcmd << "' failed" << std::endl; - exit(1); - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - resulttemp = const_cast(result.data()); - parresult = strtok(resulttemp, slash); - while (parresult != NULL) - { - strparresult = std::string(parresult); - parresult = strtok(NULL, slash); - } - if (strparresult.compare(willexpire) == 0) - { - std::cout << "gpp '" << global_clientcacert_path << "' will expire in 7 days, please reget it" - << std::endl; - exit(1); - } - - auto serverkey = get_file_contents(nopass_serverkey_path); - strcmd = "rm -f " + global_serverkey_path + ".nopass"; - system(strcmd.c_str()); - strcmd = "rm -f " + pubkeyfile_path; - system(strcmd.c_str()); - strcmd = "rm -f " + sigfile_path; - system(strcmd.c_str()); - - auto servercert = get_file_contents(global_servercert_path); - auto clientcacert = get_file_contents(global_clientcacert_path); // for verifying clients - grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = { - serverkey.c_str(), servercert.c_str() - }; - - grpc::SslServerCredentialsOptions ssl_opts(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY); - ssl_opts.pem_root_certs = clientcacert; - ssl_opts.pem_key_cert_pairs.push_back(pkcp); - std::shared_ptr creds; - creds = grpc::SslServerCredentials(ssl_opts); - - builder.AddListeningPort(server_address, creds); - - break; - } - - default: - { - builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); - } - } - - - // Register "service" as the instance through which we'll communicate with - // clients. In this case it corresponds to an *synchronous* service. - builder.RegisterService(&service_); - - for (int i = 0; i < global_max_num_thread; i++) - { - cq_.emplace_back(builder.AddCompletionQueue()); - } - server_ = builder.BuildAndStart(); - //Finally assemble the server. - std::cout << "gpproxy is listening on " << server_address << std::endl; - - server_threads_.emplace_back(std::thread( - [this] - { - this->session_timeout_process(&mutex_workerrec, workerrec); - } - )); - server_threads_.emplace_back(std::thread( - [this] - { - this->context_timeout_process(&mutex_workerrec, &cond_notbusy, workerrec); - } - )); - - for (unsigned int i = 0; i < global_max_num_thread; i++) - { - server_threads_.emplace_back(std::thread( - [this, i] - { - this->HandleRpcs(i); - })); - std::cout << "thread " << i << " created." << std::endl; - } - std::this_thread::sleep_until(std::chrono::time_point::max()); - } - - void HandleRpcs(int i) - { - new CallData(&service_, - cq_[i].get(), - ServerImpl::CallData::SS_TEECC_InitializeContext, - &mutex_workerrec, - &cond_notbusy, - workerrec); - new CallData(&service_, - cq_[i].get(), - ServerImpl::CallData::SS_TEECC_FinalizeContext, - &mutex_workerrec, &cond_notbusy, - workerrec); - new CallData(&service_, - cq_[i].get(), - ServerImpl::CallData::SS_TEECC_OpenSession, - &mutex_workerrec, - &cond_notbusy, - workerrec); - new CallData(&service_, - cq_[i].get(), - ServerImpl::CallData::SS_TEECC_CloseSession, - &mutex_workerrec, - &cond_notbusy, - workerrec); - new CallData(&service_, - cq_[i].get(), - ServerImpl::CallData::SS_TEECC_InvokeCommand, - &mutex_workerrec, - &cond_notbusy, - workerrec); - new CallData(&service_, - cq_[i].get(), - ServerImpl::CallData::SS_TEECC_TA, - &mutex_workerrec, - &cond_notbusy, - workerrec); - - new CallData(&service_, - cq_[i].get(), - ServerImpl::CallData::SS_TEECC_SetJwt, - &mutex_workerrec, - &cond_notbusy, - workerrec); - - void *tag; - bool ok; - - while (true) - { - GPR_ASSERT(cq_[i]->Next(&tag, &ok)); - std::cout << "gpp thread[" << i << "], cq_[" << i << "]" - << std::endl; - - static_cast(tag)->Process(); - } - } - - void - session_timeout_process( - pthread_mutex_t *mutex_workerrec, - wr_t *workerrec - ) - { - struct timeval tv; - uint64_t u64time; - - char workername[1024]; - memset((char *) workername, 0, 1024); - int iworker; - - uint32_t in_session_seesionid; - uint32_t in_session_serviceid_timelow = 0; - uint32_t in_session_serviceid_timemid = 0; - uint32_t in_session_serviceid_timehiandver = 0; - uint32_t in_session_serviceid_clockseqandnode_size = 8; - uint32_t in_session_serviceid_clockseqandnode[8]; - uint32_t in_session_opscnt = 0; - uint64_t in_session_head_next = 0; - uint64_t in_session_head_prev = 0; - uint64_t in_session_context; - - uint32_t seesionid; - uint32_t serviceid_timelow; - uint32_t serviceid_timemid; - uint32_t serviceid_timehiandver; - uint32_t *serviceid_clockseqandnode; - int serviceid_clockseqandnode_realsize; - uint32_t opscnt; - uint64_t head_next; - uint64_t head_prev; - uint64_t session_context; - - sin_t *sinIns; - - while (1) - { - sleep(global_timeout_session); - - pthread_mutex_lock(mutex_workerrec); - for (iworker = 0; iworker < global_max_num_worker; iworker++) - { - if (workerrec[iworker].busy == 1) - { - sinIns = NULL; - if (workerrec[iworker].first != NULL) - { - sinIns = workerrec[iworker].first; - do - { - gettimeofday(&tv, NULL); - u64time = (long unsigned int) (tv.tv_sec - - sinIns->session_createtime.tv_sec - ); - sin_t *sinTemp = NULL; - - if (u64time > global_timeout_session) - { - sprintf(workername, "%s%d", "gpworker", iworker); - - in_session_seesionid = sinIns->session_id; - in_session_context = workerrec[iworker].context_addr; - - for (int iind = 0; iind < 8; iind++) - { - in_session_serviceid_clockseqandnode[iind] = 0; - } - - pthread_mutex_unlock(mutex_workerrec); - - uint32_t serviceid_clockseqandnode_outsize_temp; - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(uint32_t) - ); - - printf("\ngpp method call teec closesession for timeout process \n"); - method_call_teec_closesession( - workername, - - in_session_seesionid, - in_session_serviceid_timelow, - in_session_serviceid_timemid, - in_session_serviceid_timehiandver, - in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_size, - in_session_opscnt, - in_session_head_next, - in_session_head_prev, - in_session_context, - - &seesionid, - &serviceid_timelow, - &serviceid_timemid, - &serviceid_timehiandver, - serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize, - &serviceid_clockseqandnode_outsize_temp, - &opscnt, - &head_next, - &head_prev, - &session_context - ); - - if (serviceid_clockseqandnode != NULL) - { - free(serviceid_clockseqandnode); - } - - pthread_mutex_lock(mutex_workerrec); - - sinTemp = sinIns->prev; - if (sinTemp != NULL) - { - sinTemp->next = sinIns->next; - } - sinTemp = sinIns->next; - if (sinTemp != NULL) - { - sinTemp->prev = sinIns->prev; - } - if (workerrec[iworker].last == sinIns) - { - workerrec[iworker].last = sinIns->prev; - } - if (workerrec[iworker].first == sinIns) - { - workerrec[iworker].first = sinIns->next; - } - - sinTemp = sinIns; - workerrec[iworker].sessionid_count = - workerrec[iworker].sessionid_count - 1; - - } // end of if timedout - sinIns = sinIns->next; - if (sinTemp != NULL) - { - free(sinTemp); - } - } while (sinIns != NULL); - - } // end of the first not null - } // end of the busy = 1 - } // end of the for iworker - pthread_mutex_unlock(mutex_workerrec); - } // end of while 1 - // return NULL; - } - - void - context_timeout_process( - pthread_mutex_t *mutex_workerrec, - pthread_cond_t *cond_notbusy, - wr_t *workerrec - ) - { - struct timeval tv; - uint64_t u64time; - - char workername[1024]; - memset((char *) workername, 0, 1024); - int iworker; - - int32_t in_fd; - unsigned char *in_ta_path = NULL; - int32_t in_ta_path_size = 0; - uint64_t in_session_list_next = 0; - uint64_t in_session_list_prev = 0; - uint64_t in_shrd_mem_list_next = 0; - uint64_t in_shrd_mem_list_prev = 0; - uint64_t in_share_buffer_buffer = 0; - int64_t in_share_buffer_buffer_barrier = 0; - uint64_t in_context_addr; - - int32_t fd; - unsigned char *ta_path; - int32_t ta_path_size; - uint64_t session_list_next; - uint64_t session_list_prev; - uint64_t shrd_mem_list_next; - uint64_t shrd_mem_list_prev; - uint64_t share_buffer_buffer; - int64_t share_buffer_buffer_barrier; - uint32_t context_tapath_outsize; - - while (1) - { - sleep(global_timeout_context); - - pthread_mutex_lock(mutex_workerrec); - for (iworker = 0; iworker < global_max_num_worker; iworker++) - { - if (workerrec[iworker].busy == 1) - { - sprintf(workername, "%s%d", "gpworker", iworker); - gettimeofday(&tv, NULL); - u64time = (long unsigned int) (tv.tv_sec - - workerrec[iworker].context_createtime.tv_sec - ); - - if (u64time > global_timeout_context - && - workerrec[iworker].sessionid_count == 0 - ) - { - in_fd = workerrec[iworker].context_fd; - in_context_addr = workerrec[iworker].context_addr; - ta_path = (unsigned char *) malloc(1024 * sizeof(char)); - ta_path_size = 1024; - memset((char *) ta_path, 0, 1024); - - pthread_mutex_unlock(mutex_workerrec); - - printf("\ngpp method call teec finalizecontext for timeout process \n"); - method_call_teec_fincont( - workername, - - in_fd, - in_ta_path, - in_ta_path_size, - in_session_list_next, - in_session_list_prev, - in_shrd_mem_list_next, - in_shrd_mem_list_prev, - in_share_buffer_buffer, - in_share_buffer_buffer_barrier, - in_context_addr, - - &fd, - ta_path, - ta_path_size, - &session_list_next, - &session_list_prev, - &shrd_mem_list_next, - &shrd_mem_list_prev, - &share_buffer_buffer, - &share_buffer_buffer_barrier, - - &context_tapath_outsize - ); - - if (ta_path != NULL) - { - free(ta_path); - } - - pthread_mutex_lock(mutex_workerrec); - - workerrec[iworker].busy = 0; - pthread_cond_signal(cond_notbusy); - workerrec[iworker].context_fd = 0; - workerrec[iworker].context_addr = 0xffffffff; - workerrec[iworker].sessionid_count = 0; - sin_t *sinIns; - sin_t *sinInsPrev; - sinIns = workerrec[iworker].last; - if (sinIns != NULL) - { - for (;;) - { - sinInsPrev = sinIns->prev; - free(sinIns); - sinIns = sinInsPrev; - if (sinIns == NULL) - { - break; - } - } - } - - } // end of the if timeed out - } // end of the if busy = 1 - } // end of the for iworker - pthread_mutex_unlock(mutex_workerrec); - - } // end of while 1 - } - -private: - std::vector > cq_; - gpp::AsyncService service_; - std::unique_ptr server_; - std::vector server_threads_; - - pthread_mutex_t mutex_workerrec; - pthread_cond_t cond_notbusy; - wr_t *workerrec = new wr_t[global_max_num_worker]; -}; - - -int main(int argc, char **argv) -{ - std::cout << "gpproxy glo_config file = " << global_strcfgfile << std::endl; - check_config(); - ServerImpl server; - - server.RunServer(); - - return 0; -} diff --git a/teeproxy/gpproxy/gpproxy.h b/teeproxy/gpproxy/gpproxy.h deleted file mode 100644 index 18fe311..0000000 --- a/teeproxy/gpproxy/gpproxy.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _GPPROXY_H -#define _GPPROXY_H -typedef struct sessionid_node -{ - uint32_t session_id; - struct timeval session_createtime; - struct sessionid_node *next; - struct sessionid_node *prev; -} sin_t; - -typedef struct worker_rec -{ - uint8_t busy; - int32_t context_fd; - uint64_t context_addr; - struct timeval context_createtime; - int sessionid_count; - sin_t *first; - sin_t *last; -} wr_t; -#endif // _GPPROXY_H diff --git a/teeproxy/gpproxy/protos/gt.proto b/teeproxy/gpproxy/protos/gt.proto deleted file mode 100644 index 3eeff06..0000000 --- a/teeproxy/gpproxy/protos/gt.proto +++ /dev/null @@ -1,392 +0,0 @@ -// - -syntax = "proto3"; - -option java_multiple_files = true; -option java_package = "io.grpc.gt"; -option java_outer_classname = "gtProto"; -option objc_class_prefix = "HLW"; - -package gt; - -// The gpp service definition. -service gpp { - rpc TEECC_InitializeContext (Inicont_Request) returns (Inicont_Reply) {} - rpc TEECC_FinalizeContext (Fincont_Request) returns (Fincont_Reply) {} - rpc TEECC_OpenSession (Opes_Request) returns (Opes_Reply) {} - rpc TEECC_InvokeCommand (Invo_Request) returns (Invo_Reply) {} - rpc TEECC_CloseSession (Close_Request) returns (Close_Reply) {} - rpc TEECC_TA(TA_Chunk) returns (TA_Reply) {} - rpc TEECC_SetJwt(Setjwt_Request) returns (Setjwt_Reply) {} -} - - -message Inicont_Request { - uint64 name_size = 1; - string name = 2; - string token = 3; - string taname = 4; -} - -message Inicont_Reply { - uint32 teecresult = 1; - int32 context_fd = 2; - uint64 context_tapath_outsize = 3; - bytes context_tapath = 4; - uint64 context_sessionlist_next = 5; - uint64 context_sessionlist_prev = 6; - uint64 context_shrdmemlist_next = 7; - uint64 context_shrdmemlist_prev = 8; - uint64 context_sharebuffer_buffer = 9; - int64 context_sharebuffer_bufferbarrier = 10; - uint64 context_addr = 11; - int32 flag = 12; -} - -message Fincont_Request { - int32 in_context_fd = 1; - uint64 in_context_tapath_size= 2; - bytes in_context_tapath = 3; - uint64 in_context_sessionlist_next = 4; - uint64 in_context_sessionlist_prev = 5; - uint64 in_context_shrdmemlist_next = 6; - uint64 in_context_shrdmemlist_prev = 7; - uint64 in_context_sharebuffer_buffer = 8; - int64 in_context_sharebuffer_bufferbarrier = 9; - uint64 in_context_addr = 10; - string token = 11; - string taname = 12; -} - -message Fincont_Reply { - int32 context_fd = 1; - uint64 context_tapath_outsize = 2; - bytes context_tapath = 3; - uint64 context_sessionlist_next = 4; - uint64 context_sessionlist_prev = 5; - uint64 context_shrdmemlist_next = 6; - uint64 context_shrdmemlist_prev = 7; - uint64 context_sharebuffer_buffer = 8; - int64 context_sharebuffer_bufferbarrier = 9; - uint64 context_addr = 10; - int32 flag = 11; -} - -message Opes_Request { - int32 in_context_fd = 1; - uint64 in_context_tapath_size= 2; - bytes in_context_tapath = 3; - uint64 in_context_sessionlist_next = 4; - uint64 in_context_sessionlist_prev = 5; - uint64 in_context_shrdmemlist_next = 6; - uint64 in_context_shrdmemlist_prev = 7; - uint64 in_context_sharebuffer_buffer = 8; - int64 in_context_sharebuffer_bufferbarrier = 9; - uint32 in_destination_timelow = 10; - uint32 in_destination_timemid = 11; - uint32 in_destination_timehiandver = 12; - uint64 in_destination_cad_size = 13; - repeated uint32 in_destination_clockseqandnode = 14; - uint32 in_connectionmethod = 15; - uint64 in_connectiondata = 16; - uint32 in_operation_started = 17; - uint32 in_operation_paramtypes = 18; - uint64 in_operation_param1_tmpref_buffer = 19; - uint32 in_operation_param1_tmpref_size = 20; - uint64 in_operation_param1_memref_parent = 21; - uint32 in_operation_param1_memref_size = 22; - uint32 in_operation_param1_memref_offset = 23; - uint32 in_operation_param1_value_a = 24; - uint32 in_operation_param1_value_b = 25; - int32 in_operation_param1_ionref_ionsharefd = 26; - uint32 in_operation_param1_ionref_ionsize = 27; - uint64 in_operation_param2_tmpref_buffer = 28; - uint32 in_operation_param2_tmpref_size = 29; - uint64 in_operation_param2_memref_parent = 30; - uint32 in_operation_param2_memref_size = 31; - uint32 in_operation_param2_memref_offset = 32; - uint32 in_operation_param2_value_a = 33; - uint32 in_operation_param2_value_b = 34; - int32 in_operation_param2_ionref_ionsharefd = 35; - uint32 in_operation_param2_ionref_ionsize = 36; - uint64 in_operation_param3_tmpref_buffer = 37; - uint32 in_operation_param3_tmpref_size = 38; - uint64 in_operation_param3_memref_parent = 39; - uint32 in_operation_param3_memref_size = 40; - uint32 in_operation_param3_memref_offset = 41; - uint32 in_operation_param3_value_a = 42; - uint32 in_operation_param3_value_b = 43; - int32 in_operation_param3_ionref_ionsharefd = 44; - uint32 in_operation_param3_ionref_ionsize = 45; - uint64 in_operation_param4_tmpref_buffer = 46; - uint32 in_operation_param4_tmpref_size = 47; - uint64 in_operation_param4_memref_parent = 48; - uint32 in_operation_param4_memref_size = 49; - uint32 in_operation_param4_memref_offset = 50; - uint32 in_operation_param4_value_a = 51; - uint32 in_operation_param4_value_b = 52; - int32 in_operation_param4_ionref_ionsharefd = 53; - uint32 in_operation_param4_ionref_ionsize = 54; - uint64 in_operation_session = 55; - int32 in_operation_cancelflag = 56; - uint32 in_returnorigin = 57; - uint64 in_context_addr = 58; - string token = 59; - string taname = 60; -} - -message Opes_Reply { - uint32 teecresult = 1; - int32 context_fd = 2; - bytes context_tapath = 3 ; - uint64 context_tapath_outsize = 4; - uint64 context_sessionlist_next = 5; - uint64 context_sessionlist_prev = 6; - uint64 context_shrdmemlist_next = 7; - uint64 context_shrdmemlist_prev = 8; - uint64 context_sharebuffer_buffer = 9; - int64 context_sharebuffer_bufferbarrier = 10; - uint32 session_sessionid = 11; - uint32 session_serviceid_timelow = 12; - uint32 session_serviceid_timemid = 13; - uint32 session_serviceid_timehiandver = 14; - uint64 session_serviceid_clockseqandnode_outsize = 15; - repeated uint32 session_serviceid_clockseqandnode = 16; - uint32 session_opscnt = 17; - uint64 session_head_next = 18; - uint64 session_head_prev = 19; - uint64 session_context = 20; - uint32 operation_started = 21; - uint32 operation_paramtypes = 22; - uint64 operation_param1_tmpref_buffer = 23; - uint32 operation_param1_tmpref_size = 24; - uint64 operation_param1_memref_parent = 25; - uint32 operation_param1_memref_size = 26; - uint32 operation_param1_memref_offset = 27; - uint32 operation_param1_value_a = 28; - uint32 operation_param1_value_b = 29; - int32 operation_param1_ionref_ionsharefd = 30; - uint32 operation_param1_ionref_ionsize = 31; - uint64 operation_param2_tmpref_buffer = 32; - uint32 operation_param2_tmpref_size = 33; - uint64 operation_param2_memref_parent = 34; - uint32 operation_param2_memref_size = 35; - uint32 operation_param2_memref_offset = 36; - uint32 operation_param2_value_a = 37; - uint32 operation_param2_value_b = 38; - int32 operation_param2_ionref_ionsharefd = 39; - uint32 operation_param2_ionref_ionsize = 40; - uint64 operation_param3_tmpref_buffer = 41; - uint32 operation_param3_tmpref_size = 42; - uint64 operation_param3_memref_parent = 43; - uint32 operation_param3_memref_size = 44; - uint32 operation_param3_memref_offset = 45; - uint32 operation_param3_value_a = 46; - uint32 operation_param3_value_b = 47; - int32 operation_param3_ionref_ionsharefd = 48; - uint32 operation_param3_ionref_ionsize = 49; - uint64 operation_param4_tmpref_buffer = 50; - uint32 operation_param4_tmpref_size = 51; - uint64 operation_param4_memref_parent = 52; - uint32 operation_param4_memref_size = 53; - uint32 operation_param4_memref_offset = 54; - uint32 operation_param4_value_a = 55; - uint32 operation_param4_value_b = 56; - int32 operation_param4_ionref_ionsharefd = 57; - uint32 operation_param4_ionref_ionsize = 58; - uint64 operation_session = 59; - int32 operation_cancelflag = 60; - uint32 returnorigin = 61; - int32 flag = 62; -} - -message Invo_Request { - uint32 in_session_sessionid = 1; - uint32 in_session_serviceid_timelow = 2; - uint32 in_session_serviceid_timemid = 3; - uint32 in_session_serviceid_timehiandver = 4; - uint64 in_session_serviceid_cad_size = 5; - repeated uint32 in_session_serviceid_clockseqandnode = 6; - uint32 in_session_opscnt = 7; - uint64 in_session_head_next = 8; - uint64 in_session_head_prev = 9; - uint64 in_session_context = 10; - uint32 in_commandid = 11; - uint32 in_operation_started = 12; - uint32 in_operation_paramtypes = 13; - uint64 in_operation_param1_tmpref_buffer = 14; - uint32 in_operation_param1_tmpref_size = 15; - uint64 in_operation_param1_memref_parent = 16; - uint32 in_operation_param1_memref_parent_flag = 17; - uint32 in_operation_param1_memref_size = 18; - uint32 in_operation_param1_memref_offset = 19; - uint32 in_operation_param1_value_a = 20; - uint32 in_operation_param1_value_b = 21; - int32 in_operation_param1_ionref_ionsharefd = 22; - uint32 in_operation_param1_ionref_ionsize = 23; - uint64 in_operation_param2_tmpref_buffer = 24; - uint32 in_operation_param2_tmpref_size = 25; - uint64 in_operation_param2_memref_parent = 26; - uint32 in_operation_param2_memref_parent_flag = 27; - uint32 in_operation_param2_memref_size = 28; - uint32 in_operation_param2_memref_offset = 29; - uint32 in_operation_param2_value_a = 30; - uint32 in_operation_param2_value_b = 31; - int32 in_operation_param2_ionref_ionsharefd = 32; - uint32 in_operation_param2_ionref_ionsize = 33; - uint64 in_operation_param3_tmpref_buffer = 34; - uint32 in_operation_param3_tmpref_size = 35; - uint64 in_operation_param3_memref_parent = 36; - uint32 in_operation_param3_memref_parent_flag = 37; - uint32 in_operation_param3_memref_size = 38; - uint32 in_operation_param3_memref_offset = 39; - uint32 in_operation_param3_value_a = 40; - uint32 in_operation_param3_value_b = 41; - int32 in_operation_param3_ionref_ionsharefd = 42; - uint32 in_operation_param3_ionref_ionsize = 43; - uint64 in_operation_param4_tmpref_buffer = 44; - uint32 in_operation_param4_tmpref_size = 45; - uint64 in_operation_param4_memref_parent = 46; - uint32 in_operation_param4_memref_parent_flag = 47; - uint32 in_operation_param4_memref_size = 48; - uint32 in_operation_param4_memref_offset = 49; - uint32 in_operation_param4_value_a = 50; - uint32 in_operation_param4_value_b = 51; - int32 in_operation_param4_ionref_ionsharefd = 52; - uint32 in_operation_param4_ionref_ionsize = 53; - uint64 in_operation_session = 54; - int32 in_operation_cancelflag = 55; - uint32 in_returnorigin = 56; - uint64 in_bufer1_size = 57; - repeated uint32 in_buffer1 = 58; - uint64 in_bufer2_size = 59; - repeated uint32 in_buffer2 = 60; - uint64 in_bufer3_size = 61; - repeated uint32 in_buffer3 = 62; - uint64 in_bufer4_size = 63; - repeated uint32 in_buffer4 = 64; - string token = 65; - string taname = 66; -} - -message Invo_Reply { - uint32 teecresult = 1; - uint32 session_sessionid = 2; - uint32 session_serviceid_timelow = 3; - uint32 session_serviceid_timemid = 4; - uint32 session_serviceid_timehiandver = 5; - uint64 session_serviceid_clockseqandnode_outsize = 6; - repeated uint32 session_serviceid_clockseqandnode = 7; - uint32 session_opscnt = 8; - uint64 session_head_next = 9; - uint64 session_head_prev = 10; - uint64 session_context = 11; - uint32 operation_started = 12; - uint32 operation_paramtypes = 13; - uint64 operation_param1_tmpref_buffer = 14; - uint32 operation_param1_tmpref_size = 15; - uint64 operation_param1_memref_parent = 16; - uint32 operation_param1_memref_parent_flag = 17; - uint32 operation_param1_memref_size = 18; - uint32 operation_param1_memref_offset = 19; - uint32 operation_param1_value_a = 20; - uint32 operation_param1_value_b = 21; - int32 operation_param1_ionref_ionsharefd = 22; - uint32 operation_param1_ionref_ionsize = 23; - uint64 operation_param2_tmpref_buffer = 24; - uint32 operation_param2_tmpref_size = 25; - uint64 operation_param2_memref_parent = 26; - uint32 operation_param2_memref_parent_flag = 27; - uint32 operation_param2_memref_size = 28; - uint32 operation_param2_memref_offset = 29; - uint32 operation_param2_value_a = 30; - uint32 operation_param2_value_b = 31; - int32 operation_param2_ionref_ionsharefd = 32; - uint32 operation_param2_ionref_ionsize = 33; - uint64 operation_param3_tmpref_buffer = 34; - uint32 operation_param3_tmpref_size = 35; - uint64 operation_param3_memref_parent = 36; - uint32 operation_param3_memref_parent_flag = 37; - uint32 operation_param3_memref_size = 38; - uint32 operation_param3_memref_offset = 39; - uint32 operation_param3_value_a = 40; - uint32 operation_param3_value_b = 41; - int32 operation_param3_ionref_ionsharefd = 42; - uint32 operation_param3_ionref_ionsize = 43; - uint64 operation_param4_tmpref_buffer = 44; - uint32 operation_param4_tmpref_size = 45; - uint64 operation_param4_memref_parent = 46; - uint32 operation_param4_memref_parent_flag = 47; - uint32 operation_param4_memref_size = 48; - uint32 operation_param4_memref_offset = 49; - uint32 operation_param4_value_a = 50; - uint32 operation_param4_value_b = 51; - int32 operation_param4_ionref_ionsharefd = 52; - uint32 operation_param4_ionref_ionsize = 53; - uint64 operation_session = 54; - int32 operation_cancelflag = 55; - uint32 returnorigin = 56; - - uint64 buffer1_outsize = 57; - uint64 buffer2_outsize = 58; - uint64 buffer3_outsize = 59; - uint64 buffer4_outsize = 60; - - repeated uint32 buffer1 = 61; - repeated uint32 buffer2 = 62; - repeated uint32 buffer3 = 63; - repeated uint32 buffer4 = 64; - int32 flag = 65; -} - -message Close_Request { - uint32 in_session_sessionid = 1; - uint32 in_session_serviceid_timelow = 2; - uint32 in_session_serviceid_timemid = 3; - uint32 in_session_serviceid_timehiandver = 4; - uint64 in_session_serviceid_cad_size = 5; - repeated uint32 in_session_serviceid_clockseqandnode = 6; - uint32 in_session_opscnt = 7; - uint64 in_session_head_next = 8; - uint64 in_session_head_prev = 9; - uint64 in_session_context = 10; - string token = 11; - string taname = 12; -} - -message Close_Reply { - uint32 session_sessionid = 1; - uint32 session_serviceid_timelow = 2; - uint32 session_serviceid_timemid = 3; - uint32 session_serviceid_timehiandver = 4; - uint64 session_serviceid_cad_outsize = 5; - repeated uint32 session_serviceid_clockseqandnode = 6; - uint32 session_opscnt = 7; - uint64 session_head_next = 8; - uint64 session_head_prev = 9; - uint64 session_context = 10; - int32 flag = 11; -} - -message TA_Chunk{ - string name = 1; - bytes buffer = 2; - string token = 3; - string taname = 4; - bytes sha256 = 5; - string subdir = 6; -} - -message TA_Reply{ - int32 code = 1; - int32 flag = 2; -} - -message Setjwt_Request{ - string taname = 1; - string token = 2; -} - -message Setjwt_Reply{ - int32 retcode = 1; -} diff --git a/teeproxy/gpworker/README b/teeproxy/gpworker/README deleted file mode 100644 index 28ceb87..0000000 --- a/teeproxy/gpworker/README +++ /dev/null @@ -1,8 +0,0 @@ -DBus IPC - -packages installed: -dbus -libdbus-1-3 -libdbus-1-dev -libdbus-glib-1-2 - diff --git a/teeproxy/gpworker/build/Makefile b/teeproxy/gpworker/build/Makefile deleted file mode 100644 index 45cd212..0000000 --- a/teeproxy/gpworker/build/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -CUR_DIR=$(shell pwd) -iTrustee_SDK_PATH=${CUR_DIR}/../../../.. - -TARGET_APP := gpworker - -APP_SOURCES := ../gpworker.c ../threadpool.c ../condition.c ../tzcp_dbus.c - -# APP_SOURCES += $(iTrustee_SDK_PATH)/src/CA/cloud/libteec_adaptor.c - -APP_CFLAGS += -fstack-protector-strong -fPIC -g - -APP_CFLAGS += -I$(iTrustee_SDK_PATH)/include/CA -I$(iTrustee_SDK_PATH)/thirdparty/open_source/libboundscheck/include - -APP_CFLAGS += -I/usr/include/dbus-1.0 -I/usr/lib64/dbus-1.0/include - -APP_LDFLAGS += -ldl -lpthread -lboundscheck -lteec -lm - -APP_LDFLAGS += -z text -z now -z relro -z noexecstack -pie - -APP_LDFLAGS += `pkg-config --libs --cflags dbus-1` - -APP_OBJECTS := $(APP_SOURCES:.c=.o) -$(TARGET_APP): $(APP_SOURCES) - @$(CC) $(APP_CFLAGS) -o $@ $(APP_SOURCES) $(APP_LDFLAGS) -# aarch64-linux-gnu-gcc $(APP_CFLAGS) -o $@ $(APP_SOURCES) $(APP_LDFLAGS) - -clean: - rm -f *.o $(TARGET_APP) diff --git a/teeproxy/gpworker/build/r.sh b/teeproxy/gpworker/build/r.sh deleted file mode 100644 index 5f02fd2..0000000 --- a/teeproxy/gpworker/build/r.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!bin/bash - -pkill gpworker -cp -r gpworker /vendor/bin/gpworker -rm -f *.log - -parallel -j 128 --ungroup /vendor/bin/gpworker gpworker{} ::: {0..127} diff --git a/teeproxy/gpworker/changelog.md b/teeproxy/gpworker/changelog.md deleted file mode 100644 index f66c4e1..0000000 --- a/teeproxy/gpworker/changelog.md +++ /dev/null @@ -1,7 +0,0 @@ -# 更新日志 - -## [1.0.0] - 2022-10-11 - -### 新增 - -* 项目初始化,上传第一版 diff --git a/teeproxy/gpworker/condition.c b/teeproxy/gpworker/condition.c deleted file mode 100644 index cf135cc..0000000 --- a/teeproxy/gpworker/condition.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "condition.h" - -int condition_init(condition_t *cond) -{ - int status; - if ((status = pthread_mutex_init(&cond->pmutex, NULL))) - return status; - - if ((status = pthread_cond_init(&cond->pcond, NULL))) - return status; - - return 0; -} - -int condition_lock(condition_t *cond) -{ - return pthread_mutex_lock(&cond->pmutex); -} - -int condition_unlock(condition_t *cond) -{ - return pthread_mutex_unlock(&cond->pmutex); -} - -int condition_wait(condition_t *cond) -{ - return pthread_cond_wait(&cond->pcond, &cond->pmutex); -} - -int condition_timedwait(condition_t *cond, const struct timespec *abstime) -{ - return pthread_cond_timedwait(&cond->pcond, &cond->pmutex, abstime); -} - -int condition_signal(condition_t *cond) -{ - return pthread_cond_signal(&cond->pcond); -} - -int condition_broadcast(condition_t *cond) -{ - return pthread_cond_broadcast(&cond->pcond); -} - -int condition_destroy(condition_t *cond) -{ - int status; - if ((status = pthread_mutex_destroy(&cond->pmutex))) - return status; - - if ((status = pthread_cond_destroy(&cond->pcond))) - return status; - - return 0; -} diff --git a/teeproxy/gpworker/condition.h b/teeproxy/gpworker/condition.h deleted file mode 100644 index 8c89945..0000000 --- a/teeproxy/gpworker/condition.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _CONDITION_H_ -#define _CONDITION_H_ - -#include - -typedef struct condition -{ - pthread_mutex_t pmutex; - pthread_cond_t pcond; -} condition_t; - -int condition_init(condition_t *cond); - -int condition_lock(condition_t *cond); - -int condition_unlock(condition_t *cond); - -int condition_wait(condition_t *cond); - -int condition_timedwait(condition_t *cond, const struct timespec *abstime); - -int condition_signal(condition_t *cond); - -int condition_broadcast(condition_t *cond); - -int condition_destroy(condition_t *cond); - -#endif /* _CONDITION_H_ */ diff --git a/teeproxy/gpworker/gpworker.c b/teeproxy/gpworker/gpworker.c deleted file mode 100644 index 838a0f9..0000000 --- a/teeproxy/gpworker/gpworker.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. - * Description: rsa-demo - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "tee_client_api.h" - -#include "tzcp_dbus.h" -#include "threadpool.h" - - -int main(int argc, char *argv[]) -{ - threadpool_t pool; - pthread_mutex_t mutex_tcl; - pthread_mutex_t mutex_tsl; - tcl_t tcl; - tsl_t tsl; - - if (argc < 2) - { - printf("There is no argument as a worker name. \n"); - return -1; - } - if (argc > 2) - { - printf("Only need one argument as a worker name. \n"); - return -1; - } - - receive_methodcall( - &pool, - &mutex_tcl, - &mutex_tsl, - &tcl, - &tsl, - argv[1] - ); - - return 0; -} diff --git a/teeproxy/gpworker/threadpool.c b/teeproxy/gpworker/threadpool.c deleted file mode 100644 index 265d4b7..0000000 --- a/teeproxy/gpworker/threadpool.c +++ /dev/null @@ -1,155 +0,0 @@ -#include "threadpool.h" -#include -#include -#include -#include -#include - - -void *thread_routine(void *arg) -{ - // struct timespec abstime; - int timeout; - printf("\n"); - printf("thread 0x%x is starting\n", (int) pthread_self()); - threadpool_t *pool = (threadpool_t *) arg; - while (1) - { - timeout = 0; - condition_lock(&pool->ready); - pool->idle++; - // 等待队列有任务到来或者线程池销毁通知 - while (pool->first == NULL && !pool->quit) - { - printf("thread 0x%x is waiting\n", (int) pthread_self()); - condition_wait(&pool->ready); - } - - // 等待到条件,处于工作状态 - pool->idle--; - - // 等待到任务 - if (pool->first != NULL) - { - // 从队头取出任务 - task_t *t = pool->first; - pool->first = t->next; - // 执行任务需要一定的时间,所以要先解锁,以便生产者进程 - // 能够往队列中添加任务,其它消费者线程能够进入等待任务 - condition_unlock(&pool->ready); - printf("thread 0x%x is working\n", (int) pthread_self()); - t->run(t->arg); - printf("\n"); - printf("thread 0x%x work done \n", (int) pthread_self()); - free(t); - condition_lock(&pool->ready); - } - // 如果等待到线程池销毁通知, 且任务都执行完毕 - if (pool->quit && pool->first == NULL) - { - pool->counter--; - if (pool->counter == 0) - condition_signal(&pool->ready); - - condition_unlock(&pool->ready); - // 跳出循环之前要记得解锁 - break; - } - - if (timeout && pool->first == NULL) - { - pool->counter--; - condition_unlock(&pool->ready); - // 跳出循环之前要记得解锁 - break; - } - condition_unlock(&pool->ready); - } - - printf("thread 0x%x is exting\n", (int) pthread_self()); - return NULL; - -} - - -// 初始化线程池 -void threadpool_init( - threadpool_t *pool, - int threads, - tcl_t *tcl, - tsl_t *tsl -) -{ - // 对线程池中的各个字段初始化 - condition_init(&pool->ready); - pool->first = NULL; - pool->last = NULL; - pool->counter = 0; - pool->idle = 0; - pool->max_threads = threads; - pool->quit = 0; - - tcl->first = NULL; - tcl->last = NULL; - tcl->count = 0; - - tsl->first = NULL; - tsl->last = NULL; - tsl->count = 0; -} - - -// 往线程池中添加任务 -void threadpool_add_task(threadpool_t *pool, void *(*run)(void *arg), void *arg) -{ - // 生成新任务 - task_t *newtask = (task_t *) malloc(sizeof(task_t)); - newtask->run = run; - newtask->arg = arg; - newtask->next = NULL; - - condition_lock(&pool->ready); - // 将任务添加到队列 - if (pool->first == NULL) - pool->first = newtask; - else - pool->last->next = newtask; - pool->last = newtask; - - // 如果有等待线程,则唤醒其中一个 - if (pool->idle > 0) - condition_signal(&pool->ready); - else if (pool->counter < pool->max_threads) - { - // 没有等待线程,并且当前线程数不超过最大线程数,则创建一个新线程 - pthread_t tid; - pthread_create(&tid, NULL, thread_routine, pool); - pool->counter++; - } - condition_unlock(&pool->ready); -} - - -// 销毁线程池 -void threadpool_destroy(threadpool_t *pool) -{ - if (pool->quit) - { - return; - } - condition_lock(&pool->ready); - pool->quit = 1; - if (pool->counter > 0) - { - if (pool->idle > 0) - condition_broadcast(&pool->ready); - - // 处于执行任务状态中的线程,不会收到广播 - // 线程池需要等待执行任务状态中的线程全部退出 - - while (pool->counter > 0) - condition_wait(&pool->ready); - } - condition_unlock(&pool->ready); - condition_destroy(&pool->ready); -} diff --git a/teeproxy/gpworker/threadpool.h b/teeproxy/gpworker/threadpool.h deleted file mode 100644 index f70b3d1..0000000 --- a/teeproxy/gpworker/threadpool.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef _THREAD_POOL_H_ -#define _THREAD_POOL_H_ - -#include "condition.h" - -#define GP_WORKER 3 - -#ifdef GP_WORKER - -#include "tee_client_api.h" -#include "tee_client_list.h" - -#endif - - - -#ifdef GP_PROXY -typedef struct sessionid_node -{ - uint32_t session_id; - struct timeval session_createtime; - struct sessionid_node * next; - struct sessionid_node * prev; -} sin_t; - -typedef struct worker_rec -{ - uint8_t busy; - int32_t context_fd; - uint64_t context_addr; - struct timeval context_createtime; - int sessionid_count; - sin_t * first; - sin_t * last; -} wr_t; -#endif - -#ifdef GP_WORKER -typedef struct teec_session_node -{ - TEEC_Session *self; - struct timeval createtime; - struct teec_session_node *next; - struct teec_session_node *prev; -} tsn_t; - -typedef struct teec_session_list -{ - int count; // 线程池中当前线程数 - tsn_t *first; - tsn_t *last; -} tsl_t; - -typedef struct teec_context_node -{ - TEEC_Context *self; - struct timeval createtime; - struct teec_context_node *next; - struct teec_context_node *prev; -} tcn_t; - -typedef struct teec_context_list -{ - int count; // 线程池中当前线程数 - tcn_t *first; - tcn_t *last; -} tcl_t; -#endif - - -// 任务结构体,将任务放入队列由线程池中的线程来执行 -typedef struct task -{ - void *(*run)(void *arg); // 任务回调函数 - void *arg; // 回调函数参数 - struct task *next; -} task_t; - -// 线程池结构体 -typedef struct threadpool -{ - condition_t ready; // mutex and condition var, 任务准备就绪或者线程池销毁通知 - task_t *first; // 任务队列头指针 - task_t *last; // 任务队列尾指针 - int counter; // 线程池中当前线程数 - int idle; // 线程池中当前正在等待任务的线程数 - int max_threads; // 线程池中最大允许的线程数 - int quit; // 销毁线程池的时候置1 -} threadpool_t; - -// 初始化线程池 -void threadpool_init( - threadpool_t *pool, - int threads -#ifdef GP_WORKER - , - tcl_t *tcl, - tsl_t *tsl -#endif -); - -// 往线程池中添加任务 -void threadpool_add_task(threadpool_t *pool, void *(*run)(void *arg), void *arg); - -// 销毁线程池 -void threadpool_destroy(threadpool_t *pool); - -#endif /* _THREAD_POOL_H_ */ diff --git a/teeproxy/gpworker/tzcp_dbus.c b/teeproxy/gpworker/tzcp_dbus.c deleted file mode 100644 index 345ece1..0000000 --- a/teeproxy/gpworker/tzcp_dbus.c +++ /dev/null @@ -1,22889 +0,0 @@ -/* - * Using low-level D-Bus C API code. - * Written by - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tzcp_dbus.h" - -#ifdef GP_PROXY_WORKER - -#include "threadpool.h" - -#ifdef GP_WORKER - -#include "tee_client_api.h" -#include "tee_client_list.h" - -#endif -#endif - - -/** - * Listens for signals on the bus - */ -void -receive_signal(void) -{ - DBusMessage *msg; - DBusMessageIter args; - DBusConnection *conn; - DBusError err; - int ret; - char *sigvalue; - - printf("Listening for signals\n"); - - // initialise the errors - dbus_error_init(&err); - - // connect to the bus and check for errors - conn = dbus_bus_get(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - exit(1); - } - - // request our name on the bus and check for errors - ret = dbus_bus_request_name(conn, "test.signal.sink", DBUS_NAME_FLAG_REPLACE_EXISTING, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - exit(1); - } - - // add a rule for which messages we want to see - dbus_bus_add_match(conn, "type='signal',interface='test.signal.Type'", &err); - // see signals from the given interface - dbus_connection_flush(conn); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Match Error (%s)\n", err.message); - exit(1); - } - // printf("Match rule sent\n"); - - // loop listening for signals being emmitted - while (true) - { - - // non blocking read of the next available message - dbus_connection_read_write(conn, 0); - msg = dbus_connection_pop_message(conn); - - // loop again if we haven't read a message - if (NULL == msg) - { - usleep(10000); - continue; - } - - // check if the message is a signal from the correct interface and with the correct name - if (dbus_message_is_signal(msg, "test.signal.Type", "Test")) - { - - // read the parameters - if (!dbus_message_iter_init(msg, &args)) - fprintf(stderr, "Message Has No Parameters\n"); - else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) - fprintf(stderr, "Argument is not string!\n"); - else - dbus_message_iter_get_basic(&args, &sigvalue); - - printf("Got Signal with value %s\n", sigvalue); - } - - // free the message - dbus_message_unref(msg); - } -} - - -/** - * Connect to the DBUS bus and send a broadcast signal - */ -void -send_signal( - char *sigvalue -) -{ - DBusMessage *msg; - DBusMessageIter args; - DBusConnection *conn; - DBusError err; - int ret; - dbus_uint32_t sigserial = 0; - - printf("Sending signal with value %s\n", sigvalue); - - // initialise the error value - dbus_error_init(&err); - - // connect to the DBUS system bus, and check for errors - conn = dbus_bus_get(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - exit(1); - } - - // register our name on the bus, and check for errors - ret = dbus_bus_request_name(conn, "test.signal.source", DBUS_NAME_FLAG_REPLACE_EXISTING, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - exit(1); - } - - // create a signal & check for errors - msg = dbus_message_new_signal("/test/signal/Object", // object name of the signal - "test.signal.Type", // interface name of the signal - "Test"); // name of the signal - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - exit(1); - } - - // append arguments onto signal - dbus_message_iter_init_append(msg, &args); - if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &sigvalue)) - { - fprintf(stderr, "Out Of Memory!\n"); - exit(1); - } - - // send the message and flush the connection - if (!dbus_connection_send(conn, msg, &sigserial)) - { - fprintf(stderr, "Out Of Memory!\n"); - exit(1); - } - dbus_connection_flush(conn); - - printf("Signal Sent\n"); - - // free the message - dbus_message_unref(msg); -} - - -#ifdef GP_PROXY_WORKER - -/** - * Server that exposes a method call and waits for it to be called - */ -void -receive_methodcall( - threadpool_t *pool, - pthread_mutex_t *mutex_tcl, - pthread_mutex_t *mutex_tsl, - tcl_t *tcl, - tsl_t *tsl, - char *workername -) -{ - DBusMessage *msg; - DBusConnection *conn; - DBusError err; - int ret; - dbus_bool_t bResult; - - threadpool_init(pool, -#ifdef GP_PROXY - MAX_NUM_THREAD + 2 -#endif -#ifdef GP_WORKER - MAX_NUM_THREAD, tcl, tsl -#endif - ); - -#ifdef GP_WORKER - pthread_mutex_init(mutex_tcl, NULL); - pthread_mutex_init(mutex_tsl, NULL); -#endif - -#ifdef GP_PROXY - pthread_mutex_init(mutex_workerrec, NULL); - pthread_cond_init(cond_notbusy, NULL); - for (int iworker = 0; iworker < MAX_NUM_WORKER; iworker++) - { - workerrec[iworker].busy = 0; - workerrec[iworker].context_fd = 0; - // workerrec[iworker].context_addr = 0; - workerrec[iworker].context_addr = 0xffffffff; - workerrec[iworker].sessionid_count = 0; - workerrec[iworker].first = NULL; - workerrec[iworker].last = NULL; - } - - DBusMsgConn* thdfargs_stp = (DBusMsgConn*)malloc(sizeof(DBusMsgConn)); - thdfargs_stp->mutex_workerrec = mutex_workerrec; - thdfargs_stp->workerrec = workerrec; - threadpool_add_task( - pool, - session_timeout_process, - thdfargs_stp - ); - - DBusMsgConn* thdfargs_ctp = (DBusMsgConn*)malloc(sizeof(DBusMsgConn)); - thdfargs_ctp->mutex_workerrec = mutex_workerrec; - thdfargs_ctp->workerrec = workerrec; - thdfargs_ctp->cond_notbusy = cond_notbusy; - threadpool_add_task( - pool, - context_timeout_process, - thdfargs_ctp - ); -#endif - - printf("%s is listening for method calls ... \n", workername); - - // initialise the error - dbus_error_init(&err); - - dbus_threads_init_default(); - - // connect to the bus and check for errors - conn = dbus_bus_get(DBUS_BUS_SESSION, &err); - // conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - fprintf(stderr, "Connection Null\n"); - exit(1); - } - - char dbusname[1024]; - memset((char *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - int64_t workernum = 0; - for (int iind = 0; iind < strlen(workername) - 6; iind++) - { - workernum = workernum + - (workername[strlen(workername) - 1 - iind] - '0') * pow(10, iind); -#if 0 - printf( - "workername[%d] = %c. \n", - strlen(workername) - 1 - iind, - workername[strlen(workername) - 1 - iind] - ); -#endif - } - // printf("The worker num is 0x %16.16lx. \n", workernum); - // request our name on the bus and check for errors - ret = - dbus_bus_request_name( - conn, - // "test.method.server", - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - fprintf(stderr, "Not Primary Owner (%d)\n", ret); - exit(1); - } - - // loop, testing for new messages - memset((char *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.Type", workername); - while (true) - { - // non blocking read of the next available message - dbus_connection_read_write(conn, 0); - msg = dbus_connection_pop_message(conn); - - // loop again if we haven't got a message - if (NULL == msg) - { - usleep(10000); - continue; - } - - // check this is a method call for the right interface & method - bResult = dbus_message_is_method_call( - msg, - // "test.method.Type", - dbusname, - "TEEC_InitializeContext" - ); - if (bResult == TRUE) - { - DBusMsgConn *thdfargs = (DBusMsgConn *) malloc(sizeof(DBusMsgConn)); - thdfargs->msg = msg; - thdfargs->conn = conn; -#ifdef GP_PROXY - thdfargs->mutex_workerrec = mutex_workerrec; - thdfargs->cond_notbusy = cond_notbusy; - thdfargs->workerrec = workerrec; -#endif -#ifdef GP_WORKER - thdfargs->workernum = workernum; - thdfargs->mutex_tcl = mutex_tcl; - thdfargs->mutex_tsl = mutex_tsl; - thdfargs->tcl = tcl; - thdfargs->tsl = tsl; -#endif - threadpool_add_task( - pool, - reply_to_method_call_teec_inicont, - thdfargs - ); - } - - // check this is a method call for the right interface & method - bResult = dbus_message_is_method_call( - msg, - // "test.method.Type", - dbusname, - "TEEC_FinalizeContext" - ); - if (bResult == TRUE) - { - DBusMsgConn *thdfargs = (DBusMsgConn *) malloc(sizeof(DBusMsgConn)); - thdfargs->msg = msg; - thdfargs->conn = conn; -#ifdef GP_PROXY - thdfargs->mutex_workerrec = mutex_workerrec; - thdfargs->cond_notbusy = cond_notbusy; - thdfargs->workerrec = workerrec; -#endif -#ifdef GP_WORKER - thdfargs->workernum = workernum; - thdfargs->mutex_tcl = mutex_tcl; - thdfargs->mutex_tsl = mutex_tsl; - thdfargs->tcl = tcl; - thdfargs->tsl = tsl; -#endif - threadpool_add_task( - pool, - reply_to_method_call_teec_fincont, - thdfargs - ); - } - - // check this is a method call for the right interface & method - bResult = dbus_message_is_method_call( - msg, - // "test.method.Type", - dbusname, - "TEEC_OpenSession" - ); - if (bResult == TRUE) - { - DBusMsgConn *thdfargs = (DBusMsgConn *) malloc(sizeof(DBusMsgConn)); - thdfargs->msg = msg; - thdfargs->conn = conn; -#ifdef GP_PROXY - thdfargs->mutex_workerrec = mutex_workerrec; - thdfargs->cond_notbusy = cond_notbusy; - thdfargs->workerrec = workerrec; -#endif -#ifdef GP_WORKER - thdfargs->workernum = workernum; - thdfargs->mutex_tcl = mutex_tcl; - thdfargs->mutex_tsl = mutex_tsl; - thdfargs->tcl = tcl; - thdfargs->tsl = tsl; -#endif - threadpool_add_task( - pool, - reply_to_method_call_teec_opensession, - thdfargs - ); - } - - // check this is a method call for the right interface & method - bResult = dbus_message_is_method_call( - msg, - // "test.method.Type", - dbusname, - "TEEC_CloseSession" - ); - if (bResult == TRUE) - { - DBusMsgConn *thdfargs = (DBusMsgConn *) malloc(sizeof(DBusMsgConn)); - thdfargs->msg = msg; - thdfargs->conn = conn; -#ifdef GP_PROXY - thdfargs->mutex_workerrec = mutex_workerrec; - thdfargs->cond_notbusy = cond_notbusy; - thdfargs->workerrec = workerrec; -#endif -#ifdef GP_WORKER - thdfargs->workernum = workernum; - thdfargs->mutex_tcl = mutex_tcl; - thdfargs->mutex_tsl = mutex_tsl; - thdfargs->tcl = tcl; - thdfargs->tsl = tsl; -#endif - threadpool_add_task( - pool, - reply_to_method_call_teec_closesession, - thdfargs - ); - } - - bResult = dbus_message_is_method_call( - msg, - // "test.method.Type", - dbusname, - "TEEC_InvokeCommand" - ); - if (bResult == TRUE) - { - DBusMsgConn *thdfargs = (DBusMsgConn *) malloc(sizeof(DBusMsgConn)); - thdfargs->msg = msg; - thdfargs->conn = conn; -#ifdef GP_PROXY - thdfargs->mutex_workerrec = mutex_workerrec; - thdfargs->cond_notbusy = cond_notbusy; - thdfargs->workerrec = workerrec; -#endif -#ifdef GP_WORKER - thdfargs->workernum = workernum; - thdfargs->mutex_tcl = mutex_tcl; - thdfargs->mutex_tsl = mutex_tsl; - thdfargs->tcl = tcl; - thdfargs->tsl = tsl; -#endif - threadpool_add_task( - pool, - reply_to_method_call_teec_invokecommand, - thdfargs - ); - } - - // check this is a method call for the right interface & method - bResult = dbus_message_is_method_call( - msg, - // "test.method.Type", - dbusname, - "Destroy" - ); - if (bResult == TRUE) - { - reply_to_method_call_destroy_threadpool( - msg, - conn, - pool -#ifdef GP_WORKER - , - mutex_tcl, - mutex_tsl -#endif - -#ifdef GP_PROXY - , - mutex_workerrec, - cond_notbusy -#endif - ); - } - - // free the message - // dbus_message_unref(msg); - - } // end of the while true -} // end of the function -#endif - - - -/** - * Call a method on a remote object - */ -int32_t -method_call_teec_inicont( - const char *workername, - - const uint8_t *name, size_t name_size, - int32_t in_context_fd, - const uint8_t *in_context_tapath, size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - - uint32_t *teecresult, - int32_t *context_fd, - uint8_t *context_tapath, size_t context_tapath_insize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - uint64_t *context_addr, - uint32_t *context_tapath_outsize -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - DBusMessageIter structIter; - int ret; - int iType; - unsigned char *context_tapath_temp = NULL; - dbus_int32_t di32Temp; - dbus_uint32_t dui32Temp; - dbus_int64_t di64Temp; - dbus_uint64_t dui64Temp; - - // initialiset the errors - dbus_error_init(&err); - - dbus_threads_init_default(); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - // conn = dbus_bus_get(DBUS_BUS_SESSION, &err); - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return -1; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return -1; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "TEEC_InitializeContext" // method name - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return -1; - } - - // append arguments - dbus_message_iter_init_append(msg, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - di32Temp = name_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (name_size > 0 && name != NULL) - { - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &name - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - } - - di32Temp = in_context_fd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_context_tapath_size > 0 && - in_context_tapath != NULL && - strlen((const char *) in_context_tapath) > 0 - ) - { - if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) - { - di32Temp = strlen((const char *) in_context_tapath); - } else - { - di32Temp = 0; - } - } else - { - di32Temp = 0; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - // if (in_context_tapath_size > 0 && in_context_tapath != NULL) - if (di32Temp > 0) - { - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &in_context_tapath - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - } - - dui64Temp = in_context_sessionlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sessionlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sharebuffer_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di64Temp = in_context_sharebuffer_bufferbarrier; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT64, - &di64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_connection_flush(conn); - dbus_message_unref(msg); - - printf("\n"); - printf("Method Call Teec Init Contex Sent. \n"); - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - return -1; - } - // free the pending message handle - dbus_pending_call_unref(pending); - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *teecresult = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *context_fd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *context_tapath_outsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - if (*context_tapath_outsize > 0) - { - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_STRING - ) - { - fprintf(stderr, "Argument is not STRING.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &context_tapath_temp); - - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sharebuffer_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT64 - ) - { - fprintf(stderr, "Argument is not INT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di64Temp - ); - *context_sharebuffer_bufferbarrier = di64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_addr = dui64Temp; - - printf("Got Reply of Method Call Teec Init Contex: \n"); - printf(" teecresult = 0x %8.8x \n", *teecresult); - printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); - printf(" ta_path = %s \n", context_tapath_temp); - printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); -#if 0 - printf(" TEEC_Context session_list.next = 0x %16.16lx \n", - *context_sessionlist_next - ); - printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", - *context_sessionlist_prev - ); - printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", - *context_shrdmemlist_next - ); - printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", - *context_shrdmemlist_prev - ); - printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", - *context_sharebuffer_buffer - ); - printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", - (long unsigned int)*context_sharebuffer_bufferbarrier - ); -#endif - printf(" context addr = 0x %16.16lx \n", - (long unsigned int) *context_addr - ); - - if ( - context_tapath_insize > *context_tapath_outsize && - *context_tapath_outsize > 0 && - context_tapath != NULL && - context_tapath_temp != NULL - ) - { - memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); - *(context_tapath + *context_tapath_outsize) = 0; - } else - { - // dbus_message_unref(msg); - // return -1; - *(context_tapath + 0) = 0; - } - - // free msg - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return 0; -} - - -/** - * Call a method on a remote object - */ -int32_t -method_call_teec_fincont( - const char *workername, - - int32_t in_context_fd, - const uint8_t *in_context_tapath, size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - uint64_t in_context_addr, - - int32_t *context_fd, - uint8_t *context_tapath, size_t context_tapath_insize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - uint32_t *context_tapath_outsize -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - DBusMessageIter structIter; - int ret; - int iType; - unsigned char *context_tapath_temp = NULL; - dbus_int32_t di32Temp; - dbus_uint32_t dui32Temp; - dbus_int64_t di64Temp; - dbus_uint64_t dui64Temp; - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return -1; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return -1; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "TEEC_FinalizeContext" - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return -1; - } - - // append arguments - dbus_message_iter_init_append(msg, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - di32Temp = in_context_fd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_context_tapath_size > 0 && - in_context_tapath != NULL && - strlen((const char *) in_context_tapath) > 0 - ) - { - if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) - { - di32Temp = strlen((const char *) in_context_tapath); - } else - { - di32Temp = 0; - } - } else - { - di32Temp = 0; - } - - // fprintf(stderr, "in_context_tapath_size = %ld \n", in_context_tapath_size); - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - // if (in_context_tapath_size > 0 && in_context_tapath != NULL) - if (di32Temp > 0) - { - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &in_context_tapath - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - } - - dui64Temp = in_context_sessionlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sessionlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sharebuffer_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di64Temp = in_context_sharebuffer_bufferbarrier; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT64, - &di64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_addr; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_connection_flush(conn); - dbus_message_unref(msg); - - printf("\n"); - printf("Method Call Teec Fin Contex Sent. \n"); - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - return -1; - } - // free the pending message handle - dbus_pending_call_unref(pending); - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *context_fd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *context_tapath_outsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - if (*context_tapath_outsize > 0) - { - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_STRING - ) - { - fprintf(stderr, "Argument is not STRING.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &context_tapath_temp); - - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sharebuffer_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT64 - ) - { - fprintf(stderr, "Argument is not INT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di64Temp - ); - *context_sharebuffer_bufferbarrier = di64Temp; - - printf("Got Reply of Method Call Teec Fin Contex: \n"); - printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); - printf(" ta_path = %s \n", context_tapath_temp); - printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); -#if 0 - printf(" TEEC_Context session_list.next = 0x %16.16lx \n", - *context_sessionlist_next - ); - printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", - *context_sessionlist_prev - ); - printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", - *context_shrdmemlist_next - ); - printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", - *context_shrdmemlist_prev - ); - printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", - *context_sharebuffer_buffer - ); - printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", - (long unsigned int)*context_sharebuffer_bufferbarrier - ); -#endif - - if ( - context_tapath_insize > *context_tapath_outsize && - *context_tapath_outsize > 0 && - context_tapath != NULL && - context_tapath_temp != NULL - ) - { - memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); - *(context_tapath + *context_tapath_outsize) = 0; - } else - { - // dbus_message_unref(msg); - // return -1; - *(context_tapath + 0) = 0; - } - - // free msg - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return 0; -} - - -/** - * Call a method on a remote object - */ -int32_t -method_call_teec_opensession( - const char *workername, - - int32_t in_context_fd, - const uint8_t *in_context_tapath, - size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - - uint32_t in_destination_timelow, - uint32_t in_destination_timemid, - uint32_t in_destination_timehiandver, - uint32_t *in_destination_clockseqandnode, - int32_t in_destination_clockseqandnode_size, - - uint32_t in_connectionmethod, - uint64_t in_connectiondata, - - uint32_t in_operation_started, - uint32_t in_operation_paramtypes, - - uint64_t in_operation_param1_tmpref_buffer, - uint32_t in_operation_param1_tmpref_size, - uint64_t in_operation_param1_memref_parent, - uint32_t in_operation_param1_memref_size, - uint32_t in_operation_param1_memref_offset, - uint32_t in_operation_param1_value_a, - uint32_t in_operation_param1_value_b, - int32_t in_operation_param1_ionref_ionsharefd, - uint32_t in_operation_param1_ionref_ionsize, - - uint64_t in_operation_param2_tmpref_buffer, - uint32_t in_operation_param2_tmpref_size, - uint64_t in_operation_param2_memref_parent, - uint32_t in_operation_param2_memref_size, - uint32_t in_operation_param2_memref_offset, - uint32_t in_operation_param2_value_a, - uint32_t in_operation_param2_value_b, - int32_t in_operation_param2_ionref_ionsharefd, - uint32_t in_operation_param2_ionref_ionsize, - - uint64_t in_operation_param3_tmpref_buffer, - uint32_t in_operation_param3_tmpref_size, - uint64_t in_operation_param3_memref_parent, - uint32_t in_operation_param3_memref_size, - uint32_t in_operation_param3_memref_offset, - uint32_t in_operation_param3_value_a, - uint32_t in_operation_param3_value_b, - int32_t in_operation_param3_ionref_ionsharefd, - uint32_t in_operation_param3_ionref_ionsize, - - uint64_t in_operation_param4_tmpref_buffer, - uint32_t in_operation_param4_tmpref_size, - uint64_t in_operation_param4_memref_parent, - uint32_t in_operation_param4_memref_size, - uint32_t in_operation_param4_memref_offset, - uint32_t in_operation_param4_value_a, - uint32_t in_operation_param4_value_b, - int32_t in_operation_param4_ionref_ionsharefd, - uint32_t in_operation_param4_ionref_ionsize, - - uint64_t in_operation_session, - int32_t in_operation_cancelflag, - - uint32_t in_returnorigin, - - uint64_t in_context_addr, - - - uint32_t *teecresult, - - int32_t *context_fd, - uint8_t *context_tapath, - size_t context_tapath_size, - uint32_t *context_tapath_outsize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - - uint32_t *session_seesionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context, - - uint32_t *operation_started, - uint32_t *operation_paramtypes, - - uint64_t *operation_param1_tmpref_buffer, - uint32_t *operation_param1_tmpref_size, - uint64_t *operation_param1_memref_parent, - uint32_t *operation_param1_memref_size, - uint32_t *operation_param1_memref_offset, - uint32_t *operation_param1_value_a, - uint32_t *operation_param1_value_b, - int32_t *operation_param1_ionref_ionsharefd, - uint32_t *operation_param1_ionref_ionsize, - - uint64_t *operation_param2_tmpref_buffer, - uint32_t *operation_param2_tmpref_size, - uint64_t *operation_param2_memref_parent, - uint32_t *operation_param2_memref_size, - uint32_t *operation_param2_memref_offset, - uint32_t *operation_param2_value_a, - uint32_t *operation_param2_value_b, - int32_t *operation_param2_ionref_ionsharefd, - uint32_t *operation_param2_ionref_ionsize, - - uint64_t *operation_param3_tmpref_buffer, - uint32_t *operation_param3_tmpref_size, - uint64_t *operation_param3_memref_parent, - uint32_t *operation_param3_memref_size, - uint32_t *operation_param3_memref_offset, - uint32_t *operation_param3_value_a, - uint32_t *operation_param3_value_b, - int32_t *operation_param3_ionref_ionsharefd, - uint32_t *operation_param3_ionref_ionsize, - - uint64_t *operation_param4_tmpref_buffer, - uint32_t *operation_param4_tmpref_size, - uint64_t *operation_param4_memref_parent, - uint32_t *operation_param4_memref_size, - uint32_t *operation_param4_memref_offset, - uint32_t *operation_param4_value_a, - uint32_t *operation_param4_value_b, - int32_t *operation_param4_ionref_ionsharefd, - uint32_t *operation_param4_ionref_ionsize, - - uint64_t *operation_session, - int32_t *operation_cancelflag, - - uint32_t *returnorigin -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - DBusMessageIter structIter; - DBusMessageIter ArrayIter; - int ret; - int iType; - unsigned char *context_tapath_temp = NULL; - dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; - int session_serviceid_clockseqandnode_realsize; - dbus_int32_t di32Temp; - dbus_uint32_t dui32Temp; - dbus_int64_t di64Temp; - dbus_uint64_t dui64Temp; - char buf[2]; - buf[0] = DBUS_TYPE_UINT32; - buf[1] = '\0'; - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return -1; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return -1; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "TEEC_OpenSession" - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return -1; - } - - // append arguments - dbus_message_iter_init_append(msg, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - di32Temp = in_context_fd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_context_tapath_size > 0 && - in_context_tapath != NULL && - strlen((const char *) in_context_tapath) > 0 - ) - { - if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) - { - di32Temp = strlen((const char *) in_context_tapath); - } else - { - di32Temp = 0; - } - } else - { - di32Temp = 0; - } - - // fprintf(stderr, "in_context_tapath_size = %ld \n", in_context_tapath_size); - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - // if (in_context_tapath_size > 0 && in_context_tapath != NULL) - if (di32Temp > 0) - { - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &in_context_tapath - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - } - - dui64Temp = in_context_sessionlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sessionlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sharebuffer_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di64Temp = in_context_sharebuffer_bufferbarrier; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT64, - &di64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_destination_timelow; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_destination_timemid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_destination_timehiandver; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_destination_clockseqandnode_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_destination_clockseqandnode_size > 0 && - in_destination_clockseqandnode != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_destination_clockseqandnode, - in_destination_clockseqandnode_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_connectionmethod; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_connectiondata; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - - dui32Temp = in_operation_started; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_paramtypes; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param1_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param1_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param1_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param2_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param2_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param2_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param3_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param3_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param3_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param4_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param4_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param4_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_session; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_cancelflag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_returnorigin; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_addr; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - /////////////////////////////////////////////////////////////////// - - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_connection_flush(conn); - dbus_message_unref(msg); - - printf("\n"); - printf("Method Call Teec Open Session Sent. \n"); - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - return -1; - } - - // free the pending message handle - dbus_pending_call_unref(pending); - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *teecresult = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *context_fd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *context_tapath_outsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - if (*context_tapath_outsize > 0) - { - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_STRING - ) - { - fprintf(stderr, "Argument is not STRING.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &context_tapath_temp); - - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sharebuffer_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT64 - ) - { - fprintf(stderr, "Argument is not INT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di64Temp - ); - *context_sharebuffer_bufferbarrier = di64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_seesionid = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timelow = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timemid = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timehiandver = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_clockseqandnode_outsize = dui32Temp; - - if (*session_serviceid_clockseqandnode_outsize > 0) - { - bResult = - dbus_message_iter_next( - &structIter - ); - - dbus_message_iter_recurse( - &structIter, - &ArrayIter); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &session_serviceid_clockseqandnode_temp, - &session_serviceid_clockseqandnode_realsize - ); - } - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_opscnt = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_context = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_started = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_paramtypes = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param1_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param1_memref_parent = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param1_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param2_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param2_memref_parent = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param2_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param3_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param3_memref_parent = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param3_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param4_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param4_memref_parent = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param4_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_session = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_cancelflag = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *returnorigin = dui32Temp; - - printf("Got Reply of Method Call Teec Open Session: \n"); - printf(" teecresult = 0x %8.8x \n", *teecresult); - printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); - printf(" ta_path = %s \n", context_tapath_temp); - printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); - printf(" session_seesionid = 0x %8.8x \n", - *session_seesionid - ); -#if 0 - printf(" TEEC_Context session_list.next = 0x %16.16lx \n", - *context_sessionlist_next - ); - printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", - *context_sessionlist_prev - ); - printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", - *context_shrdmemlist_next - ); - printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", - *context_shrdmemlist_prev - ); - printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", - *context_sharebuffer_buffer - ); - printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", - (long unsigned int)*context_sharebuffer_bufferbarrier - ); - - printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", - *session_serviceid_timelow - ); - printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", - *session_serviceid_timehiandver - ); - - printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); - if (*session_serviceid_clockseqandnode_outsize > 0 && - session_serviceid_clockseqandnode_temp != NULL) - { - printf(" "); - for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { - printf(" %2.2x", - session_serviceid_clockseqandnode_temp[i] - ); - } - printf("\n"); - } - printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", - *session_serviceid_clockseqandnode_outsize - ); - - printf(" TEEC_Session session_opscnt = 0x %8.8x \n", - *session_opscnt - ); - printf(" TEEC_Session session_head_next = 0x %16.16lx \n", - *session_head_next - ); - printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", - *session_head_prev - ); - printf(" TEEC_Session session_context = 0x %16.16lx \n", - *session_context - ); - printf(" TEEC_Session operation_started = 0x %8.8x \n", - *operation_started - ); - printf(" TEEC_Session operation_paramtypes = 0x %8.8x \n", - *operation_paramtypes - ); - - printf(" TEEC_Session operation_param1_tmpref_buffer = 0x %16.16lx \n", - *operation_param1_tmpref_buffer - ); - printf(" TEEC_Session operation_param1_tmpref_size = 0x %8.8x \n", - *operation_param1_tmpref_size - ); - printf(" TEEC_Session operation_param1_memref_parent = 0x %16.16lx \n", - *operation_param1_memref_parent - ); - printf(" TEEC_Session operation_param1_memref_size = 0x %8.8x \n", - *operation_param1_memref_size - ); - printf(" TEEC_Session operation_param1_memref_offse = 0x %8.8x \n", - *operation_param1_memref_offset - ); - printf(" TEEC_Session operation_param1_value_a = 0x %8.8x \n", - *operation_param1_value_a - ); - printf(" TEEC_Session operation_param1_value_b = 0x %8.8x \n", - *operation_param1_value_b - ); - printf(" TEEC_Session operation_param1_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param1_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param1_ionref_ionsize = 0x %8.8x \n", - *operation_param1_ionref_ionsize - ); - - printf(" TEEC_Session operation_param2_tmpref_buffer = 0x %16.16lx \n", - *operation_param2_tmpref_buffer - ); - printf(" TEEC_Session operation_param2_tmpref_size = 0x %8.8x \n", - *operation_param2_tmpref_size - ); - printf(" TEEC_Session operation_param2_memref_parent = 0x %16.16lx \n", - *operation_param2_memref_parent - ); - printf(" TEEC_Session operation_param2_memref_size = 0x %8.8x \n", - *operation_param2_memref_size - ); - printf(" TEEC_Session operation_param2_memref_offset = 0x %8.8x \n", - *operation_param2_memref_offset - ); - printf(" TEEC_Session operation_param2_value_a = 0x %8.8x \n", - *operation_param2_value_a - ); - printf(" TEEC_Session operation_param2_value_b = 0x %8.8x \n", - *operation_param2_value_b - ); - printf(" TEEC_Session operation_param2_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param2_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param2_ionref_ionsize = 0x %8.8x \n", - *operation_param2_ionref_ionsize - ); - - printf(" TEEC_Session operation_param3_tmpref_buffer = 0x %16.16lx \n", - *operation_param3_tmpref_buffer - ); - printf(" TEEC_Session operation_param3_tmpref_size = 0x %8.8x \n", - *operation_param3_tmpref_size - ); - printf(" TEEC_Session operation_param3_memref_parent = 0x %16.16lx \n", - *operation_param3_memref_parent - ); - printf(" TEEC_Session operation_param3_memref_size = 0x %8.8x \n", - *operation_param3_memref_size - ); - printf(" TEEC_Session operation_param3_memref_offset = 0x %8.8x \n", - *operation_param3_memref_offset - ); - printf(" TEEC_Session operation_param3_value_a = 0x %8.8x \n", - *operation_param3_value_a - ); - printf(" TEEC_Session operation_param3_value_b = 0x %8.8x \n", - *operation_param3_value_b - ); - printf(" TEEC_Session operation_param3_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param3_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param3_ionref_ionsize = 0x %8.8x \n", - *operation_param3_ionref_ionsize - ); - - printf(" TEEC_Session operation_param4_tmpref_buffer = 0x %16.16lx \n", - *operation_param4_tmpref_buffer - ); - printf(" TEEC_Session operation_param4_tmpref_size = 0x %8.8x \n", - *operation_param4_tmpref_size - ); - printf(" TEEC_Session operation_param4_memref_parent = 0x %16.16lx \n", - *operation_param4_memref_parent - ); - printf(" TEEC_Session operation_param4_memref_size = 0x %8.8x \n", - *operation_param4_memref_size - ); - printf(" TEEC_Session operation_param4_memref_offset = 0x %8.8x \n", - *operation_param4_memref_offset - ); - printf(" TEEC_Session operation_param4_value_a = 0x %8.8x \n", - *operation_param4_value_a - ); - printf(" TEEC_Session operation_param4_value_b = 0x %8.8x \n", - *operation_param4_value_b - ); - printf(" TEEC_Session operation_param4_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param4_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param4_ionref_ionsize = 0x %8.8x \n", - *operation_param4_ionref_ionsize - ); - - printf(" TEEC_Session operation_session = 0x %16.16lx \n", - *operation_session - ); - printf(" TEEC_Session operation_cancelflag = 0x %8.8x \n", - (unsigned int)*operation_cancelflag - ); - printf(" TEEC_Session returnorigin = 0x %8.8x \n", - *returnorigin - ); -#endif - - if (context_tapath_size > *context_tapath_outsize) - { - memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); - *(context_tapath + *context_tapath_outsize) = 0; - } else - { - dbus_message_unref(msg); - return -1; - } - - if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && - session_serviceid_clockseqandnode_temp != NULL && - session_serviceid_clockseqandnode_realsize > 0 - ) - { - for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) - { - session_serviceid_clockseqandnode[i] = - session_serviceid_clockseqandnode_temp[i]; - - } - *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *session_serviceid_clockseqandnode_outsize = 0; - } - - // free msg - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return 0; -} - - -int32_t -method_call_teec_closesession( - const char *workername, - - uint32_t in_session_seesionid, - uint32_t in_session_serviceid_timelow, - uint32_t in_session_serviceid_timemid, - uint32_t in_session_serviceid_timehiandver, - uint32_t *in_session_serviceid_clockseqandnode, - int32_t in_session_serviceid_clockseqandnode_size, - uint32_t in_session_opscnt, - uint64_t in_session_head_next, - uint64_t in_session_head_prev, - uint64_t in_session_context, - - uint32_t *session_seesionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - DBusMessageIter structIter; - DBusMessageIter ArrayIter; - int ret; - int iType; - dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; - int session_serviceid_clockseqandnode_realsize; - dbus_int32_t di32Temp; - dbus_uint32_t dui32Temp; - dbus_uint64_t dui64Temp; - char buf[2]; - buf[0] = DBUS_TYPE_UINT32; - buf[1] = '\0'; - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return -1; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return -1; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "TEEC_CloseSession" - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return -1; - } - - // append arguments - dbus_message_iter_init_append(msg, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - dui32Temp = in_session_seesionid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timelow; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timemid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timehiandver; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_session_serviceid_clockseqandnode_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_session_serviceid_clockseqandnode_size > 0 && - in_session_serviceid_clockseqandnode != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_session_opscnt; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - - dui64Temp = in_session_head_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_session_head_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_session_context; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_connection_flush(conn); - dbus_message_unref(msg); - - printf("\n"); - printf("Method Call Teec Close Session Sent. \n"); - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - return -1; - } - - // free the pending message handle - dbus_pending_call_unref(pending); - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_seesionid = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timelow = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timemid = dui32Temp; - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timehiandver = dui32Temp; - - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_clockseqandnode_outsize = dui32Temp; - - if (*session_serviceid_clockseqandnode_outsize > 0) - { - bResult = - dbus_message_iter_next( - &structIter - ); - - dbus_message_iter_recurse( - &structIter, - &ArrayIter); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &session_serviceid_clockseqandnode_temp, - &session_serviceid_clockseqandnode_realsize - ); - } - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_opscnt = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_context = dui64Temp; - - - printf("Got Reply of Method Call Teec Close Session: \n"); - printf(" session_seesionid = 0x %8.8x \n", - *session_seesionid - ); -#if 0 - printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", - *session_serviceid_timelow - ); - printf(" TEEC_Session session_serviceid_timemid = 0x %8.8x \n", - *session_serviceid_timemid - ); - printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", - *session_serviceid_timehiandver - ); - printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); - printf(" "); - for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { - printf(" %2.2x", - session_serviceid_clockseqandnode_temp[i] - ); - } - printf("\n"); - printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", - *session_serviceid_clockseqandnode_outsize - ); - printf(" TEEC_Session session_opscnt = 0x %8.8x \n", - *session_opscnt - ); - printf(" TEEC_Session session_head_next = 0x %16.16lx \n", - *session_head_next - ); - printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", - *session_head_prev - ); -#endif - printf(" session_context = 0x %16.16lx \n", - *session_context - ); - - if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && - session_serviceid_clockseqandnode_temp != NULL && - session_serviceid_clockseqandnode_realsize > 0 - ) - { - memcpy( - session_serviceid_clockseqandnode, - session_serviceid_clockseqandnode_temp, - session_serviceid_clockseqandnode_realsize * sizeof(uint32_t) - ); - *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *session_serviceid_clockseqandnode_outsize = 0; - } - - // free msg - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return 0; -} - - -int32_t -method_call_teec_invokecommand( - const char *workername, - - uint32_t in_session_sessionid, - uint32_t in_session_serviceid_timelow, - uint32_t in_session_serviceid_timemid, - uint32_t in_session_serviceid_timehiandver, - uint32_t *in_session_serviceid_clockseqandnode, - uint32_t in_session_serviceid_clockseqandnode_size, - uint32_t in_session_opscnt, - uint64_t in_session_head_next, - uint64_t in_session_head_prev, - uint64_t in_session_context, - - uint32_t commandid, - - uint32_t in_operation_started, - uint32_t in_operation_paramtypes, - - uint64_t in_operation_param1_tmpref_buffer, - uint32_t in_operation_param1_tmpref_size, - uint64_t in_operation_param1_memref_parent, - uint32_t in_operation_param1_memref_parent_flag, - uint32_t in_operation_param1_memref_size, - uint32_t in_operation_param1_memref_offset, - uint32_t in_operation_param1_value_a, - uint32_t in_operation_param1_value_b, - int32_t in_operation_param1_ionref_ionsharefd, - uint32_t in_operation_param1_ionref_ionsize, - - uint64_t in_operation_param2_tmpref_buffer, - uint32_t in_operation_param2_tmpref_size, - uint64_t in_operation_param2_memref_parent, - uint32_t in_operation_param2_memref_parent_flag, - uint32_t in_operation_param2_memref_size, - uint32_t in_operation_param2_memref_offset, - uint32_t in_operation_param2_value_a, - uint32_t in_operation_param2_value_b, - int32_t in_operation_param2_ionref_ionsharefd, - uint32_t in_operation_param2_ionref_ionsize, - - uint64_t in_operation_param3_tmpref_buffer, - uint32_t in_operation_param3_tmpref_size, - uint64_t in_operation_param3_memref_parent, - uint32_t in_operation_param3_memref_parent_flag, - uint32_t in_operation_param3_memref_size, - uint32_t in_operation_param3_memref_offset, - uint32_t in_operation_param3_value_a, - uint32_t in_operation_param3_value_b, - int32_t in_operation_param3_ionref_ionsharefd, - uint32_t in_operation_param3_ionref_ionsize, - - uint64_t in_operation_param4_tmpref_buffer, - uint32_t in_operation_param4_tmpref_size, - uint64_t in_operation_param4_memref_parent, - uint32_t in_operation_param4_memref_parent_flag, - uint32_t in_operation_param4_memref_size, - uint32_t in_operation_param4_memref_offset, - uint32_t in_operation_param4_value_a, - uint32_t in_operation_param4_value_b, - int32_t in_operation_param4_ionref_ionsharefd, - uint32_t in_operation_param4_ionref_ionsize, - - uint64_t in_operation_session, - int32_t in_operation_cancelflag, - - uint32_t in_returnorigin, - - uint32_t *in_buffer1, - uint32_t in_buffer1_size, - uint32_t *in_buffer2, - uint32_t in_buffer2_size, - uint32_t *in_buffer3, - uint32_t in_buffer3_size, - uint32_t *in_buffer4, - uint32_t in_buffer4_size, - - - uint32_t *teecresult, - - uint32_t *session_sessionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context, - - uint32_t *operation_started, - uint32_t *operation_paramtypes, - - uint64_t *operation_param1_tmpref_buffer, - uint32_t *operation_param1_tmpref_size, - uint64_t *operation_param1_memref_parent, - uint32_t *operation_param1_memref_parent_flag, - uint32_t *operation_param1_memref_size, - uint32_t *operation_param1_memref_offset, - uint32_t *operation_param1_value_a, - uint32_t *operation_param1_value_b, - int32_t *operation_param1_ionref_ionsharefd, - uint32_t *operation_param1_ionref_ionsize, - - uint64_t *operation_param2_tmpref_buffer, - uint32_t *operation_param2_tmpref_size, - uint64_t *operation_param2_memref_parent, - uint32_t *operation_param2_memref_parent_flag, - uint32_t *operation_param2_memref_size, - uint32_t *operation_param2_memref_offset, - uint32_t *operation_param2_value_a, - uint32_t *operation_param2_value_b, - int32_t *operation_param2_ionref_ionsharefd, - uint32_t *operation_param2_ionref_ionsize, - - uint64_t *operation_param3_tmpref_buffer, - uint32_t *operation_param3_tmpref_size, - uint64_t *operation_param3_memref_parent, - uint32_t *operation_param3_memref_parent_flag, - uint32_t *operation_param3_memref_size, - uint32_t *operation_param3_memref_offset, - uint32_t *operation_param3_value_a, - uint32_t *operation_param3_value_b, - int32_t *operation_param3_ionref_ionsharefd, - uint32_t *operation_param3_ionref_ionsize, - - uint64_t *operation_param4_tmpref_buffer, - uint32_t *operation_param4_tmpref_size, - uint64_t *operation_param4_memref_parent, - uint32_t *operation_param4_memref_parent_flag, - uint32_t *operation_param4_memref_size, - uint32_t *operation_param4_memref_offset, - uint32_t *operation_param4_value_a, - uint32_t *operation_param4_value_b, - int32_t *operation_param4_ionref_ionsharefd, - uint32_t *operation_param4_ionref_ionsize, - - uint64_t *operation_session, - int32_t *operation_cancelflag, - - uint32_t *returnorigin, - - uint32_t *buffer1, - uint32_t buffer1_size, - uint32_t *buffer1_outsize, - uint32_t *buffer2, - uint32_t buffer2_size, - uint32_t *buffer2_outsize, - uint32_t *buffer3, - uint32_t buffer3_size, - uint32_t *buffer3_outsize, - uint32_t *buffer4, - uint32_t buffer4_size, - uint32_t *buffer4_outsize -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - DBusMessageIter structIter; - DBusMessageIter ArrayIter; - int ret; - int iType; - dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; - int session_serviceid_clockseqandnode_realsize; - dbus_int32_t di32Temp; - dbus_uint32_t dui32Temp; - dbus_uint64_t dui64Temp; - char buf[2]; - buf[0] = DBUS_TYPE_UINT32; - buf[1] = '\0'; - - dbus_uint32_t *buffer1_temp = NULL; - int buffer1_realsize; - dbus_uint32_t *buffer2_temp = NULL; - int buffer2_realsize; - dbus_uint32_t *buffer3_temp = NULL; - int buffer3_realsize; - dbus_uint32_t *buffer4_temp = NULL; - int buffer4_realsize; - - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return -1; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return -1; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "TEEC_InvokeCommand" - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return -1; - } - - - // append arguments - dbus_message_iter_init_append(msg, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - - dui32Temp = in_session_sessionid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timelow; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timemid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timehiandver; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_clockseqandnode_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_session_serviceid_clockseqandnode_size > 0 && - in_session_serviceid_clockseqandnode != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_session_opscnt; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_session_head_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_session_head_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_session_context; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - - dui32Temp = commandid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - - dui32Temp = in_operation_started; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_paramtypes; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param1_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param1_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_memref_parent_flag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param1_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param2_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param2_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_memref_parent_flag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param2_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param3_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param3_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_memref_parent_flag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param3_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param4_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param4_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_memref_parent_flag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param4_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_session; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_cancelflag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_returnorigin; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_buffer1_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_buffer1_size > 0 && - in_buffer1 != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_buffer1, - in_buffer1_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_buffer2_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_buffer2_size > 0 && - in_buffer2 != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_buffer2, - in_buffer2_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_buffer3_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_buffer3_size > 0 && - in_buffer3 != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_buffer3, - in_buffer3_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_buffer4_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_buffer4_size > 0 && - in_buffer4 != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_buffer4, - in_buffer4_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_connection_flush(conn); - dbus_message_unref(msg); - - printf("\n"); - printf("Method Call Teec Invoke Command Sent. \n"); - - ///////////////////////////////////////////////////////////////////////////////////// - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - return -1; - } - - // free the pending message handle - dbus_pending_call_unref(pending); - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *teecresult = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_sessionid = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timelow = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timemid = dui32Temp; - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timehiandver = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_clockseqandnode_outsize = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - if (*session_serviceid_clockseqandnode_outsize > 0) - { - - dbus_message_iter_recurse( - &structIter, - &ArrayIter - ); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &session_serviceid_clockseqandnode_temp, - &session_serviceid_clockseqandnode_realsize - ); - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_opscnt = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_context = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_started = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_paramtypes = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param1_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param1_memref_parent = dui64Temp; - - bResult = dbus_message_iter_next(&structIter); - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_memref_parent_flag = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param1_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param2_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param2_memref_parent = dui64Temp; - - bResult = dbus_message_iter_next(&structIter); - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_memref_parent_flag = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param2_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param3_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param3_memref_parent = dui64Temp; - - bResult = dbus_message_iter_next(&structIter); - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_memref_parent_flag = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param3_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param4_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param4_memref_parent = dui64Temp; - - bResult = dbus_message_iter_next(&structIter); - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_memref_parent_flag = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param4_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_session = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_cancelflag = di32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *returnorigin = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *buffer1_outsize = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - if (*buffer1_outsize > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter - ); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &buffer1_temp, - &buffer1_realsize - ); - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *buffer2_outsize = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - if (*buffer2_outsize > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter - ); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &buffer2_temp, - &buffer2_realsize - ); - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *buffer3_outsize = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - if (*buffer3_outsize > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter - ); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &buffer3_temp, - &buffer3_realsize - ); - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *buffer4_outsize = dui32Temp; - - if (*buffer4_outsize > 0) - { - bResult = - dbus_message_iter_next( - &structIter - ); - - dbus_message_iter_recurse( - &structIter, - &ArrayIter - ); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &buffer4_temp, - &buffer4_realsize - ); - } - - - printf("Got Reply of Method Call Teec Invoke Command: \n"); - printf(" teecresult = 0x %8.8x \n", - *teecresult); - printf(" session_seesionid = 0x %8.8x \n", - *session_sessionid - ); -#if 0 - printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", - *session_serviceid_timelow - ); - printf(" TEEC_Session session_serviceid_timemid = 0x %8.8x \n", - *session_serviceid_timemid - ); - printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", - *session_serviceid_timehiandver - ); - printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); - if ( *session_serviceid_clockseqandnode_outsize > 0 && - session_serviceid_clockseqandnode_temp != NULL - ) - { - for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { - printf(" %2.2x", - session_serviceid_clockseqandnode_temp[i] - ); - } - printf("\n"); - } - printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", - *session_serviceid_clockseqandnode_outsize - ); - printf(" TEEC_Session session_opscnt = 0x %8.8x \n", - *session_opscnt - ); - printf(" TEEC_Session session_head_next = 0x %16.16lx \n", - *session_head_next - ); - printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", - *session_head_prev - ); - printf(" TEEC_Session session_context = 0x %16.16lx \n", - *session_context - ); - printf(" TEEC_Session session_context = 0x %16.16lx \n", - *session_context - ); - printf(" TEEC_Session operation_started = 0x %8.8x \n", - *operation_started - ); - printf(" TEEC_Session operation_paramtypes = 0x %8.8x \n", - *operation_paramtypes - ); - printf(" TEEC_Session operation_param1_tmpref_buffer = 0x %16.16lx \n", - *operation_param1_tmpref_buffer - ); - printf(" TEEC_Session operation_param1_tmpref_size = 0x %8.8x \n", - *operation_param1_tmpref_size - ); - printf(" TEEC_Session operation_param1_memref_parent = 0x %16.16lx \n", - *operation_param1_memref_parent - ); - printf(" TEEC_Session operation_param1_memref_size = 0x %8.8x \n", - *operation_param1_memref_size - ); - printf(" TEEC_Session operation_param1_memref_offse = 0x %8.8x \n", - *operation_param1_memref_offset - ); - printf(" TEEC_Session operation_param1_value_a = 0x %8.8x \n", - *operation_param1_value_a - ); - printf(" TEEC_Session operation_param1_value_b = 0x %8.8x \n", - *operation_param1_value_b - ); - printf(" TEEC_Session operation_param1_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param1_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param1_ionref_ionsize = 0x %8.8x \n", - *operation_param1_ionref_ionsize - ); - - printf(" TEEC_Session operation_param2_tmpref_buffer = 0x %16.16lx \n", - *operation_param2_tmpref_buffer - ); - printf(" TEEC_Session operation_param2_tmpref_size = 0x %8.8x \n", - *operation_param2_tmpref_size - ); - printf(" TEEC_Session operation_param2_memref_parent = 0x %16.16lx \n", - *operation_param2_memref_parent - ); - printf(" TEEC_Session operation_param2_memref_size = 0x %8.8x \n", - *operation_param2_memref_size - ); - printf(" TEEC_Session operation_param2_memref_offset = 0x %8.8x \n", - *operation_param2_memref_offset - ); - printf(" TEEC_Session operation_param2_value_a = 0x %8.8x \n", - *operation_param2_value_a - ); - printf(" TEEC_Session operation_param2_value_b = 0x %8.8x \n", - *operation_param2_value_b - ); - printf(" TEEC_Session operation_param2_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param2_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param2_ionref_ionsize = 0x %8.8x \n", - *operation_param2_ionref_ionsize - ); - - printf(" TEEC_Session operation_param3_tmpref_buffer = 0x %16.16lx \n", - *operation_param3_tmpref_buffer - ); - printf(" TEEC_Session operation_param3_tmpref_size = 0x %8.8x \n", - *operation_param3_tmpref_size - ); - printf(" TEEC_Session operation_param3_memref_parent = 0x %16.16lx \n", - *operation_param3_memref_parent - ); - printf(" TEEC_Session operation_param3_memref_size = 0x %8.8x \n", - *operation_param3_memref_size - ); - printf(" TEEC_Session operation_param3_memref_offset = 0x %8.8x \n", - *operation_param3_memref_offset - ); - printf(" TEEC_Session operation_param3_value_a = 0x %8.8x \n", - *operation_param3_value_a - ); - printf(" TEEC_Session operation_param3_value_b = 0x %8.8x \n", - *operation_param3_value_b - ); - printf(" TEEC_Session operation_param3_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param3_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param3_ionref_ionsize = 0x %8.8x \n", - *operation_param3_ionref_ionsize - ); - - printf(" TEEC_Session operation_param4_tmpref_buffer = 0x %16.16lx \n", - *operation_param4_tmpref_buffer - ); - printf(" TEEC_Session operation_param4_tmpref_size = 0x %8.8x \n", - *operation_param4_tmpref_size - ); - printf(" TEEC_Session operation_param4_memref_parent = 0x %16.16lx \n", - *operation_param4_memref_parent - ); - printf(" TEEC_Session operation_param4_memref_size = 0x %8.8x \n", - *operation_param4_memref_size - ); - printf(" TEEC_Session operation_param4_memref_offset = 0x %8.8x \n", - *operation_param4_memref_offset - ); - printf(" TEEC_Session operation_param4_value_a = 0x %8.8x \n", - *operation_param4_value_a - ); - printf(" TEEC_Session operation_param4_value_b = 0x %8.8x \n", - *operation_param4_value_b - ); - printf(" TEEC_Session operation_param4_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param4_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param4_ionref_ionsize = 0x %8.8x \n", - *operation_param4_ionref_ionsize - ); - - printf(" TEEC_Session operation_session = 0x %16.16lx \n", - *operation_session - ); - printf(" TEEC_Session operation_cancelflag = 0x %8.8x \n", - (unsigned int)*operation_cancelflag - ); - printf(" returnorigin = 0x %8.8x \n", - *returnorigin - ); - - printf(" buffer1 = \n"); - if (buffer1_temp != NULL) - { - for (int i = 0; i < buffer1_realsize; i++) { - printf(" %2.2x", - buffer1_temp[i] - ); - } - printf("\n"); - } - printf(" buffer1_outsize = 0x %8.8x \n", - *buffer1_outsize - ); - - printf(" buffer2 = \n"); - if (buffer2_temp != NULL) - { - for (int i = 0; i < buffer2_realsize; i++) { - printf(" %2.2x", - buffer2_temp[i] - ); - } - printf("\n"); - } - printf(" buffer2_outsize = 0x %8.8x \n", - *buffer2_outsize - ); - - printf(" buffer3 = \n"); - if (buffer3_temp != NULL) - { - for (int i = 0; i < buffer3_realsize; i++) { - printf(" %2.2x", - buffer3_temp[i] - ); - } - printf("\n"); - } - printf(" buffer3_outsize = 0x %8.8x \n", - *buffer3_outsize - ); - - if (buffer4_temp != NULL) - { - printf(" buffer4 = \n"); - for (int i = 0; i < buffer4_realsize; i++) { - printf(" %2.2x", - buffer4_temp[i] - ); - } - printf("\n"); - } - printf(" buffer4_outsize = 0x %8.8x \n", - *buffer4_outsize - ); -#endif - - if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && - session_serviceid_clockseqandnode != NULL && - session_serviceid_clockseqandnode_temp != NULL && - session_serviceid_clockseqandnode_realsize > 0 - ) - { - memcpy( - session_serviceid_clockseqandnode, - session_serviceid_clockseqandnode_temp, - session_serviceid_clockseqandnode_realsize * sizeof(uint32_t) - ); - *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *session_serviceid_clockseqandnode_outsize = 0; - } - - if (buffer1_size >= (uint32_t) buffer1_realsize && - buffer1 != NULL && - buffer1_temp != NULL && - buffer1_realsize > 0 - ) - { - memcpy( - buffer1, - buffer1_temp, - buffer1_realsize * sizeof(uint32_t) - ); - *buffer1_outsize = buffer1_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *buffer1_outsize = 0; - } - - if (buffer2_size >= (uint32_t) buffer2_realsize && - buffer2 != NULL && - buffer2_temp != NULL && - buffer2_realsize > 0 - ) - { - memcpy( - buffer2, - buffer2_temp, - buffer2_realsize * sizeof(uint32_t) - ); - *buffer2_outsize = buffer2_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *buffer2_outsize = 0; - } - - if (buffer3_size >= (uint32_t) buffer3_realsize && - buffer3 != NULL && - buffer3_temp != NULL && - buffer3_realsize > 0 - ) - { - memcpy( - buffer3, - buffer3_temp, - buffer3_realsize * sizeof(uint32_t) - ); - *buffer3_outsize = buffer3_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *buffer3_outsize = 0; - } - - if (buffer4_size >= (uint32_t) buffer4_realsize && - buffer4 != NULL && - buffer4_temp != NULL && - buffer4_realsize > 0 - ) - { - memcpy( - buffer4, - buffer4_temp, - buffer4_realsize * sizeof(uint32_t) - ); - *buffer4_outsize = buffer4_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *buffer4_outsize = 0; - } - - - // free msg - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return 0; -} - - -/** - * Call a method on a remote object - */ -void -method_call_destroy_threadpool( - const char *workername -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - // DBusConnection* conn; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - int ret; - int iType; - unsigned char name[] = "threadpool"; - unsigned char *charp; - dbus_uint32_t retcode; - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "Destroy" // method name - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return; - } - - - // append arguments - dbus_message_iter_init_append(msg, &args); - - charp = name; - if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &charp)) - { - fprintf(stderr, "Out Of Memory!\n"); - exit(1); - } - - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - exit(1); - } - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - exit(1); - } - dbus_connection_flush(conn); - - printf("\n"); - printf("Method Call Destroy Threadpool Sent. \n"); - - // free message - dbus_message_unref(msg); - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - exit(1); - } - // free the pending message handle - dbus_pending_call_unref(pending); - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - exit(1); - } - - iType = - dbus_message_iter_get_arg_type( - &args - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - exit(1); - } - dbus_message_iter_get_basic( - &args, - &retcode - ); - - printf("Got Reply of Method Call Destroy Threadpool: \n"); - printf(" retcode = 0x%8x \n", retcode); - - // free reply - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); -} - - -#ifdef GP_PROXY_WORKER - -void * -reply_to_method_call_teec_inicont( - // DBusMessage* msg, - // DBusConnection* conn - void *thdfargs -) -{ - DBusMsgConn *DBusMCP; - DBusMessage *msg; - DBusConnection *conn; - DBusMessage *reply; - DBusMessageIter args; - dbus_bool_t bResult; - DBusMessageIter structIter; - int iType; - unsigned char *charp; - // char* param = ""; - unsigned char *name = NULL; - dbus_int32_t name_size; - dbus_int32_t in_fd; - unsigned char *in_ta_path = NULL; - dbus_int32_t in_ta_path_size; - dbus_uint64_t in_session_list_next; - dbus_uint64_t in_session_list_prev; - dbus_uint64_t in_shrd_mem_list_next; - dbus_uint64_t in_shrd_mem_list_prev; - dbus_uint64_t in_share_buffer_buffer; - dbus_int64_t in_share_buffer_buffer_barrier; - dbus_uint32_t teecresult; - dbus_int32_t fd; - // unsigned char ta_path[] = "/vendor/bin/rsa_demo_ta"; - // dbus_int32_t ta_path_size = strlen((const char *)ta_path); - unsigned char *ta_path = NULL; - dbus_int32_t ta_path_size = 0; - dbus_uint64_t session_list_next; - dbus_uint64_t session_list_prev; - dbus_uint64_t shrd_mem_list_next; - dbus_uint64_t shrd_mem_list_prev; - dbus_uint64_t share_buffer_buffer; - dbus_int64_t share_buffer_buffer_barrier; - dbus_uint64_t context_addr; - dbus_uint32_t serial = 0; - -#ifdef GP_PROXY - pthread_mutex_t * mutex_workerrec; - pthread_cond_t * cond_notbusy; - wr_t * workerrec; -#endif - -#ifdef GP_WORKER - pthread_mutex_t *mutex_tcl; - pthread_mutex_t *mutex_tsl; - tcl_t *tcl; - tsl_t *tsl; -#endif - - DBusMCP = (DBusMsgConn *) thdfargs; - msg = DBusMCP->msg; - conn = DBusMCP->conn; -#ifdef GP_PROXY - mutex_workerrec = DBusMCP->mutex_workerrec; - cond_notbusy = DBusMCP->cond_notbusy; - workerrec = DBusMCP->workerrec; -#endif -#ifdef GP_WORKER - mutex_tcl = DBusMCP->mutex_tcl; - mutex_tsl = DBusMCP->mutex_tsl; - tcl = DBusMCP->tcl; - tsl = DBusMCP->tsl; -#endif - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &name_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (name_size > 0) - { - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_STRING - ) - { - fprintf(stderr, "Argument is not STRING.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &name); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_fd); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_ta_path_size - ); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - // fprintf(stderr, "Debug in_ta_path_size = %d \n", in_ta_path_size); - if (in_ta_path_size > 0) - { - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_STRING - ) - { - fprintf(stderr, "Argument is not STRING.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_ta_path); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_list_next); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_list_prev); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_shrd_mem_list_next); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_shrd_mem_list_prev); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_share_buffer_buffer); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT64 - ) - { - fprintf(stderr, "Argument is not INT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_share_buffer_buffer_barrier); - - printf("Received method call Teec Initialize Context: \n"); - printf(" in name = %s \n", name); - printf(" in name_size = %d \n", name_size); - printf(" in_fd = 0x %8.8x \n", in_fd); - printf(" in_ta_path = %s \n", in_ta_path); - printf(" in_ta_path_size = %d \n", in_ta_path_size); -#if 0 - printf(" in_session_list_next = 0x %16.16lx \n", in_session_list_next); - printf(" in_session_list_prev = 0x %16.16lx \n", in_session_list_prev); - printf(" in_shrd_mem_list_next = 0x %16.16lx \n", in_shrd_mem_list_next); - printf(" in_shrd_mem_list_prev = 0x %16.16lx \n", in_shrd_mem_list_prev); - printf(" in_share_buffer_buffer = 0x %16.16lx \n", in_share_buffer_buffer); - printf(" in_share_buffer_buffer_barrier = 0x %16.16lx \n", in_share_buffer_buffer_barrier); -#endif - -#ifdef GP_WORKER - //////////////////////////////////////////////////////////////////////////////////////////////// - TEEC_Context *contextIns = (TEEC_Context *) malloc(sizeof(TEEC_Context)); - - TEEC_Result result; - - contextIns->fd = in_fd; - contextIns->ta_path = in_ta_path; - contextIns->session_list.next = (struct ListNode *) in_session_list_next; - contextIns->session_list.prev = (struct ListNode *) in_session_list_prev; - contextIns->shrd_mem_list.next = (struct ListNode *) in_shrd_mem_list_next; - contextIns->shrd_mem_list.prev = (struct ListNode *) in_shrd_mem_list_prev; - contextIns->share_buffer.buffer = (void *) in_share_buffer_buffer; - contextIns->share_buffer.buffer_barrier.__align = (long long int) in_share_buffer_buffer_barrier; - // typedef struct { - // volatile int __val[4*sizeof(long)/sizeof(int)]; - // } sem_t; - // - // typedef union - // { - // char __size[__SIZEOF_SEM_T]; - // long long int __align; - // } sem_t; - struct timeval start, end; - gettimeofday(&start, NULL); - result = TEEC_InitializeContext(NULL, contextIns); - gettimeofday(&end, NULL); - uint32_t cost = 0; - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - if (result != TEEC_SUCCESS) - { - printf("Teec InitilizeContext Failed.\n"); - printf(" teecresult = 0x %8.8x.\n", result); - - teecresult = result; - fd = 0; - ta_path_size = 0; - ta_path = NULL; - charp = ta_path; - session_list_next = 0; - session_list_prev = 0; - shrd_mem_list_next = 0; - shrd_mem_list_prev = 0; - share_buffer_buffer = 0; - share_buffer_buffer_barrier = 0; - context_addr = 0; - } else - { - printf("Teec InitilizeContext Succed, cost time: %ld us \n", cost); - - tcn_t *tcnIns = (tcn_t *) malloc(sizeof(tcn_t)); - tcnIns->self = contextIns; - struct timeval tvcreate; - gettimeofday(&tvcreate, NULL); - tcnIns->createtime = tvcreate; - - pthread_mutex_lock(mutex_tcl); - if (tcl->first == NULL) - { - tcnIns->next = NULL; - tcnIns->prev = NULL; - tcl->first = tcnIns; - tcl->last = tcnIns; - tcl->count = 1; - } else - { - tcnIns->prev = tcl->last; - tcnIns->next = NULL; - tcl->last->next = tcnIns; - tcl->last = tcnIns; - tcl->count = tcl->count + 1; - } - pthread_mutex_unlock(mutex_tcl); - - teecresult = result; - fd = contextIns->fd; - if (contextIns->ta_path != NULL) - { - ta_path_size = strlen((const char *) contextIns->ta_path); - } else - { - ta_path_size = 0; - } - ta_path = contextIns->ta_path; - charp = ta_path; - session_list_next = (dbus_uint64_t) contextIns->session_list.next; - session_list_prev = (dbus_uint64_t) contextIns->session_list.prev; - shrd_mem_list_next = (dbus_uint64_t) contextIns->shrd_mem_list.next; - shrd_mem_list_prev = (dbus_uint64_t) contextIns->shrd_mem_list.prev; - share_buffer_buffer = (dbus_uint64_t) contextIns->share_buffer.buffer; - share_buffer_buffer_barrier = contextIns->share_buffer.buffer_barrier.__align; - - // context_addr = (dbus_uint64_t)contextIns; - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - context_addr = (dbus_uint64_t) DBusMCP->workernum - + u64time - + (long unsigned int) rand(); - - printf(" context fd = 0x %8.8x \n", contextIns->fd); - printf(" context address = 0x %16.16lx \n", context_addr); - } - - // TEEC_FinalizeContext(&contextIns); - // printf("Teec FinalizedContext.\n"); - //////////////////////////////////////////////////////////////////////////////////////////////// -#else - ta_path = (unsigned char *)malloc(1024 * sizeof(char)); - ta_path_size = 1024; - memset((char *)ta_path, 0, 1024); - uint32_t context_tapath_outsize; - - char workername[1024]; - memset((char *)workername, 0, 1024); - int ifound = 0; - int iworker; - for( ; ; ) - { - pthread_mutex_lock(mutex_workerrec); - for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) - { - if (workerrec[iworker].busy == 0) - { - sprintf(workername, "%s%d", "gpworker", iworker); - workerrec[iworker].busy = 1; - ifound = 1; - break; - } - } - if (ifound == 0) - { - pthread_cond_wait(cond_notbusy, mutex_workerrec); - } - pthread_mutex_unlock(mutex_workerrec); - - if (ifound == 1) - { - break; - } - } - - method_call_teec_inicont( - workername, - - name, - name_size, - in_fd, - in_ta_path, - in_ta_path_size, - in_session_list_next, - in_session_list_prev, - in_shrd_mem_list_next, - in_shrd_mem_list_prev, - in_share_buffer_buffer, - in_share_buffer_buffer_barrier, - - - &teecresult, - - &fd, - ta_path, - ta_path_size, - &session_list_next, - &session_list_prev, - &shrd_mem_list_next, - &shrd_mem_list_prev, - &share_buffer_buffer, - &share_buffer_buffer_barrier, - &context_addr, - - &context_tapath_outsize - ); - - if (teecresult == 0) - { - pthread_mutex_lock(mutex_workerrec); - workerrec[iworker].context_fd = fd; - workerrec[iworker].context_addr = context_addr; - workerrec[iworker].first = NULL; - workerrec[iworker].last = NULL; - workerrec[iworker].sessionid_count = 0; - struct timeval tvcreate; - gettimeofday(&tvcreate, NULL); - workerrec[iworker].context_createtime = tvcreate; - pthread_mutex_unlock(mutex_workerrec); - } - else - { - workerrec[iworker].busy = 0; - } - - if (ta_path_size >= context_tapath_outsize) { - ta_path_size = context_tapath_outsize; - charp = ta_path; - } - else - { - ta_path_size = 0; - charp = NULL; - } - - //////////////////////////////////////////////////////////////////////////////////////////////// -#endif - - // create a reply from the message - reply = dbus_message_new_method_return(msg); - -#if 0 - teecresult = 0; - fd = 0x04; - charp = ta_path; - session_list_next = 0xea3500a8; - session_list_prev = 0xea3500a8; - shrd_mem_list_next = 0xea3500b8; - shrd_mem_list_prev = 0xea3500b8; - share_buffer_buffer = 0; - share_buffer_buffer_barrier = 0xdd901c10; -#endif - - // add the arguments to the reply - dbus_message_iter_init_append(reply, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &teecresult - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &fd - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - DBusError err; - // initialise the errors - dbus_error_init(&err); - - if (ta_path_size > 0 && - charp != NULL && - strlen((const char *) charp) > 0 - ) - { - if (dbus_validate_utf8((const char *) charp, &err) == true) - { - ta_path_size = strlen((const char *) charp); - } else - { - ta_path_size = 0; - } - } else - { - ta_path_size = 0; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &ta_path_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (ta_path_size > 0) - { - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &charp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &session_list_next - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &session_list_prev - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &shrd_mem_list_prev - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &shrd_mem_list_next - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &share_buffer_buffer - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT64, - &share_buffer_buffer_barrier - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &context_addr - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - // send the reply && flush the connection - serial = 100; - if (!dbus_connection_send(conn, reply, &serial)) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_unref(reply); - dbus_message_unref(msg); - dbus_connection_flush(conn); - // dbus_connection_close(conn); - // dbus_connection_unref(conn); - - free(thdfargs); - - // sleep(2); - -#if 0 - #ifdef GP_WORKER - -#else - if (ta_path == NULL) - { - free(ta_path); - } -#endif -#endif - - return NULL; -} - - -void * -reply_to_method_call_teec_fincont( - void *thdfargs -) -{ - DBusMsgConn *DBusMCP; - DBusMessage *msg; - DBusConnection *conn; - DBusMessage *reply; - DBusMessageIter args; - dbus_bool_t bResult; - DBusMessageIter structIter; - int iType; - unsigned char *charp; - // char* param = ""; - dbus_int32_t in_fd; - unsigned char *in_ta_path = NULL; - dbus_int32_t in_ta_path_size; - dbus_uint64_t in_session_list_next; - dbus_uint64_t in_session_list_prev; - dbus_uint64_t in_shrd_mem_list_next; - dbus_uint64_t in_shrd_mem_list_prev; - dbus_uint64_t in_share_buffer_buffer; - dbus_int64_t in_share_buffer_buffer_barrier; - dbus_uint64_t in_context_addr; - - dbus_int32_t fd; - dbus_int32_t ta_path_size = 0; - dbus_uint64_t session_list_next; - dbus_uint64_t session_list_prev; - dbus_uint64_t shrd_mem_list_next; - dbus_uint64_t shrd_mem_list_prev; - dbus_uint64_t share_buffer_buffer; - dbus_int64_t share_buffer_buffer_barrier; - dbus_uint32_t serial = 0; - -#ifdef GP_PROXY - pthread_mutex_t * mutex_workerrec; - pthread_cond_t * cond_notbusy; - wr_t * workerrec; -#endif - -#ifdef GP_WORKER - pthread_mutex_t *mutex_tcl; - tcl_t *tcl; - tsl_t *tsl; -#endif - - DBusMCP = (DBusMsgConn *) thdfargs; - msg = DBusMCP->msg; - conn = DBusMCP->conn; -#ifdef GP_PROXY - mutex_workerrec = DBusMCP->mutex_workerrec; - cond_notbusy = DBusMCP->cond_notbusy; - workerrec = DBusMCP->workerrec; -#endif -#ifdef GP_WORKER - mutex_tcl = DBusMCP->mutex_tcl; - tcl = DBusMCP->tcl; - tsl = DBusMCP->tsl; -#endif - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_fd); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_ta_path_size - ); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - // fprintf(stderr, "Debug in_ta_path_size = %d \n", in_ta_path_size); - if (in_ta_path_size > 0) - { - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_STRING - ) - { - fprintf(stderr, "Argument is not STRING.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_ta_path); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_list_next); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_list_prev); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_shrd_mem_list_next); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_shrd_mem_list_prev); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_share_buffer_buffer); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT64 - ) - { - fprintf(stderr, "Argument is not INT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_share_buffer_buffer_barrier); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_context_addr); - - printf("Received method call Teec Finalize Context: \n"); - printf(" in_fd = 0x %8.8x \n", in_fd); - printf(" in_ta_path_size = %d \n", in_ta_path_size); - - DBusError err; - dbus_error_init(&err); - if (in_ta_path_size > 0 && in_ta_path != NULL && dbus_validate_path((const char *) in_ta_path, &err) == true) - { - printf(" in_ta_path = %s \n", in_ta_path); - } -#if 0 - printf(" in_session_list_next = 0x %16.16lx \n", in_session_list_next); - printf(" in_session_list_prev = 0x %16.16lx \n", in_session_list_prev); - printf(" in_shrd_mem_list_next = 0x %16.16lx \n", in_shrd_mem_list_next); - printf(" in_shrd_mem_list_prev = 0x %16.16lx \n", in_shrd_mem_list_prev); - printf(" in_share_buffer_buffer = 0x %16.16lx \n", in_share_buffer_buffer); - printf(" in_share_buffer_buffer_barrier = 0x %16.16lx \n", in_share_buffer_buffer_barrier); -#endif - printf(" in_context_addr = 0x %16.16lx \n", in_context_addr); - - - unsigned char *ta_path = NULL; -#ifdef GP_WORKER - //////////////////////////////////////////////////////////////////////////////////////////////// - TEEC_Context *contextIns; - tcn_t *tcnIns; - TEEC_Result result; - - contextIns = NULL; - pthread_mutex_lock(mutex_tcl); - if (tcl->first != NULL) - { - tcnIns = tcl->first; - do - { - if (tcnIns->self->fd == in_fd) - { - contextIns = tcnIns->self; - break; - } - tcnIns = tcnIns->next; - } while (tcnIns != NULL); - } - pthread_mutex_unlock(mutex_tcl); - - if (contextIns == NULL) - { - if (tcl->first == NULL) - { - printf("The teec context list is null. \n"); - // teecresult = TEEC_ERROR_CONTEXT_LIST_NULL; - } else - { - printf("Can't find the teec context. \n"); - // teecresult = TEEC_ERROR_NO_CONTEXT_MATCH; - } - - fd = 0; - ta_path_size = 0; - charp = NULL; - session_list_prev = 0; - shrd_mem_list_next = 0; - shrd_mem_list_prev = 0; - share_buffer_buffer = 0; - share_buffer_buffer_barrier = 0; - } else - { - // contextIns.fd = in_fd; - contextIns->ta_path = in_ta_path; - contextIns->session_list.next = (struct ListNode *) in_session_list_next; - contextIns->session_list.prev = (struct ListNode *) in_session_list_prev; - contextIns->shrd_mem_list.next = (struct ListNode *) in_shrd_mem_list_next; - contextIns->shrd_mem_list.prev = (struct ListNode *) in_shrd_mem_list_prev; - contextIns->share_buffer.buffer = (void *) in_share_buffer_buffer; - contextIns->share_buffer.buffer_barrier.__align = (long long int) in_share_buffer_buffer_barrier; - // typedef struct { - // volatile int __val[4*sizeof(long)/sizeof(int)]; - // } sem_t; - // - // typedef union - // { - // char __size[__SIZEOF_SEM_T]; - // long long int __align; - // } sem_t; - - struct timeval start, end; - gettimeofday(&start, NULL); - TEEC_FinalizeContext(contextIns); - gettimeofday(&end, NULL); - uint32_t cost = 0; - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - printf("Teec FinalizeContext executed, cost time: %ld us \n", cost); - - fd = contextIns->fd; - if (contextIns->ta_path != NULL) - { - ta_path_size = strlen((const char *) contextIns->ta_path); - ta_path = contextIns->ta_path; - } else - { - ta_path_size = 0; - ta_path = NULL; - } - charp = ta_path; - session_list_next = (dbus_uint64_t) contextIns->session_list.next; - session_list_prev = (dbus_uint64_t) contextIns->session_list.prev; - shrd_mem_list_next = (dbus_uint64_t) contextIns->shrd_mem_list.next; - shrd_mem_list_prev = (dbus_uint64_t) contextIns->shrd_mem_list.prev; - share_buffer_buffer = (dbus_uint64_t) contextIns->share_buffer.buffer; - share_buffer_buffer_barrier = contextIns->share_buffer.buffer_barrier.__align; - - tcn_t *tcnTemp; - tcnTemp = tcnIns->prev; - if (tcnTemp != NULL) - { - tcnTemp->next = tcnIns->next; - } - tcnTemp = tcnIns->next; - if (tcnTemp != NULL) - { - tcnTemp->prev = tcnIns->prev; - } - pthread_mutex_lock(mutex_tcl); - if (tcl->last == tcnIns) - { - tcl->last = tcnIns->prev; - } - if (tcl->first == tcnIns) - { - tcl->first = tcnIns->next; - } - tcl->count = tcl->count - 1; - pthread_mutex_unlock(mutex_tcl); - free(contextIns); - free(tcnIns); - } - //////////////////////////////////////////////////////////////////////////////////////////////// -#else - ta_path = (unsigned char *)malloc(1024 * sizeof(char)); - ta_path_size = 1024; - memset((char *)ta_path, 0, 1024); - uint32_t context_tapath_outsize; - - char workername[1024]; - memset((char *)workername, 0, 1024); - int ifound = 0; - int iworker; - - pthread_mutex_lock(mutex_workerrec); - for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) - { - if (workerrec[iworker].context_fd == in_fd && - workerrec[iworker].context_addr == in_context_addr - ) - { - sprintf(workername, "%s%d", "gpworker", iworker); - ifound = 1; - break; - } - } - pthread_mutex_unlock(mutex_workerrec); - - if (ifound == 0) - { - printf("Can't find the worker for the context. \n"); - - // teecresult = 0xAAAA0017; - - fd = 0; - ta_path_size = 0; - charp = NULL; - session_list_prev = 0; - shrd_mem_list_next = 0; - shrd_mem_list_prev = 0; - share_buffer_buffer = 0; - share_buffer_buffer_barrier = 0; - } - else - { - pthread_mutex_unlock(mutex_workerrec); - sin_t * sinIns = NULL; - sin_t * sinInsPrev = NULL; - sinIns = workerrec[iworker].last; - if (sinIns != NULL) - { - dbus_uint32_t in_session_seesionid; - dbus_uint32_t in_session_serviceid_timelow = 0; - dbus_uint32_t in_session_serviceid_timemid = 0; - dbus_uint32_t in_session_serviceid_timehiandver = 0; - dbus_uint32_t in_session_serviceid_clockseqandnode_size = 8; - dbus_uint32_t in_session_serviceid_clockseqandnode[8]; - dbus_uint32_t in_session_opscnt = 0; - dbus_uint64_t in_session_head_next = 0; - dbus_uint64_t in_session_head_prev = 0; - dbus_uint64_t in_session_context; - - dbus_uint32_t seesionid; - dbus_uint32_t serviceid_timelow; - dbus_uint32_t serviceid_timemid; - dbus_uint32_t serviceid_timehiandver; - dbus_uint32_t * serviceid_clockseqandnode; - int serviceid_clockseqandnode_realsize; - dbus_uint32_t opscnt; - dbus_uint64_t head_next; - dbus_uint64_t head_prev; - dbus_uint64_t context; - - for ( ; ; ) - { - in_session_seesionid = sinIns->session_id; - in_session_context = workerrec[iworker].context_addr; - - pthread_mutex_unlock(mutex_workerrec); - - for (int iind = 0; iind < 8; iind++) - { - in_session_serviceid_clockseqandnode[iind] = 0; - } - - uint32_t serviceid_clockseqandnode_outsize_temp; - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (dbus_uint32_t *)malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - - printf("\nMethod call teec closesession. (Called by Proxy before fin context) \n"); - - method_call_teec_closesession( - workername, - - in_session_seesionid, - in_session_serviceid_timelow, - in_session_serviceid_timemid, - in_session_serviceid_timehiandver, - in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_size, - in_session_opscnt, - in_session_head_next, - in_session_head_prev, - in_session_context, - - &seesionid, - &serviceid_timelow, - &serviceid_timemid, - &serviceid_timehiandver, - serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize, - &serviceid_clockseqandnode_outsize_temp, - &opscnt, - &head_next, - &head_prev, - &context - ); - - if (serviceid_clockseqandnode != NULL) { - free(serviceid_clockseqandnode); - } - - pthread_mutex_lock(mutex_workerrec); - - sinInsPrev = sinIns->prev; - free(sinIns); - if (sinInsPrev == NULL) - // if (sinIns == workerrec[iworker].first) - { - // free(sinIns); - break; - } - sinIns = sinInsPrev; - } - } - pthread_mutex_unlock(mutex_workerrec); - - method_call_teec_fincont( - workername, - - in_fd, - in_ta_path, - in_ta_path_size, - in_session_list_next, - in_session_list_prev, - in_shrd_mem_list_next, - in_shrd_mem_list_prev, - in_share_buffer_buffer, - in_share_buffer_buffer_barrier, - in_context_addr, - - &fd, - ta_path, - ta_path_size, - &session_list_next, - &session_list_prev, - &shrd_mem_list_next, - &shrd_mem_list_prev, - &share_buffer_buffer, - &share_buffer_buffer_barrier, - - &context_tapath_outsize - ); - - pthread_mutex_lock(mutex_workerrec); - workerrec[iworker].busy = 0; - pthread_cond_signal(cond_notbusy); - workerrec[iworker].context_fd = 0; - workerrec[iworker].context_addr = 0xffffffff; - workerrec[iworker].sessionid_count = 0; - workerrec[iworker].first = NULL; - workerrec[iworker].last = NULL; - pthread_mutex_unlock(mutex_workerrec); - - if (ta_path_size >= context_tapath_outsize) { - ta_path_size = context_tapath_outsize; - charp = ta_path; - } - else - { - ta_path_size = 0; - charp = NULL; - } - - } // end of else found == 1 - //////////////////////////////////////////////////////////////////////////////////////////////// - -#endif - - // create a reply from the message - reply = dbus_message_new_method_return(msg); - - // add the arguments to the reply - dbus_message_iter_init_append(reply, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &fd - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - // DBusError err; - // initialise the errors - // dbus_error_init(&err); - - if (ta_path_size > 0 && - charp != NULL - // && strlen((const char *) charp) > 0 - ) - { - // if (dbus_validate_utf8((const char *) charp, &err) == true) - if (dbus_validate_path((const char *) charp, &err) == true) - { - ta_path_size = strlen((const char *) charp); - } else - { - ta_path_size = 0; - } - } else - { - ta_path_size = 0; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &ta_path_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - fprintf(stderr, "%s %d: reply fincont, tapath size = %d \n", __FILE__, __LINE__, ta_path_size); - if (ta_path_size > 0) - { - fprintf(stderr, "%s %d: reply fincont, tapath = %s \n", __FILE__, __LINE__, charp); - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &charp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &session_list_next - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &session_list_prev - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &shrd_mem_list_prev - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &shrd_mem_list_next - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &share_buffer_buffer - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT64, - &share_buffer_buffer_barrier - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - // send the reply && flush the connection - serial = 100; - if (!dbus_connection_send(conn, reply, &serial)) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_unref(reply); - dbus_message_unref(msg); - dbus_connection_flush(conn); - // dbus_connection_close(conn); - // dbus_connection_unref(conn); - free(thdfargs); - - // sleep(2); - -#if 0 - #ifdef GP_WORKER - -#else - if (ta_path == NULL) - { - free(ta_path); - } -#endif -#endif - - return NULL; -} - - -void * -reply_to_method_call_teec_opensession( - void *thdfargs -) -{ - DBusMsgConn *DBusMCP; - DBusMessage *msg; - DBusConnection *conn; - DBusMessage *reply; - DBusMessageIter args; - dbus_bool_t bResult; - DBusMessageIter structIter; - DBusMessageIter ArrayIter; - int iType; - unsigned char *charp; - char buf[2]; - buf[0] = DBUS_TYPE_UINT32; - buf[1] = '\0'; - - // char* param = ""; - dbus_int32_t in_fd; - unsigned char *in_ta_path = NULL; - dbus_int32_t in_ta_path_size; - dbus_uint64_t in_session_list_next; - dbus_uint64_t in_session_list_prev; - dbus_uint64_t in_shrd_mem_list_next; - dbus_uint64_t in_shrd_mem_list_prev; - dbus_uint64_t in_share_buffer_buffer; - dbus_int64_t in_share_buffer_buffer_barrier; - dbus_uint32_t teecresult; - dbus_int32_t fd; - - dbus_uint32_t in_destination_timelow; - dbus_uint32_t in_destination_timemid; - dbus_uint32_t in_destination_timehiandver; - - dbus_uint32_t in_connectionmethod; - dbus_uint64_t in_connectiondata; - dbus_uint32_t in_operation_started; - dbus_uint32_t in_operation_paramtypes; - dbus_int32_t in_destination_clockseqandnode_size; - int in_destination_clockseqandnode_realsize; - dbus_uint32_t *in_destination_clockseqandnode; - - dbus_uint64_t in_operation_param1_tmpref_buffer; - dbus_uint32_t in_operation_param1_tmpref_size; - dbus_uint64_t in_operation_param1_memref_parent; - dbus_uint32_t in_operation_param1_memref_size; - dbus_uint32_t in_operation_param1_memref_offset; - dbus_uint32_t in_operation_param1_value_a; - dbus_uint32_t in_operation_param1_value_b; - dbus_int32_t in_operation_param1_ionref_ionsharefd; - dbus_uint32_t in_operation_param1_ionref_ionsize; - - dbus_uint64_t in_operation_param2_tmpref_buffer; - dbus_uint32_t in_operation_param2_tmpref_size; - dbus_uint64_t in_operation_param2_memref_parent; - dbus_uint32_t in_operation_param2_memref_size; - dbus_uint32_t in_operation_param2_memref_offset; - dbus_uint32_t in_operation_param2_value_a; - dbus_uint32_t in_operation_param2_value_b; - dbus_int32_t in_operation_param2_ionref_ionsharefd; - dbus_uint32_t in_operation_param2_ionref_ionsize; - - dbus_uint64_t in_operation_param3_tmpref_buffer; - dbus_uint32_t in_operation_param3_tmpref_size; - dbus_uint64_t in_operation_param3_memref_parent; - dbus_uint32_t in_operation_param3_memref_size; - dbus_uint32_t in_operation_param3_memref_offset; - dbus_uint32_t in_operation_param3_value_a; - dbus_uint32_t in_operation_param3_value_b; - dbus_int32_t in_operation_param3_ionref_ionsharefd; - dbus_uint32_t in_operation_param3_ionref_ionsize; - - dbus_uint64_t in_operation_param4_tmpref_buffer; - dbus_uint32_t in_operation_param4_tmpref_size; - dbus_uint64_t in_operation_param4_memref_parent; - dbus_uint32_t in_operation_param4_memref_size; - dbus_uint32_t in_operation_param4_memref_offset; - dbus_uint32_t in_operation_param4_value_a; - dbus_uint32_t in_operation_param4_value_b; - dbus_int32_t in_operation_param4_ionref_ionsharefd; - dbus_uint32_t in_operation_param4_ionref_ionsize; - - dbus_uint64_t in_operation_session; - dbus_int32_t in_operation_cancelflag; - dbus_uint32_t in_returnorigin; - - dbus_uint64_t in_context_addr; - - // unsigned char ta_path[] = "/vendor/bin/rsa_demo_ta"; - // dbus_int32_t ta_path_size = strlen((const char *)ta_path); - unsigned char *ta_path; - dbus_int32_t ta_path_size; - dbus_uint64_t session_list_next; - dbus_uint64_t session_list_prev; - dbus_uint64_t shrd_mem_list_next; - dbus_uint64_t shrd_mem_list_prev; - dbus_uint64_t share_buffer_buffer; - dbus_int64_t share_buffer_buffer_barrier; - - dbus_uint32_t seesionid; - dbus_uint32_t serviceid_timelow; - dbus_uint32_t serviceid_timemid; - dbus_uint32_t serviceid_timehiandver; - dbus_uint32_t *serviceid_clockseqandnode; - int serviceid_clockseqandnode_realsize; - dbus_int32_t serviceid_clockseqandnode_outsize; - dbus_uint32_t opscnt; - dbus_uint64_t head_next; - dbus_uint64_t head_prev; - dbus_uint64_t context; - - dbus_uint32_t started; - dbus_uint32_t paramtypes; - - dbus_uint64_t operation_param1_tmpref_buffer; - dbus_uint32_t operation_param1_tmpref_size; - dbus_uint64_t operation_param1_memref_parent; - dbus_uint32_t operation_param1_memref_size; - dbus_uint32_t operation_param1_memref_offset; - dbus_uint32_t operation_param1_value_a; - dbus_uint32_t operation_param1_value_b; - dbus_int32_t operation_param1_ionref_ionsharefd; - dbus_uint32_t operation_param1_ionref_ionsize; - - dbus_uint64_t operation_param2_tmpref_buffer; - dbus_uint32_t operation_param2_tmpref_size; - dbus_uint64_t operation_param2_memref_parent; - dbus_uint32_t operation_param2_memref_size; - dbus_uint32_t operation_param2_memref_offset; - dbus_uint32_t operation_param2_value_a; - dbus_uint32_t operation_param2_value_b; - dbus_int32_t operation_param2_ionref_ionsharefd; - dbus_uint32_t operation_param2_ionref_ionsize; - - dbus_uint64_t operation_param3_tmpref_buffer; - dbus_uint32_t operation_param3_tmpref_size; - dbus_uint64_t operation_param3_memref_parent; - dbus_uint32_t operation_param3_memref_size; - dbus_uint32_t operation_param3_memref_offset; - dbus_uint32_t operation_param3_value_a; - dbus_uint32_t operation_param3_value_b; - dbus_int32_t operation_param3_ionref_ionsharefd; - dbus_uint32_t operation_param3_ionref_ionsize; - - dbus_uint64_t operation_param4_tmpref_buffer; - dbus_uint32_t operation_param4_tmpref_size; - dbus_uint64_t operation_param4_memref_parent; - dbus_uint32_t operation_param4_memref_size; - dbus_uint32_t operation_param4_memref_offset; - dbus_uint32_t operation_param4_value_a; - dbus_uint32_t operation_param4_value_b; - dbus_int32_t operation_param4_ionref_ionsharefd; - dbus_uint32_t operation_param4_ionref_ionsize; - - dbus_uint64_t operation_session; - dbus_int32_t operation_cancelflag; - dbus_uint32_t returnorigin; - dbus_uint32_t serial = 0; - -#ifdef GP_PROXY - pthread_mutex_t * mutex_workerrec; - wr_t * workerrec; -#endif - -#ifdef GP_WORKER - pthread_mutex_t *mutex_tcl; - pthread_mutex_t *mutex_tsl; - tcl_t *tcl; - tsl_t *tsl; -#endif - - DBusMCP = (DBusMsgConn *) thdfargs; - msg = DBusMCP->msg; - conn = DBusMCP->conn; -#ifdef GP_PROXY - mutex_workerrec = DBusMCP->mutex_workerrec; - workerrec = DBusMCP->workerrec; -#endif -#ifdef GP_WORKER - mutex_tcl = DBusMCP->mutex_tcl; - mutex_tsl = DBusMCP->mutex_tsl; - tcl = DBusMCP->tcl; - tsl = DBusMCP->tsl; -#endif - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_get_basic( - &structIter, - &in_fd); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_ta_path_size - ); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - // fprintf(stderr, "Debug in_ta_path_size = %d \n", in_ta_path_size); - if (in_ta_path_size > 0) - { - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_STRING - ) - { - fprintf(stderr, "Argument is not STRING.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_ta_path); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_list_next); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_list_prev); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_shrd_mem_list_next); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_shrd_mem_list_prev); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_share_buffer_buffer); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT64 - ) - { - fprintf(stderr, "Argument is not INT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_share_buffer_buffer_barrier); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_destination_timelow); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_destination_timemid); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_destination_timehiandver); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_destination_clockseqandnode_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (in_destination_clockseqandnode_size > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &in_destination_clockseqandnode, - &in_destination_clockseqandnode_realsize - ); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_get_basic( - &structIter, - &in_connectionmethod); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_connectiondata); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_started); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_paramtypes); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_tmpref_buffer); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_tmpref_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_memref_parent); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_memref_size); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_memref_offset); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_value_a); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_value_b); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_ionref_ionsharefd); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_ionref_ionsize); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_tmpref_buffer); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_tmpref_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_memref_parent); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_memref_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_memref_offset); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_value_a); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_value_b); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_ionref_ionsharefd); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_ionref_ionsize); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_tmpref_buffer); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_tmpref_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_memref_parent); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_memref_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_memref_offset); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_value_a); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_value_b); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_ionref_ionsharefd); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_ionref_ionsize); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_tmpref_buffer); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_tmpref_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_memref_parent); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_memref_size); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_memref_offset); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_value_a); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_value_b); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_ionref_ionsharefd); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_ionref_ionsize); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_session); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_cancelflag); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_returnorigin); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_context_addr); - - printf("Received method call Teec Open Session: \n"); - printf(" in_fd = 0x %8.8x \n", in_fd); - printf(" in_ta_path = %s \n", in_ta_path); - printf(" in_ta_path_size = %d \n", in_ta_path_size); -#if 0 - printf(" in_session_list_next = 0x %16.16lx \n", in_session_list_next); - printf(" in_session_list_prev = 0x %16.16lx \n", in_session_list_prev); - printf(" in_shrd_mem_list_next = 0x %16.16lx \n", in_shrd_mem_list_next); - printf(" in_shrd_mem_list_prev = 0x %16.16lx \n", in_shrd_mem_list_prev); - printf(" in_share_buffer_buffer = 0x %16.16lx \n", in_share_buffer_buffer); - printf(" in_share_buffer_buffer_barrier = 0x %16.16lx \n", in_share_buffer_buffer_barrier); - - printf(" in_destination_timelow = 0x %8.8x \n", in_destination_timelow); - printf(" in_destination_timemid = 0x %8.8x \n", in_destination_timemid); - printf(" in_destination_timehiandver = 0x %8.8x \n", in_destination_timehiandver); - if ( in_destination_clockseqandnode_realsize > 0 ) - { - printf(" in_destination_clockseqandnode = \n"); - printf(" "); - for (int i = 0; i < in_destination_clockseqandnode_realsize; i++) { - printf(" %8.8x", in_destination_clockseqandnode[i]); - } - printf("\n"); - } - else - { - printf(" in_destination_clockseqandnode addr = 0x %16.16lx \n", - (long unsigned int)in_destination_clockseqandnode - ); - } - printf(" in_destination_clockseqandnode_size = 0x %8.8x \n", in_destination_clockseqandnode_size); - - printf(" in_connectionmethod = 0x %8.8x \n", in_connectionmethod); - printf(" in_connectiondata = 0x %16.16lx \n", in_connectiondata); - - printf(" in_operation_started = 0x %8.8x \n", in_operation_started); - printf(" in_operation_paramtypes = 0x %8.8x \n", in_operation_paramtypes); - - printf(" in_operation_param1_tmpref_buffer = 0x %16.16lx \n", in_operation_param1_tmpref_buffer); - printf(" in_operation_param1_tmpref_size = 0x %8.8x \n", in_operation_param1_tmpref_size); - printf(" in_operation_param1_memref_parent = 0x %16.16lx \n", in_operation_param1_memref_parent); - printf(" in_operation_param1_memref_size = 0x %8.8x \n", in_operation_param1_memref_size); - printf(" in_operation_param1_memref_offset = 0x %8.8x \n", in_operation_param1_memref_offset); - printf(" in_operation_param1_value_a = 0x %8.8x \n", in_operation_param1_value_a); - printf(" in_operation_param1_value_b = 0x %8.8x \n", in_operation_param1_value_b); - printf(" in_operation_param1_ionref_ionsharefd = 0x %8.8x \n", - in_operation_param1_ionref_ionsharefd); - printf(" in_operation_param1_ionref_ionsize = 0x %8.8x \n", in_operation_param1_ionref_ionsize); - - printf(" in_operation_param2_tmpref_buffer = 0x %16.16lx \n", in_operation_param2_tmpref_buffer); - printf(" in_operation_param2_tmpref_size = 0x %8.8x \n", in_operation_param2_tmpref_size); - printf(" in_operation_param2_memref_parent = 0x %16.16lx \n", in_operation_param2_memref_parent); - printf(" in_operation_param2_memref_size = 0x %8.8x \n", in_operation_param2_memref_size); - printf(" in_operation_param2_memref_offset = 0x %8.8x \n", in_operation_param2_memref_offset); - printf(" in_operation_param2_value_a = 0x %8.8x \n", in_operation_param3_value_a); - printf(" in_operation_param2_value_b = 0x %8.8x \n", in_operation_param3_value_b); - printf(" in_operation_param2_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); - printf(" in_operation_param2_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); - - printf(" in_operation_param3_tmpref_buffer = 0x %16.16lx \n", in_operation_param3_tmpref_buffer); - printf(" in_operation_param3_tmpref_size = 0x %8.8x \n", in_operation_param3_tmpref_size); - printf(" in_operation_param3_memref_parent = 0x %16.16lx \n", in_operation_param3_memref_parent); - printf(" in_operation_param3_memref_size = 0x %8.8x \n", in_operation_param3_memref_size); - printf(" in_operation_param3_memref_offset = 0x %8.8x \n", in_operation_param3_memref_offset); - printf(" in_operation_param3_value_a = 0x %8.8x \n", in_operation_param3_value_a); - printf(" in_operation_param3_value_b = 0x %8.8x \n", in_operation_param3_value_b); - printf(" in_operation_param3_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); - printf(" in_operation_param3_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); - - printf(" in_operation_param4_tmpref_buffer = 0x %16.16lx \n", in_operation_param4_tmpref_buffer); - printf(" in_operation_param4_tmpref_size = 0x %8.8x \n", in_operation_param4_tmpref_size); - printf(" in_operation_param4_memref_parent = 0x %16.16lx \n", in_operation_param4_memref_parent); - printf(" in_operation_param4_memref_size = 0x %8.8x \n", in_operation_param4_memref_size); - printf(" in_operation_param4_memref_offset = 0x %8.8x \n", in_operation_param4_memref_offset); - printf(" in_operation_param4_value_a = 0x %8.8x \n", in_operation_param4_value_a); - printf(" in_operation_param4_value_b = 0x %8.8x \n", in_operation_param4_value_b); - printf(" in_operation_param4_ionref_ionsharefd = 0x %8.8x \n", in_operation_param4_ionref_ionsharefd); - printf(" in_operation_param4_ionref_ionsize = 0x %8.8x \n", in_operation_param4_ionref_ionsize); - - printf(" in_operation_session = 0x %16.16lx \n", in_operation_session); - printf(" in_operation_cancelflag = 0x %8.8x \n", in_operation_cancelflag); - - printf(" in_returnorigin = 0x %8.8x \n", in_returnorigin); -#endif - printf(" in_context_addr = 0x %16.16lx \n", in_context_addr); - -#ifdef GP_WORKER - //////////////////////////////////////////////////////////////////////////////////////////////// - - TEEC_Context *contextIns; - tcn_t *tcnIns; - - TEEC_UUID destinationIns; - void *in_connectiondata_temp; - TEEC_Operation operationIns; - uint32_t origin; - TEEC_Result result; - - contextIns = NULL; - pthread_mutex_lock(mutex_tcl); - if (tcl->first != NULL) - { - tcnIns = tcl->first; - do - { - if (tcnIns->self->fd == in_fd) - { - contextIns = tcnIns->self; - break; - } - tcnIns = tcnIns->next; - } while (tcnIns != NULL); - } - pthread_mutex_unlock(mutex_tcl); - - if (contextIns == NULL) - { - if (tcl->first == NULL) - { - printf("The teec context list is null. \n"); - teecresult = TEEC_ERROR_CONTEXT_LIST_NULL; - } else - { - printf("Can't find the teec context. \n"); - teecresult = TEEC_ERROR_NO_CONTEXT_MATCH; - } - - fd = 0; - ta_path_size = 0; - ta_path = NULL; - charp = ta_path; - session_list_next = 0; - session_list_prev = 0; - shrd_mem_list_next = 0; - shrd_mem_list_prev = 0; - share_buffer_buffer = 0; - share_buffer_buffer_barrier = 0; - - seesionid = 0; - serviceid_timelow = 0; - serviceid_timemid = 0; - serviceid_timehiandver = 0; - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode = NULL; - serviceid_clockseqandnode_outsize = 0; - opscnt = 0; - head_next = 0; - head_prev = 0; - context = 0; - - started = 0; - paramtypes = 0; - - operation_param1_tmpref_buffer = 0; - operation_param1_tmpref_size = 0; - operation_param1_memref_parent = 0; - operation_param1_memref_size = 0; - operation_param1_memref_offset = 0; - operation_param1_value_a = 0; - operation_param1_value_b = 0; - operation_param1_ionref_ionsharefd = 0; - operation_param1_ionref_ionsize = 0; - - operation_param2_tmpref_buffer = 0; - operation_param2_tmpref_size = 0; - operation_param2_memref_parent = 0; - operation_param2_memref_size = 0; - operation_param2_memref_offset = 0; - operation_param2_value_a = 0; - operation_param2_value_b = 0; - operation_param2_ionref_ionsharefd = 0; - operation_param2_ionref_ionsize = 0; - - operation_param3_tmpref_buffer = 0; - operation_param3_tmpref_size = 0; - operation_param3_memref_parent = 0; - operation_param3_memref_size = 0; - operation_param3_memref_offset = 0; - operation_param3_value_a = 0; - operation_param3_value_b = 0; - operation_param3_ionref_ionsharefd = 0; - operation_param3_ionref_ionsize = 0; - - operation_param4_tmpref_buffer = 0; - operation_param4_tmpref_size = 0; - operation_param4_memref_parent = 0; - operation_param4_memref_size = 0; - operation_param4_memref_offset = 0; - operation_param4_value_a = 0; - operation_param4_value_b = 0; - operation_param4_ionref_ionsharefd = 0; - operation_param4_ionref_ionsize = 0; - - operation_session = 0; - operation_cancelflag = 0; - - returnorigin = 0; - } else - { - TEEC_Session *sessionIns = (TEEC_Session *) malloc(sizeof(TEEC_Session)); - - // contextIns->fd = in_fd; - contextIns->ta_path = in_ta_path; - // typedef struct { - // volatile int __val[4*sizeof(long)/sizeof(int)]; - // } sem_t; - // - // typedef union - // { - // char __size[__SIZEOF_SEM_T]; - // long long int __align; - // } sem_t; - - destinationIns.timeLow = in_destination_timelow; - destinationIns.timeMid = in_destination_timemid; - destinationIns.timeHiAndVersion = in_destination_timehiandver; - for (int i = 0; - i < in_destination_clockseqandnode_size; - i++) - { - destinationIns.clockSeqAndNode[i] = in_destination_clockseqandnode[i]; - } - - in_connectiondata_temp = (void *) in_connectiondata; - // in_connectiondata_temp = NULL; - - - memset(&operationIns, 0, sizeof(operationIns)); - operationIns.started = in_operation_started; - operationIns.paramTypes = in_operation_paramtypes; - - origin = in_returnorigin; - - struct timeval start, end; - gettimeofday(&start, NULL); - result = - TEEC_OpenSession( - contextIns, - sessionIns, - &destinationIns, - in_connectionmethod, - in_connectiondata_temp, // NULL - &operationIns, - &origin - ); - gettimeofday(&end, NULL); - uint32_t cost = 0; - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - if (result != TEEC_SUCCESS) - { - printf("Teec OpenSession Failed. \n"); - printf(" teecresult = 0x %8.8x.\n", result); - - teecresult = result; - - fd = 0; - ta_path_size = 0; - ta_path = NULL; - charp = ta_path; - session_list_next = 0; - session_list_prev = 0; - shrd_mem_list_next = 0; - shrd_mem_list_prev = 0; - share_buffer_buffer = 0; - share_buffer_buffer_barrier = 0; - - seesionid = 0; - serviceid_timelow = 0; - serviceid_timemid = 0; - serviceid_timehiandver = 0; - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode = NULL; - serviceid_clockseqandnode_outsize = 0; - opscnt = 0; - head_next = 0; - head_prev = 0; - context = 0; - - started = 0; - paramtypes = 0; - - operation_param1_tmpref_buffer = 0; - operation_param1_tmpref_size = 0; - operation_param1_memref_parent = 0; - operation_param1_memref_size = 0; - operation_param1_memref_offset = 0; - operation_param1_value_a = 0; - operation_param1_value_b = 0; - operation_param1_ionref_ionsharefd = 0; - operation_param1_ionref_ionsize = 0; - - operation_param2_tmpref_buffer = 0; - operation_param2_tmpref_size = 0; - operation_param2_memref_parent = 0; - operation_param2_memref_size = 0; - operation_param2_memref_offset = 0; - operation_param2_value_a = 0; - operation_param2_value_b = 0; - operation_param2_ionref_ionsharefd = 0; - operation_param2_ionref_ionsize = 0; - - operation_param3_tmpref_buffer = 0; - operation_param3_tmpref_size = 0; - operation_param3_memref_parent = 0; - operation_param3_memref_size = 0; - operation_param3_memref_offset = 0; - operation_param3_value_a = 0; - operation_param3_value_b = 0; - operation_param3_ionref_ionsharefd = 0; - operation_param3_ionref_ionsize = 0; - - operation_param4_tmpref_buffer = 0; - operation_param4_tmpref_size = 0; - operation_param4_memref_parent = 0; - operation_param4_memref_size = 0; - operation_param4_memref_offset = 0; - operation_param4_value_a = 0; - operation_param4_value_b = 0; - operation_param4_ionref_ionsharefd = 0; - operation_param4_ionref_ionsize = 0; - - operation_session = 0; - operation_cancelflag = 0; - - returnorigin = 0; - } else - { - printf("Teec OpenSession Succed, cost time: %ld us \n", cost); - - tsn_t *tsnIns = (tsn_t *) malloc(sizeof(tsn_t)); - tsnIns->self = sessionIns; - struct timeval tvcreate; - gettimeofday(&tvcreate, NULL); - tsnIns->createtime = tvcreate; - pthread_mutex_lock(mutex_tsl); - if (tsl->first == NULL) - { - tsnIns->next = NULL; - tsnIns->prev = NULL; - tsl->first = tsnIns; - tsl->last = tsnIns; - tsl->count = 1; - } else - { - tsnIns->prev = tsl->last; - tsnIns->next = NULL; - tsl->last->next = tsnIns; - tsl->last = tsnIns; - tsl->count = tsl->count + 1; - } - pthread_mutex_unlock(mutex_tsl); - - teecresult = result; - - fd = contextIns->fd; - if (contextIns->ta_path != NULL) - { - ta_path_size = strlen((const char *) contextIns->ta_path); - } else - { - ta_path_size = 0; - } - ta_path = contextIns->ta_path; - charp = ta_path; - session_list_next = (dbus_uint64_t) contextIns->session_list.next; - session_list_prev = (dbus_uint64_t) contextIns->session_list.prev; - shrd_mem_list_next = (dbus_uint64_t) contextIns->shrd_mem_list.next; - shrd_mem_list_prev = (dbus_uint64_t) contextIns->shrd_mem_list.prev; - share_buffer_buffer = (dbus_uint64_t) contextIns->share_buffer.buffer; - share_buffer_buffer_barrier = contextIns->share_buffer.buffer_barrier.__align; - - seesionid = sessionIns->session_id; - serviceid_timelow = sessionIns->service_id.timeLow; - serviceid_timemid = sessionIns->service_id.timeMid; - serviceid_timehiandver = sessionIns->service_id.timeHiAndVersion; - if (sessionIns->service_id.clockSeqAndNode != NULL) - { - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (dbus_uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - for (int iind = 0; iind < 8; iind++) - { - uint8_t u8Temp; - u8Temp = sessionIns->service_id.clockSeqAndNode[iind]; - serviceid_clockseqandnode[iind] = (dbus_uint32_t) u8Temp; - } - serviceid_clockseqandnode_outsize = 8; - } else - { - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode = NULL; - serviceid_clockseqandnode_outsize = 0; - } - opscnt = sessionIns->ops_cnt; - head_next = (dbus_uint64_t) sessionIns->head.next; - head_prev = (dbus_uint64_t) sessionIns->head.prev; - context = (dbus_uint64_t) sessionIns->context; - - started = operationIns.started; - paramtypes = operationIns.paramTypes; - - operation_param1_tmpref_buffer = (dbus_uint64_t) operationIns.params[0].tmpref.buffer; - operation_param1_tmpref_size = operationIns.params[0].tmpref.size; - operation_param1_memref_parent = (dbus_uint64_t) operationIns.params[0].memref.parent; - operation_param1_memref_size = operationIns.params[0].memref.size; - operation_param1_memref_offset = operationIns.params[0].memref.offset; - operation_param1_value_a = operationIns.params[0].value.a; - operation_param1_value_b = operationIns.params[0].value.b; - operation_param1_ionref_ionsharefd = operationIns.params[0].ionref.ion_share_fd; - operation_param1_ionref_ionsize = operationIns.params[0].ionref.ion_size; - - operation_param2_tmpref_buffer = (dbus_uint64_t) operationIns.params[1].tmpref.buffer; - operation_param2_tmpref_size = operationIns.params[1].tmpref.size; - operation_param2_memref_parent = (dbus_uint64_t) operationIns.params[1].memref.parent; - operation_param2_memref_size = operationIns.params[1].memref.size; - operation_param2_memref_offset = operationIns.params[1].memref.offset; - operation_param2_value_a = operationIns.params[1].value.a; - operation_param2_value_b = operationIns.params[1].value.b; - operation_param2_ionref_ionsharefd = operationIns.params[1].ionref.ion_share_fd; - operation_param2_ionref_ionsize = operationIns.params[1].ionref.ion_size; - - operation_param3_tmpref_buffer = (dbus_uint64_t) operationIns.params[2].tmpref.buffer; - operation_param3_tmpref_size = operationIns.params[2].tmpref.size; - operation_param3_memref_parent = (dbus_uint64_t) operationIns.params[2].memref.parent; - operation_param3_memref_size = operationIns.params[2].memref.size; - operation_param3_memref_offset = operationIns.params[2].memref.offset; - operation_param3_value_a = operationIns.params[2].value.a; - operation_param3_value_b = operationIns.params[2].value.b; - operation_param3_ionref_ionsharefd = operationIns.params[2].ionref.ion_share_fd; - operation_param3_ionref_ionsize = operationIns.params[2].ionref.ion_size; - - operation_param4_tmpref_buffer = (dbus_uint64_t) operationIns.params[3].tmpref.buffer; - operation_param4_tmpref_size = operationIns.params[3].tmpref.size; - operation_param4_memref_parent = (dbus_uint64_t) operationIns.params[3].memref.parent; - operation_param4_memref_size = operationIns.params[3].memref.size; - operation_param4_memref_offset = operationIns.params[3].memref.offset; - operation_param4_value_a = operationIns.params[3].value.a; - operation_param4_value_b = operationIns.params[3].value.b; - operation_param4_ionref_ionsharefd = operationIns.params[3].ionref.ion_share_fd; - operation_param4_ionref_ionsize = operationIns.params[3].ionref.ion_size; - - operation_session = (dbus_uint64_t) operationIns.session; - operation_cancelflag = operationIns.cancel_flag; - - returnorigin = origin; - - printf(" ret sessionid = 0x %8.8x \n", seesionid); - printf(" ret context = 0x %16.16lx \n", context); - -#if 0 - printf("Call TEEC_CloseSession inputs: \n"); - printf(" session_seesionid = 0x %8.8x \n", sessionIns->session_id); - printf(" session_serviceid_timelow = 0x %8.8x \n", sessionIns->service_id.timeLow); - printf(" session_serviceid_timemid = 0x %4.4x \n", sessionIns->service_id.timeMid); - printf(" session_serviceid_timehiandver = 0x %4.4x \n", - sessionIns->service_id.timeHiAndVersion); - printf(" session_serviceid_clockseqandnode = \n"); - printf(" "); - for (int i = 0; i < 8; i++) { - printf(" %2.2x", sessionIns->service_id.clockSeqAndNode[i]); - } - printf("\n"); - printf(" session_opscnt = 0x %8.8x \n", sessionIns->ops_cnt); - printf(" session_head_next = 0x %16.16lx \n", sessionIns->head.next); - printf(" session_head_prev = 0x %16.16lx \n", sessionIns->head.prev); - printf(" session_context = 0x %16.16lx \n", sessionIns->context); - - // TEEC_CloseSession(sessionIns); - // printf("Teec CloseSession. \n"); -#endif - } - } - //////////////////////////////////////////////////////////////////////////////////////////////// -#else - ta_path = (unsigned char *)malloc(1024 * sizeof(char)); - ta_path_size = 1024; - memset((char *)ta_path, 0, 1024); - uint32_t context_tapath_outsize; - uint32_t serviceid_clockseqandnode_outsize_temp; - uint32_t returnorigin_temp; - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (dbus_uint32_t *)malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - - char workername[1024]; - memset((char *)workername, 0, 1024); - int ifound = 0; - int iworker; - - pthread_mutex_lock(mutex_workerrec); - for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) - { - if (workerrec[iworker].context_fd == in_fd && - workerrec[iworker].context_addr == in_context_addr - ) - { - sprintf(workername, "%s%d", "gpworker", iworker); - ifound = 1; - break; - } - } - pthread_mutex_unlock(mutex_workerrec); - - if (ifound == 0) - { - printf("Can't find the woker for the context. \n"); - - teecresult = 0xAAAA0017; - - fd = 0x0; - ta_path = NULL; - charp = ta_path; - session_list_next = 0x0; - session_list_prev = 0x0; - shrd_mem_list_next = 0x0; - shrd_mem_list_prev = 0x0; - share_buffer_buffer = 0; - share_buffer_buffer_barrier = 0x0; - - seesionid = 0x0; - serviceid_timelow = 0x0; - serviceid_timemid = 0x0; - serviceid_timehiandver = 0x0; - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode = - (dbus_uint32_t *)malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - for (int i = 0; i < serviceid_clockseqandnode_realsize ; i++) { - serviceid_clockseqandnode[i] = 0x0; - } - serviceid_clockseqandnode_outsize = 0; - opscnt = 0x0; - head_next = 0x0; - head_prev = 0x0; - context = 0x0; - - started = 0x0; - paramtypes = 0x0; - - operation_param1_tmpref_buffer = 0x0; - operation_param1_tmpref_size = 0x0; - operation_param1_memref_parent = 0x0; - operation_param1_memref_size = 0x0; - operation_param1_memref_offset = 0x0; - operation_param1_value_a = 0x0; - operation_param1_value_b = 0x0; - operation_param1_ionref_ionsharefd = 0x0; - operation_param1_ionref_ionsize = 0x0; - - operation_param2_tmpref_buffer = 0x0; - operation_param2_tmpref_size = 0x0; - operation_param2_memref_parent = 0x0; - operation_param2_memref_size = 0x0; - operation_param2_memref_offset = 0x0; - operation_param2_value_a = 0x0; - operation_param2_value_b = 0x0; - operation_param2_ionref_ionsharefd = 0x0; - operation_param2_ionref_ionsize = 0x0; - - operation_param3_tmpref_buffer = 0x0; - operation_param3_tmpref_size = 0x0; - operation_param3_memref_parent = 0x0; - operation_param3_memref_size = 0x0; - operation_param3_memref_offset = 0x0; - operation_param3_value_a = 0x0; - operation_param3_value_b = 0x0; - operation_param3_ionref_ionsharefd = 0x0; - operation_param3_ionref_ionsize = 0x0; - - operation_param4_tmpref_buffer = 0x0; - operation_param4_tmpref_size = 0x0; - operation_param4_memref_parent = 0x0; - operation_param4_memref_size = 0x0; - operation_param4_memref_offset = 0x0; - operation_param4_value_a = 0x0; - operation_param4_value_b = 0x0; - operation_param4_ionref_ionsharefd = 0x0; - operation_param4_ionref_ionsize = 0x0; - - operation_session = 0x0; - operation_cancelflag = 0x0; - - returnorigin = 0x0; - } - else - { - method_call_teec_opensession( - workername, - - in_fd, - in_ta_path, - in_ta_path_size, - in_session_list_next, - in_session_list_prev, - in_shrd_mem_list_next, - in_shrd_mem_list_prev, - in_share_buffer_buffer, - in_share_buffer_buffer_barrier, - - in_destination_timelow, - in_destination_timemid, - in_destination_timehiandver, - in_destination_clockseqandnode, - in_destination_clockseqandnode_realsize, - - in_connectionmethod, - in_connectiondata, - - in_operation_started, - in_operation_paramtypes, - - in_operation_param1_tmpref_buffer, - in_operation_param1_tmpref_size, - in_operation_param1_memref_parent, - in_operation_param1_memref_size, - in_operation_param1_memref_offset, - in_operation_param1_value_a, - in_operation_param1_value_b, - in_operation_param1_ionref_ionsharefd, - in_operation_param1_ionref_ionsize, - - in_operation_param2_tmpref_buffer, - in_operation_param2_tmpref_size, - in_operation_param2_memref_parent, - in_operation_param2_memref_size, - in_operation_param2_memref_offset, - in_operation_param2_value_a, - in_operation_param2_value_b, - in_operation_param2_ionref_ionsharefd, - in_operation_param2_ionref_ionsize, - - in_operation_param3_tmpref_buffer, - in_operation_param3_tmpref_size, - in_operation_param3_memref_parent, - in_operation_param3_memref_size, - in_operation_param3_memref_offset, - in_operation_param3_value_a, - in_operation_param3_value_b, - in_operation_param3_ionref_ionsharefd, - in_operation_param3_ionref_ionsize, - - in_operation_param4_tmpref_buffer, - in_operation_param4_tmpref_size, - in_operation_param4_memref_parent, - in_operation_param4_memref_size, - in_operation_param4_memref_offset, - in_operation_param4_value_a, - in_operation_param4_value_b, - in_operation_param4_ionref_ionsharefd, - in_operation_param4_ionref_ionsize, - - in_operation_session, - in_operation_cancelflag, - - in_returnorigin, - - in_context_addr, - - - &teecresult, - - &fd, - ta_path, - ta_path_size, - &context_tapath_outsize, - &session_list_next, - &session_list_prev, - &shrd_mem_list_next, - &shrd_mem_list_prev, - &share_buffer_buffer, - &share_buffer_buffer_barrier, - - &seesionid, - &serviceid_timelow, - &serviceid_timemid, - &serviceid_timehiandver, - serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize, - &serviceid_clockseqandnode_outsize_temp, - &opscnt, - &head_next, - &head_prev, - &context, - - &started, - ¶mtypes, - - &operation_param1_tmpref_buffer, - &operation_param1_tmpref_size, - &operation_param1_memref_parent, - &operation_param1_memref_size, - &operation_param1_memref_offset, - &operation_param1_value_a, - &operation_param1_value_b, - &operation_param1_ionref_ionsharefd, - &operation_param1_ionref_ionsize, - - &operation_param2_tmpref_buffer, - &operation_param2_tmpref_size, - &operation_param2_memref_parent, - &operation_param2_memref_size, - &operation_param2_memref_offset, - &operation_param2_value_a, - &operation_param2_value_b, - &operation_param2_ionref_ionsharefd, - &operation_param2_ionref_ionsize, - - &operation_param3_tmpref_buffer, - &operation_param3_tmpref_size, - &operation_param3_memref_parent, - &operation_param3_memref_size, - &operation_param3_memref_offset, - &operation_param3_value_a, - &operation_param3_value_b, - &operation_param3_ionref_ionsharefd, - &operation_param3_ionref_ionsize, - - &operation_param4_tmpref_buffer, - &operation_param4_tmpref_size, - &operation_param4_memref_parent, - &operation_param4_memref_size, - &operation_param4_memref_offset, - &operation_param4_value_a, - &operation_param4_value_b, - &operation_param4_ionref_ionsharefd, - &operation_param4_ionref_ionsize, - - &operation_session, - &operation_cancelflag, - - &returnorigin_temp - ); - - if (teecresult == 0) { - pthread_mutex_lock(mutex_workerrec); - - sin_t * sinIns = (sin_t *)malloc(sizeof(sin_t)); - sinIns->session_id = seesionid; - struct timeval tvcreate; - gettimeofday(&tvcreate, NULL); - sinIns->session_createtime = tvcreate; - if (workerrec[iworker].first == NULL) - { - sinIns->next = NULL; - sinIns->prev = NULL; - workerrec[iworker].first = sinIns; - workerrec[iworker].last = sinIns; - workerrec[iworker].sessionid_count = 1; - } - else - { - sinIns->prev = workerrec[iworker].last; - sinIns->next = NULL; - workerrec[iworker].last->next = sinIns; - workerrec[iworker].last = sinIns; - workerrec[iworker].sessionid_count = - workerrec[iworker].sessionid_count + 1; - } - pthread_mutex_unlock(mutex_workerrec); - } - - serviceid_clockseqandnode_outsize = - serviceid_clockseqandnode_outsize_temp; - returnorigin = returnorigin_temp; - - if (ta_path_size >= context_tapath_outsize) { - ta_path_size = context_tapath_outsize; - charp = ta_path; - } - else - { - ta_path_size = 0; - charp = NULL; - } - - if ( - serviceid_clockseqandnode_realsize >= serviceid_clockseqandnode_outsize && - 8 >= serviceid_clockseqandnode_outsize - ) - { - serviceid_clockseqandnode_realsize = serviceid_clockseqandnode_outsize; - } - else - { - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode_outsize = 0; - } - - } // end of else found == 1 - - //////////////////////////////////////////////////////////////////////////////////////////////// -#endif - - - // create a reply from the message - reply = dbus_message_new_method_return(msg); - - // add the arguments to the reply - dbus_message_iter_init_append(reply, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &teecresult - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &fd - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - DBusError err; - // initialise the errors - dbus_error_init(&err); - - if (ta_path_size > 0 && - charp != NULL && - strlen((const char *) charp) > 0 - ) - { - if (dbus_validate_utf8((const char *) charp, &err) == true) - { - ta_path_size = strlen((const char *) charp); - } else - { - ta_path_size = 0; - } - } else - { - ta_path_size = 0; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &ta_path_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (ta_path_size > 0) - { - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &charp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &session_list_next - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &session_list_prev - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &shrd_mem_list_prev - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &shrd_mem_list_next - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &share_buffer_buffer - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT64, - &share_buffer_buffer_barrier - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &seesionid - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_timelow - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_timemid - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_timehiandver - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_clockseqandnode_outsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (serviceid_clockseqandnode_outsize > 0 && - serviceid_clockseqandnode != NULL - ) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize - ); - - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return NULL; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &opscnt - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &head_next - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &head_prev - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &context - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &started - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - ¶mtypes - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param1_tmpref_buffer - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_tmpref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param1_memref_parent - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_memref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_memref_offset - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_value_a - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_value_b - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &operation_param1_ionref_ionsharefd - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_ionref_ionsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param2_tmpref_buffer - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_tmpref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param2_memref_parent - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_memref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_memref_offset - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_value_a - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_value_b - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &operation_param2_ionref_ionsharefd - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_ionref_ionsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param3_tmpref_buffer - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_tmpref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param3_memref_parent - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_memref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_memref_offset - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_value_a - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_value_b - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &operation_param3_ionref_ionsharefd - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_ionref_ionsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param4_tmpref_buffer - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_tmpref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param4_memref_parent - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_memref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_memref_offset - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_value_a - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_value_b - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &operation_param4_ionref_ionsharefd - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_ionref_ionsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_session - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &operation_cancelflag - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &returnorigin - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - // send the reply && flush the connection - serial = 100; - if (!dbus_connection_send(conn, reply, &serial)) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - // dbus_connection_close(conn); - // dbus_connection_unref(conn); - free(thdfargs); - - // sleep(2); - -#if 0 - #ifdef GP_WORKER - -#else - if (ta_path == NULL) - { - free(ta_path); - } - if (serviceid_clockseqandnode == NULL) - { - free(serviceid_clockseqandnode); - } -#endif -#endif - - return NULL; -} - - -void * -reply_to_method_call_teec_closesession( - void *thdfargs -) -{ - DBusMsgConn *DBusMCP; - DBusMessage *msg; - DBusConnection *conn; - DBusMessage *reply; - DBusMessageIter args; - dbus_bool_t bResult; - DBusMessageIter structIter; - DBusMessageIter ArrayIter; - int iType; - char buf[2]; - buf[0] = DBUS_TYPE_UINT32; - buf[1] = '\0'; - - dbus_uint32_t in_session_seesionid; - dbus_uint32_t in_session_serviceid_timelow; - dbus_uint32_t in_session_serviceid_timemid; - dbus_uint32_t in_session_serviceid_timehiandver; - dbus_uint32_t in_session_serviceid_clockseqandnode_size; - dbus_uint32_t *in_session_serviceid_clockseqandnode; - int in_session_serviceid_clockseqandnode_realsize; - dbus_uint32_t in_session_opscnt; - dbus_uint64_t in_session_head_next; - dbus_uint64_t in_session_head_prev; - dbus_uint64_t in_session_context; - - dbus_uint32_t seesionid; - dbus_uint32_t serviceid_timelow; - dbus_uint32_t serviceid_timemid; - dbus_uint32_t serviceid_timehiandver; - dbus_uint32_t *serviceid_clockseqandnode; - int serviceid_clockseqandnode_realsize; - dbus_int32_t serviceid_clockseqandnode_outsize; - dbus_uint32_t opscnt; - dbus_uint64_t head_next; - dbus_uint64_t head_prev; - dbus_uint64_t context; - - dbus_uint32_t serial = 0; - -#ifdef GP_PROXY - pthread_mutex_t * mutex_workerrec; - wr_t * workerrec; -#endif - -#ifdef GP_WORKER - pthread_mutex_t *mutex_tcl; - pthread_mutex_t *mutex_tsl; - tcl_t *tcl; - tsl_t *tsl; -#endif - - DBusMCP = (DBusMsgConn *) thdfargs; - msg = DBusMCP->msg; - conn = DBusMCP->conn; -#ifdef GP_PROXY - mutex_workerrec = DBusMCP->mutex_workerrec; - workerrec = DBusMCP->workerrec; -#endif -#ifdef GP_WORKER - mutex_tcl = DBusMCP->mutex_tcl; - mutex_tsl = DBusMCP->mutex_tsl; - tcl = DBusMCP->tcl; - tsl = DBusMCP->tsl; -#endif - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_get_basic( - &structIter, - &in_session_seesionid); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_serviceid_timelow - ); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_serviceid_timemid); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_serviceid_timehiandver); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_serviceid_clockseqandnode_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (in_session_serviceid_clockseqandnode_size > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &in_session_serviceid_clockseqandnode, - &in_session_serviceid_clockseqandnode_realsize - ); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_get_basic( - &structIter, - &in_session_opscnt); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_head_next); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_head_prev); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_context); - - printf("Received method call Teec Close Session: \n"); - printf(" in_session_seesionid = 0x %8.8x \n", in_session_seesionid); -#if 0 - printf(" in_session_serviceid_timelow = 0x %8.8x \n", in_session_serviceid_timelow); - printf(" in_session_serviceid_timemid = 0x %8.8x \n", in_session_serviceid_timemid); - printf(" in_session_serviceid_timehiandver = 0x %8.8x \n", - in_session_serviceid_timehiandver); - printf(" in_session_serviceid_clockseqandnode = \n"); - printf(" "); - for (int i = 0; i < in_session_serviceid_clockseqandnode_realsize; i++) { - printf(" %8.8x", in_session_serviceid_clockseqandnode[i]); - } - printf("\n"); - printf(" in_session_serviceid_clockseqandnode_size = 0x %8.8x \n", - in_session_serviceid_clockseqandnode_size); - printf(" in_session_opscnt = 0x %8.8x \n", in_session_opscnt); - printf(" in_session_head_next = 0x %16.16lx \n", in_session_head_next); - printf(" in_session_head_prev = 0x %16.16lx \n", in_session_head_prev); -#endif - printf(" in_session_context = 0x %16.16lx \n", in_session_context); - - -#ifdef GP_WORKER - //////////////////////////////////////////////////////////////////////////////////////////////// - - - TEEC_Session *sessionIns; - tsn_t *tsnIns; - - sessionIns = NULL; - pthread_mutex_lock(mutex_tsl); - if (tsl->first != NULL) - { - tsnIns = tsl->first; - do - { - if (tsnIns->self->session_id == in_session_seesionid) - { - sessionIns = tsnIns->self; - break; - } - tsnIns = tsnIns->next; - } while (tsnIns != NULL); - } - pthread_mutex_unlock(mutex_tsl); - - if (sessionIns == NULL) - { - if (tsl->first == NULL) - { - printf("The teec session list is null. \n"); - // teecresult = TEEC_ERROR_SESSION_LIST_NULL; - } else - { - printf("Can't find the teec session. \n"); - // teecresult = TEEC_ERROR_NO_SESSION_MATCH; - } - - seesionid = 0x0; - serviceid_timelow = 0x0; - serviceid_timemid = 0x0; - serviceid_timehiandver = 0x0; - opscnt = 0x0; - head_next = 0x0; - head_prev = 0x0; - context = 0x0; - - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (dbus_uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - for (int i = 0; i < serviceid_clockseqandnode_realsize; i++) - { - serviceid_clockseqandnode[i] = 0x0; - } - serviceid_clockseqandnode_outsize = 8; - } else - { - sessionIns->session_id = in_session_seesionid; -#if 0 - sessionIns->service_id.timeLow = in_session_serviceid_timelow; - sessionIns->service_id.timeMid = in_session_serviceid_timemid; - sessionIns->service_id.timeHiAndVersion = in_session_serviceid_timehiandver; - if ( in_session_serviceid_clockseqandnode_realsize <= 8 && - in_session_serviceid_clockseqandnode_realsize > 0 && - in_session_serviceid_clockseqandnode != NULL - ) - { - for (int i = 0; i < in_session_serviceid_clockseqandnode_realsize; i++) { - sessionIns->service_id.clockSeqAndNode[i] = - (uint8_t)(in_session_serviceid_clockseqandnode[i] & 0x000000ff); - } - } - else - { - for (int i = 0; i < 8; i++) { - sessionIns->service_id.clockSeqAndNode[i] = 0; - } - } - sessionIns->ops_cnt = in_session_opscnt; - sessionIns->head.next = (struct ListNode *)in_session_head_next; - sessionIns->head.prev = (struct ListNode *)in_session_head_prev; - // sessionIns->context = (TEEC_Context *)in_session_context; -#endif - -#if 0 - printf("Call TEEC_CloseSession inputs: \n"); - printf(" session_seesionid = 0x %8.8x \n", sessionIns->session_id); - printf(" session_serviceid_timelow = 0x %8.8x \n", sessionIns->service_id.timeLow); - printf(" session_serviceid_timemid = 0x %4.4x \n", sessionIns->service_id.timeMid); - printf(" session_serviceid_timehiandver = 0x %4.4x \n", - sessionIns->service_id.timeHiAndVersion); - printf(" session_serviceid_clockseqandnode = \n"); - printf(" "); - for (int i = 0; i < 8; i++) { - printf(" %2.2x", sessionIns->service_id.clockSeqAndNode[i]); - } - printf("\n"); - printf(" session_opscnt = 0x %8.8x \n", sessionIns->ops_cnt); - printf(" session_head_next = 0x %16.16lx \n", sessionIns->head.next); - printf(" session_head_prev = 0x %16.16lx \n", sessionIns->head.prev); - printf(" session_context = 0x %16.16lx \n", sessionIns->context); -#endif - struct timeval start, end; - gettimeofday(&start, NULL); - TEEC_CloseSession( - sessionIns - ); - gettimeofday(&end, NULL); - uint32_t cost = 0; - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - printf("Teec CloseSession executed, cost time: %ld us \n", cost); - - seesionid = sessionIns->session_id; - serviceid_timelow = sessionIns->service_id.timeLow; - serviceid_timemid = sessionIns->service_id.timeMid; - serviceid_timehiandver = sessionIns->service_id.timeHiAndVersion; -#if 0 - printf(" in_session_serviceid_clockseqandnode = \n"); - printf(" "); - for (int i = 0; i < 8; i++) { - printf(" %2.2x", in_session_serviceid_clockseqandnode[i]); - } - printf("\n"); -#endif - if (sessionIns->service_id.clockSeqAndNode != NULL) - { - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (dbus_uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - for (int iind = 0; iind < 8; iind++) - { - uint8_t u8Temp; - u8Temp = sessionIns->service_id.clockSeqAndNode[iind]; - serviceid_clockseqandnode[iind] = (dbus_uint32_t) u8Temp; - } - serviceid_clockseqandnode_outsize = 8; - } else - { - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode = NULL; - serviceid_clockseqandnode_outsize = 0; - } - opscnt = sessionIns->ops_cnt; - head_next = (dbus_uint64_t) sessionIns->head.next; - head_prev = (dbus_uint64_t) sessionIns->head.prev; - context = (dbus_uint64_t) sessionIns->context; - - printf(" ret sessionid = 0x %8.8x \n", seesionid); - printf(" ret context = 0x %16.16lx \n", context); - - tsn_t *tsnTemp; - tsnTemp = tsnIns->prev; - if (tsnTemp != NULL) - { - tsnTemp->next = tsnIns->next; - } - tsnTemp = tsnIns->next; - if (tsnTemp != NULL) - { - tsnTemp->prev = tsnIns->prev; - } - pthread_mutex_lock(mutex_tsl); - if (tsl->last == tsnIns) - { - tsl->last = tsnIns->prev; - } - if (tsl->first == tsnIns) - { - tsl->first = tsnIns->next; - } - tsl->count = tsl->count - 1; - pthread_mutex_unlock(mutex_tsl); - free(sessionIns); - free(tsnIns); - } - //////////////////////////////////////////////////////////////////////////////////////////////// -#else - - uint32_t serviceid_clockseqandnode_outsize_temp; - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (dbus_uint32_t *)malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - - char workername[1024]; - memset((char *)workername, 0, 1024); - // sprintf(workername, "%s", "gpworker1"); - int ifound = 0; - int iworker; - sin_t * sinIns; - - pthread_mutex_lock(mutex_workerrec); - for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) - { - if (workerrec[iworker].context_addr == in_session_context) - { - sinIns = NULL; - if (workerrec[iworker].first != NULL) - { - sinIns = workerrec[iworker].first; - do - { - if (sinIns->session_id == in_session_seesionid) - { - sprintf(workername, "%s%d", "gpworker", iworker); - ifound = 1; - break; - } - sinIns = sinIns->next; - }while (sinIns != NULL); - - - if ( ifound == 1 ) - { - break; - } - } - } - } - pthread_mutex_unlock(mutex_workerrec); - - - if (ifound == 0) - { - printf("Can't find the worker for the session and the context. \n"); - - seesionid = 0x0; - serviceid_timelow = 0x0; - serviceid_timemid = 0x0; - serviceid_timehiandver = 0x0; - opscnt = 0x0; - head_next = 0x0; - head_prev = 0x0; - context = 0x0; - - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (dbus_uint32_t *)malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - for (int i = 0; i < serviceid_clockseqandnode_realsize ; i++) { - serviceid_clockseqandnode[i] = 0x0; - } - serviceid_clockseqandnode_outsize = 8; - } - else - { - method_call_teec_closesession( - workername, - - in_session_seesionid, - in_session_serviceid_timelow, - in_session_serviceid_timemid, - in_session_serviceid_timehiandver, - in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_realsize, - in_session_opscnt, - in_session_head_next, - in_session_head_prev, - in_session_context, - - &seesionid, - &serviceid_timelow, - &serviceid_timemid, - &serviceid_timehiandver, - serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize, - &serviceid_clockseqandnode_outsize_temp, - &opscnt, - &head_next, - &head_prev, - &context - ); - - pthread_mutex_lock(mutex_workerrec); - sin_t * sinTemp; - sinTemp = sinIns->prev; - if (sinTemp != NULL) - { - sinTemp->next = sinIns->next; - } - sinTemp = sinIns->next; - if (sinTemp != NULL) - { - sinTemp->prev = sinIns->prev; - } - if (workerrec[iworker].last == sinIns) - { - workerrec[iworker].last = sinIns->prev; - } - if (workerrec[iworker].first == sinIns) - { - workerrec[iworker].first = sinIns->next; - } - free(sinIns); - workerrec[iworker].sessionid_count = - workerrec[iworker].sessionid_count - 1; - pthread_mutex_unlock(mutex_workerrec); - - serviceid_clockseqandnode_outsize = serviceid_clockseqandnode_outsize_temp; - - if ( - serviceid_clockseqandnode_realsize >= serviceid_clockseqandnode_outsize && - 8 >= serviceid_clockseqandnode_outsize - ) - { - serviceid_clockseqandnode_realsize = serviceid_clockseqandnode_outsize; - } - else - { - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode_outsize = 0; - } - - }// end of else found == 1 -#endif - - - // create a reply from the message - reply = dbus_message_new_method_return(msg); - - // add the arguments to the reply - dbus_message_iter_init_append(reply, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &seesionid - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_timelow - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_timemid - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_timehiandver - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_clockseqandnode_outsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (serviceid_clockseqandnode_outsize > 0 && - serviceid_clockseqandnode != NULL - ) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize - ); - - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return NULL; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &opscnt - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &head_next - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &head_prev - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &context - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - // send the reply && flush the connection - serial = 100; - if (!dbus_connection_send(conn, reply, &serial)) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - // dbus_connection_close(conn); - // dbus_connection_unref(conn); - free(thdfargs); - - // sleep(2); - - return NULL; -} - - -void * -reply_to_method_call_teec_invokecommand( - void *thdfargs -) -{ - DBusMsgConn *DBusMCP; - DBusMessage *msg; - DBusConnection *conn; - DBusMessage *reply; - DBusMessageIter args; - dbus_bool_t bResult; - DBusMessageIter structIter; - DBusMessageIter ArrayIter; - int iType; - char buf[2]; - buf[0] = DBUS_TYPE_UINT32; - buf[1] = '\0'; - - dbus_uint32_t in_session_sessionid; - dbus_uint32_t in_session_serviceid_timelow; - dbus_uint32_t in_session_serviceid_timemid; - dbus_uint32_t in_session_serviceid_timehiandver; - dbus_uint32_t in_session_serviceid_clockseqandnode_size; - dbus_uint32_t *in_session_serviceid_clockseqandnode; - int in_session_serviceid_clockseqandnode_realsize; - dbus_uint32_t in_session_opscnt; - dbus_uint64_t in_session_head_next; - dbus_uint64_t in_session_head_prev; - dbus_uint64_t in_session_context; - - dbus_uint32_t in_commandid; - - dbus_uint32_t in_operation_started; - dbus_uint32_t in_operation_paramtypes; - - dbus_uint64_t in_operation_param1_tmpref_buffer; - dbus_uint32_t in_operation_param1_tmpref_size; - dbus_uint64_t in_operation_param1_memref_parent; - dbus_uint32_t in_operation_param1_memref_parent_flag; - dbus_uint32_t in_operation_param1_memref_size; - dbus_uint32_t in_operation_param1_memref_offset; - dbus_uint32_t in_operation_param1_value_a; - dbus_uint32_t in_operation_param1_value_b; - dbus_int32_t in_operation_param1_ionref_ionsharefd; - dbus_uint32_t in_operation_param1_ionref_ionsize; - - dbus_uint64_t in_operation_param2_tmpref_buffer; - dbus_uint32_t in_operation_param2_tmpref_size; - dbus_uint64_t in_operation_param2_memref_parent; - dbus_uint32_t in_operation_param2_memref_parent_flag; - dbus_uint32_t in_operation_param2_memref_size; - dbus_uint32_t in_operation_param2_memref_offset; - dbus_uint32_t in_operation_param2_value_a; - dbus_uint32_t in_operation_param2_value_b; - dbus_int32_t in_operation_param2_ionref_ionsharefd; - dbus_uint32_t in_operation_param2_ionref_ionsize; - - dbus_uint64_t in_operation_param3_tmpref_buffer; - dbus_uint32_t in_operation_param3_tmpref_size; - dbus_uint64_t in_operation_param3_memref_parent; - dbus_uint32_t in_operation_param3_memref_parent_flag; - dbus_uint32_t in_operation_param3_memref_size; - dbus_uint32_t in_operation_param3_memref_offset; - dbus_uint32_t in_operation_param3_value_a; - dbus_uint32_t in_operation_param3_value_b; - dbus_int32_t in_operation_param3_ionref_ionsharefd; - dbus_uint32_t in_operation_param3_ionref_ionsize; - - dbus_uint64_t in_operation_param4_tmpref_buffer; - dbus_uint32_t in_operation_param4_tmpref_size; - dbus_uint64_t in_operation_param4_memref_parent; - dbus_uint32_t in_operation_param4_memref_parent_flag; - dbus_uint32_t in_operation_param4_memref_size; - dbus_uint32_t in_operation_param4_memref_offset; - dbus_uint32_t in_operation_param4_value_a; - dbus_uint32_t in_operation_param4_value_b; - dbus_int32_t in_operation_param4_ionref_ionsharefd; - dbus_uint32_t in_operation_param4_ionref_ionsize; - - dbus_uint64_t in_operation_session; - dbus_int32_t in_operation_cancelflag; - - dbus_uint32_t in_returnorigin; - - dbus_uint32_t in_buffer1_size; - dbus_uint32_t *in_buffer1; - int in_buffer1_realsize; - dbus_uint32_t in_buffer2_size; - dbus_uint32_t *in_buffer2; - int in_buffer2_realsize; - dbus_uint32_t in_buffer3_size; - dbus_uint32_t *in_buffer3; - int in_buffer3_realsize; - dbus_uint32_t in_buffer4_size; - dbus_uint32_t *in_buffer4; - int in_buffer4_realsize; - - dbus_uint32_t teecresult; - - dbus_uint32_t sessionid; - dbus_uint32_t serviceid_timelow; - dbus_uint32_t serviceid_timemid; - dbus_uint32_t serviceid_timehiandver; - dbus_uint32_t *serviceid_clockseqandnode; - int serviceid_clockseqandnode_realsize; - dbus_uint32_t serviceid_clockseqandnode_outsize; - dbus_uint32_t opscnt; - dbus_uint64_t head_next; - dbus_uint64_t head_prev; - dbus_uint64_t context; - - dbus_uint32_t started; - dbus_uint32_t paramtypes; - - dbus_uint64_t operation_param1_tmpref_buffer; - dbus_uint32_t operation_param1_tmpref_size; - dbus_uint64_t operation_param1_memref_parent; - dbus_uint32_t operation_param1_memref_parent_flag; - dbus_uint32_t operation_param1_memref_size; - dbus_uint32_t operation_param1_memref_offset; - dbus_uint32_t operation_param1_value_a; - dbus_uint32_t operation_param1_value_b; - dbus_int32_t operation_param1_ionref_ionsharefd; - dbus_uint32_t operation_param1_ionref_ionsize; - - dbus_uint64_t operation_param2_tmpref_buffer; - dbus_uint32_t operation_param2_tmpref_size; - dbus_uint64_t operation_param2_memref_parent; - dbus_uint32_t operation_param2_memref_parent_flag; - dbus_uint32_t operation_param2_memref_size; - dbus_uint32_t operation_param2_memref_offset; - dbus_uint32_t operation_param2_value_a; - dbus_uint32_t operation_param2_value_b; - dbus_int32_t operation_param2_ionref_ionsharefd; - dbus_uint32_t operation_param2_ionref_ionsize; - - dbus_uint64_t operation_param3_tmpref_buffer; - dbus_uint32_t operation_param3_tmpref_size; - dbus_uint64_t operation_param3_memref_parent; - dbus_uint32_t operation_param3_memref_parent_flag; - dbus_uint32_t operation_param3_memref_size; - dbus_uint32_t operation_param3_memref_offset; - dbus_uint32_t operation_param3_value_a; - dbus_uint32_t operation_param3_value_b; - dbus_int32_t operation_param3_ionref_ionsharefd; - dbus_uint32_t operation_param3_ionref_ionsize; - - dbus_uint64_t operation_param4_tmpref_buffer; - dbus_uint32_t operation_param4_tmpref_size; - dbus_uint64_t operation_param4_memref_parent; - dbus_uint32_t operation_param4_memref_parent_flag; - dbus_uint32_t operation_param4_memref_size; - dbus_uint32_t operation_param4_memref_offset; - dbus_uint32_t operation_param4_value_a; - dbus_uint32_t operation_param4_value_b; - dbus_int32_t operation_param4_ionref_ionsharefd; - dbus_uint32_t operation_param4_ionref_ionsize; - - dbus_uint64_t operation_session; - dbus_int32_t operation_cancelflag; - - dbus_uint32_t returnorigin; - - dbus_uint32_t *buffer1; - int buffer1_realsize; - dbus_uint32_t buffer1_outsize; - dbus_uint32_t *buffer2; - int buffer2_realsize; - dbus_uint32_t buffer2_outsize; - dbus_uint32_t *buffer3; - int buffer3_realsize; - dbus_uint32_t buffer3_outsize; - dbus_uint32_t *buffer4; - int buffer4_realsize; - dbus_uint32_t buffer4_outsize; - - dbus_uint32_t serial = 0; - -#ifdef GP_PROXY - pthread_mutex_t * mutex_workerrec; - wr_t * workerrec; -#endif - -#ifdef GP_WORKER - pthread_mutex_t *mutex_tcl; - pthread_mutex_t *mutex_tsl; - tcl_t *tcl; - tsl_t *tsl; -#endif - - DBusMCP = (DBusMsgConn *) thdfargs; - msg = DBusMCP->msg; - conn = DBusMCP->conn; -#ifdef GP_PROXY - mutex_workerrec = DBusMCP->mutex_workerrec; - workerrec = DBusMCP->workerrec; -#endif -#ifdef GP_WORKER - mutex_tcl = DBusMCP->mutex_tcl; - mutex_tsl = DBusMCP->mutex_tsl; - tcl = DBusMCP->tcl; - tsl = DBusMCP->tsl; -#endif - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_sessionid); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_serviceid_timelow - ); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_serviceid_timemid); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_serviceid_timehiandver); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_serviceid_clockseqandnode_size); - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (in_session_serviceid_clockseqandnode_size > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &in_session_serviceid_clockseqandnode, - &in_session_serviceid_clockseqandnode_realsize - ); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_get_basic( - &structIter, - &in_session_opscnt); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_head_next); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_head_prev); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_session_context); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_commandid); - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_started); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_paramtypes); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_tmpref_buffer); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_tmpref_size); - - bResult = dbus_message_iter_next(&structIter); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT64) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_memref_parent); - - bResult = dbus_message_iter_next(&structIter); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32. \n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_memref_parent_flag); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_memref_size); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_memref_offset); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_value_a); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_value_b); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_ionref_ionsharefd); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param1_ionref_ionsize); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_tmpref_buffer); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_tmpref_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_memref_parent); - - bResult = dbus_message_iter_next(&structIter); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32. \n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_memref_parent_flag); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_memref_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_memref_offset); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_value_a); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_value_b); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_ionref_ionsharefd); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param2_ionref_ionsize); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_tmpref_buffer); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_tmpref_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_memref_parent); - - bResult = dbus_message_iter_next(&structIter); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32. \n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_memref_parent_flag); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_memref_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_memref_offset); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_value_a); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_value_b); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_ionref_ionsharefd); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param3_ionref_ionsize); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_tmpref_buffer); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_tmpref_size); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_memref_parent); - - bResult = dbus_message_iter_next(&structIter); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32. \n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_memref_parent_flag); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_memref_size); - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_memref_offset); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_value_a); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_value_b); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_ionref_ionsharefd); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_param4_ionref_ionsize); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_session); - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_operation_cancelflag); - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_returnorigin); - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_buffer1_size); - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (in_buffer1_size > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &in_buffer1, - &in_buffer1_realsize - ); - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_buffer2_size); - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (in_buffer2_size > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &in_buffer2, - &in_buffer2_realsize - ); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_buffer3_size); - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (in_buffer3_size > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &in_buffer3, - &in_buffer3_realsize - ); - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_basic( - &structIter, - &in_buffer4_size); - - if (in_buffer4_size > 0) - { - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_iter_recurse( - &structIter, - &ArrayIter); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32, line %d. \n", __LINE__); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &in_buffer4, - &in_buffer4_realsize - ); - } - - printf("Received method call TEEC_InvokeCommand: \n"); - printf(" in_session_sessionid = 0x %8.8x \n", in_session_sessionid); -#if 0 - printf(" in_session_serviceid_timelow = 0x %8.8x \n", in_session_serviceid_timelow); - printf(" in_session_serviceid_timemid = 0x %8.8x \n", in_session_serviceid_timemid); - printf(" in_session_serviceid_timehiandver = 0x %8.8x \n", - in_session_serviceid_timehiandver); - printf(" in_session_serviceid_clockseqandnode = \n"); - printf(" "); - for (int i = 0; i < in_session_serviceid_clockseqandnode_realsize; i++) { - printf(" %2.2x", in_session_serviceid_clockseqandnode[i]); - } - printf("\n"); - printf(" in serviceid_clockseqandnode_size = 0x %8.8x \n", - in_session_serviceid_clockseqandnode_size); - printf(" in_session_opscnt = 0x %8.8x \n", in_session_opscnt); - printf(" in_session_head_next = 0x %16.16lx \n", in_session_head_next); - printf(" in_session_head_prev = 0x %16.16lx \n", in_session_head_prev); -#endif - printf(" in_session_context = 0x %16.16lx \n", in_session_context); -#if 0 - printf(" commandid = 0x %8.8x \n", in_commandid); - - printf(" in_operation_started = 0x %8.8x \n", in_operation_started); - printf(" in_operation_paramtypes = 0x %8.8x \n", in_operation_paramtypes); - - printf(" in_operation_param1_tmpref_buffer = 0x %16.16lx \n", in_operation_param1_tmpref_buffer); - printf(" in_operation_param1_tmpref_size = 0x %8.8x \n", in_operation_param1_tmpref_size); - printf(" in_operation_param1_memref_parent = 0x %16.16lx \n", in_operation_param1_memref_parent); - printf(" in_operation_param1_memref_size = 0x %8.8x \n", in_operation_param1_memref_size); - printf(" in_operation_param1_memref_offset = 0x %8.8x \n", in_operation_param1_memref_offset); - printf(" in_operation_param1_value_a = 0x %8.8x \n", in_operation_param1_value_a); - printf(" in_operation_param1_value_b = 0x %8.8x \n", in_operation_param1_value_b); - printf(" in_operation_param1_ionref_ionsharefd = 0x %8.8x \n",in_operation_param2_ionref_ionsharefd); - printf(" in_operation_param1_ionref_ionsize = 0x %8.8x \n", in_operation_param2_ionref_ionsize); - - printf(" in_operation_param2_tmpref_buffer = 0x %16.16lx \n", in_operation_param2_tmpref_buffer); - printf(" in_operation_param2_tmpref_size = 0x %8.8x \n", in_operation_param2_tmpref_size); - printf(" in_operation_param2_memref_parent = 0x %16.16lx \n", in_operation_param2_memref_parent); - printf(" in_operation_param2_memref_size = 0x %8.8x \n", in_operation_param2_memref_size); - printf(" in_operation_param2_memref_offset = 0x %8.8x \n", in_operation_param2_memref_offset); - printf(" in_operation_param2_value_a = 0x %8.8x \n", in_operation_param3_value_a); - printf(" in_operation_param2_value_b = 0x %8.8x \n", in_operation_param3_value_b); - printf(" in_operation_param2_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); - printf(" in_operation_param2_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); - - printf(" in_operation_param3_tmpref_buffer = 0x %16.16lx \n", in_operation_param3_tmpref_buffer); - printf(" in_operation_param3_tmpref_size = 0x %8.8x \n", in_operation_param3_tmpref_size); - printf(" in_operation_param3_memref_parent = 0x %16.16lx \n", in_operation_param3_memref_parent); - printf(" in_operation_param3_memref_size = 0x %8.8x \n", in_operation_param3_memref_size); - printf(" in_operation_param3_memref_offset = 0x %8.8x \n", in_operation_param3_memref_offset); - printf(" in_operation_param3_value_a = 0x %8.8x \n", in_operation_param3_value_a); - printf(" in_operation_param3_value_b = 0x %8.8x \n", in_operation_param3_value_b); - printf(" in_operation_param3_ionref_ionsharefd = 0x %8.8x \n", in_operation_param3_ionref_ionsharefd); - printf(" in_operation_param3_ionref_ionsize = 0x %8.8x \n", in_operation_param3_ionref_ionsize); - - printf(" in_operation_param4_tmpref_buffer = 0x %16.16lx \n", in_operation_param4_tmpref_buffer); - printf(" in_operation_param4_tmpref_size = 0x %8.8x \n", in_operation_param4_tmpref_size); - printf(" in_operation_param4_memref_parent = 0x %16.16lx \n", in_operation_param4_memref_parent); - printf(" in_operation_param4_memref_size = 0x %8.8x \n", in_operation_param4_memref_size); - printf(" in_operation_param4_memref_offset = 0x %8.8x \n", in_operation_param4_memref_offset); - printf(" in_operation_param4_value_a = 0x %8.8x \n", in_operation_param4_value_a); - printf(" in_operation_param4_value_b = 0x %8.8x \n", in_operation_param4_value_b); - printf(" in_operation_param4_ionref_ionsharefd = 0x %8.8x \n", in_operation_param4_ionref_ionsharefd); - printf(" in_operation_param4_ionref_ionsize = 0x %8.8x \n", in_operation_param4_ionref_ionsize); - - printf(" in_operation_session = 0x %16.16lx \n", in_operation_session); - printf(" in_operation_cancelflag = 0x %8.8x \n", in_operation_cancelflag); - - printf(" in_returnorigin = 0x %8.8x \n", in_returnorigin); - - printf(" in_buffer1 = \n"); - if (in_buffer1_size > 0) { - printf(" "); - for (int i = 0; i < in_buffer1_realsize; i++) { - printf(" %2.2x", in_buffer1[i]); - } - printf("\n"); - } -#endif - -#if 0 - printf(" in_buffer1_size = 0x %8.8x \n", - in_buffer1_size); -#endif - -#if 0 - printf(" in_buffer2 = \n"); - if (in_buffer2_size > 0) { - printf(" "); - for (int i = 0; i < in_buffer2_realsize; i++) { - printf(" %2.2x", in_buffer2[i]); - } - printf("\n"); - } - printf(" in_buffer2_size = 0x %8.8x \n", - in_buffer2_size); - - printf(" in_buffer3 = \n"); - if (in_buffer3_size > 0) { - printf(" "); - for (int i = 0; i < in_buffer3_realsize; i++) { - printf(" %2.2x", in_buffer3[i]); - } - printf("\n"); - } - printf(" in_buffer3_size = 0x %8.8x \n", - in_buffer3_size); - - printf(" in_buffer4 = \n"); - if (in_buffer4_size > 0) { - printf(" "); - for (int i = 0; i < in_buffer4_realsize; i++) { - printf(" %2.2x", in_buffer4[i]); - } - printf("\n"); - } - printf(" in_buffer4_size = 0x %8.8x \n", - in_buffer4_size); -#endif - -#ifdef GP_WORKER - ////////////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////////////////////// - TEEC_Session *sessionIns; - tsn_t *tsnIns; - - sessionIns = NULL; - pthread_mutex_lock(mutex_tsl); - if (tsl->first != NULL) - { - tsnIns = tsl->first; - do - { - if (tsnIns->self->session_id == in_session_sessionid) - { - sessionIns = tsnIns->self; - break; - } - tsnIns = tsnIns->next; - } while (tsnIns != NULL); - } - pthread_mutex_unlock(mutex_tsl); - - TEEC_Context *contextIns; - tcn_t *tcnIns; - - contextIns = NULL; - if (sessionIns != NULL) - { - pthread_mutex_lock(mutex_tcl); - if (tcl->first != NULL) - { - tcnIns = tcl->first; - do - { - contextIns = tcnIns->self; - if (contextIns == sessionIns->context) - { - break; - } - tcnIns = tcnIns->next; - } while (tcnIns != NULL); - } - pthread_mutex_unlock(mutex_tcl); - } - - if (sessionIns == NULL || contextIns == NULL) - { - if (sessionIns == NULL) - { - if (tsl->first == NULL) - { - printf("The teec session list is null. \n"); - teecresult = TEEC_ERROR_SESSION_LIST_NULL; - } else - { - printf("Can't find the teec session. \n"); - teecresult = TEEC_ERROR_NO_SESSION_MATCH; - } - } - - if (contextIns == NULL) - { - if (tcl->first == NULL) - { - printf("The teec context list is null. \n"); - teecresult = TEEC_ERROR_CONTEXT_LIST_NULL; - } else - { - printf("Can't find the teec context. \n"); - teecresult = TEEC_ERROR_NO_CONTEXT_MATCH; - } - } - - sessionid = 0; - serviceid_timelow = 0; - serviceid_timemid = 0; - serviceid_timehiandver = 0; - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode = NULL; - serviceid_clockseqandnode_outsize = 0; - opscnt = 0; - head_next = 0; - head_prev = 0; - context = 0; - - started = 0; - paramtypes = 0; - - operation_param1_tmpref_buffer = 0; - operation_param1_tmpref_size = 0; - operation_param1_memref_parent = 0; - operation_param1_memref_parent_flag = 0; - operation_param1_memref_size = 0; - operation_param1_memref_offset = 0; - operation_param1_value_a = 0; - operation_param1_value_b = 0; - operation_param1_ionref_ionsharefd = 0; - operation_param1_ionref_ionsize = 0; - - operation_param2_tmpref_buffer = 0; - operation_param2_tmpref_size = 0; - operation_param2_memref_parent = 0; - operation_param2_memref_parent_flag = 0; - operation_param2_memref_size = 0; - operation_param2_memref_offset = 0; - operation_param2_value_a = 0; - operation_param2_value_b = 0; - operation_param2_ionref_ionsharefd = 0; - operation_param2_ionref_ionsize = 0; - - operation_param3_tmpref_buffer = 0; - operation_param3_tmpref_size = 0; - operation_param3_memref_parent = 0; - operation_param3_memref_parent_flag = 0; - operation_param3_memref_size = 0; - operation_param3_memref_offset = 0; - operation_param3_value_a = 0; - operation_param3_value_b = 0; - operation_param3_ionref_ionsharefd = 0; - operation_param3_ionref_ionsize = 0; - - operation_param4_tmpref_buffer = 0; - operation_param4_tmpref_size = 0; - operation_param4_memref_parent = 0; - operation_param4_memref_parent_flag = 0; - operation_param4_memref_size = 0; - operation_param4_memref_offset = 0; - operation_param4_value_a = 0; - operation_param4_value_b = 0; - operation_param4_ionref_ionsharefd = 0; - operation_param4_ionref_ionsize = 0; - - operation_session = 0; - operation_cancelflag = 0; - - returnorigin = 0xff; - - buffer1_realsize = 0; - buffer1 = NULL; - buffer1_outsize = 0; - buffer2_realsize = 0; - buffer2 = NULL; - buffer2_outsize = 0; - buffer3_realsize = 0; - buffer3 = NULL; - buffer3_outsize = 0; - buffer4_realsize = 0; - buffer4 = NULL; - buffer4_outsize = 0; - } else - { - teecresult = TEEC_SUCCESS; - - sessionIns->session_id = in_session_sessionid; - sessionIns->service_id.timeLow = in_session_serviceid_timelow; - sessionIns->service_id.timeMid = in_session_serviceid_timemid; - sessionIns->service_id.timeHiAndVersion = in_session_serviceid_timehiandver; - if (in_session_serviceid_clockseqandnode_realsize <= 8 && - in_session_serviceid_clockseqandnode_realsize > 0 && - in_session_serviceid_clockseqandnode != NULL - ) - { - for (int i = 0; i < in_session_serviceid_clockseqandnode_realsize; i++) - { - sessionIns->service_id.clockSeqAndNode[i] = - (uint8_t)(in_session_serviceid_clockseqandnode[i] & 0x000000ff); - } - } else - { - for (int i = 0; i < 8; i++) - { - sessionIns->service_id.clockSeqAndNode[i] = 0; - } - } - sessionIns->ops_cnt = in_session_opscnt; - sessionIns->head.next = (struct ListNode *) in_session_head_next; - sessionIns->head.prev = (struct ListNode *) in_session_head_prev; - // sessionIns->context = (TEEC_Context *)in_session_context; - - - TEEC_Operation operationIns; - - operationIns.started = in_operation_started; - operationIns.paramTypes = in_operation_paramtypes; - - ///////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////// - - uint8_t *buffer1_temp = NULL; - TEEC_SharedMemory shareBuffer1; - bool sb1AllReged = false; - switch ( - TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 0) - ) - { - case TEEC_VALUE_INPUT: - case TEEC_VALUE_INOUT: - { - operationIns.params[0].value.a = in_operation_param1_value_a; - operationIns.params[0].value.b = in_operation_param1_value_b; - - break; - } - - case TEEC_MEMREF_TEMP_INPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if ( - in_buffer1 != NULL && - in_buffer1_size > 0 - ) - { - uint32_t buffer1_temp_size; - buffer1_temp_size = in_buffer1_size; - buffer1_temp = (uint8_t *) malloc(buffer1_temp_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer1_size; isize++) - { - buffer1_temp[isize] = (uint8_t)(in_buffer1[isize] & 0x000000ff); - } - - operationIns.params[0].tmpref.buffer = (void *) buffer1_temp; - operationIns.params[0].tmpref.size = buffer1_temp_size; - } - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - { - if ( - in_operation_param1_tmpref_size > 0 - ) - { - buffer1_temp = (uint8_t *) malloc(in_operation_param1_tmpref_size * sizeof(uint8_t)); - operationIns.params[0].tmpref.buffer = (void *) buffer1_temp; - operationIns.params[0].tmpref.size = in_operation_param1_tmpref_size; - } - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - switch (in_operation_param1_memref_parent_flag) - { - case TEEC_MEM_INPUT: - case TEEC_MEM_INOUT: - { - if ( - in_buffer1 != NULL && - in_buffer1_size > 0 - ) - { - memset(&shareBuffer1, 0, sizeof(shareBuffer1)); - shareBuffer1.size = in_buffer1_size; - shareBuffer1.flags = in_operation_param1_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer1); - if (retASM) - { - printf("Alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb1AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - memset(shareBuffer1.buffer, 0, shareBuffer1.size); - for (int isize = 0; isize < in_buffer1_size; isize++) - { - *((uint8_t * )(shareBuffer1.buffer) + isize) = - (uint8_t)(in_buffer1[isize] & 0x000000ff); - } - operationIns.params[0].memref.parent = &shareBuffer1; - // operationIns.params[0].memref.parent->flags = - // in_operation_param1_memref_parent_flag; - operationIns.params[0].memref.size = shareBuffer1.size; - } - } - - break; - } - - case TEEC_MEM_OUTPUT: - { - if ( - in_operation_param1_memref_size > 0 - ) - { - memset(&shareBuffer1, 0, sizeof(shareBuffer1)); - shareBuffer1.size = in_operation_param1_memref_size; - shareBuffer1.flags = in_operation_param1_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer1); - if (retASM) - { - printf("Alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb1AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - operationIns.params[0].memref.parent = &shareBuffer1; - operationIns.params[0].memref.size = shareBuffer1.size; - } - - } - - break; - } - - default: - break; - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_INPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if ( - in_buffer1 != NULL && - in_buffer1_size > 0 - ) - { - memset(&shareBuffer1, 0, sizeof(shareBuffer1)); - shareBuffer1.size = in_buffer1_size; - shareBuffer1.flags = in_operation_param1_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer1); - if (retASM) - { - printf("Alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb1AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - memset(shareBuffer1.buffer, 0, shareBuffer1.size); - for (int isize = 0; isize < in_buffer1_size; isize++) - { - *((uint8_t * )(shareBuffer1.buffer) + isize) = - (uint8_t)(in_buffer1[isize] & 0x000000ff); - } - operationIns.params[0].memref.parent = &shareBuffer1; - operationIns.params[0].memref.offset = in_operation_param1_memref_offset; - operationIns.params[0].memref.size = in_operation_param1_memref_size; - } - } - - break; - } - - case TEEC_MEMREF_PARTIAL_OUTPUT: - { - if (in_operation_param1_memref_size > 0) - { - memset(&shareBuffer1, 0, sizeof(shareBuffer1)); - shareBuffer1.size = in_buffer1_size; - shareBuffer1.flags = in_operation_param1_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer1); - if (retASM) - { - printf("Alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb1AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - operationIns.params[0].memref.parent = &shareBuffer1; - operationIns.params[0].memref.offset = in_operation_param1_memref_offset; - operationIns.params[0].memref.size = in_operation_param1_memref_size; - } - - } - - break; - } - - - default: - break; - } - - ///////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////// - - uint8_t *buffer2_temp = NULL; - TEEC_SharedMemory shareBuffer2; - bool sb2AllReged = false; - switch ( - TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 1) - ) - { - case TEEC_VALUE_INPUT: - case TEEC_VALUE_INOUT: - { - operationIns.params[1].value.a = in_operation_param2_value_a; - operationIns.params[1].value.b = in_operation_param2_value_b; - - break; - } - - case TEEC_MEMREF_TEMP_INPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if ( - in_buffer2 != NULL && - in_buffer2_size > 0 - ) - { - uint32_t buffer2_temp_size; - buffer2_temp_size = in_buffer2_size; - buffer2_temp = (uint8_t *) malloc(buffer2_temp_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer2_size; isize++) - { - buffer2_temp[isize] = (uint8_t)(in_buffer2[isize] & 0x000000ff); - } - - operationIns.params[1].tmpref.buffer = (void *) buffer2_temp; - operationIns.params[1].tmpref.size = buffer2_temp_size; - } - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - { - if ( - in_operation_param2_tmpref_size > 0 - ) - { - buffer2_temp = (uint8_t *) malloc(in_operation_param2_tmpref_size * sizeof(uint8_t)); - operationIns.params[1].tmpref.buffer = (void *) buffer2_temp; - operationIns.params[1].tmpref.size = in_operation_param2_tmpref_size; - } - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - switch (in_operation_param2_memref_parent_flag) - { - case TEEC_MEM_INPUT: - case TEEC_MEM_INOUT: - { - if ( - in_buffer2 != NULL && - in_buffer2_size > 0 - ) - { - memset(&shareBuffer2, 0, sizeof(shareBuffer2)); - shareBuffer2.size = in_buffer2_size; - shareBuffer2.flags = in_operation_param2_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer2); - if (retASM) - { - printf("alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb2AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - memset(shareBuffer2.buffer, 0, shareBuffer2.size); - for (int isize = 0; isize < in_buffer2_size; isize++) - { - *((uint8_t * )(shareBuffer2.buffer) + isize) = - (uint8_t)(in_buffer2[isize] & 0x000000ff); - } - operationIns.params[1].memref.parent = &shareBuffer2; - // operationIns.params[1].memref.parent->flags = - // in_operation_param2_memref_parent_flag; - operationIns.params[1].memref.size = shareBuffer2.size; - } - } - - break; - } - - case TEEC_MEM_OUTPUT: - { - if ( - in_operation_param2_memref_size > 0 - ) - { - memset(&shareBuffer2, 0, sizeof(shareBuffer2)); - shareBuffer2.size = in_operation_param2_memref_size; - shareBuffer2.flags = in_operation_param2_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer2); - if (retASM) - { - printf("alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb2AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - operationIns.params[1].memref.parent = &shareBuffer2; - // operationIns.params[1].memref.parent->flags = - // in_operation_param2_memref_parent_flag; - operationIns.params[1].memref.size = shareBuffer2.size; - } - - } - - break; - } - - default: - break; - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_INPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if ( - in_buffer2 != NULL && - in_buffer2_size > 0 - ) - { - memset(&shareBuffer2, 0, sizeof(shareBuffer2)); - shareBuffer2.size = in_buffer2_size; - shareBuffer2.flags = in_operation_param2_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer2); - if (retASM) - { - printf("Alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb2AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - memset(shareBuffer2.buffer, 0, shareBuffer2.size); - for (int isize = 0; isize < in_buffer2_size; isize++) - { - *((uint8_t * )(shareBuffer2.buffer) + isize) = - (uint8_t)(in_buffer2[isize] & 0x000000ff); - } - operationIns.params[1].memref.parent = &shareBuffer2; - operationIns.params[1].memref.offset = in_operation_param2_memref_offset; - operationIns.params[1].memref.size = in_operation_param2_memref_size; - } - } - - break; - } - - case TEEC_MEMREF_PARTIAL_OUTPUT: - { - if (in_operation_param2_memref_size > 0) - { - memset(&shareBuffer2, 0, sizeof(shareBuffer2)); - shareBuffer2.size = in_buffer2_size; - shareBuffer2.flags = in_operation_param2_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer2); - if (retASM) - { - printf("Alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb2AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - operationIns.params[1].memref.parent = &shareBuffer2; - operationIns.params[1].memref.offset = in_operation_param2_memref_offset; - operationIns.params[1].memref.size = in_operation_param2_memref_size; - } - - } - - break; - } - - - default: - break; - } - - ///////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////// - - uint8_t *buffer3_temp = NULL; - TEEC_SharedMemory shareBuffer3; - bool sb3AllReged = false; - switch ( - TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 2) - ) - { - case TEEC_VALUE_INPUT: - case TEEC_VALUE_INOUT: - { - operationIns.params[2].value.a = in_operation_param3_value_a; - operationIns.params[2].value.b = in_operation_param3_value_b; - - break; - } - - case TEEC_MEMREF_TEMP_INPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if ( - in_buffer3 != NULL && - in_buffer3_size > 0 - ) - { - uint32_t buffer3_temp_size; - buffer3_temp_size = in_buffer3_size; - buffer3_temp = (uint8_t *) malloc(buffer3_temp_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer3_size; isize++) - { - buffer3_temp[isize] = (uint8_t)(in_buffer3[isize] & 0x000000ff); - } - - operationIns.params[2].tmpref.buffer = (void *) buffer3_temp; - operationIns.params[2].tmpref.size = buffer3_temp_size; - } - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - { - if ( - in_operation_param3_tmpref_size > 0 - ) - { - buffer3_temp = (uint8_t *) malloc(in_operation_param3_tmpref_size * sizeof(uint8_t)); - operationIns.params[2].tmpref.buffer = (void *) buffer3_temp; - operationIns.params[2].tmpref.size = in_operation_param3_tmpref_size; - } - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - switch (in_operation_param3_memref_parent_flag) - { - case TEEC_MEM_INPUT: - case TEEC_MEM_INOUT: - { - if ( - in_buffer3 != NULL && - in_buffer3_size > 0 - ) - { - memset(&shareBuffer3, 0, sizeof(shareBuffer3)); - shareBuffer3.size = in_buffer3_size; - shareBuffer3.flags = in_operation_param3_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer3); - if (retASM) - { - printf("alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb3AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - memset(shareBuffer3.buffer, 0, shareBuffer3.size); - for (int isize = 0; isize < in_buffer3_size; isize++) - { - *((uint8_t * )(shareBuffer3.buffer) + isize) = - (uint8_t)(in_buffer3[isize] & 0x000000ff); - } - operationIns.params[2].memref.parent = &shareBuffer3; - // operationIns.params[2].memref.parent->flags = - // in_operation_param3_memref_parent_flag; - operationIns.params[2].memref.size = shareBuffer3.size; - } - } - - break; - } - - case TEEC_MEM_OUTPUT: - { - if ( - in_operation_param3_memref_size > 0 - ) - { - memset(&shareBuffer3, 0, sizeof(shareBuffer3)); - shareBuffer3.size = in_operation_param3_memref_size; - shareBuffer3.flags = in_operation_param3_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer3); - if (retASM) - { - printf("alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb3AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - operationIns.params[2].memref.parent = &shareBuffer3; - // operationIns.params[2].memref.parent->flags = - // in_operation_param3_memref_parent_flag; - operationIns.params[2].memref.size = shareBuffer3.size; - } - - } - - break; - } - - default: - break; - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_INPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if ( - in_buffer3 != NULL && - in_buffer3_size > 0 - ) - { - memset(&shareBuffer3, 0, sizeof(shareBuffer3)); - shareBuffer3.size = in_buffer3_size; - shareBuffer3.flags = in_operation_param3_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer3); - if (retASM) - { - printf("Alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb3AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - memset(shareBuffer3.buffer, 0, shareBuffer3.size); - for (int isize = 0; isize < in_buffer3_size; isize++) - { - *((uint8_t * )(shareBuffer3.buffer) + isize) = - (uint8_t)(in_buffer3[isize] & 0x000000ff); - } - operationIns.params[2].memref.parent = &shareBuffer3; - operationIns.params[2].memref.offset = in_operation_param3_memref_offset; - operationIns.params[2].memref.size = in_operation_param3_memref_size; - } - } - - break; - } - - case TEEC_MEMREF_PARTIAL_OUTPUT: - { - if (in_operation_param3_memref_size > 0) - { - memset(&shareBuffer3, 0, sizeof(shareBuffer3)); - shareBuffer3.size = in_buffer3_size; - shareBuffer3.flags = in_operation_param3_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer3); - if (retASM) - { - printf("Alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb3AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - operationIns.params[2].memref.parent = &shareBuffer3; - operationIns.params[2].memref.offset = in_operation_param3_memref_offset; - operationIns.params[2].memref.size = in_operation_param3_memref_size; - } - - } - - break; - } - - - default: - break; - } - - ///////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////// - - uint8_t *buffer4_temp = NULL; - TEEC_SharedMemory shareBuffer4; - bool sb4AllReged = false; - switch ( - TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 3) - ) - { - case TEEC_VALUE_INPUT: - case TEEC_VALUE_INOUT: - { - operationIns.params[3].value.a = in_operation_param4_value_a; - operationIns.params[3].value.b = in_operation_param4_value_b; - - break; - } - - case TEEC_MEMREF_TEMP_INPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if ( - in_buffer4 != NULL && - in_buffer4_size > 0 - ) - { - uint32_t buffer4_temp_size; - buffer4_temp_size = in_buffer4_size; - buffer4_temp = (uint8_t *) malloc(buffer4_temp_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer4_size; isize++) - { - buffer4_temp[isize] = (uint8_t)(in_buffer4[isize] & 0x000000ff); - } - - operationIns.params[3].tmpref.buffer = (void *) buffer4_temp; - operationIns.params[3].tmpref.size = buffer4_temp_size; - } - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - { - if ( - in_operation_param4_tmpref_size > 0 - ) - { - buffer4_temp = (uint8_t *) malloc(in_operation_param4_tmpref_size * sizeof(uint8_t)); - operationIns.params[3].tmpref.buffer = (void *) buffer4_temp; - operationIns.params[3].tmpref.size = in_operation_param4_tmpref_size; - } - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - switch (in_operation_param4_memref_parent_flag) - { - case TEEC_MEM_INPUT: - case TEEC_MEM_INOUT: - { - if ( - in_buffer4 != NULL && - in_buffer4_size > 0 - ) - { - memset(&shareBuffer4, 0, sizeof(shareBuffer4)); - shareBuffer4.size = in_buffer4_size; - shareBuffer4.flags = in_operation_param4_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer4); - if (retASM) - { - printf("alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb4AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - memset(shareBuffer4.buffer, 0, shareBuffer4.size); - for (int isize = 0; isize < in_buffer4_size; isize++) - { - *((uint8_t * )(shareBuffer4.buffer) + isize) = - (uint8_t)(in_buffer4[isize] & 0x000000ff); - } - operationIns.params[3].memref.parent = &shareBuffer4; - // operationIns.params[3].memref.parent->flags = - // in_operation_param4_memref_parent_flag; - operationIns.params[3].memref.size = shareBuffer4.size; - } - } - - break; - } - - case TEEC_MEM_OUTPUT: - { - if ( - in_operation_param4_memref_size > 0 - ) - { - memset(&shareBuffer4, 0, sizeof(shareBuffer4)); - shareBuffer4.size = in_operation_param4_memref_size; - shareBuffer4.flags = in_operation_param4_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer4); - if (retASM) - { - printf("alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb4AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - operationIns.params[3].memref.parent = &shareBuffer4; - // operationIns.params[3].memref.parent->flags = - // in_operation_param4_memref_parent_flag; - operationIns.params[3].memref.size = shareBuffer4.size; - } - - } - - break; - } - - default: - break; - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_INPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if ( - in_buffer4 != NULL && - in_buffer4_size > 0 - ) - { - memset(&shareBuffer4, 0, sizeof(shareBuffer4)); - shareBuffer4.size = in_buffer4_size; - shareBuffer4.flags = in_operation_param4_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer4); - if (retASM) - { - printf("Alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb4AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - memset(shareBuffer4.buffer, 0, shareBuffer4.size); - for (int isize = 0; isize < in_buffer4_size; isize++) - { - *((uint8_t * )(shareBuffer4.buffer) + isize) = - (uint8_t)(in_buffer4[isize] & 0x000000ff); - } - operationIns.params[3].memref.parent = &shareBuffer4; - operationIns.params[3].memref.offset = in_operation_param4_memref_offset; - operationIns.params[3].memref.size = in_operation_param4_memref_size; - } - } - - break; - } - - case TEEC_MEMREF_PARTIAL_OUTPUT: - { - if (in_operation_param4_memref_size > 0) - { - memset(&shareBuffer4, 0, sizeof(shareBuffer4)); - shareBuffer4.size = in_buffer4_size; - shareBuffer4.flags = in_operation_param4_memref_parent_flag; - TEEC_Result retASM = 0; - retASM = TEEC_AllocateSharedMemory(contextIns, &shareBuffer4); - if (retASM) - { - printf("Alloc share memory failed, ret=0x%x.\n", retASM); - teecresult = retASM; - } else - { - sb4AllReged = true; - printf("TEEC_AllocateSharedMemory succecced. \n"); - operationIns.params[3].memref.parent = &shareBuffer4; - operationIns.params[3].memref.offset = in_operation_param4_memref_offset; - operationIns.params[3].memref.size = in_operation_param4_memref_size; - } - - } - - break; - } - - - default: - break; - } - - ///////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////// - - if (teecresult != TEEC_SUCCESS) - { - sessionid = 0; - serviceid_timelow = 0; - serviceid_timemid = 0; - serviceid_timehiandver = 0; - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode = NULL; - serviceid_clockseqandnode_outsize = 0; - opscnt = 0; - head_next = 0; - head_prev = 0; - context = 0; - - started = 0; - paramtypes = 0; - - operation_param1_tmpref_buffer = 0; - operation_param1_tmpref_size = 0; - operation_param1_memref_parent = 0; - operation_param1_memref_parent_flag = 0; - operation_param1_memref_size = 0; - operation_param1_memref_offset = 0; - operation_param1_value_a = 0; - operation_param1_value_b = 0; - operation_param1_ionref_ionsharefd = 0; - operation_param1_ionref_ionsize = 0; - - operation_param2_tmpref_buffer = 0; - operation_param2_tmpref_size = 0; - operation_param2_memref_parent = 0; - operation_param2_memref_parent_flag = 0; - operation_param2_memref_size = 0; - operation_param2_memref_offset = 0; - operation_param2_value_a = 0; - operation_param2_value_b = 0; - operation_param2_ionref_ionsharefd = 0; - operation_param2_ionref_ionsize = 0; - - operation_param3_tmpref_buffer = 0; - operation_param3_tmpref_size = 0; - operation_param3_memref_parent = 0; - operation_param3_memref_parent_flag = 0; - operation_param3_memref_size = 0; - operation_param3_memref_offset = 0; - operation_param3_value_a = 0; - operation_param3_value_b = 0; - operation_param3_ionref_ionsharefd = 0; - operation_param3_ionref_ionsize = 0; - - operation_param4_tmpref_buffer = 0; - operation_param4_tmpref_size = 0; - operation_param4_memref_parent = 0; - operation_param4_memref_parent_flag = 0; - operation_param4_memref_size = 0; - operation_param4_memref_offset = 0; - operation_param4_value_a = 0; - operation_param4_value_b = 0; - operation_param4_ionref_ionsharefd = 0; - operation_param4_ionref_ionsize = 0; - - operation_session = 0; - operation_cancelflag = 0; - - returnorigin = 0xff; - - buffer1_realsize = 0; - buffer1 = NULL; - buffer1_outsize = 0; - buffer2_realsize = 0; - buffer2 = NULL; - buffer2_outsize = 0; - buffer3_realsize = 0; - buffer3 = NULL; - buffer3_outsize = 0; - buffer4_realsize = 0; - buffer4 = NULL; - buffer4_outsize = 0; - } else - { //start of the input parameter operation success -#if 0 - operationIns.params[0].ionref.ion_share_fd = in_operation_param1_ionref_ionsharefd; - operationIns.params[0].ionref.ion_size = in_operation_param1_ionref_ionsize; - - operationIns.params[1].ionref.ion_share_fd = in_operation_param2_ionref_ionsharefd; - operationIns.params[1].ionref.ion_size = in_operation_param2_ionref_ionsize; - - operationIns.params[2].ionref.ion_share_fd = in_operation_param3_ionref_ionsharefd; - operationIns.params[2].ionref.ion_size = in_operation_param3_ionref_ionsize; - - operationIns.params[3].ionref.ion_share_fd = in_operation_param4_ionref_ionsharefd; - operationIns.params[3].ionref.ion_size = in_operation_param4_ionref_ionsize; -#endif - - operationIns.session = sessionIns; - operationIns.cancel_flag = in_operation_cancelflag; - - uint32_t origin; - origin = in_returnorigin; - - TEEC_Result result; - - struct timeval start, end; - gettimeofday(&start, NULL); - result = - TEEC_InvokeCommand( - sessionIns, - in_commandid, - &operationIns, - &origin - ); - gettimeofday(&end, NULL); - uint32_t cost = 0; - cost += (1000000 * end.tv_sec + end.tv_usec) - (1000000 * start.tv_sec + start.tv_usec); - - if (result != TEEC_SUCCESS) - { - printf("Teec InvokeCommand Failed. \n"); - printf(" teecresult = 0x %8.8x.\n", result); - - teecresult = result; - - sessionid = 0; - serviceid_timelow = 0; - serviceid_timemid = 0; - serviceid_timehiandver = 0; - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode = NULL; - serviceid_clockseqandnode_outsize = 0; - opscnt = 0; - head_next = 0; - head_prev = 0; - context = 0; - - started = 0; - paramtypes = 0; - - operation_param1_tmpref_buffer = 0; - operation_param1_tmpref_size = 0; - operation_param1_memref_parent = 0; - operation_param1_memref_parent_flag = 0; - operation_param1_memref_size = 0; - operation_param1_memref_offset = 0; - operation_param1_value_a = 0; - operation_param1_value_b = 0; - operation_param1_ionref_ionsharefd = 0; - operation_param1_ionref_ionsize = 0; - - operation_param2_tmpref_buffer = 0; - operation_param2_tmpref_size = 0; - operation_param2_memref_parent = 0; - operation_param2_memref_parent_flag = 0; - operation_param2_memref_size = 0; - operation_param2_memref_offset = 0; - operation_param2_value_a = 0; - operation_param2_value_b = 0; - operation_param2_ionref_ionsharefd = 0; - operation_param2_ionref_ionsize = 0; - - operation_param3_tmpref_buffer = 0; - operation_param3_tmpref_size = 0; - operation_param3_memref_parent = 0; - operation_param3_memref_parent_flag = 0; - operation_param3_memref_size = 0; - operation_param3_memref_offset = 0; - operation_param3_value_a = 0; - operation_param3_value_b = 0; - operation_param3_ionref_ionsharefd = 0; - operation_param3_ionref_ionsize = 0; - - operation_param4_tmpref_buffer = 0; - operation_param4_tmpref_size = 0; - operation_param4_memref_parent = 0; - operation_param4_memref_parent_flag = 0; - operation_param4_memref_size = 0; - operation_param4_memref_offset = 0; - operation_param4_value_a = 0; - operation_param4_value_b = 0; - operation_param4_ionref_ionsharefd = 0; - operation_param4_ionref_ionsize = 0; - - operation_session = 0; - operation_cancelflag = 0; - - returnorigin = 0xff; - - buffer1_realsize = 0; - buffer1 = NULL; - buffer1_outsize = 0; - buffer2_realsize = 0; - buffer2 = NULL; - buffer2_outsize = 0; - buffer3_realsize = 0; - buffer3 = NULL; - buffer3_outsize = 0; - buffer4_realsize = 0; - buffer4 = NULL; - buffer4_outsize = 0; - } else - { // start of the invoke command success - printf("Teec InvokeCommand Succed, cost time: %ld us \n", cost); - - teecresult = result; - - sessionid = sessionIns->session_id; - serviceid_timelow = sessionIns->service_id.timeLow; - serviceid_timemid = sessionIns->service_id.timeMid; - serviceid_timehiandver = sessionIns->service_id.timeHiAndVersion; - if (sessionIns->service_id.clockSeqAndNode != NULL) - { - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (dbus_uint32_t *) malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - for (int iind = 0; iind < 8; iind++) - { - uint8_t u8Temp; - u8Temp = sessionIns->service_id.clockSeqAndNode[iind]; - serviceid_clockseqandnode[iind] = (dbus_uint32_t) u8Temp; - } - serviceid_clockseqandnode_outsize = 8; - } else - { - serviceid_clockseqandnode_realsize = 0; - serviceid_clockseqandnode = NULL; - serviceid_clockseqandnode_outsize = 0; - } - opscnt = sessionIns->ops_cnt; - head_next = (dbus_uint64_t) sessionIns->head.next; - head_prev = (dbus_uint64_t) sessionIns->head.prev; - context = (dbus_uint64_t) sessionIns->context; - - started = operationIns.started; - paramtypes = operationIns.paramTypes; - - ////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////// - - switch ( - TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 0) - ) - { - case TEEC_VALUE_INOUT: - case TEEC_VALUE_OUTPUT: - { - operation_param1_value_a = operationIns.params[0].value.a; - operation_param1_value_b = operationIns.params[0].value.b; - - buffer1_realsize = 0; - buffer1 = NULL; - buffer1_outsize = 0; - - break; - } - - case TEEC_MEMREF_TEMP_INOUT: - case TEEC_MEMREF_TEMP_OUTPUT: - { - if (operationIns.params[0].tmpref.buffer != NULL && - operationIns.params[0].tmpref.size > 0 - ) - { - buffer1_realsize = operationIns.params[0].tmpref.size; - buffer1 = - (dbus_uint32_t *) malloc( - buffer1_realsize * sizeof(dbus_uint32_t) - ); - for (int iind = 0; iind < buffer1_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * )(operationIns.params[0].tmpref.buffer) + iind); - buffer1[iind] = (dbus_uint32_t) u8Temp; - } - buffer1_outsize = buffer1_realsize; - } else - { - buffer1_realsize = 0; - buffer1 = NULL; - buffer1_outsize = 0; - } - - operation_param1_tmpref_buffer = (dbus_uint64_t) operationIns.params[0].tmpref.buffer; - operation_param1_tmpref_size = operationIns.params[0].tmpref.size; - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - switch (operationIns.params[0].memref.parent->flags) - { - case TEEC_MEM_OUTPUT: - case TEEC_MEM_INOUT: - { - - if (operationIns.params[0].memref.parent->buffer != NULL && - operationIns.params[0].memref.parent->size > 0 - ) - { - buffer1_realsize = operationIns.params[0].memref.parent->size; - buffer1 = - (dbus_uint32_t *) malloc( - buffer1_realsize * sizeof(dbus_uint32_t) - ); - for (int iind = 0; iind < buffer1_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * ) - (operationIns.params[0].memref.parent->buffer) + iind); - buffer1[iind] = (dbus_uint32_t) u8Temp; - } - buffer1_outsize = buffer1_realsize; - } else - { - buffer1_realsize = 0; - buffer1 = NULL; - buffer1_outsize = 0; - } - - operation_param1_memref_parent = - (dbus_uint64_t) operationIns.params[0].memref.parent->buffer; - operation_param1_memref_parent_flag = - (dbus_uint32_t) operationIns.params[0].memref.parent->flags; - operation_param1_memref_size = - operationIns.params[0].memref.parent->size; - - break; - } - - default: - break; - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operationIns.params[0].memref.parent->buffer != NULL && - operationIns.params[0].memref.parent->size > 0 - ) - { - buffer1_realsize = operationIns.params[0].memref.parent->size; - buffer1 = - (dbus_uint32_t *) malloc(buffer1_realsize * sizeof(dbus_uint32_t)); - for (int iind = 0; iind < buffer1_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * ) - (operationIns.params[0].memref.parent->buffer) + iind); - buffer1[iind] = (dbus_uint32_t) u8Temp; - } - buffer1_outsize = buffer1_realsize; - } else - { - buffer1_realsize = 0; - buffer1 = NULL; - buffer1_outsize = 0; - } - - operation_param1_memref_parent = - (dbus_uint64_t) operationIns.params[0].memref.parent->buffer; - operation_param1_memref_parent_flag = - (dbus_uint32_t) operationIns.params[0].memref.parent->flags; - operation_param1_memref_offset = operationIns.params[0].memref.offset; - operation_param1_memref_size = - operationIns.params[0].memref.size; - - break; - } - - - default: - { - buffer1_realsize = 0; - buffer1 = NULL; - buffer1_outsize = 0; - } - } - - operation_param1_ionref_ionsharefd = operationIns.params[0].ionref.ion_share_fd; - operation_param1_ionref_ionsize = operationIns.params[0].ionref.ion_size; - - ////////////////////////////////////////////////////////////////////////////////// - - switch ( - TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 1) - ) - { - case TEEC_VALUE_INOUT: - case TEEC_VALUE_OUTPUT: - { - operation_param2_value_a = operationIns.params[1].value.a; - operation_param2_value_b = operationIns.params[1].value.b; - - buffer2_realsize = 0; - buffer2 = NULL; - buffer2_outsize = 0; - - break; - } - - case TEEC_MEMREF_TEMP_INOUT: - case TEEC_MEMREF_TEMP_OUTPUT: - { - if (operationIns.params[1].tmpref.buffer != NULL && - operationIns.params[1].tmpref.size > 0 - ) - { - buffer2_realsize = operationIns.params[1].tmpref.size; - buffer2 = - (dbus_uint32_t *) malloc( - buffer2_realsize * sizeof(dbus_uint32_t) - ); - for (int iind = 0; iind < buffer2_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * )(operationIns.params[1].tmpref.buffer) + iind); - buffer2[iind] = (dbus_uint32_t) u8Temp; - } - buffer2_outsize = buffer2_realsize; - } else - { - buffer2_realsize = 0; - buffer2 = NULL; - buffer2_outsize = 0; - } - - operation_param2_tmpref_buffer = (dbus_uint64_t) operationIns.params[1].tmpref.buffer; - operation_param2_tmpref_size = operationIns.params[1].tmpref.size; - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - switch (operationIns.params[1].memref.parent->flags) - { - case TEEC_MEM_OUTPUT: - case TEEC_MEM_INOUT: - { - - if (operationIns.params[1].memref.parent->buffer != NULL && - operationIns.params[1].memref.parent->size > 0 - ) - { - buffer2_realsize = operationIns.params[1].memref.parent->size; - buffer2 = - (dbus_uint32_t *) malloc( - buffer2_realsize * sizeof(dbus_uint32_t) - ); - for (int iind = 0; iind < buffer2_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * ) - (operationIns.params[1].memref.parent->buffer) + iind); - buffer2[iind] = (dbus_uint32_t) u8Temp; - } - buffer2_outsize = buffer2_realsize; - } else - { - buffer2_realsize = 0; - buffer2 = NULL; - buffer2_outsize = 0; - } - - operation_param2_memref_parent = - (dbus_uint64_t) operationIns.params[1].memref.parent->buffer; - operation_param2_memref_parent_flag = - (dbus_uint32_t) operationIns.params[1].memref.parent->flags; - operation_param2_memref_size = - operationIns.params[1].memref.parent->size; - - break; - } - - default: - break; - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operationIns.params[1].memref.parent->buffer != NULL && - operationIns.params[1].memref.parent->size > 0 - ) - { - buffer2_realsize = operationIns.params[1].memref.parent->size; - buffer2 = - (dbus_uint32_t *) malloc(buffer2_realsize * sizeof(dbus_uint32_t)); - for (int iind = 0; iind < buffer2_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * ) - (operationIns.params[1].memref.parent->buffer) + iind); - buffer2[iind] = (dbus_uint32_t) u8Temp; - } - buffer2_outsize = buffer2_realsize; - } else - { - buffer2_realsize = 0; - buffer2 = NULL; - buffer2_outsize = 0; - } - - operation_param2_memref_parent = - (dbus_uint64_t) operationIns.params[1].memref.parent->buffer; - operation_param2_memref_parent_flag = - (dbus_uint32_t) operationIns.params[1].memref.parent->flags; - operation_param2_memref_offset = operationIns.params[1].memref.offset; - operation_param2_memref_size = - operationIns.params[1].memref.size; - - break; - } - - - default: - { - buffer2_realsize = 0; - buffer2 = NULL; - buffer2_outsize = 0; - } - } - - operation_param2_ionref_ionsharefd = operationIns.params[1].ionref.ion_share_fd; - operation_param2_ionref_ionsize = operationIns.params[1].ionref.ion_size; - - ////////////////////////////////////////////////////////////////////////////////// - - switch ( - TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 2) - ) - { - case TEEC_VALUE_INOUT: - case TEEC_VALUE_OUTPUT: - { - operation_param3_value_a = operationIns.params[2].value.a; - operation_param3_value_b = operationIns.params[2].value.b; - - buffer3_realsize = 0; - buffer3 = NULL; - buffer3_outsize = 0; - - break; - } - - case TEEC_MEMREF_TEMP_INOUT: - case TEEC_MEMREF_TEMP_OUTPUT: - { - if (operationIns.params[2].tmpref.buffer != NULL && - operationIns.params[2].tmpref.size > 0 - ) - { - buffer3_realsize = operationIns.params[2].tmpref.size; - buffer3 = - (dbus_uint32_t *) malloc( - buffer3_realsize * sizeof(dbus_uint32_t) - ); - for (int iind = 0; iind < buffer3_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * )(operationIns.params[2].tmpref.buffer) + iind); - buffer3[iind] = (dbus_uint32_t) u8Temp; - } - buffer3_outsize = buffer3_realsize; - } else - { - buffer3_realsize = 0; - buffer3 = NULL; - buffer3_outsize = 0; - } - - operation_param3_tmpref_buffer = (dbus_uint64_t) operationIns.params[2].tmpref.buffer; - operation_param3_tmpref_size = operationIns.params[2].tmpref.size; - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - switch (operationIns.params[2].memref.parent->flags) - { - case TEEC_MEM_OUTPUT: - case TEEC_MEM_INOUT: - { - - if (operationIns.params[2].memref.parent->buffer != NULL && - operationIns.params[2].memref.parent->size > 0 - ) - { - buffer3_realsize = operationIns.params[2].memref.parent->size; - buffer3 = - (dbus_uint32_t *) malloc( - buffer3_realsize * sizeof(dbus_uint32_t) - ); - for (int iind = 0; iind < buffer3_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * ) - (operationIns.params[2].memref.parent->buffer) + iind); - buffer3[iind] = (dbus_uint32_t) u8Temp; - } - buffer3_outsize = buffer3_realsize; - } else - { - buffer3_realsize = 0; - buffer3 = NULL; - buffer3_outsize = 0; - } - - operation_param3_memref_parent = - (dbus_uint64_t) operationIns.params[2].memref.parent->buffer; - operation_param3_memref_parent_flag = - (dbus_uint32_t) operationIns.params[2].memref.parent->flags; - operation_param3_memref_size = - operationIns.params[2].memref.parent->size; - - break; - } - - default: - break; - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operationIns.params[2].memref.parent->buffer != NULL && - operationIns.params[2].memref.parent->size > 0 - ) - { - buffer3_realsize = operationIns.params[2].memref.parent->size; - buffer3 = - (dbus_uint32_t *) malloc(buffer3_realsize * sizeof(dbus_uint32_t)); - for (int iind = 0; iind < buffer3_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * ) - (operationIns.params[2].memref.parent->buffer) + iind); - buffer3[iind] = (dbus_uint32_t) u8Temp; - } - buffer3_outsize = buffer3_realsize; - } else - { - buffer3_realsize = 0; - buffer3 = NULL; - buffer3_outsize = 0; - } - - operation_param3_memref_parent = - (dbus_uint64_t) operationIns.params[2].memref.parent->buffer; - operation_param3_memref_parent_flag = - (dbus_uint32_t) operationIns.params[2].memref.parent->flags; - operation_param3_memref_offset = operationIns.params[2].memref.offset; - operation_param3_memref_size = - operationIns.params[2].memref.size; - - break; - } - - - default: - { - buffer3_realsize = 0; - buffer3 = NULL; - buffer3_outsize = 0; - } - } - - operation_param3_ionref_ionsharefd = operationIns.params[2].ionref.ion_share_fd; - operation_param3_ionref_ionsize = operationIns.params[2].ionref.ion_size; - - ////////////////////////////////////////////////////////////////////////////////// - - switch ( - TEEC_PARAM_TYPE_GET(operationIns.paramTypes, 3) - ) - { - case TEEC_VALUE_INOUT: - case TEEC_VALUE_OUTPUT: - { - operation_param4_value_a = operationIns.params[3].value.a; - operation_param4_value_b = operationIns.params[3].value.b; - - buffer4_realsize = 0; - buffer4 = NULL; - buffer4_outsize = 0; - - break; - } - - case TEEC_MEMREF_TEMP_INOUT: - case TEEC_MEMREF_TEMP_OUTPUT: - { - if (operationIns.params[3].tmpref.buffer != NULL && - operationIns.params[3].tmpref.size > 0 - ) - { - buffer4_realsize = operationIns.params[3].tmpref.size; - buffer4 = - (dbus_uint32_t *) malloc( - buffer4_realsize * sizeof(dbus_uint32_t) - ); - for (int iind = 0; iind < buffer4_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * )(operationIns.params[3].tmpref.buffer) + iind); - buffer4[iind] = (dbus_uint32_t) u8Temp; - } - buffer4_outsize = buffer4_realsize; - } else - { - buffer4_realsize = 0; - buffer4 = NULL; - buffer4_outsize = 0; - } - - operation_param4_tmpref_buffer = (dbus_uint64_t) operationIns.params[3].tmpref.buffer; - operation_param4_tmpref_size = operationIns.params[3].tmpref.size; - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - switch (operationIns.params[3].memref.parent->flags) - { - case TEEC_MEM_OUTPUT: - case TEEC_MEM_INOUT: - { - - if (operationIns.params[3].memref.parent->buffer != NULL && - operationIns.params[3].memref.parent->size > 0 - ) - { - buffer4_realsize = operationIns.params[3].memref.parent->size; - buffer4 = - (dbus_uint32_t *) malloc( - buffer4_realsize * sizeof(dbus_uint32_t) - ); - for (int iind = 0; iind < buffer4_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * ) - (operationIns.params[3].memref.parent->buffer) + iind); - buffer4[iind] = (dbus_uint32_t) u8Temp; - } - buffer4_outsize = buffer4_realsize; - } else - { - buffer4_realsize = 0; - buffer4 = NULL; - buffer4_outsize = 0; - } - - operation_param4_memref_parent = - (dbus_uint64_t) operationIns.params[3].memref.parent->buffer; - operation_param4_memref_parent_flag = - (dbus_uint32_t) operationIns.params[3].memref.parent->flags; - operation_param4_memref_size = - operationIns.params[3].memref.parent->size; - - break; - } - - default: - break; - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operationIns.params[3].memref.parent->buffer != NULL && - operationIns.params[3].memref.parent->size > 0 - ) - { - buffer4_realsize = operationIns.params[3].memref.parent->size; - buffer4 = - (dbus_uint32_t *) malloc(buffer4_realsize * sizeof(dbus_uint32_t)); - for (int iind = 0; iind < buffer4_realsize; iind++) - { - uint8_t u8Temp; - u8Temp = (uint8_t) * ((uint8_t * ) - (operationIns.params[3].memref.parent->buffer) + iind); - buffer4[iind] = (dbus_uint32_t) u8Temp; - } - buffer4_outsize = buffer4_realsize; - } else - { - buffer4_realsize = 0; - buffer4 = NULL; - buffer4_outsize = 0; - } - - operation_param4_memref_parent = - (dbus_uint64_t) operationIns.params[3].memref.parent->buffer; - operation_param4_memref_parent_flag = - (dbus_uint32_t) operationIns.params[3].memref.parent->flags; - operation_param4_memref_offset = operationIns.params[3].memref.offset; - operation_param4_memref_size = - operationIns.params[3].memref.size; - - break; - } - - - default: - { - buffer4_realsize = 0; - buffer4 = NULL; - buffer4_outsize = 0; - } - } - - operation_param4_ionref_ionsharefd = operationIns.params[3].ionref.ion_share_fd; - operation_param4_ionref_ionsize = operationIns.params[3].ionref.ion_size; - - ////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////// - - operation_session = (dbus_uint64_t) operationIns.session; - operation_cancelflag = operationIns.cancel_flag; - - returnorigin = origin; - } - - if (buffer1_temp != NULL) - { - free(buffer1_temp); - } - if (buffer2_temp != NULL) - { - free(buffer2_temp); - } - if (buffer3_temp != NULL) - { - free(buffer3_temp); - } - if (buffer4_temp != NULL) - { - free(buffer4_temp); - } - - if (sb1AllReged == true) - { - TEEC_ReleaseSharedMemory(&shareBuffer1); - printf("TEEC_ReleaseSharedMemory. \n"); - } - - if (sb2AllReged == true) - { - TEEC_ReleaseSharedMemory(&shareBuffer2); - printf("TEEC_ReleaseSharedMemory. \n"); - } - - if (sb3AllReged == true) - { - TEEC_ReleaseSharedMemory(&shareBuffer3); - printf("TEEC_ReleaseSharedMemory. \n"); - } - - if (sb4AllReged == true) - { - TEEC_ReleaseSharedMemory(&shareBuffer4); - printf("TEEC_ReleaseSharedMemory. \n"); - } - - } // end of the invoke command success - - } // end of the input parameter operation success - - - ////////////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////////////////////// -#else - if (in_buffer1_size > 0) { - } - else - { - in_buffer1_realsize = 0; - } - if (in_buffer2_size > 0) { - } - else - { - in_buffer2_realsize = 0; - } - if (in_buffer3_size > 0) { - } - else - { - in_buffer3_realsize = 0; - } - if (in_buffer4_size > 0) { - } - else - { - in_buffer4_realsize = 0; - } - - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (dbus_uint32_t *)malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - uint32_t serviceid_clockseqandnode_outsize_temp; - uint32_t returnorigin_temp; - - uint32_t * buffer1_temp = NULL; - uint32_t buffer1_size = 4096; - uint32_t buffer1_outsize_temp; - buffer1_temp = - (uint32_t *)malloc( buffer1_size * sizeof(uint32_t) ); - - uint32_t buffer2_size = 4096; - uint32_t * buffer2_temp = NULL; - uint32_t buffer2_outsize_temp; - buffer2_temp = - (uint32_t *)malloc( buffer2_size * sizeof(uint32_t) ); - - uint32_t buffer3_size = 4096; - uint32_t * buffer3_temp = NULL; - uint32_t buffer3_outsize_temp; - buffer3_temp = - (uint32_t *)malloc( buffer3_size * sizeof(uint32_t) ); - - uint32_t buffer4_size = 4096; - uint32_t * buffer4_temp = NULL; - uint32_t buffer4_outsize_temp; - buffer4_temp = - (uint32_t *)malloc( buffer4_size * sizeof(uint32_t) ); - - char workername[1024]; - memset((char *)workername, 0, 1024); - int ifound = 0; - int iworker; - sin_t * sinIns; - - pthread_mutex_lock(mutex_workerrec); - for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) - { - if (workerrec[iworker].context_addr == in_session_context) - { - sinIns = NULL; - if (workerrec[iworker].first != NULL) - { - sinIns = workerrec[iworker].first; - do - { - if (sinIns->session_id == in_session_sessionid) - { - sprintf(workername, "%s%d", "gpworker", iworker); - ifound = 1; - break; - } - sinIns = sinIns->next; - }while (sinIns != NULL); - - if ( ifound == 1 ) - { - break; - } - } - } - } - pthread_mutex_unlock(mutex_workerrec); - - if (ifound == 0) - { - printf("Can't find the worker for the session and the context. \n"); - - teecresult = 0xAAAA0017; - - sessionid = 0x0; - serviceid_timelow = 0x0; - serviceid_timemid = 0x0; - serviceid_timehiandver = 0x0; - opscnt = 0x0; - head_next = 0x0; - head_prev = 0x0; - context = 0x0; - started = 0x0; - paramtypes = 0x0; - - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (dbus_uint32_t *)malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - for (int i = 0; i < serviceid_clockseqandnode_realsize ; i++) { - serviceid_clockseqandnode[i] = 0x0; - } - serviceid_clockseqandnode_outsize = 8; - - operation_param1_tmpref_buffer = 0x0; - operation_param1_tmpref_size = 0x0; - operation_param1_memref_parent = 0x0; - operation_param1_memref_size = 0x0; - operation_param1_memref_offset = 0x0; - operation_param1_value_a = 0x0; - operation_param1_value_b = 0x0; - operation_param1_ionref_ionsharefd = 0x0; - operation_param1_ionref_ionsize = 0x0; - - operation_param2_tmpref_buffer = 0x0; - operation_param2_tmpref_size = 0x0; - operation_param2_memref_parent = 0x0; - operation_param2_memref_size = 0x0; - operation_param2_memref_offset = 0x0; - operation_param2_value_a = 0x0; - operation_param2_value_b = 0x0; - operation_param2_ionref_ionsharefd = 0x0; - operation_param2_ionref_ionsize = 0x0; - - operation_param3_tmpref_buffer = 0x0; - operation_param3_tmpref_size = 0x0; - operation_param3_memref_parent = 0x0; - operation_param3_memref_size = 0x0; - operation_param3_memref_offset = 0x0; - operation_param3_value_a = 0x0; - operation_param3_value_b = 0x0; - operation_param3_ionref_ionsharefd = 0x0; - operation_param3_ionref_ionsize = 0x0; - - operation_param4_tmpref_buffer = 0x0; - operation_param4_tmpref_size = 0x0; - operation_param4_memref_parent = 0x0; - operation_param4_memref_size = 0x0; - operation_param4_memref_offset = 0x0; - operation_param4_value_a = 0x0; - operation_param4_value_b = 0x0; - operation_param4_ionref_ionsharefd = 0x0; - operation_param4_ionref_ionsize = 0x0; - - operation_session = 0x0; - operation_cancelflag = 0x0; - - returnorigin = 0x0; - - buffer1_realsize = 0; - buffer1_outsize = buffer1_realsize; - - buffer2_realsize = 0; - buffer2_outsize = buffer2_realsize; - - buffer3_realsize = 0; - buffer3_outsize = buffer3_realsize; - - buffer4_realsize = 0; - buffer4_outsize = buffer4_realsize; - } - else - { - method_call_teec_invokecommand( - workername, - - in_session_sessionid, - in_session_serviceid_timelow, - in_session_serviceid_timemid, - in_session_serviceid_timehiandver, - in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_realsize, - in_session_opscnt, - in_session_head_next, - in_session_head_prev, - in_session_context, - - in_commandid, - - in_operation_started, - in_operation_paramtypes, - - in_operation_param1_tmpref_buffer, - in_operation_param1_tmpref_size, - in_operation_param1_memref_parent, - in_operation_param1_memref_parent_flag, - in_operation_param1_memref_size, - in_operation_param1_memref_offset, - in_operation_param1_value_a, - in_operation_param1_value_b, - in_operation_param1_ionref_ionsharefd, - in_operation_param1_ionref_ionsize, - - in_operation_param2_tmpref_buffer, - in_operation_param2_tmpref_size, - in_operation_param2_memref_parent, - in_operation_param2_memref_parent_flag, - in_operation_param2_memref_size, - in_operation_param2_memref_offset, - in_operation_param2_value_a, - in_operation_param2_value_b, - in_operation_param2_ionref_ionsharefd, - in_operation_param2_ionref_ionsize, - - in_operation_param3_tmpref_buffer, - in_operation_param3_tmpref_size, - in_operation_param3_memref_parent, - in_operation_param3_memref_parent_flag, - in_operation_param3_memref_size, - in_operation_param3_memref_offset, - in_operation_param3_value_a, - in_operation_param3_value_b, - in_operation_param3_ionref_ionsharefd, - in_operation_param3_ionref_ionsize, - - in_operation_param4_tmpref_buffer, - in_operation_param4_tmpref_size, - in_operation_param4_memref_parent, - in_operation_param4_memref_parent_flag, - in_operation_param4_memref_size, - in_operation_param4_memref_offset, - in_operation_param4_value_a, - in_operation_param4_value_b, - in_operation_param4_ionref_ionsharefd, - in_operation_param4_ionref_ionsize, - - in_operation_session, - in_operation_cancelflag, - - in_returnorigin, - - in_buffer1, - in_buffer1_realsize, - in_buffer2, - in_buffer2_realsize, - in_buffer3, - in_buffer3_realsize, - in_buffer4, - in_buffer4_realsize, - - - &teecresult, - - &sessionid, - &serviceid_timelow, - &serviceid_timemid, - &serviceid_timehiandver, - serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize, - &serviceid_clockseqandnode_outsize_temp, - - &opscnt, - &head_next, - &head_prev, - &context, - - &started, - ¶mtypes, - - &operation_param1_tmpref_buffer, - &operation_param1_tmpref_size, - &operation_param1_memref_parent, - &operation_param1_memref_parent_flag, - &operation_param1_memref_size, - &operation_param1_memref_offset, - &operation_param1_value_a, - &operation_param1_value_b, - &operation_param1_ionref_ionsharefd, - &operation_param1_ionref_ionsize, - - &operation_param2_tmpref_buffer, - &operation_param2_tmpref_size, - &operation_param2_memref_parent, - &operation_param2_memref_parent_flag, - &operation_param2_memref_size, - &operation_param2_memref_offset, - &operation_param2_value_a, - &operation_param2_value_b, - &operation_param2_ionref_ionsharefd, - &operation_param2_ionref_ionsize, - - &operation_param3_tmpref_buffer, - &operation_param3_tmpref_size, - &operation_param3_memref_parent, - &operation_param3_memref_parent_flag, - &operation_param3_memref_size, - &operation_param3_memref_offset, - &operation_param3_value_a, - &operation_param3_value_b, - &operation_param3_ionref_ionsharefd, - &operation_param3_ionref_ionsize, - - &operation_param4_tmpref_buffer, - &operation_param4_tmpref_size, - &operation_param4_memref_parent, - &operation_param4_memref_parent_flag, - &operation_param4_memref_size, - &operation_param4_memref_offset, - &operation_param4_value_a, - &operation_param4_value_b, - &operation_param4_ionref_ionsharefd, - &operation_param4_ionref_ionsize, - - &operation_session, - &operation_cancelflag, - - &returnorigin_temp, - - buffer1_temp, - buffer1_size, - &buffer1_outsize_temp, - buffer2_temp, - buffer2_size, - &buffer2_outsize_temp, - buffer3_temp, - buffer3_size, - &buffer3_outsize_temp, - buffer4_temp, - buffer4_size, - &buffer4_outsize_temp - ); - - serviceid_clockseqandnode_outsize = - serviceid_clockseqandnode_outsize_temp; - - returnorigin = returnorigin_temp; - - buffer1_outsize = buffer1_outsize_temp; - buffer2_outsize = buffer2_outsize_temp; - buffer3_outsize = buffer3_outsize_temp; - buffer4_outsize = buffer4_outsize_temp; - - buffer1_realsize = buffer1_outsize; - if (buffer1_realsize > 0) - { - buffer1 = - (dbus_uint32_t *)malloc( - buffer1_realsize * sizeof(dbus_uint32_t) - ); - for (int i = 0; i < buffer1_realsize ; i++) { - buffer1[i] = (dbus_uint32_t)buffer1_temp[i]; - } - } - - buffer2_realsize = buffer2_outsize; - if (buffer2_realsize > 0) - { - buffer2 = - (dbus_uint32_t *)malloc( - buffer2_realsize * sizeof(dbus_uint32_t) - ); - for (int i = 0; i < buffer2_realsize ; i++) { - buffer2[i] = (dbus_uint32_t)buffer2_temp[i]; - } - } - - buffer3_realsize = buffer3_outsize; - if (buffer3_realsize > 0) - { - buffer3 = - (dbus_uint32_t *)malloc( - buffer3_realsize * sizeof(dbus_uint32_t) - ); - for (int i = 0; i < buffer3_realsize ; i++) { - buffer3[i] = (dbus_uint32_t)buffer3_temp[i]; - } - } - - buffer4_realsize = buffer4_outsize; - if (buffer4_realsize > 0) - { - buffer4 = - (dbus_uint32_t *)malloc( - buffer4_realsize * sizeof(dbus_uint32_t) - ); - for (int i = 0; i < buffer4_realsize ; i++) { - buffer4[i] = (dbus_uint32_t)buffer4_temp[i]; - } - } - - } // end of the else found == 1 - - if ( buffer1_temp != NULL ) - { - free(buffer1_temp); - } - if ( buffer2_temp != NULL ) - { - free(buffer2_temp); - } - if ( buffer3_temp != NULL ) - { - free(buffer3_temp); - } - if ( buffer4_temp != NULL ) - { - free(buffer4_temp); - } -#endif - /////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////// - - // create a reply from the message - reply = dbus_message_new_method_return(msg); - - - // add the arguments to the reply - dbus_message_iter_init_append(reply, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &teecresult - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &sessionid - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_timelow - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_timemid - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_timehiandver - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &serviceid_clockseqandnode_outsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (serviceid_clockseqandnode_outsize > 0 && - serviceid_clockseqandnode != NULL - ) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize - ); - - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return NULL; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &opscnt - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &head_next - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &head_prev - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &context - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &started - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - ¶mtypes - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param1_tmpref_buffer - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_tmpref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param1_memref_parent - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_memref_parent_flag - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_memref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_memref_offset - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_value_a - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_value_b - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &operation_param1_ionref_ionsharefd - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param1_ionref_ionsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param2_tmpref_buffer - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_tmpref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param2_memref_parent - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_memref_parent_flag - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_memref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_memref_offset - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_value_a - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_value_b - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &operation_param2_ionref_ionsharefd - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param2_ionref_ionsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param3_tmpref_buffer - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_tmpref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param3_memref_parent - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_memref_parent_flag - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_memref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_memref_offset - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_value_a - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_value_b - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &operation_param3_ionref_ionsharefd - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param3_ionref_ionsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param4_tmpref_buffer - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_tmpref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_param4_memref_parent - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_memref_parent_flag - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_memref_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_memref_offset - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_value_a - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_value_b - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &operation_param4_ionref_ionsharefd - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &operation_param4_ionref_ionsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &operation_session - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &operation_cancelflag - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &returnorigin - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &buffer1_outsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (buffer1_outsize > 0 && - buffer1 != NULL - ) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &buffer1, - buffer1_realsize - ); - - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return NULL; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &buffer2_outsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (buffer2_outsize > 0 && - buffer2 != NULL - ) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &buffer2, - buffer2_realsize - ); - - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return NULL; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &buffer3_outsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (buffer3_outsize > 0 && - buffer3 != NULL - ) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &buffer3, - buffer3_realsize - ); - - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return NULL; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &buffer4_outsize - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - if (buffer4_outsize > 0 && - buffer4 != NULL - ) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &buffer4, - buffer4_realsize - ); - - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return NULL; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - // send the reply && flush the connection - serial = 100; - if (!dbus_connection_send(conn, reply, &serial)) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - free(thdfargs); - return NULL; - } - - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - // dbus_connection_close(conn); - // dbus_connection_unref(conn); - free(thdfargs); - - // sleep(2); - - return NULL; -} - - -#ifdef GP_PROXY - void* -session_timeout_process ( - void* thdfargs -) -{ - DBusMsgConn* DBusMCP; - pthread_mutex_t * mutex_workerrec; - wr_t * workerrec; - - DBusMCP = (DBusMsgConn*)thdfargs; - mutex_workerrec = DBusMCP->mutex_workerrec; - workerrec = DBusMCP->workerrec; - - struct timeval tv; - uint64_t u64time; - - char workername[1024]; - memset((char *)workername, 0, 1024); - int iworker; - - dbus_uint32_t in_session_seesionid; - dbus_uint32_t in_session_serviceid_timelow = 0; - dbus_uint32_t in_session_serviceid_timemid = 0; - dbus_uint32_t in_session_serviceid_timehiandver = 0; - dbus_uint32_t in_session_serviceid_clockseqandnode_size = 8; - dbus_uint32_t in_session_serviceid_clockseqandnode[8]; - dbus_uint32_t in_session_opscnt = 0; - dbus_uint64_t in_session_head_next = 0; - dbus_uint64_t in_session_head_prev = 0; - dbus_uint64_t in_session_context; - - dbus_uint32_t seesionid; - dbus_uint32_t serviceid_timelow; - dbus_uint32_t serviceid_timemid; - dbus_uint32_t serviceid_timehiandver; - dbus_uint32_t * serviceid_clockseqandnode; - int serviceid_clockseqandnode_realsize; - dbus_uint32_t opscnt; - dbus_uint64_t head_next; - dbus_uint64_t head_prev; - dbus_uint64_t context; - - sin_t * sinIns; - - while (1) - { - sleep(TIMEDOUT_SESSION); - - pthread_mutex_lock(mutex_workerrec); - for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) - { - if (workerrec[iworker].busy == 1) - { - sinIns = NULL; - if (workerrec[iworker].first != NULL) - { - sinIns = workerrec[iworker].first; - do - { - gettimeofday(&tv, NULL); - u64time = (long unsigned int)(tv.tv_sec - - sinIns->session_createtime.tv_sec - ); - sin_t * sinTemp = NULL; - - if (u64time > TIMEDOUT_SESSION) - { - sprintf(workername, "%s%d", "gpworker", iworker); - - in_session_seesionid = sinIns->session_id; - in_session_context = workerrec[iworker].context_addr; - - for (int iind = 0; iind < 8; iind++) - { - in_session_serviceid_clockseqandnode[iind] = 0; - } - - pthread_mutex_unlock(mutex_workerrec); - - uint32_t serviceid_clockseqandnode_outsize_temp; - serviceid_clockseqandnode_realsize = 8; - serviceid_clockseqandnode = - (dbus_uint32_t *)malloc( - serviceid_clockseqandnode_realsize * sizeof(dbus_uint32_t) - ); - - printf("\nMethod call teec closesession. (Called by Proxy for timeout process) \n"); - method_call_teec_closesession( - workername, - - in_session_seesionid, - in_session_serviceid_timelow, - in_session_serviceid_timemid, - in_session_serviceid_timehiandver, - in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_size, - in_session_opscnt, - in_session_head_next, - in_session_head_prev, - in_session_context, - - &seesionid, - &serviceid_timelow, - &serviceid_timemid, - &serviceid_timehiandver, - serviceid_clockseqandnode, - serviceid_clockseqandnode_realsize, - &serviceid_clockseqandnode_outsize_temp, - &opscnt, - &head_next, - &head_prev, - &context - ); - - if (serviceid_clockseqandnode != NULL) { - free(serviceid_clockseqandnode); - } - - pthread_mutex_lock(mutex_workerrec); - - sinTemp = sinIns->prev; - if (sinTemp != NULL) - { - sinTemp->next = sinIns->next; - } - sinTemp = sinIns->next; - if (sinTemp != NULL) - { - sinTemp->prev = sinIns->prev; - } - if (workerrec[iworker].last == sinIns) - { - workerrec[iworker].last = sinIns->prev; - } - if (workerrec[iworker].first == sinIns) - { - workerrec[iworker].first = sinIns->next; - } - - // free(sinIns); - sinTemp = sinIns; - workerrec[iworker].sessionid_count = - workerrec[iworker].sessionid_count - 1; - - } // end of if timedout - sinIns = sinIns->next; - if (sinTemp != NULL) - { - free(sinTemp); - } - }while (sinIns != NULL); - - - } // end of the first not null - } // end of the busy = 1 - } // end of the for iworker - pthread_mutex_unlock(mutex_workerrec); - - } // end of while 1 - - - free(thdfargs); - return NULL; -} - - -void* -context_timeout_process ( - void* thdfargs -) -{ - DBusMsgConn* DBusMCP; - pthread_mutex_t * mutex_workerrec; - pthread_cond_t * cond_notbusy; - wr_t * workerrec; - - DBusMCP = (DBusMsgConn*)thdfargs; - mutex_workerrec = DBusMCP->mutex_workerrec; - cond_notbusy = DBusMCP->cond_notbusy; - workerrec = DBusMCP->workerrec; - - - - struct timeval tv; - uint64_t u64time; - - char workername[1024]; - memset((char *)workername, 0, 1024); - int iworker; - - dbus_int32_t in_fd; - unsigned char * in_ta_path = NULL; - dbus_int32_t in_ta_path_size = 0; - dbus_uint64_t in_session_list_next = 0; - dbus_uint64_t in_session_list_prev = 0; - dbus_uint64_t in_shrd_mem_list_next = 0; - dbus_uint64_t in_shrd_mem_list_prev = 0; - dbus_uint64_t in_share_buffer_buffer = 0; - dbus_int64_t in_share_buffer_buffer_barrier = 0; - dbus_uint64_t in_context_addr; - - dbus_int32_t fd; - unsigned char * ta_path; - dbus_int32_t ta_path_size; - dbus_uint64_t session_list_next; - dbus_uint64_t session_list_prev; - dbus_uint64_t shrd_mem_list_next; - dbus_uint64_t shrd_mem_list_prev; - dbus_uint64_t share_buffer_buffer; - dbus_int64_t share_buffer_buffer_barrier; - uint32_t context_tapath_outsize; - - while(1) - { - sleep(TIMEDOUT_CONTEXT); - - pthread_mutex_lock(mutex_workerrec); - for (iworker = 0; iworker < MAX_NUM_WORKER; iworker++) - { - if (workerrec[iworker].busy == 1) - { - sprintf(workername, "%s%d", "gpworker", iworker); - gettimeofday(&tv, NULL); - u64time = (long unsigned int)(tv.tv_sec - - workerrec[iworker].context_createtime.tv_sec - ); - if (u64time > TIMEDOUT_CONTEXT - && - workerrec[iworker].sessionid_count == 0 - ) - { - in_fd = workerrec[iworker].context_fd; - in_context_addr = workerrec[iworker].context_addr; - ta_path = (unsigned char *)malloc(1024 * sizeof(char)); - ta_path_size = 1024; - memset((char *)ta_path, 0, 1024); - - pthread_mutex_unlock(mutex_workerrec); - - printf("\nMethod call teec fincont. (Called by Proxy for timeout process) \n"); - method_call_teec_fincont( - workername, - - in_fd, - in_ta_path, - in_ta_path_size, - in_session_list_next, - in_session_list_prev, - in_shrd_mem_list_next, - in_shrd_mem_list_prev, - in_share_buffer_buffer, - in_share_buffer_buffer_barrier, - in_context_addr, - - &fd, - ta_path, - ta_path_size, - &session_list_next, - &session_list_prev, - &shrd_mem_list_next, - &shrd_mem_list_prev, - &share_buffer_buffer, - &share_buffer_buffer_barrier, - - &context_tapath_outsize - ); - - if (ta_path != NULL) - { - free(ta_path); - } - - pthread_mutex_lock(mutex_workerrec); - - workerrec[iworker].busy = 0; - pthread_cond_signal(cond_notbusy); - workerrec[iworker].context_fd = 0; - workerrec[iworker].context_addr = 0xffffffff; - workerrec[iworker].sessionid_count = 0; - sin_t * sinIns; - sin_t * sinInsPrev; - sinIns = workerrec[iworker].last; - if (sinIns != NULL) - { - for ( ; ; ) - { - sinInsPrev = sinIns->prev; - free(sinIns); - sinIns = sinInsPrev; - if (sinIns == NULL) - { - break; - } - } - } - - } // end of the if timeed out - } // end of the if busy = 1 - } // end of the for iworker - pthread_mutex_unlock(mutex_workerrec); - - } // end of while 1 - - free(thdfargs); - return NULL; -} -#endif - - -void * -reply_to_method_call_destroy_threadpool( - DBusMessage *msg, - DBusConnection *conn, - threadpool_t *pool -#ifdef GP_WORKER - , - pthread_mutex_t *mutex_tcl, - pthread_mutex_t *mutex_tsl -#endif - -#ifdef GP_PROXY - , - pthread_mutex_t * mutex_workerrec, - pthread_cond_t * cond_notbusy -#endif -) -{ - DBusMessage *reply; - DBusMessageIter args; - // char* param = ""; - char *param = NULL; - dbus_bool_t bResult; - dbus_uint32_t retcode; - dbus_uint32_t serial = 0; - - // read the arguments - if (!dbus_message_iter_init(msg, &args)) - fprintf(stderr, "Message has no arguments!\n"); - else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) - fprintf(stderr, "Argument is not string!\n"); - else - dbus_message_iter_get_basic(&args, ¶m); - - printf("\n"); - printf("Received mechod call Destroy: \n"); - printf(" param = %s \n", param); - printf("\n"); - - // create a reply from the message - reply = dbus_message_new_method_return(msg); - - retcode = 0x00; - - // add the arguments to the reply - dbus_message_iter_init_append(reply, &args); - bResult = - dbus_message_iter_append_basic( - &args, - DBUS_TYPE_UINT32, - &retcode - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return NULL; - } - - serial = 100; - if (!dbus_connection_send(conn, reply, &serial)) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return NULL; - } - - dbus_message_unref(reply); - dbus_connection_flush(conn); - dbus_message_unref(msg); - // dbus_connection_close(conn); - // dbus_connection_unref(conn); - - - threadpool_destroy(pool); - -#ifdef GP_WORKER - pthread_mutex_destroy(mutex_tcl); - pthread_mutex_destroy(mutex_tsl); -#endif - -#ifdef GP_PROXY - pthread_mutex_destroy(mutex_workerrec); - pthread_cond_destroy(cond_notbusy); -#endif - - printf("\n"); - printf("This process exits. \n"); - printf("\n"); - - exit(1); - - return NULL; -} - -#endif diff --git a/teeproxy/gpworker/tzcp_dbus.h b/teeproxy/gpworker/tzcp_dbus.h deleted file mode 100644 index d92f224..0000000 --- a/teeproxy/gpworker/tzcp_dbus.h +++ /dev/null @@ -1,550 +0,0 @@ -#ifndef _TZCP_DBUS_H_ -#define _TZCP_DBUS_H_ - -#include -#include - -#define GP_PROXY_WORKER 1 -// #define GP_PROXY 2 -#define GP_WORKER 3 - -#ifdef GP_PROXY_WORKER - -#include "threadpool.h" - -#define MAX_NUM_THREAD 128 -#define MAX_NUM_WORKER 128 -#define TIMEDOUT_SESSION 60 //seconds -#define TIMEDOUT_CONTEXT 90 //seconds - -#define TEEC_ERROR_CONTEXT_NULL 0xAAAA0001 /* null context */ -#define TEEC_ERROR_CONTEXT_TAPATH_NULL 0xAAAA0002 /* null context ta path */ -#define TEEC_ERROR_PARAM0_TEMPMEM_NULL 0xAAAA0003 /* null param0 tempmem buf */ -#define TEEC_ERROR_PARAM0_TEMPMEM_LESS 0xAAAA0004 /* param0 tempmem buf is less */ -#define TEEC_ERROR_PARAM1_TEMPMEM_NULL 0xAAAA0005 /* null param1 tempmem buf */ -#define TEEC_ERROR_PARAM1_TEMPMEM_LESS 0xAAAA0006 /* param1 tempmem buf is less */ -#define TEEC_ERROR_PARAM2_TEMPMEM_NULL 0xAAAA0007 /* null param2 tempmem buf */ -#define TEEC_ERROR_PARAM2_TEMPMEM_LESS 0xAAAA0008 /* param2 tempmem buf is less */ -#define TEEC_ERROR_PARAM3_TEMPMEM_NULL 0xAAAA0009 /* null param3 tempmem buf */ -#define TEEC_ERROR_PARAM3_TEMPMEM_LESS 0xAAAA000A /* param3 tempmem buf is less */ -#define TEEC_ERROR_CONTEXT_LIST_NULL 0xAAAA000B /* null context list in woker */ -#define TEEC_ERROR_NO_CONTEXT_MATCH 0xAAAA000C /* no context match in woker */ -#define TEEC_ERROR_SESSION_LIST_NULL 0xAAAA000D /* null session list in woker */ -#define TEEC_ERROR_NO_SESSION_MATCH 0xAAAA000E /* no session match in woker */ -#define TEEC_ERROR_PARAM0_MEMREF_NULL 0xAAAA000F /* null param0 memref buf */ -#define TEEC_ERROR_PARAM0_MEMREF_LESS 0xAAAA0010 /* param0 memref buf is less */ -#define TEEC_ERROR_PARAM1_MEMREF_NULL 0xAAAA0011 /* null param1 memref buf */ -#define TEEC_ERROR_PARAM1_MEMREF_LESS 0xAAAA0012 /* param1 memref buf is less */ -#define TEEC_ERROR_PARAM2_MEMREF_NULL 0xAAAA0013 /* null param2 memref buf */ -#define TEEC_ERROR_PARAM2_MEMREF_LESS 0xAAAA0014 /* param2 memref buf is less */ -#define TEEC_ERROR_PARAM3_MEMREF_NULL 0xAAAA0015 /* null param3 memref buf */ -#define TEEC_ERROR_PARAM3_MEMREF_LESS 0xAAAA0016 /* param3 memref buf is less */ -#define TEEC_ERROR_NO_WORKER_MATCHED 0xAAAA0017 /* No woker mateched with the context or/and session */ -#define TEEC_ERROR_SESSION_NULL 0xAAAA0018 /* null session */ -#define TEEC_ERROR_NO_SHAREMEMFLAG 0xAAAA0019 /* no share memmory flag */ - -#endif - - -#ifdef GP_PROXY_WORKER -typedef struct -{ - DBusMessage *msg; - DBusConnection *conn; -#ifdef GP_PROXY - pthread_mutex_t * mutex_workerrec; - pthread_cond_t * cond_notbusy; - wr_t * workerrec; -#endif -#ifdef GP_WORKER - int64_t workernum; - pthread_mutex_t *mutex_tcl; - pthread_mutex_t *mutex_tsl; - tcl_t *tcl; - tsl_t *tsl; -#endif -} DBusMsgConn; -#endif - -void -receive_signal(void); - -void -send_signal( - char *sigvalue -); - -#ifdef GP_PROXY_WORKER - -void -receive_methodcall( - threadpool_t *pool, -#ifdef GP_WORKER - pthread_mutex_t *mutex_tcl, - pthread_mutex_t *mutex_tsl, - tcl_t *tcl, - tsl_t *tsl, -#endif - char *workername - -#ifdef GP_PROXY - , - pthread_mutex_t * mutex_workerrec, - pthread_cond_t * cond_notbusy, - wr_t * workerrec -#endif -); - -#endif - -int32_t -method_call_teec_inicont( - const char *workername, - - const uint8_t *name, size_t name_size, - int32_t in_context_fd, - const uint8_t *in_context_tapath, size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - - uint32_t *teecresult, - int32_t *context_fd, - uint8_t *context_tapath, size_t context_tapath_insize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - uint64_t *context_addr, - uint32_t *context_tapath_outsize -); - -int32_t -method_call_teec_fincont( - const char *workername, - - int32_t in_context_fd, - const uint8_t *in_context_tapath, size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - uint64_t in_context_addr, - - int32_t *context_fd, - uint8_t *context_tapath, size_t context_tapath_insize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - uint32_t *context_tapath_outsize -); - -int32_t -method_call_teec_opensession( - const char *workername, - - int32_t in_context_fd, - const uint8_t *in_context_tapath, - size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - - uint32_t in_destination_timelow, - uint32_t in_destination_timemid, - uint32_t in_destination_timehiandver, - uint32_t *in_destination_clockseqandnode, - int32_t in_destination_clockseqandnode_size, - uint32_t in_connectionmethod, - uint64_t in_connectiondata, - uint32_t in_operation_started, - uint32_t in_operation_paramtypes, - - uint64_t in_operation_param1_tmpref_buffer, - uint32_t in_operation_param1_tmpref_size, - uint64_t in_operation_param1_memref_parent, - uint32_t in_operation_param1_memref_size, - uint32_t in_operation_param1_memref_offset, - uint32_t in_operation_param1_value_a, - uint32_t in_operation_param1_value_b, - int32_t in_operation_param1_ionref_ionsharefd, - uint32_t in_operation_param1_ionref_ionsize, - - uint64_t in_operation_param2_tmpref_buffer, - uint32_t in_operation_param2_tmpref_size, - uint64_t in_operation_param2_memref_parent, - uint32_t in_operation_param2_memref_size, - uint32_t in_operation_param2_memref_offset, - uint32_t in_operation_param2_value_a, - uint32_t in_operation_param2_value_b, - int32_t in_operation_param2_ionref_ionsharefd, - uint32_t in_operation_param2_ionref_ionsize, - - uint64_t in_operation_param3_tmpref_buffer, - uint32_t in_operation_param3_tmpref_size, - uint64_t in_operation_param3_memref_parent, - uint32_t in_operation_param3_memref_size, - uint32_t in_operation_param3_memref_offset, - uint32_t in_operation_param3_value_a, - uint32_t in_operation_param3_value_b, - int32_t in_operation_param3_ionref_ionsharefd, - uint32_t in_operation_param3_ionref_ionsize, - - uint64_t in_operation_param4_tmpref_buffer, - uint32_t in_operation_param4_tmpref_size, - uint64_t in_operation_param4_memref_parent, - uint32_t in_operation_param4_memref_size, - uint32_t in_operation_param4_memref_offset, - uint32_t in_operation_param4_value_a, - uint32_t in_operation_param4_value_b, - int32_t in_operation_param4_ionref_ionsharefd, - uint32_t in_operation_param4_ionref_ionsize, - - uint64_t in_operation_session, - int32_t in_operation_cancelflag, - - uint32_t in_returnorigin, - - uint64_t in_context_addr, - - - uint32_t *teecresult, - - int32_t *context_fd, - uint8_t *context_tapath, - size_t context_tapath_size, - uint32_t *context_tapath_outsize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - - uint32_t *session_seesionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context, - - uint32_t *operation_started, - uint32_t *operation_paramtypes, - - uint64_t *operation_param1_tmpref_buffer, - uint32_t *operation_param1_tmpref_size, - uint64_t *operation_param1_memref_parent, - uint32_t *operation_param1_memref_size, - uint32_t *operation_param1_memref_offset, - uint32_t *operation_param1_value_a, - uint32_t *operation_param1_value_b, - int32_t *operation_param1_ionref_ionsharefd, - uint32_t *operation_param1_ionref_ionsize, - - uint64_t *operation_param2_tmpref_buffer, - uint32_t *operation_param2_tmpref_size, - uint64_t *operation_param2_memref_parent, - uint32_t *operation_param2_memref_size, - uint32_t *operation_param2_memref_offset, - uint32_t *operation_param2_value_a, - uint32_t *operation_param2_value_b, - int32_t *operation_param2_ionref_ionsharefd, - uint32_t *operation_param2_ionref_ionsize, - - uint64_t *operation_param3_tmpref_buffer, - uint32_t *operation_param3_tmpref_size, - uint64_t *operation_param3_memref_parent, - uint32_t *operation_param3_memref_size, - uint32_t *operation_param3_memref_offset, - uint32_t *operation_param3_value_a, - uint32_t *operation_param3_value_b, - int32_t *operation_param3_ionref_ionsharefd, - uint32_t *operation_param3_ionref_ionsize, - - uint64_t *operation_param4_tmpref_buffer, - uint32_t *operation_param4_tmpref_size, - uint64_t *operation_param4_memref_parent, - uint32_t *operation_param4_memref_size, - uint32_t *operation_param4_memref_offset, - uint32_t *operation_param4_value_a, - uint32_t *operation_param4_value_b, - int32_t *operation_param4_ionref_ionsharefd, - uint32_t *operation_param4_ionref_ionsize, - - uint64_t *operation_session, - int32_t *operation_cancelflag, - - uint32_t *returnorigin -); - -int32_t -method_call_teec_closesession( - const char *workername, - - uint32_t in_session_seesionid, - uint32_t in_session_serviceid_timelow, - uint32_t in_session_serviceid_timemid, - uint32_t in_session_serviceid_timehiandver, - uint32_t *in_session_serviceid_clockseqandnode, - int32_t in_session_serviceid_clockseqandnode_size, - uint32_t in_session_opscnt, - uint64_t in_session_head_next, - uint64_t in_session_head_prev, - uint64_t in_session_context, - - uint32_t *session_seesionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context -); - -int32_t -method_call_teec_invokecommand( - const char *workername, - - uint32_t in_session_seesionid, - uint32_t in_session_serviceid_timelow, - uint32_t in_session_serviceid_timemid, - uint32_t in_session_serviceid_timehiandver, - uint32_t *in_session_serviceid_clockseqandnode, - uint32_t in_session_serviceid_clockseqandnode_size, - uint32_t in_session_opscnt, - uint64_t in_session_head_next, - uint64_t in_session_head_prev, - uint64_t in_session_context, - - uint32_t commandid, - - uint32_t in_operation_started, - uint32_t in_operation_paramtypes, - - uint64_t in_operation_param1_tmpref_buffer, - uint32_t in_operation_param1_tmpref_size, - uint64_t in_operation_param1_memref_parent, - uint32_t in_operation_param1_memref_parent_flag, - uint32_t in_operation_param1_memref_size, - uint32_t in_operation_param1_memref_offset, - uint32_t in_operation_param1_value_a, - uint32_t in_operation_param1_value_b, - int32_t in_operation_param1_ionref_ionsharefd, - uint32_t in_operation_param1_ionref_ionsize, - - uint64_t in_operation_param2_tmpref_buffer, - uint32_t in_operation_param2_tmpref_size, - uint64_t in_operation_param2_memref_parent, - uint32_t in_operation_param2_memref_parent_flag, - uint32_t in_operation_param2_memref_size, - uint32_t in_operation_param2_memref_offset, - uint32_t in_operation_param2_value_a, - uint32_t in_operation_param2_value_b, - int32_t in_operation_param2_ionref_ionsharefd, - uint32_t in_operation_param2_ionref_ionsize, - - uint64_t in_operation_param3_tmpref_buffer, - uint32_t in_operation_param3_tmpref_size, - uint64_t in_operation_param3_memref_parent, - uint32_t in_operation_param3_memref_parent_flag, - uint32_t in_operation_param3_memref_size, - uint32_t in_operation_param3_memref_offset, - uint32_t in_operation_param3_value_a, - uint32_t in_operation_param3_value_b, - int32_t in_operation_param3_ionref_ionsharefd, - uint32_t in_operation_param3_ionref_ionsize, - - uint64_t in_operation_param4_tmpref_buffer, - uint32_t in_operation_param4_tmpref_size, - uint64_t in_operation_param4_memref_parent, - uint32_t in_operation_param4_memref_parent_flag, - uint32_t in_operation_param4_memref_size, - uint32_t in_operation_param4_memref_offset, - uint32_t in_operation_param4_value_a, - uint32_t in_operation_param4_value_b, - int32_t in_operation_param4_ionref_ionsharefd, - uint32_t in_operation_param4_ionref_ionsize, - - uint64_t in_operation_session, - int32_t in_operation_cancelflag, - - uint32_t in_returnorigin, - - uint32_t *in_buffer1, - uint32_t in_buffer1_size, - uint32_t *in_buffer2, - uint32_t in_buffer2_size, - uint32_t *in_buffer3, - uint32_t in_buffer3_size, - uint32_t *in_buffer4, - uint32_t in_buffer4_size, - - - uint32_t *teecresult, - - uint32_t *session_seesionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context, - - uint32_t *operation_started, - uint32_t *operation_paramtypes, - - uint64_t *operation_param1_tmpref_buffer, - uint32_t *operation_param1_tmpref_size, - uint64_t *operation_param1_memref_parent, - uint32_t *operation_param1_memref_parent_flag, - uint32_t *operation_param1_memref_size, - uint32_t *operation_param1_memref_offset, - uint32_t *operation_param1_value_a, - uint32_t *operation_param1_value_b, - int32_t *operation_param1_ionref_ionsharefd, - uint32_t *operation_param1_ionref_ionsize, - - uint64_t *operation_param2_tmpref_buffer, - uint32_t *operation_param2_tmpref_size, - uint64_t *operation_param2_memref_parent, - uint32_t *operation_param2_memref_parent_flag, - uint32_t *operation_param2_memref_size, - uint32_t *operation_param2_memref_offset, - uint32_t *operation_param2_value_a, - uint32_t *operation_param2_value_b, - int32_t *operation_param2_ionref_ionsharefd, - uint32_t *operation_param2_ionref_ionsize, - - uint64_t *operation_param3_tmpref_buffer, - uint32_t *operation_param3_tmpref_size, - uint64_t *operation_param3_memref_parent, - uint32_t *operation_param3_memref_parent_flag, - uint32_t *operation_param3_memref_size, - uint32_t *operation_param3_memref_offset, - uint32_t *operation_param3_value_a, - uint32_t *operation_param3_value_b, - int32_t *operation_param3_ionref_ionsharefd, - uint32_t *operation_param3_ionref_ionsize, - - uint64_t *operation_param4_tmpref_buffer, - uint32_t *operation_param4_tmpref_size, - uint64_t *operation_param4_memref_parent, - uint32_t *operation_param4_memref_parent_flag, - uint32_t *operation_param4_memref_size, - uint32_t *operation_param4_memref_offset, - uint32_t *operation_param4_value_a, - uint32_t *operation_param4_value_b, - int32_t *operation_param4_ionref_ionsharefd, - uint32_t *operation_param4_ionref_ionsize, - - uint64_t *operation_session, - int32_t *operation_cancelflag, - - uint32_t *returnorigin, - - uint32_t *buffer1, - uint32_t buffer1_size, - uint32_t *buffer1_outsize, - uint32_t *buffer2, - uint32_t buffer2_size, - uint32_t *buffer2_outsize, - uint32_t *buffer3, - uint32_t buffer3_size, - uint32_t *buffer3_outsize, - uint32_t *buffer4, - uint32_t buffer4_size, - uint32_t *buffer4_outsize -); - -void -method_call_destroy_threadpool( - const char *workername -); - - -#ifdef GP_PROXY_WORKER - -void * -reply_to_method_call_teec_inicont( - void *thdfargs -); - -void * -reply_to_method_call_teec_fincont( - void *thdfargs -); - -void * -reply_to_method_call_teec_opensession( - void *thdfargs -); - -void * -reply_to_method_call_teec_closesession( - void *thdfargs -); - -void * -reply_to_method_call_teec_invokecommand( - void *thdfargs -); - -#ifdef GP_PROXY -void* -session_timeout_process ( - void* thdfargs -); - -void* -context_timeout_process ( - void* thdfargs -); -#endif - -void * -reply_to_method_call_destroy_threadpool( - DBusMessage *msg, - DBusConnection *conn, - threadpool_t *pool -#ifdef GP_WORKER - , - pthread_mutex_t *mutex_tcl, - pthread_mutex_t *mutex_tsl -#endif -#ifdef GP_PROXY - , - pthread_mutex_t * mutex_workerbusy, - pthread_cond_t * cond_notbusy -#endif -); - -#endif - - -#endif /* _TZCP_DBUS_H_ */ diff --git a/teeproxy/libdbuscgpw/CMakeLists.txt b/teeproxy/libdbuscgpw/CMakeLists.txt deleted file mode 100644 index 236a2ec..0000000 --- a/teeproxy/libdbuscgpw/CMakeLists.txt +++ /dev/null @@ -1,45 +0,0 @@ -# - -cmake_minimum_required(VERSION 3.5.1) - -project(libdbusc_gpw C CXX) - -# set(CMAKE_C_FLAGS "${CMAKE_}") -# set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE) - -include_directories("${CMAKE_CURRENT_BINARY_DIR}") -# include_directories(${CMAKE_CURRENT_BINARY_DIR}/../include/) -include_directories(/usr/include/dbus-1.0/) -include_directories(/usr/lib64/dbus-1.0/include/) - -# Introduce variables: -# - CMAKE_INSTALL_LIBDIR -# - CMAKE_INSTALL_BINDIR -# - CMAKE_INSTALL_INCLUDEDIR -include(GNUInstallDirs) - -set(LIB_DBUSC_GPW - ${PROJECT_SOURCE_DIR}/dbusc_gpw.c -) -# Install Headers: -set(HEADERS_DBUSC_GPW - dbusc_gpw.h -) -install( - FILES ${HEADERS_DBUSC_GPW} - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${TARGET_NAME}" -) - -add_library(dbusc_gpw SHARED ${LIB_DBUSC_GPW}) -target_link_libraries(dbusc_gpw - libdbus-1.so -) -# set_target_properties(dbusc_gpw -# PROPERTIES IMPORTED_LOCATION -# ) - -# Install lib: -install( - TARGETS "dbusc_gpw" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" -) diff --git a/teeproxy/libdbuscgpw/build/cmake.sh b/teeproxy/libdbuscgpw/build/cmake.sh deleted file mode 100644 index bef7b3e..0000000 --- a/teeproxy/libdbuscgpw/build/cmake.sh +++ /dev/null @@ -1 +0,0 @@ -cmake -DCMAKE_BUILD_TYPE=Debug .. diff --git a/teeproxy/libdbuscgpw/dbusc_gpw.c b/teeproxy/libdbuscgpw/dbusc_gpw.c deleted file mode 100644 index 1069929..0000000 --- a/teeproxy/libdbuscgpw/dbusc_gpw.c +++ /dev/null @@ -1,9291 +0,0 @@ -/* - * Using low-level D-Bus C API code. - * Written by - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "dbusc_gpw.h" - - -/** - * Listens for signals on the bus - */ -void -receive_signal(void) -{ - DBusMessage *msg; - DBusMessageIter args; - DBusConnection *conn; - DBusError err; - int ret; - char *sigvalue; - - printf("Listening for signals\n"); - - // initialise the errors - dbus_error_init(&err); - - // connect to the bus and check for errors - conn = dbus_bus_get(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - exit(1); - } - - // request our name on the bus and check for errors - ret = dbus_bus_request_name(conn, "test.signal.sink", DBUS_NAME_FLAG_REPLACE_EXISTING, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - exit(1); - } - - // add a rule for which messages we want to see - dbus_bus_add_match(conn, "type='signal',interface='test.signal.Type'", &err); - // see signals from the given interface - dbus_connection_flush(conn); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Match Error (%s)\n", err.message); - exit(1); - } - // printf("Match rule sent\n"); - - // loop listening for signals being emmitted - while (true) - { - - // non blocking read of the next available message - dbus_connection_read_write(conn, 0); - msg = dbus_connection_pop_message(conn); - - // loop again if we haven't read a message - if (NULL == msg) - { - usleep(10000); - continue; - } - - // check if the message is a signal from the correct interface and with the correct name - if (dbus_message_is_signal(msg, "test.signal.Type", "Test")) - { - - // read the parameters - if (!dbus_message_iter_init(msg, &args)) - fprintf(stderr, "Message Has No Parameters\n"); - else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) - fprintf(stderr, "Argument is not string!\n"); - else - dbus_message_iter_get_basic(&args, &sigvalue); - - printf("Got Signal with value %s\n", sigvalue); - } - - // free the message - dbus_message_unref(msg); - } -} - - -/** - * Connect to the DBUS bus and send a broadcast signal - */ -void -send_signal( - char *sigvalue -) -{ - DBusMessage *msg; - DBusMessageIter args; - DBusConnection *conn; - DBusError err; - int ret; - dbus_uint32_t sigserial = 0; - - printf("Sending signal with value %s\n", sigvalue); - - // initialise the error value - dbus_error_init(&err); - - // connect to the DBUS system bus, and check for errors - conn = dbus_bus_get(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - exit(1); - } - - // register our name on the bus, and check for errors - ret = dbus_bus_request_name(conn, "test.signal.source", DBUS_NAME_FLAG_REPLACE_EXISTING, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - exit(1); - } - - // create a signal & check for errors - msg = dbus_message_new_signal("/test/signal/Object", // object name of the signal - "test.signal.Type", // interface name of the signal - "Test"); // name of the signal - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - exit(1); - } - - // append arguments onto signal - dbus_message_iter_init_append(msg, &args); - if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &sigvalue)) - { - fprintf(stderr, "Out Of Memory!\n"); - exit(1); - } - - // send the message and flush the connection - if (!dbus_connection_send(conn, msg, &sigserial)) - { - fprintf(stderr, "Out Of Memory!\n"); - exit(1); - } - dbus_connection_flush(conn); - - printf("Signal Sent\n"); - - // free the message - dbus_message_unref(msg); -} - - -/** - * Call a method on a remote object - */ -int32_t -method_call_teec_inicont( - const char *workername, - - const uint8_t *name, size_t name_size, - int32_t in_context_fd, - const uint8_t *in_context_tapath, size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - - uint32_t *teecresult, - int32_t *context_fd, - uint8_t *context_tapath, size_t context_tapath_insize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - uint64_t *context_addr, - uint32_t *context_tapath_outsize -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - DBusMessageIter structIter; - int ret; - int iType; - unsigned char *context_tapath_temp = NULL; - dbus_int32_t di32Temp; - dbus_uint32_t dui32Temp; - dbus_int64_t di64Temp; - dbus_uint64_t dui64Temp; - - // initialiset the errors - dbus_error_init(&err); - - dbus_threads_init_default(); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - // conn = dbus_bus_get(DBUS_BUS_SESSION, &err); - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return -1; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return -1; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "TEEC_InitializeContext" // method name - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return -1; - } - - // append arguments - dbus_message_iter_init_append(msg, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - di32Temp = name_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (name_size > 0 && name != NULL) - { - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &name - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - } - - di32Temp = in_context_fd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_context_tapath_size > 0 && - in_context_tapath != NULL && - strlen((const char *) in_context_tapath) > 0 - ) - { - if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) - { - di32Temp = strlen((const char *) in_context_tapath); - } else - { - di32Temp = 0; - } - } else - { - di32Temp = 0; - } - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - // if (in_context_tapath_size > 0 && in_context_tapath != NULL) - if (di32Temp > 0) - { - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &in_context_tapath - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - } - - dui64Temp = in_context_sessionlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sessionlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sharebuffer_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di64Temp = in_context_sharebuffer_bufferbarrier; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT64, - &di64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - /* - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_connection_flush(conn); - dbus_message_unref(msg); - - printf("\n"); - printf("Method Call Teec Init Contex Sent. \n"); - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - return -1; - } - // free the pending message handle - dbus_pending_call_unref(pending); - */ - - // printf("\n"); - printf("libdbuscgpw method call teec init contex sent. \n"); - - DBusMessage *reply; - reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "libdbuscgpw: initcontext send_with_reply_and_block error, %s \n", err.message); - dbus_error_free(&err); - - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return -1; - } - if (reply == NULL) - { - fprintf(stderr, "libdbuscgpw: initcontext dbus reply error \n"); - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return -1; - } - - dbus_message_unref(msg); - dbus_connection_flush(conn); - msg = reply; - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *teecresult = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *context_fd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *context_tapath_outsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - if (*context_tapath_outsize > 0) - { - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_STRING - ) - { - fprintf(stderr, "Argument is not STRING.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &context_tapath_temp); - - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sharebuffer_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT64 - ) - { - fprintf(stderr, "Argument is not INT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di64Temp - ); - *context_sharebuffer_bufferbarrier = di64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_addr = dui64Temp; - - printf("libdbuscgpw got reply of method call teec init contex: \n"); - printf(" teecresult = 0x %8.8x \n", *teecresult); - printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); - printf(" ta_path = %s \n", context_tapath_temp); - printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); -#if 0 - printf(" TEEC_Context session_list.next = 0x %16.16lx \n", - *context_sessionlist_next - ); - printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", - *context_sessionlist_prev - ); - printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", - *context_shrdmemlist_next - ); - printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", - *context_shrdmemlist_prev - ); - printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", - *context_sharebuffer_buffer - ); - printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", - (long unsigned int)*context_sharebuffer_bufferbarrier - ); -#endif - printf(" context addr = 0x %16.16lx \n", - (long unsigned int) *context_addr - ); - - if ( - context_tapath_insize > *context_tapath_outsize && - *context_tapath_outsize > 0 && - context_tapath != NULL && - context_tapath_temp != NULL - ) - { - memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); - *(context_tapath + *context_tapath_outsize) = 0; - } else - { - // dbus_message_unref(msg); - // return -1; - *(context_tapath + 0) = 0; - } - - // free msg - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return 0; -} - - -/** - * Call a method on a remote object - */ -int32_t -method_call_teec_fincont( - const char *workername, - - int32_t in_context_fd, - const uint8_t *in_context_tapath, size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - uint64_t in_context_addr, - - int32_t *context_fd, - uint8_t *context_tapath, size_t context_tapath_insize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - uint32_t *context_tapath_outsize -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - DBusMessageIter structIter; - int ret; - int iType; - unsigned char *context_tapath_temp = NULL; - dbus_int32_t di32Temp; - dbus_uint32_t dui32Temp; - dbus_int64_t di64Temp; - dbus_uint64_t dui64Temp; - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return -1; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return -1; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "TEEC_FinalizeContext" - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return -1; - } - - // append arguments - dbus_message_iter_init_append(msg, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - di32Temp = in_context_fd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_context_tapath_size > 0 && - in_context_tapath != NULL && - strlen((const char *) in_context_tapath) > 0 - ) - { - // if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) - if (dbus_validate_path((const char *) in_context_tapath, &err) == true) - { - di32Temp = strlen((const char *) in_context_tapath); - } else - { - di32Temp = 0; - } - } else - { - di32Temp = 0; - } - - fprintf(stderr, "libdbuscgpw finalizecontext, in_context_tapath_size, di32Temp = %ld \n", di32Temp); - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - // if (in_context_tapath_size > 0 && in_context_tapath != NULL) - if (di32Temp > 0) - { - fprintf(stderr, "libdbuscgpw finalizecontext, in_context_tapath = %s \n", in_context_tapath); - - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &in_context_tapath - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - } - - dui64Temp = in_context_sessionlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sessionlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sharebuffer_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di64Temp = in_context_sharebuffer_bufferbarrier; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT64, - &di64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_addr; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - - /* - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_connection_flush(conn); - dbus_message_unref(msg); - - // printf("\n"); - printf("libdbuscgpw method call teec fin contex sent. \n"); - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - return -1; - } - // free the pending message handle - dbus_pending_call_unref(pending); - */ - - - // printf("\n"); - printf("libdbuscgpw method call teec fin contex sent. \n"); - - dbus_error_init(&err); - DBusMessage *reply; - reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "libdbuscgpw: finalizecontext send_with_reply_and_block error, %s \n", err.message); - dbus_error_free(&err); - - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return -1; - } - if (reply == NULL) - { - fprintf(stderr, "libdbuscgpw: finalizecontext dbus reply error \n"); - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return -1; - } - - dbus_message_unref(msg); - dbus_connection_flush(conn); - msg = reply; - - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *context_fd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *context_tapath_outsize = dui32Temp; - - if (*context_tapath_outsize > 0) - { - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_STRING - ) - { - fprintf(stderr, "Argument is not STRING.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &context_tapath_temp); - - } - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sharebuffer_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT64 - ) - { - fprintf(stderr, "Argument is not INT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di64Temp - ); - *context_sharebuffer_bufferbarrier = di64Temp; - - printf("libdbuscgpw got reply of method call teec fin contex: \n"); - printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); - printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); - if ((int) *context_tapath_outsize > 0 && context_tapath_temp != NULL && - dbus_validate_path((const char *) context_tapath_temp, &err) == true) - { - printf(" ta_path = %s \n", context_tapath_temp); - } -#if 0 - printf(" TEEC_Context session_list.next = 0x %16.16lx \n", - *context_sessionlist_next - ); - printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", - *context_sessionlist_prev - ); - printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", - *context_shrdmemlist_next - ); - printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", - *context_shrdmemlist_prev - ); - printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", - *context_sharebuffer_buffer - ); - printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", - (long unsigned int)*context_sharebuffer_bufferbarrier - ); -#endif - - if ( - context_tapath_insize > *context_tapath_outsize && - *context_tapath_outsize > 0 && - context_tapath != NULL && - context_tapath_temp != NULL - ) - { - memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); - *(context_tapath + *context_tapath_outsize) = 0; - } else - { - // dbus_message_unref(msg); - // return -1; - *(context_tapath + 0) = 0; - } - - // free msg - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return 0; -} - - -/** - * Call a method on a remote object - */ -int32_t -method_call_teec_opensession( - const char *workername, - - int32_t in_context_fd, - const uint8_t *in_context_tapath, - size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - - uint32_t in_destination_timelow, - uint32_t in_destination_timemid, - uint32_t in_destination_timehiandver, - uint32_t *in_destination_clockseqandnode, - int32_t in_destination_clockseqandnode_size, - - uint32_t in_connectionmethod, - uint64_t in_connectiondata, - - uint32_t in_operation_started, - uint32_t in_operation_paramtypes, - - uint64_t in_operation_param1_tmpref_buffer, - uint32_t in_operation_param1_tmpref_size, - uint64_t in_operation_param1_memref_parent, - uint32_t in_operation_param1_memref_size, - uint32_t in_operation_param1_memref_offset, - uint32_t in_operation_param1_value_a, - uint32_t in_operation_param1_value_b, - int32_t in_operation_param1_ionref_ionsharefd, - uint32_t in_operation_param1_ionref_ionsize, - - uint64_t in_operation_param2_tmpref_buffer, - uint32_t in_operation_param2_tmpref_size, - uint64_t in_operation_param2_memref_parent, - uint32_t in_operation_param2_memref_size, - uint32_t in_operation_param2_memref_offset, - uint32_t in_operation_param2_value_a, - uint32_t in_operation_param2_value_b, - int32_t in_operation_param2_ionref_ionsharefd, - uint32_t in_operation_param2_ionref_ionsize, - - uint64_t in_operation_param3_tmpref_buffer, - uint32_t in_operation_param3_tmpref_size, - uint64_t in_operation_param3_memref_parent, - uint32_t in_operation_param3_memref_size, - uint32_t in_operation_param3_memref_offset, - uint32_t in_operation_param3_value_a, - uint32_t in_operation_param3_value_b, - int32_t in_operation_param3_ionref_ionsharefd, - uint32_t in_operation_param3_ionref_ionsize, - - uint64_t in_operation_param4_tmpref_buffer, - uint32_t in_operation_param4_tmpref_size, - uint64_t in_operation_param4_memref_parent, - uint32_t in_operation_param4_memref_size, - uint32_t in_operation_param4_memref_offset, - uint32_t in_operation_param4_value_a, - uint32_t in_operation_param4_value_b, - int32_t in_operation_param4_ionref_ionsharefd, - uint32_t in_operation_param4_ionref_ionsize, - - uint64_t in_operation_session, - int32_t in_operation_cancelflag, - - uint32_t in_returnorigin, - - uint64_t in_context_addr, - - - uint32_t *teecresult, - - int32_t *context_fd, - uint8_t *context_tapath, - size_t context_tapath_size, - uint32_t *context_tapath_outsize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - - uint32_t *session_seesionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context, - - uint32_t *operation_started, - uint32_t *operation_paramtypes, - - uint64_t *operation_param1_tmpref_buffer, - uint32_t *operation_param1_tmpref_size, - uint64_t *operation_param1_memref_parent, - uint32_t *operation_param1_memref_size, - uint32_t *operation_param1_memref_offset, - uint32_t *operation_param1_value_a, - uint32_t *operation_param1_value_b, - int32_t *operation_param1_ionref_ionsharefd, - uint32_t *operation_param1_ionref_ionsize, - - uint64_t *operation_param2_tmpref_buffer, - uint32_t *operation_param2_tmpref_size, - uint64_t *operation_param2_memref_parent, - uint32_t *operation_param2_memref_size, - uint32_t *operation_param2_memref_offset, - uint32_t *operation_param2_value_a, - uint32_t *operation_param2_value_b, - int32_t *operation_param2_ionref_ionsharefd, - uint32_t *operation_param2_ionref_ionsize, - - uint64_t *operation_param3_tmpref_buffer, - uint32_t *operation_param3_tmpref_size, - uint64_t *operation_param3_memref_parent, - uint32_t *operation_param3_memref_size, - uint32_t *operation_param3_memref_offset, - uint32_t *operation_param3_value_a, - uint32_t *operation_param3_value_b, - int32_t *operation_param3_ionref_ionsharefd, - uint32_t *operation_param3_ionref_ionsize, - - uint64_t *operation_param4_tmpref_buffer, - uint32_t *operation_param4_tmpref_size, - uint64_t *operation_param4_memref_parent, - uint32_t *operation_param4_memref_size, - uint32_t *operation_param4_memref_offset, - uint32_t *operation_param4_value_a, - uint32_t *operation_param4_value_b, - int32_t *operation_param4_ionref_ionsharefd, - uint32_t *operation_param4_ionref_ionsize, - - uint64_t *operation_session, - int32_t *operation_cancelflag, - - uint32_t *returnorigin -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - DBusMessageIter structIter; - DBusMessageIter ArrayIter; - int ret; - int iType; - unsigned char *context_tapath_temp = NULL; - dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; - int session_serviceid_clockseqandnode_realsize; - dbus_int32_t di32Temp; - dbus_uint32_t dui32Temp; - dbus_int64_t di64Temp; - dbus_uint64_t dui64Temp; - char buf[2]; - buf[0] = DBUS_TYPE_UINT32; - buf[1] = '\0'; - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return -1; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return -1; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "TEEC_OpenSession" - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return -1; - } - - // append arguments - dbus_message_iter_init_append(msg, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - di32Temp = in_context_fd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_context_tapath_size > 0 && - in_context_tapath != NULL && - strlen((const char *) in_context_tapath) > 0 - ) - { - if (dbus_validate_utf8((const char *) in_context_tapath, &err) == true) - { - di32Temp = strlen((const char *) in_context_tapath); - } else - { - di32Temp = 0; - } - } else - { - di32Temp = 0; - } - - // fprintf(stderr, "in_context_tapath_size = %ld \n", in_context_tapath_size); - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - // if (in_context_tapath_size > 0 && in_context_tapath != NULL) - if (di32Temp > 0) - { - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_STRING, - &in_context_tapath - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - } - - dui64Temp = in_context_sessionlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sessionlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_shrdmemlist_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_sharebuffer_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di64Temp = in_context_sharebuffer_bufferbarrier; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT64, - &di64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_destination_timelow; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_destination_timemid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_destination_timehiandver; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_destination_clockseqandnode_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_destination_clockseqandnode_size > 0 && - in_destination_clockseqandnode != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_destination_clockseqandnode, - in_destination_clockseqandnode_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_connectionmethod; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_connectiondata; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - - dui32Temp = in_operation_started; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_paramtypes; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param1_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param1_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param1_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param2_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param2_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param2_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param3_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param3_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param3_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param4_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param4_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param4_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_session; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_cancelflag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_returnorigin; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_context_addr; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - /////////////////////////////////////////////////////////////////// - - /* - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_connection_flush(conn); - dbus_message_unref(msg); - - printf("\n"); - printf("Method Call Teec Open Session Sent. \n"); - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - return -1; - } - - // free the pending message handle - dbus_pending_call_unref(pending); - */ - - // printf("\n"); - printf("libdbuscgpw method call teec open session sent. \n"); - - DBusMessage *reply; - reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "libdbuscgpw: opensession send_with_reply_and_block error, %s \n", err.message); - dbus_error_free(&err); - - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return -1; - } - if (reply == NULL) - { - fprintf(stderr, "libdbuscgpw: opensession dbus reply error \n"); - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return -1; - } - - dbus_message_unref(msg); - dbus_connection_flush(conn); - msg = reply; - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *teecresult = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *context_fd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *context_tapath_outsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - if (*context_tapath_outsize > 0) - { - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_STRING - ) - { - fprintf(stderr, "Argument is not STRING.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &context_tapath_temp); - - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sessionlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_shrdmemlist_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *context_sharebuffer_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT64 - ) - { - fprintf(stderr, "Argument is not INT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di64Temp - ); - *context_sharebuffer_bufferbarrier = di64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_seesionid = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timelow = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timemid = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timehiandver = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_clockseqandnode_outsize = dui32Temp; - - if (*session_serviceid_clockseqandnode_outsize > 0) - { - bResult = - dbus_message_iter_next( - &structIter - ); - - dbus_message_iter_recurse( - &structIter, - &ArrayIter); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &session_serviceid_clockseqandnode_temp, - &session_serviceid_clockseqandnode_realsize - ); - } - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_opscnt = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_context = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_started = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_paramtypes = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param1_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param1_memref_parent = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param1_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param2_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param2_memref_parent = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param2_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param3_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param3_memref_parent = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param3_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param4_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param4_memref_parent = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param4_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_session = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_cancelflag = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *returnorigin = dui32Temp; - - printf("libdbuscgpw got reply of method call teec open session: \n"); - printf(" teecresult = 0x %8.8x \n", *teecresult); - printf(" fd = 0x %8.8x \n", (unsigned int) *context_fd); - printf(" ta_path = %s \n", context_tapath_temp); - printf(" ta_path_size = %d \n", (int) *context_tapath_outsize); - printf(" session_seesionid = 0x %8.8x \n", - *session_seesionid - ); -#if 0 - printf(" TEEC_Context session_list.next = 0x %16.16lx \n", - *context_sessionlist_next - ); - printf(" TEEC_Context session_list.prev = 0x %16.16lx \n", - *context_sessionlist_prev - ); - printf(" TEEC_Context shrd_mem_list.next = 0x %16.16lx \n", - *context_shrdmemlist_next - ); - printf(" TEEC_Context shrd_mem_list.prev = 0x %16.16lx \n", - *context_shrdmemlist_prev - ); - printf(" TEEC_Context share_buffer.buffer = 0x %16.16lx \n", - *context_sharebuffer_buffer - ); - printf(" TEEC_Context share_buffer.buffer_barrier = 0x %16.16lx \n", - (long unsigned int)*context_sharebuffer_bufferbarrier - ); - - printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", - *session_serviceid_timelow - ); - printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", - *session_serviceid_timehiandver - ); - - printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); - if (*session_serviceid_clockseqandnode_outsize > 0 && - session_serviceid_clockseqandnode_temp != NULL) - { - printf(" "); - for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { - printf(" %2.2x", - session_serviceid_clockseqandnode_temp[i] - ); - } - printf("\n"); - } - printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", - *session_serviceid_clockseqandnode_outsize - ); - - printf(" TEEC_Session session_opscnt = 0x %8.8x \n", - *session_opscnt - ); - printf(" TEEC_Session session_head_next = 0x %16.16lx \n", - *session_head_next - ); - printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", - *session_head_prev - ); - printf(" TEEC_Session session_context = 0x %16.16lx \n", - *session_context - ); - printf(" TEEC_Session operation_started = 0x %8.8x \n", - *operation_started - ); - printf(" TEEC_Session operation_paramtypes = 0x %8.8x \n", - *operation_paramtypes - ); - - printf(" TEEC_Session operation_param1_tmpref_buffer = 0x %16.16lx \n", - *operation_param1_tmpref_buffer - ); - printf(" TEEC_Session operation_param1_tmpref_size = 0x %8.8x \n", - *operation_param1_tmpref_size - ); - printf(" TEEC_Session operation_param1_memref_parent = 0x %16.16lx \n", - *operation_param1_memref_parent - ); - printf(" TEEC_Session operation_param1_memref_size = 0x %8.8x \n", - *operation_param1_memref_size - ); - printf(" TEEC_Session operation_param1_memref_offse = 0x %8.8x \n", - *operation_param1_memref_offset - ); - printf(" TEEC_Session operation_param1_value_a = 0x %8.8x \n", - *operation_param1_value_a - ); - printf(" TEEC_Session operation_param1_value_b = 0x %8.8x \n", - *operation_param1_value_b - ); - printf(" TEEC_Session operation_param1_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param1_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param1_ionref_ionsize = 0x %8.8x \n", - *operation_param1_ionref_ionsize - ); - - printf(" TEEC_Session operation_param2_tmpref_buffer = 0x %16.16lx \n", - *operation_param2_tmpref_buffer - ); - printf(" TEEC_Session operation_param2_tmpref_size = 0x %8.8x \n", - *operation_param2_tmpref_size - ); - printf(" TEEC_Session operation_param2_memref_parent = 0x %16.16lx \n", - *operation_param2_memref_parent - ); - printf(" TEEC_Session operation_param2_memref_size = 0x %8.8x \n", - *operation_param2_memref_size - ); - printf(" TEEC_Session operation_param2_memref_offset = 0x %8.8x \n", - *operation_param2_memref_offset - ); - printf(" TEEC_Session operation_param2_value_a = 0x %8.8x \n", - *operation_param2_value_a - ); - printf(" TEEC_Session operation_param2_value_b = 0x %8.8x \n", - *operation_param2_value_b - ); - printf(" TEEC_Session operation_param2_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param2_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param2_ionref_ionsize = 0x %8.8x \n", - *operation_param2_ionref_ionsize - ); - - printf(" TEEC_Session operation_param3_tmpref_buffer = 0x %16.16lx \n", - *operation_param3_tmpref_buffer - ); - printf(" TEEC_Session operation_param3_tmpref_size = 0x %8.8x \n", - *operation_param3_tmpref_size - ); - printf(" TEEC_Session operation_param3_memref_parent = 0x %16.16lx \n", - *operation_param3_memref_parent - ); - printf(" TEEC_Session operation_param3_memref_size = 0x %8.8x \n", - *operation_param3_memref_size - ); - printf(" TEEC_Session operation_param3_memref_offset = 0x %8.8x \n", - *operation_param3_memref_offset - ); - printf(" TEEC_Session operation_param3_value_a = 0x %8.8x \n", - *operation_param3_value_a - ); - printf(" TEEC_Session operation_param3_value_b = 0x %8.8x \n", - *operation_param3_value_b - ); - printf(" TEEC_Session operation_param3_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param3_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param3_ionref_ionsize = 0x %8.8x \n", - *operation_param3_ionref_ionsize - ); - - printf(" TEEC_Session operation_param4_tmpref_buffer = 0x %16.16lx \n", - *operation_param4_tmpref_buffer - ); - printf(" TEEC_Session operation_param4_tmpref_size = 0x %8.8x \n", - *operation_param4_tmpref_size - ); - printf(" TEEC_Session operation_param4_memref_parent = 0x %16.16lx \n", - *operation_param4_memref_parent - ); - printf(" TEEC_Session operation_param4_memref_size = 0x %8.8x \n", - *operation_param4_memref_size - ); - printf(" TEEC_Session operation_param4_memref_offset = 0x %8.8x \n", - *operation_param4_memref_offset - ); - printf(" TEEC_Session operation_param4_value_a = 0x %8.8x \n", - *operation_param4_value_a - ); - printf(" TEEC_Session operation_param4_value_b = 0x %8.8x \n", - *operation_param4_value_b - ); - printf(" TEEC_Session operation_param4_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param4_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param4_ionref_ionsize = 0x %8.8x \n", - *operation_param4_ionref_ionsize - ); - - printf(" TEEC_Session operation_session = 0x %16.16lx \n", - *operation_session - ); - printf(" TEEC_Session operation_cancelflag = 0x %8.8x \n", - (unsigned int)*operation_cancelflag - ); - printf(" TEEC_Session returnorigin = 0x %8.8x \n", - *returnorigin - ); -#endif - - if (context_tapath_size > *context_tapath_outsize) - { - memcpy(context_tapath, context_tapath_temp, *context_tapath_outsize); - *(context_tapath + *context_tapath_outsize) = 0; - } else - { - dbus_message_unref(msg); - return -1; - } - - if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && - session_serviceid_clockseqandnode_temp != NULL && - session_serviceid_clockseqandnode_realsize > 0 - ) - { - /* - memcpy( - session_serviceid_clockseqandnode, - session_serviceid_clockseqandnode_temp, - session_serviceid_clockseqandnode_realsize - ); - */ - for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) - { - session_serviceid_clockseqandnode[i] = - session_serviceid_clockseqandnode_temp[i]; - - } - *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *session_serviceid_clockseqandnode_outsize = 0; - } - - // free msg - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return 0; -} - - -int32_t -method_call_teec_closesession( - const char *workername, - - uint32_t in_session_seesionid, - uint32_t in_session_serviceid_timelow, - uint32_t in_session_serviceid_timemid, - uint32_t in_session_serviceid_timehiandver, - uint32_t *in_session_serviceid_clockseqandnode, - int32_t in_session_serviceid_clockseqandnode_size, - uint32_t in_session_opscnt, - uint64_t in_session_head_next, - uint64_t in_session_head_prev, - uint64_t in_session_context, - - uint32_t *session_seesionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - DBusMessageIter structIter; - DBusMessageIter ArrayIter; - int ret; - int iType; - dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; - int session_serviceid_clockseqandnode_realsize; - dbus_int32_t di32Temp; - dbus_uint32_t dui32Temp; - dbus_uint64_t dui64Temp; - char buf[2]; - buf[0] = DBUS_TYPE_UINT32; - buf[1] = '\0'; - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return -1; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return -1; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "TEEC_CloseSession" - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return -1; - } - - // append arguments - dbus_message_iter_init_append(msg, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - dui32Temp = in_session_seesionid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timelow; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timemid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timehiandver; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_session_serviceid_clockseqandnode_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_session_serviceid_clockseqandnode_size > 0 && - in_session_serviceid_clockseqandnode != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_session_opscnt; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - - dui64Temp = in_session_head_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_session_head_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_session_context; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - /* - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_connection_flush(conn); - dbus_message_unref(msg); - - printf("\n"); - printf("Method Call Teec Close Session Sent. \n"); - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - return -1; - } - - // free the pending message handle - dbus_pending_call_unref(pending); - */ - - // printf("\n"); - printf("libdbuscgpw method call teec close session sent. \n"); - - DBusMessage *reply; - reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "libdbuscgpw: closesession send_with_reply_and_block error, %s \n", err.message); - dbus_error_free(&err); - - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return -1; - } - if (reply == NULL) - { - fprintf(stderr, "libdbuscgpw: closesession dbus reply error \n"); - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return -1; - } - - dbus_message_unref(msg); - dbus_connection_flush(conn); - msg = reply; - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_seesionid = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timelow = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timemid = dui32Temp; - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timehiandver = dui32Temp; - - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_clockseqandnode_outsize = dui32Temp; - - if (*session_serviceid_clockseqandnode_outsize > 0) - { - bResult = - dbus_message_iter_next( - &structIter - ); - - dbus_message_iter_recurse( - &structIter, - &ArrayIter); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &session_serviceid_clockseqandnode_temp, - &session_serviceid_clockseqandnode_realsize - ); - } - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_opscnt = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_context = dui64Temp; - - - printf("libdbuscgpw got reply of method call teec close session: \n"); - printf(" session_seesionid = 0x %8.8x \n", - *session_seesionid - ); -#if 0 - printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", - *session_serviceid_timelow - ); - printf(" TEEC_Session session_serviceid_timemid = 0x %8.8x \n", - *session_serviceid_timemid - ); - printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", - *session_serviceid_timehiandver - ); - printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); - printf(" "); - for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { - printf(" %2.2x", - session_serviceid_clockseqandnode_temp[i] - ); - } - printf("\n"); - printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", - *session_serviceid_clockseqandnode_outsize - ); - printf(" TEEC_Session session_opscnt = 0x %8.8x \n", - *session_opscnt - ); - printf(" TEEC_Session session_head_next = 0x %16.16lx \n", - *session_head_next - ); - printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", - *session_head_prev - ); -#endif - printf(" session_context = 0x %16.16lx \n", - *session_context - ); - - if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && - session_serviceid_clockseqandnode_temp != NULL && - session_serviceid_clockseqandnode_realsize > 0 - ) - { - memcpy( - session_serviceid_clockseqandnode, - session_serviceid_clockseqandnode_temp, - session_serviceid_clockseqandnode_realsize * sizeof(uint32_t) - ); - *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *session_serviceid_clockseqandnode_outsize = 0; - } - - // free msg - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return 0; -} - - -int32_t -method_call_teec_invokecommand( - const char *workername, - - uint32_t in_session_sessionid, - uint32_t in_session_serviceid_timelow, - uint32_t in_session_serviceid_timemid, - uint32_t in_session_serviceid_timehiandver, - uint32_t *in_session_serviceid_clockseqandnode, - uint32_t in_session_serviceid_clockseqandnode_size, - uint32_t in_session_opscnt, - uint64_t in_session_head_next, - uint64_t in_session_head_prev, - uint64_t in_session_context, - - uint32_t commandid, - - uint32_t in_operation_started, - uint32_t in_operation_paramtypes, - - uint64_t in_operation_param1_tmpref_buffer, - uint32_t in_operation_param1_tmpref_size, - uint64_t in_operation_param1_memref_parent, - uint32_t in_operation_param1_memref_parent_flag, - uint32_t in_operation_param1_memref_size, - uint32_t in_operation_param1_memref_offset, - uint32_t in_operation_param1_value_a, - uint32_t in_operation_param1_value_b, - int32_t in_operation_param1_ionref_ionsharefd, - uint32_t in_operation_param1_ionref_ionsize, - - uint64_t in_operation_param2_tmpref_buffer, - uint32_t in_operation_param2_tmpref_size, - uint64_t in_operation_param2_memref_parent, - uint32_t in_operation_param2_memref_parent_flag, - uint32_t in_operation_param2_memref_size, - uint32_t in_operation_param2_memref_offset, - uint32_t in_operation_param2_value_a, - uint32_t in_operation_param2_value_b, - int32_t in_operation_param2_ionref_ionsharefd, - uint32_t in_operation_param2_ionref_ionsize, - - uint64_t in_operation_param3_tmpref_buffer, - uint32_t in_operation_param3_tmpref_size, - uint64_t in_operation_param3_memref_parent, - uint32_t in_operation_param3_memref_parent_flag, - uint32_t in_operation_param3_memref_size, - uint32_t in_operation_param3_memref_offset, - uint32_t in_operation_param3_value_a, - uint32_t in_operation_param3_value_b, - int32_t in_operation_param3_ionref_ionsharefd, - uint32_t in_operation_param3_ionref_ionsize, - - uint64_t in_operation_param4_tmpref_buffer, - uint32_t in_operation_param4_tmpref_size, - uint64_t in_operation_param4_memref_parent, - uint32_t in_operation_param4_memref_parent_flag, - uint32_t in_operation_param4_memref_size, - uint32_t in_operation_param4_memref_offset, - uint32_t in_operation_param4_value_a, - uint32_t in_operation_param4_value_b, - int32_t in_operation_param4_ionref_ionsharefd, - uint32_t in_operation_param4_ionref_ionsize, - - uint64_t in_operation_session, - int32_t in_operation_cancelflag, - - uint32_t in_returnorigin, - - uint32_t *in_buffer1, - uint32_t in_buffer1_size, - uint32_t *in_buffer2, - uint32_t in_buffer2_size, - uint32_t *in_buffer3, - uint32_t in_buffer3_size, - uint32_t *in_buffer4, - uint32_t in_buffer4_size, - - - uint32_t *teecresult, - - uint32_t *session_sessionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context, - - uint32_t *operation_started, - uint32_t *operation_paramtypes, - - uint64_t *operation_param1_tmpref_buffer, - uint32_t *operation_param1_tmpref_size, - uint64_t *operation_param1_memref_parent, - uint32_t *operation_param1_memref_parent_flag, - uint32_t *operation_param1_memref_size, - uint32_t *operation_param1_memref_offset, - uint32_t *operation_param1_value_a, - uint32_t *operation_param1_value_b, - int32_t *operation_param1_ionref_ionsharefd, - uint32_t *operation_param1_ionref_ionsize, - - uint64_t *operation_param2_tmpref_buffer, - uint32_t *operation_param2_tmpref_size, - uint64_t *operation_param2_memref_parent, - uint32_t *operation_param2_memref_parent_flag, - uint32_t *operation_param2_memref_size, - uint32_t *operation_param2_memref_offset, - uint32_t *operation_param2_value_a, - uint32_t *operation_param2_value_b, - int32_t *operation_param2_ionref_ionsharefd, - uint32_t *operation_param2_ionref_ionsize, - - uint64_t *operation_param3_tmpref_buffer, - uint32_t *operation_param3_tmpref_size, - uint64_t *operation_param3_memref_parent, - uint32_t *operation_param3_memref_parent_flag, - uint32_t *operation_param3_memref_size, - uint32_t *operation_param3_memref_offset, - uint32_t *operation_param3_value_a, - uint32_t *operation_param3_value_b, - int32_t *operation_param3_ionref_ionsharefd, - uint32_t *operation_param3_ionref_ionsize, - - uint64_t *operation_param4_tmpref_buffer, - uint32_t *operation_param4_tmpref_size, - uint64_t *operation_param4_memref_parent, - uint32_t *operation_param4_memref_parent_flag, - uint32_t *operation_param4_memref_size, - uint32_t *operation_param4_memref_offset, - uint32_t *operation_param4_value_a, - uint32_t *operation_param4_value_b, - int32_t *operation_param4_ionref_ionsharefd, - uint32_t *operation_param4_ionref_ionsize, - - uint64_t *operation_session, - int32_t *operation_cancelflag, - - uint32_t *returnorigin, - - uint32_t *buffer1, - uint32_t buffer1_size, - uint32_t *buffer1_outsize, - uint32_t *buffer2, - uint32_t buffer2_size, - uint32_t *buffer2_outsize, - uint32_t *buffer3, - uint32_t buffer3_size, - uint32_t *buffer3_outsize, - uint32_t *buffer4, - uint32_t buffer4_size, - uint32_t *buffer4_outsize -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - DBusMessageIter structIter; - DBusMessageIter ArrayIter; - int ret; - int iType; - dbus_uint32_t *session_serviceid_clockseqandnode_temp = NULL; - int session_serviceid_clockseqandnode_realsize; - dbus_int32_t di32Temp; - dbus_uint32_t dui32Temp; - dbus_uint64_t dui64Temp; - char buf[2]; - buf[0] = DBUS_TYPE_UINT32; - buf[1] = '\0'; - - dbus_uint32_t *buffer1_temp = NULL; - int buffer1_realsize; - dbus_uint32_t *buffer2_temp = NULL; - int buffer2_realsize; - dbus_uint32_t *buffer3_temp = NULL; - int buffer3_realsize; - dbus_uint32_t *buffer4_temp = NULL; - int buffer4_realsize; - - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return -1; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return -1; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "TEEC_InvokeCommand" - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return -1; - } - - - // append arguments - dbus_message_iter_init_append(msg, &args); - dbus_message_iter_open_container( - &args, - DBUS_TYPE_STRUCT, - NULL, - &structIter - ); - - - dui32Temp = in_session_sessionid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timelow; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timemid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_timehiandver; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_session_serviceid_clockseqandnode_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_session_serviceid_clockseqandnode_size > 0 && - in_session_serviceid_clockseqandnode != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_session_opscnt; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_session_head_next; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_session_head_prev; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_session_context; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - - dui32Temp = commandid; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - - dui32Temp = in_operation_started; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_paramtypes; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param1_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param1_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_memref_parent_flag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param1_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param1_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param2_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param2_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_memref_parent_flag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param2_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param2_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param3_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param3_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_memref_parent_flag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param3_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param3_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param4_tmpref_buffer; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_tmpref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_param4_memref_parent; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_memref_parent_flag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_memref_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_memref_offset; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_value_a; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_value_b; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_param4_ionref_ionsharefd; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_operation_param4_ionref_ionsize; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui64Temp = in_operation_session; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT64, - &dui64Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - di32Temp = in_operation_cancelflag; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_INT32, - &di32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_returnorigin; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dui32Temp = in_buffer1_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_buffer1_size > 0 && - in_buffer1 != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_buffer1, - in_buffer1_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_buffer2_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_buffer2_size > 0 && - in_buffer2 != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_buffer2, - in_buffer2_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_buffer3_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_buffer3_size > 0 && - in_buffer3 != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_buffer3, - in_buffer3_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dui32Temp = in_buffer4_size; - bResult = - dbus_message_iter_append_basic( - &structIter, - DBUS_TYPE_UINT32, - &dui32Temp - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - if (in_buffer4_size > 0 && - in_buffer4 != NULL) - { - dbus_message_iter_open_container( - &structIter, - DBUS_TYPE_ARRAY, - buf, - &ArrayIter - ); - - bResult = - dbus_message_iter_append_fixed_array( - &ArrayIter, - DBUS_TYPE_UINT32, - &in_buffer4, - in_buffer4_size - ); - if (!bResult) - { - fprintf(stderr, "Out Of Memory!\n"); - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - dbus_message_iter_close_container( - &args, - &structIter - ); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_close_container( - &structIter, - &ArrayIter - ); - } - - dbus_message_iter_close_container( - &args, - &structIter - ); - - /* - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - dbus_connection_flush(conn); - dbus_message_unref(msg); - return -1; - } - - dbus_connection_flush(conn); - dbus_message_unref(msg); - - printf("\n"); - printf("Method Call Teec Invoke Command Sent. \n"); - - ///////////////////////////////////////////////////////////////////////////////////// - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - return -1; - } - - // free the pending message handle - dbus_pending_call_unref(pending); - */ - - // printf("\n"); - printf("libdbuscgpw method call teec invoke command sent. \n"); - - DBusMessage *reply; - reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "libdbuscgpw: invokecommand send_with_reply_and_block error, %s \n", err.message); - dbus_error_free(&err); - - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return -1; - } - if (reply == NULL) - { - fprintf(stderr, "libdbuscgpw: invokecommand dbus reply error \n"); - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return -1; - } - - dbus_message_unref(msg); - dbus_connection_flush(conn); - msg = reply; - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - dbus_message_iter_recurse( - &args, - &structIter - ); - - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *teecresult = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_sessionid = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timelow = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timemid = dui32Temp; - - - bResult = - dbus_message_iter_next( - &structIter - ); - if (!bResult) - { - fprintf(stderr, "Message has too few arguments!\n"); - dbus_message_unref(msg); - return -1; - } - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_timehiandver = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_serviceid_clockseqandnode_outsize = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - if (*session_serviceid_clockseqandnode_outsize > 0) - { - - dbus_message_iter_recurse( - &structIter, - &ArrayIter - ); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &session_serviceid_clockseqandnode_temp, - &session_serviceid_clockseqandnode_realsize - ); - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *session_opscnt = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_next = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_head_prev = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *session_context = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_started = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_paramtypes = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param1_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param1_memref_parent = dui64Temp; - - bResult = dbus_message_iter_next(&structIter); - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_memref_parent_flag = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param1_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param1_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param2_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param2_memref_parent = dui64Temp; - - bResult = dbus_message_iter_next(&structIter); - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_memref_parent_flag = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param2_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param2_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param3_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param3_memref_parent = dui64Temp; - - bResult = dbus_message_iter_next(&structIter); - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_memref_parent_flag = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param3_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param3_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param4_tmpref_buffer = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_tmpref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_param4_memref_parent = dui64Temp; - - bResult = dbus_message_iter_next(&structIter); - iType = dbus_message_iter_get_arg_type(&structIter); - if (iType != DBUS_TYPE_UINT32) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_memref_parent_flag = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_memref_size = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_memref_offset = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_value_a = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_value_b = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_param4_ionref_ionsharefd = di32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *operation_param4_ionref_ionsize = dui32Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT64 - ) - { - fprintf(stderr, "Argument is not UINT64.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui64Temp - ); - *operation_session = dui64Temp; - - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_INT32 - ) - { - fprintf(stderr, "Argument is not INT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &di32Temp - ); - *operation_cancelflag = di32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *returnorigin = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *buffer1_outsize = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - if (*buffer1_outsize > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter - ); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &buffer1_temp, - &buffer1_realsize - ); - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *buffer2_outsize = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - if (*buffer2_outsize > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter - ); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &buffer2_temp, - &buffer2_realsize - ); - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *buffer3_outsize = dui32Temp; - bResult = - dbus_message_iter_next( - &structIter - ); - - if (*buffer3_outsize > 0) - { - dbus_message_iter_recurse( - &structIter, - &ArrayIter - ); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &buffer3_temp, - &buffer3_realsize - ); - bResult = - dbus_message_iter_next( - &structIter - ); - } - - iType = - dbus_message_iter_get_arg_type( - &structIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_basic( - &structIter, - &dui32Temp - ); - *buffer4_outsize = dui32Temp; - - if (*buffer4_outsize > 0) - { - bResult = - dbus_message_iter_next( - &structIter - ); - - dbus_message_iter_recurse( - &structIter, - &ArrayIter - ); - - iType = - dbus_message_iter_get_arg_type( - &ArrayIter - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - dbus_message_unref(msg); - return -1; - } - dbus_message_iter_get_fixed_array( - &ArrayIter, - &buffer4_temp, - &buffer4_realsize - ); - } - - - printf("libdbuscgpw got reply of method call teec invoke command: \n"); - printf(" teecresult = 0x %8.8x \n", - *teecresult); - printf(" session_seesionid = 0x %8.8x \n", - *session_sessionid - ); -#if 0 - printf(" TEEC_Session session_serviceid_timelow = 0x %8.8x \n", - *session_serviceid_timelow - ); - printf(" TEEC_Session session_serviceid_timemid = 0x %8.8x \n", - *session_serviceid_timemid - ); - printf(" TEEC_Session session_serviceid_timehiandver = 0x %8.8x \n", - *session_serviceid_timehiandver - ); - printf(" TEEC_Session session_serviceid_clockseqandnode = \n"); - if ( *session_serviceid_clockseqandnode_outsize > 0 && - session_serviceid_clockseqandnode_temp != NULL - ) - { - for (int i = 0; i < session_serviceid_clockseqandnode_realsize; i++) { - printf(" %2.2x", - session_serviceid_clockseqandnode_temp[i] - ); - } - printf("\n"); - } - printf(" TEEC_Session clockseqandnode_outsize = 0x %8.8x \n", - *session_serviceid_clockseqandnode_outsize - ); - printf(" TEEC_Session session_opscnt = 0x %8.8x \n", - *session_opscnt - ); - printf(" TEEC_Session session_head_next = 0x %16.16lx \n", - *session_head_next - ); - printf(" TEEC_Session session_head_prev = 0x %16.16lx \n", - *session_head_prev - ); - printf(" TEEC_Session session_context = 0x %16.16lx \n", - *session_context - ); - printf(" TEEC_Session session_context = 0x %16.16lx \n", - *session_context - ); - printf(" TEEC_Session operation_started = 0x %8.8x \n", - *operation_started - ); - printf(" TEEC_Session operation_paramtypes = 0x %8.8x \n", - *operation_paramtypes - ); - printf(" TEEC_Session operation_param1_tmpref_buffer = 0x %16.16lx \n", - *operation_param1_tmpref_buffer - ); - printf(" TEEC_Session operation_param1_tmpref_size = 0x %8.8x \n", - *operation_param1_tmpref_size - ); - printf(" TEEC_Session operation_param1_memref_parent = 0x %16.16lx \n", - *operation_param1_memref_parent - ); - printf(" TEEC_Session operation_param1_memref_size = 0x %8.8x \n", - *operation_param1_memref_size - ); - printf(" TEEC_Session operation_param1_memref_offse = 0x %8.8x \n", - *operation_param1_memref_offset - ); - printf(" TEEC_Session operation_param1_value_a = 0x %8.8x \n", - *operation_param1_value_a - ); - printf(" TEEC_Session operation_param1_value_b = 0x %8.8x \n", - *operation_param1_value_b - ); - printf(" TEEC_Session operation_param1_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param1_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param1_ionref_ionsize = 0x %8.8x \n", - *operation_param1_ionref_ionsize - ); - - printf(" TEEC_Session operation_param2_tmpref_buffer = 0x %16.16lx \n", - *operation_param2_tmpref_buffer - ); - printf(" TEEC_Session operation_param2_tmpref_size = 0x %8.8x \n", - *operation_param2_tmpref_size - ); - printf(" TEEC_Session operation_param2_memref_parent = 0x %16.16lx \n", - *operation_param2_memref_parent - ); - printf(" TEEC_Session operation_param2_memref_size = 0x %8.8x \n", - *operation_param2_memref_size - ); - printf(" TEEC_Session operation_param2_memref_offset = 0x %8.8x \n", - *operation_param2_memref_offset - ); - printf(" TEEC_Session operation_param2_value_a = 0x %8.8x \n", - *operation_param2_value_a - ); - printf(" TEEC_Session operation_param2_value_b = 0x %8.8x \n", - *operation_param2_value_b - ); - printf(" TEEC_Session operation_param2_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param2_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param2_ionref_ionsize = 0x %8.8x \n", - *operation_param2_ionref_ionsize - ); - - printf(" TEEC_Session operation_param3_tmpref_buffer = 0x %16.16lx \n", - *operation_param3_tmpref_buffer - ); - printf(" TEEC_Session operation_param3_tmpref_size = 0x %8.8x \n", - *operation_param3_tmpref_size - ); - printf(" TEEC_Session operation_param3_memref_parent = 0x %16.16lx \n", - *operation_param3_memref_parent - ); - printf(" TEEC_Session operation_param3_memref_size = 0x %8.8x \n", - *operation_param3_memref_size - ); - printf(" TEEC_Session operation_param3_memref_offset = 0x %8.8x \n", - *operation_param3_memref_offset - ); - printf(" TEEC_Session operation_param3_value_a = 0x %8.8x \n", - *operation_param3_value_a - ); - printf(" TEEC_Session operation_param3_value_b = 0x %8.8x \n", - *operation_param3_value_b - ); - printf(" TEEC_Session operation_param3_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param3_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param3_ionref_ionsize = 0x %8.8x \n", - *operation_param3_ionref_ionsize - ); - - printf(" TEEC_Session operation_param4_tmpref_buffer = 0x %16.16lx \n", - *operation_param4_tmpref_buffer - ); - printf(" TEEC_Session operation_param4_tmpref_size = 0x %8.8x \n", - *operation_param4_tmpref_size - ); - printf(" TEEC_Session operation_param4_memref_parent = 0x %16.16lx \n", - *operation_param4_memref_parent - ); - printf(" TEEC_Session operation_param4_memref_size = 0x %8.8x \n", - *operation_param4_memref_size - ); - printf(" TEEC_Session operation_param4_memref_offset = 0x %8.8x \n", - *operation_param4_memref_offset - ); - printf(" TEEC_Session operation_param4_value_a = 0x %8.8x \n", - *operation_param4_value_a - ); - printf(" TEEC_Session operation_param4_value_b = 0x %8.8x \n", - *operation_param4_value_b - ); - printf(" TEEC_Session operation_param4_ionref_ionsharefd = 0x %8.8x \n", - (unsigned int)*operation_param4_ionref_ionsharefd - ); - printf(" TEEC_Session operation_param4_ionref_ionsize = 0x %8.8x \n", - *operation_param4_ionref_ionsize - ); - - printf(" TEEC_Session operation_session = 0x %16.16lx \n", - *operation_session - ); - printf(" TEEC_Session operation_cancelflag = 0x %8.8x \n", - (unsigned int)*operation_cancelflag - ); - printf(" returnorigin = 0x %8.8x \n", - *returnorigin - ); - - printf(" buffer1 = \n"); - if (buffer1_temp != NULL) - { - for (int i = 0; i < buffer1_realsize; i++) { - printf(" %2.2x", - buffer1_temp[i] - ); - } - printf("\n"); - } - printf(" buffer1_outsize = 0x %8.8x \n", - *buffer1_outsize - ); - - printf(" buffer2 = \n"); - if (buffer2_temp != NULL) - { - for (int i = 0; i < buffer2_realsize; i++) { - printf(" %2.2x", - buffer2_temp[i] - ); - } - printf("\n"); - } - printf(" buffer2_outsize = 0x %8.8x \n", - *buffer2_outsize - ); - - printf(" buffer3 = \n"); - if (buffer3_temp != NULL) - { - for (int i = 0; i < buffer3_realsize; i++) { - printf(" %2.2x", - buffer3_temp[i] - ); - } - printf("\n"); - } - printf(" buffer3_outsize = 0x %8.8x \n", - *buffer3_outsize - ); - - if (buffer4_temp != NULL) - { - printf(" buffer4 = \n"); - for (int i = 0; i < buffer4_realsize; i++) { - printf(" %2.2x", - buffer4_temp[i] - ); - } - printf("\n"); - } - printf(" buffer4_outsize = 0x %8.8x \n", - *buffer4_outsize - ); -#endif - - if (session_serviceid_clockseqandnode_size >= session_serviceid_clockseqandnode_realsize && - session_serviceid_clockseqandnode != NULL && - session_serviceid_clockseqandnode_temp != NULL && - session_serviceid_clockseqandnode_realsize > 0 - ) - { - memcpy( - session_serviceid_clockseqandnode, - session_serviceid_clockseqandnode_temp, - session_serviceid_clockseqandnode_realsize * sizeof(uint32_t) - ); - *session_serviceid_clockseqandnode_outsize = session_serviceid_clockseqandnode_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *session_serviceid_clockseqandnode_outsize = 0; - } - - if (buffer1_size >= (uint32_t) buffer1_realsize && - buffer1 != NULL && - buffer1_temp != NULL && - buffer1_realsize > 0 - ) - { - memcpy( - buffer1, - buffer1_temp, - buffer1_realsize * sizeof(uint32_t) - ); - *buffer1_outsize = buffer1_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *buffer1_outsize = 0; - } - - if (buffer2_size >= (uint32_t) buffer2_realsize && - buffer2 != NULL && - buffer2_temp != NULL && - buffer2_realsize > 0 - ) - { - memcpy( - buffer2, - buffer2_temp, - buffer2_realsize * sizeof(uint32_t) - ); - *buffer2_outsize = buffer2_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *buffer2_outsize = 0; - } - - if (buffer3_size >= (uint32_t) buffer3_realsize && - buffer3 != NULL && - buffer3_temp != NULL && - buffer3_realsize > 0 - ) - { - memcpy( - buffer3, - buffer3_temp, - buffer3_realsize * sizeof(uint32_t) - ); - *buffer3_outsize = buffer3_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *buffer3_outsize = 0; - } - - if (buffer4_size >= (uint32_t) buffer4_realsize && - buffer4 != NULL && - buffer4_temp != NULL && - buffer4_realsize > 0 - ) - { - memcpy( - buffer4, - buffer4_temp, - buffer4_realsize * sizeof(uint32_t) - ); - *buffer4_outsize = buffer4_realsize; - } else - { - // dbus_message_unref(msg); - // return -1; - *buffer4_outsize = 0; - } - - - // free msg - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); - - return 0; -} - - -/** - * Call a method on a remote object - */ -void -method_call_destroy_threadpool( - const char *workername -) -{ - DBusConnection *conn = NULL; - DBusMessage *msg; - DBusMessageIter args; - // DBusConnection* conn; - DBusError err; - DBusPendingCall *pending; - dbus_bool_t bResult; - int ret; - int iType; - unsigned char name[] = "threadpool"; - unsigned char *charp; - dbus_uint32_t retcode; - - // initialiset the errors - dbus_error_init(&err); - - char dbusname[1024]; - if (conn == NULL) - { - // connect to the system bus and check for errors - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Connection Error (%s)\n", err.message); - dbus_error_free(&err); - } - if (NULL == conn) - { - return; - } - - memset((uint8_t *) dbusname, 0, 1024); - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t u64time = (long unsigned int) (tv.tv_sec * 1000000 + tv.tv_usec); - srand(u64time); - sprintf(dbusname, - "%s.method.caller%16.16lx%16.16lx", - workername, - u64time, - (long unsigned int) rand() - ); - // request our name on the bus - ret = - dbus_bus_request_name( - conn, - dbusname, - DBUS_NAME_FLAG_REPLACE_EXISTING, - &err - ); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "Name Error (%s)\n", err.message); - dbus_error_free(&err); - dbus_connection_flush(conn); - } - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) - { - dbus_connection_flush(conn); - return; - } - } - - // create a new method call and check for errors - char objname[1024]; - char interfacename[1024]; - memset((uint8_t *) dbusname, 0, 1024); - sprintf(dbusname, "%s.method.server", workername); - memset((uint8_t *) objname, 0, 1024); - sprintf(objname, "/%s/method/Object", workername); - memset((uint8_t *) interfacename, 0, 1024); - sprintf(interfacename, "%s.method.Type", workername); - msg = - dbus_message_new_method_call( - // "test.method.server", // target for the method call - dbusname, - // "/test/method/Object", // object to call on - objname, - // "test.method.Type", // interface to call on - interfacename, - "Destroy" // method name - ); - if (NULL == msg) - { - fprintf(stderr, "Message Null\n"); - dbus_connection_flush(conn); - return; - } - - // append arguments - dbus_message_iter_init_append(msg, &args); - - charp = name; - if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &charp)) - { - fprintf(stderr, "Out Of Memory!\n"); - return; - } - - /* - // send message and get a handle for a reply - if (!dbus_connection_send_with_reply(conn, msg, &pending, -1)) - { // -1 is default timeout - fprintf(stderr, "Out Of Memory!\n"); - return; - } - if (NULL == pending) - { - fprintf(stderr, "Pending Call Null\n"); - return; - } - dbus_connection_flush(conn); - - printf("\n"); - printf("Method Call Destroy Threadpool Sent. \n"); - - // free message - dbus_message_unref(msg); - - // block until we recieve a reply - dbus_pending_call_block(pending); - - // get the reply message - msg = dbus_pending_call_steal_reply(pending); - if (NULL == msg) - { - fprintf(stderr, "Reply Null\n"); - return; - } - // free the pending message handle - dbus_pending_call_unref(pending); - */ - - // printf("\n"); - printf("libdbuscgpw method call destroygpw sent. \n"); - - DBusMessage *reply; - reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); - if (dbus_error_is_set(&err)) - { - fprintf(stderr, "libdbuscgpw: destroygpw send_with_reply_and_block error, %s \n", err.message); - dbus_error_free(&err); - - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return; - } - if (reply == NULL) - { - fprintf(stderr, "libdbuscgpw: destroygpw dbus reply error \n"); - dbus_message_unref(msg); - dbus_connection_flush(conn); - dbus_connection_close(conn); - dbus_connection_unref(conn); - return; - } - - dbus_message_unref(msg); - dbus_connection_flush(conn); - msg = reply; - - // read the parameters - bResult = - dbus_message_iter_init( - msg, - &args - ); - if (!bResult) - { - fprintf(stderr, "Message has no arguments!\n"); - return; - } - - iType = - dbus_message_iter_get_arg_type( - &args - ); - if ( - iType != DBUS_TYPE_UINT32 - ) - { - fprintf(stderr, "Argument is not UINT32.\n"); - return; - } - dbus_message_iter_get_basic( - &args, - &retcode - ); - - printf("libdbusgpw got reply of method call destroygpw: \n"); - printf(" retcode = 0x%8x \n", retcode); - - // free reply - dbus_message_unref(msg); - - dbus_connection_close(conn); - dbus_connection_unref(conn); -} diff --git a/teeproxy/libdbuscgpw/dbusc_gpw.h b/teeproxy/libdbuscgpw/dbusc_gpw.h deleted file mode 100644 index 714c08c..0000000 --- a/teeproxy/libdbuscgpw/dbusc_gpw.h +++ /dev/null @@ -1,406 +0,0 @@ -#ifndef _DBUSC_GPW_H_ -#define _DBUSC_GPW_H_ - -#include -#include - - -void -receive_signal(void); - -void -send_signal( - char *sigvalue -); - -int32_t -method_call_teec_inicont( - const char *workername, - - const uint8_t *name, size_t name_size, - int32_t in_context_fd, - const uint8_t *in_context_tapath, size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - - uint32_t *teecresult, - int32_t *context_fd, - uint8_t *context_tapath, size_t context_tapath_insize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - uint64_t *context_addr, - uint32_t *context_tapath_outsize -); - -int32_t -method_call_teec_fincont( - const char *workername, - - int32_t in_context_fd, - const uint8_t *in_context_tapath, size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - uint64_t in_context_addr, - - int32_t *context_fd, - uint8_t *context_tapath, size_t context_tapath_insize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - uint32_t *context_tapath_outsize -); - -int32_t -method_call_teec_opensession( - const char *workername, - - int32_t in_context_fd, - const uint8_t *in_context_tapath, - size_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - - uint32_t in_destination_timelow, - uint32_t in_destination_timemid, - uint32_t in_destination_timehiandver, - uint32_t *in_destination_clockseqandnode, - int32_t in_destination_clockseqandnode_size, - uint32_t in_connectionmethod, - uint64_t in_connectiondata, - uint32_t in_operation_started, - uint32_t in_operation_paramtypes, - - uint64_t in_operation_param1_tmpref_buffer, - uint32_t in_operation_param1_tmpref_size, - uint64_t in_operation_param1_memref_parent, - uint32_t in_operation_param1_memref_size, - uint32_t in_operation_param1_memref_offset, - uint32_t in_operation_param1_value_a, - uint32_t in_operation_param1_value_b, - int32_t in_operation_param1_ionref_ionsharefd, - uint32_t in_operation_param1_ionref_ionsize, - - uint64_t in_operation_param2_tmpref_buffer, - uint32_t in_operation_param2_tmpref_size, - uint64_t in_operation_param2_memref_parent, - uint32_t in_operation_param2_memref_size, - uint32_t in_operation_param2_memref_offset, - uint32_t in_operation_param2_value_a, - uint32_t in_operation_param2_value_b, - int32_t in_operation_param2_ionref_ionsharefd, - uint32_t in_operation_param2_ionref_ionsize, - - uint64_t in_operation_param3_tmpref_buffer, - uint32_t in_operation_param3_tmpref_size, - uint64_t in_operation_param3_memref_parent, - uint32_t in_operation_param3_memref_size, - uint32_t in_operation_param3_memref_offset, - uint32_t in_operation_param3_value_a, - uint32_t in_operation_param3_value_b, - int32_t in_operation_param3_ionref_ionsharefd, - uint32_t in_operation_param3_ionref_ionsize, - - uint64_t in_operation_param4_tmpref_buffer, - uint32_t in_operation_param4_tmpref_size, - uint64_t in_operation_param4_memref_parent, - uint32_t in_operation_param4_memref_size, - uint32_t in_operation_param4_memref_offset, - uint32_t in_operation_param4_value_a, - uint32_t in_operation_param4_value_b, - int32_t in_operation_param4_ionref_ionsharefd, - uint32_t in_operation_param4_ionref_ionsize, - - uint64_t in_operation_session, - int32_t in_operation_cancelflag, - - uint32_t in_returnorigin, - - uint64_t in_context_addr, - - - uint32_t *teecresult, - - int32_t *context_fd, - uint8_t *context_tapath, - size_t context_tapath_size, - uint32_t *context_tapath_outsize, - uint64_t *context_sessionlist_next, - uint64_t *context_sessionlist_prev, - uint64_t *context_shrdmemlist_next, - uint64_t *context_shrdmemlist_prev, - uint64_t *context_sharebuffer_buffer, - int64_t *context_sharebuffer_bufferbarrier, - - uint32_t *session_seesionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context, - - uint32_t *operation_started, - uint32_t *operation_paramtypes, - - uint64_t *operation_param1_tmpref_buffer, - uint32_t *operation_param1_tmpref_size, - uint64_t *operation_param1_memref_parent, - uint32_t *operation_param1_memref_size, - uint32_t *operation_param1_memref_offset, - uint32_t *operation_param1_value_a, - uint32_t *operation_param1_value_b, - int32_t *operation_param1_ionref_ionsharefd, - uint32_t *operation_param1_ionref_ionsize, - - uint64_t *operation_param2_tmpref_buffer, - uint32_t *operation_param2_tmpref_size, - uint64_t *operation_param2_memref_parent, - uint32_t *operation_param2_memref_size, - uint32_t *operation_param2_memref_offset, - uint32_t *operation_param2_value_a, - uint32_t *operation_param2_value_b, - int32_t *operation_param2_ionref_ionsharefd, - uint32_t *operation_param2_ionref_ionsize, - - uint64_t *operation_param3_tmpref_buffer, - uint32_t *operation_param3_tmpref_size, - uint64_t *operation_param3_memref_parent, - uint32_t *operation_param3_memref_size, - uint32_t *operation_param3_memref_offset, - uint32_t *operation_param3_value_a, - uint32_t *operation_param3_value_b, - int32_t *operation_param3_ionref_ionsharefd, - uint32_t *operation_param3_ionref_ionsize, - - uint64_t *operation_param4_tmpref_buffer, - uint32_t *operation_param4_tmpref_size, - uint64_t *operation_param4_memref_parent, - uint32_t *operation_param4_memref_size, - uint32_t *operation_param4_memref_offset, - uint32_t *operation_param4_value_a, - uint32_t *operation_param4_value_b, - int32_t *operation_param4_ionref_ionsharefd, - uint32_t *operation_param4_ionref_ionsize, - - uint64_t *operation_session, - int32_t *operation_cancelflag, - - uint32_t *returnorigin -); - -int32_t -method_call_teec_closesession( - const char *workername, - - uint32_t in_session_seesionid, - uint32_t in_session_serviceid_timelow, - uint32_t in_session_serviceid_timemid, - uint32_t in_session_serviceid_timehiandver, - uint32_t *in_session_serviceid_clockseqandnode, - int32_t in_session_serviceid_clockseqandnode_size, - uint32_t in_session_opscnt, - uint64_t in_session_head_next, - uint64_t in_session_head_prev, - uint64_t in_session_context, - - uint32_t *session_seesionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context -); - -int32_t -method_call_teec_invokecommand( - const char *workername, - - uint32_t in_session_seesionid, - uint32_t in_session_serviceid_timelow, - uint32_t in_session_serviceid_timemid, - uint32_t in_session_serviceid_timehiandver, - uint32_t *in_session_serviceid_clockseqandnode, - uint32_t in_session_serviceid_clockseqandnode_size, - uint32_t in_session_opscnt, - uint64_t in_session_head_next, - uint64_t in_session_head_prev, - uint64_t in_session_context, - - uint32_t commandid, - - uint32_t in_operation_started, - uint32_t in_operation_paramtypes, - - uint64_t in_operation_param1_tmpref_buffer, - uint32_t in_operation_param1_tmpref_size, - uint64_t in_operation_param1_memref_parent, - uint32_t in_operation_param1_memref_parent_flag, - uint32_t in_operation_param1_memref_size, - uint32_t in_operation_param1_memref_offset, - uint32_t in_operation_param1_value_a, - uint32_t in_operation_param1_value_b, - int32_t in_operation_param1_ionref_ionsharefd, - uint32_t in_operation_param1_ionref_ionsize, - - uint64_t in_operation_param2_tmpref_buffer, - uint32_t in_operation_param2_tmpref_size, - uint64_t in_operation_param2_memref_parent, - uint32_t in_operation_param2_memref_parent_flag, - uint32_t in_operation_param2_memref_size, - uint32_t in_operation_param2_memref_offset, - uint32_t in_operation_param2_value_a, - uint32_t in_operation_param2_value_b, - int32_t in_operation_param2_ionref_ionsharefd, - uint32_t in_operation_param2_ionref_ionsize, - - uint64_t in_operation_param3_tmpref_buffer, - uint32_t in_operation_param3_tmpref_size, - uint64_t in_operation_param3_memref_parent, - uint32_t in_operation_param3_memref_parent_flag, - uint32_t in_operation_param3_memref_size, - uint32_t in_operation_param3_memref_offset, - uint32_t in_operation_param3_value_a, - uint32_t in_operation_param3_value_b, - int32_t in_operation_param3_ionref_ionsharefd, - uint32_t in_operation_param3_ionref_ionsize, - - uint64_t in_operation_param4_tmpref_buffer, - uint32_t in_operation_param4_tmpref_size, - uint64_t in_operation_param4_memref_parent, - uint32_t in_operation_param4_memref_parent_flag, - uint32_t in_operation_param4_memref_size, - uint32_t in_operation_param4_memref_offset, - uint32_t in_operation_param4_value_a, - uint32_t in_operation_param4_value_b, - int32_t in_operation_param4_ionref_ionsharefd, - uint32_t in_operation_param4_ionref_ionsize, - - uint64_t in_operation_session, - int32_t in_operation_cancelflag, - - uint32_t in_returnorigin, - - uint32_t *in_buffer1, - uint32_t in_buffer1_size, - uint32_t *in_buffer2, - uint32_t in_buffer2_size, - uint32_t *in_buffer3, - uint32_t in_buffer3_size, - uint32_t *in_buffer4, - uint32_t in_buffer4_size, - - - uint32_t *teecresult, - - uint32_t *session_seesionid, - uint32_t *session_serviceid_timelow, - uint32_t *session_serviceid_timemid, - uint32_t *session_serviceid_timehiandver, - uint32_t *session_serviceid_clockseqandnode, - int32_t session_serviceid_clockseqandnode_size, - uint32_t *session_serviceid_clockseqandnode_outsize, - uint32_t *session_opscnt, - uint64_t *session_head_next, - uint64_t *session_head_prev, - uint64_t *session_context, - - uint32_t *operation_started, - uint32_t *operation_paramtypes, - - uint64_t *operation_param1_tmpref_buffer, - uint32_t *operation_param1_tmpref_size, - uint64_t *operation_param1_memref_parent, - uint32_t *operation_param1_memref_parent_flag, - uint32_t *operation_param1_memref_size, - uint32_t *operation_param1_memref_offset, - uint32_t *operation_param1_value_a, - uint32_t *operation_param1_value_b, - int32_t *operation_param1_ionref_ionsharefd, - uint32_t *operation_param1_ionref_ionsize, - - uint64_t *operation_param2_tmpref_buffer, - uint32_t *operation_param2_tmpref_size, - uint64_t *operation_param2_memref_parent, - uint32_t *operation_param2_memref_parent_flag, - uint32_t *operation_param2_memref_size, - uint32_t *operation_param2_memref_offset, - uint32_t *operation_param2_value_a, - uint32_t *operation_param2_value_b, - int32_t *operation_param2_ionref_ionsharefd, - uint32_t *operation_param2_ionref_ionsize, - - uint64_t *operation_param3_tmpref_buffer, - uint32_t *operation_param3_tmpref_size, - uint64_t *operation_param3_memref_parent, - uint32_t *operation_param3_memref_parent_flag, - uint32_t *operation_param3_memref_size, - uint32_t *operation_param3_memref_offset, - uint32_t *operation_param3_value_a, - uint32_t *operation_param3_value_b, - int32_t *operation_param3_ionref_ionsharefd, - uint32_t *operation_param3_ionref_ionsize, - - uint64_t *operation_param4_tmpref_buffer, - uint32_t *operation_param4_tmpref_size, - uint64_t *operation_param4_memref_parent, - uint32_t *operation_param4_memref_parent_flag, - uint32_t *operation_param4_memref_size, - uint32_t *operation_param4_memref_offset, - uint32_t *operation_param4_value_a, - uint32_t *operation_param4_value_b, - int32_t *operation_param4_ionref_ionsharefd, - uint32_t *operation_param4_ionref_ionsize, - - uint64_t *operation_session, - int32_t *operation_cancelflag, - - uint32_t *returnorigin, - - uint32_t *buffer1, - uint32_t buffer1_size, - uint32_t *buffer1_outsize, - uint32_t *buffer2, - uint32_t buffer2_size, - uint32_t *buffer2_outsize, - uint32_t *buffer3, - uint32_t buffer3_size, - uint32_t *buffer3_outsize, - uint32_t *buffer4, - uint32_t buffer4_size, - uint32_t *buffer4_outsize -); - -void -method_call_destroy_threadpool( - const char *workername -); - -#endif /* _DBUSC_GPW_H_ */ diff --git a/teeproxy/libteecc/CMakeLists.txt b/teeproxy/libteecc/CMakeLists.txt deleted file mode 100644 index d27d391..0000000 --- a/teeproxy/libteecc/CMakeLists.txt +++ /dev/null @@ -1,119 +0,0 @@ -# -# - -cmake_minimum_required(VERSION 3.5.1) - -project(teecc C CXX) - -include(common.cmake) - -# Proto file -get_filename_component(gt_proto "./protos/gt.proto" ABSOLUTE) -get_filename_component(gt_proto_path "${gt_proto}" PATH) -# [[get_filename_component(proto "../protos/${proto_name}.proto" ABSOLUTE) -# get_filename_component(proto_dir "${proto}" DIRECTORY)]] - -# Generated sources -set(gt_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/gt.pb.cc") -set(gt_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/gt.pb.h") -set(gt_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/gt.grpc.pb.cc") -set(gt_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/gt.grpc.pb.h") - -add_custom_command( - OUTPUT "${gt_proto_srcs}" "${gt_proto_hdrs}" "${gt_grpc_srcs}" "${gt_grpc_hdrs}" - COMMAND ${_PROTOBUF_PROTOC} - ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}" - --cpp_out "${CMAKE_CURRENT_BINARY_DIR}" - -I "${gt_proto_path}" - --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" - "${gt_proto}" - DEPENDS "${gt_proto}" -) - -# Include generated *.pb.h files -include_directories("${CMAKE_CURRENT_BINARY_DIR}") -include_directories(/usr/include/dbus-1.0/) -include_directories(/usr/lib64/dbus-1.0/include/) -include_directories(${CMAKE_CURRENT_BINARY_DIR}/../include) - -# Introduce variables: -# - CMAKE_INSTALL_LIBDIR -# - CMAKE_INSTALL_BINDIR -# - CMAKE_INSTALL_INCLUDEDIR -include(GNUInstallDirs) - - -set(TEECC_NAME "teecc") -set(LIB_TEECC - ${PROJECT_SOURCE_DIR}/teecc.cc - ${gt_grpc_srcs} - ${gt_proto_srcs} -) -# Install Headers: -set(HEADERS_TEECC - ${PROJECT_SOURCE_DIR}/include/teecc/teec_client_api.h - ${PROJECT_SOURCE_DIR}/include/teecc/tee_client_constants.h - ${PROJECT_SOURCE_DIR}/include/teecc/tee_client_list.h - ${PROJECT_SOURCE_DIR}/include/teecc/tee_client_log.h - ${PROJECT_SOURCE_DIR}/include/teecc/tee_client_type.h -) -install( - FILES ${HEADERS_TEECC} - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${TEECC_NAME}/${TARGET_NAME}" -) - - -# gt_grpc_proto -add_library(gt_grpc_proto - ${gt_grpc_srcs} - ${gt_grpc_hdrs} - ${gt_proto_srcs} - ${gt_proto_hdrs} -) -target_link_libraries(gt_grpc_proto - ${_REFLECTION} - ${_GRPC_GRPCPP} - ${_PROTOBUF_LIBPROTOBUF} -) - - - -add_library(teecc SHARED - ${LIB_TEECC} -) -target_link_libraries(teecc - gt_grpc_proto - ${_REFLECTION} - ${_GRPC_GRPCPP} - ${_PROTOBUF_LIBPROTOBUF} - yaml-cpp.a -) - -# Install lib -install( - TARGETS "teecc" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" -) -# Install config file -set(teecc_config_dir "$ENV{HOME}/.teecc") -# install( -# DIRECTORY -# DESTINATION ${gpp_config_dir}) -install( - FILES "conf/teecc_config.yaml" - DESTINATION ${teecc_config_dir} -) -# Install certs -set(teecc_certs_dir "$ENV{HOME}/.teecc/certs") -install( - FILES - "certs/ca_crt.pem" - "certs/client_key.pem" - "certs/client_crt.pem" - "certs/gen_client_keycsr.sh" - "certs/msg.txt" - "certs/check_ca_crt.sh" - "certs/check_client_key.sh" - "certs/check_client_crt.sh" - DESTINATION ${teecc_certs_dir} -) diff --git a/teeproxy/libteecc/build/cmake.sh b/teeproxy/libteecc/build/cmake.sh deleted file mode 100644 index 4511f00..0000000 --- a/teeproxy/libteecc/build/cmake.sh +++ /dev/null @@ -1,3 +0,0 @@ -# cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR .. -cmake -DCMAKE_BUILD_TYPE=Debug .. - diff --git a/teeproxy/libteecc/certs/ca_crt.pem b/teeproxy/libteecc/certs/ca_crt.pem deleted file mode 100644 index c1f851a..0000000 --- a/teeproxy/libteecc/certs/ca_crt.pem +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDozCCAougAwIBAgIUZoRrQX6TrtP0Reyf9DbHVJRNDoQwDQYJKoZIhvcNAQEL -BQAwYTELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBUh1YmVpMQ4wDAYDVQQHDAVXdWhh -bjESMBAGA1UECgwJVHJ1c3RDdXRlMQ0wCwYDVQQLDARnUlBDMQ8wDQYDVQQDDAZj -YS5vcmcwHhcNMjIwODIwMDQ1OTUyWhcNMzIwODE3MDQ1OTUyWjBhMQswCQYDVQQG -EwJDTjEOMAwGA1UECAwFSHViZWkxDjAMBgNVBAcMBVd1aGFuMRIwEAYDVQQKDAlU -cnVzdEN1dGUxDTALBgNVBAsMBGdSUEMxDzANBgNVBAMMBmNhLm9yZzCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMYdYD9GChLzSOWmaIcHMqx8itp/7Zvx -7y2qgb23EWCWIz01kPQaCXpuSOi38dFipXFBWo5o3GaezIoSCp66eN3kHGpcluu2 -0nbyh7zdUVCSXhNWbEiwlhC53DDs2SBYWr2KGTRDEcJEXli110v8sEGZQvkj3XGF -B6IbTczMbhpVfJ82RMqGqNYSJ5jCvqw3XOX6xoN4CP3PuAKC6MtEkLLkXQOS72oL -TSE9XoZNqlyhmymAVwQwCV1zT28W/hwKbCN4tVoO+1bwc3togNYO0W7x1GgOoNoZ -va1UNDX1sfW6B041TgSTGQ0OhGzgKWadKHm2UpG2d5NLkaiBUPpvuokCAwEAAaNT -MFEwHQYDVR0OBBYEFKrFU5qoBe2AkvvTiOfwY24T36zTMB8GA1UdIwQYMBaAFKrF -U5qoBe2AkvvTiOfwY24T36zTMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACjfqOa6G596NbFfAAhBFFS+RIueRWdDkBxR7kk+eQ3Z5j4hIBmrA0OS -R6KCrvmvnXxqSBRmuwRfs0e7G76jkUAFFHkslTPLwgklWCarsGXeAkrdgQU7WL4n -NYBNnjUNK11JREUdAXgvzyuLOhjf4l5UvhujWivhviChFB8xpTQfq2d1oE9jsotv -r2opic4ynu69LXd8HZiShabXgQ60/BNOX8D+wb1YzoZlUCKzSH15QRuuEbkj4/Hy -R2+qxUODbuwfqI4fkOvQIIrD2NO89nHpWFtui4ByQEQaeTesus8M8corCekrxr08 -VkxuOGg2U3zWUlLuSZMD2G7KWuDXU78= ------END CERTIFICATE----- diff --git a/teeproxy/libteecc/certs/check_ca_crt.sh b/teeproxy/libteecc/certs/check_ca_crt.sh deleted file mode 100644 index 83cffa1..0000000 --- a/teeproxy/libteecc/certs/check_ca_crt.sh +++ /dev/null @@ -1,42 +0,0 @@ -#! /bin/sh -# Purpose: Alert sysadmin/developer about the cert expiry date in advance -# Author: under license -# ------------------------------------------------------------------------------- - - -_openssl="openssl" - - -# CACRTPEM=$HOME/.gpp/certs/ca_crt.pem -# REGENCRTSCRIPT=${HOME}/gen_ca_crt.sh -CUR_DIR=$( dirname -- "$0"; ) -CACRTPEM=$CUR_DIR/ca_crt.pem -REGENCRTSCRIPT=${CUR_DIR}/gen_ca_crt.sh - -# 7 days in seconds -DAYS="604800" - -# Email settings -_sub=$CACRTPEM" will expire within $DAYS seconds (7 days)" -# _sub="${CACRTPEM} will expire within $DAYS seconds (7 days)" -_from="system-account@your-dommain" -_to="sysadmin@your-domain" - -echo -e '\n'get date of $CACRTPEM: -openssl x509 -in $CACRTPEM -noout -dates - -echo -e '\n'check expiry of $CACRTPEM: -$_openssl x509 -enddate -noout -in "$CACRTPEM" -checkend "$DAYS" -$_openssl x509 -enddate -noout -in "$CACRTPEM" -checkend "$DAYS" | grep -q 'Certificate will expire' -# If will expire, regenerate key and certifcate -# // , and send email -if [ $? -eq 0 ] -then - echo "${_sub}" - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${REGENCRTSCRIPT} -fi diff --git a/teeproxy/libteecc/certs/check_client_crt.sh b/teeproxy/libteecc/certs/check_client_crt.sh deleted file mode 100644 index 769041a..0000000 --- a/teeproxy/libteecc/certs/check_client_crt.sh +++ /dev/null @@ -1,43 +0,0 @@ -#! /bin/sh -# Purpose: Alert sysadmin/developer about the cert expiry date in advance -# Author: under license -# ------------------------------------------------------------------------------- - - -_openssl="openssl" - - -# CRTPEM=$HOME/.gpp/certs/client_crt.pem -# REGENCRTSCRIPT=${HOME}/gen_client_crt.sh -CUR_DIR=$( dirname -- "$0"; ) -CRTPEM=$CUR_DIR/client_crt.pem -REGENCRTSCRIPT=${CUR_DIR}/gen_client_crt.sh - -# 7 days in seconds -DAYS="604800" - -# Email settings -_sub=$CRTPEM" will expire within $DAYS seconds (7 days)" -# _sub="${CRTPEM} will expire within $DAYS seconds (7 days)" -_from="system-account@your-dommain" -_to="sysadmin@your-domain" - - -echo -e '\n'get date of $CRTPEM: -openssl x509 -in $CRTPEM -noout -dates - -echo -e '\n'check expiry of $CRTPEM: -$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" -$_openssl x509 -enddate -noout -in "$CRTPEM" -checkend "$DAYS" | grep -q 'Certificate will expire' -# If will expire, regenerate key and certifcate -# // , and send email -if [ $? -eq 0 ] -then - echo "${_sub}" - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${REGENCRTSCRIPT} -fi diff --git a/teeproxy/libteecc/certs/check_client_key.sh b/teeproxy/libteecc/certs/check_client_key.sh deleted file mode 100644 index c62d32c..0000000 --- a/teeproxy/libteecc/certs/check_client_key.sh +++ /dev/null @@ -1,62 +0,0 @@ -#! /bin/sh -# Purpose: Alert sysadmin/developer about the interity of key in advance -# Author: under license -# ------------------------------------------------------------------------------- - - -_openssl="openssl" - - -# KEYPEM=$HOME/.gpp/certs/client_key.pem -# PUBPEM=$HOME/.gpp/certs/client_pubkey.pem -# CRTPEM=$HOME/.gpp/certs/client_crt.pem -# MSGTXT=$HOME/.gpp/certs/msg.txt -# MSGSIG=$HOME/.gpp/certs/msg.sig -# GENKEYCRTSCRIPT=${HOME}/.gpp/certs/gen_client_keycrt.sh -CUR_DIR=$( dirname -- "$0"; ) -KEYPEM=$CUR_DIR/client_key.pem -PUBPEM=$CUR_DIR/client_pubkey.pem -CRTPEM=$CUR_DIR/client_crt.pem -MSGTXT=${CUR_DIR}/msg.txt -MSGSIG=${CUR_DIR}/msg.sig -GENKEYCRTSCRIPT=${CUR_DIR}/gen_client_keycrt.sh - -echo -e '\n'check integrity of ${KEYPEM}: -# ${_openssl} rsa -in ${KEYPEM} -passin pass:111111 -check -noout -# ${_openssl} rsa -in ${KEYPEM} -check -noout -${_openssl} rsa -in ${KEYPEM} -check -noout | grep -q 'RSA key ok' -if [ $? -ne 0 ] -then - echo "the integrity of "${KEYPEM}" is broken" - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${GENKEYCRTSCRIPT} -else - echo -e "RSA key ok" -fi - -echo -e '\n'use private ${KEYPEM} to sign ${MSGTXT}: -# ${_openssl} dgst -sha256 -sign ${KEYPEM} -passin pass:111111 -out msg.sig msg.txt -${_openssl} dgst -sha256 -sign ${KEYPEM} -out ${MSGSIG} ${MSGTXT} - -echo -e '\n'get public key from ${CRTPEM}: -${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} - -echo -e '\n'use public key in ${CRTPEM} to verify signature of ${MSGTXT}: -# ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt -${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} -${_openssl} dgst -sha256 -verify ${PUBPEM} -signature ${MSGSIG} ${MSGTXT} | grep -q 'Verified OK' -if [ $? -ne 0 ] -then - echo ${KEYPEM}" is not matched with "${CRTPEM} - # mail -s "$_sub" -r "$_from" "$_to" <<< "Warning: The certificate ($CACRTPEM) will expire soon on $HOSTNAME [$(date)]" - # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # - # source ~/bin/cli_app.sh - # push_to_mobile "$0" "$_sub. See $_to email for detailed log. -- $HOSTNAME " >/dev/null - - # bash ${GENKEYCRTSCRIPT} -fi -rm -f ${PUBPEM} diff --git a/teeproxy/libteecc/certs/client_crt.pem b/teeproxy/libteecc/certs/client_crt.pem deleted file mode 100644 index 4056b74..0000000 --- a/teeproxy/libteecc/certs/client_crt.pem +++ /dev/null @@ -1,20 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDTzCCAjcCFD3UsYh/aU1yUsNsej6x2MjHaxBOMA0GCSqGSIb3DQEBCwUAMGEx -CzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIdWJlaTEOMAwGA1UEBwwFV3VoYW4xEjAQ -BgNVBAoMCVRydXN0Q3V0ZTENMAsGA1UECwwEZ1JQQzEPMA0GA1UEAwwGY2Eub3Jn -MB4XDTIyMDgyMDA1MDYzNVoXDTMyMDgxNzA1MDYzNVowZzELMAkGA1UEBhMCQ04x -DjAMBgNVBAgMBUh1YmVpMQ4wDAYDVQQHDAVXdWhhbjESMBAGA1UECgwJVHJ1c3RD -dXRlMQ0wCwYDVQQLDARnUlBDMRUwEwYDVQQDDAxncGNsaWVudC5vcmcwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCi8gFUTU1Fd5quFIUvmO/ViRrN416n -EaDyzt1qFfMU7CMyp6vmw5+xb7+z0bsSlucdCtWTHNFBt7ovZuAuUqRHAUm6Of7B -JNCpLY9aaWnhhwfCBO20wQs82djcMhVpWLfWAwUTrdkPubVpC+5pKUM1e7qWkF5Y -72edrtYjBkmhteq5mc3sZyHz4W0BjdO7vnYJ1PSqNvZt+z5krV1KNJ9D+HPC6CjH -syugS7hYSBVSMvGRk/B6VhhjcEV4QABZV7tCt1z9pfV28N7ODFw3kPbZo1rgAd+O -Os0XaUJx/exoVj9Ky93SPyIVh/pNdNtUFaoSx9VGg8osBFawPDEagPD3AgMBAAEw -DQYJKoZIhvcNAQELBQADggEBAIigZPrS0XsUQ38SSCSjMmqRx4bJcAdjkFnmwCAf -NiEjfdreKF67ID/DuXwNUSp0imNnlpb8Zvim4TiSU+YoT6zPr1o9+KTiE0FHK+lE -+FTyNlKthbIC+x0hShFSQFoxjQzPZXQNcSWWHiGbapzjW5VTa807YUp7rmXopvrP -f3gTw6gzuZKUN+FSTv284kEqrPYA4KsuLJgsZz78uaH1RgHnRwqCRmwNdBLI2Mr8 -+G/mVOL/3gmi87mhqXdxWjCnoPQN+3stop8ZaZOPKtkR9e1vbdPfNZhuUTCG45zf -AyhVFCa2ykfFTE7rP10iGLH8Ek7AYOueImH3esVB5KpJSzM= ------END CERTIFICATE----- diff --git a/teeproxy/libteecc/certs/client_key.pem b/teeproxy/libteecc/certs/client_key.pem deleted file mode 100644 index d0a2b54..0000000 --- a/teeproxy/libteecc/certs/client_key.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: AES-192-CBC,4C084D8A0A073B8F63DD51AEE7F3EF9F - -mQNTKrxaKmWUhzJxNTW9Q74HZ+e9q+oJ1NqlkM5+qQTdoXo/JAblgSDuAWWRby1Y -RgmoFerqp+MDu8SpOHpWr0msvUgGSZ8tDrcjw4762qEnu/aT+q1FAq7tHM1waOtK -Euse0FFXrN4a0vesjQi3u/N4lrv53cl9fXDfg/eVhn+MncrR6sQo+XzhDPskKKhU -ecMn2cEtfb9ozXkSU3VfmOukM6FeA6zIcEr8QjLIP1n258TJmoxilUdebacZZZoO -N2t1gzTLxXmvUKYBt7CIJOeJhY8edQHByUQGCjzt2ZV3hv1AX+eNGYN5Sod/76aT -VbJhKgSXI4necPSc5l8UWV304gQEqcVk+aCyZJiXBF3Z46Fqw8LOQV0llsAsjiPs -llLbKQay8/NeF9XWRKclMeuDfQnU5qGuBblfM5YjWZqmxkC9MFVYgPrMrIxqXZnV -/ZTiApFvE25HJBlbiBo2JIv1jTWRduedq2XchtyUVUCcJ+U0xutpQ3A862Kygaa3 -IBA61BgpmJyrE7V2obgH+W6dY2D5N8W1PVFGONiCdU2ejXXuzuRT+0+TYfkvZHaR -dIvQwF35hzm4GlpHU73q/ZO5axqkPpyaLb6Y8I2+8JZi7Ns2eWjGRNjvs9kbOd0N -WI5JkjYdTPXDAjxA6pOntD2yx0Da9hgPbRf3HBazHUQg8RUQGRg9+mkJOfK720l0 -8DEUq29CUvYfAcWT+bIcZL+DDoHmLmNRi//+tmC0kRs9goRmm8FmgXSl8mQfAm4K -IYBFOd2KEmKItPklCuGWhzneri4qVAzhI8fODGzyLNaEXJkn2CFavgQRo2LIL26V -hGMiafuvtoQOj3HJg9yf5rinodo8agtxlnN0ZI5Li377b9vHJqLBvNdotpscXZk5 -qTlBeWhznFbK+p/VOESk1Lav2oFO7nxph6pV3gOhgRON2BMRp3LlqBsbLaxiNcp2 -RuQSp8QjBOypldmHn1SmTMXqlTxYI7/nzJrLOzlVGOkPJjDeZ3Kf9mvnXsolxjlS -GrhrBcdypG0bsQZO7PcqXr4p9NSlZZHHZXu78hvWZszoWWNHSUdpqnwnxHAn4AsK -X2Ge1n/XBzYCtXbofhjB7uaUqIdoR3O0CaWxl/MKw89v+64tU90fTzbSqKScmBgZ -oM7MEgdRQ/MmJ1kGb9GLVbJuhLdfwocjzRAFyrMI1jScSKP61qqwBNbxDe1n/zC/ -6OPQYh4g35kLBYR/Aht/9KlZ6Yfu5/bX4VZZ+ZgM3skryJsidafdNLttjVz8Nm5l -aqrJepxmCBuUz1r274gtTewEyjLHGkaoUSJ/Z+Q8P99dJ0mnp3yXghx3FNQCdKzU -gqjLk6tauCith9OEskzoZcOPNiigIaqY5J9JWr0VRscOkKaPHFo4rYK9GFBc+WlP -oaUbpBqxG1aGwida62l5gXJ3s9L7GHdea/7J/QJHu4bqWrBJ+PCwqkjaJdvnpIiI -EdcQXy3wbQJPkP2HdusF/FnC/9aSk4PR+X6gX+owDD/qAKNurss7XP0yHm4PRKI9 -kLa/+8sfFNCsny9KJTRYRV8lWz0sag52c3qUlZSRD/63ghKEI2mZdcouTMabCS4F ------END RSA PRIVATE KEY----- diff --git a/teeproxy/libteecc/certs/gen_client_keycsr.sh b/teeproxy/libteecc/certs/gen_client_keycsr.sh deleted file mode 100644 index cbf8077..0000000 --- a/teeproxy/libteecc/certs/gen_client_keycsr.sh +++ /dev/null @@ -1,22 +0,0 @@ -#! /bin/sh - -_openssl="openssl" - -CUR_DIR=$( dirname -- "$0"; ) - - -# KEYPEM=$HOME/.teecc/certs/client_key.pem -# CSRPEM=$HOME/.teecc/certs/client_csr.pem -KEYPEM=$CUR_DIR/client_key.pem -CSRPEM=$CUR_DIR/client_csr.pem -RSAKEYLEN=2048 -SUBSTR="/C=CN/ST=Hubei/L=Wuhan/O=TrustCute/OU=gRPC/CN=gpclient.org" - -echo -e '\n'generate $KEYPEM: -# $_openssl genrsa -passout pass:111111 -aes192 -out $KEYPEM ${RSAKEYLEN} -$_openssl genrsa -aes192 -out $KEYPEM ${RSAKEYLEN} - -echo -e '\n'generate certgen request $CSRPEM: -# $_openssl req -passin pass:111111 -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} -$_openssl req -new -key $KEYPEM -out $CSRPEM -subj ${SUBSTR} - diff --git a/teeproxy/libteecc/certs/msg.txt b/teeproxy/libteecc/certs/msg.txt deleted file mode 100644 index 93388ad..0000000 --- a/teeproxy/libteecc/certs/msg.txt +++ /dev/null @@ -1 +0,0 @@ -verify the integrity of a certificate and private key pair diff --git a/teeproxy/libteecc/changelog.md b/teeproxy/libteecc/changelog.md deleted file mode 100644 index f66c4e1..0000000 --- a/teeproxy/libteecc/changelog.md +++ /dev/null @@ -1,7 +0,0 @@ -# 更新日志 - -## [1.0.0] - 2022-10-11 - -### 新增 - -* 项目初始化,上传第一版 diff --git a/teeproxy/libteecc/common.cmake b/teeproxy/libteecc/common.cmake deleted file mode 100644 index 62099c5..0000000 --- a/teeproxy/libteecc/common.cmake +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright 2018 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# cmake build file for C++ route_guide example. -# Assumes protobuf and gRPC have been installed using cmake. -# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build -# that automatically builds all the dependencies before building route_guide. - -cmake_minimum_required(VERSION 3.5.1) - -# set (CMAKE_CXX_STANDARD 11) -set (CMAKE_CXX_STANDARD 14) - -set (GRPC_FETCHCONTENT 1) - - -if(MSVC) - add_definitions(-D_WIN32_WINNT=0x600) -endif() - -find_package(Threads REQUIRED) - -if(GRPC_AS_SUBMODULE) - # One way to build a projects that uses gRPC is to just include the - # entire gRPC project tree via "add_subdirectory". - # This approach is very simple to use, but the are some potential - # disadvantages: - # * it includes gRPC's CMakeLists.txt directly into your build script - # without and that can make gRPC's internal setting interfere with your - # own build. - # * depending on what's installed on your system, the contents of submodules - # in gRPC's third_party/* might need to be available (and there might be - # additional prerequisites required to build them). Consider using - # the gRPC_*_PROVIDER options to fine-tune the expected behavior. - # - # A more robust approach to add dependency on gRPC is using - # cmake's ExternalProject_Add (see cmake_externalproject/CMakeLists.txt). - - # Include the gRPC's cmake build (normally grpc source code would live - # in a git submodule called "third_party/grpc", but this example lives in - # the same repository as gRPC sources, so we just look a few directories up) - add_subdirectory(../../.. ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL) - message(STATUS "Using gRPC via add_subdirectory.") - - # After using add_subdirectory, we can now use the grpc targets directly from - # this build. - set(_PROTOBUF_LIBPROTOBUF libprotobuf) - set(_REFLECTION grpc++_reflection) - if(CMAKE_CROSSCOMPILING) - find_program(_PROTOBUF_PROTOC protoc) - else() - set(_PROTOBUF_PROTOC $) - endif() - set(_GRPC_GRPCPP grpc++) - if(CMAKE_CROSSCOMPILING) - find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) - else() - set(_GRPC_CPP_PLUGIN_EXECUTABLE $) - endif() -elseif(GRPC_FETCHCONTENT) - # Another way is to use CMake's FetchContent module to clone gRPC at - # configure time. This makes gRPC's source code available to your project, - # similar to a git submodule. - message(STATUS "Using gRPC via add_subdirectory (FetchContent).") - include(FetchContent) - FetchContent_Declare( - grpc - GIT_REPOSITORY https://github.com/grpc/grpc.git - # when using gRPC, you will actually set this to an existing tag, such as - # v1.25.0, v1.26.0 etc.. - # For the purpose of testing, we override the tag used to the commit - # that's currently under test. - # GIT_TAG vGRPC_TAG_VERSION_OF_YOUR_CHOICE - GIT_TAG v1.48.0 - ) - FetchContent_MakeAvailable(grpc) - - # Since FetchContent uses add_subdirectory under the hood, we can use - # the grpc targets directly from this build. - set(_PROTOBUF_LIBPROTOBUF libprotobuf) - set(_REFLECTION grpc++_reflection) - set(_PROTOBUF_PROTOC $) - set(_GRPC_GRPCPP grpc++) - if(CMAKE_CROSSCOMPILING) - find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) - else() - set(_GRPC_CPP_PLUGIN_EXECUTABLE $) - endif() -else() - # This branch assumes that gRPC and all its dependencies are already installed - # on this system, so they can be located by find_package(). - - # Find Protobuf installation - # Looks for protobuf-config.cmake file installed by Protobuf's cmake installation. - set(protobuf_MODULE_COMPATIBLE TRUE) - find_package(Protobuf CONFIG REQUIRED) - message(STATUS "Using protobuf ${Protobuf_VERSION}") - - set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) - set(_REFLECTION gRPC::grpc++_reflection) - if(CMAKE_CROSSCOMPILING) - find_program(_PROTOBUF_PROTOC protoc) - else() - set(_PROTOBUF_PROTOC $) - endif() - - # Find gRPC installation - # Looks for gRPCConfig.cmake file installed by gRPC's cmake installation. - find_package(gRPC CONFIG REQUIRED) - message(STATUS "Using gRPC ${gRPC_VERSION}") - - set(_GRPC_GRPCPP gRPC::grpc++) - if(CMAKE_CROSSCOMPILING) - find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) - else() - set(_GRPC_CPP_PLUGIN_EXECUTABLE $) - endif() -endif() diff --git a/teeproxy/libteecc/conf/teecc_config.yaml b/teeproxy/libteecc/conf/teecc_config.yaml deleted file mode 100644 index a9cfe64..0000000 --- a/teeproxy/libteecc/conf/teecc_config.yaml +++ /dev/null @@ -1,10 +0,0 @@ -GPPROXY_ADDRESS: "gpserver.org:50051" - -NAME_SERVERCA_CERT: "ca_crt.pem" -NAME_CLIENT_KEY: "client_key.pem" -NAME_CLIENT_CERT: "client_crt.pem" - -# 0, no tls -# 1, only server certificate -# 2, server and client certificates -GRPC_TLS: 1 diff --git a/teeproxy/libteecc/include/teecc/tee_client_api.h b/teeproxy/libteecc/include/teecc/tee_client_api.h deleted file mode 100644 index 2cdc80a..0000000 --- a/teeproxy/libteecc/include/teecc/tee_client_api.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved. - * iTrustee licensed under the Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * http://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - * PURPOSE. - * See the Mulan PSL v2 for more details. - * Description: TEE client API definitions - */ - -#ifndef _TEE_CLIENT_API_H_ -#define _TEE_CLIENT_API_H_ - -#ifndef LOG_TAG -#define LOG_TAG NULL -#endif - -#ifdef LOG_NDEBUG -#undef LOG_NDEBUG -#endif -#define LOG_NDEBUG 0 - -#include -#include "tee_client_type.h" -#include "tee_client_log.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define S_VAR_NOT_USED(variable) do { (void)(variable); } while (0) - -#define TEEC_PARAM_TYPES(param0Type, param1Type, param2Type, param3Type) \ - ((param3Type) << 12 | (param2Type) << 8 | (param1Type) << 4 | (param0Type)) - -#define TEEC_PARAM_TYPE_GET(paramTypes, index) \ - (((paramTypes) >> (4*(index))) & 0x0F) - -#define TEEC_VALUE_UNDEF 0xFFFFFFFF - -/* - * initializes a new TEE Context, forming a connection between this Client Application and the TEE - * - * @param name [IN] TEE name (unused) - * @param context [IN/OUT] pointer to TEEC_Context to be initialized - * - * @return TEEC_SUCCESS operation success - * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter - * @return TEEC_ERROR_GENERIC system error unhandled - */ -TEEC_Result TEEC_InitializeContext( - const char *name, - TEEC_Context *context); - -/* - * finalizes an initialized TEE Context, closing the connection between the Client Application and the TEE - * - * @param context [IN/OUT] pointer to TEEC_Context initialized by TEEC_InitializeContext - * - * @return void - */ -void TEEC_FinalizeContext( - TEEC_Context *context); - -/* - * opens a new Session between the Client Application and the specified Trusted Application - * - * @param context [IN/OUT] a pointer to an initialized TEE Context - * @param session [OUT] a pointer to a Session structure to be opened - * @param destination [IN] a pointer to a structure containing the UUID of the destination Trusted Application - * @param connectionMethod [IN] the method of connection to use - * @param connectionData [IN] any necessary data required to support the connection method - * @param operation [IN/OUT] a pointer to an Operation containing a set of Parameters to exchange with the - * Trusted Application - * @param returnOrigin [IN/OUT] a pointer to a variable which will contain the return origin, This field may be NULL - * if the return origin is not needed - * - * @return TEEC_SUCCESS operation success - * @return TEEC_ERROR_BAD_PARAMETERS invalid parametercontext or session or destination is NULL - * @return TEEC_ERROR_ACCESS_DENIED client Application's connection request is denied - * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use - * @return TEEC_ERROR_TRUSTED_APP_LOAD_ERROR load Trusted Application failed - * @return others refer TEEC_ReturnCode - */ -TEEC_Result TEEC_OpenSession( - TEEC_Context *context, - TEEC_Session *session, - const TEEC_UUID *destination, - uint32_t connectionMethod, - const void *connectionData, - TEEC_Operation *operation, - uint32_t *returnOrigin); - -/* - * closes a Session which has been opened with a Trusted Application - * - * @param session [IN/OUT] pointer to a session to be closed - * - * @return void - */ -void TEEC_CloseSession( - TEEC_Session *session); - -/* - * invokes a Command within the specified Session - * - * @param session [IN/OUT] the open Session in which the command will be invoked - * @param commandID [IN] the identifier of the Command within the Trusted Application to invoke - * @param operation [IN/OUT] a pointer to a Client Application initialized TEEC_Operation structure - * @param returnOrigin [IN/OUT] a pointer to a variable which will contain the return origin - * - * @return TEEC_SUCCESS operation success - * @return TEEC_ERROR_BAD_PARAMETERS invalid parametersession is NULL or operation data invalid - * @return TEEC_ERROR_ACCESS_DENIED invoke command operation is denied - * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use - * @return others refer TEEC_ReturnCode - */ -TEEC_Result TEEC_InvokeCommand( - TEEC_Session *session, - uint32_t commandID, - TEEC_Operation *operation, - uint32_t *returnOrigin); - -/* - * registers a block of existing Client Application memory as a block of Shared Memory within - * the scope of the specified TEE Context, in accordance with the parameters which have been set by the - * Client Application inside the sharedMem structure (don't support 0 size data) - * - * @param context [IN/OUT] a pointer to an initialized TEE Context - * @param sharedMem [IN/OUT] a pointer to a Shared Memory structure to register - * - * @return TEEC_SUCCESS operation success - * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter, context or sharedMem is NULL - */ -TEEC_Result TEEC_RegisterSharedMemory( - TEEC_Context *context, - TEEC_SharedMemory *sharedMem); - -/* - * allocates a new block of memory as a block of Shared Memory within the scope of the specified TEE Context - * size of sharedMem should not be 0 - * - * @param context [IN/OUT] a pointer to an initialized TEE Context - * @param sharedMem [IN/OUT] a pointer to a Shared Memory structure to allocate - * - * @return TEEC_SUCCESS operation success - * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter, context or sharedMem is NULL - * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use - */ -TEEC_Result TEEC_AllocateSharedMemory( - TEEC_Context *context, - TEEC_SharedMemory *sharedMem); - -/* - * deregisters or deallocates a previously initialized block of Shared Memory - * if memory is allocated by TEEC_AllocateSharedMemory, system will free this memory - * if memory is registered by TEEC_RegisterSharedMemory, system will not free this memory - * - * @param sharedMem [IN/OUT] a pointer to a valid Shared Memory structure - * - * @return void - */ -void TEEC_ReleaseSharedMemory( - TEEC_SharedMemory *sharedMem); - -/* - * requests the cancellation of a pending open Session operation or a Command invocation operation - * this operation is not supported currently - * - * @param operation [IN/OUT] a pointer to a Client Application instantiated Operation structure - * - * @return void - */ -void TEEC_RequestCancellation( - TEEC_Operation *operation); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/teeproxy/libteecc/include/teecc/tee_client_constants.h b/teeproxy/libteecc/include/teecc/tee_client_constants.h deleted file mode 100644 index eb31c89..0000000 --- a/teeproxy/libteecc/include/teecc/tee_client_constants.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved. - * iTrustee licensed under the Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * http://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - * PURPOSE. - * See the Mulan PSL v2 for more details. - * Description: static definitions of client API - */ - -#ifndef _TEE_CLIENT_CONSTANTS_H_ -#define _TEE_CLIENT_CONSTANTS_H_ - -enum TEEC_ReturnCode { - TEEC_SUCCESS = 0x0, /* success */ - TEEC_ERROR_INVALID_CMD, /* invalid command */ - TEEC_ERROR_SERVICE_NOT_EXIST, /* target service is not exist */ - TEEC_ERROR_SESSION_NOT_EXIST, /* session between client and service is not exist */ - TEEC_ERROR_SESSION_MAXIMUM, /* exceed max num of sessions */ - TEEC_ERROR_REGISTER_EXIST_SERVICE, /* cannot register the service which already exist */ - TEEC_ERROR_TAGET_DEAD_FATAL, /* system error occurs in TEE */ - TEEC_ERROR_READ_DATA, /* failed to read data in file */ - TEEC_ERROR_WRITE_DATA, /* failed to write data to file */ - TEEC_ERROR_TRUNCATE_OBJECT, /* data is truncated */ - TEEC_ERROR_SEEK_DATA, /* failed to seek data in file */ - TEEC_ERROR_FSYNC_DATA, /* failed to sync data in file */ - TEEC_ERROR_RENAME_OBJECT, /* failed to rename file */ - TEEC_ERROR_TRUSTED_APP_LOAD_ERROR, /* failed to load Trusted Application */ - TEEC_ERROR_GENERIC = 0xFFFF0000, /* generic error occurs */ - TEEC_ERROR_ACCESS_DENIED = 0xFFFF0001, /* permission check failed, in initilize context or - open session or invoke commnad */ - TEEC_ERROR_CANCEL = 0xFFFF0002, /* operation is already canceled */ - TEEC_ERROR_ACCESS_CONFLICT = 0xFFFF0003, /* confilct occurs in concurrent access to data, - error occurs in file operaions generally */ - TEEC_ERROR_EXCESS_DATA = 0xFFFF0004, /* exceed max data to be handled by system */ - TEEC_ERROR_BAD_FORMAT = 0xFFFF0005, /* data format is invalid, Trusted Application cannot - handle it */ - TEEC_ERROR_BAD_PARAMETERS = 0xFFFF0006, /* invalid parameters */ - TEEC_ERROR_BAD_STATE = 0xFFFF0007, /* operation failed in current state, when try to access - storage without initilize storage service */ - TEEC_ERROR_ITEM_NOT_FOUND = 0xFFFF0008, /* cannot find target item */ - TEEC_ERROR_NOT_IMPLEMENTED = 0xFFFF0009, /* request operation is not implemented */ - TEEC_ERROR_NOT_SUPPORTED = 0xFFFF000A, /* request operation is not supported */ - TEEC_ERROR_NO_DATA = 0xFFFF000B, /* no data present for current operation */ - TEEC_ERROR_OUT_OF_MEMORY = 0xFFFF000C, /* system resource if out of use */ - TEEC_ERROR_BUSY = 0xFFFF000D, /* system is too busy to handle current operation */ - TEEC_ERROR_COMMUNICATION = 0xFFFF000E, /* error occurs when client try to communicate - with Trusted Application */ - TEEC_ERROR_SECURITY = 0xFFFF000F, /* security error occurs */ - TEEC_ERROR_SHORT_BUFFER = 0xFFFF0010, /* out buffer is not enough for current request */ - TEEC_ERROR_MAC_INVALID = 0xFFFF3071, /* MAC value check failed */ - TEEC_ERROR_TARGET_DEAD = 0xFFFF3024, /* Trusted Application is crashed */ - TEEC_FAIL = 0xFFFF5002, /* common error */ - TEEC_ERROR_EXTERNAL_CANCEL = 0xFFFF0011, /* used by adapt only, event caused User Interface operation aborted */ - TEEC_ERROR_OVERFLOW = 0xFFFF300F, /* used by adapt only */ - TEEC_ERROR_STORAGE_NO_SPACE = 0xFFFF3041, /* used by adapt only */ - TEEC_ERROR_SIGNATURE_INVALID = 0xFFFF3072, /* used by adapt only */ - TEEC_ERROR_TIME_NOT_SET = 0xFFFF5000, /* used by adapt only */ - TEEC_ERROR_TIME_NEEDS_RESET = 0xFFFF5001, /* used by adapt only */ - - TEEC_ERROR_CONTEXT_NULL = 0xAAAA0001, /* null context */ - TEEC_ERROR_CONTEXT_TAPATH_NULL = 0xAAAA0002, /* null context ta path */ - TEEC_ERROR_PARAM0_TEMPMEM_NULL = 0xAAAA0003, /* null param0 tempmem buf */ - TEEC_ERROR_PARAM0_TEMPMEM_LESS = 0xAAAA0004, /* param0 tempmem buf is less */ - TEEC_ERROR_PARAM1_TEMPMEM_NULL = 0xAAAA0005, /* null param1 tempmem buf */ - TEEC_ERROR_PARAM1_TEMPMEM_LESS = 0xAAAA0006, /* param1 tempmem buf is less */ - TEEC_ERROR_PARAM2_TEMPMEM_NULL = 0xAAAA0007, /* null param2 tempmem buf */ - TEEC_ERROR_PARAM2_TEMPMEM_LESS = 0xAAAA0008, /* param2 tempmem buf is less */ - TEEC_ERROR_PARAM3_TEMPMEM_NULL = 0xAAAA0009, /* null param3 tempmem buf */ - TEEC_ERROR_PARAM3_TEMPMEM_LESS = 0xAAAA000A, /* param3 tempmem buf is less */ - TEEC_ERROR_CONTEXT_LIST_NULL = 0xAAAA000B, /* null context list in woker */ - TEEC_ERROR_NO_CONTEXT_MATCH = 0xAAAA000C, /* no context match in woker */ - TEEC_ERROR_SESSION_LIST_NULL = 0xAAAA000D, /* null session list in woker */ - TEEC_ERROR_NO_SESSION_MATCH = 0xAAAA000E, /* no session match in woker */ - TEEC_ERROR_PARAM0_MEMREF_NULL = 0xAAAA000F, /* null param0 memref buf */ - TEEC_ERROR_PARAM0_MEMREF_LESS = 0xAAAA0010, /* param0 memref buf is less */ - TEEC_ERROR_PARAM1_MEMREF_NULL = 0xAAAA0011, /* null param1 memref buf */ - TEEC_ERROR_PARAM1_MEMREF_LESS = 0xAAAA0012, /* param1 memref buf is less */ - TEEC_ERROR_PARAM2_MEMREF_NULL = 0xAAAA0013, /* null param2 memref buf */ - TEEC_ERROR_PARAM2_MEMREF_LESS = 0xAAAA0014, /* param2 memref buf is less */ - TEEC_ERROR_PARAM3_MEMREF_NULL = 0xAAAA0015, /* null param3 memref buf */ - TEEC_ERROR_PARAM3_MEMREF_LESS = 0xAAAA0016, /* param3 memref buf is less */ - TEEC_ERROR_NO_WORKER_MATCHED = 0xAAAA0017, /* No woker mateched with the context or/and session */ - TEEC_ERROR_SESSION_NULL = 0xAAAA0018, /* null session */ - TEEC_ERROR_NO_SHAREMEMFLAG = 0xAAAA0019, /* no share memmory flag */ - - TEEC_ERROR_JWTVALIDATE_FAIL = 0xAAAA0020, /* jwt validate fail */ - TEEC_ERROR_GRPC_ERROR = 0xAAAA0021, /* grpc transmission error */ - TEEC_ERROR_DBUS_CONN_NULL = 0xAAAA0022, /* dbus connection null */ - TEEC_ERROR_DBUS_NAME_ERROR = 0xAAAA0023, /* dbus name set is error */ - TEEC_ERROR_DBUS_MSG_NULL = 0xAAAA0024, /* dbus message is null */ - TEEC_ERROR_DBUS_APPEND_ERROR = 0xAAAA0025, /* dbus append argument error */ - TEEC_ERROR_DBUS_REPLY_ERROR = 0xAAAA0026, /* dbus send with reply error */ - TEEC_ERROR_DBUS_ARG_NULL = 0xAAAA0027, /* dbus argument is null */ - TEEC_ERROR_DBUS_ARG_TYPE_ERROR = 0xAAAA0028, /* dbus argument type error */ - TEEC_ERROR_TOKEN_NULL = 0xAAAA0029, /* fetch token is null */ - TEEC_ERROR_TOKEN_SIZE_ERROR = 0xAAAA0030, /* token size is error */ - TEEC_ERROR_FETCHJWT_ERROR = 0xAAAA0031, /* fetch jwt error */ - TEEC_INFILE_PATH_NULL = 0xAAAA0032, /* deployta infile path is null*/ - TEEC_INFILE_NOT_FOUND = 0xAAAA0033 /* deployta infile is not found*/ -}; - -enum TEEC_ReturnCodeOrigin { - TEEC_ORIGIN_API = 0x1, /* error occurs in handling client API */ - TEEC_ORIGIN_COMMS = 0x2, /* error occurs in communicating between REE and TEE */ - TEEC_ORIGIN_TEE = 0x3, /* error occurs in TEE */ - TEEC_ORIGIN_TRUSTED_APP = 0x4, /* error occurs in Trusted Application */ -}; - -enum TEEC_SharedMemCtl { - TEEC_MEM_INPUT = 0x1, /* input type of memroy */ - TEEC_MEM_OUTPUT = 0x2, /* output type of memory */ - TEEC_MEM_INOUT = 0x3, /* memory is used as both input and output */ -}; - -enum TEEC_ParamType { - TEEC_NONE = 0x0, /* unused parameter */ - TEEC_VALUE_INPUT = 0x01, /* input type of value, refer TEEC_Value */ - TEEC_VALUE_OUTPUT = 0x02, /* output type of value, refer TEEC_Value */ - TEEC_VALUE_INOUT = 0x03, /* value is used as both input and output, refer TEEC_Value */ - TEEC_MEMREF_TEMP_INPUT = 0x05, /* input type of temp memory reference, refer TEEC_TempMemoryReference */ - TEEC_MEMREF_TEMP_OUTPUT = 0x06, /* output type of temp memory reference, refer TEEC_TempMemoryReference */ - TEEC_MEMREF_TEMP_INOUT = 0x07, /* temp memory reference used as both input and output, - refer TEEC_TempMemoryReference */ - TEEC_ION_INPUT = 0x08, /* input type of icon memory reference, refer TEEC_IonReference */ - TEEC_ION_SGLIST_INPUT = 0x09, /* input type of ion memory block reference, refer TEEC_IonSglistReference */ - TEEC_MEMREF_WHOLE = 0xc, /* use whole memory block, refer TEEC_RegisteredMemoryReference */ - TEEC_MEMREF_PARTIAL_INPUT = 0xd, /* input type of memory reference, refer TEEC_RegisteredMemoryReference */ - TEEC_MEMREF_PARTIAL_OUTPUT = 0xe, /* output type of memory reference, refer TEEC_RegisteredMemoryReference */ - TEEC_MEMREF_PARTIAL_INOUT = 0xf /* memory reference used as both input and output, - refer TEEC_RegisteredMemoryReference */ -}; - -/**************************************************** - * Session Login Methods - ****************************************************/ -enum TEEC_LoginMethod { - TEEC_LOGIN_PUBLIC = 0x0, /* no Login data is provided */ - TEEC_LOGIN_USER, /* Login data about the user running the - Client Application process is provided */ - TEEC_LOGIN_GROUP, /* Login data about the group running - the Client Application process is provided */ - TEEC_LOGIN_APPLICATION = 0x4, /* Login data about the running Client - Application itself is provided */ - TEEC_LOGIN_USER_APPLICATION = 0x5, /* Login data about the user running the - Client Application and about the - Client Application itself is provided */ - TEEC_LOGIN_GROUP_APPLICATION = 0x6, /* Login data about the group running - the Client Application and about the - Client Application itself is provided */ - TEEC_LOGIN_IDENTIFY = 0x7, /* Login data is provided by REE system */ -}; -enum TST_CMD_ID { - TST_CMD_ID_01 = 1, - TST_CMD_ID_02, - TST_CMD_ID_03, - TST_CMD_ID_04, - TST_CMD_ID_05 -}; - -#define TEEC_PARAM_NUM 4 /* teec param max number */ -#endif diff --git a/teeproxy/libteecc/include/teecc/tee_client_list.h b/teeproxy/libteecc/include/teecc/tee_client_list.h deleted file mode 100644 index 03e295f..0000000 --- a/teeproxy/libteecc/include/teecc/tee_client_list.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved. - * iTrustee licensed under the Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * http://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - * PURPOSE. - * See the Mulan PSL v2 for more details. - * Description: linked list data types and basic operations - */ - -#ifndef TEE_CLIENT_LIST_H -#define TEE_CLIENT_LIST_H - -struct ListNode { - struct ListNode *next; /* point to next node */ - struct ListNode *prev; /* point to prev node */ -}; - -#define OFFSET_OF(type, member) (unsigned long)(&(((type *)0)->member)) -#define CONTAINER_OF(pos, type, member) (type *)(((char *)(pos)) - OFFSET_OF(type, member)) - -#define LIST_DECLARE(name) \ - struct ListNode name = { \ - .next = &name, \ - .prev = &name, \ - } - -static inline void ListInit(struct ListNode *list) -{ - list->next = list; - list->prev = list; -} - -#define LIST_HEAD(list) ((list)->next) -#define LIST_TAIL(list) ((list)->prev) -#define LIST_EMPTY(list) ((list) == (list)->next) - -static inline void ListInsertHead(struct ListNode *list, struct ListNode *entry) -{ - list->next->prev = entry; - entry->next = list->next; - entry->prev = list; - list->next = entry; -} - -static inline void ListInsertTail(struct ListNode *list, struct ListNode *entry) -{ - entry->next = list; - entry->prev = list->prev; - list->prev->next = entry; - list->prev = entry; -} - -static inline void ListRemoveEntry(struct ListNode *entry) -{ - entry->prev->next = entry->next; - entry->next->prev = entry->prev; -} - -static inline struct ListNode *ListRemoveHead(struct ListNode *list) -{ - struct ListNode *entry = NULL; - if (!LIST_EMPTY(list)) { - entry = list->next; - ListRemoveEntry(entry); - } - return entry; -} - -static inline struct ListNode *ListRemoveTail(struct ListNode *list) -{ - struct ListNode *entry = NULL; - if (!LIST_EMPTY(list)) { - entry = list->prev; - ListRemoveEntry(entry); - } - return entry; -} - -#define LIST_ENTRY(ptr, type, member) \ - ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) - -#define LIST_FOR_EACH(pos, list) \ - for (pos = (list)->next; pos != (list); pos = pos->next) - -#define LIST_FOR_EACH_SAFE(pos, n, list) \ - for ((pos) = (list)->next, (n) = (pos)->next; (pos) != (list); (pos) = (n), (n) = (pos)->next) - -#define LIST_FOR_EACH_ENTRY(pos, list, member) \ - for (pos = LIST_ENTRY((list)->next, typeof(*pos), member); &pos->member != (list); \ - pos = LIST_ENTRY(pos->member.next, typeof(*pos), member)) - -#define LIST_FOR_EACH_ENTRY_SAFE(pos, n, list, member) \ - for (pos = LIST_ENTRY((list)->next, typeof(*pos), member), n = LIST_ENTRY(pos->member.next, typeof(*pos), \ - member); &pos->member != (list); pos = n, n = LIST_ENTRY(n->member.next, typeof(*n), member)) - -#endif diff --git a/teeproxy/libteecc/include/teecc/tee_client_log.h b/teeproxy/libteecc/include/teecc/tee_client_log.h deleted file mode 100644 index 9ba1fda..0000000 --- a/teeproxy/libteecc/include/teecc/tee_client_log.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. - * iTrustee licensed under the Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * http://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - * PURPOSE. - * See the Mulan PSL v2 for more details. - * Description: TEE client log api - */ - -#ifndef TEE_CLIENT_LOG_H -#define TEE_CLIENT_LOG_H - -#include - -// #define TEEC_DEBUG - -#ifdef TEEC_DEBUG -#define TEEC_Debug(...) syslog(LOG_USER | LOG_INFO, __VA_ARGS__); -#else -#define TEEC_Debug(...) -#endif - -#define TEEC_Error(...) syslog(LOG_USER | LOG_INFO, __VA_ARGS__); - -#endif diff --git a/teeproxy/libteecc/include/teecc/tee_client_type.h b/teeproxy/libteecc/include/teecc/tee_client_type.h deleted file mode 100644 index f590615..0000000 --- a/teeproxy/libteecc/include/teecc/tee_client_type.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved. - * iTrustee licensed under the Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * http://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - * PURPOSE. - * See the Mulan PSL v2 for more details. - * Description: data type and structure definition according to GP - */ - -#ifndef _TEE_CLIENT_TYPE_H_ -#define _TEE_CLIENT_TYPE_H_ - -#include -#include -#include -#include -#include "tee_client_list.h" -#include "tee_client_constants.h" - -#ifndef __cplusplus -#ifndef bool -#define bool uint8_t -#endif -#endif - -#ifndef true -#define true 1 -#endif - -#ifndef false -#define false 0 -#endif - -#ifndef NULL -#define NULL 0 -#endif - -typedef enum TEEC_ReturnCode TEEC_Result; - -typedef struct { - uint32_t timeLow; - uint16_t timeMid; - uint16_t timeHiAndVersion; - uint8_t clockSeqAndNode[8]; -} TEEC_UUID; - -typedef struct { - int32_t fd; - uint8_t *ta_path; - struct ListNode session_list; - struct ListNode shrd_mem_list; - union { - struct { - void *buffer; - sem_t buffer_barrier; - } share_buffer; - uint64_t imp; /* for adapt */ - }; -} TEEC_Context; - -typedef struct { - uint32_t session_id; - TEEC_UUID service_id; - uint32_t ops_cnt; - union { - struct ListNode head; - uint64_t imp; /* for adapt */ - }; - TEEC_Context *context; -} TEEC_Session; - -typedef struct { - void *buffer; - uint32_t size; - uint32_t flags; /* reference to TEEC_SharedMemCtl */ - uint32_t ops_cnt; - bool is_allocated; /* identify whether the memory is registered or allocated */ - union { - struct ListNode head; - void* imp; /* for adapt, imp is not used by system CA, only for vendor CA */ - }; - TEEC_Context *context; -} TEEC_SharedMemory; - -/* - * the corresponding param types are - * TEEC_MEMREF_TEMP_INPUT/TEEC_MEMREF_TEMP_OUTPUT/TEEC_MEMREF_TEMP_INOUT - */ -typedef struct { - void *buffer; - uint32_t size; -} TEEC_TempMemoryReference; - -/* - * the corresponding param types are - * TEEC_MEMREF_WHOLE/TEEC_MEMREF_PARTIAL_INPUT - * TEEC_MEMREF_PARTIAL_OUTPUT/TEEC_MEMREF_PARTIAL_INOUT - */ -typedef struct { - TEEC_SharedMemory *parent; - uint32_t size; - uint32_t offset; -} TEEC_RegisteredMemoryReference; - -/* - * the corresponding param types are - * TEEC_VALUE_INPUT/TEEC_VALUE_OUTPUT/TEEC_VALUE_INOUT - */ -typedef struct { - uint32_t a; - uint32_t b; -} TEEC_Value; - -typedef struct { - int ion_share_fd; - uint32_t ion_size; -} TEEC_IonReference; - -typedef union { - TEEC_TempMemoryReference tmpref; - TEEC_RegisteredMemoryReference memref; - TEEC_Value value; - TEEC_IonReference ionref; -} TEEC_Parameter; - -typedef struct { - uint32_t event_type; /* Tui event type */ - uint32_t value; /* return value, is keycode if tui event is getKeycode */ - uint32_t notch; /* notch size of the screen for tui */ - uint32_t width; /* width of foldable screen */ - uint32_t height; /* height of foldable screen */ - uint32_t fold_state; /* state of foldable screen */ - uint32_t display_state; /* one state of folded state */ - uint32_t phy_width; /* real width of the mobile */ - uint32_t phy_height; /* real height of the mobile */ -} TEEC_TUI_Parameter; - -typedef struct { - uint32_t started; /* 0 means cancel this operation, others mean to perform this operation */ - uint32_t paramTypes; /* use TEEC_PARAM_TYPES to construct this value */ - TEEC_Parameter params[TEEC_PARAM_NUM]; - TEEC_Session *session; - bool cancel_flag; -} TEEC_Operation; - -#endif diff --git a/teeproxy/libteecc/include/teecc/teec_client_api.h b/teeproxy/libteecc/include/teecc/teec_client_api.h deleted file mode 100644 index 996b5e7..0000000 --- a/teeproxy/libteecc/include/teecc/teec_client_api.h +++ /dev/null @@ -1,192 +0,0 @@ -#ifndef teec_client_api_h__ -#define teec_client_api_h__ - -#include "tee_client_type.h" -#include "tee_client_log.h" - - -#define TEEC_PARAM_TYPES(param0Type, param1Type, param2Type, param3Type) \ - ((param3Type) << 12 | (param2Type) << 8 | (param1Type) << 4 | (param0Type)) - -#define TEEC_PARAM_TYPE_GET(paramTypes, index) \ - (((paramTypes) >> (4*(index))) & 0x0F) - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * initializes a new TEE Context, forming a connection between this Client Application and the TEE - * - * @param name [IN] TEE name (unused) - * @param context [IN/OUT] pointer to TEEC_Context to be initialized - * - * @return TEEC_SUCCESS operation success - * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter - * @return TEEC_ERROR_GENERIC system error unhandled - */ -extern TEEC_Result -TEEC_InitializeContext( - const char *name, - TEEC_Context *context); - - -/* - * finalizes an initialized TEE Context, closing the connection between the Client Application and the TEE - * - * @param context [IN/OUT] pointer to TEEC_Context initialized by TEEC_InitializeContext - * @param context_addr [IN] the context address in gp woker process - * - * @return void - */ -extern void -TEEC_FinalizeContext( - TEEC_Context *context); - - -/* - * opens a new Session between the Client Application and the specified Trusted Application - * - * @param context [IN/OUT] a pointer to an initialized TEE Context - * @param context_addr [IN] the context address in gp woker process - * @param session [OUT] a pointer to a Session structure to be opened - * @param destination [IN] a pointer to a structure containing the UUID of the destination Trusted Application - * @param connectionMethod [IN] the method of connection to use - * @param connectionData [IN] any necessary data required to support the connection method - * @param operation [IN/OUT] a pointer to an Operation containing a set of Parameters to exchange with the - * Trusted Application - * @param returnOrigin [IN/OUT] a pointer to a variable which will contain the return origin, This field may be NULL - * if the return origin is not needed - * - * @return TEEC_SUCCESS operation success - * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter£¬context or session or destination is NULL - * @return TEEC_ERROR_ACCESS_DENIED client Application's connection request is denied - * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use - * @return TEEC_ERROR_TRUSTED_APP_LOAD_ERROR load Trusted Application failed - * @return others refer TEEC_ReturnCode - */ -extern TEEC_Result -TEEC_OpenSession( - TEEC_Context *context, - TEEC_Session *session, - const TEEC_UUID *destination, - uint32_t connectionMethod, - const void *connectionData, - TEEC_Operation *operation, - uint32_t *returnOrigin); - - -/* - * closes a Session which has been opened with a Trusted Application - * - * @param session [IN/OUT] pointer to a session to be closed - * - * @return void - */ -extern void -TEEC_CloseSession( - TEEC_Session *session); - - -/* - * invokes a Command within the specified Session - * - * @param session [IN/OUT] the open Session in which the command will be invoked - * @param commandID [IN] the identifier of the Command within the Trusted Application to invoke - * @param operation [IN/OUT] a pointer to a Client Application initialized TEEC_Operation structure - * @param returnOrigin [IN/OUT] a pointer to a variable which will contain the return origin - * - * @return TEEC_SUCCESS operation success - * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter£¬session is NULL or operation data invalid - * @return TEEC_ERROR_ACCESS_DENIED invoke command operation is denied - * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use - * @return others refer TEEC_ReturnCode - */ -extern TEEC_Result -TEEC_InvokeCommand( - TEEC_Session *session, - uint32_t commandID, - TEEC_Operation *operation, - uint32_t *returnOrigin); - - -/* - * allocates a new block of memory as a block of Shared Memory within the scope of the specified TEE Context - * size of sharedMem should not be 0 - * - * @param context [IN/OUT] a pointer to an initialized TEE Context - * @param sharedMem [IN/OUT] a pointer to a Shared Memory structure to allocate - * - * @return TEEC_SUCCESS operation success - * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter, context or sharedMem is NULL - * @return TEEC_ERROR_OUT_OF_MEMORY system resource is out of use - */ -TEEC_Result TEEC_AllocateSharedMemory( - TEEC_Context *context, - TEEC_SharedMemory *sharedMem); - - -/* - * registers a block of existing Client Application memory as a block of Shared Memory within - * the scope of the specified TEE Context, in accordance with the parameters which have been set by the - * Client Application inside the sharedMem structure (don't support 0 size data) - * - * @param context [IN/OUT] a pointer to an initialized TEE Context - * @param sharedMem [IN/OUT] a pointer to a Shared Memory structure to register - * - * @return TEEC_SUCCESS operation success - * @return TEEC_ERROR_BAD_PARAMETERS invalid parameter, context or sharedMem is NULL - */ -TEEC_Result TEEC_RegisterSharedMemory( - TEEC_Context *context, - TEEC_SharedMemory *sharedMem); - - -/* - * deregisters or deallocates a previously initialized block of Shared Memory - * if memory is allocated by TEEC_AllocateSharedMemory, system will free this memory - * if memory is registered by TEEC_RegisterSharedMemory, system will not free this memory - * - * @param sharedMem [IN/OUT] a pointer to a valid Shared Memory structure - * - * @return void - */ -extern -void TEEC_ReleaseSharedMemory( - TEEC_SharedMemory *sharedMem); - - -/* - */ -extern -TEEC_Result -TEEC_DeployTa( - char * infile_path, - char * subdir, - char * outfile_name -); - - -/* - */ -extern -TEEC_Result -TEEC_SetJwt( - char * token -); - - -/* - */ -extern -TEEC_Result -TEEC_UnsetJwt( -); - - - -#ifdef __cplusplus -} -#endif - -#endif // teec_client_api_h__ diff --git a/teeproxy/libteecc/protos/gt.proto b/teeproxy/libteecc/protos/gt.proto deleted file mode 100644 index 3eeff06..0000000 --- a/teeproxy/libteecc/protos/gt.proto +++ /dev/null @@ -1,392 +0,0 @@ -// - -syntax = "proto3"; - -option java_multiple_files = true; -option java_package = "io.grpc.gt"; -option java_outer_classname = "gtProto"; -option objc_class_prefix = "HLW"; - -package gt; - -// The gpp service definition. -service gpp { - rpc TEECC_InitializeContext (Inicont_Request) returns (Inicont_Reply) {} - rpc TEECC_FinalizeContext (Fincont_Request) returns (Fincont_Reply) {} - rpc TEECC_OpenSession (Opes_Request) returns (Opes_Reply) {} - rpc TEECC_InvokeCommand (Invo_Request) returns (Invo_Reply) {} - rpc TEECC_CloseSession (Close_Request) returns (Close_Reply) {} - rpc TEECC_TA(TA_Chunk) returns (TA_Reply) {} - rpc TEECC_SetJwt(Setjwt_Request) returns (Setjwt_Reply) {} -} - - -message Inicont_Request { - uint64 name_size = 1; - string name = 2; - string token = 3; - string taname = 4; -} - -message Inicont_Reply { - uint32 teecresult = 1; - int32 context_fd = 2; - uint64 context_tapath_outsize = 3; - bytes context_tapath = 4; - uint64 context_sessionlist_next = 5; - uint64 context_sessionlist_prev = 6; - uint64 context_shrdmemlist_next = 7; - uint64 context_shrdmemlist_prev = 8; - uint64 context_sharebuffer_buffer = 9; - int64 context_sharebuffer_bufferbarrier = 10; - uint64 context_addr = 11; - int32 flag = 12; -} - -message Fincont_Request { - int32 in_context_fd = 1; - uint64 in_context_tapath_size= 2; - bytes in_context_tapath = 3; - uint64 in_context_sessionlist_next = 4; - uint64 in_context_sessionlist_prev = 5; - uint64 in_context_shrdmemlist_next = 6; - uint64 in_context_shrdmemlist_prev = 7; - uint64 in_context_sharebuffer_buffer = 8; - int64 in_context_sharebuffer_bufferbarrier = 9; - uint64 in_context_addr = 10; - string token = 11; - string taname = 12; -} - -message Fincont_Reply { - int32 context_fd = 1; - uint64 context_tapath_outsize = 2; - bytes context_tapath = 3; - uint64 context_sessionlist_next = 4; - uint64 context_sessionlist_prev = 5; - uint64 context_shrdmemlist_next = 6; - uint64 context_shrdmemlist_prev = 7; - uint64 context_sharebuffer_buffer = 8; - int64 context_sharebuffer_bufferbarrier = 9; - uint64 context_addr = 10; - int32 flag = 11; -} - -message Opes_Request { - int32 in_context_fd = 1; - uint64 in_context_tapath_size= 2; - bytes in_context_tapath = 3; - uint64 in_context_sessionlist_next = 4; - uint64 in_context_sessionlist_prev = 5; - uint64 in_context_shrdmemlist_next = 6; - uint64 in_context_shrdmemlist_prev = 7; - uint64 in_context_sharebuffer_buffer = 8; - int64 in_context_sharebuffer_bufferbarrier = 9; - uint32 in_destination_timelow = 10; - uint32 in_destination_timemid = 11; - uint32 in_destination_timehiandver = 12; - uint64 in_destination_cad_size = 13; - repeated uint32 in_destination_clockseqandnode = 14; - uint32 in_connectionmethod = 15; - uint64 in_connectiondata = 16; - uint32 in_operation_started = 17; - uint32 in_operation_paramtypes = 18; - uint64 in_operation_param1_tmpref_buffer = 19; - uint32 in_operation_param1_tmpref_size = 20; - uint64 in_operation_param1_memref_parent = 21; - uint32 in_operation_param1_memref_size = 22; - uint32 in_operation_param1_memref_offset = 23; - uint32 in_operation_param1_value_a = 24; - uint32 in_operation_param1_value_b = 25; - int32 in_operation_param1_ionref_ionsharefd = 26; - uint32 in_operation_param1_ionref_ionsize = 27; - uint64 in_operation_param2_tmpref_buffer = 28; - uint32 in_operation_param2_tmpref_size = 29; - uint64 in_operation_param2_memref_parent = 30; - uint32 in_operation_param2_memref_size = 31; - uint32 in_operation_param2_memref_offset = 32; - uint32 in_operation_param2_value_a = 33; - uint32 in_operation_param2_value_b = 34; - int32 in_operation_param2_ionref_ionsharefd = 35; - uint32 in_operation_param2_ionref_ionsize = 36; - uint64 in_operation_param3_tmpref_buffer = 37; - uint32 in_operation_param3_tmpref_size = 38; - uint64 in_operation_param3_memref_parent = 39; - uint32 in_operation_param3_memref_size = 40; - uint32 in_operation_param3_memref_offset = 41; - uint32 in_operation_param3_value_a = 42; - uint32 in_operation_param3_value_b = 43; - int32 in_operation_param3_ionref_ionsharefd = 44; - uint32 in_operation_param3_ionref_ionsize = 45; - uint64 in_operation_param4_tmpref_buffer = 46; - uint32 in_operation_param4_tmpref_size = 47; - uint64 in_operation_param4_memref_parent = 48; - uint32 in_operation_param4_memref_size = 49; - uint32 in_operation_param4_memref_offset = 50; - uint32 in_operation_param4_value_a = 51; - uint32 in_operation_param4_value_b = 52; - int32 in_operation_param4_ionref_ionsharefd = 53; - uint32 in_operation_param4_ionref_ionsize = 54; - uint64 in_operation_session = 55; - int32 in_operation_cancelflag = 56; - uint32 in_returnorigin = 57; - uint64 in_context_addr = 58; - string token = 59; - string taname = 60; -} - -message Opes_Reply { - uint32 teecresult = 1; - int32 context_fd = 2; - bytes context_tapath = 3 ; - uint64 context_tapath_outsize = 4; - uint64 context_sessionlist_next = 5; - uint64 context_sessionlist_prev = 6; - uint64 context_shrdmemlist_next = 7; - uint64 context_shrdmemlist_prev = 8; - uint64 context_sharebuffer_buffer = 9; - int64 context_sharebuffer_bufferbarrier = 10; - uint32 session_sessionid = 11; - uint32 session_serviceid_timelow = 12; - uint32 session_serviceid_timemid = 13; - uint32 session_serviceid_timehiandver = 14; - uint64 session_serviceid_clockseqandnode_outsize = 15; - repeated uint32 session_serviceid_clockseqandnode = 16; - uint32 session_opscnt = 17; - uint64 session_head_next = 18; - uint64 session_head_prev = 19; - uint64 session_context = 20; - uint32 operation_started = 21; - uint32 operation_paramtypes = 22; - uint64 operation_param1_tmpref_buffer = 23; - uint32 operation_param1_tmpref_size = 24; - uint64 operation_param1_memref_parent = 25; - uint32 operation_param1_memref_size = 26; - uint32 operation_param1_memref_offset = 27; - uint32 operation_param1_value_a = 28; - uint32 operation_param1_value_b = 29; - int32 operation_param1_ionref_ionsharefd = 30; - uint32 operation_param1_ionref_ionsize = 31; - uint64 operation_param2_tmpref_buffer = 32; - uint32 operation_param2_tmpref_size = 33; - uint64 operation_param2_memref_parent = 34; - uint32 operation_param2_memref_size = 35; - uint32 operation_param2_memref_offset = 36; - uint32 operation_param2_value_a = 37; - uint32 operation_param2_value_b = 38; - int32 operation_param2_ionref_ionsharefd = 39; - uint32 operation_param2_ionref_ionsize = 40; - uint64 operation_param3_tmpref_buffer = 41; - uint32 operation_param3_tmpref_size = 42; - uint64 operation_param3_memref_parent = 43; - uint32 operation_param3_memref_size = 44; - uint32 operation_param3_memref_offset = 45; - uint32 operation_param3_value_a = 46; - uint32 operation_param3_value_b = 47; - int32 operation_param3_ionref_ionsharefd = 48; - uint32 operation_param3_ionref_ionsize = 49; - uint64 operation_param4_tmpref_buffer = 50; - uint32 operation_param4_tmpref_size = 51; - uint64 operation_param4_memref_parent = 52; - uint32 operation_param4_memref_size = 53; - uint32 operation_param4_memref_offset = 54; - uint32 operation_param4_value_a = 55; - uint32 operation_param4_value_b = 56; - int32 operation_param4_ionref_ionsharefd = 57; - uint32 operation_param4_ionref_ionsize = 58; - uint64 operation_session = 59; - int32 operation_cancelflag = 60; - uint32 returnorigin = 61; - int32 flag = 62; -} - -message Invo_Request { - uint32 in_session_sessionid = 1; - uint32 in_session_serviceid_timelow = 2; - uint32 in_session_serviceid_timemid = 3; - uint32 in_session_serviceid_timehiandver = 4; - uint64 in_session_serviceid_cad_size = 5; - repeated uint32 in_session_serviceid_clockseqandnode = 6; - uint32 in_session_opscnt = 7; - uint64 in_session_head_next = 8; - uint64 in_session_head_prev = 9; - uint64 in_session_context = 10; - uint32 in_commandid = 11; - uint32 in_operation_started = 12; - uint32 in_operation_paramtypes = 13; - uint64 in_operation_param1_tmpref_buffer = 14; - uint32 in_operation_param1_tmpref_size = 15; - uint64 in_operation_param1_memref_parent = 16; - uint32 in_operation_param1_memref_parent_flag = 17; - uint32 in_operation_param1_memref_size = 18; - uint32 in_operation_param1_memref_offset = 19; - uint32 in_operation_param1_value_a = 20; - uint32 in_operation_param1_value_b = 21; - int32 in_operation_param1_ionref_ionsharefd = 22; - uint32 in_operation_param1_ionref_ionsize = 23; - uint64 in_operation_param2_tmpref_buffer = 24; - uint32 in_operation_param2_tmpref_size = 25; - uint64 in_operation_param2_memref_parent = 26; - uint32 in_operation_param2_memref_parent_flag = 27; - uint32 in_operation_param2_memref_size = 28; - uint32 in_operation_param2_memref_offset = 29; - uint32 in_operation_param2_value_a = 30; - uint32 in_operation_param2_value_b = 31; - int32 in_operation_param2_ionref_ionsharefd = 32; - uint32 in_operation_param2_ionref_ionsize = 33; - uint64 in_operation_param3_tmpref_buffer = 34; - uint32 in_operation_param3_tmpref_size = 35; - uint64 in_operation_param3_memref_parent = 36; - uint32 in_operation_param3_memref_parent_flag = 37; - uint32 in_operation_param3_memref_size = 38; - uint32 in_operation_param3_memref_offset = 39; - uint32 in_operation_param3_value_a = 40; - uint32 in_operation_param3_value_b = 41; - int32 in_operation_param3_ionref_ionsharefd = 42; - uint32 in_operation_param3_ionref_ionsize = 43; - uint64 in_operation_param4_tmpref_buffer = 44; - uint32 in_operation_param4_tmpref_size = 45; - uint64 in_operation_param4_memref_parent = 46; - uint32 in_operation_param4_memref_parent_flag = 47; - uint32 in_operation_param4_memref_size = 48; - uint32 in_operation_param4_memref_offset = 49; - uint32 in_operation_param4_value_a = 50; - uint32 in_operation_param4_value_b = 51; - int32 in_operation_param4_ionref_ionsharefd = 52; - uint32 in_operation_param4_ionref_ionsize = 53; - uint64 in_operation_session = 54; - int32 in_operation_cancelflag = 55; - uint32 in_returnorigin = 56; - uint64 in_bufer1_size = 57; - repeated uint32 in_buffer1 = 58; - uint64 in_bufer2_size = 59; - repeated uint32 in_buffer2 = 60; - uint64 in_bufer3_size = 61; - repeated uint32 in_buffer3 = 62; - uint64 in_bufer4_size = 63; - repeated uint32 in_buffer4 = 64; - string token = 65; - string taname = 66; -} - -message Invo_Reply { - uint32 teecresult = 1; - uint32 session_sessionid = 2; - uint32 session_serviceid_timelow = 3; - uint32 session_serviceid_timemid = 4; - uint32 session_serviceid_timehiandver = 5; - uint64 session_serviceid_clockseqandnode_outsize = 6; - repeated uint32 session_serviceid_clockseqandnode = 7; - uint32 session_opscnt = 8; - uint64 session_head_next = 9; - uint64 session_head_prev = 10; - uint64 session_context = 11; - uint32 operation_started = 12; - uint32 operation_paramtypes = 13; - uint64 operation_param1_tmpref_buffer = 14; - uint32 operation_param1_tmpref_size = 15; - uint64 operation_param1_memref_parent = 16; - uint32 operation_param1_memref_parent_flag = 17; - uint32 operation_param1_memref_size = 18; - uint32 operation_param1_memref_offset = 19; - uint32 operation_param1_value_a = 20; - uint32 operation_param1_value_b = 21; - int32 operation_param1_ionref_ionsharefd = 22; - uint32 operation_param1_ionref_ionsize = 23; - uint64 operation_param2_tmpref_buffer = 24; - uint32 operation_param2_tmpref_size = 25; - uint64 operation_param2_memref_parent = 26; - uint32 operation_param2_memref_parent_flag = 27; - uint32 operation_param2_memref_size = 28; - uint32 operation_param2_memref_offset = 29; - uint32 operation_param2_value_a = 30; - uint32 operation_param2_value_b = 31; - int32 operation_param2_ionref_ionsharefd = 32; - uint32 operation_param2_ionref_ionsize = 33; - uint64 operation_param3_tmpref_buffer = 34; - uint32 operation_param3_tmpref_size = 35; - uint64 operation_param3_memref_parent = 36; - uint32 operation_param3_memref_parent_flag = 37; - uint32 operation_param3_memref_size = 38; - uint32 operation_param3_memref_offset = 39; - uint32 operation_param3_value_a = 40; - uint32 operation_param3_value_b = 41; - int32 operation_param3_ionref_ionsharefd = 42; - uint32 operation_param3_ionref_ionsize = 43; - uint64 operation_param4_tmpref_buffer = 44; - uint32 operation_param4_tmpref_size = 45; - uint64 operation_param4_memref_parent = 46; - uint32 operation_param4_memref_parent_flag = 47; - uint32 operation_param4_memref_size = 48; - uint32 operation_param4_memref_offset = 49; - uint32 operation_param4_value_a = 50; - uint32 operation_param4_value_b = 51; - int32 operation_param4_ionref_ionsharefd = 52; - uint32 operation_param4_ionref_ionsize = 53; - uint64 operation_session = 54; - int32 operation_cancelflag = 55; - uint32 returnorigin = 56; - - uint64 buffer1_outsize = 57; - uint64 buffer2_outsize = 58; - uint64 buffer3_outsize = 59; - uint64 buffer4_outsize = 60; - - repeated uint32 buffer1 = 61; - repeated uint32 buffer2 = 62; - repeated uint32 buffer3 = 63; - repeated uint32 buffer4 = 64; - int32 flag = 65; -} - -message Close_Request { - uint32 in_session_sessionid = 1; - uint32 in_session_serviceid_timelow = 2; - uint32 in_session_serviceid_timemid = 3; - uint32 in_session_serviceid_timehiandver = 4; - uint64 in_session_serviceid_cad_size = 5; - repeated uint32 in_session_serviceid_clockseqandnode = 6; - uint32 in_session_opscnt = 7; - uint64 in_session_head_next = 8; - uint64 in_session_head_prev = 9; - uint64 in_session_context = 10; - string token = 11; - string taname = 12; -} - -message Close_Reply { - uint32 session_sessionid = 1; - uint32 session_serviceid_timelow = 2; - uint32 session_serviceid_timemid = 3; - uint32 session_serviceid_timehiandver = 4; - uint64 session_serviceid_cad_outsize = 5; - repeated uint32 session_serviceid_clockseqandnode = 6; - uint32 session_opscnt = 7; - uint64 session_head_next = 8; - uint64 session_head_prev = 9; - uint64 session_context = 10; - int32 flag = 11; -} - -message TA_Chunk{ - string name = 1; - bytes buffer = 2; - string token = 3; - string taname = 4; - bytes sha256 = 5; - string subdir = 6; -} - -message TA_Reply{ - int32 code = 1; - int32 flag = 2; -} - -message Setjwt_Request{ - string taname = 1; - string token = 2; -} - -message Setjwt_Reply{ - int32 retcode = 1; -} diff --git a/teeproxy/libteecc/teecc.cc b/teeproxy/libteecc/teecc.cc deleted file mode 100644 index c4a6617..0000000 --- a/teeproxy/libteecc/teecc.cc +++ /dev/null @@ -1,4148 +0,0 @@ -/* - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "gt.grpc.pb.h" - -#include "teecc.h" -#include "teecc/teec_client_api.h" -#include "yaml-cpp/yaml.h" - -#ifdef __cplusplus -extern "C" { -#endif - -using grpc::Channel; -using grpc::ChannelArguments; -using grpc::experimental::AltsCredentials; -using grpc::experimental::AltsCredentialsOptions; -using grpc::ClientContext; -using grpc::Status; -using grpc::ClientWriter; -using gt::gpp; -using gt::Inicont_Reply; -using gt::Inicont_Request; -using gt::Fincont_Reply; -using gt::Fincont_Request; -using gt::Opes_Reply; -using gt::Opes_Request; -using gt::Invo_Reply; -using gt::Invo_Request; -using gt::Close_Reply; -using gt::Close_Request; -using gt::TA_Chunk; -using gt::TA_Reply; - - -char glo_token[1024] = "noToken"; - - -bool utf8_check_is_valid(std::string &string) -{ - int c, i, ix, n, j; - for (i = 0, ix = string.length(); i < ix; i++) - { - c = (unsigned char) string[i]; - //if (c==0x09 || c==0x0a || c==0x0d || (0x20 <= c && c <= 0x7e) ) n = 0; // is_printable_ascii - if (0x00 <= c && c <= 0x7f) n = 0; // 0bbbbbbb - else if ((c & 0xE0) == 0xC0) n = 1; // 110bbbbb - else if (c == 0xed && i < (ix - 1) && ((unsigned char) string[i + 1] & 0xa0) == 0xa0) - return false; //U+d800 to U+dfff - else if ((c & 0xF0) == 0xE0) n = 2; // 1110bbbb - else if ((c & 0xF8) == 0xF0) n = 3; // 11110bbb - //else if (($c & 0xFC) == 0xF8) n=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8 - //else if (($c & 0xFE) == 0xFC) n=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8 - else return false; - for (j = 0; j < n && i < ix; j++) - { // n bytes matching 10bbbbbb follow ? - if ((++i == ix) || (((unsigned char) string[i] & 0xC0) != 0x80)) - return false; - } - } - return true; -} - -#define MAX_DATA_LEN 50*1024 -#define SHA256_LENTH 32 - -int get_file_sha256(char *file_path, char *val) -{ - SHA256_CTX sha256_ctx; - FILE *fp = NULL; - char *strFilePath = file_path; - unsigned char SHA256result[SHA256_LENTH]; - char DataBuff[MAX_DATA_LEN]; - int len; - int t = 0; - int i; - std::string sha256; - - - fp = fopen(strFilePath, "rb"); - - SHA256_Init(&sha256_ctx); - - while (!feof(fp)) - { - memset(DataBuff, 0x00, sizeof(DataBuff)); - - len = fread(DataBuff, 1, MAX_DATA_LEN, fp); - if (len) - { - t += len; - SHA256_Update(&sha256_ctx, DataBuff, len); - } - } - - fclose(fp); - SHA256_Final(SHA256result, &sha256_ctx); - - - if (val == NULL || sizeof(val) * 4 < SHA256_LENTH) - { - return -1; - } else - { - memset(val, 0, sizeof(val)); - for (int itemp = 0; itemp < SHA256_LENTH; itemp++) - { - val[itemp] = SHA256result[itemp]; - } - - } - - return 0; -} - - -class GppClient -{ -public: - GppClient(std::shared_ptr channel) - : stub_(gpp::NewStub(channel)) - {} - - // Assembles the client's payload, - // sends it and presents the response back from the server. - retstru_teec_inicont externc_teec_initializecontext( - std::uint8_t *name, - std::size_t name_size - ) - { - // Data we are sending to the server. - Inicont_Request request; - request.set_name_size(name_size); - if (name_size > 0) - { - std::string name_temp((char *) name); - request.set_name(name_temp); - } - request.set_token(glo_token); - - // Container for the data we expect from the server. - Inicont_Reply reply; - - ClientContext context; - retstru_teec_inicont rreply; - - // The actual RPC. - Status status = stub_->TEECC_InitializeContext(&context, request, &reply); - retstru_teec_inicont error; - - rreply.teecresult = reply.teecresult(); - rreply.context_fd = reply.context_fd(); - rreply.context_tapath_outsize = reply.context_tapath_outsize(); - if (rreply.context_tapath_outsize > 0) - { - rreply.context_tapath = (uint8_t *) malloc((rreply.context_tapath_outsize + 1) * sizeof(uint8_t));; - reply.context_tapath().copy((char *) rreply.context_tapath, rreply.context_tapath_outsize, 0); - } - rreply.context_sessionlist_next = reply.context_sessionlist_next(); - rreply.context_sessionlist_prev = reply.context_sessionlist_prev(); - rreply.context_shrdmemlist_prev = reply.context_shrdmemlist_prev(); - rreply.context_shrdmemlist_next = reply.context_shrdmemlist_next(); - rreply.context_sharebuffer_buffer = reply.context_sharebuffer_buffer(); - rreply.context_sharebuffer_bufferbarrier = reply.context_sharebuffer_bufferbarrier(); - rreply.context_addr = reply.context_addr(); - rreply.flag = reply.flag(); - // Act upon its status. - if (status.ok()) - { - return rreply; - } else - { - std::cout << "libteecc initcontext grpc error: " << status.error_code() << ", " << status.error_message() - << std::endl; - return error; - } - } - - retstru_teec_fincont externc_teec_finalizecontext( - std::int32_t in_context_fd, - std::uint8_t *in_context_tapath, - std::int32_t in_context_tapath_size, - std::uint64_t in_context_sessionlist_next, - std::uint64_t in_context_sessionlist_prev, - std::uint64_t in_context_shrdmemlist_next, - std::uint64_t in_context_shrdmemlist_prev, - std::uint64_t in_context_sharebuffer_buffer, - std::int64_t in_context_sharebuffer_bufferbarrier, - std::uint64_t in_context_addr - ) - { - // Data we are sending to the server. - Fincont_Request request; - - request.set_in_context_fd(in_context_fd); - request.set_in_context_tapath_size(in_context_tapath_size); - if (in_context_tapath_size > 0) - { - std::string in_context_tapath_temp((char *) in_context_tapath); - request.set_in_context_tapath(in_context_tapath_temp); - } - request.set_in_context_sessionlist_next(in_context_sessionlist_next); - request.set_in_context_sessionlist_prev(in_context_sessionlist_prev); - request.set_in_context_shrdmemlist_prev(in_context_shrdmemlist_prev); - request.set_in_context_shrdmemlist_next(in_context_shrdmemlist_next); - request.set_in_context_sharebuffer_buffer(in_context_sharebuffer_buffer); - request.set_in_context_sharebuffer_bufferbarrier(in_context_sharebuffer_bufferbarrier); - request.set_in_context_addr(in_context_addr); - request.set_token(glo_token); - - //questntainer for the data we expect from the server. - Fincont_Reply reply; - ClientContext context; - retstru_teec_fincont rreply; - - // The actual RPC. - Status status = stub_->TEECC_FinalizeContext(&context, request, &reply); - retstru_teec_fincont error; - - rreply.context_fd = reply.context_fd(); - rreply.context_tapath_outsize = reply.context_tapath_outsize(); - if (rreply.context_tapath_outsize > 0) - { - rreply.context_tapath = (uint8_t *) malloc((rreply.context_tapath_outsize + 1) * sizeof(uint8_t));; - reply.context_tapath().copy((char *) rreply.context_tapath, rreply.context_tapath_outsize, 0); - } - rreply.context_sessionlist_next = reply.context_sessionlist_next(); - rreply.context_sessionlist_prev = reply.context_sessionlist_prev(); - rreply.context_shrdmemlist_prev = reply.context_shrdmemlist_prev(); - rreply.context_shrdmemlist_next = reply.context_shrdmemlist_next(); - rreply.context_sharebuffer_buffer = reply.context_sharebuffer_buffer(); - rreply.context_sharebuffer_bufferbarrier = reply.context_sharebuffer_bufferbarrier(); - rreply.flag = reply.flag(); - // Act upon its status. - if (status.ok()) - { - return rreply; - } else - { - std::cout << "libteecc finalizecontext grpc error: " << status.error_code() << ", " << status.error_message() - << std::endl; - return error; - } - } - - retstru_teec_opensession externc_teec_opensession( - std::int32_t in_context_fd, - std::uint8_t *in_context_tapath, - std::int32_t in_context_tapath_size, - std::uint64_t in_context_sessionlist_next, - std::uint64_t in_context_sessionlist_prev, - std::uint64_t in_context_shrdmemlist_next, - std::uint64_t in_context_shrdmemlist_prev, - std::uint64_t in_context_sharebuffer_buffer, - std::int64_t in_context_sharebuffer_bufferbarrier, - std::uint32_t in_destination_timelow, - std::uint32_t in_destination_timemid, - std::uint32_t in_destination_timehiandver, - std::uint8_t *in_destination_clockseqandnode, - std::int32_t in_destination_clockseqandnode_size, - std::uint32_t in_connectionmethod, - std::uint64_t in_connectiondata, - std::uint32_t in_operation_started, - std::uint32_t in_operation_paramtypes, - std::uint64_t in_operation_param1_tmpref_buffer, - std::uint32_t in_operation_param1_tmpref_size, - std::uint64_t in_operation_param1_memref_parent, - std::uint32_t in_operation_param1_memref_size, - std::uint32_t in_operation_param1_memref_offset, - std::uint32_t in_operation_param1_value_a, - std::uint32_t in_operation_param1_value_b, - std::int32_t in_operation_param1_ionref_ionsharefd, - std::uint32_t in_operation_param1_ionref_ionsize, - std::uint64_t in_operation_param2_tmpref_buffer, - std::uint32_t in_operation_param2_tmpref_size, - std::uint64_t in_operation_param2_memref_parent, - std::uint32_t in_operation_param2_memref_size, - std::uint32_t in_operation_param2_memref_offset, - std::uint32_t in_operation_param2_value_a, - std::uint32_t in_operation_param2_value_b, - std::int32_t in_operation_param2_ionref_ionsharefd, - std::uint32_t in_operation_param2_ionref_ionsize, - std::uint64_t in_operation_param3_tmpref_buffer, - std::uint32_t in_operation_param3_tmpref_size, - std::uint64_t in_operation_param3_memref_parent, - std::uint32_t in_operation_param3_memref_size, - std::uint32_t in_operation_param3_memref_offset, - std::uint32_t in_operation_param3_value_a, - std::uint32_t in_operation_param3_value_b, - std::int32_t in_operation_param3_ionref_ionsharefd, - std::uint32_t in_operation_param3_ionref_ionsize, - std::uint64_t in_operation_param4_tmpref_buffer, - std::uint32_t in_operation_param4_tmpref_size, - std::uint64_t in_operation_param4_memref_parent, - std::uint32_t in_operation_param4_memref_size, - std::uint32_t in_operation_param4_memref_offset, - std::uint32_t in_operation_param4_value_a, - std::uint32_t in_operation_param4_value_b, - std::int32_t in_operation_param4_ionref_ionsharefd, - std::uint32_t in_operation_param4_ionref_ionsize, - std::uint64_t in_operation_session, - std::int32_t in_operation_cancelflag, - std::uint32_t in_returnorigin, - std::uint64_t in_context_addr - ) - { - // Data we are sending to the server. - Opes_Request request; - request.set_in_context_fd(in_context_fd); - request.set_in_context_tapath_size(in_context_tapath_size); - if (in_context_tapath_size > 0) - { - std::string in_context_tapath_temp((char *) in_context_tapath); - request.set_in_context_tapath(in_context_tapath_temp); - } - request.set_in_context_sessionlist_next(in_context_sessionlist_next); - request.set_in_context_sessionlist_prev(in_context_sessionlist_prev); - request.set_in_context_shrdmemlist_prev(in_context_shrdmemlist_prev); - request.set_in_context_shrdmemlist_next(in_context_shrdmemlist_next); - request.set_in_context_sharebuffer_buffer(in_context_sharebuffer_buffer); - request.set_in_context_sharebuffer_bufferbarrier(in_context_sharebuffer_bufferbarrier); - request.set_in_destination_timelow(in_destination_timelow); - request.set_in_destination_timemid(in_destination_timemid); - request.set_in_destination_timehiandver(in_destination_timehiandver); - request.set_in_destination_cad_size(in_destination_clockseqandnode_size); - if (in_destination_clockseqandnode_size > 0) - { - for (int i = 0; i < in_destination_clockseqandnode_size; i++) - { - request.add_in_destination_clockseqandnode(in_destination_clockseqandnode[i]); - } - - } - request.set_in_connectionmethod(in_connectionmethod); - request.set_in_connectiondata(in_connectiondata); - request.set_in_operation_started(in_operation_started); - request.set_in_operation_paramtypes(in_operation_paramtypes); - request.set_in_operation_param1_tmpref_buffer(in_operation_param1_tmpref_buffer); - request.set_in_operation_param1_tmpref_size(in_operation_param1_tmpref_size); - request.set_in_operation_param1_memref_parent(in_operation_param1_memref_parent); - request.set_in_operation_param1_memref_size(in_operation_param1_memref_size); - request.set_in_operation_param1_memref_offset(in_operation_param1_memref_offset); - request.set_in_operation_param1_value_a(in_operation_param1_value_a); - request.set_in_operation_param1_value_b(in_operation_param1_value_b); - request.set_in_operation_param1_ionref_ionsharefd(in_operation_param1_ionref_ionsharefd); - request.set_in_operation_param1_ionref_ionsize(in_operation_param1_ionref_ionsize); - request.set_in_operation_param2_tmpref_buffer(in_operation_param2_tmpref_buffer); - request.set_in_operation_param2_tmpref_size(in_operation_param2_tmpref_size); - request.set_in_operation_param2_memref_parent(in_operation_param2_memref_parent); - request.set_in_operation_param2_memref_size(in_operation_param2_memref_size); - request.set_in_operation_param2_memref_offset(in_operation_param2_memref_offset); - request.set_in_operation_param2_value_a(in_operation_param2_value_a); - request.set_in_operation_param2_value_b(in_operation_param2_value_b); - request.set_in_operation_param2_ionref_ionsharefd(in_operation_param2_ionref_ionsharefd); - request.set_in_operation_param2_ionref_ionsize(in_operation_param2_ionref_ionsize); - request.set_in_operation_param3_tmpref_buffer(in_operation_param3_tmpref_buffer); - request.set_in_operation_param3_tmpref_size(in_operation_param3_tmpref_size); - request.set_in_operation_param3_memref_parent(in_operation_param3_memref_parent); - request.set_in_operation_param3_memref_size(in_operation_param3_memref_size); - request.set_in_operation_param3_memref_offset(in_operation_param3_memref_offset); - request.set_in_operation_param3_value_a(in_operation_param3_value_a); - request.set_in_operation_param3_value_b(in_operation_param3_value_b); - request.set_in_operation_param3_ionref_ionsharefd(in_operation_param3_ionref_ionsharefd); - request.set_in_operation_param3_ionref_ionsize(in_operation_param3_ionref_ionsize); - request.set_in_operation_param4_tmpref_buffer(in_operation_param4_tmpref_buffer); - request.set_in_operation_param4_tmpref_size(in_operation_param4_tmpref_size); - request.set_in_operation_param4_memref_parent(in_operation_param4_memref_parent); - request.set_in_operation_param4_memref_size(in_operation_param4_memref_size); - request.set_in_operation_param4_memref_offset(in_operation_param4_memref_offset); - request.set_in_operation_param4_value_a(in_operation_param4_value_a); - request.set_in_operation_param4_value_b(in_operation_param4_value_b); - request.set_in_operation_param4_ionref_ionsharefd(in_operation_param4_ionref_ionsharefd); - request.set_in_operation_param4_ionref_ionsize(in_operation_param4_ionref_ionsize); - request.set_in_operation_session(in_operation_session); - request.set_in_operation_cancelflag(in_operation_cancelflag); - request.set_in_returnorigin(in_returnorigin); - request.set_in_context_addr(in_context_addr); - - request.set_token(glo_token); - //questntainer for the data we expect from the server. - Opes_Reply reply; - ClientContext context; - retstru_teec_opensession rreply; - - // The actual RPC. - Status status = stub_->TEECC_OpenSession(&context, request, &reply); - retstru_teec_opensession error; - - rreply.teecresult = reply.teecresult(); - rreply.context_fd = reply.context_fd(); - rreply.context_tapath_outsize = reply.context_tapath_outsize(); - if (rreply.context_tapath_outsize > 0) - { - rreply.context_tapath = (uint8_t *) malloc((rreply.context_tapath_outsize + 1) * sizeof(uint8_t));; - reply.context_tapath().copy((char *) rreply.context_tapath, rreply.context_tapath_outsize, 0); - } - rreply.context_sessionlist_next = reply.context_sessionlist_next(); - rreply.context_sessionlist_prev = reply.context_sessionlist_prev(); - rreply.context_shrdmemlist_prev = reply.context_shrdmemlist_prev(); - rreply.context_shrdmemlist_next = reply.context_shrdmemlist_next(); - rreply.context_sharebuffer_buffer = reply.context_sharebuffer_buffer(); - rreply.session_sessionid = reply.session_sessionid(); - rreply.session_serviceid_timelow = reply.session_serviceid_timelow(); - rreply.session_serviceid_timemid = reply.session_serviceid_timemid(); - rreply.session_serviceid_timehiandver = reply.session_serviceid_timehiandver(); - rreply.session_serviceid_clockseqandnode_outsize = reply.session_serviceid_clockseqandnode_outsize(); - if (rreply.session_serviceid_clockseqandnode_outsize > 0) - { - rreply.session_serviceid_clockseqandnode = new uint8_t[rreply.session_serviceid_clockseqandnode_outsize]; - for (int i = 0; i < rreply.session_serviceid_clockseqandnode_outsize; i++) - { - rreply.session_serviceid_clockseqandnode[i] = reply.session_serviceid_clockseqandnode(i); - } - } - rreply.session_opscnt = reply.session_opscnt(); - rreply.session_head_next = reply.session_head_next(); - rreply.session_head_prev = reply.session_head_prev(); - rreply.session_context = reply.session_context(); - rreply.operation_started = reply.operation_started(); - rreply.operation_paramtypes = reply.operation_paramtypes(); - rreply.operation_param1_tmpref_buffer = reply.operation_param1_tmpref_buffer(); - rreply.operation_param1_tmpref_size = reply.operation_param1_tmpref_size(); - rreply.operation_param1_memref_parent = reply.operation_param1_memref_parent(); - rreply.operation_param1_memref_size = reply.operation_param1_memref_size(); - rreply.operation_param1_memref_offset = reply.operation_param1_memref_offset(); - rreply.operation_param1_value_a = reply.operation_param1_value_a(); - rreply.operation_param1_value_b = reply.operation_param1_value_b(); - rreply.operation_param1_ionref_ionsharefd = reply.operation_param1_ionref_ionsharefd(); - rreply.operation_param1_ionref_ionsize = reply.operation_param1_ionref_ionsize(); - rreply.operation_param2_tmpref_buffer = reply.operation_param2_tmpref_buffer(); - rreply.operation_param2_tmpref_size = reply.operation_param2_tmpref_size(); - rreply.operation_param2_memref_parent = reply.operation_param2_memref_parent(); - rreply.operation_param2_memref_size = reply.operation_param2_memref_size(); - rreply.operation_param2_memref_offset = reply.operation_param2_memref_offset(); - rreply.operation_param2_value_a = reply.operation_param2_value_a(); - rreply.operation_param2_value_b = reply.operation_param2_value_b(); - rreply.operation_param2_ionref_ionsharefd = reply.operation_param2_ionref_ionsharefd(); - rreply.operation_param2_ionref_ionsize = reply.operation_param2_ionref_ionsize(); - rreply.operation_param3_tmpref_buffer = reply.operation_param3_tmpref_buffer(); - rreply.operation_param3_tmpref_size = reply.operation_param3_tmpref_size(); - rreply.operation_param3_memref_parent = reply.operation_param3_memref_parent(); - rreply.operation_param3_memref_size = reply.operation_param3_memref_size(); - rreply.operation_param3_memref_offset = reply.operation_param3_memref_offset(); - rreply.operation_param3_value_a = reply.operation_param3_value_a(); - rreply.operation_param3_value_b = reply.operation_param3_value_b(); - rreply.operation_param3_ionref_ionsharefd = reply.operation_param3_ionref_ionsharefd(); - rreply.operation_param3_ionref_ionsize = reply.operation_param3_ionref_ionsize(); - rreply.operation_param4_tmpref_buffer = reply.operation_param4_tmpref_buffer(); - rreply.operation_param4_tmpref_size = reply.operation_param4_tmpref_size(); - rreply.operation_param4_memref_parent = reply.operation_param4_memref_parent(); - rreply.operation_param4_memref_size = reply.operation_param4_memref_size(); - rreply.operation_param4_memref_offset = reply.operation_param4_memref_offset(); - rreply.operation_param4_value_a = reply.operation_param4_value_a(); - rreply.operation_param4_value_b = reply.operation_param4_value_b(); - rreply.operation_param4_ionref_ionsharefd = reply.operation_param4_ionref_ionsharefd(); - rreply.operation_param4_ionref_ionsize = reply.operation_param4_ionref_ionsize(); - rreply.operation_session = reply.operation_session(); - rreply.operation_cancelflag = reply.operation_cancelflag(); - rreply.returnorigin = reply.returnorigin(); - rreply.flag = reply.flag(); - - // Act upon its status. - if (status.ok()) - { - return rreply; - } else - { - std::cout << "libteecc opensession grpc error: " << status.error_code() << ", " << status.error_message() - << std::endl; - return error; - } - } - - retstru_teec_invokecommand externc_teec_invokecommand( - std::uint32_t in_session_sessionid, - std::uint32_t in_session_serviceid_timelow, - std::uint32_t in_session_serviceid_timemid, - std::uint32_t in_session_serviceid_timehiandver, - std::uint8_t *in_session_serviceid_clockseqandnode, - std::uintptr_t in_session_serviceid_clockseqandnode_size, - std::uint32_t in_session_opscnt, - std::uint64_t in_session_head_next, - std::uint64_t in_session_head_prev, - std::uint64_t in_session_context, - std::uint32_t in_commandid, - std::uint32_t in_operation_started, - std::uint32_t in_operation_paramtypes, - std::uint64_t in_operation_param1_tmpref_buffer, - std::uint32_t in_operation_param1_tmpref_size, - std::uint64_t in_operation_param1_memref_parent, - std::uint32_t in_operation_param1_memref_parent_flag, - std::uint32_t in_operation_param1_memref_size, - std::uint32_t in_operation_param1_memref_offset, - std::uint32_t in_operation_param1_value_a, - std::uint32_t in_operation_param1_value_b, - std::int32_t in_operation_param1_ionref_ionsharefd, - std::uint32_t in_operation_param1_ionref_ionsize, - std::uint64_t in_operation_param2_tmpref_buffer, - std::uint32_t in_operation_param2_tmpref_size, - std::uint64_t in_operation_param2_memref_parent, - std::uint32_t in_operation_param2_memref_parent_flag, - std::uint32_t in_operation_param2_memref_size, - std::uint32_t in_operation_param2_memref_offset, - std::uint32_t in_operation_param2_value_a, - std::uint32_t in_operation_param2_value_b, - std::int32_t in_operation_param2_ionref_ionsharefd, - std::uint32_t in_operation_param2_ionref_ionsize, - std::uint64_t in_operation_param3_tmpref_buffer, - std::uint32_t in_operation_param3_tmpref_size, - std::uint64_t in_operation_param3_memref_parent, - std::uint32_t in_operation_param3_memref_parent_flag, - std::uint32_t in_operation_param3_memref_size, - std::uint32_t in_operation_param3_memref_offset, - std::uint32_t in_operation_param3_value_a, - std::uint32_t in_operation_param3_value_b, - std::int32_t in_operation_param3_ionref_ionsharefd, - std::uint32_t in_operation_param3_ionref_ionsize, - std::uint64_t in_operation_param4_tmpref_buffer, - std::uint32_t in_operation_param4_tmpref_size, - std::uint64_t in_operation_param4_memref_parent, - std::uint32_t in_operation_param4_memref_parent_flag, - std::uint32_t in_operation_param4_memref_size, - std::uint32_t in_operation_param4_memref_offset, - std::uint32_t in_operation_param4_value_a, - std::uint32_t in_operation_param4_value_b, - std::int32_t in_operation_param4_ionref_ionsharefd, - std::uint32_t in_operation_param4_ionref_ionsize, - std::uint64_t in_operation_session, - std::int32_t in_operation_cancelflag, - std::uint32_t in_returnorigin, - std::uint8_t *in_buffer1, - std::uintptr_t in_buffer1_size, - std::uint8_t *in_buffer2, - std::uintptr_t in_buffer2_size, - std::uint8_t *in_buffer3, - std::uintptr_t in_buffer3_size, - std::uint8_t *in_buffer4, - std::uintptr_t in_buffer4_size - ) - { - // Data we are sending to the server. - Invo_Request request; - request.set_in_session_sessionid(in_session_sessionid); - - request.set_in_session_serviceid_timelow(in_session_serviceid_timelow); - request.set_in_session_serviceid_timemid(in_session_serviceid_timemid); - request.set_in_session_serviceid_timehiandver(in_session_serviceid_timehiandver); - request.set_in_session_serviceid_cad_size(in_session_serviceid_clockseqandnode_size); - if (in_session_serviceid_clockseqandnode_size > 0) - { - for (int i = 0; i < in_session_serviceid_clockseqandnode_size; i++) - { - request.add_in_session_serviceid_clockseqandnode(in_session_serviceid_clockseqandnode[i]); - } - - } - request.set_in_session_opscnt(in_session_opscnt); - request.set_in_session_head_next(in_session_head_next); - request.set_in_session_head_prev(in_session_head_prev); - request.set_in_session_context(in_session_context); - request.set_in_commandid(in_commandid); - request.set_in_operation_started(in_operation_started); - request.set_in_operation_paramtypes(in_operation_paramtypes); - request.set_in_operation_param1_tmpref_buffer(in_operation_param1_tmpref_buffer); - request.set_in_operation_param1_tmpref_size(in_operation_param1_tmpref_size); - request.set_in_operation_param1_memref_parent(in_operation_param1_memref_parent); - request.set_in_operation_param1_memref_parent_flag(in_operation_param1_memref_parent_flag); - request.set_in_operation_param1_memref_size(in_operation_param1_memref_size); - request.set_in_operation_param1_memref_offset(in_operation_param1_memref_offset); - request.set_in_operation_param1_value_a(in_operation_param1_value_a); - request.set_in_operation_param1_value_b(in_operation_param1_value_b); - request.set_in_operation_param1_ionref_ionsharefd(in_operation_param1_ionref_ionsharefd); - request.set_in_operation_param1_ionref_ionsize(in_operation_param1_ionref_ionsize); - request.set_in_operation_param2_tmpref_buffer(in_operation_param2_tmpref_buffer); - request.set_in_operation_param2_tmpref_size(in_operation_param2_tmpref_size); - request.set_in_operation_param2_memref_parent(in_operation_param2_memref_parent); - request.set_in_operation_param2_memref_parent_flag(in_operation_param2_memref_parent_flag); - request.set_in_operation_param2_memref_size(in_operation_param2_memref_size); - request.set_in_operation_param2_memref_offset(in_operation_param2_memref_offset); - request.set_in_operation_param2_value_a(in_operation_param2_value_a); - request.set_in_operation_param2_value_b(in_operation_param2_value_b); - request.set_in_operation_param2_ionref_ionsharefd(in_operation_param2_ionref_ionsharefd); - request.set_in_operation_param2_ionref_ionsize(in_operation_param2_ionref_ionsize); - request.set_in_operation_param3_tmpref_buffer(in_operation_param3_tmpref_buffer); - request.set_in_operation_param3_tmpref_size(in_operation_param3_tmpref_size); - request.set_in_operation_param3_memref_parent(in_operation_param3_memref_parent); - request.set_in_operation_param3_memref_parent_flag(in_operation_param3_memref_parent_flag); - request.set_in_operation_param3_memref_size(in_operation_param3_memref_size); - request.set_in_operation_param3_memref_offset(in_operation_param3_memref_offset); - request.set_in_operation_param3_value_a(in_operation_param3_value_a); - request.set_in_operation_param3_value_b(in_operation_param3_value_b); - request.set_in_operation_param3_ionref_ionsharefd(in_operation_param3_ionref_ionsharefd); - request.set_in_operation_param3_ionref_ionsize(in_operation_param3_ionref_ionsize); - request.set_in_operation_param4_tmpref_buffer(in_operation_param4_tmpref_buffer); - request.set_in_operation_param4_tmpref_size(in_operation_param4_tmpref_size); - request.set_in_operation_param4_memref_parent(in_operation_param4_memref_parent); - request.set_in_operation_param4_memref_parent_flag(in_operation_param4_memref_parent_flag); - request.set_in_operation_param4_memref_size(in_operation_param4_memref_size); - request.set_in_operation_param4_memref_offset(in_operation_param4_memref_offset); - request.set_in_operation_param4_value_a(in_operation_param4_value_a); - request.set_in_operation_param4_value_b(in_operation_param4_value_b); - request.set_in_operation_param4_ionref_ionsharefd(in_operation_param4_ionref_ionsharefd); - request.set_in_operation_param4_ionref_ionsize(in_operation_param4_ionref_ionsize); - request.set_in_operation_session(in_operation_session); - request.set_in_operation_cancelflag(in_operation_cancelflag); - request.set_in_returnorigin(in_returnorigin); - request.set_in_bufer1_size(in_buffer1_size); - if (in_buffer1_size > 0) - { - for (int i = 0; i < in_buffer1_size; i++) - { - request.add_in_buffer1(in_buffer1[i]); - } - } - request.set_in_bufer2_size(in_buffer2_size); - if (in_buffer2_size > 0) - { - for (int i = 0; i < in_buffer2_size; i++) - { - request.add_in_buffer2(in_buffer2[i]); - } - } - request.set_in_bufer3_size(in_buffer3_size); - if (in_buffer3_size > 0) - { - for (int i = 0; i < in_buffer3_size; i++) - { - request.add_in_buffer3(in_buffer3[i]); - } - } - request.set_in_bufer4_size(in_buffer4_size); - if (in_buffer4_size > 0) - { - for (int i = 0; i < in_buffer4_size; i++) - { - request.add_in_buffer4(in_buffer4[i]); - } - } - request.set_token(glo_token); - //questntainer for the data we expect from the server. - Invo_Reply reply; - ClientContext context; - retstru_teec_invokecommand rreply; - - // The actual RPC. - Status status = stub_->TEECC_InvokeCommand(&context, request, &reply); - retstru_teec_invokecommand error; - - rreply.teecresult = reply.teecresult(); - rreply.session_sessionid = reply.session_sessionid(); - rreply.session_serviceid_timelow = reply.session_serviceid_timelow(); - rreply.session_serviceid_timemid = reply.session_serviceid_timemid(); - rreply.session_serviceid_timehiandver = reply.session_serviceid_timehiandver(); - rreply.session_serviceid_clockseqandnode_outsize = reply.session_serviceid_clockseqandnode_outsize(); - if (rreply.session_serviceid_clockseqandnode_outsize > 0) - { - rreply.session_serviceid_clockseqandnode = new uint8_t[rreply.session_serviceid_clockseqandnode_outsize]; - for (int i = 0; i < rreply.session_serviceid_clockseqandnode_outsize; i++) - { - rreply.session_serviceid_clockseqandnode[i] = reply.session_serviceid_clockseqandnode(i); - } - } - rreply.session_opscnt = reply.session_opscnt(); - rreply.session_head_next = reply.session_head_next(); - rreply.session_head_prev = reply.session_head_prev(); - rreply.session_context = reply.session_context(); - rreply.operation_started = reply.operation_started(); - rreply.operation_paramtypes = reply.operation_paramtypes(); - rreply.operation_param1_tmpref_buffer = reply.operation_param1_tmpref_buffer(); - rreply.operation_param1_tmpref_size = reply.operation_param1_tmpref_size(); - rreply.operation_param1_memref_parent = reply.operation_param1_memref_parent(); - rreply.operation_param1_memref_parent_flag = reply.operation_param1_memref_parent_flag(); - rreply.operation_param1_memref_size = reply.operation_param1_memref_size(); - rreply.operation_param1_memref_offset = reply.operation_param1_memref_offset(); - rreply.operation_param1_value_a = reply.operation_param1_value_a(); - rreply.operation_param1_value_b = reply.operation_param1_value_b(); - rreply.operation_param1_ionref_ionsharefd = reply.operation_param1_ionref_ionsharefd(); - rreply.operation_param1_ionref_ionsize = reply.operation_param1_ionref_ionsize(); - - rreply.operation_param2_tmpref_buffer = reply.operation_param2_tmpref_buffer(); - rreply.operation_param2_tmpref_size = reply.operation_param2_tmpref_size(); - rreply.operation_param2_memref_parent = reply.operation_param2_memref_parent(); - rreply.operation_param2_memref_parent_flag = reply.operation_param2_memref_parent_flag(); - rreply.operation_param2_memref_size = reply.operation_param2_memref_size(); - rreply.operation_param2_memref_offset = reply.operation_param2_memref_offset(); - rreply.operation_param2_value_a = reply.operation_param2_value_a(); - rreply.operation_param2_value_b = reply.operation_param2_value_b(); - rreply.operation_param2_ionref_ionsharefd = reply.operation_param2_ionref_ionsharefd(); - rreply.operation_param2_ionref_ionsize = reply.operation_param2_ionref_ionsize(); - - rreply.operation_param3_tmpref_buffer = reply.operation_param3_tmpref_buffer(); - rreply.operation_param3_tmpref_size = reply.operation_param3_tmpref_size(); - rreply.operation_param3_memref_parent = reply.operation_param3_memref_parent(); - rreply.operation_param3_memref_parent_flag = reply.operation_param3_memref_parent_flag(); - rreply.operation_param3_memref_size = reply.operation_param3_memref_size(); - rreply.operation_param3_memref_offset = reply.operation_param3_memref_offset(); - rreply.operation_param3_value_a = reply.operation_param3_value_a(); - rreply.operation_param3_value_b = reply.operation_param3_value_b(); - rreply.operation_param3_ionref_ionsharefd = reply.operation_param3_ionref_ionsharefd(); - rreply.operation_param3_ionref_ionsize = reply.operation_param3_ionref_ionsize(); - - rreply.operation_param4_tmpref_buffer = reply.operation_param4_tmpref_buffer(); - rreply.operation_param4_tmpref_size = reply.operation_param4_tmpref_size(); - rreply.operation_param4_memref_parent = reply.operation_param4_memref_parent(); - rreply.operation_param4_memref_parent_flag = reply.operation_param4_memref_parent_flag(); - rreply.operation_param4_memref_size = reply.operation_param4_memref_size(); - rreply.operation_param4_memref_offset = reply.operation_param4_memref_offset(); - rreply.operation_param4_value_a = reply.operation_param4_value_a(); - rreply.operation_param4_value_b = reply.operation_param4_value_b(); - rreply.operation_param4_ionref_ionsharefd = reply.operation_param4_ionref_ionsharefd(); - rreply.operation_param4_ionref_ionsize = reply.operation_param4_ionref_ionsize(); - - rreply.operation_session = reply.operation_session(); - rreply.operation_cancelflag = reply.operation_cancelflag(); - rreply.returnorigin = reply.returnorigin(); - rreply.buffer1_outsize = reply.buffer1_outsize(); - if (rreply.buffer1_outsize > 0) - { - rreply.buffer1 = new uint8_t[rreply.buffer1_outsize]; - for (int i = 0; i < rreply.buffer1_outsize; i++) - { - rreply.buffer1[i] = reply.buffer1(i); - } - } - rreply.buffer2_outsize = reply.buffer2_outsize(); - if (rreply.buffer2_outsize > 0) - { - rreply.buffer2 = new uint8_t[rreply.buffer2_outsize]; - for (int i = 0; i < rreply.buffer2_outsize; i++) - { - rreply.buffer2[i] = reply.buffer2(i); - } - } - rreply.buffer3_outsize = reply.buffer3_outsize(); - if (rreply.buffer3_outsize > 0) - { - rreply.buffer3 = new uint8_t[rreply.buffer3_outsize]; - for (int i = 0; i < rreply.buffer3_outsize; i++) - { - rreply.buffer3[i] = reply.buffer3(i); - } - } - rreply.buffer4_outsize = reply.buffer4_outsize(); - if (rreply.buffer4_outsize > 0) - { - rreply.buffer4 = new uint8_t[rreply.buffer4_outsize]; - for (int i = 0; i < rreply.buffer4_outsize; i++) - { - rreply.buffer4[i] = reply.buffer4(i); - } - } - rreply.flag = reply.flag(); - - // Act upon its status. - if (status.ok()) - { - return rreply; - } else - { - std::cout << "libteec invokecommand grpc error: " << status.error_code() << ", " << status.error_message() - << std::endl; - return error; - } - } - - retstru_teec_closesession externc_teec_closesession( - std::uint32_t in_session_sessionid, - std::uint32_t in_session_serviceid_timelow, - std::uint32_t in_session_serviceid_timemid, - std::uint32_t in_session_serviceid_timehiandver, - std::uint8_t *in_session_serviceid_clockseqandnode, - std::uintptr_t in_session_serviceid_clockseqandnode_size, - std::uint32_t in_session_opscnt, - std::uint64_t in_session_head_next, - std::uint64_t in_session_head_prev, - std::uint64_t in_session_context - ) - { - Close_Request request; - - request.set_in_session_sessionid(in_session_sessionid); - request.set_in_session_serviceid_timelow(in_session_serviceid_timelow); - request.set_in_session_serviceid_timemid(in_session_serviceid_timemid); - request.set_in_session_serviceid_timehiandver(in_session_serviceid_timehiandver); - request.set_in_session_serviceid_cad_size(in_session_serviceid_clockseqandnode_size); - if (in_session_serviceid_clockseqandnode_size > 0) - { - for (int i = 0; i < in_session_serviceid_clockseqandnode_size; i++) - { - request.add_in_session_serviceid_clockseqandnode(in_session_serviceid_clockseqandnode[i]); - } - } - request.set_in_session_opscnt(in_session_opscnt); - request.set_in_session_head_next(in_session_head_next); - request.set_in_session_head_prev(in_session_head_prev); - request.set_in_session_context(in_session_context); - request.set_token(glo_token); - - Close_Reply reply; - ClientContext context; - retstru_teec_closesession rreply; - // The actual RPC. - Status status = stub_->TEECC_CloseSession(&context, request, &reply); - retstru_teec_closesession error; - - rreply.session_sessionid = reply.session_sessionid(); - rreply.session_serviceid_timelow = reply.session_serviceid_timelow(); - rreply.session_serviceid_timemid = reply.session_serviceid_timemid(); - rreply.session_serviceid_timehiandver = reply.session_serviceid_timehiandver(); - rreply.session_serviceid_clockseqandnode_outsize = reply.session_serviceid_cad_outsize(); - - if (rreply.session_serviceid_clockseqandnode_outsize > 0) - { - rreply.session_serviceid_clockseqandnode = new uint8_t[rreply.session_serviceid_clockseqandnode_outsize]; - for (int i = 0; i < rreply.session_serviceid_clockseqandnode_outsize; i++) - { - rreply.session_serviceid_clockseqandnode[i] = reply.session_serviceid_clockseqandnode(i); - } - } - - rreply.session_opscnt = reply.session_opscnt(); - rreply.session_head_next = reply.session_head_next(); - rreply.session_head_prev = reply.session_head_prev(); - rreply.session_context = reply.session_context(); - rreply.flag = reply.flag(); - - // Act upon its status. - if (status.ok()) - { - return rreply; - } else - { - std::cout << "libteec closesession grpc error: " << status.error_code() << ", " << status.error_message() - << std::endl; - return error; - } - } - - - int - Upload( - std::string infile_path, - std::string subdir, - std::string outfile_name - ) - { - TA_Chunk chunk; - TA_Reply stats; - ClientContext context; - const char *filename = infile_path.data(); - std::ifstream infile; - int retcode = 0; - - struct timeval start, end; - gettimeofday(&start, NULL); - - infile.open(filename, std::ifstream::in | std::ifstream::binary); - if (!infile) - { - return TEEC_INFILE_NOT_FOUND; - } - - long beginoffset, endoffset; - beginoffset = infile.tellg(); - infile.seekg(0, std::ios::end); - endoffset = infile.tellg(); - long filesize = endoffset - beginoffset; - infile.seekg(0, std::ios::beg); - char *data = new char[filesize]; - infile.read(data, filesize); - - chunk.set_buffer(data, infile.gcount()); - - delete[]data; - infile.close(); - - if (subdir.empty()) - { - std::string strsubdirdefault("default"); - chunk.set_subdir(strsubdirdefault); - } else - { - bool bResult; - bResult = utf8_check_is_valid(subdir); - if (bResult == false) - { - return TEEC_FAIL; - } - - chunk.set_subdir(subdir); - } - - std::string stroutname; - std::string infile_path_temp = infile_path; - if (outfile_name.empty()) - { - char *filenametemp = const_cast(infile_path_temp.data()); - const char slash[] = "/"; - char *nametemp = strtok(filenametemp, slash); - while (nametemp != NULL) - { - stroutname = std::string(nametemp); - nametemp = strtok(NULL, slash); - } - chunk.set_name(stroutname); - } else - { - chunk.set_name(outfile_name); - } - - chunk.set_token(glo_token); - - char sha256[SHA256_LENTH]; - int iRet; - iRet = get_file_sha256((char *) filename, sha256); - if (iRet != 0) - { - return TEEC_FAIL; - } - - chunk.set_sha256(sha256, SHA256_LENTH); - - Status status = stub_->TEECC_TA(&context, chunk, &stats); - - - if (status.ok()) - { - retcode = stats.code(); - - if (stats.code() == 0) - { - retcode = 0; - } else if (stats.code() == -1) - { - std::cout << "libteeccc: deployta jwt validate error" << std::endl; - retcode = TEEC_ERROR_JWTVALIDATE_FAIL; - } else - { - retcode = TEEC_FAIL; - } - } else - { - std::cout << "libteec deployta grpc error: " << status.error_code() << ", " - << status.error_message() << std::endl; - retcode = TEEC_FAIL; - } - - return retcode; - } - - // Out of the passed in Channel comes the stub, stored here, our view of the - // server's exposed services. - std::unique_ptr stub_; -}; - - -static GppClient *client = NULL; -std::shared_ptr gpp_channel = NULL; - - -std::string global_strcfgfiletemp = getenv("HOME"); -std::string global_strcfgfile = global_strcfgfiletemp + "/.teecc/teecc_config.yaml"; -YAML::Node glo_config = YAML::LoadFile(global_strcfgfile); -std::string global_target_str = glo_config["GPPROXY_ADDRESS"].as(); -std::string global_servercacert_path = global_strcfgfiletemp + "/.teecc/certs/" + glo_config["NAME_SERVERCA_CERT"].as(); -std::string global_clientkey_path = global_strcfgfiletemp + "/.teecc/certs/" + glo_config["NAME_CLIENT_KEY"].as(); -std::string global_clientcert_path = global_strcfgfiletemp + "/.teecc/certs/" + glo_config["NAME_CLIENT_CERT"].as(); -int grpc_tls = glo_config["GRPC_TLS"].as(); - - -int64_t glob_scontaddr; - -bool isFileExists_ifstream(std::string &name) -{ - std::ifstream f(name.c_str()); - return f.good(); -} - -static std::string get_file_contents(std::string fpath) -{ - std::ifstream finstream(fpath); - std::string contents; - contents.assign((std::istreambuf_iterator(finstream)), - std::istreambuf_iterator()); - finstream.close(); - return contents; -} - - -TEEC_Result -TEEC_InitializeContext(const char *name, TEEC_Context *context) -{ - if (gpp_channel == NULL) - { - int igrpctls = grpc_tls; - - if (grpc_tls != 0 && grpc_tls != 1 && grpc_tls != 2) - { - std::cout << global_strcfgfile << " grpc_tls should be 0 or 1 or 2 " << std::endl; - return TEEC_FAIL; - } - - switch (igrpctls) - { - case 0: - { - gpp_channel = grpc::CreateChannel(global_target_str, grpc::InsecureChannelCredentials()); - - break; - } - - case 1: - { - if (!isFileExists_ifstream(global_servercacert_path)) - { - std::cout << "error file : " << global_servercacert_path << " is not exist " << std::endl; - return TEEC_FAIL; - } - - std::string strcmd; - FILE *pipe; - char buffer[128]; - std::string result; - - std::string strdayseconds; - char *resulttemp; - const char slash[] = "\n"; - char *parresult; - std::string strparresult; - std::string willexpire("Certificate will expire"); - - // 7 days in seconds - strdayseconds = "604800"; - strcmd = "openssl x509 -enddate -noout -in " + global_servercacert_path + " -checkend " + strdayseconds; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - resulttemp = const_cast(result.data()); - parresult = strtok(resulttemp, slash); - while (parresult != NULL) - { - strparresult = std::string(parresult); - parresult = strtok(NULL, slash); - } - if (strparresult.compare(willexpire) == 0) - { - std::cout << "gpp '" << global_servercacert_path << "' will expire in 7 days, please reget it" << std::endl; - return TEEC_FAIL; - } - - auto servercacert = get_file_contents(global_servercacert_path); - grpc::SslCredentialsOptions ssl_opts; - ssl_opts.pem_root_certs = servercacert; - std::shared_ptr creds = grpc::SslCredentials(ssl_opts); - gpp_channel = grpc::CreateChannel(global_target_str, creds); - - break; - } - - case 2: - { - if (!isFileExists_ifstream(global_servercacert_path)) - { - std::cout << "error file : " << global_servercacert_path << " is not exist " << std::endl; - return TEEC_FAIL; - } - if (!isFileExists_ifstream(global_clientkey_path)) - { - std::cout << "error file : " << global_clientkey_path << " is not exist " << std::endl; - return TEEC_FAIL; - } - if (!isFileExists_ifstream(global_clientcert_path)) - { - std::cout << "error file : " << global_clientcert_path << " is not exist " << std::endl; - return TEEC_FAIL; - } - - std::string strcmd; - FILE *pipe; - char buffer[128]; - std::string result; - - std::string strdayseconds; - char *resulttemp; - const char slash[] = "\n"; - char *parresult; - std::string strparresult; - std::string willexpire("Certificate will expire"); - - // 7 days in seconds - strdayseconds = "604800"; - strcmd = "openssl x509 -enddate -noout -in " + global_servercacert_path + " -checkend " + strdayseconds; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - resulttemp = const_cast(result.data()); - parresult = strtok(resulttemp, slash); - while (parresult != NULL) - { - strparresult = std::string(parresult); - parresult = strtok(NULL, slash); - } - if (strparresult.compare(willexpire) == 0) - { - std::cout << "libteecc '" << global_servercacert_path << "' will expire in 7 days, please reget it" - << std::endl; - return TEEC_FAIL; - } - - // 7 days in seconds - strdayseconds = "604800"; - strcmd = "openssl x509 -enddate -noout -in " + global_clientcert_path + " -checkend " + strdayseconds; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - resulttemp = const_cast(result.data()); - parresult = strtok(resulttemp, slash); - while (parresult != NULL) - { - strparresult = std::string(parresult); - parresult = strtok(NULL, slash); - } - if (strparresult.compare(willexpire) == 0) - { - std::cout << "libteecc '" << global_clientcert_path << "' will expire in 7 days, please reget it" << std::endl; - return TEEC_FAIL; - } - - strcmd = "openssl rsa -in " + global_clientkey_path + " -out " - + global_clientkey_path + ".nopass"; - std::string nopass_clientkey_path = global_clientkey_path + ".nopass"; - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - - strcmd = "openssl rsa -in " + nopass_clientkey_path + " -check -noout"; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - std::string keyok("RSA key ok\n"); - if (result.compare(keyok) != 0) - { - std::cout << "libteecc '" + global_clientkey_path + "' integrity is broken" << std::endl; - return TEEC_FAIL; - } - - std::string sigfile_path = global_strcfgfiletemp + "/.teecc/certs/msg.sig"; - std::string msgfile_path = global_strcfgfiletemp + "/.teecc/certs/msg.txt"; - strcmd = - "openssl dgst -sha256 -sign " + nopass_clientkey_path + " -out " + sigfile_path + " " + msgfile_path; - system(strcmd.c_str()); - // ${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} - std::string pubkeyfile_path = global_strcfgfiletemp + "/.teecc/certs/client_pubkey.pem"; - strcmd = "openssl x509 -in " + global_clientcert_path + " -pubkey -out " + pubkeyfile_path; - system(strcmd.c_str()); - - // ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt - strcmd = "openssl dgst -sha256 -verify " + pubkeyfile_path + " -signature " + sigfile_path + " " + - msgfile_path; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - // std::cout << "gpp popen " << strcmd << " succed, result: " << result < creds = grpc::SslCredentials(ssl_opts); - gpp_channel = grpc::CreateChannel(global_target_str, creds); - - break; - } - - default: - { - gpp_channel = grpc::CreateChannel(global_target_str, grpc::InsecureChannelCredentials()); - } - } - - client = new GppClient( - gpp_channel - ); - } - - std::uint8_t *name_temp = NULL; - std::uint32_t name_size; - struct retstru_teec_inicont rs_inicont_ins; - - if (name != NULL) - { - name_temp = (uint8_t *) name; - name_size = strlen(name); - } else - { - name_size = 0; - } - - if (context == NULL) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - rs_inicont_ins = client->externc_teec_initializecontext(name_temp, - name_size - ); - if (rs_inicont_ins.flag == 1) - { - std::cout << "libteecc: inicont token null" << std::endl; - - return TEEC_ERROR_BAD_PARAMETERS; - } - if (rs_inicont_ins.flag == 2) - { - std::cout << "libteecc: inicont jwt validate error" << std::endl; - return TEEC_ERROR_BAD_PARAMETERS; - } - - if (rs_inicont_ins.teecresult == TEEC_SUCCESS) - { - context->fd = rs_inicont_ins.context_fd; - - if ( - rs_inicont_ins.context_tapath_outsize > 0 && - rs_inicont_ins.context_tapath != NULL - ) - { - if (context->ta_path == NULL) - { - return TEEC_ERROR_CONTEXT_TAPATH_NULL; - } else - { - memcpy( - context->ta_path, - rs_inicont_ins.context_tapath, - rs_inicont_ins.context_tapath_outsize - ); - *(context->ta_path + rs_inicont_ins.context_tapath_outsize) = 0; - } - } else - { - context->ta_path = NULL; - } - context->session_list.next = (struct ListNode *) rs_inicont_ins.context_sessionlist_next; - context->session_list.prev = (struct ListNode *) rs_inicont_ins.context_sessionlist_prev; - context->shrd_mem_list.next = (struct ListNode *) rs_inicont_ins.context_shrdmemlist_next; - context->shrd_mem_list.prev = (struct ListNode *) rs_inicont_ins.context_shrdmemlist_prev; - context->share_buffer.buffer = (void *) rs_inicont_ins.context_sharebuffer_buffer; - context->share_buffer.buffer_barrier.__align = rs_inicont_ins.context_sharebuffer_bufferbarrier; - glob_scontaddr = rs_inicont_ins.context_addr; - } - return static_cast(rs_inicont_ins.teecresult); -} - -void -TEEC_FinalizeContext(TEEC_Context *context) -{ - std::int32_t in_context_fd; - std::uint8_t *in_context_tapath; - std::int32_t in_context_tapath_size; - std::uint64_t in_context_sessionlist_next; - std::uint64_t in_context_sessionlist_prev; - std::uint64_t in_context_shrdmemlist_next; - std::uint64_t in_context_shrdmemlist_prev; - std::uint64_t in_context_sharebuffer_buffer; - std::int64_t in_context_sharebuffer_bufferbarrier; - struct retstru_teec_fincont rs_fincont_ins; - - - if (gpp_channel == NULL) - { - std::cout << "libteecc: the grpc client or channel is null, when executing TEEC_FinalizeContext." << std::endl; - return; - } - - if (context == NULL) - { - return; - } - - in_context_fd = context->fd; - in_context_tapath = context->ta_path; - if (in_context_tapath == NULL) - { - in_context_tapath_size = 0; - } else - { - std::string strtmp((char *) in_context_tapath); - bool bResult; - bResult = utf8_check_is_valid(strtmp); - if (bResult == true) - { - in_context_tapath_size = strtmp.length(); - } else - { - in_context_tapath_size = 0; - } - } - in_context_sessionlist_next = (uint64_t) context->session_list.next; - in_context_sessionlist_prev = (uint64_t) context->session_list.prev; - in_context_shrdmemlist_next = (uint64_t) context->shrd_mem_list.next; - in_context_shrdmemlist_prev = (uint64_t) context->shrd_mem_list.prev; - in_context_sharebuffer_buffer = (uint64_t) context->share_buffer.buffer; - in_context_sharebuffer_bufferbarrier = context->share_buffer.buffer_barrier.__align; - - rs_fincont_ins = client->externc_teec_finalizecontext(in_context_fd, - in_context_tapath, - in_context_tapath_size, - in_context_sessionlist_next, - in_context_sessionlist_prev, - in_context_shrdmemlist_next, - in_context_shrdmemlist_prev, - in_context_sharebuffer_buffer, - in_context_sharebuffer_bufferbarrier, - glob_scontaddr); - if (rs_fincont_ins.flag == 1) - { - std::cout << "libteecc: fincont token null" << std::endl; - return; - } - if (rs_fincont_ins.flag == 2) - { - std::cout << "libteecc: fincont jwt validate error" << std::endl; - return; - } -#if 0 - std::cout << "externc_teec_finalizecontext: " << std::endl; - std::cout << "gpp reply context_fd: " << rs_fincont_ins.context_fd < 0){ - std::cout << "gpp reply context_tapath: " << rs_fincont_ins.context_tapath <fd = rs_fincont_ins.context_fd; - if ( - rs_fincont_ins.context_tapath_outsize > 0 && - rs_fincont_ins.context_tapath != NULL - ) - { - if (context->ta_path == NULL) - { - return; - } - } - context->session_list.next = (struct ListNode *) rs_fincont_ins.context_sessionlist_next; - context->session_list.prev = (struct ListNode *) rs_fincont_ins.context_sessionlist_prev; - context->shrd_mem_list.next = (struct ListNode *) rs_fincont_ins.context_shrdmemlist_next; - context->shrd_mem_list.prev = (struct ListNode *) rs_fincont_ins.context_shrdmemlist_prev; - context->share_buffer.buffer = (void *) rs_fincont_ins.context_sharebuffer_buffer; - context->share_buffer.buffer_barrier.__align = rs_fincont_ins.context_sharebuffer_bufferbarrier; - - gpp_channel.reset(); - delete gpp_channel.get(); - delete client; -} - -TEEC_Result -TEEC_OpenSession(TEEC_Context *context, - TEEC_Session *session, - const TEEC_UUID *destination, - uint32_t connectionMethod, - const void *connectionData, - TEEC_Operation *operation, - uint32_t *returnOrigin -) -{ - - std::int32_t in_context_fd; - std::uint8_t *in_context_tapath; - std::int32_t in_context_tapath_size; - std::uint64_t in_context_sessionlist_next; - std::uint64_t in_context_sessionlist_prev; - std::uint64_t in_context_shrdmemlist_next; - std::uint64_t in_context_shrdmemlist_prev; - std::uint64_t in_context_sharebuffer_buffer; - std::int64_t in_context_sharebuffer_bufferbarrier; - - if (gpp_channel == NULL) - { - std::cout << "libteecc: the grpc client or channel is null, when executing TEEC_OpenSession." << std::endl; - return TEEC_ERROR_GRPC_ERROR; - } - - if (context == NULL) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - - if (session == NULL) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - - if (destination == NULL) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - - in_context_fd = context->fd; - in_context_tapath = context->ta_path; - - if (in_context_tapath == NULL) - { - in_context_tapath_size = 0; - } else - { - in_context_tapath_size = strlen((const char *) in_context_tapath); - } - in_context_sessionlist_next = (uint64_t) context->session_list.next; - in_context_sessionlist_prev = (uint64_t) context->session_list.prev; - in_context_shrdmemlist_next = (uint64_t) context->shrd_mem_list.next; - in_context_shrdmemlist_prev = (uint64_t) context->shrd_mem_list.prev; - in_context_sharebuffer_buffer = (uint64_t) context->share_buffer.buffer; - in_context_sharebuffer_bufferbarrier = context->share_buffer.buffer_barrier.__align; - - uint32_t in_destination_timelow; - uint32_t in_destination_timemid; - uint32_t in_destination_timehiandver; - uint8_t in_destination_clockseqandnode[8]; - int32_t in_destination_clockseqandnode_size; - - uint32_t in_connectionmethod; - uint64_t in_connectiondata; - - uint32_t in_operation_started; - uint32_t in_operation_paramtypes; - - uint64_t in_operation_param1_tmpref_buffer; - uint32_t in_operation_param1_tmpref_size; - uint64_t in_operation_param1_memref_parent; - uint32_t in_operation_param1_memref_size; - uint32_t in_operation_param1_memref_offset; - uint32_t in_operation_param1_value_a; - uint32_t in_operation_param1_value_b; - int32_t in_operation_param1_ionref_ionsharefd; - uint32_t in_operation_param1_ionref_ionsize; - - uint64_t in_operation_param2_tmpref_buffer; - uint32_t in_operation_param2_tmpref_size; - uint64_t in_operation_param2_memref_parent; - uint32_t in_operation_param2_memref_size; - uint32_t in_operation_param2_memref_offset; - uint32_t in_operation_param2_value_a; - uint32_t in_operation_param2_value_b; - int32_t in_operation_param2_ionref_ionsharefd; - uint32_t in_operation_param2_ionref_ionsize; - - uint64_t in_operation_param3_tmpref_buffer; - uint32_t in_operation_param3_tmpref_size; - uint64_t in_operation_param3_memref_parent; - uint32_t in_operation_param3_memref_size; - uint32_t in_operation_param3_memref_offset; - uint32_t in_operation_param3_value_a; - uint32_t in_operation_param3_value_b; - int32_t in_operation_param3_ionref_ionsharefd; - uint32_t in_operation_param3_ionref_ionsize; - - uint64_t in_operation_param4_tmpref_buffer; - uint32_t in_operation_param4_tmpref_size; - uint64_t in_operation_param4_memref_parent; - uint32_t in_operation_param4_memref_size; - uint32_t in_operation_param4_memref_offset; - uint32_t in_operation_param4_value_a; - uint32_t in_operation_param4_value_b; - int32_t in_operation_param4_ionref_ionsharefd; - uint32_t in_operation_param4_ionref_ionsize; - - uint64_t in_operation_session; - int32_t in_operation_cancelflag; - - uint32_t in_returnorigin; - - struct retstru_teec_opensession rs_opensession_ins; - - - in_destination_timelow = destination->timeLow; - in_destination_timemid = destination->timeMid; - in_destination_timehiandver = destination->timeHiAndVersion; - for (int i = 0; i < 8; i++) - { - in_destination_clockseqandnode[i] = destination->clockSeqAndNode[i]; - } - in_destination_clockseqandnode_size = 8; - - in_connectionmethod = connectionMethod; - in_connectiondata = (uint64_t) connectionData; - - in_operation_started = operation->started; - in_operation_paramtypes = operation->paramTypes; - - in_operation_param1_tmpref_buffer = (uint64_t) operation->params[0].tmpref.buffer; - in_operation_param1_tmpref_size = operation->params[0].tmpref.size; - in_operation_param1_memref_parent = (uint64_t) operation->params[0].memref.parent; - in_operation_param1_memref_size = operation->params[0].memref.size; - in_operation_param1_memref_offset = operation->params[0].memref.offset; - in_operation_param1_value_a = operation->params[0].value.a; - in_operation_param1_value_b = operation->params[0].value.b; - in_operation_param1_ionref_ionsharefd = operation->params[0].ionref.ion_share_fd; - in_operation_param1_ionref_ionsize = operation->params[0].ionref.ion_size; - - in_operation_param2_tmpref_buffer = (uint64_t) operation->params[1].tmpref.buffer; - in_operation_param2_tmpref_size = operation->params[1].tmpref.size; - in_operation_param2_memref_parent = (uint64_t) operation->params[1].memref.parent; - in_operation_param2_memref_size = operation->params[1].memref.size; - in_operation_param2_memref_offset = operation->params[1].memref.offset; - in_operation_param2_value_a = operation->params[1].value.a; - in_operation_param2_value_b = operation->params[1].value.b; - in_operation_param2_ionref_ionsharefd = operation->params[1].ionref.ion_share_fd; - in_operation_param2_ionref_ionsize = operation->params[1].ionref.ion_size; - - in_operation_param3_tmpref_buffer = (uint64_t) operation->params[2].tmpref.buffer; - in_operation_param3_tmpref_size = operation->params[2].tmpref.size; - in_operation_param3_memref_parent = (uint64_t) operation->params[2].memref.parent; - in_operation_param3_memref_size = operation->params[2].memref.size; - in_operation_param3_memref_offset = operation->params[2].memref.offset; - in_operation_param3_value_a = operation->params[2].value.a; - in_operation_param3_value_b = operation->params[2].value.b; - in_operation_param3_ionref_ionsharefd = operation->params[2].ionref.ion_share_fd; - in_operation_param3_ionref_ionsize = operation->params[2].ionref.ion_size; - - in_operation_param4_tmpref_buffer = (uint64_t) operation->params[3].tmpref.buffer; - in_operation_param4_tmpref_size = operation->params[3].tmpref.size; - in_operation_param4_memref_parent = (uint64_t) operation->params[3].memref.parent; - in_operation_param4_memref_size = operation->params[3].memref.size; - in_operation_param4_memref_offset = operation->params[3].memref.offset; - in_operation_param4_value_a = operation->params[3].value.a; - in_operation_param4_value_b = operation->params[3].value.b; - in_operation_param4_ionref_ionsharefd = operation->params[3].ionref.ion_share_fd; - in_operation_param4_ionref_ionsize = operation->params[3].ionref.ion_size; - - in_operation_session = (uint64_t) operation->session; - in_operation_cancelflag = operation->cancel_flag; - - in_returnorigin = *returnOrigin; - - rs_opensession_ins = - client->externc_teec_opensession( - in_context_fd, - in_context_tapath, - in_context_tapath_size, - in_context_sessionlist_next, - in_context_sessionlist_prev, - in_context_shrdmemlist_next, - in_context_shrdmemlist_prev, - in_context_sharebuffer_buffer, - in_context_sharebuffer_bufferbarrier, - - in_destination_timelow, - in_destination_timemid, - in_destination_timehiandver, - in_destination_clockseqandnode, - in_destination_clockseqandnode_size, - - in_connectionmethod, - in_connectiondata, - - in_operation_started, - in_operation_paramtypes, - - in_operation_param1_tmpref_buffer, - in_operation_param1_tmpref_size, - in_operation_param1_memref_parent, - in_operation_param1_memref_size, - in_operation_param1_memref_offset, - in_operation_param1_value_a, - in_operation_param1_value_b, - in_operation_param1_ionref_ionsharefd, - in_operation_param1_ionref_ionsize, - - in_operation_param2_tmpref_buffer, - in_operation_param2_tmpref_size, - in_operation_param2_memref_parent, - in_operation_param2_memref_size, - in_operation_param2_memref_offset, - in_operation_param2_value_a, - in_operation_param2_value_b, - in_operation_param2_ionref_ionsharefd, - in_operation_param2_ionref_ionsize, - - in_operation_param3_tmpref_buffer, - in_operation_param3_tmpref_size, - in_operation_param3_memref_parent, - in_operation_param3_memref_size, - in_operation_param3_memref_offset, - in_operation_param3_value_a, - in_operation_param3_value_b, - in_operation_param3_ionref_ionsharefd, - in_operation_param3_ionref_ionsize, - - in_operation_param4_tmpref_buffer, - in_operation_param4_tmpref_size, - in_operation_param4_memref_parent, - in_operation_param4_memref_size, - in_operation_param4_memref_offset, - in_operation_param4_value_a, - in_operation_param4_value_b, - in_operation_param4_ionref_ionsharefd, - in_operation_param4_ionref_ionsize, - - in_operation_session, - in_operation_cancelflag, - in_returnorigin, - glob_scontaddr - ); - if (rs_opensession_ins.flag == 1) - { - std::cout << "libteecc: opensession token null" << std::endl; - return TEEC_ERROR_BAD_PARAMETERS; - } - if (rs_opensession_ins.flag == 2) - { - std::cout << "libteecc: opensession jwt validate error" << std::endl; - return TEEC_ERROR_BAD_PARAMETERS; - } - -#if 0 - std::cout << "externc_teec_opensession:" << std::endl; - std::cout << "gpp request in_context_fd: 0x " << std::hex << std::setfill('0') << std::setw(8) << in_context_fd - << std::endl; - std::cout << "gpp request in_context_addr: 0x" << std::hex << std::setfill('0') << std::setw(8) - << (unsigned long) glob_scontaddr << std::endl; - std::cout << "gpp reply teecresult: " << std::hex << std::setfill('0') << std::setw(8) - << rs_opensession_ins.teecresult << std::endl; - std::cout << "gpp reply context_fd: " << std::hex << std::setfill('0') << std::setw(8) - << rs_opensession_ins.context_fd << std::endl; - - if ( - rs_opensession_ins.context_tapath_outsize > 0 - && - rs_opensession_ins.context_tapath != NULL - ) - { - std::cout << "gpp reply context_tapath: " << rs_opensession_ins.context_tapath << std::endl; - } - printf("gpp reply context_tapath outsize = %ld\n", - rs_opensession_ins.context_tapath_outsize); -#endif - -#if 0 - printf("ret context_sessionlist_next = 0x %16.16lx\n", - rs_opensession_ins.context_sessionlist_next); - printf("ret context_sessionlist_prev = 0x %16.16lx\n", - rs_opensession_ins.context_sessionlist_prev); - printf("ret context_shrdmemlist_next = 0x %16.16lx\n", - rs_opensession_ins.context_shrdmemlist_next); - printf("ret context_shrdmemlist_prev = 0x %16.16lx\n", - rs_opensession_ins.context_shrdmemlist_prev); - printf("ret context_sharebuffer_buffer = 0x %16.16lx\n", - rs_opensession_ins.context_sharebuffer_buffer); - printf("ret context_sharebuffer_bufferbarrier = 0x %16.16lx\n", - (long unsigned int) rs_opensession_ins.context_sharebuffer_bufferbarrier); -#endif - -#if 0 - std::cout << "gpp reply session_sessionid: 0x " << std::hex << std::setfill('0') << std::setw(8) - << rs_opensession_ins.session_sessionid << std::endl; -#endif - -#if 0 - printf("ret session_serviceid_timelow = 0x %8.8x\n", - rs_opensession_ins.session_serviceid_timelow); - printf("ret session_serviceid_timemid = 0x %8.8x\n", - rs_opensession_ins.session_serviceid_timemid); - printf("ret session_serviceid_timehiandver = 0x %8.8x\n", - rs_opensession_ins.session_serviceid_timehiandver); - if ( - rs_opensession_ins.session_serviceid_clockseqandnode_outsize > 0 - && - rs_opensession_ins.session_serviceid_clockseqandnode != NULL - ) { - printf("ret session_serviceid_clockseqandnode = \n"); - for (uintptr_t uisize = 0; - uisize < rs_opensession_ins.session_serviceid_clockseqandnode_outsize; - uisize++) { - printf(" %2.2x", *(rs_opensession_ins.session_serviceid_clockseqandnode + uisize)); - } - printf("\n"); - } else { - printf("ret clockseqandnode addr = 0x %16.16lx\n", - (unsigned long) rs_opensession_ins.session_serviceid_clockseqandnode); - } - printf("ret clockseqandnode_outsize = %ld\n", - rs_opensession_ins.session_serviceid_clockseqandnode_outsize); - printf("ret session_opscnt = 0x %8.8x\n", - rs_opensession_ins.session_opscnt); - printf("ret session_head_next = 0x %16.16lx\n", - rs_opensession_ins.session_head_next); - printf("ret session_head_prev = 0x %16.16lx\n", - rs_opensession_ins.session_head_prev); -#endif - -#if 0 - std::cout << "gpp reply session_context: 0x " << std::hex << std::setfill('0') << std::setw(16) - << rs_opensession_ins.session_context << std::endl; -#endif - if (rs_opensession_ins.teecresult == TEEC_SUCCESS) - { - context->fd = rs_opensession_ins.context_fd; - - if ( - rs_opensession_ins.context_tapath_outsize > 0 && - rs_opensession_ins.context_tapath != NULL - ) - { - if (context->ta_path == NULL) - { - return TEEC_ERROR_CONTEXT_TAPATH_NULL; - } - } - context->session_list.next = (struct ListNode *) rs_opensession_ins.context_sessionlist_next; - context->session_list.prev = (struct ListNode *) rs_opensession_ins.context_sessionlist_prev; - context->shrd_mem_list.next = (struct ListNode *) rs_opensession_ins.context_shrdmemlist_next; - context->shrd_mem_list.prev = (struct ListNode *) rs_opensession_ins.context_shrdmemlist_prev; - context->share_buffer.buffer = (void *) rs_opensession_ins.context_sharebuffer_buffer; - context->share_buffer.buffer_barrier.__align = rs_opensession_ins.context_sharebuffer_bufferbarrier; - - session->session_id = rs_opensession_ins.session_sessionid; - session->service_id.timeLow = rs_opensession_ins.session_serviceid_timelow; - session->service_id.timeMid = rs_opensession_ins.session_serviceid_timemid; - session->service_id.timeHiAndVersion = rs_opensession_ins.session_serviceid_timehiandver; - - if (rs_opensession_ins.session_serviceid_clockseqandnode_outsize <= 8 && - rs_opensession_ins.session_serviceid_clockseqandnode_outsize > 0 && - rs_opensession_ins.session_serviceid_clockseqandnode != NULL && - session->service_id.clockSeqAndNode != NULL - ) - { - for (int i = 0; i < rs_opensession_ins.session_serviceid_clockseqandnode_outsize; i++) - { - session->service_id.clockSeqAndNode[i] = - (uint8_t)(rs_opensession_ins.session_serviceid_clockseqandnode[i] & 0x000000ff); - } - } else - { - for (int i = 0; i < 8; i++) - { - session->service_id.clockSeqAndNode[i] = 0; - } - } - session->ops_cnt = rs_opensession_ins.session_opscnt; - session->head.next = (struct ListNode *) rs_opensession_ins.session_head_next; - session->head.prev = (struct ListNode *) rs_opensession_ins.session_head_prev; - session->context = (TEEC_Context *) rs_opensession_ins.session_context; - - - operation->started = rs_opensession_ins.operation_started; - operation->paramTypes = rs_opensession_ins.operation_paramtypes; - -#if 0 - uint32_t * buffer1_temp = NULL; - if ( - (rs_opensession_ins.operation_paramtypes & 0x000000ff) == TEEC_MEMREF_TEMP_OUTPUT || - (rs_opensession_ins.operation_paramtypes & 0x000000ff) == TEEC_MEMREF_TEMP_INOUT - ) - { - if (operation->params[0].tmpref.buffer == NULL) - { - externc_retstru_teec_opensession_free(rs_opensession_ins); - return TEEC_ERROR_PARAM0_TEMPMEM_NULL; - } - } -#endif - - operation->params[0].tmpref.buffer = (void *) rs_opensession_ins.operation_param1_tmpref_buffer; - operation->params[0].tmpref.size = rs_opensession_ins.operation_param1_tmpref_size; - operation->params[0].memref.parent = - (TEEC_SharedMemory *) rs_opensession_ins.operation_param1_memref_parent; - operation->params[0].memref.size = rs_opensession_ins.operation_param1_memref_size; - operation->params[0].memref.offset = rs_opensession_ins.operation_param1_memref_offset; - operation->params[0].value.a = rs_opensession_ins.operation_param1_value_a; - operation->params[0].value.b = rs_opensession_ins.operation_param1_value_b; - operation->params[0].ionref.ion_share_fd = rs_opensession_ins.operation_param1_ionref_ionsharefd; - operation->params[0].ionref.ion_size = rs_opensession_ins.operation_param1_ionref_ionsize; - - operation->params[1].tmpref.buffer = (void *) rs_opensession_ins.operation_param2_tmpref_buffer; - operation->params[1].tmpref.size = rs_opensession_ins.operation_param2_tmpref_size; - operation->params[1].memref.parent = - (TEEC_SharedMemory *) rs_opensession_ins.operation_param2_memref_parent; - operation->params[1].memref.size = rs_opensession_ins.operation_param2_memref_size; - operation->params[1].memref.offset = rs_opensession_ins.operation_param2_memref_offset; - operation->params[1].value.a = rs_opensession_ins.operation_param2_value_a; - operation->params[1].value.b = rs_opensession_ins.operation_param2_value_b; - operation->params[1].ionref.ion_share_fd = rs_opensession_ins.operation_param2_ionref_ionsharefd; - operation->params[1].ionref.ion_size = rs_opensession_ins.operation_param2_ionref_ionsize; - - operation->params[2].tmpref.buffer = (void *) rs_opensession_ins.operation_param3_tmpref_buffer; - operation->params[2].tmpref.size = rs_opensession_ins.operation_param3_tmpref_size; - operation->params[2].memref.parent = - (TEEC_SharedMemory *) rs_opensession_ins.operation_param3_memref_parent; - operation->params[2].memref.size = rs_opensession_ins.operation_param3_memref_size; - operation->params[2].memref.offset = rs_opensession_ins.operation_param3_memref_offset; - operation->params[2].value.a = rs_opensession_ins.operation_param3_value_a; - operation->params[2].value.b = rs_opensession_ins.operation_param3_value_b; - operation->params[2].ionref.ion_share_fd = rs_opensession_ins.operation_param3_ionref_ionsharefd; - operation->params[2].ionref.ion_size = rs_opensession_ins.operation_param3_ionref_ionsize; - - operation->params[3].tmpref.buffer = (void *) rs_opensession_ins.operation_param4_tmpref_buffer; - operation->params[3].tmpref.size = rs_opensession_ins.operation_param4_tmpref_size; - operation->params[3].memref.parent = - (TEEC_SharedMemory *) rs_opensession_ins.operation_param4_memref_parent; - operation->params[3].memref.size = rs_opensession_ins.operation_param4_memref_size; - operation->params[3].memref.offset = rs_opensession_ins.operation_param4_memref_offset; - operation->params[3].value.a = rs_opensession_ins.operation_param4_value_a; - operation->params[3].value.b = rs_opensession_ins.operation_param4_value_b; - operation->params[3].ionref.ion_share_fd = rs_opensession_ins.operation_param4_ionref_ionsharefd; - operation->params[3].ionref.ion_size = rs_opensession_ins.operation_param4_ionref_ionsize; - - operation->session = (TEEC_Session *) rs_opensession_ins.operation_session; - operation->cancel_flag = rs_opensession_ins.operation_cancelflag; - - *returnOrigin = in_returnorigin; - } - return static_cast(rs_opensession_ins.teecresult); -} - -extern -TEEC_Result -TEEC_InvokeCommand(TEEC_Session *session, - uint32_t commandID, - TEEC_Operation *operation, - uint32_t *returnOrigin -) -{ - uint32_t in_session_sessionid; - uint32_t in_session_serviceid_timelow; - uint32_t in_session_serviceid_timemid; - uint32_t in_session_serviceid_timehiandver; - uint8_t in_session_serviceid_clockseqandnode[8]; - uintptr_t in_session_serviceid_clockseqandnode_size; - uint32_t in_session_opscnt; - uint64_t in_session_head_next; - int64_t in_session_head_prev; - uint64_t in_session_context; - - uint32_t in_commandid; - - uint32_t in_operation_started; - uint32_t in_operation_paramtypes; - - uint64_t in_operation_param1_tmpref_buffer; - uint32_t in_operation_param1_tmpref_size; - uint64_t in_operation_param1_memref_parent; - uint32_t in_operation_param1_memref_parent_flag; - uint32_t in_operation_param1_memref_size; - uint32_t in_operation_param1_memref_offset; - uint32_t in_operation_param1_value_a; - uint32_t in_operation_param1_value_b; - int32_t in_operation_param1_ionref_ionsharefd; - uint32_t in_operation_param1_ionref_ionsize; - - uint64_t in_operation_param2_tmpref_buffer; - uint32_t in_operation_param2_tmpref_size; - uint64_t in_operation_param2_memref_parent; - uint32_t in_operation_param2_memref_parent_flag; - uint32_t in_operation_param2_memref_size; - uint32_t in_operation_param2_memref_offset; - uint32_t in_operation_param2_value_a; - uint32_t in_operation_param2_value_b; - int32_t in_operation_param2_ionref_ionsharefd; - uint32_t in_operation_param2_ionref_ionsize; - - uint64_t in_operation_param3_tmpref_buffer; - uint32_t in_operation_param3_tmpref_size; - uint64_t in_operation_param3_memref_parent; - uint32_t in_operation_param3_memref_parent_flag; - uint32_t in_operation_param3_memref_size; - uint32_t in_operation_param3_memref_offset; - uint32_t in_operation_param3_value_a; - uint32_t in_operation_param3_value_b; - int32_t in_operation_param3_ionref_ionsharefd; - uint32_t in_operation_param3_ionref_ionsize; - - uint64_t in_operation_param4_tmpref_buffer; - uint32_t in_operation_param4_tmpref_size; - uint64_t in_operation_param4_memref_parent; - uint32_t in_operation_param4_memref_parent_flag; - uint32_t in_operation_param4_memref_size; - uint32_t in_operation_param4_memref_offset; - uint32_t in_operation_param4_value_a; - uint32_t in_operation_param4_value_b; - int32_t in_operation_param4_ionref_ionsharefd; - uint32_t in_operation_param4_ionref_ionsize; - - uint64_t in_operation_session; - int32_t in_operation_cancelflag; - - uint32_t in_returnorigin; - struct retstru_teec_invokecommand rs_invokecommand_ins; - - if (gpp_channel == NULL) - { - std::cout << "libteecc: the grpc client or channel is null, when executing TEEC_InvokeCommand." << std::endl; - return TEEC_ERROR_GRPC_ERROR; - } - - if (session == NULL) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - - if (operation == NULL) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - - in_session_sessionid = session->session_id; - in_session_serviceid_timelow = session->service_id.timeLow; - in_session_serviceid_timemid = session->service_id.timeMid; - in_session_serviceid_timehiandver = session->service_id.timeHiAndVersion; - if ( - session->service_id.clockSeqAndNode != NULL - ) - { - for (int i = 0; i < 8; i++) - { - in_session_serviceid_clockseqandnode[i] = - session->service_id.clockSeqAndNode[i]; - } - } else - { - for (int i = 0; i < 8; i++) - { - in_session_serviceid_clockseqandnode[i] = 0; - } - } - in_session_serviceid_clockseqandnode_size = 8; - in_session_opscnt = session->ops_cnt; - in_session_head_next = (uint64_t) session->head.next; - in_session_head_prev = (uint64_t) session->head.prev; - in_session_context = glob_scontaddr; - - in_commandid = commandID; - - in_operation_started = operation->started; - in_operation_paramtypes = operation->paramTypes; - - in_operation_param1_ionref_ionsharefd = operation->params[0].ionref.ion_share_fd; - in_operation_param1_ionref_ionsize = operation->params[0].ionref.ion_size; - - in_operation_param2_ionref_ionsharefd = operation->params[1].ionref.ion_share_fd; - in_operation_param2_ionref_ionsize = operation->params[1].ionref.ion_size; - - in_operation_param3_ionref_ionsharefd = operation->params[2].ionref.ion_share_fd; - in_operation_param3_ionref_ionsize = operation->params[2].ionref.ion_size; - - in_operation_param4_ionref_ionsharefd = operation->params[3].ionref.ion_share_fd; - in_operation_param4_ionref_ionsize = operation->params[3].ionref.ion_size; - - uint8_t *in_buffer1 = NULL; - uintptr_t in_buffer1_size = 0; - - switch ( - TEEC_PARAM_TYPE_GET(operation->paramTypes, 0) - ) - { - case TEEC_VALUE_INPUT: - case TEEC_VALUE_INOUT: - { - in_operation_param1_value_a = operation->params[0].value.a; - in_operation_param1_value_b = operation->params[0].value.b; - - break; - } - case TEEC_MEMREF_TEMP_INPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if ( - operation->params[0].tmpref.buffer == NULL - ) - { - return TEEC_ERROR_PARAM0_TEMPMEM_NULL; - } - if ( - operation->params[0].tmpref.size <= 0 - ) - { - return TEEC_ERROR_PARAM0_TEMPMEM_LESS; - } - - in_operation_param1_tmpref_buffer = (uint64_t) operation->params[0].tmpref.buffer; - in_operation_param1_tmpref_size = operation->params[0].tmpref.size; - - in_buffer1_size = operation->params[0].tmpref.size; - in_buffer1 = (uint8_t *) malloc(in_buffer1_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer1_size; isize++) - { - in_buffer1[isize] = (uint8_t) * ((uint8_t * )(operation->params[0].tmpref.buffer) + isize); - } - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - { - if ( - operation->params[0].tmpref.buffer == NULL - ) - { - return TEEC_ERROR_PARAM0_TEMPMEM_NULL; - } - if ( - operation->params[0].tmpref.size <= 0 - ) - { - return TEEC_ERROR_PARAM0_TEMPMEM_LESS; - } - - in_operation_param1_tmpref_buffer = (uint64_t) operation->params[0].tmpref.buffer; - in_operation_param1_tmpref_size = operation->params[0].tmpref.size; - - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - switch (operation->params[0].memref.parent->flags) - { - case TEEC_MEM_INPUT: - case TEEC_MEM_INOUT: - { - if ( - operation->params[0].memref.parent->buffer == NULL || - operation->params[0].memref.parent->ops_cnt != 0xfffe - ) - { - return TEEC_ERROR_PARAM0_MEMREF_NULL; - } - if ( - operation->params[0].memref.parent->size <= 0 - ) - { - return TEEC_ERROR_PARAM0_MEMREF_LESS; - } - - in_operation_param1_memref_parent = - (uint64_t) operation->params[0].memref.parent->buffer; - in_operation_param1_memref_parent_flag = - (uint32_t) operation->params[0].memref.parent->flags; - in_operation_param1_memref_size = operation->params[0].memref.size; - - in_buffer1_size = operation->params[0].memref.parent->size; - in_buffer1 = (uint8_t *) malloc(in_buffer1_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer1_size; isize++) - { - in_buffer1[isize] = - (uint8_t) * ((uint8_t * )( - operation->params[0].memref.parent->buffer - ) - + isize - ); - } - - break; - } - - case TEEC_MEM_OUTPUT: - { - if ( - operation->params[0].memref.parent->buffer == NULL || - operation->params[0].memref.parent->ops_cnt != 0xfffe - ) - { - return TEEC_ERROR_PARAM0_MEMREF_NULL; - } - if ( - operation->params[0].memref.parent->size <= 0 - ) - { - return TEEC_ERROR_PARAM0_MEMREF_LESS; - } - - in_operation_param1_memref_parent = - (uint64_t) operation->params[0].memref.parent->buffer; - in_operation_param1_memref_parent_flag = - (uint32_t) operation->params[0].memref.parent->flags; - in_operation_param1_memref_size = operation->params[0].memref.size; - - break; - } - - default: - { - return TEEC_ERROR_NO_SHAREMEMFLAG; - break; - } - - } // end of switch(operation->params[0].memref.parent->flags) - - break; - } - // end of case TEEC_MEMREF_WHOLE - - - case TEEC_MEMREF_PARTIAL_INPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operation->params[0].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM0_MEMREF_NULL; - } - if (operation->params[0].memref.parent->size <= 0) - { - return TEEC_ERROR_PARAM0_MEMREF_LESS; - } - - in_operation_param1_memref_parent = - (uint64_t) operation->params[0].memref.parent->buffer; - in_operation_param1_memref_parent_flag = - (uint32_t) operation->params[0].memref.parent->flags; - in_operation_param1_memref_offset = operation->params[0].memref.offset; - in_operation_param1_memref_size = operation->params[0].memref.size; - - in_buffer1_size = operation->params[0].memref.parent->size; - in_buffer1 = (uint8_t *) malloc(in_buffer1_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer1_size; isize++) - { - in_buffer1[isize] = - (uint8_t) * ((uint8_t * )(operation->params[0].memref.parent->buffer) + isize); - } - - break; - } - // end of case TEEC_MEMREF_PARTIAL_INPUT INOUT - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - { - if (operation->params[0].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM0_MEMREF_NULL; - } - if (operation->params[0].memref.parent->size <= 0) - { - return TEEC_ERROR_PARAM0_MEMREF_LESS; - } - - in_operation_param1_memref_parent = - (uint64_t) operation->params[0].memref.parent->buffer; - in_operation_param1_memref_parent_flag = - (uint32_t) operation->params[0].memref.parent->flags; - in_operation_param1_memref_offset = operation->params[0].memref.offset; - in_operation_param1_memref_size = operation->params[0].memref.size; - - in_buffer1_size = operation->params[0].memref.parent->size; - in_buffer1 = (uint8_t *) malloc(in_buffer1_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer1_size; isize++) - { - in_buffer1[isize] = 0x0; - } - - - break; - } - // end of case TEEC_MEMREF_PARTIAL_OUTPUT - - - default: - break; - } - - - uint8_t *in_buffer2 = NULL; - uintptr_t in_buffer2_size = 0; - switch ( - TEEC_PARAM_TYPE_GET(operation->paramTypes, 1) - ) - { - case TEEC_VALUE_INPUT: - case TEEC_VALUE_INOUT: - { - in_operation_param2_value_a = operation->params[1].value.a; - in_operation_param2_value_b = operation->params[1].value.b; - - break; - } - - case TEEC_MEMREF_TEMP_INPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if ( - operation->params[1].tmpref.buffer == NULL - ) - { - return TEEC_ERROR_PARAM1_TEMPMEM_NULL; - } - if ( - operation->params[1].tmpref.size <= 0 - ) - { - return TEEC_ERROR_PARAM1_TEMPMEM_LESS; - } - - in_operation_param2_tmpref_buffer = (uint64_t) operation->params[1].tmpref.buffer; - in_operation_param2_tmpref_size = operation->params[1].tmpref.size; - - in_buffer2_size = operation->params[1].tmpref.size; - in_buffer2 = (uint8_t *) malloc(in_buffer2_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer2_size; isize++) - { - in_buffer2[isize] = (uint8_t) * ((uint8_t * )(operation->params[1].tmpref.buffer) + isize); - } - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - { - if ( - operation->params[1].tmpref.buffer == NULL - ) - { - return TEEC_ERROR_PARAM1_TEMPMEM_NULL; - } - if ( - operation->params[1].tmpref.size <= 0 - ) - { - return TEEC_ERROR_PARAM1_TEMPMEM_LESS; - } - - in_operation_param2_tmpref_buffer = (uint64_t) operation->params[1].tmpref.buffer; - in_operation_param2_tmpref_size = operation->params[1].tmpref.size; - - break; - } - - case TEEC_MEMREF_WHOLE: - { - switch (operation->params[1].memref.parent->flags) - { - case TEEC_MEM_INPUT: - case TEEC_MEM_INOUT: - { - if ( - operation->params[1].memref.parent->buffer == NULL - ) - { - return TEEC_ERROR_PARAM1_MEMREF_NULL; - } - if ( - operation->params[1].memref.parent->size <= 0 - ) - { - return TEEC_ERROR_PARAM1_MEMREF_LESS; - } - - in_operation_param2_memref_parent = - (uint64_t) operation->params[1].memref.parent->buffer; - in_operation_param2_memref_parent_flag = - (uint32_t) operation->params[1].memref.parent->flags; - in_operation_param2_memref_size = operation->params[1].memref.size; - - in_buffer2_size = operation->params[1].memref.parent->size; - in_buffer2 = (uint8_t *) malloc(in_buffer2_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer2_size; isize++) - { - in_buffer2[isize] = - (uint8_t) * ((uint8_t * )( - operation->params[1].memref.parent->buffer - ) - + isize - ); - } - - break; - } - - case TEEC_MEM_OUTPUT: - { - if ( - operation->params[1].memref.parent->buffer == NULL - ) - { - return TEEC_ERROR_PARAM1_MEMREF_NULL; - } - if ( - operation->params[1].memref.parent->size <= 0 - ) - { - return TEEC_ERROR_PARAM1_MEMREF_LESS; - } - - in_operation_param2_memref_parent = - (uint64_t) operation->params[1].memref.parent->buffer; - in_operation_param2_memref_parent_flag = - (uint32_t) operation->params[1].memref.parent->flags; - in_operation_param2_memref_size = operation->params[1].memref.size; - - break; - } - - default: - { - return TEEC_ERROR_NO_SHAREMEMFLAG; - break; - } - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_INPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operation->params[1].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM0_MEMREF_NULL; - } - if (operation->params[1].memref.parent->size <= 0) - { - return TEEC_ERROR_PARAM0_MEMREF_LESS; - } - - in_operation_param2_memref_parent = - (uint64_t) operation->params[1].memref.parent->buffer; - in_operation_param2_memref_parent_flag = - (uint32_t) operation->params[1].memref.parent->flags; - in_operation_param2_memref_offset = operation->params[1].memref.offset; - in_operation_param2_memref_size = operation->params[1].memref.size; - - in_buffer2_size = operation->params[1].memref.parent->size; - in_buffer2 = (uint8_t *) malloc(in_buffer2_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer2_size; isize++) - { - in_buffer2[isize] = - (uint8_t) * ((uint8_t * )(operation->params[1].memref.parent->buffer) + isize); - } - - break; - } - // end of case TEEC_MEMREF_PARTIAL_INPUT INOUT - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - { - if (operation->params[1].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM1_MEMREF_NULL; - } - if (operation->params[1].memref.parent->size <= 0) - { - return TEEC_ERROR_PARAM1_MEMREF_LESS; - } - - in_operation_param2_memref_parent = - (uint64_t) operation->params[1].memref.parent->buffer; - in_operation_param2_memref_parent_flag = - (uint32_t) operation->params[1].memref.parent->flags; - in_operation_param2_memref_offset = operation->params[1].memref.offset; - in_operation_param2_memref_size = operation->params[1].memref.size; - - in_buffer2_size = operation->params[1].memref.parent->size; - in_buffer2 = (uint8_t *) malloc(in_buffer2_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer2_size; isize++) - { - in_buffer2[isize] = 0x0; - } - - break; - } - // end of case TEEC_MEMREF_PARTIAL_OUTPUT - - - default: - break; - } - - uint8_t *in_buffer3 = NULL; - uintptr_t in_buffer3_size = 0; - switch ( - TEEC_PARAM_TYPE_GET(operation->paramTypes, 2) - ) - { - case TEEC_VALUE_INPUT: - case TEEC_VALUE_INOUT: - { - in_operation_param3_value_a = operation->params[2].value.a; - in_operation_param3_value_b = operation->params[2].value.b; - - break; - } - - case TEEC_MEMREF_TEMP_INPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if ( - operation->params[2].tmpref.buffer == NULL - ) - { - return TEEC_ERROR_PARAM2_TEMPMEM_NULL; - } - if ( - operation->params[2].tmpref.size <= 0 - ) - { - return TEEC_ERROR_PARAM2_TEMPMEM_LESS; - } - - in_operation_param3_tmpref_buffer = (uint64_t) operation->params[2].tmpref.buffer; - in_operation_param3_tmpref_size = operation->params[2].tmpref.size; - - in_buffer3_size = operation->params[2].tmpref.size; - in_buffer3 = (uint8_t *) malloc(in_buffer3_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer3_size; isize++) - { - in_buffer3[isize] = (uint8_t) * ((uint8_t * )(operation->params[2].tmpref.buffer) + isize); - } - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - { - if ( - operation->params[2].tmpref.buffer == NULL - ) - { - return TEEC_ERROR_PARAM2_TEMPMEM_NULL; - } - if ( - operation->params[2].tmpref.size <= 0 - ) - { - return TEEC_ERROR_PARAM2_TEMPMEM_LESS; - } - - in_operation_param3_tmpref_buffer = (uint64_t) operation->params[2].tmpref.buffer; - in_operation_param3_tmpref_size = operation->params[2].tmpref.size; - - break; - } - - case TEEC_MEMREF_WHOLE: - { - switch (operation->params[2].memref.parent->flags) - { - case TEEC_MEM_INPUT: - case TEEC_MEM_INOUT: - { - if ( - operation->params[2].memref.parent->buffer == NULL - ) - { - return TEEC_ERROR_PARAM2_MEMREF_NULL; - } - if ( - operation->params[2].memref.parent->size <= 0 - ) - { - return TEEC_ERROR_PARAM2_MEMREF_LESS; - } - - in_operation_param3_memref_parent = - (uint64_t) operation->params[2].memref.parent->buffer; - in_operation_param3_memref_parent_flag = - (uint32_t) operation->params[2].memref.parent->flags; - in_operation_param3_memref_size = operation->params[2].memref.size; - - in_buffer3_size = operation->params[2].memref.parent->size; - in_buffer3 = (uint8_t *) malloc(in_buffer3_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer3_size; isize++) - { - in_buffer3[isize] = - (uint8_t) * ((uint8_t * )( - operation->params[2].memref.parent->buffer - ) - + isize - ); - } - - break; - } - - case TEEC_MEM_OUTPUT: - { - if ( - operation->params[2].memref.parent->buffer == NULL - ) - { - return TEEC_ERROR_PARAM2_MEMREF_NULL; - } - if ( - operation->params[2].memref.parent->size <= 0 - ) - { - return TEEC_ERROR_PARAM2_MEMREF_LESS; - } - - in_operation_param3_memref_parent = - (uint64_t) operation->params[2].memref.parent->buffer; - in_operation_param3_memref_parent_flag = - (uint32_t) operation->params[2].memref.parent->flags; - in_operation_param3_memref_size = operation->params[2].memref.size; - - break; - } - - default: - { - return TEEC_ERROR_NO_SHAREMEMFLAG; - break; - } - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_INPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operation->params[2].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM2_MEMREF_NULL; - } - if (operation->params[2].memref.parent->size <= 0) - { - return TEEC_ERROR_PARAM2_MEMREF_LESS; - } - - in_operation_param3_memref_parent = - (uint64_t) operation->params[2].memref.parent->buffer; - in_operation_param3_memref_parent_flag = - (uint32_t) operation->params[2].memref.parent->flags; - in_operation_param3_memref_offset = operation->params[2].memref.offset; - in_operation_param3_memref_size = operation->params[2].memref.size; - - in_buffer3_size = operation->params[2].memref.parent->size; - in_buffer3 = (uint8_t *) malloc(in_buffer3_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer3_size; isize++) - { - in_buffer3[isize] = - (uint8_t) * ((uint8_t * )(operation->params[2].memref.parent->buffer) + isize); - } - - break; - } - // end of case TEEC_MEMREF_PARTIAL_INPUT INOUT - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - { - if (operation->params[2].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM0_MEMREF_NULL; - } - if (operation->params[2].memref.parent->size <= 0) - { - return TEEC_ERROR_PARAM0_MEMREF_LESS; - } - - in_operation_param3_memref_parent = - (uint64_t) operation->params[2].memref.parent->buffer; - in_operation_param3_memref_parent_flag = - (uint32_t) operation->params[2].memref.parent->flags; - in_operation_param3_memref_offset = operation->params[2].memref.offset; - in_operation_param3_memref_size = operation->params[2].memref.size; - - in_buffer3_size = operation->params[2].memref.parent->size; - in_buffer3 = (uint8_t *) malloc(in_buffer3_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer3_size; isize++) - { - in_buffer3[isize] = 0x0; - } - - break; - } - // end of case TEEC_MEMREF_PARTIAL_OUTPUT - - default: - break; - } - - - uint8_t *in_buffer4 = NULL; - uintptr_t in_buffer4_size = 0; - switch ( - TEEC_PARAM_TYPE_GET(operation->paramTypes, 3) - ) - { - case TEEC_VALUE_INPUT: - case TEEC_VALUE_INOUT: - { - in_operation_param4_value_a = operation->params[3].value.a; - in_operation_param4_value_b = operation->params[3].value.b; - - break; - } - - case TEEC_MEMREF_TEMP_INPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if ( - operation->params[3].tmpref.buffer == NULL - ) - { - return TEEC_ERROR_PARAM3_TEMPMEM_NULL; - } - if ( - operation->params[3].tmpref.size <= 0 - ) - { - return TEEC_ERROR_PARAM3_TEMPMEM_LESS; - } - - in_operation_param4_tmpref_buffer = (uint64_t) operation->params[3].tmpref.buffer; - in_operation_param4_tmpref_size = operation->params[3].tmpref.size; - - in_buffer4_size = operation->params[3].tmpref.size; - in_buffer4 = (uint8_t *) malloc(in_buffer4_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer4_size; isize++) - { - in_buffer4[isize] = (uint8_t) * ((uint8_t * )(operation->params[3].tmpref.buffer) + isize); - } - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - { - if ( - operation->params[3].tmpref.buffer == NULL - ) - { - return TEEC_ERROR_PARAM3_TEMPMEM_NULL; - } - if ( - operation->params[3].tmpref.size <= 0 - ) - { - return TEEC_ERROR_PARAM3_TEMPMEM_LESS; - } - - in_operation_param4_tmpref_buffer = (uint64_t) operation->params[3].tmpref.buffer; - in_operation_param4_tmpref_size = operation->params[3].tmpref.size; - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - switch (operation->params[3].memref.parent->flags) - { - case TEEC_MEM_INPUT: - case TEEC_MEM_INOUT: - { - if ( - operation->params[3].memref.parent->buffer == NULL - ) - { - return TEEC_ERROR_PARAM3_MEMREF_NULL; - } - if ( - operation->params[3].memref.parent->size <= 0 - ) - { - return TEEC_ERROR_PARAM3_MEMREF_LESS; - } - - in_operation_param4_memref_parent = - (uint64_t) operation->params[3].memref.parent->buffer; - in_operation_param4_memref_parent_flag = - (uint32_t) operation->params[3].memref.parent->flags; - in_operation_param4_memref_size = operation->params[3].memref.size; - - in_buffer4_size = operation->params[3].memref.parent->size; - in_buffer4 = (uint8_t *) malloc(in_buffer4_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer4_size; isize++) - { - in_buffer4[isize] = - (uint8_t) * ((uint8_t * )( - operation->params[3].memref.parent->buffer - ) - + isize - ); - } - - break; - } - - case TEEC_MEM_OUTPUT: - { - if ( - operation->params[3].memref.parent->buffer == NULL - ) - { - return TEEC_ERROR_PARAM3_MEMREF_NULL; - } - if ( - operation->params[3].memref.parent->size <= 0 - ) - { - return TEEC_ERROR_PARAM3_MEMREF_LESS; - } - - in_operation_param4_memref_parent = - (uint64_t) operation->params[3].memref.parent->buffer; - in_operation_param4_memref_parent_flag = - (uint32_t) operation->params[3].memref.parent->flags; - in_operation_param4_memref_size = operation->params[3].memref.size; - - break; - } - - default: - { - return TEEC_ERROR_NO_SHAREMEMFLAG; - break; - } - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_INPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operation->params[3].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM3_MEMREF_NULL; - } - if (operation->params[3].memref.parent->size <= 0) - { - return TEEC_ERROR_PARAM3_MEMREF_LESS; - } - - in_operation_param4_memref_parent = - (uint64_t) operation->params[3].memref.parent->buffer; - in_operation_param4_memref_parent_flag = - (uint32_t) operation->params[3].memref.parent->flags; - in_operation_param4_memref_offset = operation->params[3].memref.offset; - in_operation_param4_memref_size = operation->params[3].memref.size; - - in_buffer4_size = operation->params[3].memref.parent->size; - in_buffer4 = (uint8_t *) malloc(in_buffer4_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer4_size; isize++) - { - in_buffer4[isize] = - (uint8_t) * ((uint8_t * )(operation->params[3].memref.parent->buffer) + isize); - } - - break; - } - // end of case TEEC_MEMREF_PARTIAL_INPUT INOUT - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - { - if (operation->params[3].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM0_MEMREF_NULL; - } - if (operation->params[3].memref.parent->size <= 0) - { - return TEEC_ERROR_PARAM0_MEMREF_LESS; - } - - in_operation_param4_memref_parent = - (uint64_t) operation->params[3].memref.parent->buffer; - in_operation_param4_memref_parent_flag = - (uint32_t) operation->params[3].memref.parent->flags; - in_operation_param4_memref_offset = operation->params[3].memref.offset; - in_operation_param4_memref_size = operation->params[3].memref.size; - - in_buffer4_size = operation->params[3].memref.parent->size; - in_buffer4 = (uint8_t *) malloc(in_buffer4_size * sizeof(uint8_t)); - for (int isize = 0; isize < in_buffer4_size; isize++) - { - in_buffer4[isize] = 0x0; - } - - break; - } - // end of case TEEC_MEMREF_PARTIAL_OUTPUT - - - default: - break; - } - - - in_operation_session = (uint64_t) operation->session; - in_operation_cancelflag = operation->cancel_flag; - - if (returnOrigin == NULL) - { - in_returnorigin = 0; - } else - { - in_returnorigin = *returnOrigin; - } - - rs_invokecommand_ins = - client->externc_teec_invokecommand( - in_session_sessionid, - in_session_serviceid_timelow, - in_session_serviceid_timemid, - in_session_serviceid_timehiandver, - in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_size, - in_session_opscnt, - in_session_head_next, - in_session_head_prev, - in_session_context, - - in_commandid, - - in_operation_started, - in_operation_paramtypes, - - in_operation_param1_tmpref_buffer, - in_operation_param1_tmpref_size, - in_operation_param1_memref_parent, - in_operation_param1_memref_parent_flag, - in_operation_param1_memref_size, - in_operation_param1_memref_offset, - in_operation_param1_value_a, - in_operation_param1_value_b, - in_operation_param1_ionref_ionsharefd, - in_operation_param1_ionref_ionsize, - - in_operation_param2_tmpref_buffer, - in_operation_param2_tmpref_size, - in_operation_param2_memref_parent, - in_operation_param2_memref_parent_flag, - in_operation_param2_memref_size, - in_operation_param2_memref_offset, - in_operation_param2_value_a, - in_operation_param2_value_b, - in_operation_param2_ionref_ionsharefd, - in_operation_param2_ionref_ionsize, - - in_operation_param3_tmpref_buffer, - in_operation_param3_tmpref_size, - in_operation_param3_memref_parent, - in_operation_param3_memref_parent_flag, - in_operation_param3_memref_size, - in_operation_param3_memref_offset, - in_operation_param3_value_a, - in_operation_param3_value_b, - in_operation_param3_ionref_ionsharefd, - in_operation_param3_ionref_ionsize, - - in_operation_param4_tmpref_buffer, - in_operation_param4_tmpref_size, - in_operation_param4_memref_parent, - in_operation_param4_memref_parent_flag, - in_operation_param4_memref_size, - in_operation_param4_memref_offset, - in_operation_param4_value_a, - in_operation_param4_value_b, - in_operation_param4_ionref_ionsharefd, - in_operation_param4_ionref_ionsize, - - in_operation_session, - in_operation_cancelflag, - - in_returnorigin, - - in_buffer1, - in_buffer1_size, - in_buffer2, - in_buffer2_size, - in_buffer3, - in_buffer3_size, - in_buffer4, - in_buffer4_size - ); - if (rs_invokecommand_ins.flag == 1) - { - std::cout << "libteecc: invoke token null" << std::endl; - return TEEC_ERROR_TOKEN_NULL; - } - if (rs_invokecommand_ins.flag == 2) - { - std::cout << "libteecc: invoke jwt validate error" << std::endl; - return TEEC_ERROR_JWTVALIDATE_FAIL; - } - if (rs_invokecommand_ins.teecresult == TEEC_SUCCESS) - { - session->session_id = rs_invokecommand_ins.session_sessionid; - session->service_id.timeLow = rs_invokecommand_ins.session_serviceid_timelow; - session->service_id.timeMid = rs_invokecommand_ins.session_serviceid_timemid; - session->service_id.timeHiAndVersion = rs_invokecommand_ins.session_serviceid_timehiandver; - if (rs_invokecommand_ins.session_serviceid_clockseqandnode_outsize <= 8 && - rs_invokecommand_ins.session_serviceid_clockseqandnode_outsize > 0 && - rs_invokecommand_ins.session_serviceid_clockseqandnode != NULL && - session->service_id.clockSeqAndNode != NULL - ) - { - for (int i = 0; i < rs_invokecommand_ins.session_serviceid_clockseqandnode_outsize; i++) - { - session->service_id.clockSeqAndNode[i] = - (uint8_t)(rs_invokecommand_ins.session_serviceid_clockseqandnode[i] & 0x000000ff); - } - } else - { - for (int i = 0; i < 8; i++) - { - session->service_id.clockSeqAndNode[i] = 0; - } - } - session->ops_cnt = rs_invokecommand_ins.session_opscnt; - session->head.next = (struct ListNode *) rs_invokecommand_ins.session_head_next; - session->head.prev = (struct ListNode *) rs_invokecommand_ins.session_head_prev; - session->context = (TEEC_Context *) rs_invokecommand_ins.session_context; - - operation->started = rs_invokecommand_ins.operation_started; - operation->paramTypes = rs_invokecommand_ins.operation_paramtypes; - - switch ( - TEEC_PARAM_TYPE_GET(rs_invokecommand_ins.operation_paramtypes, 0) - ) - { - case TEEC_VALUE_OUTPUT: - case TEEC_VALUE_INOUT: - { - operation->params[0].value.a = rs_invokecommand_ins.operation_param1_value_a; - operation->params[0].value.b = rs_invokecommand_ins.operation_param1_value_b; - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if (operation->params[0].tmpref.buffer == NULL) - { - return TEEC_ERROR_PARAM0_TEMPMEM_NULL; - } - - if (operation->params[0].tmpref.size < - rs_invokecommand_ins.buffer1_outsize - ) - { - return TEEC_ERROR_PARAM0_TEMPMEM_LESS; - } - - if (rs_invokecommand_ins.buffer1 != NULL && - rs_invokecommand_ins.buffer1_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer1_outsize; iind++) - { - *((uint8_t * )(operation->params[0].tmpref.buffer) + iind) = - *(rs_invokecommand_ins.buffer1 + iind); - } - operation->params[0].tmpref.size = rs_invokecommand_ins.buffer1_outsize; - } - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - operation->params[0].memref.parent->flags = - rs_invokecommand_ins.operation_param1_memref_parent_flag; - switch (operation->params[0].memref.parent->flags) - { - case TEEC_MEM_OUTPUT: - case TEEC_MEM_INOUT: - { - if ( - operation->params[0].memref.parent->buffer == NULL - ) - { - return TEEC_ERROR_PARAM0_MEMREF_NULL; - } - if ( - operation->params[0].memref.parent->size < - rs_invokecommand_ins.buffer1_outsize - ) - { - return TEEC_ERROR_PARAM0_MEMREF_LESS; - } - - if (rs_invokecommand_ins.buffer1 != NULL && - rs_invokecommand_ins.buffer1_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer1_outsize; iind++) - { - *((uint8_t * )(operation->params[0].memref.parent->buffer) + iind) = - *(rs_invokecommand_ins.buffer1 + iind); - } - operation->params[0].memref.size = rs_invokecommand_ins.buffer1_outsize; - operation->params[0].memref.parent->size = rs_invokecommand_ins.buffer1_outsize; - } - - break; - } - - default: - break; - } - - break; - - } - // end of case TEEC_MEMREF_WHOLE: - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operation->params[0].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM0_MEMREF_NULL; - } - if (operation->params[0].memref.parent->size < - rs_invokecommand_ins.buffer1_outsize - ) - { - return TEEC_ERROR_PARAM0_MEMREF_LESS; - } - - if (rs_invokecommand_ins.buffer1 != NULL && - rs_invokecommand_ins.buffer1_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer1_outsize; iind++) - { - *((uint8_t * )(operation->params[0].memref.parent->buffer) + iind) = - *(rs_invokecommand_ins.buffer1 + iind); - } - operation->params[0].memref.parent->size = rs_invokecommand_ins.buffer1_outsize; - - operation->params[0].memref.offset = rs_invokecommand_ins.operation_param1_memref_offset; - operation->params[0].memref.size = rs_invokecommand_ins.operation_param1_memref_size; - } - - break; - } - // end of case TEEC_MEMREF_PARTIAL_OUTPUT, INOUT - - - default: - break; - } - - operation->params[0].ionref.ion_share_fd = rs_invokecommand_ins.operation_param1_ionref_ionsharefd; - operation->params[0].ionref.ion_size = rs_invokecommand_ins.operation_param1_ionref_ionsize; - - - switch ( - TEEC_PARAM_TYPE_GET(rs_invokecommand_ins.operation_paramtypes, 1) - ) - { - case TEEC_VALUE_OUTPUT: - case TEEC_VALUE_INOUT: - { - operation->params[1].value.a = rs_invokecommand_ins.operation_param2_value_a; - operation->params[1].value.b = rs_invokecommand_ins.operation_param2_value_b; - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if (operation->params[1].tmpref.buffer == NULL) - { - return TEEC_ERROR_PARAM0_TEMPMEM_NULL; - } - - if (operation->params[1].tmpref.size < - rs_invokecommand_ins.buffer2_outsize - ) - { - return TEEC_ERROR_PARAM0_TEMPMEM_LESS; - } - - if (rs_invokecommand_ins.buffer2 != NULL && - rs_invokecommand_ins.buffer2_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer2_outsize; iind++) - { - *((uint8_t * )(operation->params[1].tmpref.buffer) + iind) = - *(rs_invokecommand_ins.buffer2 + iind); - } - operation->params[1].tmpref.size = rs_invokecommand_ins.buffer2_outsize; - } - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - operation->params[1].memref.parent->flags = - rs_invokecommand_ins.operation_param2_memref_parent_flag; - switch (operation->params[1].memref.parent->flags) - { - case TEEC_MEM_OUTPUT: - case TEEC_MEM_INOUT: - { - if ( - operation->params[1].memref.parent->buffer == NULL - ) - { - return TEEC_ERROR_PARAM1_MEMREF_NULL; - } - if ( - operation->params[1].memref.parent->size < - rs_invokecommand_ins.buffer2_outsize - ) - { - return TEEC_ERROR_PARAM1_MEMREF_LESS; - } - - if (rs_invokecommand_ins.buffer2 != NULL && - rs_invokecommand_ins.buffer2_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer2_outsize; iind++) - { - *((uint8_t * )(operation->params[1].memref.parent->buffer) + iind) = - *(rs_invokecommand_ins.buffer2 + iind); - } - operation->params[1].memref.size = rs_invokecommand_ins.buffer2_outsize; - operation->params[1].memref.parent->size = rs_invokecommand_ins.buffer2_outsize; - } - - break; - } - - default: - break; - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operation->params[1].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM1_MEMREF_NULL; - } - if (operation->params[1].memref.parent->size < - rs_invokecommand_ins.buffer2_outsize - ) - { - return TEEC_ERROR_PARAM1_MEMREF_LESS; - } - - if (rs_invokecommand_ins.buffer2 != NULL && - rs_invokecommand_ins.buffer2_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer2_outsize; iind++) - { - *((uint8_t * )(operation->params[1].memref.parent->buffer) + iind) = - *(rs_invokecommand_ins.buffer2 + iind); - } - operation->params[1].memref.parent->size = rs_invokecommand_ins.buffer2_outsize; - - operation->params[1].memref.offset = rs_invokecommand_ins.operation_param2_memref_offset; - operation->params[1].memref.size = rs_invokecommand_ins.operation_param2_memref_size; - } - - break; - } - // end of case TEEC_MEMREF_PARTIAL_OUTPUT, INOUT - - - default: - break; - } - - operation->params[1].ionref.ion_share_fd = rs_invokecommand_ins.operation_param2_ionref_ionsharefd; - operation->params[1].ionref.ion_size = rs_invokecommand_ins.operation_param2_ionref_ionsize; - - - switch ( - TEEC_PARAM_TYPE_GET(rs_invokecommand_ins.operation_paramtypes, 2) - ) - { - case TEEC_VALUE_OUTPUT: - case TEEC_VALUE_INOUT: - { - operation->params[2].value.a = rs_invokecommand_ins.operation_param3_value_a; - operation->params[2].value.b = rs_invokecommand_ins.operation_param3_value_b; - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if (operation->params[2].tmpref.buffer == NULL) - { - return TEEC_ERROR_PARAM0_TEMPMEM_NULL; - } - - if (operation->params[2].tmpref.size < - rs_invokecommand_ins.buffer3_outsize - ) - { - return TEEC_ERROR_PARAM0_TEMPMEM_LESS; - } - - if (rs_invokecommand_ins.buffer3 != NULL && - rs_invokecommand_ins.buffer3_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer3_outsize; iind++) - { - *((uint8_t * )(operation->params[2].tmpref.buffer) + iind) = - *(rs_invokecommand_ins.buffer3 + iind); - } - operation->params[2].tmpref.size = rs_invokecommand_ins.buffer3_outsize; - } - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - operation->params[2].memref.parent->flags = - rs_invokecommand_ins.operation_param3_memref_parent_flag; - switch (operation->params[2].memref.parent->flags) - { - case TEEC_MEM_OUTPUT: - case TEEC_MEM_INOUT: - { - if ( - operation->params[2].memref.parent->buffer == NULL - ) - { - return TEEC_ERROR_PARAM2_MEMREF_NULL; - } - if ( - operation->params[2].memref.parent->size < - rs_invokecommand_ins.buffer3_outsize - ) - { - return TEEC_ERROR_PARAM2_MEMREF_LESS; - } - - if (rs_invokecommand_ins.buffer3 != NULL && - rs_invokecommand_ins.buffer3_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer3_outsize; iind++) - { - *((uint8_t * )(operation->params[2].memref.parent->buffer) + iind) = - *(rs_invokecommand_ins.buffer3 + iind); - } - operation->params[2].memref.size = rs_invokecommand_ins.buffer3_outsize; - operation->params[2].memref.parent->size = rs_invokecommand_ins.buffer3_outsize; - } - - break; - } - - default: - break; - } - - break; - - } - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operation->params[2].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM2_MEMREF_NULL; - } - if (operation->params[2].memref.parent->size < - rs_invokecommand_ins.buffer3_outsize - ) - { - return TEEC_ERROR_PARAM2_MEMREF_LESS; - } - - if (rs_invokecommand_ins.buffer3 != NULL && - rs_invokecommand_ins.buffer3_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer3_outsize; iind++) - { - *((uint8_t * )(operation->params[2].memref.parent->buffer) + iind) = - *(rs_invokecommand_ins.buffer3 + iind); - } - operation->params[2].memref.parent->size = rs_invokecommand_ins.buffer3_outsize; - - operation->params[2].memref.offset = rs_invokecommand_ins.operation_param3_memref_offset; - operation->params[2].memref.size = rs_invokecommand_ins.operation_param3_memref_size; - } - - break; - } - // end of case TEEC_MEMREF_PARTIAL_OUTPUT, INOUT - - - default: - break; - } - - operation->params[2].ionref.ion_share_fd = rs_invokecommand_ins.operation_param3_ionref_ionsharefd; - operation->params[2].ionref.ion_size = rs_invokecommand_ins.operation_param3_ionref_ionsize; - - - switch ( - TEEC_PARAM_TYPE_GET(rs_invokecommand_ins.operation_paramtypes, 3) - ) - { - case TEEC_VALUE_OUTPUT: - case TEEC_VALUE_INOUT: - { - operation->params[3].value.a = rs_invokecommand_ins.operation_param4_value_a; - operation->params[3].value.b = rs_invokecommand_ins.operation_param4_value_b; - - break; - } - - case TEEC_MEMREF_TEMP_OUTPUT: - case TEEC_MEMREF_TEMP_INOUT: - { - if (operation->params[3].tmpref.buffer == NULL) - { - return TEEC_ERROR_PARAM0_TEMPMEM_NULL; - } - - if (operation->params[3].tmpref.size < - rs_invokecommand_ins.buffer4_outsize - ) - { - return TEEC_ERROR_PARAM0_TEMPMEM_LESS; - } - - if (rs_invokecommand_ins.buffer4 != NULL && - rs_invokecommand_ins.buffer4_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer4_outsize; iind++) - { - *((uint8_t * )(operation->params[3].tmpref.buffer) + iind) = - *(rs_invokecommand_ins.buffer4 + iind); - } - operation->params[3].tmpref.size = rs_invokecommand_ins.buffer4_outsize; - } - - break; - } - - - case TEEC_MEMREF_WHOLE: - { - operation->params[3].memref.parent->flags = - rs_invokecommand_ins.operation_param4_memref_parent_flag; - switch (operation->params[3].memref.parent->flags) - { - case TEEC_MEM_OUTPUT: - case TEEC_MEM_INOUT: - { - if ( - operation->params[3].memref.parent->buffer == NULL - ) - { - return TEEC_ERROR_PARAM3_MEMREF_NULL; - } - if ( - operation->params[3].memref.parent->size < - rs_invokecommand_ins.buffer4_outsize - ) - { - return TEEC_ERROR_PARAM3_MEMREF_LESS; - } - - if (rs_invokecommand_ins.buffer4 != NULL && - rs_invokecommand_ins.buffer4_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer4_outsize; iind++) - { - *((uint8_t * )(operation->params[3].memref.parent->buffer) + iind) = - *(rs_invokecommand_ins.buffer4 + iind); - } - operation->params[3].memref.size = rs_invokecommand_ins.buffer3_outsize; - operation->params[3].memref.parent->size = rs_invokecommand_ins.buffer3_outsize; - } - - break; - } - - default: - break; - } - - break; - } - - - case TEEC_MEMREF_PARTIAL_OUTPUT: - case TEEC_MEMREF_PARTIAL_INOUT: - { - if (operation->params[3].memref.parent->buffer == NULL) - { - return TEEC_ERROR_PARAM3_MEMREF_NULL; - } - if (operation->params[3].memref.parent->size < - rs_invokecommand_ins.buffer4_outsize - ) - { - return TEEC_ERROR_PARAM3_MEMREF_LESS; - } - - if (rs_invokecommand_ins.buffer4 != NULL && - rs_invokecommand_ins.buffer4_outsize > 0) - { - for (int iind = 0; iind < rs_invokecommand_ins.buffer4_outsize; iind++) - { - *((uint8_t * )(operation->params[3].memref.parent->buffer) + iind) = - *(rs_invokecommand_ins.buffer4 + iind); - } - operation->params[3].memref.parent->size = rs_invokecommand_ins.buffer4_outsize; - - operation->params[3].memref.offset = rs_invokecommand_ins.operation_param4_memref_offset; - operation->params[3].memref.size = rs_invokecommand_ins.operation_param4_memref_size; - } - - break; - } - // end of case TEEC_MEMREF_PARTIAL_OUTPUT, INOUT - - - default: - break; - } - - operation->params[3].ionref.ion_share_fd = rs_invokecommand_ins.operation_param4_ionref_ionsharefd; - operation->params[3].ionref.ion_size = rs_invokecommand_ins.operation_param4_ionref_ionsize; - - - operation->session = (TEEC_Session *) rs_invokecommand_ins.operation_session; - operation->cancel_flag = rs_invokecommand_ins.operation_cancelflag; - - if (returnOrigin != NULL) - { - *returnOrigin = in_returnorigin; - } - } - return static_cast(rs_invokecommand_ins.teecresult); - -} - -void -TEEC_CloseSession(TEEC_Session *session) -{ - if (gpp_channel == NULL) - { - printf("libteec: the grpc client or channel is null, when executing TEEC_CloseSession. \n"); - return; - } - - uint32_t in_session_sessionid; - uint32_t in_session_serviceid_timelow; - uint32_t in_session_serviceid_timemid; - uint32_t in_session_serviceid_timehiandver; - uint8_t in_session_serviceid_clockseqandnode[8]; - uintptr_t in_session_serviceid_clockseqandnode_size; - uint32_t in_session_opscnt; - uint64_t in_session_head_next; - int64_t in_session_head_prev; - uint64_t in_session_context; - - if (session == NULL) - { - return; - } - struct retstru_teec_closesession rs_closesession_ins; - - in_session_sessionid = session->session_id; - in_session_serviceid_timelow = session->service_id.timeLow; - in_session_serviceid_timemid = session->service_id.timeMid; - in_session_serviceid_timehiandver = session->service_id.timeHiAndVersion; - if ( - session->service_id.clockSeqAndNode != NULL - ) - { - for (int i = 0; i < 8; i++) - { - in_session_serviceid_clockseqandnode[i] = - session->service_id.clockSeqAndNode[i]; - } - } else - { - for (int i = 0; i < 8; i++) - { - in_session_serviceid_clockseqandnode[i] = 0; - } - } - in_session_serviceid_clockseqandnode_size = 8; - in_session_opscnt = session->ops_cnt; - in_session_head_next = (uint64_t) session->head.next; - in_session_head_prev = (uint64_t) session->head.prev; - in_session_context = glob_scontaddr; - - rs_closesession_ins = - client->externc_teec_closesession( - in_session_sessionid, - in_session_serviceid_timelow, - in_session_serviceid_timemid, - in_session_serviceid_timehiandver, - in_session_serviceid_clockseqandnode, - in_session_serviceid_clockseqandnode_size, - in_session_opscnt, - in_session_head_next, - in_session_head_prev, - in_session_context - ); - - if (rs_closesession_ins.flag == 1) - { - std::cout << "libteecc: closesession token null" << std::endl; - return; - } - if (rs_closesession_ins.flag == 2) - { - std::cout << "libteecc: closesession jwt validate error" << std::endl; - return; - } -#if 0 - std::cout << "externc_teec_closesession: " << std::endl; - std::cout << "gpp request sessionid: " << in_session_sessionid < 0 - && - rs_closesession_ins.session_serviceid_clockseqandnode != NULL - ) - { - printf("ret session_serviceid_clockseqandnode = \n"); - for (uintptr_t uisize = 0; - uisize < rs_closesession_ins.session_serviceid_clockseqandnode_outsize; - uisize ++) - { - printf(" %2.2x", *(rs_closesession_ins.session_serviceid_clockseqandnode + uisize)); - } - printf("\n"); - } - else - { - printf("ret clockseqandnode addr = 0x %16.16lx\n", - (unsigned long)rs_closesession_ins.session_serviceid_clockseqandnode); - } - printf("ret clockseqandnode_outsize = %ld\n", - rs_closesession_ins.session_serviceid_clockseqandnode_outsize); - printf("ret session_opscnt = 0x %8.8x\n", - rs_closesession_ins.session_opscnt); - printf("ret session_head_next = 0x %16.16lx\n", - rs_closesession_ins.session_head_next); - printf("ret session_head_prev = 0x %16.16lx\n", - rs_closesession_ins.session_head_prev); -#endif - session->session_id = rs_closesession_ins.session_sessionid; - session->service_id.timeLow = rs_closesession_ins.session_serviceid_timelow; - session->service_id.timeMid = rs_closesession_ins.session_serviceid_timemid; - session->service_id.timeHiAndVersion = rs_closesession_ins.session_serviceid_timehiandver; - if (rs_closesession_ins.session_serviceid_clockseqandnode_outsize <= 8 && - rs_closesession_ins.session_serviceid_clockseqandnode_outsize > 0 && - rs_closesession_ins.session_serviceid_clockseqandnode != NULL && - session->service_id.clockSeqAndNode != NULL - ) - { - for (int i = 0; i < rs_closesession_ins.session_serviceid_clockseqandnode_outsize; i++) - { - session->service_id.clockSeqAndNode[i] = - (uint8_t)(rs_closesession_ins.session_serviceid_clockseqandnode[i] & 0x000000ff); - } - } else - { - for (int i = 0; i < 8; i++) - { - session->service_id.clockSeqAndNode[i] = 0; - } - } - session->ops_cnt = rs_closesession_ins.session_opscnt; - session->head.next = (struct ListNode *) rs_closesession_ins.session_head_next; - session->head.prev = (struct ListNode *) rs_closesession_ins.session_head_prev; - session->context = (TEEC_Context *) rs_closesession_ins.session_context; - return; -} - -TEEC_Result -TEEC_AllocateSharedMemory( - TEEC_Context *context, - TEEC_SharedMemory *sharedMem) -{ - if (context == NULL) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - if (sharedMem == NULL) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - if (sharedMem->size <= 0) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - - sharedMem->buffer = (uint8_t *) malloc(sharedMem->size); - if (sharedMem->buffer == NULL) - { - return TEEC_ERROR_OUT_OF_MEMORY; - } - - sharedMem->is_allocated = true; - sharedMem->context = context; - sharedMem->ops_cnt = 0xfffe; - - return TEEC_SUCCESS; -} - -TEEC_Result -TEEC_RegisterSharedMemory( - TEEC_Context *context, - TEEC_SharedMemory *sharedMem) -{ - if (context == NULL) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - if (sharedMem == NULL) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - if (sharedMem->size <= 0) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - - if (sharedMem->buffer == NULL) - { - return TEEC_ERROR_BAD_PARAMETERS; - } - - sharedMem->is_allocated = false; - sharedMem->context = context; - sharedMem->ops_cnt = 0xfffe; - - return TEEC_SUCCESS; -} - -void -TEEC_ReleaseSharedMemory( - TEEC_SharedMemory *sharedMem) -{ - if (sharedMem == NULL) - { - return; - } - if (sharedMem->buffer == NULL) - { - return; - } - - sharedMem->ops_cnt = 0x0; - if (sharedMem->is_allocated == true) - { - free(sharedMem->buffer); - } -} - - -TEEC_Result -TEEC_DeployTa( - char *infile_path, - char *subdir, - char *outfile_name -) -{ - - if (infile_path == NULL) - { - return TEEC_INFILE_PATH_NULL; - } - - std::string str_infile_path(infile_path); - std::string str_subdir; - std::string str_outfile_name; - - if (subdir != NULL) - { - str_subdir = std::string(subdir); - } - - if (outfile_name != NULL) - { - str_outfile_name = std::string(outfile_name); - } - - int iret; - - if (gpp_channel == NULL) - { - int igrpctls = grpc_tls; - - if (grpc_tls != 0 && grpc_tls != 1 && grpc_tls != 2) - { - std::cout << global_strcfgfile << " grpc_tls should be 0 or 1 or 2 " << std::endl; - return TEEC_FAIL; - } - - switch (igrpctls) - { - case 0: - { - gpp_channel = grpc::CreateChannel(global_target_str, grpc::InsecureChannelCredentials()); - - break; - } - - case 1: - { - if (!isFileExists_ifstream(global_servercacert_path)) - { - std::cout << "error file : " << global_servercacert_path << " is not exist " << std::endl; - return TEEC_FAIL; - } - - std::string strcmd; - FILE *pipe; - char buffer[128]; - std::string result; - - std::string strdayseconds; - char *resulttemp; - const char slash[] = "\n"; - char *parresult; - std::string strparresult; - std::string willexpire("Certificate will expire"); - - // 7 days in seconds - strdayseconds = "604800"; - strcmd = "openssl x509 -enddate -noout -in " + global_servercacert_path + " -checkend " + strdayseconds; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - resulttemp = const_cast(result.data()); - parresult = strtok(resulttemp, slash); - while (parresult != NULL) - { - strparresult = std::string(parresult); - parresult = strtok(NULL, slash); - } - if (strparresult.compare(willexpire) == 0) - { - std::cout << "gpp '" << global_servercacert_path << "' will expire in 7 days, please reget it" << std::endl; - return TEEC_FAIL; - } - - auto servercacert = get_file_contents(global_servercacert_path); - grpc::SslCredentialsOptions ssl_opts; - ssl_opts.pem_root_certs = servercacert; - std::shared_ptr creds = grpc::SslCredentials(ssl_opts); - gpp_channel = grpc::CreateChannel(global_target_str, creds); - - break; - } - - case 2: - { - if (!isFileExists_ifstream(global_servercacert_path)) - { - std::cout << "error file : " << global_servercacert_path << " is not exist " << std::endl; - return TEEC_FAIL; - } - if (!isFileExists_ifstream(global_clientkey_path)) - { - std::cout << "error file : " << global_clientkey_path << " is not exist " << std::endl; - return TEEC_FAIL; - } - if (!isFileExists_ifstream(global_clientcert_path)) - { - std::cout << "error file : " << global_clientcert_path << " is not exist " << std::endl; - return TEEC_FAIL; - } - - std::string strcmd; - FILE *pipe; - char buffer[128]; - std::string result; - - std::string strdayseconds; - char *resulttemp; - const char slash[] = "\n"; - char *parresult; - std::string strparresult; - std::string willexpire("Certificate will expire"); - - // 7 days in seconds - strdayseconds = "604800"; - strcmd = "openssl x509 -enddate -noout -in " + global_servercacert_path + " -checkend " + strdayseconds; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - resulttemp = const_cast(result.data()); - parresult = strtok(resulttemp, slash); - while (parresult != NULL) - { - strparresult = std::string(parresult); - parresult = strtok(NULL, slash); - } - if (strparresult.compare(willexpire) == 0) - { - std::cout << "libteecc '" << global_servercacert_path << "' will expire in 7 days, please reget it" - << std::endl; - return TEEC_FAIL; - } - - // 7 days in seconds - strdayseconds = "604800"; - strcmd = "openssl x509 -enddate -noout -in " + global_clientcert_path + " -checkend " + strdayseconds; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - resulttemp = const_cast(result.data()); - parresult = strtok(resulttemp, slash); - while (parresult != NULL) - { - strparresult = std::string(parresult); - parresult = strtok(NULL, slash); - } - if (strparresult.compare(willexpire) == 0) - { - std::cout << "libteecc '" << global_clientcert_path << "' will expire in 7 days, please reget it" << std::endl; - return TEEC_FAIL; - } - strcmd = "openssl rsa -in " + global_clientkey_path + " -out " - + global_clientkey_path + ".nopass"; - std::string nopass_clientkey_path = global_clientkey_path + ".nopass"; - - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - - strcmd = "openssl rsa -in " + nopass_clientkey_path + " -check -noout"; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - std::string keyok("RSA key ok\n"); - if (result.compare(keyok) != 0) - { - std::cout << "libteecc '" + global_clientkey_path + "' integrity is broken" << std::endl; - return TEEC_FAIL; - } - - std::string sigfile_path = global_strcfgfiletemp + "/.teecc/certs/msg.sig"; - std::string msgfile_path = global_strcfgfiletemp + "/.teecc/certs/msg.txt"; - strcmd = - "openssl dgst -sha256 -sign " + nopass_clientkey_path + " -out " + sigfile_path + " " + msgfile_path; - system(strcmd.c_str()); - // ${_openssl} x509 -in ${CRTPEM} -pubkey -out ${PUBPEM} - std::string pubkeyfile_path = global_strcfgfiletemp + "/.teecc/certs/client_pubkey.pem"; - strcmd = "openssl x509 -in " + global_clientcert_path + " -pubkey -out " + pubkeyfile_path; - system(strcmd.c_str()); - - // ${_openssl} dgst -sha256 -verify ${PUBPEM} -signature msg.sig msg.txt - strcmd = "openssl dgst -sha256 -verify " + pubkeyfile_path + " -signature " + sigfile_path + " " + - msgfile_path; - // system(strcmd.c_str()); - pipe = popen(strcmd.c_str(), "r"); - if (!pipe) - { - std::cout << "libteecc popen '" << strcmd << "' failed" << std::endl; - return TEEC_FAIL; - } - result = ""; - // read till end of process: - while (!feof(pipe)) - { - // use buffer to read and add to result - if (fgets(buffer, 128, pipe) != NULL) - result += buffer; - } - pclose(pipe); - std::string verifyok("Verified OK\n"); - if (result.compare(verifyok) != 0) - { - std::cout << "libteecc '" + global_clientkey_path + "' is not matched with '" + global_clientcert_path + "'" - << std::endl; - return TEEC_FAIL; - } - - auto clientkey = get_file_contents(nopass_clientkey_path); - strcmd = "rm -f " + global_clientkey_path + ".nopass"; - system(strcmd.c_str()); - strcmd = "rm -f " + pubkeyfile_path; - system(strcmd.c_str()); - strcmd = "rm -f " + sigfile_path; - system(strcmd.c_str()); - - auto servercacert = get_file_contents(global_servercacert_path); - auto clientcert = get_file_contents(global_clientcert_path); - grpc::SslCredentialsOptions ssl_opts; - ssl_opts.pem_root_certs = servercacert; - ssl_opts.pem_private_key = clientkey; - ssl_opts.pem_cert_chain = clientcert; - std::shared_ptr creds = grpc::SslCredentials(ssl_opts); - gpp_channel = grpc::CreateChannel(global_target_str, creds); - - break; - } - - default: - { - gpp_channel = grpc::CreateChannel(global_target_str, grpc::InsecureChannelCredentials()); - } - } - - client = new GppClient( - gpp_channel - ); - } - - iret = client->Upload(str_infile_path, str_subdir, str_outfile_name); - - return (TEEC_Result) iret; -} - - -TEEC_Result -TEEC_SetJwt( - char *token -) -{ - if (token == NULL || sizeof(token) > 1024) - { - return TEEC_FAIL; - } - - memset(glo_token, '\0', sizeof(glo_token)); - strcpy(glo_token, token); - - return TEEC_SUCCESS; -} - - -TEEC_Result -TEEC_UnsetJwt( -) -{ - memset(glo_token, '\0', sizeof(glo_token)); - strcpy(glo_token, "noToken"); - - return TEEC_SUCCESS; -} - - -#ifdef __cplusplus -}; -#endif diff --git a/teeproxy/libteecc/teecc.h b/teeproxy/libteecc/teecc.h deleted file mode 100644 index 47abd0f..0000000 --- a/teeproxy/libteecc/teecc.h +++ /dev/null @@ -1,351 +0,0 @@ -#ifndef _TEECC_H -#define _TEECC_H - -#include - -struct retstru_teec_inicont { - uint32_t teecresult; - int32_t context_fd; - uint8_t *context_tapath; - uintptr_t context_tapath_outsize; - uint64_t context_sessionlist_next; - uint64_t context_sessionlist_prev; - uint64_t context_shrdmemlist_next; - uint64_t context_shrdmemlist_prev; - uint64_t context_sharebuffer_buffer; - int64_t context_sharebuffer_bufferbarrier; - uint64_t context_addr; - int32_t flag; -}; - -struct retstru_teec_fincont { - int32_t context_fd; - uint8_t *context_tapath; - uintptr_t context_tapath_outsize; - uint64_t context_sessionlist_next; - uint64_t context_sessionlist_prev; - uint64_t context_shrdmemlist_next; - uint64_t context_shrdmemlist_prev; - uint64_t context_sharebuffer_buffer; - int64_t context_sharebuffer_bufferbarrier; - int32_t flag; -}; - -struct retstru_teec_opensession { - uint32_t teecresult; - int32_t context_fd; - uint8_t *context_tapath; - uintptr_t context_tapath_outsize; - uint64_t context_sessionlist_next; - uint64_t context_sessionlist_prev; - uint64_t context_shrdmemlist_next; - uint64_t context_shrdmemlist_prev; - uint64_t context_sharebuffer_buffer; - int64_t context_sharebuffer_bufferbarrier; - uint32_t session_sessionid; - uint32_t session_serviceid_timelow; - uint32_t session_serviceid_timemid; - uint32_t session_serviceid_timehiandver; - uint8_t *session_serviceid_clockseqandnode; - uintptr_t session_serviceid_clockseqandnode_outsize; - uint32_t session_opscnt; - uint64_t session_head_next; - uint64_t session_head_prev; - uint64_t session_context; - uint32_t operation_started; - uint32_t operation_paramtypes; - uint64_t operation_param1_tmpref_buffer; - uint32_t operation_param1_tmpref_size; - uint64_t operation_param1_memref_parent; - uint32_t operation_param1_memref_size; - uint32_t operation_param1_memref_offset; - uint32_t operation_param1_value_a; - uint32_t operation_param1_value_b; - int32_t operation_param1_ionref_ionsharefd; - uint32_t operation_param1_ionref_ionsize; - uint64_t operation_param2_tmpref_buffer; - uint32_t operation_param2_tmpref_size; - uint64_t operation_param2_memref_parent; - uint32_t operation_param2_memref_size; - uint32_t operation_param2_memref_offset; - uint32_t operation_param2_value_a; - uint32_t operation_param2_value_b; - int32_t operation_param2_ionref_ionsharefd; - uint32_t operation_param2_ionref_ionsize; - uint64_t operation_param3_tmpref_buffer; - uint32_t operation_param3_tmpref_size; - uint64_t operation_param3_memref_parent; - uint32_t operation_param3_memref_size; - uint32_t operation_param3_memref_offset; - uint32_t operation_param3_value_a; - uint32_t operation_param3_value_b; - int32_t operation_param3_ionref_ionsharefd; - uint32_t operation_param3_ionref_ionsize; - uint64_t operation_param4_tmpref_buffer; - uint32_t operation_param4_tmpref_size; - uint64_t operation_param4_memref_parent; - uint32_t operation_param4_memref_size; - uint32_t operation_param4_memref_offset; - uint32_t operation_param4_value_a; - uint32_t operation_param4_value_b; - int32_t operation_param4_ionref_ionsharefd; - uint32_t operation_param4_ionref_ionsize; - uint64_t operation_session; - int32_t operation_cancelflag; - uint32_t returnorigin; - int32_t flag; - -}; - -struct retstru_teec_closesession { - uint32_t session_sessionid; - uint32_t session_serviceid_timelow; - uint32_t session_serviceid_timemid; - uint32_t session_serviceid_timehiandver; - uint8_t *session_serviceid_clockseqandnode; - uintptr_t session_serviceid_clockseqandnode_outsize; - uint32_t session_opscnt; - uint64_t session_head_next; - uint64_t session_head_prev; - uint64_t session_context; - int32_t flag; - -}; - -struct retstru_teec_invokecommand { - uint32_t teecresult; - uint32_t session_sessionid; - uint32_t session_serviceid_timelow; - uint32_t session_serviceid_timemid; - uint32_t session_serviceid_timehiandver; - uint8_t *session_serviceid_clockseqandnode; - uintptr_t session_serviceid_clockseqandnode_outsize; - uint32_t session_opscnt; - uint64_t session_head_next; - uint64_t session_head_prev; - uint64_t session_context; - uint32_t operation_started; - uint32_t operation_paramtypes; - uint64_t operation_param1_tmpref_buffer; - uint32_t operation_param1_tmpref_size; - uint64_t operation_param1_memref_parent; - uint32_t operation_param1_memref_parent_flag; - uint32_t operation_param1_memref_size; - uint32_t operation_param1_memref_offset; - uint32_t operation_param1_value_a; - uint32_t operation_param1_value_b; - int32_t operation_param1_ionref_ionsharefd; - uint32_t operation_param1_ionref_ionsize; - uint64_t operation_param2_tmpref_buffer; - uint32_t operation_param2_tmpref_size; - uint64_t operation_param2_memref_parent; - uint32_t operation_param2_memref_parent_flag; - uint32_t operation_param2_memref_size; - uint32_t operation_param2_memref_offset; - uint32_t operation_param2_value_a; - uint32_t operation_param2_value_b; - int32_t operation_param2_ionref_ionsharefd; - uint32_t operation_param2_ionref_ionsize; - uint64_t operation_param3_tmpref_buffer; - uint32_t operation_param3_tmpref_size; - uint64_t operation_param3_memref_parent; - uint32_t operation_param3_memref_parent_flag; - uint32_t operation_param3_memref_size; - uint32_t operation_param3_memref_offset; - uint32_t operation_param3_value_a; - uint32_t operation_param3_value_b; - int32_t operation_param3_ionref_ionsharefd; - uint32_t operation_param3_ionref_ionsize; - uint64_t operation_param4_tmpref_buffer; - uint32_t operation_param4_tmpref_size; - uint64_t operation_param4_memref_parent; - uint32_t operation_param4_memref_parent_flag; - uint32_t operation_param4_memref_size; - uint32_t operation_param4_memref_offset; - uint32_t operation_param4_value_a; - uint32_t operation_param4_value_b; - int32_t operation_param4_ionref_ionsharefd; - uint32_t operation_param4_ionref_ionsize; - uint64_t operation_session; - int32_t operation_cancelflag; - uint32_t returnorigin; - uint8_t *buffer1; - uintptr_t buffer1_outsize; - uint8_t *buffer2; - uintptr_t buffer2_outsize; - uint8_t *buffer3; - uintptr_t buffer3_outsize; - uint8_t *buffer4; - uintptr_t buffer4_outsize; - int32_t flag; -}; - - -struct retstru_teec_inicont externc_teec_initializecontext(uint8_t *name, - uint32_t name_size, - int32_t in_context_fd, - uint8_t *in_context_tapath, - int32_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier); - -void externc_retstru_teec_inicont_free(struct retstru_teec_inicont rs_ins); - -struct retstru_teec_fincont externc_teec_finalizecontext(int32_t in_context_fd, - uint8_t *in_context_tapath, - int32_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - uint64_t in_context_addr); - -void externc_retstru_teec_fincont_free(struct retstru_teec_fincont rs_ins); - -struct retstru_teec_opensession externc_teec_opensession(int32_t in_context_fd, - uint8_t *in_context_tapath, - int32_t in_context_tapath_size, - uint64_t in_context_sessionlist_next, - uint64_t in_context_sessionlist_prev, - uint64_t in_context_shrdmemlist_next, - uint64_t in_context_shrdmemlist_prev, - uint64_t in_context_sharebuffer_buffer, - int64_t in_context_sharebuffer_bufferbarrier, - uint32_t in_destination_timelow, - uint32_t in_destination_timemid, - uint32_t in_destination_timehiandver, - uint8_t *in_destination_clockseqandnode, - int32_t in_destination_clockseqandnode_size, - uint32_t in_connectionmethod, - uint64_t in_connectiondata, - uint32_t in_operation_started, - uint32_t in_operation_paramtypes, - uint64_t in_operation_param1_tmpref_buffer, - uint32_t in_operation_param1_tmpref_size, - uint64_t in_operation_param1_memref_parent, - uint32_t in_operation_param1_memref_size, - uint32_t in_operation_param1_memref_offset, - uint32_t in_operation_param1_value_a, - uint32_t in_operation_param1_value_b, - int32_t in_operation_param1_ionref_ionsharefd, - uint32_t in_operation_param1_ionref_ionsize, - uint64_t in_operation_param2_tmpref_buffer, - uint32_t in_operation_param2_tmpref_size, - uint64_t in_operation_param2_memref_parent, - uint32_t in_operation_param2_memref_size, - uint32_t in_operation_param2_memref_offset, - uint32_t in_operation_param2_value_a, - uint32_t in_operation_param2_value_b, - int32_t in_operation_param2_ionref_ionsharefd, - uint32_t in_operation_param2_ionref_ionsize, - uint64_t in_operation_param3_tmpref_buffer, - uint32_t in_operation_param3_tmpref_size, - uint64_t in_operation_param3_memref_parent, - uint32_t in_operation_param3_memref_size, - uint32_t in_operation_param3_memref_offset, - uint32_t in_operation_param3_value_a, - uint32_t in_operation_param3_value_b, - int32_t in_operation_param3_ionref_ionsharefd, - uint32_t in_operation_param3_ionref_ionsize, - uint64_t in_operation_param4_tmpref_buffer, - uint32_t in_operation_param4_tmpref_size, - uint64_t in_operation_param4_memref_parent, - uint32_t in_operation_param4_memref_size, - uint32_t in_operation_param4_memref_offset, - uint32_t in_operation_param4_value_a, - uint32_t in_operation_param4_value_b, - int32_t in_operation_param4_ionref_ionsharefd, - uint32_t in_operation_param4_ionref_ionsize, - uint64_t in_operation_session, - int32_t in_operation_cancelflag, - uint32_t in_returnorigin, - uint64_t in_context_addr); - -void externc_retstru_teec_opensession_free(struct retstru_teec_opensession rs_ins); - -struct retstru_teec_closesession externc_teec_closesession(uint32_t in_session_sessionid, - uint32_t in_session_serviceid_timelow, - uint32_t in_session_serviceid_timemid, - uint32_t in_session_serviceid_timehiandver, - uint8_t *in_session_serviceid_clockseqandnode, - uintptr_t in_session_serviceid_clockseqandnode_size, - uint32_t in_session_opscnt, - uint64_t in_session_head_next, - uint64_t in_session_head_prev, - uint64_t in_session_context); - -void externc_retstru_teec_closesession_free(struct retstru_teec_closesession rs_ins); - -struct retstru_teec_invokecommand externc_teec_invokecommand(uint32_t in_session_sessionid, - uint32_t in_session_serviceid_timelow, - uint32_t in_session_serviceid_timemid, - uint32_t in_session_serviceid_timehiandver, - uint8_t *in_session_serviceid_clockseqandnode, - uintptr_t in_session_serviceid_clockseqandnode_size, - uint32_t in_session_opscnt, - uint64_t in_session_head_next, - uint64_t in_session_head_prev, - uint64_t in_session_context, - uint32_t in_commandid, - uint32_t in_operation_started, - uint32_t in_operation_paramtypes, - uint64_t in_operation_param1_tmpref_buffer, - uint32_t in_operation_param1_tmpref_size, - uint64_t in_operation_param1_memref_parent, - uint32_t in_operation_param1_memref_parent_flag, - uint32_t in_operation_param1_memref_size, - uint32_t in_operation_param1_memref_offset, - uint32_t in_operation_param1_value_a, - uint32_t in_operation_param1_value_b, - int32_t in_operation_param1_ionref_ionsharefd, - uint32_t in_operation_param1_ionref_ionsize, - uint64_t in_operation_param2_tmpref_buffer, - uint32_t in_operation_param2_tmpref_size, - uint64_t in_operation_param2_memref_parent, - uint32_t in_operation_param2_memref_parent_flag, - uint32_t in_operation_param2_memref_size, - uint32_t in_operation_param2_memref_offset, - uint32_t in_operation_param2_value_a, - uint32_t in_operation_param2_value_b, - int32_t in_operation_param2_ionref_ionsharefd, - uint32_t in_operation_param2_ionref_ionsize, - uint64_t in_operation_param3_tmpref_buffer, - uint32_t in_operation_param3_tmpref_size, - uint64_t in_operation_param3_memref_parent, - uint32_t in_operation_param3_memref_parent_flag, - uint32_t in_operation_param3_memref_size, - uint32_t in_operation_param3_memref_offset, - uint32_t in_operation_param3_value_a, - uint32_t in_operation_param3_value_b, - int32_t in_operation_param3_ionref_ionsharefd, - uint32_t in_operation_param3_ionref_ionsize, - uint64_t in_operation_param4_tmpref_buffer, - uint32_t in_operation_param4_tmpref_size, - uint64_t in_operation_param4_memref_parent, - uint32_t in_operation_param4_memref_parent_flag, - uint32_t in_operation_param4_memref_size, - uint32_t in_operation_param4_memref_offset, - uint32_t in_operation_param4_value_a, - uint32_t in_operation_param4_value_b, - int32_t in_operation_param4_ionref_ionsharefd, - uint32_t in_operation_param4_ionref_ionsize, - uint64_t in_operation_session, - int32_t in_operation_cancelflag, - uint32_t in_returnorigin, - uint8_t *in_buffer1, - uintptr_t in_buffer1_size, - uint8_t *in_buffer2, - uintptr_t in_buffer2_size, - uint8_t *in_buffer3, - uintptr_t in_buffer3_size, - uint8_t *in_buffer4, - uintptr_t in_buffer4_size); - -void externc_retstru_teec_invokecommand_free(struct retstru_teec_invokecommand rs_ins); -#endif // _TEECC_H \ No newline at end of file -- Gitee From eaf6eb7088f941972a9305c70f95917bba6e5366 Mon Sep 17 00:00:00 2001 From: shen-guohua Date: Fri, 28 Apr 2023 11:35:53 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 127 ++++++++++++++++++++++++++++++++++++ README.md | 8 +++ trustzone-awared-vm/LICENSE | 127 ++++++++++++++++++++++++++++++++++++ 3 files changed, 262 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 trustzone-awared-vm/LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9e32cde --- /dev/null +++ b/LICENSE @@ -0,0 +1,127 @@ + 木兰宽松许可证, 第2版 + + 木兰宽松许可证, 第2版 + 2020年1月 http://license.coscl.org.cn/MulanPSL2 + + + 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + + 0. 定义 + + “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + + “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + + “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + + “法人实体”是指提交贡献的机构及其“关联实体”。 + + “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + + 1. 授予版权许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 + + 2. 授予专利许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 + + 3. 无商标许可 + + “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 + + 4. 分发限制 + + 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + + 5. 免责声明与责任限制 + + “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 + + 6. 语言 + “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 + + 条款结束 + + 如何将木兰宽松许可证,第2版,应用到您的软件 + + 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + + 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + + 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + + 3, 请将如下声明文本放入每个源文件的头部注释中。 + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. + + + Mulan Permissive Software License,Version 2 + + Mulan Permissive Software License,Version 2 (Mulan PSL v2) + January 2020 http://license.coscl.org.cn/MulanPSL2 + + Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: + + 0. Definition + + Software means the program and related documents which are licensed under this License and comprise all Contribution(s). + + Contribution means the copyrightable work licensed by a particular Contributor under this License. + + Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. + + Legal Entity means the entity making a Contribution and all its Affiliates. + + Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. + + 1. Grant of Copyright License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. + + 2. Grant of Patent License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. + + 3. No Trademark License + + No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. + + 4. Distribution Restriction + + You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. + + 5. Disclaimer of Warranty and Limitation of Liability + + THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + 6. Language + + THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. + + END OF THE TERMS AND CONDITIONS + + How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software + + To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: + + i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; + + ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; + + iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. + + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. diff --git a/README.md b/README.md new file mode 100644 index 0000000..406aa50 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# tee-gp-proxy + +#### 介绍 +项目(tee-gp-proxy)旨在通过各种手段,使得REE侧的CA可以在各种场景中使用TrustZone,包括RPC调用方式,以及在虚拟化场景下对TrustZone的访问。 + + +#### 方案介绍 +TBD diff --git a/trustzone-awared-vm/LICENSE b/trustzone-awared-vm/LICENSE new file mode 100644 index 0000000..9e32cde --- /dev/null +++ b/trustzone-awared-vm/LICENSE @@ -0,0 +1,127 @@ + 木兰宽松许可证, 第2版 + + 木兰宽松许可证, 第2版 + 2020年1月 http://license.coscl.org.cn/MulanPSL2 + + + 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + + 0. 定义 + + “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + + “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + + “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + + “法人实体”是指提交贡献的机构及其“关联实体”。 + + “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + + 1. 授予版权许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 + + 2. 授予专利许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 + + 3. 无商标许可 + + “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 + + 4. 分发限制 + + 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + + 5. 免责声明与责任限制 + + “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 + + 6. 语言 + “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 + + 条款结束 + + 如何将木兰宽松许可证,第2版,应用到您的软件 + + 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + + 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + + 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + + 3, 请将如下声明文本放入每个源文件的头部注释中。 + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. + + + Mulan Permissive Software License,Version 2 + + Mulan Permissive Software License,Version 2 (Mulan PSL v2) + January 2020 http://license.coscl.org.cn/MulanPSL2 + + Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: + + 0. Definition + + Software means the program and related documents which are licensed under this License and comprise all Contribution(s). + + Contribution means the copyrightable work licensed by a particular Contributor under this License. + + Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. + + Legal Entity means the entity making a Contribution and all its Affiliates. + + Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. + + 1. Grant of Copyright License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. + + 2. Grant of Patent License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. + + 3. No Trademark License + + No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. + + 4. Distribution Restriction + + You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. + + 5. Disclaimer of Warranty and Limitation of Liability + + THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + 6. Language + + THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. + + END OF THE TERMS AND CONDITIONS + + How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software + + To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: + + i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; + + ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; + + iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. + + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. -- Gitee From b9bdb15c17c74a2ba187e6b2a021f5787d32cbf7 Mon Sep 17 00:00:00 2001 From: shen guohua Date: Fri, 28 Apr 2023 03:50:35 +0000 Subject: [PATCH 6/6] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20cc-r?= =?UTF-8?q?esource-pooling/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cc-resource-pooling/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 cc-resource-pooling/.keep diff --git a/cc-resource-pooling/.keep b/cc-resource-pooling/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee

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%0A2$wmq*!ge@LVUap`lz`Js(Op=)(%q?yFJ)WK^ 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 pXFm_caEMAn+wYEFq8th(COyV7fp?TI0Z$r8E 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%0A2$wmq*!ge@LVUap`lz`Js(Op=)(%q?yFJ)WK^ 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 pXFm_caEMAn+wYEFq8th(COyV7fp?TI0Z$r8E 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