PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
pgp-pgsql.c File Reference
#include "postgres.h"
#include "catalog/pg_type.h"
#include "common/string.h"
#include "funcapi.h"
#include "lib/stringinfo.h"
#include "mb/pg_wchar.h"
#include "mbuf.h"
#include "pgp.h"
#include "px.h"
#include "utils/array.h"
#include "utils/builtins.h"
Include dependency graph for pgp-pgsql.c:

Go to the source code of this file.

Data Structures

struct  debug_expect
 
struct  pgp_armor_headers_state
 

Macros

#define EX_MSG(arg)
 
#define EX_CHECK(arg)
 

Functions

 PG_FUNCTION_INFO_V1 (pgp_sym_encrypt_bytea)
 
 PG_FUNCTION_INFO_V1 (pgp_sym_encrypt_text)
 
 PG_FUNCTION_INFO_V1 (pgp_sym_decrypt_bytea)
 
 PG_FUNCTION_INFO_V1 (pgp_sym_decrypt_text)
 
 PG_FUNCTION_INFO_V1 (pgp_pub_encrypt_bytea)
 
 PG_FUNCTION_INFO_V1 (pgp_pub_encrypt_text)
 
 PG_FUNCTION_INFO_V1 (pgp_pub_decrypt_bytea)
 
 PG_FUNCTION_INFO_V1 (pgp_pub_decrypt_text)
 
 PG_FUNCTION_INFO_V1 (pgp_key_id_w)
 
 PG_FUNCTION_INFO_V1 (pg_armor)
 
 PG_FUNCTION_INFO_V1 (pg_dearmor)
 
 PG_FUNCTION_INFO_V1 (pgp_armor_headers)
 
static textconvert_charset (text *src, int cset_from, int cset_to)
 
static textconvert_from_utf8 (text *src)
 
static textconvert_to_utf8 (text *src)
 
static void clear_and_pfree (text *p)
 
static void fill_expect (struct debug_expect *ex, int text_mode)
 
static void check_expect (PGP_Context *ctx, struct debug_expect *ex)
 
static void show_debug (const char *msg)
 
static int set_arg (PGP_Context *ctx, char *key, char *val, struct debug_expect *ex)
 
static char * getword (char *p, char **res_p, int *res_len)
 
static char * downcase_convert (const uint8 *s, int len)
 
static int parse_args (PGP_Context *ctx, uint8 *args, int arg_len, struct debug_expect *ex)
 
static MBufcreate_mbuf_from_vardata (text *data)
 
static void init_work (PGP_Context **ctx_p, int is_text, text *args, struct debug_expect *ex)
 
static byteaencrypt_internal (int is_pubenc, int is_text, text *data, text *key, text *args)
 
static byteadecrypt_internal (int is_pubenc, int need_text, text *data, text *key, text *keypsw, text *args)
 
Datum pgp_sym_encrypt_bytea (PG_FUNCTION_ARGS)
 
Datum pgp_sym_encrypt_text (PG_FUNCTION_ARGS)
 
Datum pgp_sym_decrypt_bytea (PG_FUNCTION_ARGS)
 
Datum pgp_sym_decrypt_text (PG_FUNCTION_ARGS)
 
Datum pgp_pub_encrypt_bytea (PG_FUNCTION_ARGS)
 
Datum pgp_pub_encrypt_text (PG_FUNCTION_ARGS)
 
Datum pgp_pub_decrypt_bytea (PG_FUNCTION_ARGS)
 
Datum pgp_pub_decrypt_text (PG_FUNCTION_ARGS)
 
static int parse_key_value_arrays (ArrayType *key_array, ArrayType *val_array, char ***p_keys, char ***p_values)
 
Datum pg_armor (PG_FUNCTION_ARGS)
 
Datum pg_dearmor (PG_FUNCTION_ARGS)
 
Datum pgp_armor_headers (PG_FUNCTION_ARGS)
 
Datum pgp_key_id_w (PG_FUNCTION_ARGS)
 

Macro Definition Documentation

◆ EX_CHECK

#define EX_CHECK (   arg)
Value:
do { \
if (ex->arg >= 0 && ex->arg != ctx->arg) EX_MSG(arg); \
} while (0)
void * arg
while(p+4<=pend)
#define EX_MSG(arg)
Definition: pgp-pgsql.c:137

Definition at line 142 of file pgp-pgsql.c.

◆ EX_MSG

#define EX_MSG (   arg)
Value:
"pgp_decrypt: unexpected %s: expected %d got %d", \
CppAsString(arg), ex->arg, ctx->arg)))
#define CppAsString(identifier)
Definition: c.h:362
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#define NOTICE
Definition: elog.h:35
#define ereport(elevel,...)
Definition: elog.h:149

Definition at line 137 of file pgp-pgsql.c.

Function Documentation

◆ check_expect()

static void check_expect ( PGP_Context ctx,
struct debug_expect ex 
)
static

Definition at line 147 of file pgp-pgsql.c.

148{
149 EX_CHECK(cipher_algo);
150 EX_CHECK(s2k_mode);
151 EX_CHECK(s2k_count);
152 EX_CHECK(s2k_digest_algo);
153 EX_CHECK(use_sess_key);
154 if (ctx->use_sess_key)
155 EX_CHECK(s2k_cipher_algo);
156 EX_CHECK(disable_mdc);
157 EX_CHECK(compress_algo);
158 EX_CHECK(unicode_mode);
159}
#define EX_CHECK(arg)
Definition: pgp-pgsql.c:142
int use_sess_key
Definition: pgp.h:148

References EX_CHECK, and PGP_Context::use_sess_key.

Referenced by decrypt_internal().

◆ clear_and_pfree()

static void clear_and_pfree ( text p)
static

Definition at line 97 of file pgp-pgsql.c.

98{
99 px_memset(p, 0, VARSIZE_ANY(p));
100 pfree(p);
101}
void pfree(void *pointer)
Definition: mcxt.c:1524
void px_memset(void *ptr, int c, size_t len)
Definition: px.c:123
#define VARSIZE_ANY(PTR)
Definition: varatt.h:311

