summaryrefslogtreecommitdiffstats
path: root/contrib/pgcrypto/sql/pgp-compression.sql
blob: 87c59c6cabc4e7f380992c28625b12e662e1722b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
--
-- PGP compression support
--

select pgp_sym_decrypt(dearmor('
-----BEGIN PGP MESSAGE-----

ww0ECQMCsci6AdHnELlh0kQB4jFcVwHMJg0Bulop7m3Mi36s15TAhBo0AnzIrRFrdLVCkKohsS6+
DMcmR53SXfLoDJOv/M8uKj3QSq7oWNIp95pxfA==
=tbSn
-----END PGP MESSAGE-----
'), 'key', 'expect-compress-algo=1');

select pgp_sym_decrypt(
	pgp_sym_encrypt('Secret message', 'key', 'compress-algo=0'),
	'key', 'expect-compress-algo=0');

select pgp_sym_decrypt(
	pgp_sym_encrypt('Secret message', 'key', 'compress-algo=1'),
	'key', 'expect-compress-algo=1');

select pgp_sym_decrypt(
	pgp_sym_encrypt('Secret message', 'key', 'compress-algo=2'),
	'key', 'expect-compress-algo=2');

-- level=0 should turn compression off
select pgp_sym_decrypt(
	pgp_sym_encrypt('Secret message', 'key',
			'compress-algo=2, compress-level=0'),
	'key', 'expect-compress-algo=0');

-- check corner case involving an input string of 16kB, as per bug #16476.
SELECT setseed(0);
WITH random_string AS
(
  -- This generates a random string of 16366 bytes.  This is chosen
  -- as random so that it does not get compressed, and the decompression
  -- would work on a string with the same length as the origin, making the
  -- test behavior more predictible.  lpad() ensures that the generated
  -- hexadecimal value is completed by extra zero characters if random()
  -- has generated a value strictly lower than 16.
  SELECT string_agg(decode(lpad(to_hex((random()*256)::int), 2, '0'), 'hex'), '') as bytes
    FROM generate_series(0, 16365)
)
SELECT bytes =
    pgp_sym_decrypt_bytea(
      pgp_sym_encrypt_bytea(bytes, 'key',
                            'compress-algo=1,compress-level=1'),
                            'key', 'expect-compress-algo=1')
    AS is_same
  FROM random_string;