1--
2-- Tests for password types
3--
4
5-- Tests for GUC password_encryption
6SET password_encryption = 'novalue'; -- error
7SET password_encryption = true; -- error
8SET password_encryption = 'md5'; -- ok
9SET password_encryption = 'scram-sha-256'; -- ok
10
11-- consistency of password entries
12SET password_encryption = 'md5';
13CREATE ROLE regress_passwd1 PASSWORD 'role_pwd1';
14CREATE ROLE regress_passwd2 PASSWORD 'role_pwd2';
15SET password_encryption = 'scram-sha-256';
16CREATE ROLE regress_passwd3 PASSWORD 'role_pwd3';
17CREATE ROLE regress_passwd4 PASSWORD NULL;
18
19-- check list of created entries
20--
21-- The scram secret will look something like:
22-- SCRAM-SHA-256$4096:E4HxLGtnRzsYwg==$6YtlR4t69SguDiwFvbVgVZtuz6gpJQQqUMZ7IQJK5yI=:ps75jrHeYU4lXCcXI4O8oIdJ3eO8o2jirjruw9phBTo=
23--
24-- Since the salt is random, the exact value stored will be different on every test
25-- run. Use a regular expression to mask the changing parts.
26SELECT rolname, regexp_replace(rolpassword, '(SCRAM-SHA-256)\$(\d+):([a-zA-Z0-9+/=]+)\$([a-zA-Z0-9+=/]+):([a-zA-Z0-9+/=]+)', '\1$\2:<salt>$<storedkey>:<serverkey>') as rolpassword_masked
27    FROM pg_authid
28    WHERE rolname LIKE 'regress_passwd%'
29    ORDER BY rolname, rolpassword;
30
31-- Rename a role
32ALTER ROLE regress_passwd2 RENAME TO regress_passwd2_new;
33-- md5 entry should have been removed
34SELECT rolname, rolpassword
35    FROM pg_authid
36    WHERE rolname LIKE 'regress_passwd2_new'
37    ORDER BY rolname, rolpassword;
38ALTER ROLE regress_passwd2_new RENAME TO regress_passwd2;
39
40-- Change passwords with ALTER USER. With plaintext or already-encrypted
41-- passwords.
42SET password_encryption = 'md5';
43
44-- encrypt with MD5
45ALTER ROLE regress_passwd2 PASSWORD 'foo';
46-- already encrypted, use as they are
47ALTER ROLE regress_passwd1 PASSWORD 'md5cd3578025fe2c3d7ed1b9a9b26238b70';
48ALTER ROLE regress_passwd3 PASSWORD 'SCRAM-SHA-256$4096:VLK4RMaQLCvNtQ==$6YtlR4t69SguDiwFvbVgVZtuz6gpJQQqUMZ7IQJK5yI=:ps75jrHeYU4lXCcXI4O8oIdJ3eO8o2jirjruw9phBTo=';
49
50SET password_encryption = 'scram-sha-256';
51-- create SCRAM secret
52ALTER ROLE  regress_passwd4 PASSWORD 'foo';
53-- already encrypted with MD5, use as it is
54CREATE ROLE regress_passwd5 PASSWORD 'md5e73a4b11df52a6068f8b39f90be36023';
55
56-- This looks like a valid SCRAM-SHA-256 secret, but it is not
57-- so it should be hashed with SCRAM-SHA-256.
58CREATE ROLE regress_passwd6 PASSWORD 'SCRAM-SHA-256$1234';
59-- These may look like valid MD5 secrets, but they are not, so they
60-- should be hashed with SCRAM-SHA-256.
61-- trailing garbage at the end
62CREATE ROLE regress_passwd7 PASSWORD 'md5012345678901234567890123456789zz';
63-- invalid length
64CREATE ROLE regress_passwd8 PASSWORD 'md501234567890123456789012345678901zz';
65
66SELECT rolname, regexp_replace(rolpassword, '(SCRAM-SHA-256)\$(\d+):([a-zA-Z0-9+/=]+)\$([a-zA-Z0-9+=/]+):([a-zA-Z0-9+/=]+)', '\1$\2:<salt>$<storedkey>:<serverkey>') as rolpassword_masked
67    FROM pg_authid
68    WHERE rolname LIKE 'regress_passwd%'
69    ORDER BY rolname, rolpassword;
70
71-- An empty password is not allowed, in any form
72CREATE ROLE regress_passwd_empty PASSWORD '';
73ALTER ROLE regress_passwd_empty PASSWORD 'md585939a5ce845f1a1b620742e3c659e0a';
74ALTER ROLE regress_passwd_empty PASSWORD 'SCRAM-SHA-256$4096:hpFyHTUsSWcR7O9P$LgZFIt6Oqdo27ZFKbZ2nV+vtnYM995pDh9ca6WSi120=:qVV5NeluNfUPkwm7Vqat25RjSPLkGeoZBQs6wVv+um4=';
75SELECT rolpassword FROM pg_authid WHERE rolname='regress_passwd_empty';
76
77-- Test with invalid stored and server keys.
78--
79-- The first is valid, to act as a control. The others have too long
80-- stored/server keys. They will be re-hashed.
81CREATE ROLE regress_passwd_sha_len0 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96Rqw=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZI=';
82CREATE ROLE regress_passwd_sha_len1 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96RqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZI=';
83CREATE ROLE regress_passwd_sha_len2 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96Rqw=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';
84
85-- Check that the invalid secrets were re-hashed. A re-hashed secret
86-- should not contain the original salt.
87SELECT rolname, rolpassword not like '%A6xHKoH/494E941doaPOYg==%' as is_rolpassword_rehashed
88    FROM pg_authid
89    WHERE rolname LIKE 'regress_passwd_sha_len%'
90    ORDER BY rolname;
91
92DROP ROLE regress_passwd1;
93DROP ROLE regress_passwd2;
94DROP ROLE regress_passwd3;
95DROP ROLE regress_passwd4;
96DROP ROLE regress_passwd5;
97DROP ROLE regress_passwd6;
98DROP ROLE regress_passwd7;
99DROP ROLE regress_passwd8;
100DROP ROLE regress_passwd_empty;
101DROP ROLE regress_passwd_sha_len0;
102DROP ROLE regress_passwd_sha_len1;
103DROP ROLE regress_passwd_sha_len2;
104
105-- all entries should have been removed
106SELECT rolname, rolpassword
107    FROM pg_authid
108    WHERE rolname LIKE 'regress_passwd%'
109    ORDER BY rolname, rolpassword;
110