References pfree(), px_memset(), and VARSIZE_ANY.

Referenced by decrypt_internal(), and encrypt_internal().

◆ convert_charset()

static text * convert_charset ( text src,
int  cset_from,
int  cset_to 
)
static

Definition at line 68 of file pgp-pgsql.c.

69{
70 int src_len = VARSIZE_ANY_EXHDR(src);
71 unsigned char *dst;
72 unsigned char *csrc = (unsigned char *) VARDATA_ANY(src);
73 text *res;
74
75 dst = pg_do_encoding_conversion(csrc, src_len, cset_from, cset_to);
76 if (dst == csrc)
77 return src;
78
79 res = cstring_to_text((char *) dst);
80 pfree(dst);
81 return res;
82}
unsigned char * pg_do_encoding_conversion(unsigned char *src, int len, int src_encoding, int dest_encoding)
Definition: mbutils.c:356
Definition: c.h:658
#define VARDATA_ANY(PTR)
Definition: varatt.h:324
#define VARSIZE_ANY_EXHDR(PTR)
Definition: varatt.h:317
text * cstring_to_text(const char *s)
Definition: varlena.c:192

References cstring_to_text(), pfree(), pg_do_encoding_conversion(), VARDATA_ANY, and VARSIZE_ANY_EXHDR.

Referenced by convert_from_utf8(), and convert_to_utf8().

◆ convert_from_utf8()

static text * convert_from_utf8 ( text src)
static

Definition at line 85 of file pgp-pgsql.c.

86{
88}
int GetDatabaseEncoding(void)
Definition: mbutils.c:1261
@ PG_UTF8
Definition: pg_wchar.h:232
static text * convert_charset(text *src, int cset_from, int cset_to)
Definition: pgp-pgsql.c:68

References convert_charset(), GetDatabaseEncoding(), and PG_UTF8.

Referenced by decrypt_internal().

◆ convert_to_utf8()

static text * convert_to_utf8 ( text src)
static

Definition at line 91 of file pgp-pgsql.c.

92{
94}

References convert_charset(), GetDatabaseEncoding(), and PG_UTF8.

Referenced by encrypt_internal().

◆ create_mbuf_from_vardata()

static MBuf * create_mbuf_from_vardata ( text data)
static

Definition at line 344 of file pgp-pgsql.c.

345{
348}
uint8_t uint8
Definition: c.h:500
MBuf * mbuf_create_from_data(uint8 *data, int len)
Definition: mbuf.c:131
const void * data

References data, mbuf_create_from_data(), VARDATA_ANY, and VARSIZE_ANY_EXHDR.

Referenced by decrypt_internal(), encrypt_internal(), and pgp_key_id_w().

◆ decrypt_internal()

static bytea * decrypt_internal ( int  is_pubenc,
int  need_text,
text data,
text key,
text keypsw,
text args 
)
static

Definition at line 458 of file pgp-pgsql.c.

460{
461 int err;
462 MBuf *src = NULL,
463 *dst = NULL;
464 uint8 tmp[VARHDRSZ];
465 uint8 *restmp;
466 bytea *res;
467 int res_len;
468 PGP_Context *ctx = NULL;
469 struct debug_expect ex;
470 int got_unicode = 0;
471
472
473 init_work(&ctx, need_text, args, &ex);
474
477 dst = mbuf_create(VARSIZE_ANY(data) + 2048);
478
479 /*
480 * reserve room for header
481 */
482 mbuf_append(dst, tmp, VARHDRSZ);
483
484 /*
485 * set key
486 */
487 if (is_pubenc)
488 {
489 uint8 *psw = NULL;
490 int psw_len = 0;
491 MBuf *kbuf;
492
493 if (keypsw)
494 {
495 psw = (uint8 *) VARDATA_ANY(keypsw);
496 psw_len = VARSIZE_ANY_EXHDR(keypsw);
497 }
499 err = pgp_set_pubkey(ctx, kbuf, psw, psw_len, 1);
500 mbuf_free(kbuf);
501 }
502 else
505
506 /* decrypt */
507 if (err >= 0)
508 {
509 err = pgp_decrypt(ctx, src, dst);
510
511 if (ex.expect)
512 check_expect(ctx, &ex);
513
514 /* remember the setting */
515 got_unicode = pgp_get_unicode_mode(ctx);
516 }
517
518 mbuf_free(src);
519 pgp_free(ctx);
520
521 if (err)
522 {
524 mbuf_free(dst);
526 }
527
528 res_len = mbuf_steal_data(dst, &restmp);
529 mbuf_free(dst);
530
531 /* res_len includes VARHDRSZ */
532 res = (bytea *) restmp;
533 SET_VARSIZE(res, res_len);
534
535 if (need_text && got_unicode)
536 {
537 text *utf = convert_from_utf8(res);
538
539 if (utf != res)
540 {
541 clear_and_pfree(res);
542 res = utf;
543 }
544 }
546
547 return res;
548}
#define VARHDRSZ
Definition: c.h:663
void err(int eval, const char *fmt,...)
Definition: err.c:43
int mbuf_free(MBuf *mbuf)
Definition: mbuf.c:62
int mbuf_append(MBuf *dst, const uint8 *buf, int len)
Definition: mbuf.c:94
int mbuf_steal_data(MBuf *mbuf, uint8 **data_p)
Definition: mbuf.c:162
MBuf * mbuf_create(int len)
Definition: mbuf.c:111
int pgp_decrypt(PGP_Context *ctx, MBuf *msrc, MBuf *mdst)
Definition: pgp-decrypt.c:1093
static MBuf * create_mbuf_from_vardata(text *data)
Definition: pgp-pgsql.c:344
static text * convert_from_utf8(text *src)
Definition: pgp-pgsql.c:85
static void init_work(PGP_Context **ctx_p, int is_text, text *args, struct debug_expect *ex)
Definition: pgp-pgsql.c:351
static void check_expect(PGP_Context *ctx, struct debug_expect *ex)
Definition: pgp-pgsql.c:147
static void clear_and_pfree(text *p)
Definition: pgp-pgsql.c:97
int pgp_set_pubkey(PGP_Context *ctx, MBuf *keypkt, const uint8 *key, int key_len, int pubtype)
Definition: pgp-pubkey.c:565
int pgp_set_symkey(PGP_Context *ctx, const uint8 *key, int len)
Definition: pgp.c:353
int pgp_get_unicode_mode(PGP_Context *ctx)
Definition: pgp.c:340
int pgp_free(PGP_Context *ctx)
Definition: pgp.c:213
void px_THROW_ERROR(int err)
Definition: px.c:93
void px_set_debug_handler(void(*handler)(const char *))
Definition: px.c:143
Definition: mbuf.c:40
#define SET_VARSIZE(PTR, len)
Definition: varatt.h:305

