Encryption Functions.
51937 {
51938 auto &
db = attached_db.GetDatabase();
51939 data_ptr_t block_offset_internal = temp_buffer_manager.InternalBuffer();
51941 auto version = attached_db.GetStorageManager().GetEncryptionVersion();
51942 auto cipher = attached_db.GetStorageManager().GetCipher();
51944 auto encryption_state =
db.GetEncryptionUtil(attached_db.IsReadOnly())->CreateEncryptionState(std::move(metadata));
51945
51946 EncryptionTag tag;
51947 EncryptionNonce nonce(cipher, version);
51948 encryption_state->GenerateRandomData(nonce.data(), nonce.size());
51949
51951 memcpy(block_offset_internal, nonce.data(), nonce.size());
51952 encryption_state->InitializeEncryption(nonce, encrypt_key);
51953
51954 auto checksum_offset = block.InternalBuffer() + delta;
51955 auto encryption_checksum_offset = block_offset_internal + delta;
51957
51959 auto aes_res = encryption_state->Process(checksum_offset, size, encryption_checksum_offset, size);
51960
51961 if (aes_res != size) {
51962 throw IOException("Block encryption failure: in- and output size differ (%llu/%llu)", size, aes_res);
51963 }
51964
51966 encryption_state->Finalize(block.InternalBuffer() + delta, 0, tag.data(), tag.size());
51967
51969 memcpy(block_offset_internal + nonce.size(), tag.data(), tag.size());
51970}
static const_data_ptr_t GetKeyFromCache(DatabaseInstance &db, const string &key_name)
General key management wrapper functions.
Definition duckdb.cpp:51888
GOpaque< Size > size(const GMat &src)
static constexpr idx_t DEFAULT_BLOCK_HEADER_SIZE
The default block header size for blocks written to storage.
Definition duckdb.hpp:9716