#include "pgsodium.h" PG_FUNCTION_INFO_V1 (pgsodium_crypto_kdf_keygen); Datum pgsodium_crypto_kdf_keygen (PG_FUNCTION_ARGS) { size_t result_size = VARHDRSZ + crypto_kdf_KEYBYTES; bytea *result = _pgsodium_zalloc_bytea (result_size); crypto_kdf_keygen (PGSODIUM_UCHARDATA (result)); PG_RETURN_BYTEA_P (result); } PG_FUNCTION_INFO_V1 (pgsodium_crypto_kdf_derive_from_key); Datum pgsodium_crypto_kdf_derive_from_key (PG_FUNCTION_ARGS) { size_t subkey_size = PG_GETARG_UINT32 (0); size_t result_size = VARHDRSZ + subkey_size; unsigned long long subkey_id = PG_GETARG_INT64 (1); bytea *context = PG_GETARG_BYTEA_P (2); bytea *primary_key = PG_GETARG_BYTEA_P (3); bytea *result; ERRORIF (VARSIZE_ANY_EXHDR (primary_key) != crypto_kdf_KEYBYTES, "%s: invalid derivation key"); ERRORIF (subkey_size < crypto_kdf_BYTES_MIN || subkey_size > crypto_kdf_BYTES_MAX, "%s: invalid key size requested"); ERRORIF (VARSIZE_ANY_EXHDR (context) != 8, "%s: context must be 8 bytes"); result = _pgsodium_zalloc_bytea (result_size); crypto_kdf_derive_from_key (PGSODIUM_UCHARDATA (result), subkey_size, subkey_id, (const char *) VARDATA (context), PGSODIUM_UCHARDATA (primary_key)); PG_RETURN_BYTEA_P (result); }