References generate_unaccent_rules::args, check_expect(), clear_and_pfree(), convert_from_utf8(), create_mbuf_from_vardata(), data, err(), debug_expect::expect, init_work(), sort-test::key, mbuf_append(), mbuf_create(), mbuf_create_from_data(), mbuf_free(), mbuf_steal_data(), pgp_decrypt(), pgp_free(), pgp_get_unicode_mode(), pgp_set_pubkey(), pgp_set_symkey(), px_set_debug_handler(), px_THROW_ERROR(), SET_VARSIZE, VARDATA_ANY, VARHDRSZ, VARSIZE_ANY, and VARSIZE_ANY_EXHDR.

Referenced by pgp_pub_decrypt_bytea(), pgp_pub_decrypt_text(), pgp_sym_decrypt_bytea(), and pgp_sym_decrypt_text().

◆ downcase_convert()

static char * downcase_convert ( const uint8 s,
int  len 
)
static

Definition at line 288 of file pgp-pgsql.c.

289{
290 int c,
291 i;
292 char *res = palloc(len + 1);
293
294 for (i = 0; i < len; i++)
295 {
296 c = s[i];
297 if (c >= 'A' && c <= 'Z')
298 c += 'a' - 'A';
299 res[i] = c;
300 }
301 res[len] = 0;
302 return res;
303}
int i
Definition: isn.c:72
void * palloc(Size size)
Definition: mcxt.c:1317
const void size_t len
char * c

References i, len, and palloc().

Referenced by parse_args().

◆ encrypt_internal()

static bytea * encrypt_internal ( int  is_pubenc,
int  is_text,
text data,
text key,
text args 
)
static

Definition at line 372 of file pgp-pgsql.c.

374{
375 MBuf *src,
376 *dst;
377 uint8 tmp[VARHDRSZ];
378 uint8 *restmp;
379 bytea *res;
380 int res_len;
381 PGP_Context *ctx;
382 int err;
383 struct debug_expect ex;
384 text *tmp_data = NULL;
385
386 init_work(&ctx, is_text, args, &ex);
387
388 if (is_text && pgp_get_unicode_mode(ctx))
389 {
390 tmp_data = convert_to_utf8(data);
391 if (tmp_data == data)
392 tmp_data = NULL;
393 else
394 data = tmp_data;
395 }
396
398 dst = mbuf_create(VARSIZE_ANY(data) + 128);
399
400 /*
401 * reserve room for header
402 */
403 mbuf_append(dst, tmp, VARHDRSZ);
404
405 /*
406 * set key
407 */
408 if (is_pubenc)
409 {
411
412 err = pgp_set_pubkey(ctx, kbuf,
413 NULL, 0, 0);
414 mbuf_free(kbuf);
415 }
416 else
419
420 /*
421 * encrypt
422 */
423 if (err >= 0)
424 err = pgp_encrypt(ctx, src, dst);
425
426 /*
427 * check for error
428 */
429 if (err)
430 {
431 if (ex.debug)
433 if (tmp_data)
434 clear_and_pfree(tmp_data);
435 pgp_free(ctx);
436 mbuf_free(src);
437 mbuf_free(dst);
439 }
440
441 /* res_len includes VARHDRSZ */
442 res_len = mbuf_steal_data(dst, &restmp);
443 res = (bytea *) restmp;
444 SET_VARSIZE(res, res_len);
445
446 if (tmp_data)
447 clear_and_pfree(tmp_data);
448 pgp_free(ctx);
449 mbuf_free(src);
450 mbuf_free(dst);
451
453
454 return res;
455}
int pgp_encrypt(PGP_Context *ctx, MBuf *src, MBuf *dst)
Definition: pgp-encrypt.c:599
static text * convert_to_utf8(text *src)
Definition: pgp-pgsql.c:91

References generate_unaccent_rules::args, clear_and_pfree(), convert_to_utf8(), create_mbuf_from_vardata(), data, debug_expect::debug, err(), init_work(), sort-test::key, mbuf_append(), mbuf_create(), mbuf_free(), mbuf_steal_data(), pgp_encrypt(), pgp_free(), pgp_get_unicode_mode(), pgp_set_pubkey(), pgp_set_symkey(), px_set_debug_handler(), px_THROW_ERROR(), SET_VARSIZE, VARDATA_ANY, VARHDRSZ, VARSIZE_ANY, and VARSIZE_ANY_EXHDR.

Referenced by pgp_pub_encrypt_bytea(), pgp_pub_encrypt_text(), pgp_sym_encrypt_bytea(), and pgp_sym_encrypt_text().

◆ fill_expect()

static void fill_expect ( struct debug_expect ex,
int  text_mode 
)
static

◆ getword()

static char * getword ( char *  p,
char **  res_p,
int *  res_len 
)
static

Definition at line 259 of file pgp-pgsql.c.

