On 11/16/22 10:09 PM, Michael Paquier wrote:
On Thu, Nov 10, 2022 at 11:14:34PM -0500, Jonathan S. Katz wrote:On 10/31/22 8:56 PM, Michael Paquier wrote:Well, one could pass a salt based on something generated by random() to emulate what we currently do in the default case, as well. The salt length is an extra possibility, letting it be randomly generated by pg_strong_random().Sure, this is a good point. From a SQL level we can get that from pgcrypto "gen_random_bytes".Could it be something we could just push into core? FWIW, I've used that quite a bit in the last to cheaply build long random strings of data for other things. Without pgcrypto, random() with generate_series() has always been kind of.. fun.
I would be a +1 for moving that into core, given we did something similar with gen_random_uuid[1]. Separate patch, of course :)
+SELECT scram_build_secret_sha256(NULL); +ERROR: password must not be null +SELECT scram_build_secret_sha256(NULL, NULL); +ERROR: password must not be null +SELECT scram_build_secret_sha256(NULL, NULL, NULL); +ERROR: password must not be null This is just testing three times the same thing as per the defaults. I would cut the second and third cases.
AFAICT it's not returning the defaults. Quick other example:CREATE FUNCTION ab (a int DEFAULT 0) RETURNS int AS $$ SELECT a; $$ LANGUAGE SQL;
SELECT ab(); ab ---- 0 (1 row) SELECT ab(NULL::int); ab ---- (1 row)Given scram_build_secret_sha256 is not a strict function, I'd prefer to test all of the NULL cases in case anything in the underlying code changes in the future. It's a cheap cost to be a bit more careful.
git diff --check reports some whitespaces.
Ack. Will fix on the next pass. (I've been transitioning editors, which could have resulted in that),
scram_build_secret_sha256_internal() is missing SASLprep on the password string. Perhaps the best thing to do here is just to extend pg_be_scram_build_secret() with more arguments so as callers can optionally pass down a custom salt with its length, leaving the responsibility to pg_be_scram_build_secret() to create a random salt if nothing has been given?
Ah, good catch!I think if we go with passing down the salt, we'd also have to allow for the passing down of the iterations, too, and we're close to rebuilding "scram_build_secret". I'll stare a bit at this on the next pass and either 1/ just SASLprep the string in the new "scram_build_secret_sha256_internal" func, or 2/ change the definition of "pg_be_scram_build_secret" to accommodate more overrides.
Thanks, Jonathan [1] https://www.postgresql.org/docs/current/functions-uuid.html
OpenPGP_signature
Description: OpenPGP digital signature