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 auto data = (
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);
89 std::unordered_map<LFSKey, PendingResult>
pending;
101 std::vector<uint8_t> key_prefix(
sizeof(key.size()) + key.size());
102 auto data = key_prefix.data();
103 auto size = key_prefix.size();
105 contents.insert(contents.begin(), key_prefix.begin(), key_prefix.end());
116#ifdef PLAINTEXT_CACHE
138 dispatcher, LFSMsg::response, [
this](
const uint8_t* data,
size_t size) {
139 auto [obfuscated, encrypted] =
140 ringbuffer::read_message<LFSMsg::response>(data, size);
142 auto it =
pending.find(obfuscated);
145 auto result = it->second.lock();
146 if (result !=
nullptr)
150 const auto success = verify_and_decrypt(
153 std::move(encrypted),
163 "Cache was given invalid contents for {} (aka {})",
171 "Retained result for {} (aka {}) in state {}",
174 result->fetch_result);
180 "Received response for {}, but caller has already dropped "
189 "Ignoring response message for unrequested key {}", obfuscated);
196 [
this](
const uint8_t* data,
size_t size) {
198 ringbuffer::read_message<LFSMsg::not_found>(data, size);
200 auto it =
pending.find(obfuscated);
203 auto result = it->second.lock();
204 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
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 '{}'",
290 result = std::make_shared<FetchResult>();
296 result = std::make_shared<FetchResult>();
297 pending.emplace(obfuscated, result);
Definition symmetric_key.h:70
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:85
std::unique_ptr< ccf::crypto::KeyAesGcm > encryption_key
Definition enclave_lfs_access.h:95
std::weak_ptr< FetchResult > PendingResult
Definition enclave_lfs_access.h:87
EnclaveLFSAccess(const ringbuffer::WriterPtr &writer)
Definition enclave_lfs_access.h:124
void store(const LFSKey &key, LFSContents &&contents) override
Definition enclave_lfs_access.h:251
ringbuffer::WriterPtr to_host
Definition enclave_lfs_access.h:92
FetchResultPtr fetch(const LFSKey &key) override
Definition enclave_lfs_access.h:263
std::unordered_map< LFSKey, PendingResult > pending
Definition enclave_lfs_access.h:89
ccf::pal::Mutex pending_access
Definition enclave_lfs_access.h:90
ccf::crypto::EntropyPtr entropy_src
Definition enclave_lfs_access.h:94
void register_message_handlers(messaging::Dispatcher< ringbuffer::Message > &dispatcher)
Definition enclave_lfs_access.h:134
LFSEncryptedContents encrypt(const LFSKey &key, LFSContents &&contents)
Definition enclave_lfs_access.h:97
static LFSKey obfuscate_key(const LFSKey &key)
Definition enclave_lfs_access.h:240
Definition messaging.h:38
#define LOG_TRACE_FMT
Definition logger.h:356
#define LOG_FAIL_FMT
Definition logger.h:363
#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:33
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:78
std::mutex Mutex
Definition locking.h:12
Definition app_interface.h:14
std::shared_ptr< AbstractWriter > WriterPtr
Definition ring_buffer_types.h:150
void write(uint8_t *&data, size_t &size, const T &v)
Definition serialized.h:106
#define RINGBUFFER_WRITE_MESSAGE(MSG,...)
Definition ring_buffer_types.h:255
Definition symmetric_key.h:57
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:58
std::vector< uint8_t > cipher
Definition symmetric_key.h:59
@ Fetching
Definition lfs_interface.h:25
@ NotFound
Definition lfs_interface.h:27
@ Corrupt
Definition lfs_interface.h:28
@ Loaded
Definition lfs_interface.h:26