260{
261 /* whitespace at start */
262 while (*p && (*p == ' ' || *p == '\t' || *p == '\n'))
263 p++;
264
265 /* word data */
266 *res_p = p;
267 if (*p == '=' || *p == ',')
268 p++;
269 else
270 while (*p && !(*p == ' ' || *p == '\t' || *p == '\n'
271 || *p == '=' || *p == ','))
272 p++;
273
274 /* word end */
275 *res_len = p - *res_p;
276
277 /* whitespace at end */
278 while (*p && (*p == ' ' || *p == '\t' || *p == '\n'))
279 p++;
280
281 return p;
282}

Referenced by parse_args().

◆ init_work()

static void init_work ( PGP_Context **  ctx_p,
int  is_text,
text args,
struct debug_expect ex 
)
static

Definition at line 351 of file pgp-pgsql.c.

353{
354 int err = pgp_init(ctx_p);
355
356 fill_expect(ex, is_text);
357
358 if (err == 0 && args != NULL)
359 err = parse_args(*ctx_p, (uint8 *) VARDATA_ANY(args),
361
362 if (err)
364
365 if (ex->debug)
367
368 pgp_set_text_mode(*ctx_p, is_text);
369}
static void fill_expect(struct debug_expect *ex, int text_mode)
Definition: pgp-pgsql.c:122
static void show_debug(const char *msg)
Definition: pgp-pgsql.c:162
static int parse_args(PGP_Context *ctx, uint8 *args, int arg_len, struct debug_expect *ex)
Definition: pgp-pgsql.c:306
int pgp_init(PGP_Context **ctx_p)
Definition: pgp.c:189
int pgp_set_text_mode(PGP_Context *ctx, int mode)
Definition: pgp.c:300

References generate_unaccent_rules::args, debug_expect::debug, err(), fill_expect(), parse_args(), pgp_init(), pgp_set_text_mode(), px_set_debug_handler(), px_THROW_ERROR(), show_debug(), VARDATA_ANY, and VARSIZE_ANY_EXHDR.

Referenced by decrypt_internal(), and encrypt_internal().

◆ parse_args()

static int parse_args ( PGP_Context ctx,
uint8 args,
int  arg_len,
struct debug_expect ex 
)
static

Definition at line 306 of file pgp-pgsql.c.

308{
309 char *str = downcase_convert(args, arg_len);
310 char *key,
311 *val;
312 int key_len,
313 val_len;
314 int res = 0;
315 char *p = str;
316
317 while (*p)
318 {
319 res = PXE_ARGUMENT_ERROR;
320 p = getword(p, &key, &key_len);
321 if (*p++ != '=')
322 break;
323 p = getword(p, &val, &val_len);
324 if (*p == '\0')
325 ;
326 else if (*p++ != ',')
327 break;
328
329 if (*key == 0 || *val == 0 || val_len == 0)
330 break;
331
332 key[key_len] = 0;
333 val[val_len] = 0;
334
335 res = set_arg(ctx, key, val, ex);
336 if (res < 0)
337 break;
338 }
339 pfree(str);
340 return res;
341}
const char * str
long val
Definition: informix.c:689
static char * getword(char *p, char **res_p, int *res_len)
Definition: pgp-pgsql.c:259
static char * downcase_convert(const uint8 *s, int len)
Definition: pgp-pgsql.c:288
static int set_arg(PGP_Context *ctx, char *key, char *val, struct debug_expect *ex)
Definition: pgp-pgsql.c:168
#define PXE_ARGUMENT_ERROR
Definition: px.h:59

References generate_unaccent_rules::args, downcase_convert(), getword(), sort-test::key, pfree(), PXE_ARGUMENT_ERROR, set_arg(), str, and val.

Referenced by init_work().

◆ parse_key_value_arrays()

static int parse_key_value_arrays ( ArrayType key_array,
ArrayType val_array,
char ***  p_keys,
char ***  p_values 
)
static

Definition at line 755 of file pgp-pgsql.c.

757{
758 int nkdims = ARR_NDIM(key_array);
759 int nvdims = ARR_NDIM(val_array);
760 char **keys,
761 **values;
762 Datum *key_datums,
763 *val_datums;
764 bool *key_nulls,
765 *val_nulls;
766 int key_count,
767 val_count;
768 int i;
769
770 if (nkdims > 1 || nkdims != nvdims)
772 (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
773 errmsg("wrong number of array subscripts")));
774 if (nkdims == 0)
775 return 0;
776
777 deconstruct_array_builtin(key_array, TEXTOID, &key_datums, &key_nulls, &key_count);
778 deconstruct_array_builtin(val_array, TEXTOID, &val_datums, &val_nulls, &val_count);
779
780 if (key_count != val_count)
782 (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
783 errmsg("mismatched array dimensions")));
784
785 keys = (char **) palloc(sizeof(char *) * key_count);
786 values = (char **) palloc(sizeof(char *) * val_count);
787
788 for (i = 0; i < key_count; i++)
789 {
790 char *v;
791
792 /* Check that the key doesn't contain anything funny */
793 if (key_nulls[i])
795 (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
796 errmsg("null value not allowed for header key")));
797
798 v = TextDatumGetCString(key_datums[i]);
799
800 if (!pg_is_ascii(v))
802 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
803 errmsg("header key must not contain non-ASCII characters")));
804 if (strstr(v, ": "))
806 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
807 errmsg("header key must not contain \": \"")));
808 if (strchr(v, '\n'))
810 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
811 errmsg("header key must not contain newlines")));
812 keys[i] = v;
813
814 /* And the same for the value */
815 if (val_nulls[i])
817 (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
818 errmsg("null value not allowed for header value")));
819
820 v = TextDatumGetCString(val_datums[i]);
821
822 if (!pg_is_ascii(v))
824 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
825 errmsg("header value must not contain non-ASCII characters")));
826 if (strchr(v, '\n'))
828 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
829 errmsg("header value must not contain newlines")));
830
831 values[i] = v;
832 }
833
834 *p_keys = keys;
835 *p_values = values;
836 return key_count;
837}
#define ARR_NDIM(a)
Definition: array.h:290
void deconstruct_array_builtin(ArrayType *array, Oid elmtype, Datum **elemsp, bool **nullsp, int *nelemsp)
Definition: arrayfuncs.c:3697
static Datum values[MAXATTR]
Definition: bootstrap.c:151
#define TextDatumGetCString(d)
Definition: builtins.h:98
int errcode(int sqlerrcode)
Definition: elog.c:853
#define ERROR
Definition: elog.h:39
uintptr_t Datum
Definition: postgres.h:69
bool pg_is_ascii(const char *str)
Definition: string.c:132

