mirror of https://github.com/postgres/postgres
Check that key that we retreived from key provider is valid.pull/238/head
parent
c8bfe692c7
commit
9d42b12df9
@ -0,0 +1,27 @@ |
||||
CREATE EXTENSION pg_tde; |
||||
SELECT pg_tde_add_database_key_provider_file('test-file-provider', '/tmp/pg_tde_test_key_validation.per'); |
||||
pg_tde_add_database_key_provider_file |
||||
--------------------------------------- |
||||
|
||||
(1 row) |
||||
|
||||
SELECT pg_tde_create_key_using_database_key_provider('key1', 'test-file-provider'); |
||||
pg_tde_create_key_using_database_key_provider |
||||
----------------------------------------------- |
||||
|
||||
(1 row) |
||||
|
||||
SELECT pg_tde_create_key_using_database_key_provider('key2', 'test-file-provider'); |
||||
pg_tde_create_key_using_database_key_provider |
||||
----------------------------------------------- |
||||
|
||||
(1 row) |
||||
|
||||
SELECT pg_tde_set_key_using_database_key_provider('key1', 'test-file-provider'); |
||||
psql:<stdin>:1: WARNING: invalid key: data length is zero |
||||
psql:<stdin>:1: ERROR: failed to retrieve principal key "key1" from key provider "test-file-provider" |
||||
DETAIL: Invalid key |
||||
SELECT pg_tde_set_key_using_database_key_provider('key2', 'test-file-provider'); |
||||
psql:<stdin>:1: WARNING: invalid key: unsupported key length "4294967295" |
||||
psql:<stdin>:1: ERROR: failed to retrieve principal key "key2" from key provider "test-file-provider" |
||||
DETAIL: Invalid key |
@ -0,0 +1,77 @@ |
||||
#!/usr/bin/perl |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use File::Basename; |
||||
use Fcntl 'SEEK_CUR'; |
||||
use Test::More; |
||||
use lib 't'; |
||||
use pgtde; |
||||
|
||||
PGTDE::setup_files_dir(basename($0)); |
||||
|
||||
unlink('/tmp/pg_tde_test_key_validation.per'); |
||||
|
||||
my $node = PostgreSQL::Test::Cluster->new('main'); |
||||
$node->init; |
||||
$node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_tde'"); |
||||
$node->start; |
||||
|
||||
PGTDE::psql($node, 'postgres', 'CREATE EXTENSION pg_tde;'); |
||||
PGTDE::psql($node, 'postgres', |
||||
"SELECT pg_tde_add_database_key_provider_file('test-file-provider', '/tmp/pg_tde_test_key_validation.per');" |
||||
); |
||||
PGTDE::psql($node, 'postgres', |
||||
"SELECT pg_tde_create_key_using_database_key_provider('key1', 'test-file-provider');" |
||||
); |
||||
PGTDE::psql($node, 'postgres', |
||||
"SELECT pg_tde_create_key_using_database_key_provider('key2', 'test-file-provider');" |
||||
); |
||||
|
||||
|
||||
corrupt_key_file('/tmp/pg_tde_test_key_validation.per'); |
||||
|
||||
|
||||
PGTDE::psql($node, 'postgres', |
||||
"SELECT pg_tde_set_key_using_database_key_provider('key1', 'test-file-provider');" |
||||
); |
||||
PGTDE::psql($node, 'postgres', |
||||
"SELECT pg_tde_set_key_using_database_key_provider('key2', 'test-file-provider');" |
||||
); |
||||
|
||||
sub corrupt_key_file |
||||
{ |
||||
my ($keyfile) = @_; |
||||
|
||||
my $fh; |
||||
open($fh, '+<', $keyfile) |
||||
or BAIL_OUT("open failed: $!"); |
||||
binmode $fh; |
||||
|
||||
# Corrupt the first page of the key file by zeroing key data length. |
||||
# Offset is TDE_KEY_NAME_LEN + MAX_KEY_DATA_SIZE. See keyring_api.h for details. |
||||
sysseek($fh, 256 + 32, 0) |
||||
or BAIL_OUT("sysseek failed: $!"); |
||||
syswrite($fh, pack("L*", 0x00000000)) or BAIL_OUT("syswrite failed: $!"); |
||||
|
||||
# Corrupt the second page of the key file by setting incorrect key length. |
||||
# Offset is TDE_KEY_NAME_LEN + MAX_KEY_DATA_SIZE. See keyring_api.h for details. |
||||
sysseek($fh, 256 + 32, SEEK_CUR) |
||||
or BAIL_OUT("sysseek failed: $!"); |
||||
syswrite($fh, pack("L*", 0xFFFFFFFF)) or BAIL_OUT("syswrite failed: $!"); |
||||
|
||||
|
||||
close($fh) |
||||
or BAIL_OUT("close failed: $!"); |
||||
} |
||||
|
||||
$node->stop; |
||||
|
||||
# Compare the expected and out file |
||||
my $compare = PGTDE->compare_results(); |
||||
|
||||
is($compare, 0, |
||||
"Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." |
||||
); |
||||
|
||||
done_testing(); |
Loading…
Reference in new issue