summaryrefslogtreecommitdiff
path: root/contrib/pgcrypto/pgcrypto.c
diff options
context:
space:
mode:
authorPavan Deolasee2017-06-14 05:42:18 +0000
committerPavan Deolasee2017-06-14 05:42:18 +0000
commit15dd5274c323fb93e4e3ea9ad2185aaaec10f79c (patch)
tree9dafb4c7f735d9429ea461dc792933af87493c33 /contrib/pgcrypto/pgcrypto.c
parentdfbb88e3bbb526dcb204b456b9e5cfd9d10d0d0a (diff)
parentd5cb3bab564e0927ffac7c8729eacf181a12dd40 (diff)
Merge from PG master upto d5cb3bab564e0927ffac7c8729eacf181a12dd40
This is the result of the "git merge remotes/PGSQL/master" upto the said commit point. We have done some basic analysis, fixed compilation problems etc, but bulk of the logical problems in conflict resolution etc will be handled by subsequent commits.
Diffstat (limited to 'contrib/pgcrypto/pgcrypto.c')
-rw-r--r--contrib/pgcrypto/pgcrypto.c121
1 files changed, 61 insertions, 60 deletions
diff --git a/contrib/pgcrypto/pgcrypto.c b/contrib/pgcrypto/pgcrypto.c
index 2d446d8cc9..4e3516a86a 100644
--- a/contrib/pgcrypto/pgcrypto.c
+++ b/contrib/pgcrypto/pgcrypto.c
@@ -34,6 +34,7 @@
#include <ctype.h>
#include "parser/scansup.h"
+#include "utils/backend_random.h"
#include "utils/builtins.h"
#include "utils/uuid.h"
@@ -61,7 +62,7 @@ pg_digest(PG_FUNCTION_ARGS)
PX_MD *md;
bytea *res;
- name = PG_GETARG_TEXT_P(1);
+ name = PG_GETARG_TEXT_PP(1);
/* will give error if fails */
md = find_provider(name, (PFN) px_find_digest, "Digest", 0);
@@ -71,10 +72,10 @@ pg_digest(PG_FUNCTION_ARGS)
res = (text *) palloc(hlen + VARHDRSZ);
SET_VARSIZE(res, hlen + VARHDRSZ);
- arg = PG_GETARG_BYTEA_P(0);
- len = VARSIZE(arg) - VARHDRSZ;
+ arg = PG_GETARG_BYTEA_PP(0);
+ len = VARSIZE_ANY_EXHDR(arg);
- px_md_update(md, (uint8 *) VARDATA(arg), len);
+ px_md_update(md, (uint8 *) VARDATA_ANY(arg), len);
px_md_finish(md, (uint8 *) VARDATA(res));
px_md_free(md);
@@ -99,7 +100,7 @@ pg_hmac(PG_FUNCTION_ARGS)
PX_HMAC *h;
bytea *res;
- name = PG_GETARG_TEXT_P(2);
+ name = PG_GETARG_TEXT_PP(2);
/* will give error if fails */
h = find_provider(name, (PFN) px_find_hmac, "HMAC", 0);
@@ -109,13 +110,13 @@ pg_hmac(PG_FUNCTION_ARGS)
res = (text *) palloc(hlen + VARHDRSZ);
SET_VARSIZE(res, hlen + VARHDRSZ);
- arg = PG_GETARG_BYTEA_P(0);
- key = PG_GETARG_BYTEA_P(1);
- len = VARSIZE(arg) - VARHDRSZ;
- klen = VARSIZE(key) - VARHDRSZ;
+ arg = PG_GETARG_BYTEA_PP(0);
+ key = PG_GETARG_BYTEA_PP(1);
+ len = VARSIZE_ANY_EXHDR(arg);
+ klen = VARSIZE_ANY_EXHDR(key);
- px_hmac_init(h, (uint8 *) VARDATA(key), klen);
- px_hmac_update(h, (uint8 *) VARDATA(arg), len);
+ px_hmac_init(h, (uint8 *) VARDATA_ANY(key), klen);
+ px_hmac_update(h, (uint8 *) VARDATA_ANY(arg), len);
px_hmac_finish(h, (uint8 *) VARDATA(res));
px_hmac_free(h);
@@ -227,20 +228,20 @@ pg_encrypt(PG_FUNCTION_ARGS)
klen,
rlen;
- type = PG_GETARG_TEXT_P(2);
+ type = PG_GETARG_TEXT_PP(2);
c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
- data = PG_GETARG_BYTEA_P(0);
- key = PG_GETARG_BYTEA_P(1);
- dlen = VARSIZE(data) - VARHDRSZ;
- klen = VARSIZE(key) - VARHDRSZ;
+ data = PG_GETARG_BYTEA_PP(0);
+ key = PG_GETARG_BYTEA_PP(1);
+ dlen = VARSIZE_ANY_EXHDR(data);
+ klen = VARSIZE_ANY_EXHDR(key);
rlen = px_combo_encrypt_len(c, dlen);
res = palloc(VARHDRSZ + rlen);
- err = px_combo_init(c, (uint8 *) VARDATA(key), klen, NULL, 0);
+ err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen, NULL, 0);
if (!err)
- err = px_combo_encrypt(c, (uint8 *) VARDATA(data), dlen,
+ err = px_combo_encrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
(uint8 *) VARDATA(res), &rlen);
px_combo_free(c);
@@ -276,20 +277,20 @@ pg_decrypt(PG_FUNCTION_ARGS)
klen,
rlen;
- type = PG_GETARG_TEXT_P(2);
+ type = PG_GETARG_TEXT_PP(2);
c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
- data = PG_GETARG_BYTEA_P(0);
- key = PG_GETARG_BYTEA_P(1);
- dlen = VARSIZE(data) - VARHDRSZ;
- klen = VARSIZE(key) - VARHDRSZ;
+ data = PG_GETARG_BYTEA_PP(0);
+ key = PG_GETARG_BYTEA_PP(1);
+ dlen = VARSIZE_ANY_EXHDR(data);
+ klen = VARSIZE_ANY_EXHDR(key);
rlen = px_combo_decrypt_len(c, dlen);
res = palloc(VARHDRSZ + rlen);
- err = px_combo_init(c, (uint8 *) VARDATA(key), klen, NULL, 0);
+ err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen, NULL, 0);
if (!err)
- err = px_combo_decrypt(c, (uint8 *) VARDATA(data), dlen,
+ err = px_combo_decrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
(uint8 *) VARDATA(res), &rlen);
px_combo_free(c);
@@ -326,23 +327,23 @@ pg_encrypt_iv(PG_FUNCTION_ARGS)
ivlen,
rlen;
- type = PG_GETARG_TEXT_P(3);
+ type = PG_GETARG_TEXT_PP(3);
c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
- data = PG_GETARG_BYTEA_P(0);
- key = PG_GETARG_BYTEA_P(1);
- iv = PG_GETARG_BYTEA_P(2);
- dlen = VARSIZE(data) - VARHDRSZ;
- klen = VARSIZE(key) - VARHDRSZ;
- ivlen = VARSIZE(iv) - VARHDRSZ;
+ data = PG_GETARG_BYTEA_PP(0);
+ key = PG_GETARG_BYTEA_PP(1);
+ iv = PG_GETARG_BYTEA_PP(2);
+ dlen = VARSIZE_ANY_EXHDR(data);
+ klen = VARSIZE_ANY_EXHDR(key);
+ ivlen = VARSIZE_ANY_EXHDR(iv);
rlen = px_combo_encrypt_len(c, dlen);
res = palloc(VARHDRSZ + rlen);
- err = px_combo_init(c, (uint8 *) VARDATA(key), klen,
- (uint8 *) VARDATA(iv), ivlen);
+ err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen,
+ (uint8 *) VARDATA_ANY(iv), ivlen);
if (!err)
- err = px_combo_encrypt(c, (uint8 *) VARDATA(data), dlen,
+ err = px_combo_encrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
(uint8 *) VARDATA(res), &rlen);
px_combo_free(c);
@@ -380,23 +381,23 @@ pg_decrypt_iv(PG_FUNCTION_ARGS)
rlen,
ivlen;
- type = PG_GETARG_TEXT_P(3);
+ type = PG_GETARG_TEXT_PP(3);
c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
- data = PG_GETARG_BYTEA_P(0);
- key = PG_GETARG_BYTEA_P(1);
- iv = PG_GETARG_BYTEA_P(2);
- dlen = VARSIZE(data) - VARHDRSZ;
- klen = VARSIZE(key) - VARHDRSZ;
- ivlen = VARSIZE(iv) - VARHDRSZ;
+ data = PG_GETARG_BYTEA_PP(0);
+ key = PG_GETARG_BYTEA_PP(1);
+ iv = PG_GETARG_BYTEA_PP(2);
+ dlen = VARSIZE_ANY_EXHDR(data);
+ klen = VARSIZE_ANY_EXHDR(key);
+ ivlen = VARSIZE_ANY_EXHDR(iv);
rlen = px_combo_decrypt_len(c, dlen);
res = palloc(VARHDRSZ + rlen);
- err = px_combo_init(c, (uint8 *) VARDATA(key), klen,
- (uint8 *) VARDATA(iv), ivlen);
+ err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen,
+ (uint8 *) VARDATA_ANY(iv), ivlen);
if (!err)
- err = px_combo_decrypt(c, (uint8 *) VARDATA(data), dlen,
+ err = px_combo_decrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
(uint8 *) VARDATA(res), &rlen);
px_combo_free(c);
@@ -422,7 +423,7 @@ PG_FUNCTION_INFO_V1(pg_random_bytes);
Datum
pg_random_bytes(PG_FUNCTION_ARGS)
{
- int err;
+#ifdef HAVE_STRONG_RANDOM
int len = PG_GETARG_INT32(0);
bytea *res;
@@ -435,13 +436,13 @@ pg_random_bytes(PG_FUNCTION_ARGS)
SET_VARSIZE(res, VARHDRSZ + len);
/* generate result */
- err = px_get_random_bytes((uint8 *) VARDATA(res), len);
- if (err < 0)
- ereport(ERROR,
- (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
- errmsg("Random generator error: %s", px_strerror(err))));
+ if (!pg_strong_random(VARDATA(res), len))
+ px_THROW_ERROR(PXE_NO_RANDOM);
PG_RETURN_BYTEA_P(res);
+#else
+ px_THROW_ERROR(PXE_NO_RANDOM);
+#endif
}
/* SQL function: gen_random_uuid() returns uuid */
@@ -451,14 +452,14 @@ Datum
pg_random_uuid(PG_FUNCTION_ARGS)
{
uint8 *buf = (uint8 *) palloc(UUID_LEN);
- int err;
- /* generate random bits */
- err = px_get_pseudo_random_bytes(buf, UUID_LEN);
- if (err < 0)
- ereport(ERROR,
- (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
- errmsg("Random generator error: %s", px_strerror(err))));
+ /*
+ * Generate random bits. pg_backend_random() will do here, we don't promis
+ * UUIDs to be cryptographically random, when built with
+ * --disable-strong-random.
+ */
+ if (!pg_backend_random((char *) buf, UUID_LEN))
+ px_THROW_ERROR(PXE_NO_RANDOM);
/*
* Set magic numbers for a "version 4" (pseudorandom) UUID, see
@@ -479,8 +480,8 @@ find_provider(text *name,
char *buf;
int err;
- buf = downcase_truncate_identifier(VARDATA(name),
- VARSIZE(name) - VARHDRSZ,
+ buf = downcase_truncate_identifier(VARDATA_ANY(name),
+ VARSIZE_ANY_EXHDR(name),
false);
err = provider_lookup(buf, &res);