#include "pgsodium.h" PG_FUNCTION_INFO_V1 (pgsodium_crypto_generichash_keygen); Datum pgsodium_crypto_generichash_keygen (PG_FUNCTION_ARGS) { size_t result_size = VARHDRSZ + crypto_generichash_KEYBYTES; bytea *result = _pgsodium_zalloc_bytea (result_size); randombytes_buf (VARDATA (result), result_size); PG_RETURN_BYTEA_P (result); } PG_FUNCTION_INFO_V1 (pgsodium_crypto_generichash); Datum pgsodium_crypto_generichash (PG_FUNCTION_ARGS) { bytea *data; bytea *result; bytea *keyarg; unsigned char *key = NULL; size_t keylen = 0; size_t result_size; data = PG_GETARG_BYTEA_P (0); if (!PG_ARGISNULL (1)) { keyarg = PG_GETARG_BYTEA_P (1); key = PGSODIUM_UCHARDATA (keyarg); keylen = VARSIZE_ANY_EXHDR (keyarg); ERRORIF (keylen < crypto_generichash_KEYBYTES_MIN || keylen > crypto_generichash_KEYBYTES_MAX, "%s: invalid key"); } result_size = VARHDRSZ + crypto_generichash_BYTES; result = _pgsodium_zalloc_bytea (result_size); crypto_generichash (PGSODIUM_UCHARDATA (result), crypto_generichash_BYTES, PGSODIUM_UCHARDATA (data), VARSIZE_ANY_EXHDR (data), key, keylen); PG_RETURN_BYTEA_P (result); } PG_FUNCTION_INFO_V1 (pgsodium_crypto_shorthash_keygen); Datum pgsodium_crypto_shorthash_keygen (PG_FUNCTION_ARGS) { size_t result_size = VARHDRSZ + crypto_shorthash_KEYBYTES; bytea *result = _pgsodium_zalloc_bytea (result_size); crypto_secretbox_keygen (PGSODIUM_UCHARDATA (result)); PG_RETURN_BYTEA_P (result); } PG_FUNCTION_INFO_V1 (pgsodium_crypto_shorthash); Datum pgsodium_crypto_shorthash (PG_FUNCTION_ARGS) { bytea *data; bytea *result; bytea *key; int result_size = VARHDRSZ + crypto_shorthash_BYTES; data = PG_GETARG_BYTEA_P (0); key = PG_GETARG_BYTEA_P (1); ERRORIF (VARSIZE_ANY_EXHDR (key) != crypto_shorthash_KEYBYTES, "%s: invalid key"); result = _pgsodium_zalloc_bytea (result_size); crypto_shorthash (PGSODIUM_UCHARDATA (result), PGSODIUM_UCHARDATA (data), VARSIZE_ANY_EXHDR (data), PGSODIUM_UCHARDATA (key)); PG_RETURN_BYTEA_P (result); } PG_FUNCTION_INFO_V1 (pgsodium_crypto_generichash_by_id); Datum pgsodium_crypto_generichash_by_id (PG_FUNCTION_ARGS) { bytea *data; bytea *result; bytea *keyarg; bytea *context; unsigned char *key = NULL; size_t keylen = 0; size_t result_size; data = PG_GETARG_BYTEA_P (0); if (!PG_ARGISNULL (1)) { unsigned long long key_id = PG_GETARG_INT64 (1); context = PG_GETARG_BYTEA_P (2); keyarg = pgsodium_derive_helper (key_id, crypto_generichash_KEYBYTES, context); key = PGSODIUM_UCHARDATA (keyarg); keylen = VARSIZE_ANY_EXHDR (keyarg); ERRORIF (keylen < crypto_generichash_KEYBYTES_MIN || keylen > crypto_generichash_KEYBYTES_MAX, "%s: invalid key"); } result_size = VARHDRSZ + crypto_generichash_BYTES; result = _pgsodium_zalloc_bytea (result_size); crypto_generichash (PGSODIUM_UCHARDATA (result), crypto_generichash_BYTES, PGSODIUM_UCHARDATA (data), VARSIZE_ANY_EXHDR (data), key, keylen); PG_RETURN_BYTEA_P (result); } PG_FUNCTION_INFO_V1 (pgsodium_crypto_shorthash_by_id); Datum pgsodium_crypto_shorthash_by_id (PG_FUNCTION_ARGS) { bytea *data; bytea *result; bytea *key; bytea *context; uint64_t key_id; int result_size = VARHDRSZ + crypto_shorthash_BYTES; data = PG_GETARG_BYTEA_P (0); key_id = PG_GETARG_INT64 (1); context = PG_GETARG_BYTEA_P (2); key = pgsodium_derive_helper (key_id, crypto_shorthash_KEYBYTES, context); result = _pgsodium_zalloc_bytea (result_size); crypto_shorthash (PGSODIUM_UCHARDATA (result), PGSODIUM_UCHARDATA (data), VARSIZE_ANY_EXHDR (data), PGSODIUM_UCHARDATA (key)); PG_RETURN_BYTEA_P (result); }