References ARR_NDIM, deconstruct_array_builtin(), ereport, errcode(), errmsg(), ERROR, i, palloc(), pg_is_ascii(), TextDatumGetCString, and values.

Referenced by pg_armor().

◆ pg_armor()

Datum pg_armor ( PG_FUNCTION_ARGS  )

Definition at line 840 of file pgp-pgsql.c.

841{
842 bytea *data;
843 text *res;
844 int data_len;
846 int num_headers;
847 char **keys = NULL,
848 **values = NULL;
849
851 data_len = VARSIZE_ANY_EXHDR(data);
852 if (PG_NARGS() == 3)
853 {
856 &keys, &values);
857 }
858 else if (PG_NARGS() == 1)
859 num_headers = 0;
860 else
861 elog(ERROR, "unexpected number of arguments %d", PG_NARGS());
862
864
865 pgp_armor_encode((uint8 *) VARDATA_ANY(data), data_len, &buf,
866 num_headers, keys, values);
867
868 res = palloc(VARHDRSZ + buf.len);
869 SET_VARSIZE(res, VARHDRSZ + buf.len);
870 memcpy(VARDATA(res), buf.data, buf.len);
871 pfree(buf.data);
872
874 PG_RETURN_TEXT_P(res);
875}
#define PG_GETARG_ARRAYTYPE_P(n)
Definition: array.h:263
#define elog(elevel,...)
Definition: elog.h:225
#define PG_FREE_IF_COPY(ptr, n)
Definition: fmgr.h:260
#define PG_GETARG_BYTEA_PP(n)
Definition: fmgr.h:308
#define PG_NARGS()
Definition: fmgr.h:203
#define PG_RETURN_TEXT_P(x)
Definition: fmgr.h:372
static char * buf
Definition: pg_test_fsync.c:72
void pgp_armor_encode(const uint8 *src, unsigned len, StringInfo dst, int num_headers, char **keys, char **values)
Definition: pgp-armor.c:207
static int parse_key_value_arrays(ArrayType *key_array, ArrayType *val_array, char ***p_keys, char ***p_values)
Definition: pgp-pgsql.c:755
void initStringInfo(StringInfo str)
Definition: stringinfo.c:97
#define VARDATA(PTR)
Definition: varatt.h:278

References buf, data, elog, ERROR, initStringInfo(), palloc(), parse_key_value_arrays(), pfree(), PG_FREE_IF_COPY, PG_GETARG_ARRAYTYPE_P, PG_GETARG_BYTEA_PP, PG_NARGS, PG_RETURN_TEXT_P, pgp_armor_encode(), SET_VARSIZE, values, VARDATA, VARDATA_ANY, VARHDRSZ, and VARSIZE_ANY_EXHDR.

◆ pg_dearmor()

Datum pg_dearmor ( PG_FUNCTION_ARGS  )

Definition at line 878 of file pgp-pgsql.c.

879{
880 text *data;
881 bytea *res;
882 int data_len;
883 int ret;
885
887 data_len = VARSIZE_ANY_EXHDR(data);
888
890
891 ret = pgp_armor_decode((uint8 *) VARDATA_ANY(data), data_len, &buf);
892 if (ret < 0)
893 px_THROW_ERROR(ret);
894 res = palloc(VARHDRSZ + buf.len);
895 SET_VARSIZE(res, VARHDRSZ + buf.len);
896 memcpy(VARDATA(res), buf.data, buf.len);
897 pfree(buf.data);
898
900 PG_RETURN_TEXT_P(res);
901}
#define PG_GETARG_TEXT_PP(n)
Definition: fmgr.h:309
int pgp_armor_decode(const uint8 *src, int len, StringInfo dst)
Definition: pgp-armor.c:314

References buf, data, initStringInfo(), palloc(), pfree(), PG_FREE_IF_COPY, PG_GETARG_TEXT_PP, PG_RETURN_TEXT_P, pgp_armor_decode(), px_THROW_ERROR(), SET_VARSIZE, VARDATA, VARDATA_ANY, VARHDRSZ, and VARSIZE_ANY_EXHDR.

◆ PG_FUNCTION_INFO_V1() [1/12]

PG_FUNCTION_INFO_V1 ( pg_armor  )

◆ PG_FUNCTION_INFO_V1() [2/12]

PG_FUNCTION_INFO_V1 ( pg_dearmor  )

◆ PG_FUNCTION_INFO_V1() [3/12]

PG_FUNCTION_INFO_V1 ( pgp_armor_headers  )

◆ PG_FUNCTION_INFO_V1() [4/12]

PG_FUNCTION_INFO_V1 ( pgp_key_id_w  )

◆ PG_FUNCTION_INFO_V1() [5/12]

PG_FUNCTION_INFO_V1 ( pgp_pub_decrypt_bytea  )

◆ PG_FUNCTION_INFO_V1() [6/12]

PG_FUNCTION_INFO_V1 ( pgp_pub_decrypt_text  )

◆ PG_FUNCTION_INFO_V1() [7/12]

PG_FUNCTION_INFO_V1 ( pgp_pub_encrypt_bytea  )

◆ PG_FUNCTION_INFO_V1() [8/12]

PG_FUNCTION_INFO_V1 ( pgp_pub_encrypt_text  )

◆ PG_FUNCTION_INFO_V1() [9/12]

PG_FUNCTION_INFO_V1 ( pgp_sym_decrypt_bytea  )

◆ PG_FUNCTION_INFO_V1() [10/12]

PG_FUNCTION_INFO_V1 ( pgp_sym_decrypt_text  )

◆ PG_FUNCTION_INFO_V1() [11/12]

