#include "pgsodium.h" PG_FUNCTION_INFO_V1(pgsodium_cmp); Datum pgsodium_cmp(PG_FUNCTION_ARGS) { int i = 0; int m = 0; bytea *X = PG_GETARG_BYTEA_P(0); bytea *Y = PG_GETARG_BYTEA_P(1); size_t xlen = VARSIZE_ANY(X); size_t ylen = VARSIZE_ANY(Y); char *x = VARDATA_ANY(X); char *y = VARDATA_ANY(Y); if (xlen != ylen) PG_RETURN_BOOL(false); for (i = 0; i < xlen; i++) m |= x[i] ^ y[i]; PG_RETURN_BOOL(m == 0); } PG_FUNCTION_INFO_V1(pgsodium_sodium_bin2base64); Datum pgsodium_sodium_bin2base64(PG_FUNCTION_ARGS) { bytea *bin = PG_GETARG_BYTEA_P(0); size_t bin_size = VARSIZE_ANY_EXHDR(bin); size_t text_size = sodium_base64_ENCODED_LEN( bin_size, sodium_base64_VARIANT_URLSAFE_NO_PADDING); text *base64 = (text *)_pgsodium_zalloc_text(text_size + VARHDRSZ); sodium_bin2base64(PGSODIUM_CHARDATA(base64), text_size, PGSODIUM_UCHARDATA(bin), bin_size, sodium_base64_VARIANT_URLSAFE_NO_PADDING); PG_RETURN_TEXT_P(base64); } PG_FUNCTION_INFO_V1(pgsodium_sodium_base642bin); Datum pgsodium_sodium_base642bin(PG_FUNCTION_ARGS) { text *base64 = PG_GETARG_TEXT_P(0); size_t base64_size = VARSIZE_ANY_EXHDR(base64); size_t max_bin_size = ((base64_size + 1) / 4) * 3; bytea *bin = _pgsodium_zalloc_bytea(max_bin_size); size_t bin_size; int success; success = sodium_base642bin(PGSODIUM_UCHARDATA(bin), max_bin_size, PGSODIUM_CHARDATA(base64), base64_size, "", &bin_size, NULL, sodium_base64_VARIANT_URLSAFE_NO_PADDING); ERRORIF(success != 0, "%s: sodium_base642bin() failed"); SET_VARSIZE(bin, bin_size + VARHDRSZ); PG_RETURN_BYTEA_P(bin); }