From 87c55e6690a05b1715fadd4cdbb63ce3dee06b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20=C3=85strand?= Date: Thu, 7 Aug 2025 14:13:12 +0200 Subject: [PATCH] Remove some unused fields from InternalKey Add them as unused fields in the TDEMapEntry structure however, so we do not affect existing key files. --- contrib/pg_tde/src/access/pg_tde_tdemap.c | 32 ++++++++++++++++--- contrib/pg_tde/src/encryption/enc_tde.c | 5 +-- .../pg_tde/src/include/access/pg_tde_tdemap.h | 3 -- .../pg_tde/src/include/encryption/enc_tde.h | 2 +- contrib/pg_tde/src/smgr/pg_tde_smgr.c | 4 +-- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/contrib/pg_tde/src/access/pg_tde_tdemap.c b/contrib/pg_tde/src/access/pg_tde_tdemap.c index 096d3a6fa2b..584dd9f1e44 100644 --- a/contrib/pg_tde/src/access/pg_tde_tdemap.c +++ b/contrib/pg_tde/src/access/pg_tde_tdemap.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), diff --git a/contrib/pg_tde/src/encryption/enc_tde.c b/contrib/pg_tde/src/encryption/enc_tde.c index 4c783c68f8a..bceaaf7cf8b 100644 --- a/contrib/pg_tde/src/encryption/enc_tde.c +++ b/contrib/pg_tde/src/encryption/enc_tde.c @@ -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), diff --git a/contrib/pg_tde/src/include/access/pg_tde_tdemap.h b/contrib/pg_tde/src/include/access/pg_tde_tdemap.h index ed39c5af846..8c8781380d7 100644 --- a/contrib/pg_tde/src/include/access/pg_tde_tdemap.h +++ b/contrib/pg_tde/src/include/access/pg_tde_tdemap.h @@ -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 diff --git a/contrib/pg_tde/src/include/encryption/enc_tde.h b/contrib/pg_tde/src/include/encryption/enc_tde.h index dfb6cbbb0da..7873606d61d 100644 --- a/contrib/pg_tde/src/include/encryption/enc_tde.h +++ b/contrib/pg_tde/src/include/encryption/enc_tde.h @@ -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, diff --git a/contrib/pg_tde/src/smgr/pg_tde_smgr.c b/contrib/pg_tde/src/smgr/pg_tde_smgr.c index d2e44e8dd29..939b4ea552d 100644 --- a/contrib/pg_tde/src/smgr/pg_tde_smgr.c +++ b/contrib/pg_tde/src/smgr/pg_tde_smgr.c @@ -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); }