PG_FUNCTION_INFO_V1 ( pgp_sym_encrypt_bytea  )

◆ PG_FUNCTION_INFO_V1() [12/12]

PG_FUNCTION_INFO_V1 ( pgp_sym_encrypt_text  )

◆ pgp_armor_headers()

Datum pgp_armor_headers ( PG_FUNCTION_ARGS  )

Definition at line 912 of file pgp-pgsql.c.

913{
914 FuncCallContext *funcctx;
916 char *utf8key;
917 char *utf8val;
918 HeapTuple tuple;
919 TupleDesc tupdesc;
920 AttInMetadata *attinmeta;
921
922 if (SRF_IS_FIRSTCALL())
923 {
925 int res;
926 MemoryContext oldcontext;
927
928 funcctx = SRF_FIRSTCALL_INIT();
929
930 /* we need the state allocated in the multi call context */
931 oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
932
933 /* Build a tuple descriptor for our result type */
934 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
935 elog(ERROR, "return type must be a row type");
936
937 attinmeta = TupleDescGetAttInMetadata(tupdesc);
938 funcctx->attinmeta = attinmeta;
939
941
944 &state->nheaders, &state->keys,
945 &state->values);
946 if (res < 0)
947 px_THROW_ERROR(res);
948
949 MemoryContextSwitchTo(oldcontext);
950 funcctx->user_fctx = state;
951 }
952
953 funcctx = SRF_PERCALL_SETUP();
955
956 if (funcctx->call_cntr >= state->nheaders)
957 SRF_RETURN_DONE(funcctx);
958 else
959 {
960 char *values[2];
961
962 /* we assume that the keys (and values) are in UTF-8. */
963 utf8key = state->keys[funcctx->call_cntr];
964 utf8val = state->values[funcctx->call_cntr];
965
966 values[0] = pg_any_to_server(utf8key, strlen(utf8key), PG_UTF8);
967 values[1] = pg_any_to_server(utf8val, strlen(utf8val), PG_UTF8);
968
969 /* build a tuple */
970 tuple = BuildTupleFromCStrings(funcctx->attinmeta, values);
971 SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
972 }
973}
HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
Definition: execTuples.c:2322
AttInMetadata * TupleDescGetAttInMetadata(TupleDesc tupdesc)
Definition: execTuples.c:2273
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
Definition: funcapi.c:276
#define SRF_IS_FIRSTCALL()
Definition: funcapi.h:304
#define SRF_PERCALL_SETUP()
Definition: funcapi.h:308
@ TYPEFUNC_COMPOSITE
Definition: funcapi.h:149
#define SRF_RETURN_NEXT(_funcctx, _result)
Definition: funcapi.h:310
#define SRF_FIRSTCALL_INIT()
Definition: funcapi.h:306
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
Definition: funcapi.h:230
#define SRF_RETURN_DONE(_funcctx)
Definition: funcapi.h:328
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:76
char * pg_any_to_server(const char *s, int len, int encoding)
Definition: mbutils.c:676
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:124
int pgp_extract_armor_headers(const uint8 *src, unsigned len, int *nheaders, char ***keys, char ***values)
Definition: pgp-armor.c:390
void * user_fctx
Definition: funcapi.h:82
uint64 call_cntr
Definition: funcapi.h:65
AttInMetadata * attinmeta
Definition: funcapi.h:91
MemoryContext multi_call_memory_ctx
Definition: funcapi.h:101
Definition: regguts.h:323

References FuncCallContext::attinmeta, BuildTupleFromCStrings(), FuncCallContext::call_cntr, data, elog, ERROR, get_call_result_type(), HeapTupleGetDatum(), if(), MemoryContextSwitchTo(), FuncCallContext::multi_call_memory_ctx, palloc(), pg_any_to_server(), PG_GETARG_TEXT_PP, PG_UTF8, pgp_extract_armor_headers(), px_THROW_ERROR(), SRF_FIRSTCALL_INIT, SRF_IS_FIRSTCALL, SRF_PERCALL_SETUP, SRF_RETURN_DONE, SRF_RETURN_NEXT, TupleDescGetAttInMetadata(), TYPEFUNC_COMPOSITE, FuncCallContext::user_fctx, values, VARDATA_ANY, and VARSIZE_ANY_EXHDR.

◆ pgp_key_id_w()

Datum pgp_key_id_w ( PG_FUNCTION_ARGS  )

Definition at line 982 of file pgp-pgsql.c.

983{
984 bytea *data;
985 text *res;
986 int res_len;
987 MBuf *buf;
988
991 res = palloc(VARHDRSZ + 17);
992
993 res_len = pgp_get_keyid(buf, VARDATA(res));
994 mbuf_free(buf);
995 if (res_len < 0)
996 px_THROW_ERROR(res_len);
997 SET_VARSIZE(res, VARHDRSZ + res_len);
998
1000 PG_RETURN_TEXT_P(res);
1001}
int pgp_get_keyid(MBuf *pgp_data, char *dst)
Definition: pgp-info.c:112

References buf, create_mbuf_from_vardata(), data, mbuf_free(), palloc(), PG_FREE_IF_COPY, PG_GETARG_BYTEA_PP, PG_RETURN_TEXT_P, pgp_get_keyid(), px_THROW_ERROR(), SET_VARSIZE, VARDATA, and VARHDRSZ.

◆ pgp_pub_decrypt_bytea()

Datum pgp_pub_decrypt_bytea ( PG_FUNCTION_ARGS  )

Definition at line 692 of file pgp-pgsql.c.

693{
694 bytea *data,
695 *key;
696 text *psw = NULL,
697 *arg = NULL;
698 text *res;
699
702 if (PG_NARGS() > 2)
703 psw = PG_GETARG_TEXT_PP(2);
704 if (PG_NARGS() > 3)
706
707 res = decrypt_internal(1, 0, data, key, psw, arg);
708
711 if (PG_NARGS() > 2)
712 PG_FREE_IF_COPY(psw, 2);
713 if (PG_NARGS() > 3)
715 PG_RETURN_TEXT_P(res);
716}
static bytea * decrypt_internal(int is_pubenc, int need_text, text *data, text *key, text *keypsw, text *args)
Definition: pgp-pgsql.c:458

