mirror of
https://github.com/postgres/postgres.git
synced 2025-06-26 12:21:12 +03:00
Add user-callable SHA-2 functions
Add the user-callable functions sha224, sha256, sha384, sha512. We already had these in the C code to support SCRAM, but there was no test coverage outside of the SCRAM tests. Adding these as user-callable functions allows writing some tests. Also, we have a user-callable md5 function but no more modern alternative, which led to wide use of md5 as a general-purpose hash function, which leads to occasional complaints about using md5. Also mark the existing md5 functions as leak-proof. Reviewed-by: Michael Paquier <michael@paquier.xyz>
This commit is contained in:
@ -22,7 +22,6 @@
|
||||
#include "catalog/pg_collation.h"
|
||||
#include "catalog/pg_type.h"
|
||||
#include "common/int.h"
|
||||
#include "common/md5.h"
|
||||
#include "lib/hyperloglog.h"
|
||||
#include "libpq/pqformat.h"
|
||||
#include "miscadmin.h"
|
||||
@ -4564,53 +4563,6 @@ to_hex64(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_TEXT_P(cstring_to_text(ptr));
|
||||
}
|
||||
|
||||
/*
|
||||
* Create an md5 hash of a text string and return it as hex
|
||||
*
|
||||
* md5 produces a 16 byte (128 bit) hash; double it for hex
|
||||
*/
|
||||
#define MD5_HASH_LEN 32
|
||||
|
||||
Datum
|
||||
md5_text(PG_FUNCTION_ARGS)
|
||||
{
|
||||
text *in_text = PG_GETARG_TEXT_PP(0);
|
||||
size_t len;
|
||||
char hexsum[MD5_HASH_LEN + 1];
|
||||
|
||||
/* Calculate the length of the buffer using varlena metadata */
|
||||
len = VARSIZE_ANY_EXHDR(in_text);
|
||||
|
||||
/* get the hash result */
|
||||
if (pg_md5_hash(VARDATA_ANY(in_text), len, hexsum) == false)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_OUT_OF_MEMORY),
|
||||
errmsg("out of memory")));
|
||||
|
||||
/* convert to text and return it */
|
||||
PG_RETURN_TEXT_P(cstring_to_text(hexsum));
|
||||
}
|
||||
|
||||
/*
|
||||
* Create an md5 hash of a bytea field and return it as a hex string:
|
||||
* 16-byte md5 digest is represented in 32 hex characters.
|
||||
*/
|
||||
Datum
|
||||
md5_bytea(PG_FUNCTION_ARGS)
|
||||
{
|
||||
bytea *in = PG_GETARG_BYTEA_PP(0);
|
||||
size_t len;
|
||||
char hexsum[MD5_HASH_LEN + 1];
|
||||
|
||||
len = VARSIZE_ANY_EXHDR(in);
|
||||
if (pg_md5_hash(VARDATA_ANY(in), len, hexsum) == false)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_OUT_OF_MEMORY),
|
||||
errmsg("out of memory")));
|
||||
|
||||
PG_RETURN_TEXT_P(cstring_to_text(hexsum));
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the size of a datum, possibly compressed
|
||||
*
|
||||
|
Reference in New Issue
Block a user