2 #include "ypc/common/byte.h"
3 #include "ypc/stbox/stx_status.h"
8 template <
typename EC,
typename AES,
typename ECDH>
class aes_gcm_impl {
12 typedef ::ypc::utc::bytes<uint8_t, ::ypc::utc::byte_encode::raw_bytes>
bytes;
15 static uint32_t get_encrypt_message_size_with_prefix(uint32_t data_size) {
16 return aes_t::get_cipher_size(data_size) + ecc_t::get_public_key_size() +
17 aes_t::get_mac_code_size();
20 static uint32_t encrypt_message_with_prefix(
const uint8_t *public_key,
24 uint32_t prefix, uint8_t *cipher,
25 uint32_t cipher_size) {
26 if (aes_t::get_cipher_size(data_size) + ecc_t::get_public_key_size() +
27 aes_t::get_mac_code_size() !=
29 return stbox::stx_status::aes_invalid_cipher_size;
31 bytes gskey(ecc_t::get_private_key_size());
34 uint32_t ret = ecc_t::gen_private_key(gskey.size(), gskey.data());
39 uint8_t *gpkey = cipher + aes_t::get_cipher_size(data_size);
40 ret = ecc_t::generate_pkey_from_skey(gskey.data(), gskey.size(), gpkey,
41 ecc_t::get_public_key_size());
45 bytes shared_key(ecdh_t::get_ecdh_shared_key_size());
46 ret = ecdh_t::ecdh_shared_key(gskey.data(), gskey.size(), public_key,
47 pkey_size, shared_key.data(),
53 uint8_t *p_out_mac = cipher + aes_t::get_cipher_size(data_size) +
54 ecc_t::get_public_key_size();
56 ret = aes_t::encrypt_with_prefix(
57 shared_key.data(), shared_key.size(), data, data_size, prefix, cipher,
58 aes_t::get_cipher_size(data_size), p_out_mac);
62 template <
typename BytesType>
63 static uint32_t encrypt_message_with_prefix(
const BytesType &public_key,
64 const BytesType &data,
67 cipher = BytesType(get_encrypt_message_size_with_prefix(data.size()));
69 return encrypt_message_with_prefix(public_key.data(), public_key.size(),
70 data.data(), data.size(), prefix,
71 cipher.data(), cipher.size());
74 static uint32_t get_decrypt_message_size_with_prefix(uint32_t cipher_size) {
75 return aes_t::get_data_size(cipher_size) - ecc_t::get_public_key_size() -
76 aes_t::get_mac_code_size();
79 static uint32_t decrypt_message_with_prefix(
const uint8_t *private_key,
80 uint32_t private_key_size,
81 const uint8_t *cipher,
83 uint8_t *data, uint32_t data_size,
85 if (aes_t::get_cipher_size(data_size) + ecc_t::get_public_key_size() +
86 aes_t::get_mac_code_size() !=
88 return stbox::stx_status::aes_invalid_data_size;
91 bytes shared_key(ecdh_t::get_ecdh_shared_key_size());
93 uint32_t ret = ecdh_t::ecdh_shared_key(
94 private_key, private_key_size,
95 cipher + aes_t::get_cipher_size(data_size),
96 ecc_t::get_public_key_size(), shared_key.data(), shared_key.size());
101 const uint8_t *p_in_mac = cipher + aes_t::get_cipher_size(data_size) +
102 ecc_t::get_public_key_size();
104 ret = aes_t::decrypt_with_prefix(shared_key.data(), shared_key.size(),
105 cipher, aes_t::get_cipher_size(data_size),
106 prefix, data, data_size, p_in_mac);
110 template <
typename BytesType>
111 static uint32_t decrypt_message_with_prefix(
const BytesType &private_key,
112 const BytesType &cipher,
115 data = BytesType(get_decrypt_message_size_with_prefix(cipher.size()));
116 return decrypt_message_with_prefix(private_key.data(), private_key.size(),
117 cipher.data(), cipher.size(),
118 data.data(), data.size(), prefix);
122 template <
typename Curve,
typename AES,
typename ECDH>
class aes_impl {