Remove some unused fields from InternalKey

Add them as unused fields in the TDEMapEntry structure however, so we
do not affect existing key files.
pull/238/head
Anders Åstrand 1 month ago committed by AndersAstrand
parent 8d7192cdba
commit 87c55e6690
  1. 32
      contrib/pg_tde/src/access/pg_tde_tdemap.c
  2. 5
      contrib/pg_tde/src/encryption/enc_tde.c
  3. 3
      contrib/pg_tde/src/include/access/pg_tde_tdemap.h
  4. 2
      contrib/pg_tde/src/include/encryption/enc_tde.h
  5. 4
      contrib/pg_tde/src/smgr/pg_tde_smgr.c

@ -56,7 +56,25 @@ typedef struct TDEMapEntry
Oid spcOid;
RelFileNumber relNumber;
uint32 type;
InternalKey enc_key;
/*
* This anonymous struct is here to ensure the same alignment as before
* the unused fields were removed from InternalKey.
*/
struct
{
InternalKey enc_key;
/*
* These fields were added here to keep the file format the same after
* some fields were removed from InternalKey. Feel free to use them
* for something, but beware that existing files may contain
* unexpected values here.
*/
uint32 _unused1; /* Will be 1 in existing files entries. */
uint64 _unused2; /* Will be 0 in existing files entries. */
};
/* IV and tag used when encrypting the key itself */
unsigned char entry_iv[MAP_ENTRY_IV_SIZE];
unsigned char aead_tag[MAP_ENTRY_AEAD_TAG_SIZE];
@ -210,9 +228,6 @@ pg_tde_free_key_map_entry(const RelFileLocator rlocator)
{
TDEMapEntry empty_map_entry = {
.type = MAP_ENTRY_EMPTY,
.enc_key = {
.type = MAP_ENTRY_EMPTY,
},
};
pg_tde_write_one_map_entry(map_fd, &empty_map_entry, &prev_pos, db_map_path);
@ -407,9 +422,16 @@ pg_tde_initialize_map_entry(TDEMapEntry *map_entry, const TDEPrincipalKey *princ
{
map_entry->spcOid = rlocator->spcOid;
map_entry->relNumber = rlocator->relNumber;
map_entry->type = rel_key_data->type;
map_entry->type = TDE_KEY_TYPE_SMGR;
map_entry->enc_key = *rel_key_data;
/*
* We set these fields here so that existing file entries will be
* consistent and future use of these fields easier.
*/
map_entry->_unused1 = 1;
map_entry->_unused2 = 0;
if (!RAND_bytes(map_entry->entry_iv, MAP_ENTRY_IV_SIZE))
ereport(ERROR,
errcode(ERRCODE_INTERNAL_ERROR),

@ -27,11 +27,8 @@ iv_prefix_debug(const char *iv_prefix, char *out_hex)
#endif
void
pg_tde_generate_internal_key(InternalKey *int_key, TDEMapEntryType entry_type)
pg_tde_generate_internal_key(InternalKey *int_key)
{
int_key->type = entry_type;
int_key->start_lsn = InvalidXLogRecPtr;
if (!RAND_bytes(int_key->key, INTERNAL_KEY_LEN))
ereport(ERROR,
errcode(ERRCODE_INTERNAL_ERROR),

@ -22,9 +22,6 @@ typedef struct InternalKey
{
uint8 key[INTERNAL_KEY_LEN];
uint8 base_iv[INTERNAL_KEY_IV_LEN];
uint32 type;
XLogRecPtr start_lsn;
} InternalKey;
#define MAP_ENTRY_IV_SIZE 16

@ -7,7 +7,7 @@
#include "access/pg_tde_tdemap.h"
extern void pg_tde_generate_internal_key(InternalKey *int_key, TDEMapEntryType entry_type);
extern void pg_tde_generate_internal_key(InternalKey *int_key);
extern void pg_tde_stream_crypt(const char *iv_prefix,
uint32 start_offset,
const char *data,

@ -75,7 +75,7 @@ tde_smgr_create_key(const RelFileLocatorBackend *smgr_rlocator)
{
InternalKey *key = palloc_object(InternalKey);
pg_tde_generate_internal_key(key, TDE_KEY_TYPE_SMGR);
pg_tde_generate_internal_key(key);
if (RelFileLocatorBackendIsTemp(*smgr_rlocator))
tde_smgr_save_temp_key(&smgr_rlocator->locator, key);
@ -105,7 +105,7 @@ tde_smgr_create_key_redo(const RelFileLocator *rlocator)
if (pg_tde_has_smgr_key(*rlocator))
return;
pg_tde_generate_internal_key(&key, TDE_KEY_TYPE_SMGR);
pg_tde_generate_internal_key(&key);
pg_tde_save_smgr_key(*rlocator, &key);
}

Loading…
Cancel
Save