PostgreSQL Source Code: src/common/scram-common.c File Reference (original) (raw)
212{
216 char *result;
217 char *p;
218 int maxlen;
219 int encoded_salt_len;
220 int encoded_stored_len;
221 int encoded_server_len;
222 int encoded_result;
223
224
226
228
229
232 salted_password, errstr) < 0 ||
234 stored_key, errstr) < 0 ||
235 scram_H(stored_key, hash_type, key_length,
236 stored_key, errstr) < 0 ||
238 server_key, errstr) < 0)
239 {
240
241#ifdef FRONTEND
242 return NULL;
243#else
244 elog(ERROR, "could not calculate stored key and server key: %s",
245 *errstr);
246#endif
247 }
248
249
250
251
252
253
257
258 maxlen = strlen("SCRAM-SHA-256") + 1
259 + 10 + 1
260 + encoded_salt_len + 1
261 + encoded_stored_len + 1
262 + encoded_server_len + 1;
263
264#ifdef FRONTEND
265 result = malloc(maxlen);
266 if (!result)
267 {
268 *errstr = _("out of memory");
269 return NULL;
270 }
271#else
272 result = palloc(maxlen);
273#endif
274
276
277
278 encoded_result = pg_b64_encode(salt, saltlen, p, encoded_salt_len);
279 if (encoded_result < 0)
280 {
281 *errstr = _("could not encode salt");
282#ifdef FRONTEND
283 free(result);
284 return NULL;
285#else
287#endif
288 }
289 p += encoded_result;
290 *(p++) = '$';
291
292
293 encoded_result = pg_b64_encode(stored_key, key_length, p,
294 encoded_stored_len);
295 if (encoded_result < 0)
296 {
297 *errstr = _("could not encode stored key");
298#ifdef FRONTEND
299 free(result);
300 return NULL;
301#else
303#endif
304 }
305
306 p += encoded_result;
307 *(p++) = ':';
308
309
310 encoded_result = pg_b64_encode(server_key, key_length, p,
311 encoded_server_len);
312 if (encoded_result < 0)
313 {
314 *errstr = _("could not encode server key");
315#ifdef FRONTEND
316 free(result);
317 return NULL;
318#else
320#endif
321 }
322
323 p += encoded_result;
324 *(p++) = '\0';
325
326 Assert(p - result <= maxlen);
327
328 return result;
329}
int pg_b64_enc_len(int srclen)
int pg_b64_encode(const uint8 *src, int len, char *dst, int dstlen)
Assert(PointerIsAligned(start, uint64))
int scram_ServerKey(const uint8 *salted_password, pg_cryptohash_type hash_type, int key_length, uint8 *result, const char **errstr)
int scram_SaltedPassword(const char *password, pg_cryptohash_type hash_type, int key_length, const uint8 *salt, int saltlen, int iterations, uint8 *result, const char **errstr)
int scram_ClientKey(const uint8 *salted_password, pg_cryptohash_type hash_type, int key_length, uint8 *result, const char **errstr)
int scram_H(const uint8 *input, pg_cryptohash_type hash_type, int key_length, uint8 *result, const char **errstr)
#define SCRAM_MAX_KEY_LEN