24 #include <openssl/err.h>
25 #include <openssl/hmac.h>
43 #ifdef HAVE_HMAC_CTX_NEW
44 #define USE_RESOWNER_FOR_HMAC
45 #define ALLOC(size) MemoryContextAlloc(TopMemoryContext, size)
47 #define ALLOC(size) palloc(size)
49 #define FREE(ptr) pfree(ptr)
51 #define ALLOC(size) malloc(size)
52 #define FREE(ptr) free(ptr)
71 #ifdef USE_RESOWNER_FOR_HMAC
77 #ifdef USE_RESOWNER_FOR_HMAC
78 static void ResOwnerReleaseHMAC(
Datum res);
82 .
name =
"OpenSSL HMAC context",
85 .ReleaseResource = ResOwnerReleaseHMAC,
112 return ERR_reason_error_string(ecode);
143 #ifdef USE_RESOWNER_FOR_HMAC
147 #ifdef HAVE_HMAC_CTX_NEW
159 (
errcode(ERRCODE_OUT_OF_MEMORY),
160 errmsg(
"out of memory")));
165 #ifndef HAVE_HMAC_CTX_NEW
166 memset(ctx->
hmacctx, 0,
sizeof(HMAC_CTX));
169 #ifdef USE_RESOWNER_FOR_HMAC
193 status = HMAC_Init_ex(ctx->
hmacctx,
key,
len, EVP_md5(), NULL);
196 status = HMAC_Init_ex(ctx->
hmacctx,
key,
len, EVP_sha1(), NULL);
199 status = HMAC_Init_ex(ctx->
hmacctx,
key,
len, EVP_sha224(), NULL);
202 status = HMAC_Init_ex(ctx->
hmacctx,
key,
len, EVP_sha256(), NULL);
205 status = HMAC_Init_ex(ctx->
hmacctx,
key,
len, EVP_sha384(), NULL);
208 status = HMAC_Init_ex(ctx->
hmacctx,
key,
len, EVP_sha512(), NULL);
331 #ifdef HAVE_HMAC_CTX_FREE
338 #ifdef USE_RESOWNER_FOR_HMAC
357 return _(
"out of memory");
371 return _(
"destination buffer too small");
373 return _(
"OpenSSL failure");
382 #ifdef USE_RESOWNER_FOR_HMAC
388 ctx->resowner = NULL;
#define Assert(condition)
static void PGresult * res
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
pg_hmac_ctx * pg_hmac_create(pg_cryptohash_type type)
const char * pg_hmac_error(pg_hmac_ctx *ctx)
static const char * SSLerrmessage(unsigned long ecode)
void pg_hmac_free(pg_hmac_ctx *ctx)
int pg_hmac_update(pg_hmac_ctx *ctx, const uint8 *data, size_t len)
int pg_hmac_init(pg_hmac_ctx *ctx, const uint8 *key, size_t len)
int pg_hmac_final(pg_hmac_ctx *ctx, uint8 *dest, size_t len)
#define MD5_DIGEST_LENGTH
void explicit_bzero(void *buf, size_t len)
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
ResourceOwner CurrentResourceOwner
void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
void ResourceOwnerEnlarge(ResourceOwner owner)
#define RELEASE_PRIO_HMAC_CONTEXTS
@ RESOURCE_RELEASE_BEFORE_LOCKS
void ResourceOwnerRememberHMAC(ResourceOwner owner, Datum handle)
void ResourceOwnerForgetHMAC(ResourceOwner owner, Datum handle)
#define SHA1_DIGEST_LENGTH
#define PG_SHA256_DIGEST_LENGTH
#define PG_SHA384_DIGEST_LENGTH
#define PG_SHA512_DIGEST_LENGTH
#define PG_SHA224_DIGEST_LENGTH