Skip to content

Commit 25c5bf8

Browse files
committed
Revirew fixes
1 parent 4f1e571 commit 25c5bf8

File tree

6 files changed

+57
-2
lines changed

6 files changed

+57
-2
lines changed

contrib/pg_tde/src/include/keyring/keyring_api.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ typedef enum ProviderType
1515

1616
#define TDE_KEY_NAME_LEN 256
1717
#define MAX_KEY_DATA_SIZE 32 /* maximum 256 bit encryption */
18+
#define MIN_KEY_DATA_SIZE 16 /* minimum 128 bit encryption */
1819
#define INTERNAL_KEY_LEN 16
1920

2021
typedef struct KeyData

contrib/pg_tde/src/keyring/keyring_api.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,17 @@ ValidateKey(KeyInfo *key)
144144

145145
if (key->data.len > MAX_KEY_DATA_SIZE)
146146
{
147-
ereport(WARNING, errmsg("invalid key: data length exceeds maximum allowed size"));
147+
ereport(WARNING,
148+
errmsg("invalid key: data length \"%u\" exceeds maximum allowed size \"%d\"",
149+
key->data.len, MAX_KEY_DATA_SIZE));
150+
return false;
151+
}
152+
153+
if (key->data.len < MIN_KEY_DATA_SIZE)
154+
{
155+
ereport(WARNING,
156+
errmsg("invalid key: data length \"%u\" is less than minimum required size \"%d\"",
157+
key->data.len, MIN_KEY_DATA_SIZE));
148158
return false;
149159
}
150160

contrib/pg_tde/src/keyring/keyring_kmip.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,17 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode
175175
return NULL;
176176
}
177177

178+
if (key->data.len > sizeof(key->data.data))
179+
{
180+
ereport(WARNING, errmsg("keyring provider returned invalid key size: %d", key->data.len));
181+
*return_code = KEYRING_CODE_INVALID_KEY;
182+
pfree(key);
183+
BIO_free_all(ctx.bio);
184+
SSL_CTX_free(ctx.ssl);
185+
free(keyp);
186+
return NULL;
187+
}
188+
178189
memset(key->name, 0, sizeof(key->name));
179190
memcpy(key->name, key_name, strnlen(key_name, sizeof(key->name) - 1));
180191
memcpy(key->data.data, keyp, key->data.len);

contrib/pg_tde/src/keyring/keyring_vault.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,17 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode
273273
memcpy(key->name, key_name, strnlen(key_name, sizeof(key->name) - 1));
274274
key->data.len = pg_b64_decode(responseKey, strlen(responseKey), (char *) key->data.data, MAX_KEY_DATA_SIZE);
275275

276+
if (key->data.len > MAX_KEY_DATA_SIZE)
277+
{
278+
*return_code = KEYRING_CODE_INVALID_KEY;
279+
ereport(WARNING,
280+
errmsg("keyring provider \"%s\" returned invalid key size: %d",
281+
vault_keyring->keyring.provider_name, key->data.len));
282+
pfree(key);
283+
key = NULL;
284+
goto cleanup;
285+
}
286+
276287
cleanup:
277288
if (str.ptr != NULL)
278289
pfree(str.ptr);

contrib/pg_tde/t/expected/key_validation.out

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,21 @@ SELECT pg_tde_create_key_using_database_key_provider('key2', 'test-file-provider
1717

1818
(1 row)
1919

20+
SELECT pg_tde_create_key_using_database_key_provider('key3', 'test-file-provider');
21+
pg_tde_create_key_using_database_key_provider
22+
-----------------------------------------------
23+
24+
(1 row)
25+
2026
SELECT pg_tde_set_key_using_database_key_provider('key1', 'test-file-provider');
2127
psql:<stdin>:1: WARNING: invalid key: data length is zero
2228
psql:<stdin>:1: ERROR: failed to retrieve principal key "key1" from key provider "test-file-provider"
2329
DETAIL: Invalid key
2430
SELECT pg_tde_set_key_using_database_key_provider('key2', 'test-file-provider');
25-
psql:<stdin>:1: WARNING: invalid key: data length exceeds maximum allowed size
31+
psql:<stdin>:1: WARNING: invalid key: data length "4294967295" exceeds maximum allowed size "32"
2632
psql:<stdin>:1: ERROR: failed to retrieve principal key "key2" from key provider "test-file-provider"
2733
DETAIL: Invalid key
34+
SELECT pg_tde_set_key_using_database_key_provider('key3', 'test-file-provider');
35+
psql:<stdin>:1: WARNING: invalid key: data length "15" is less than minimum required size "16"
36+
psql:<stdin>:1: ERROR: failed to retrieve principal key "key3" from key provider "test-file-provider"
37+
DETAIL: Invalid key

contrib/pg_tde/t/key_validation.pl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
PGTDE::psql($node, 'postgres',
2828
"SELECT pg_tde_create_key_using_database_key_provider('key2', 'test-file-provider');"
2929
);
30+
PGTDE::psql($node, 'postgres',
31+
"SELECT pg_tde_create_key_using_database_key_provider('key3', 'test-file-provider');"
32+
);
3033

3134

3235
corrupt_key_file('/tmp/pg_tde_test_key_validation.per');
@@ -38,6 +41,9 @@
3841
PGTDE::psql($node, 'postgres',
3942
"SELECT pg_tde_set_key_using_database_key_provider('key2', 'test-file-provider');"
4043
);
44+
PGTDE::psql($node, 'postgres',
45+
"SELECT pg_tde_set_key_using_database_key_provider('key3', 'test-file-provider');"
46+
);
4147

4248
sub corrupt_key_file
4349
{
@@ -60,6 +66,12 @@ sub corrupt_key_file
6066
or BAIL_OUT("sysseek failed: $!");
6167
syswrite($fh, pack("L*", 0xFFFFFFFF)) or BAIL_OUT("syswrite failed: $!");
6268

69+
# Corrupt the third page of the key file by setting key data length below minimum.
70+
# Offset is TDE_KEY_NAME_LEN + MAX_KEY_DATA_SIZE. See keyring_api.h for details.
71+
sysseek($fh, 256 + 32, SEEK_CUR)
72+
or BAIL_OUT("sysseek failed: $!");
73+
syswrite($fh, pack("L*", 0x0000000F)) or BAIL_OUT("syswrite failed: $!");
74+
6375
close($fh)
6476
or BAIL_OUT("close failed: $!");
6577
}

0 commit comments

Comments
 (0)