YPC  0.2.0
forward_result.h
1 #pragma once
2 #include "ypc/common/endian.h"
3 #include "ypc/core_t/analyzer/helper/parser_type_traits.h"
4 #include "ypc/core_t/analyzer/var/data_hash_var.h"
5 #include "ypc/core_t/analyzer/var/enclave_hash_var.h"
6 #include "ypc/core_t/analyzer/var/encrypted_param_var.h"
7 #include "ypc/core_t/analyzer/var/request_key_var.h"
8 #include "ypc/core_t/analyzer/var/result_var.h"
9 #include "ypc/stbox/ebyte.h"
10 #include "ypc/stbox/stx_status.h"
11 
12 namespace ypc {
13 namespace internal {
14 template <typename Crypto>
15 class forward_result : virtual public request_key_var<true>,
16  virtual public enclave_hash_var,
17  virtual public result_var,
18  virtual public encrypted_param_var,
19  virtual public data_hash_var {
20  typedef Crypto ecc;
22 
23 public:
24  uint32_t generate_result() {
25  using ntt = nt<stbox::bytes>;
26  if (m_target_enclave_hash.size() == 0) {
27  LOG(ERROR) << "target enclave hash not set";
28  return stbox::stx_status::forward_target_not_set;
29  }
30 
31  // 1. gen private key
32  stbox::bytes shu_skey;
33  auto ret = ecc::gen_private_key(shu_skey);
34  if (ret) {
35  LOG(ERROR) << "gen_private_key failed: " << stbox::status_string(ret);
36  return ret;
37  }
38  stbox::bytes shu_pkey;
39  ret = ecc::generate_pkey_from_skey(shu_skey, shu_pkey);
40  if (ret) {
41  LOG(ERROR) << "generate_pkey_from_skey failed: "
42  << stbox::status_string(ret);
43  return ret;
44  }
45  // 2. gen forward for private key
46  stbox::bytes encrypted_skey;
47  ret = ecc::encrypt_message_with_prefix(m_target_dian_pkey, shu_skey,
48  utc::crypto_prefix_forward,
49  encrypted_skey);
50 
51  if (ret != stbox::stx_status::success) {
52  LOG(ERROR) << "error for encrypt_message: " << stbox::status_string(ret);
53  return ret;
54  }
55 
56  stbox::bytes to_sign_msg = m_target_dian_pkey + m_target_enclave_hash;
57 
58  stbox::bytes sig;
59  ret = ecc::sign_message(shu_skey, to_sign_msg, sig);
60  if (ret) {
61  LOG(ERROR) << "sign_message failed: " << stbox::status_string(ret);
62  return ret;
63  }
64 
65  // 3. encrypt result with dian pkey
66  std::vector<stbox::bytes> batch;
67  batch.push_back(result_var::m_result);
68  auto pb = make_bytes<stbox::bytes>::for_package<ntt::batch_data_pkg_t,
69  ntt::batch_data>(batch);
70 
71  ret = ecc::encrypt_message_with_prefix(
72  shu_pkey, pb, utc::crypto_prefix_arbitrary, m_encrypted_result_str);
73 
74  if (ret != stbox::stx_status::success) {
75  LOG(ERROR) << "error for encrypt_message: " << stbox::status_string(ret);
76  return ret;
77  }
78 
79  // For safety, we may generate allowance for the encrypted result.
80  // Yet, we ignore this since shu_skey is one-time generation.
81 
82  // 4. generate hash
83 
84  stbox::bytes data_hash;
85  ret = ecc::hash_256(stbox::bytes("Fidelius"), data_hash);
86  auto data_hash2 = data_hash + result_var::m_result;
87  ret = ecc::hash_256(data_hash2, data_hash);
88 
90  ntt::forward_result_t result;
91  ntt::shu_info_t shu;
92  shu.set<ntt::pkey, ntt::encrypted_shu_skey, ntt::shu_forward_signature,
93  ntt::enclave_hash>(shu_pkey, encrypted_skey, sig,
94  m_target_enclave_hash);
95  result.set<ntt::shu_info>(shu);
96  result.set<ntt::data_hash>(data_hash);
97  result.set<ntt::encrypted_result>(m_encrypted_result_str);
98 
100  result_package = result;
101  m_result_bytes = make_bytes<stbox::bytes>::for_package(result_package);
102 
103  return ret;
104  }
105 
106  uint32_t get_analyze_result_size() { return m_result_bytes.size(); }
107  uint32_t get_analyze_result(uint8_t *result, uint32_t size) {
108  memcpy(result, m_result_bytes.data(), m_result_bytes.size());
109  return stbox::stx_status::success;
110  }
111 
112 protected:
113  stbox::bytes m_encrypted_result_str;
114  stbox::bytes m_cost_signature_str;
115  stbox::bytes m_result_signature_str;
116 
117  stbox::bytes m_target_enclave_hash;
118  stbox::bytes m_target_dian_pkey;
119 
120  stbox::bytes m_result_bytes;
121 };
122 } // namespace internal
123 template <typename Crypto>
125 
126 template <typename Crypto> struct result_type_traits<forward_result<Crypto>> {
127  constexpr static uint32_t value = ypc::utc::forward_result_parser;
128 };
129 
130 } // namespace ypc
ypc::internal::result_var
Definition: result_var.h:5
ypc::internal::encrypted_param_var
Definition: encrypted_param_var.h:7
ypc::nt
Definition: nt_cols.h:6
ypc::internal::enclave_hash_var
Definition: enclave_hash_var.h:7
ypc::internal::request_key_var
Definition: request_key_var.h:7
ypc::internal::data_hash_var
Definition: data_hash_var.h:6
ypc::result_type_traits
Definition: parser_type_traits.h:4
ypc::cast_obj_to_package
Definition: package.h:67
ypc::crypto::crypto_pack
Definition: crypto_pack.h:14
ypc::internal::forward_result
Definition: forward_result.h:15
ypc::make_bytes
Definition: package.h:7
ypc::internal::request_key_var< true >
Definition: request_key_var.h:9