Autonomy Software C++ 24.5.1
Welcome to the Autonomy Software repository of the Mars Rover Design Team (MRDT) at Missouri University of Science and Technology (Missouri S&T)! API reference contains the source code and other resources for the development of the autonomy software for our Mars rover. The Autonomy Software project aims to compete in the University Rover Challenge (URC) by demonstrating advanced autonomous capabilities and robust navigation algorithms.
Loading...
Searching...
No Matches
duckdb::EncryptionKeyManager Class Reference
Inheritance diagram for duckdb::EncryptionKeyManager:
Collaboration diagram for duckdb::EncryptionKeyManager:

Public Member Functions

void AddKey (const string &key_name, data_ptr_t key)
 
bool HasKey (const string &key_name) const
 
void DeleteKey (const string &key_name)
 
void ClearKey (const string &key_name)
 
void EraseKey (const string &key_name)
 
const_data_ptr_t GetKey (const string &key_name) const
 
string GetObjectType () override
 
optional_idx GetEstimatedCacheMemory () const override
 

Static Public Member Functions

static EncryptionKeyManagerGetInternal (ObjectCache &cache)
 
static EncryptionKeyManagerGet (ClientContext &context)
 
static EncryptionKeyManagerGet (DatabaseInstance &db)
 
static string ObjectType ()
 
static void DeriveKey (string &user_key, data_ptr_t salt, data_ptr_t derived_key)
 
static void KeyDerivationFunctionSHA256 (const_data_ptr_t user_key, idx_t user_key_size, data_ptr_t salt, data_ptr_t derived_key)
 
static void KeyDerivationFunctionSHA256 (data_ptr_t user_key, idx_t user_key_size, data_ptr_t salt, data_ptr_t derived_key)
 
static string Base64Decode (const string &key)
 
static string GenerateRandomKeyID ()
 Generate a (non-cryptographically secure) random key ID.
 

Static Public Attributes

static constexpr idx_t KEY_ID_BYTES = 8
 constants
 
static constexpr idx_t DERIVED_KEY_LENGTH = 32
 

Private Attributes

mutex lock
 
std::unordered_map< std::string, EncryptionKeyderived_keys
 

Member Function Documentation

◆ GetInternal()

EncryptionKeyManager & duckdb::EncryptionKeyManager::GetInternal ( ObjectCache cache)
static
52153 {
52154 return *cache.GetOrCreate<EncryptionKeyManager>(EncryptionKeyManager::ObjectType());
52155}

◆ Get() [1/2]

EncryptionKeyManager & duckdb::EncryptionKeyManager::Get ( ClientContext context)
static
52157 {
52158 auto &cache = ObjectCache::GetObjectCache(context);
52159 return GetInternal(cache);
52160}

◆ Get() [2/2]

EncryptionKeyManager & duckdb::EncryptionKeyManager::Get ( DatabaseInstance db)
static
52162 {
52163 auto &cache = db.GetObjectCache();
52164 return GetInternal(cache);
52165}
db

◆ AddKey()

void duckdb::EncryptionKeyManager::AddKey ( const string &  key_name,
data_ptr_t  key 
)
52175 {
52176 lock_guard<mutex> guard(lock);
52177 derived_keys.emplace(key_name, EncryptionKey(key));
52178 // Zero-out the input encryption key
52179 duckdb_mbedtls::MbedTlsWrapper::AESStateMBEDTLS::SecureClearData(key, DERIVED_KEY_LENGTH);
52180}

◆ HasKey()

bool duckdb::EncryptionKeyManager::HasKey ( const string &  key_name) const
52182 {
52183 lock_guard<mutex> guard(lock);
52184 return derived_keys.find(key_name) != derived_keys.end();
52185}

◆ DeleteKey()

void duckdb::EncryptionKeyManager::DeleteKey ( const string &  key_name)
52193 {
52194 lock_guard<mutex> guard(lock);
52195 ClearKey(key_name);
52196 EraseKey(key_name);
52197}

◆ ClearKey()

