2 #include "ypc/core_t/analyzer/data_source.h"
3 #include "ypc/core_t/analyzer/interface/keymgr_interface.h"
4 #include "ypc/core_t/analyzer/internal/data_streams/multi_data_stream.h"
5 #include "ypc/core_t/analyzer/internal/data_streams/noinput_data_stream.h"
6 #include "ypc/core_t/analyzer/internal/data_streams/raw_data_stream.h"
7 #include "ypc/core_t/analyzer/internal/data_streams/sealed_data_stream.h"
8 #include "ypc/core_t/analyzer/var/data_source_var.h"
9 #include "ypc/core_t/analyzer/var/enclave_hash_var.h"
10 #include "ypc/core_t/analyzer/var/model_var.h"
11 #include "ypc/corecommon/allowance.h"
12 #include "ypc/stbox/ebyte.h"
15 template <
typename ModelT>
19 uint32_t check_allowance_m(
const std::vector<stbox::bytes> &checked_pkey) {
21 LOG(INFO) <<
"expect allowance for model with hash: "
22 << model_var_t::m_model_hash <<
" with pkey "
23 << model_var_t::m_model_pkey;
25 for (
auto pkey : checked_pkey) {
26 if (pkey == model_var_t::m_model_pkey + model_var_t::m_model_hash) {
27 return stbox::stx_status::success;
30 return stbox::stx_status::model_allowance_miss;
34 uint32_t check_allowance_m(
const std::vector<stbox::bytes> &checked_pkey) {
35 return stbox::stx_status::success;
40 uint32_t check_allowance_m(
const std::vector<stbox::bytes> &checked_pkey) {
41 return stbox::stx_status::success;
46 uint32_t check_allowance_d(
const std::vector<stbox::bytes> &checked_pkey) {
47 return stbox::stx_status::success;
53 uint32_t check_allowance_d(
const std::vector<stbox::bytes> &checked_pkey) {
55 stbox::bytes pkey = data_source_var_t::m_ds_use_pkey;
56 for (
auto pk : checked_pkey) {
58 return stbox::stx_status::success;
62 LOG(ERROR) <<
"data source "
63 << data_source_var_t::m_datasource->expect_data_hash()
64 <<
" have no allowance";
65 return stbox::stx_status::data_allowance_miss;
71 uint32_t check_allowance_d(
const std::vector<stbox::bytes> &checked_pkey) {
72 for (
auto dsp : data_source_var<multi_data_stream>::m_ds_use_pkey) {
74 for (
auto pk : checked_pkey) {
81 LOG(ERROR) <<
"cannot find allowance to access data with pkey: " << dsp;
82 return stbox::stx_status::data_allowance_miss;
85 return stbox::stx_status::success;
90 uint32_t check_allowance_d(
const std::vector<stbox::bytes> &checked_pkey) {
91 return stbox::stx_status::success;
97 template <
typename Crypto,
typename ModelT,
typename DataSession,
98 template <
typename>
class DataAllowancePolicy,
99 template <
typename>
class ModelAllowancePolicy>
101 :
virtual public ModelAllowancePolicy<ModelT>,
102 virtual public DataAllowancePolicy<DataSession>,
107 typedef ModelAllowancePolicy<ModelT> model_checker_t;
108 typedef DataAllowancePolicy<DataSession> data_checker_t;
111 uint32_t check_allowance(
const ntt::param_t ¶m) {
112 auto param_data = param.get<ntt::param_data>();
113 stbox::bytes param_hash;
114 auto ret = Crypto::hash_256(param_data, param_hash);
116 LOG(INFO) <<
"param: " << param_data <<
", param_hash: " << param_hash;
119 LOG(ERROR) <<
"hash_256 failed: " << stbox::status_string(ret);
123 std::vector<stbox::bytes> checked_pkey;
125 auto allowances = param.get<ntt::allowances>();
127 LOG(INFO) <<
"to check " << allowances.size() <<
" allowances";
129 for (
auto allowance_i : allowances) {
130 stbox::bytes pkey4v = allowance_i.get<ntt::pkey>();
131 if (pkey4v.size() != 0) {
132 stbox::bytes private_key;
133 stbox::bytes dian_pkey;
134 ret = keymgr_interface_t::request_private_key_for_public_key(
135 pkey4v, private_key, dian_pkey);
137 LOG(ERROR) <<
"request_private_key failed: "
138 << stbox::status_string(ret);
142 stbox::bytes allow = allowance_i.get<ntt::signature>();
143 if (allow.size() == 0) {
145 LOG(INFO) <<
"got empty allowance and ignore it for data: "
146 << allowance_i.get<ntt::data_hash>();
151 stbox::bytes to_check_data =
152 param_hash + enclave_hash_var::m_enclave_hash + dian_pkey +
153 allowance_i.get<ntt::data_hash>();
155 LOG(INFO) <<
"to check allowance data " << to_check_data
156 <<
", allow: " << allow;
161 LOG(INFO) <<
"to check data: " << to_check_data;
162 LOG(WARNING) <<
"check_allowance" << allow
163 <<
" failed: " << stbox::status_string(ret)
167 LOG(INFO) <<
"check allowance succ for data "
168 << allowance_i.get<ntt::data_hash>();
170 checked_pkey.push_back(pkey4v + allowance_i.get<ntt::data_hash>());
175 LOG(INFO) <<
"check all allowances done, start check model allowance";
178 ret = model_checker_t::check_allowance_m(checked_pkey);
180 LOG(ERROR) <<
"check_model_allowance failed: "
181 << stbox::status_string(ret);
185 LOG(INFO) <<
"check model allowance done, start check data allowance";
187 ret = data_checker_t::check_allowance_d(checked_pkey);
189 LOG(ERROR) <<
"check_data_allowance failed: "
190 << stbox::status_string(ret);
194 LOG(INFO) <<
"check allowance done";