References arg, data, decrypt_internal(), sort-test::key, PG_FREE_IF_COPY, PG_GETARG_BYTEA_PP, PG_GETARG_TEXT_PP, PG_NARGS, and PG_RETURN_TEXT_P.

◆ pgp_pub_decrypt_text()

Datum pgp_pub_decrypt_text ( PG_FUNCTION_ARGS  )

Definition at line 719 of file pgp-pgsql.c.

720{
721 bytea *data,
722 *key;
723 text *psw = NULL,
724 *arg = NULL;
725 text *res;
726
729 if (PG_NARGS() > 2)
730 psw = PG_GETARG_TEXT_PP(2);
731 if (PG_NARGS() > 3)
733
734 res = decrypt_internal(1, 1, data, key, psw, arg);
735
738 if (PG_NARGS() > 2)
739 PG_FREE_IF_COPY(psw, 2);
740 if (PG_NARGS() > 3)
742 PG_RETURN_TEXT_P(res);
743}

References arg, data, decrypt_internal(), sort-test::key, PG_FREE_IF_COPY, PG_GETARG_BYTEA_PP, PG_GETARG_TEXT_PP, PG_NARGS, and PG_RETURN_TEXT_P.

◆ pgp_pub_encrypt_bytea()

Datum pgp_pub_encrypt_bytea ( PG_FUNCTION_ARGS  )

Definition at line 647 of file pgp-pgsql.c.

648{
649 bytea *data,
650 *key;
651 text *arg = NULL;
652 text *res;
653
656 if (PG_NARGS() > 2)
658
659 res = encrypt_internal(1, 0, data, key, arg);
660
663 if (PG_NARGS() > 2)
665 PG_RETURN_TEXT_P(res);
666}
static bytea * encrypt_internal(int is_pubenc, int is_text, text *data, text *key, text *args)
Definition: pgp-pgsql.c:372

References arg, data, encrypt_internal(), sort-test::key, PG_FREE_IF_COPY, PG_GETARG_BYTEA_PP, PG_GETARG_TEXT_PP, PG_NARGS, and PG_RETURN_TEXT_P.

◆ pgp_pub_encrypt_text()

Datum pgp_pub_encrypt_text ( PG_FUNCTION_ARGS  )

Definition at line 669 of file pgp-pgsql.c.

670{
671 bytea *key;
672 text *arg = NULL;
673 text *res,
674 *data;
675
678 if (PG_NARGS() > 2)
680
681 res = encrypt_internal(1, 1, data, key, arg);
682
685 if (PG_NARGS() > 2)
687 PG_RETURN_TEXT_P(res);
688}

References arg, data, encrypt_internal(), sort-test::key, PG_FREE_IF_COPY, PG_GETARG_BYTEA_PP, PG_GETARG_TEXT_PP, PG_NARGS, and PG_RETURN_TEXT_P.

◆ pgp_sym_decrypt_bytea()

Datum pgp_sym_decrypt_bytea ( PG_FUNCTION_ARGS  )

Definition at line 599 of file pgp-pgsql.c.

600{
601 bytea *data;
602 text *arg = NULL;
603 text *res,
604 *key;
605
608 if (PG_NARGS() > 2)
610
611 res = decrypt_internal(0, 0, data, key, NULL, arg);
612
615 if (PG_NARGS() > 2)
617 PG_RETURN_TEXT_P(res);
618}

References arg, data, decrypt_internal(), sort-test::key, PG_FREE_IF_COPY, PG_GETARG_BYTEA_PP, PG_GETARG_TEXT_PP, PG_NARGS, and PG_RETURN_TEXT_P.

◆ pgp_sym_decrypt_text()

Datum pgp_sym_decrypt_text ( PG_FUNCTION_ARGS  )

Definition at line 621 of file pgp-pgsql.c.

622{
623 bytea *data;
624 text *arg = NULL;
625 text *res,
626 *key;
627
630 if (PG_NARGS() > 2)
632
633 res = decrypt_internal(0, 1, data, key, NULL, arg);
634
637 if (PG_NARGS() > 2)
639 PG_RETURN_TEXT_P(res);
640}

References arg, data, decrypt_internal(), sort-test::key, PG_FREE_IF_COPY, PG_GETARG_BYTEA_PP, PG_GETARG_TEXT_PP, PG_NARGS, and PG_RETURN_TEXT_P.

◆ pgp_sym_encrypt_bytea()

Datum pgp_sym_encrypt_bytea ( PG_FUNCTION_ARGS  )

Definition at line 554 of file pgp-pgsql.c.

555{
556 bytea *data;
557 text *arg = NULL;
558 text *res,
559 *key;
560
563 if (PG_NARGS() > 2)
565
566 res = encrypt_internal(0, 0, data, key, arg);
567
570 if (PG_NARGS() > 2)
572 PG_RETURN_TEXT_P(res);
573}

References arg, data, encrypt_internal(), sort-test::key, PG_FREE_IF_COPY, PG_GETARG_BYTEA_PP, PG_GETARG_TEXT_PP, PG_NARGS, and PG_RETURN_TEXT_P.

◆ pgp_sym_encrypt_text()

Datum pgp_sym_encrypt_text ( PG_FUNCTION_ARGS  )

Definition at line 576 of file pgp-pgsql.c.

577{
578 text *data,
579 *key;
580 text *arg = NULL;
581 text *res;
582
585 if (PG_NARGS() > 2)
587
588 res = encrypt_internal(0, 1, data, key, arg);
589
592 if (PG_NARGS() > 2)
594 PG_RETURN_TEXT_P(res);
595}

References arg, data, encrypt_internal(), sort-test::key, PG_FREE_IF_COPY, PG_GETARG_TEXT_PP, PG_NARGS, and PG_RETURN_TEXT_P.

◆ set_arg()

static int set_arg ( PGP_Context ctx,
char *  key,
char *  val,
struct debug_expect ex 
)
static

Definition at line 168 of file pgp-pgsql.c.

170{
171 int res = 0;
172
173 if (strcmp(key, "cipher-algo") == 0)
174 res = pgp_set_cipher_algo(ctx, val);
175 else if (strcmp(key, "disable-mdc") == 0)
176 res = pgp_disable_mdc(ctx, atoi(val));
177 else if (strcmp(key, "sess-key") == 0)
178 res = pgp_set_sess_key(ctx, atoi(val));
179 else if (strcmp(key, "s2k-mode") == 0)
180 res = pgp_set_s2k_mode(ctx, atoi(val));
181 else if (strcmp(key, "s2k-count") == 0)
182 res = pgp_set_s2k_count(ctx, atoi(val));
183 else if (strcmp(key, "s2k-digest-algo") == 0)
184 res = pgp_set_s2k_digest_algo(ctx, val);
185 else if (strcmp(key, "s2k-cipher-algo") == 0)
186 res = pgp_set_s2k_cipher_algo(ctx, val);
187 else if (strcmp(key, "compress-algo") == 0)
188 res = pgp_set_compress_algo(ctx, atoi(val));
189 else if (strcmp(key, "compress-level") == 0)
190 res = pgp_set_compress_level(ctx, atoi(val));
191 else if (strcmp(key, "convert-crlf") == 0)
192 res = pgp_set_convert_crlf(ctx, atoi(val));
193 else if (strcmp(key, "unicode-mode") == 0)
194 res = pgp_set_unicode_mode(ctx, atoi(val));
195
196 /*
197 * The remaining options are for debugging/testing and are therefore not
198 * documented in the user-facing docs.
199 */
200 else if (ex != NULL && strcmp(key, "debug") == 0)
201 ex->debug = atoi(val);
202 else if (ex != NULL && strcmp(key, "expect-cipher-algo") == 0)
203 {
204 ex->expect = 1;
206 }
207 else if (ex != NULL && strcmp(key, "expect-disable-mdc") == 0)
208 {
209 ex->expect = 1;
210 ex->disable_mdc = atoi(val);
211 }
212 else if (ex != NULL && strcmp(key, "expect-sess-key") == 0)
213 {
214 ex->expect = 1;
215 ex->use_sess_key = atoi(val);
216 }
217 else if (ex != NULL && strcmp(key, "expect-s2k-mode") == 0)
218 {
219 ex->expect = 1;
220 ex->s2k_mode = atoi(val);
221 }
222 else if (ex != NULL && strcmp(key, "expect-s2k-count") == 0)
223 {
224 ex->expect = 1;
225 ex->s2k_count = atoi(val);
226 }
227 else if (ex != NULL && strcmp(key, "expect-s2k-digest-algo") == 0)
228 {
229 ex->expect = 1;
231 }
232 else if (ex != NULL && strcmp(key, "expect-s2k-cipher-algo") == 0)
233 {
234 ex->expect = 1;
236 }
237 else if (ex != NULL && strcmp(key, "expect-compress-algo") == 0)
238 {
239 ex->expect = 1;
240 ex->compress_algo = atoi(val);
241 }
242 else if (ex != NULL && strcmp(key, "expect-unicode-mode") == 0)
243 {
244 ex->expect = 1;
245 ex->unicode_mode = atoi(val);
246 }
247 else
248 res = PXE_ARGUMENT_ERROR;
249
250 return res;
251}
int pgp_disable_mdc(PGP_Context *ctx, int disable)
Definition: pgp.c:223
int pgp_get_cipher_code(const char *name)
Definition: pgp.c:115
int pgp_set_s2k_digest_algo(PGP_Context *ctx, const char *name)
Definition: pgp.c:329
int pgp_set_s2k_mode(PGP_Context *ctx, int mode)
Definition: pgp.c:244
int pgp_get_digest_code(const char *name)
Definition: pgp.c:104
int pgp_set_s2k_cipher_algo(PGP_Context *ctx, const char *name)
Definition: pgp.c:318
int pgp_set_compress_algo(PGP_Context *ctx, int algo)
Definition: pgp.c:274
int pgp_set_cipher_algo(PGP_Context *ctx, const char *name)
Definition: pgp.c:307
int pgp_set_convert_crlf(PGP_Context *ctx, int doit)
Definition: pgp.c:237
int pgp_set_unicode_mode(PGP_Context *ctx, int mode)
Definition: pgp.c:346
int pgp_set_s2k_count(PGP_Context *ctx, int count)
Definition: pgp.c:263
int pgp_set_sess_key(PGP_Context *ctx, int use)
Definition: pgp.c:230
int pgp_set_compress_level(PGP_Context *ctx, int level)
Definition: pgp.c:289

References debug_expect::cipher_algo, debug_expect::compress_algo, debug_expect::debug, debug_expect::disable_mdc, debug_expect::expect, sort-test::key, pgp_disable_mdc(), pgp_get_cipher_code(), pgp_get_digest_code(), pgp_set_cipher_algo(), pgp_set_compress_algo(), pgp_set_compress_level(), pgp_set_convert_crlf(), pgp_set_s2k_cipher_algo(), pgp_set_s2k_count(), pgp_set_s2k_digest_algo(), pgp_set_s2k_mode(), pgp_set_sess_key(), pgp_set_unicode_mode(), PXE_ARGUMENT_ERROR, debug_expect::s2k_cipher_algo, debug_expect::s2k_count, debug_expect::s2k_digest_algo, debug_expect::s2k_mode, debug_expect::unicode_mode, debug_expect::use_sess_key, and val.

Referenced by parse_args().

◆ show_debug()

static void show_debug ( const char *  msg)
static

Definition at line 162 of file pgp-pgsql.c.

163{
164 ereport(NOTICE, (errmsg("dbg: %s", msg)));
165}

References ereport, errmsg(), and NOTICE.

Referenced by init_work().