16#include <unordered_map>
22#if defined(PLAINTEXT_CACHE)
24 "PLAINTEXT_CACHE should only be used for debugging, and not enabled for enclave builds")
29 static inline bool verify_and_decrypt(
33 std::vector<uint8_t>& plaintext)
42 auto success = encryption_key.
decrypt(
48 const auto encoded_prefix_size =
sizeof(
key.size()) +
key.size();
49 if (plaintext.size() < encoded_prefix_size)
54 const auto* data =
reinterpret_cast<const uint8_t*
>(plaintext.data());
55 auto size = plaintext.size();
56 const auto prefix_size = serialized::read<size_t>(data, size);
57 if (prefix_size !=
key.size())
63 if (memcmp(data,
key.data(),
key.size()) != 0)
69 plaintext.begin(), plaintext.begin() + encoded_prefix_size);
87 std::unordered_map<LFSKey, PendingResult>
pending;
99 std::vector<uint8_t> key_prefix(
sizeof(key.size()) + key.size());
100 auto* data = key_prefix.data();
101 auto size = key_prefix.size();
103 contents.insert(contents.begin(), key_prefix.begin(), key_prefix.end());
114#ifdef PLAINTEXT_CACHE
136 dispatcher, LFSMsg::response, [
this](
const uint8_t* data,
size_t size) {
137 auto [obfuscated, encrypted] =
138 ringbuffer::read_message<LFSMsg::response>(data, size);
140 auto it =
pending.find(obfuscated);
143 auto result = it->second.lock();
144 if (result !=
nullptr)
149 const auto success = verify_and_decrypt(
152 std::move(encrypted),
162 "Cache was given invalid contents for {} (aka {})",
170 "Retained result for {} (aka {}) in state {}",
173 result->fetch_result);
179 "Received response for {}, but caller has already dropped "
188 "Ignoring response message for unrequested key {}", obfuscated);
195 [
this](
const uint8_t* data,
size_t size) {
197 ringbuffer::read_message<LFSMsg::not_found>(data, size);
199 auto it =
pending.find(obfuscated);
202 auto result = it->second.lock();
203 if (result !=
nullptr)
209 "Host has no contents for key {} (aka {})",
217 "Retained result for {} (aka {}) in state {}",
220 result->fetch_result);
226 "Received not_found for {}, but caller has already dropped "
235 "Ignoring not_found message for unrequested key {}", obfuscated);
242#ifdef PLAINTEXT_CACHE
246 reinterpret_cast<const uint8_t*
>(key.data()), key.size());
247 return ds::to_hex(h);
260 encrypt(obfuscated, std::move(contents)));
267 auto it =
pending.find(obfuscated);
273 result = it->second.lock();
274 if (result !=
nullptr)
276 if (key != result->key)
278 throw std::runtime_error(fmt::format(
279 "Obfuscation collision for unique keys '{}' and '{}', both "
280 "obfuscated to '{}'",
289 result = std::make_shared<FetchResult>();
294 result = std::make_shared<FetchResult>();
295 pending.emplace(obfuscated, result);
Definition symmetric_key.h:71
virtual bool decrypt(std::span< const uint8_t > iv, const uint8_t tag[GCM_SIZE_TAG], std::span< const uint8_t > cipher, std::span< const uint8_t > aad, std::vector< uint8_t > &plain) const =0
Definition lfs_interface.h:40
Definition enclave_lfs_access.h:83
std::unique_ptr< ccf::crypto::KeyAesGcm > encryption_key
Definition enclave_lfs_access.h:93
std::weak_ptr< FetchResult > PendingResult
Definition enclave_lfs_access.h:85
void store(const LFSKey &key, LFSContents &&contents) override
Definition enclave_lfs_access.h:251
ringbuffer::WriterPtr to_host
Definition enclave_lfs_access.h:90
FetchResultPtr fetch(const LFSKey &key) override
Definition enclave_lfs_access.h:263
std::unordered_map< LFSKey, PendingResult > pending
Definition enclave_lfs_access.h:87
ccf::pal::Mutex pending_access
Definition enclave_lfs_access.h:88
ccf::crypto::EntropyPtr entropy_src
Definition enclave_lfs_access.h:92
void register_message_handlers(messaging::Dispatcher< ringbuffer::Message > &dispatcher)
Definition enclave_lfs_access.h:132
LFSEncryptedContents encrypt(const LFSKey &key, LFSContents &&contents)
Definition enclave_lfs_access.h:95
EnclaveLFSAccess(ringbuffer::WriterPtr writer)
Definition enclave_lfs_access.h:122
static LFSKey obfuscate_key(const LFSKey &key)
Definition enclave_lfs_access.h:240
Definition messaging.h:38
#define LOG_TRACE_FMT
Definition internal_logger.h:13
#define LOG_FAIL_FMT
Definition internal_logger.h:16
#define DISPATCHER_SET_MESSAGE_HANDLER(DISP, MSG,...)
Definition messaging.h:316
std::unique_ptr< KeyAesGcm > make_key_aes_gcm(std::span< const uint8_t > rawKey)
Free function implementation.
Definition symmetric_key.cpp:102
std::shared_ptr< Entropy > EntropyPtr
Definition entropy.h:32
HashBytes sha256(const std::span< uint8_t const > &data)
Definition hash.cpp:24
constexpr size_t GCM_DEFAULT_KEY_SIZE
Definition symmetric_key.h:12
Definition indexer_interface.h:14
std::string LFSKey
Definition lfs_interface.h:17
std::vector< uint8_t > LFSContents
Definition lfs_interface.h:19
std::shared_ptr< FetchResult > FetchResultPtr
Definition lfs_interface.h:37
std::vector< uint8_t > LFSEncryptedContents
Definition lfs_interface.h:18
uint8_t * key
Definition kv_helpers.h:80
std::mutex Mutex
Definition locking.h:12
Definition app_interface.h:14
std::shared_ptr< AbstractWriter > WriterPtr
Definition ring_buffer_types.h:154
void write(uint8_t *&data, size_t &size, const T &v)
Definition serialized.h:105
#define RINGBUFFER_WRITE_MESSAGE(MSG,...)
Definition ring_buffer_types.h:259
Definition symmetric_key.h:58
void deserialise(const std::vector< uint8_t > &serial)
Definition symmetric_key.cpp:93
std::vector< uint8_t > serialise()
Definition symmetric_key.cpp:78
StandardGcmHeader hdr
Definition symmetric_key.h:59
std::vector< uint8_t > cipher
Definition symmetric_key.h:60