void duckdb::EncryptionKeyManager::ClearKey ( const string &  key_name)
52199 {
52200 D_ASSERT(HasKey(key_name));
52201 auto const key_data = derived_keys.at(key_name).GetData();
52202 // clear the key (zero-out its memory)
52203 duckdb_mbedtls::MbedTlsWrapper::AESStateMBEDTLS::SecureClearData(key_data,
52205}
static constexpr uint64_t DEFAULT_ENCRYPTION_KEY_LENGTH
The encryption key length.
Definition duckdb.hpp:9749

◆ EraseKey()

void duckdb::EncryptionKeyManager::EraseKey ( const string &  key_name)
52207 {
52208 derived_keys.erase(key_name);
52209}

◆ GetKey()

const_data_ptr_t duckdb::EncryptionKeyManager::GetKey ( const string &  key_name) const
52187 {
52188 D_ASSERT(HasKey(key_name));
52189 lock_guard<mutex> guard(lock);
52190 return derived_keys.at(key_name).GetPtr();
52191}

◆ ObjectType()

string duckdb::EncryptionKeyManager::ObjectType ( )
static
52255 {
52256 return "encryption_keys";
52257}

◆ GetObjectType()

string duckdb::EncryptionKeyManager::GetObjectType ( )
overridevirtual

Implements duckdb::ObjectCacheEntry.

52259 {
52260 return ObjectType();
52261}

◆ GetEstimatedCacheMemory()

optional_idx duckdb::EncryptionKeyManager::GetEstimatedCacheMemory ( ) const
inlineoverridevirtual

Get the rough cache memory usage in bytes for this entry. Used for eviction decisions. Return invalid index to prevent eviction.

Implements duckdb::ObjectCacheEntry.

51759 {
51760 return optional_idx {};
51761 }

◆ DeriveKey()

void duckdb::EncryptionKeyManager::DeriveKey ( string &  user_key,
data_ptr_t  salt,
data_ptr_t  derived_key 
)
static

Key is base64 encoded

Todo; check if valid utf-8

52234 {
52235 string decoded_key;
52236
52237 try {
52239 decoded_key = Base64Decode(user_key);
52240 } catch (const ConversionException &e) {
52242 decoded_key = user_key;
52243 }
52244
52245 KeyDerivationFunctionSHA256(reinterpret_cast<const_data_ptr_t>(decoded_key.data()), decoded_key.size(), salt,
52246 derived_key);
52247
52248 duckdb_mbedtls::MbedTlsWrapper::AESStateMBEDTLS::SecureClearData(data_ptr_cast(&user_key[0]), user_key.size());
52249 duckdb_mbedtls::MbedTlsWrapper::AESStateMBEDTLS::SecureClearData(data_ptr_cast(&decoded_key[0]),
52250 decoded_key.size());
52251 user_key.clear();
52252 decoded_key.clear();
52253}
static void KeyDerivationFunctionSHA256(const_data_ptr_t user_key, idx_t user_key_size, data_ptr_t salt, data_ptr_t derived_key)
Definition duckdb.cpp:52211
Here is the call graph for this function:

◆ KeyDerivationFunctionSHA256() [1/2]

void duckdb::EncryptionKeyManager::KeyDerivationFunctionSHA256 ( const_data_ptr_t  user_key,
idx_t  user_key_size,
data_ptr_t  salt,
data_ptr_t  derived_key 
)
static

For now, we are only using SHA256 for key derivation

52212 {
52215 state.AddSalt(salt, MainHeader::DB_IDENTIFIER_LEN);
52216 state.AddBytes(key, key_size);
52217 state.FinalizeDerivedKey(derived_key);
52218}
static constexpr idx_t DB_IDENTIFIER_LEN
The length of the unique database identifier.
Definition duckdb.hpp:9763
Here is the caller graph for this function:

◆ KeyDerivationFunctionSHA256() [2/2]

void duckdb::EncryptionKeyManager::KeyDerivationFunctionSHA256 ( data_ptr_t  user_key,
idx_t  user_key_size,
data_ptr_t  salt,
data_ptr_t  derived_key 
)
static
52221 {
52222 KeyDerivationFunctionSHA256(reinterpret_cast<const_data_ptr_t>(user_key), user_key_size, salt, derived_key);
52223}

◆ Base64Decode()

string duckdb::EncryptionKeyManager::Base64Decode ( const string &  key)
static
52225 {
52226 auto result_size = Blob::FromBase64Size(key);
52227 auto output = duckdb::unique_ptr<unsigned char[]>(new unsigned char[result_size]);
52228 Blob::FromBase64(key, output.get(), result_size);
52229 string decoded_key(reinterpret_cast<const char *>(output.get()), result_size);
52230 duckdb_mbedtls::MbedTlsWrapper::AESStateMBEDTLS::SecureClearData(output.get(), result_size);
52231 return decoded_key;
52232}
static DUCKDB_API idx_t FromBase64Size(string_t str)
Returns the string size of a base64 string -> blob conversion.
Definition duckdb.hpp:960

◆ GenerateRandomKeyID()

string duckdb::EncryptionKeyManager::GenerateRandomKeyID ( )
static

Generate a (non-cryptographically secure) random key ID.

52167 {
52168 uint8_t key_id[KEY_ID_BYTES];
52169 RandomEngine engine;
52170 engine.RandomData(key_id, KEY_ID_BYTES);
52171 string key_id_str(reinterpret_cast<const char *>(key_id), KEY_ID_BYTES);
52172 return key_id_str;
52173}
static constexpr idx_t KEY_ID_BYTES
constants
Definition duckdb.cpp:51777
::uint8_t uint8_t

The documentation for this class was generated from the following file: