YPC  0.2.0
algo_interface.h
1 #pragma once
2 #include "ypc/common/crypto_prefix.h"
3 #include "ypc/core_t/analyzer/interface/allowance_interface.h"
4 #include "ypc/core_t/analyzer/interface/do_parse_interface.h"
5 #include "ypc/core_t/analyzer/interface/forward_interface.h"
6 #include "ypc/core_t/analyzer/interface/keymgr_interface.h"
7 #include "ypc/core_t/analyzer/internal/is_param_encrypted.h"
8 #include "ypc/core_t/analyzer/internal/keymgr_session.h"
9 #include "ypc/core_t/analyzer/var/encrypted_param_var.h"
10 #include "ypc/core_t/analyzer/var/parser_var.h"
11 #include "ypc/core_t/analyzer/var/request_key_var.h"
12 #include "ypc/core_t/analyzer/var/result_var.h"
13 #include "ypc/corecommon/allowance.h"
14 #include "ypc/stbox/ebyte.h"
15 #include "ypc/stbox/stx_status.h"
16 
17 namespace ypc {
18 namespace internal {
19 typedef nt<stbox::bytes> ntt;
20 
21 template <typename Crypto, typename DataSession, typename ParserT,
22  typename Result, typename ModelT,
23  template <typename> class DataAllowancePolicy,
24  template <typename> class ModelAllowancePolicy,
25  bool input_encrypted = is_param_encrypted<Result>::value>
26 class algo_interface {};
27 
28 template <typename Crypto, typename DataSession, typename ParserT,
29  typename Result, typename ModelT,
30  template <typename> class DataAllowancePolicy,
31  template <typename> class ModelAllowancePolicy>
32 class algo_interface<Crypto, DataSession, ParserT, Result, ModelT,
33  DataAllowancePolicy, ModelAllowancePolicy, true>
34  : virtual public parser_var<ParserT>,
35  virtual public request_key_var<true>,
36  virtual public result_var,
37  virtual public do_parse_interface<ParserT, ModelT>,
38  virtual public keymgr_interface<Crypto>,
39  virtual public encrypted_param_var,
40  virtual public check_allowance_interface<Crypto, ModelT, DataSession,
41  DataAllowancePolicy,
42  ModelAllowancePolicy>,
43  virtual public forward_interface<Crypto, Result> {
44  typedef Crypto ecc;
48  typedef check_allowance_interface<Crypto, ModelT, DataSession,
49  DataAllowancePolicy, ModelAllowancePolicy>
52 
53 protected:
54  uint32_t parse_data_item_impl(const uint8_t *input_param, uint32_t len) {
55 #ifdef DEBUG
56  LOG(INFO) << "start parse data";
57 #endif
58  ntt::param_t param =
60  input_param, len);
61 
62 #ifdef DEBUG
63  LOG(INFO) << "done unmarshal param, start request private key";
64 #endif
65 
66  request_key_var_t::m_pkey4v = param.get<ntt::pkey>();
67  stbox::bytes dian_pkey;
68  auto ret = keymgr_interface_t::request_private_key_for_public_key(
69  request_key_var_t::m_pkey4v, request_key_var_t::m_private_key,
70  dian_pkey);
71  if (ret) {
72  LOG(ERROR) << "request_private_key failed: " << stbox::status_string(ret);
73  return ret;
74  }
75 #ifdef DEBUG
76  LOG(INFO) << "start decrypt param";
77 #endif
78  stbox::bytes decrypted_param(
79  ecc::get_decrypt_message_size_with_prefix(len));
80  auto param_data = param.get<ntt::param_data>();
81 
82  ret = ecc::decrypt_message_with_prefix(request_key_var_t::m_private_key,
83  param_data, decrypted_param,
84  ypc::utc::crypto_prefix_arbitrary);
85  if (ret) {
86  LOG(ERROR) << "decrypt_message_with_prefix failed: "
87  << stbox::status_string(ret);
88  return ret;
89  }
90 #ifdef DEBUG
91  LOG(INFO) << "start check allowance";
92 #endif
93  param.set<ntt::param_data>(decrypted_param);
94  auto tmp_allowance = param.get<ntt::allowances>();
95  ret = allowance_checker_t::check_allowance(param);
96  if (ret) {
97  LOG(ERROR) << "check_allowance failed: " << stbox::status_string(ret);
98  return ret;
99  }
100 
101  ret = forward_interface_t::set_forward_target_info(param);
102  if (ret) {
103  LOG(ERROR) << "set_forward_target_info failed: "
104  << stbox::status_string(ret);
105  return ret;
106  }
107 
108  encrypted_param_var::m_encrypted_param = param_data;
109 
110 #ifdef DEBUG
111  LOG(INFO) << "start do_parse";
112 #endif
113  result_var::m_result = do_parse_interface_t::do_parse(
114  decrypted_param.data(), decrypted_param.size());
115 #ifdef DEBUG
116  LOG(INFO) << "end parse ";
117 #endif
118  result_var::m_cost_gas = 0;
119  return stbox::stx_status::success;
120  }
121 };
122 
123 template <typename Crypto, typename DataSession, typename ParserT,
124  typename Result, typename ModelT,
125  template <typename> class DataAllowancePolicy,
126  template <typename> class ModelAllowancePolicy>
127 class algo_interface<Crypto, DataSession, ParserT, Result, ModelT,
128  DataAllowancePolicy, ModelAllowancePolicy, false>
129  : virtual public parser_var<ParserT>,
130  virtual public result_var,
131  virtual public keymgr_interface<Crypto>,
132  virtual public do_parse_interface<ParserT, ModelT>,
133  virtual public check_allowance_interface<Crypto, ModelT, DataSession,
134  DataAllowancePolicy,
135  ModelAllowancePolicy> {
138  typedef check_allowance_interface<Crypto, ModelT, DataSession,
139  DataAllowancePolicy, ModelAllowancePolicy>
141 
142 protected:
143  uint32_t parse_data_item_impl(const uint8_t *input_param, uint32_t len) {
144 #ifdef DEBUG
145  LOG(INFO) << "start parse data";
146 #endif
147  ntt::param_t param =
149  input_param, len);
150 
151 #ifdef DEBUG
152  LOG(INFO) << "start check allowance";
153 #endif
154  uint32_t ret = allowance_checker_t::check_allowance(param);
155  if (ret) {
156  LOG(ERROR) << "check_allowance failed: " << stbox::status_string(ret);
157  return ret;
158  }
159 
160 #ifdef DEBUG
161  LOG(INFO) << "start do_parse";
162 #endif
163  auto param_data = param.get<ntt::param_data>();
164  result_var::m_result =
165  do_parse_interface_t::do_parse(param_data.data(), param_data.size());
166 #ifdef DEBUG
167  LOG(INFO) << "end parse ";
168 #endif
169  return stbox::stx_status::success;
170  }
171 };
172 } // namespace internal
173 } // namespace ypc
ypc::internal::result_var
Definition: result_var.h:5
ypc::internal::do_parse_interface
Definition: do_parse_interface.h:80
ypc::internal::check_allowance_interface
Definition: allowance_interface.h:100
ypc::internal::forward_interface
Definition: forward_interface.h:11
ypc::internal::encrypted_param_var
Definition: encrypted_param_var.h:7
ypc::nt
Definition: nt_cols.h:6
ypc::internal::parser_var
Definition: parser_var.h:7
ypc::internal::algo_interface
Definition: algo_interface.h:26
ypc::internal::request_key_var
Definition: request_key_var.h:7
ypc::internal::keymgr_interface
Definition: keymgr_interface.h:18
ypc::make_package
Definition: package.h:48
ypc::crypto::crypto_pack
Definition: crypto_pack.h:14
ypc::internal::request_key_var< true >
Definition: request_key_var.h:9