LCOV - differential code coverage report
Current view: top level - contrib/pgcrypto - pgcrypto.c (source / functions) Coverage Total Hit UBC CBC
Current: Differential Code Coverage 16@8cea358b128 vs 17@8cea358b128 Lines: 93.4 % 183 171 12 171
Current Date: 2024-04-14 14:21:10 Functions: 91.7 % 24 22 2 22
Baseline: 16@8cea358b128 Branches: 35.3 % 266 94 172 94
Baseline Date: 2024-04-14 14:21:09 Line coverage date bins:
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed (240..) days: 93.4 % 183 171 12 171
Function coverage date bins:
(240..) days: 91.7 % 24 22 2 22
Branch coverage date bins:
(240..) days: 35.3 % 266 94 172 94

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : /*
                                  2                 :                :  * pgcrypto.c
                                  3                 :                :  *      Various cryptographic stuff for PostgreSQL.
                                  4                 :                :  *
                                  5                 :                :  * Copyright (c) 2001 Marko Kreen
                                  6                 :                :  * All rights reserved.
                                  7                 :                :  *
                                  8                 :                :  * Redistribution and use in source and binary forms, with or without
                                  9                 :                :  * modification, are permitted provided that the following conditions
                                 10                 :                :  * are met:
                                 11                 :                :  * 1. Redistributions of source code must retain the above copyright
                                 12                 :                :  *    notice, this list of conditions and the following disclaimer.
                                 13                 :                :  * 2. Redistributions in binary form must reproduce the above copyright
                                 14                 :                :  *    notice, this list of conditions and the following disclaimer in the
                                 15                 :                :  *    documentation and/or other materials provided with the distribution.
                                 16                 :                :  *
                                 17                 :                :  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                                 18                 :                :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                                 19                 :                :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                                 20                 :                :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                                 21                 :                :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                                 22                 :                :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                                 23                 :                :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                                 24                 :                :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                                 25                 :                :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                                 26                 :                :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                                 27                 :                :  * SUCH DAMAGE.
                                 28                 :                :  *
                                 29                 :                :  * contrib/pgcrypto/pgcrypto.c
                                 30                 :                :  */
                                 31                 :                : 
                                 32                 :                : #include "postgres.h"
                                 33                 :                : 
                                 34                 :                : #include <ctype.h>
                                 35                 :                : 
                                 36                 :                : #include "parser/scansup.h"
                                 37                 :                : #include "pgcrypto.h"
                                 38                 :                : #include "px-crypt.h"
                                 39                 :                : #include "px.h"
                                 40                 :                : #include "utils/builtins.h"
                                 41                 :                : #include "utils/uuid.h"
                                 42                 :                : #include "varatt.h"
                                 43                 :                : 
 6529 tgl@sss.pgh.pa.us          44                 :CBC          23 : PG_MODULE_MAGIC;
                                 45                 :                : 
                                 46                 :                : /* private stuff */
                                 47                 :                : 
                                 48                 :                : typedef int (*PFN) (const char *name, void **res);
                                 49                 :                : static void *find_provider(text *name, PFN provider_lookup, const char *desc,
                                 50                 :                :                            int silent);
                                 51                 :                : 
                                 52                 :                : /* SQL function: hash(bytea, text) returns bytea */
 8272 bruce@momjian.us           53                 :              8 : PG_FUNCTION_INFO_V1(pg_digest);
                                 54                 :                : 
                                 55                 :                : Datum
                                 56                 :             44 : pg_digest(PG_FUNCTION_ARGS)
                                 57                 :                : {
                                 58                 :                :     bytea      *arg;
                                 59                 :                :     text       *name;
                                 60                 :                :     unsigned    len,
                                 61                 :                :                 hlen;
                                 62                 :                :     PX_MD      *md;
                                 63                 :                :     bytea      *res;
                                 64                 :                : 
 2590 noah@leadboat.com          65                 :             44 :     name = PG_GETARG_TEXT_PP(1);
                                 66                 :                : 
                                 67                 :                :     /* will give error if fails */
 8272 bruce@momjian.us           68                 :             44 :     md = find_provider(name, (PFN) px_find_digest, "Digest", 0);
                                 69                 :                : 
                                 70                 :             43 :     hlen = px_md_result_size(md);
                                 71                 :                : 
 8424                            72                 :             43 :     res = (text *) palloc(hlen + VARHDRSZ);
 6256 tgl@sss.pgh.pa.us          73                 :             43 :     SET_VARSIZE(res, hlen + VARHDRSZ);
                                 74                 :                : 
 2590 noah@leadboat.com          75                 :             43 :     arg = PG_GETARG_BYTEA_PP(0);
                                 76   [ -  +  -  -  :             43 :     len = VARSIZE_ANY_EXHDR(arg);
                                     -  -  -  -  -  
                                                 + ]
                                 77                 :                : 
                                 78         [ -  + ]:             43 :     px_md_update(md, (uint8 *) VARDATA_ANY(arg), len);
 6777 tgl@sss.pgh.pa.us          79                 :             43 :     px_md_finish(md, (uint8 *) VARDATA(res));
 8272 bruce@momjian.us           80                 :             43 :     px_md_free(md);
                                 81                 :                : 
 8566 peter_e@gmx.net            82         [ -  + ]:             43 :     PG_FREE_IF_COPY(arg, 0);
 8468 bruce@momjian.us           83         [ -  + ]:             43 :     PG_FREE_IF_COPY(name, 1);
                                 84                 :                : 
 8272                            85                 :             43 :     PG_RETURN_BYTEA_P(res);
                                 86                 :                : }
                                 87                 :                : 
                                 88                 :                : /* SQL function: hmac(data:bytea, key:bytea, type:text) returns bytea */
                                 89                 :              7 : PG_FUNCTION_INFO_V1(pg_hmac);
                                 90                 :                : 
                                 91                 :                : Datum
                                 92                 :             15 : pg_hmac(PG_FUNCTION_ARGS)
                                 93                 :                : {
                                 94                 :                :     bytea      *arg;
                                 95                 :                :     bytea      *key;
                                 96                 :                :     text       *name;
                                 97                 :                :     unsigned    len,
                                 98                 :                :                 hlen,
                                 99                 :                :                 klen;
                                100                 :                :     PX_HMAC    *h;
                                101                 :                :     bytea      *res;
                                102                 :                : 
 2590 noah@leadboat.com         103                 :             15 :     name = PG_GETARG_TEXT_PP(2);
                                104                 :                : 
                                105                 :                :     /* will give error if fails */
 8272 bruce@momjian.us          106                 :             15 :     h = find_provider(name, (PFN) px_find_hmac, "HMAC", 0);
                                107                 :                : 
                                108                 :             14 :     hlen = px_hmac_result_size(h);
                                109                 :                : 
                                110                 :             14 :     res = (text *) palloc(hlen + VARHDRSZ);
 6256 tgl@sss.pgh.pa.us         111                 :             14 :     SET_VARSIZE(res, hlen + VARHDRSZ);
                                112                 :                : 
 2590 noah@leadboat.com         113                 :             14 :     arg = PG_GETARG_BYTEA_PP(0);
                                114                 :             14 :     key = PG_GETARG_BYTEA_PP(1);
                                115   [ -  +  -  -  :             14 :     len = VARSIZE_ANY_EXHDR(arg);
                                     -  -  -  -  -  
                                                 + ]
                                116   [ -  +  -  -  :             14 :     klen = VARSIZE_ANY_EXHDR(key);
                                     -  -  -  -  -  
                                                 + ]
                                117                 :                : 
                                118         [ -  + ]:             14 :     px_hmac_init(h, (uint8 *) VARDATA_ANY(key), klen);
                                119         [ -  + ]:             14 :     px_hmac_update(h, (uint8 *) VARDATA_ANY(arg), len);
 6777 tgl@sss.pgh.pa.us         120                 :             14 :     px_hmac_finish(h, (uint8 *) VARDATA(res));
 8272 bruce@momjian.us          121                 :             14 :     px_hmac_free(h);
                                122                 :                : 
                                123         [ -  + ]:             14 :     PG_FREE_IF_COPY(arg, 0);
                                124         [ -  + ]:             14 :     PG_FREE_IF_COPY(key, 1);
                                125         [ -  + ]:             14 :     PG_FREE_IF_COPY(name, 2);
                                126                 :                : 
                                127                 :             14 :     PG_RETURN_BYTEA_P(res);
                                128                 :                : }
                                129                 :                : 
                                130                 :                : 
                                131                 :                : /* SQL function: pg_gen_salt(text) returns text */
                                132                 :              4 : PG_FUNCTION_INFO_V1(pg_gen_salt);
                                133                 :                : 
                                134                 :                : Datum
                                135                 :              3 : pg_gen_salt(PG_FUNCTION_ARGS)
                                136                 :                : {
 5864 tgl@sss.pgh.pa.us         137                 :              3 :     text       *arg0 = PG_GETARG_TEXT_PP(0);
                                138                 :                :     int         len;
                                139                 :                :     char        buf[PX_MAX_SALT_LEN + 1];
                                140                 :                : 
                                141                 :              3 :     text_to_cstring_buffer(arg0, buf, sizeof(buf));
 8239 bruce@momjian.us          142                 :              3 :     len = px_gen_salt(buf, buf, 0);
 6964 neilc@samurai.com         143         [ +  + ]:              3 :     if (len < 0)
 7570 tgl@sss.pgh.pa.us         144         [ +  - ]:              1 :         ereport(ERROR,
                                145                 :                :                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                146                 :                :                  errmsg("gen_salt: %s", px_strerror(len))));
                                147                 :                : 
 8272 bruce@momjian.us          148         [ -  + ]:              2 :     PG_FREE_IF_COPY(arg0, 0);
                                149                 :                : 
 5864 tgl@sss.pgh.pa.us         150                 :              2 :     PG_RETURN_TEXT_P(cstring_to_text_with_len(buf, len));
                                151                 :                : }
                                152                 :                : 
                                153                 :                : /* SQL function: pg_gen_salt(text, int4) returns text */
 8239 bruce@momjian.us          154                 :              3 : PG_FUNCTION_INFO_V1(pg_gen_salt_rounds);
                                155                 :                : 
                                156                 :                : Datum
                                157                 :              2 : pg_gen_salt_rounds(PG_FUNCTION_ARGS)
                                158                 :                : {
 5864 tgl@sss.pgh.pa.us         159                 :              2 :     text       *arg0 = PG_GETARG_TEXT_PP(0);
                                160                 :              2 :     int         rounds = PG_GETARG_INT32(1);
                                161                 :                :     int         len;
                                162                 :                :     char        buf[PX_MAX_SALT_LEN + 1];
                                163                 :                : 
                                164                 :              2 :     text_to_cstring_buffer(arg0, buf, sizeof(buf));
 8239 bruce@momjian.us          165                 :              2 :     len = px_gen_salt(buf, buf, rounds);
 6964 neilc@samurai.com         166         [ -  + ]:              2 :     if (len < 0)
 7570 tgl@sss.pgh.pa.us         167         [ #  # ]:UBC           0 :         ereport(ERROR,
                                168                 :                :                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                169                 :                :                  errmsg("gen_salt: %s", px_strerror(len))));
                                170                 :                : 
 8239 bruce@momjian.us          171         [ -  + ]:CBC           2 :     PG_FREE_IF_COPY(arg0, 0);
                                172                 :                : 
 5864 tgl@sss.pgh.pa.us         173                 :              2 :     PG_RETURN_TEXT_P(cstring_to_text_with_len(buf, len));
                                174                 :                : }
                                175                 :                : 
                                176                 :                : /* SQL function: pg_crypt(psw:text, salt:text) returns text */
 8272 bruce@momjian.us          177                 :              5 : PG_FUNCTION_INFO_V1(pg_crypt);
                                178                 :                : 
                                179                 :                : Datum
                                180                 :             25 : pg_crypt(PG_FUNCTION_ARGS)
                                181                 :                : {
 5864 tgl@sss.pgh.pa.us         182                 :             25 :     text       *arg0 = PG_GETARG_TEXT_PP(0);
                                183                 :             25 :     text       *arg1 = PG_GETARG_TEXT_PP(1);
                                184                 :                :     char       *buf0,
                                185                 :                :                *buf1,
                                186                 :                :                *cres,
                                187                 :                :                *resbuf;
                                188                 :                :     text       *res;
                                189                 :                : 
                                190                 :             25 :     buf0 = text_to_cstring(arg0);
                                191                 :             25 :     buf1 = text_to_cstring(arg1);
                                192                 :                : 
 6365 neilc@samurai.com         193                 :             25 :     resbuf = palloc0(PX_MAX_CRYPT);
                                194                 :                : 
 8272 bruce@momjian.us          195                 :             25 :     cres = px_crypt(buf0, buf1, resbuf, PX_MAX_CRYPT);
                                196                 :                : 
                                197                 :             20 :     pfree(buf0);
                                198                 :             20 :     pfree(buf1);
                                199                 :                : 
                                200         [ +  + ]:             20 :     if (cres == NULL)
 7570 tgl@sss.pgh.pa.us         201         [ +  - ]:              2 :         ereport(ERROR,
                                202                 :                :                 (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
                                203                 :                :                  errmsg("crypt(3) returned NULL")));
                                204                 :                : 
 5864                           205                 :             18 :     res = cstring_to_text(cres);
                                206                 :                : 
 8272 bruce@momjian.us          207                 :             18 :     pfree(resbuf);
                                208                 :                : 
                                209         [ -  + ]:             18 :     PG_FREE_IF_COPY(arg0, 0);
                                210         [ -  + ]:             18 :     PG_FREE_IF_COPY(arg1, 1);
                                211                 :                : 
                                212                 :             18 :     PG_RETURN_TEXT_P(res);
                                213                 :                : }
                                214                 :                : 
                                215                 :                : /* SQL function: pg_encrypt(bytea, bytea, text) returns bytea */
                                216                 :              7 : PG_FUNCTION_INFO_V1(pg_encrypt);
                                217                 :                : 
                                218                 :                : Datum
                                219                 :             55 : pg_encrypt(PG_FUNCTION_ARGS)
                                220                 :                : {
                                221                 :                :     int         err;
                                222                 :                :     bytea      *data,
                                223                 :                :                *key,
                                224                 :                :                *res;
                                225                 :                :     text       *type;
                                226                 :                :     PX_Combo   *c;
                                227                 :                :     unsigned    dlen,
                                228                 :                :                 klen,
                                229                 :                :                 rlen;
                                230                 :                : 
 2590 noah@leadboat.com         231                 :             55 :     type = PG_GETARG_TEXT_PP(2);
 8207 bruce@momjian.us          232                 :             55 :     c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
                                233                 :                : 
 2590 noah@leadboat.com         234                 :             54 :     data = PG_GETARG_BYTEA_PP(0);
                                235                 :             54 :     key = PG_GETARG_BYTEA_PP(1);
                                236   [ -  +  -  -  :             54 :     dlen = VARSIZE_ANY_EXHDR(data);
                                     -  -  -  -  -  
                                                 + ]
                                237   [ -  +  -  -  :             54 :     klen = VARSIZE_ANY_EXHDR(key);
                                     -  -  -  -  -  
                                                 + ]
                                238                 :                : 
 8272 bruce@momjian.us          239                 :             54 :     rlen = px_combo_encrypt_len(c, dlen);
                                240                 :             54 :     res = palloc(VARHDRSZ + rlen);
                                241                 :                : 
 2590 noah@leadboat.com         242         [ -  + ]:             54 :     err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen, NULL, 0);
 8272 bruce@momjian.us          243         [ +  + ]:             54 :     if (!err)
 2590 noah@leadboat.com         244         [ -  + ]:             50 :         err = px_combo_encrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
                                245                 :                :                                (uint8 *) VARDATA(res), &rlen);
 8272 bruce@momjian.us          246                 :             54 :     px_combo_free(c);
                                247                 :                : 
                                248         [ -  + ]:             54 :     PG_FREE_IF_COPY(data, 0);
                                249         [ -  + ]:             54 :     PG_FREE_IF_COPY(key, 1);
                                250         [ -  + ]:             54 :     PG_FREE_IF_COPY(type, 2);
                                251                 :                : 
 8207                           252         [ +  + ]:             54 :     if (err)
                                253                 :                :     {
 8272                           254                 :             33 :         pfree(res);
 7570 tgl@sss.pgh.pa.us         255         [ +  - ]:             33 :         ereport(ERROR,
                                256                 :                :                 (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
                                257                 :                :                  errmsg("encrypt error: %s", px_strerror(err))));
                                258                 :                :     }
                                259                 :                : 
 6256                           260                 :             21 :     SET_VARSIZE(res, VARHDRSZ + rlen);
 8272 bruce@momjian.us          261                 :             21 :     PG_RETURN_BYTEA_P(res);
                                262                 :                : }
                                263                 :                : 
                                264                 :                : /* SQL function: pg_decrypt(bytea, bytea, text) returns bytea */
                                265                 :              3 : PG_FUNCTION_INFO_V1(pg_decrypt);
                                266                 :                : 
                                267                 :                : Datum
                                268                 :              5 : pg_decrypt(PG_FUNCTION_ARGS)
                                269                 :                : {
                                270                 :                :     int         err;
                                271                 :                :     bytea      *data,
                                272                 :                :                *key,
                                273                 :                :                *res;
                                274                 :                :     text       *type;
                                275                 :                :     PX_Combo   *c;
                                276                 :                :     unsigned    dlen,
                                277                 :                :                 klen,
                                278                 :                :                 rlen;
                                279                 :                : 
 2590 noah@leadboat.com         280                 :              5 :     type = PG_GETARG_TEXT_PP(2);
 8207 bruce@momjian.us          281                 :              5 :     c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
                                282                 :                : 
 2590 noah@leadboat.com         283                 :              5 :     data = PG_GETARG_BYTEA_PP(0);
                                284                 :              5 :     key = PG_GETARG_BYTEA_PP(1);
                                285   [ -  +  -  -  :              5 :     dlen = VARSIZE_ANY_EXHDR(data);
                                     -  -  -  -  -  
                                                 + ]
                                286   [ -  +  -  -  :              5 :     klen = VARSIZE_ANY_EXHDR(key);
                                     -  -  -  -  -  
                                                 + ]
                                287                 :                : 
 8272 bruce@momjian.us          288                 :              5 :     rlen = px_combo_decrypt_len(c, dlen);
                                289                 :              5 :     res = palloc(VARHDRSZ + rlen);
                                290                 :                : 
 2590 noah@leadboat.com         291         [ -  + ]:              5 :     err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen, NULL, 0);
 8272 bruce@momjian.us          292         [ +  - ]:              5 :     if (!err)
 2590 noah@leadboat.com         293         [ -  + ]:              5 :         err = px_combo_decrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
                                294                 :                :                                (uint8 *) VARDATA(res), &rlen);
                                295                 :                : 
 8272 bruce@momjian.us          296                 :              5 :     px_combo_free(c);
                                297                 :                : 
                                298         [ +  + ]:              5 :     if (err)
 7570 tgl@sss.pgh.pa.us         299         [ +  - ]:              1 :         ereport(ERROR,
                                300                 :                :                 (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
                                301                 :                :                  errmsg("decrypt error: %s", px_strerror(err))));
                                302                 :                : 
 6256                           303                 :              4 :     SET_VARSIZE(res, VARHDRSZ + rlen);
                                304                 :                : 
 8272 bruce@momjian.us          305         [ -  + ]:              4 :     PG_FREE_IF_COPY(data, 0);
                                306         [ -  + ]:              4 :     PG_FREE_IF_COPY(key, 1);
                                307         [ -  + ]:              4 :     PG_FREE_IF_COPY(type, 2);
                                308                 :                : 
                                309                 :              4 :     PG_RETURN_BYTEA_P(res);
                                310                 :                : }
                                311                 :                : 
                                312                 :                : /* SQL function: pg_encrypt_iv(bytea, bytea, bytea, text) returns bytea */
                                313                 :              6 : PG_FUNCTION_INFO_V1(pg_encrypt_iv);
                                314                 :                : 
                                315                 :                : Datum
                                316                 :              5 : pg_encrypt_iv(PG_FUNCTION_ARGS)
                                317                 :                : {
                                318                 :                :     int         err;
                                319                 :                :     bytea      *data,
                                320                 :                :                *key,
                                321                 :                :                *iv,
                                322                 :                :                *res;
                                323                 :                :     text       *type;
                                324                 :                :     PX_Combo   *c;
                                325                 :                :     unsigned    dlen,
                                326                 :                :                 klen,
                                327                 :                :                 ivlen,
                                328                 :                :                 rlen;
                                329                 :                : 
 2590 noah@leadboat.com         330                 :              5 :     type = PG_GETARG_TEXT_PP(3);
 8207 bruce@momjian.us          331                 :              5 :     c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
                                332                 :                : 
 2590 noah@leadboat.com         333                 :              5 :     data = PG_GETARG_BYTEA_PP(0);
                                334                 :              5 :     key = PG_GETARG_BYTEA_PP(1);
                                335                 :              5 :     iv = PG_GETARG_BYTEA_PP(2);
                                336   [ -  +  -  -  :              5 :     dlen = VARSIZE_ANY_EXHDR(data);
                                     -  -  -  -  -  
                                                 + ]
                                337   [ -  +  -  -  :              5 :     klen = VARSIZE_ANY_EXHDR(key);
                                     -  -  -  -  -  
                                                 + ]
                                338   [ -  +  -  -  :              5 :     ivlen = VARSIZE_ANY_EXHDR(iv);
                                     -  -  -  -  -  
                                                 + ]
                                339                 :                : 
 8272 bruce@momjian.us          340                 :              5 :     rlen = px_combo_encrypt_len(c, dlen);
                                341                 :              5 :     res = palloc(VARHDRSZ + rlen);
                                342                 :                : 
 2590 noah@leadboat.com         343   [ -  +  -  + ]:              5 :     err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen,
                                344                 :                :                         (uint8 *) VARDATA_ANY(iv), ivlen);
 8272 bruce@momjian.us          345         [ +  - ]:              5 :     if (!err)
 2590 noah@leadboat.com         346         [ -  + ]:              5 :         err = px_combo_encrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
                                347                 :                :                                (uint8 *) VARDATA(res), &rlen);
                                348                 :                : 
 8272 bruce@momjian.us          349                 :              5 :     px_combo_free(c);
                                350                 :                : 
                                351         [ +  + ]:              5 :     if (err)
 7570 tgl@sss.pgh.pa.us         352         [ +  - ]:              3 :         ereport(ERROR,
                                353                 :                :                 (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
                                354                 :                :                  errmsg("encrypt_iv error: %s", px_strerror(err))));
                                355                 :                : 
 6256                           356                 :              2 :     SET_VARSIZE(res, VARHDRSZ + rlen);
                                357                 :                : 
 8272 bruce@momjian.us          358         [ -  + ]:              2 :     PG_FREE_IF_COPY(data, 0);
                                359         [ -  + ]:              2 :     PG_FREE_IF_COPY(key, 1);
                                360         [ -  + ]:              2 :     PG_FREE_IF_COPY(iv, 2);
                                361         [ -  + ]:              2 :     PG_FREE_IF_COPY(type, 3);
                                362                 :                : 
                                363                 :              2 :     PG_RETURN_BYTEA_P(res);
                                364                 :                : }
                                365                 :                : 
                                366                 :                : /* SQL function: pg_decrypt_iv(bytea, bytea, bytea, text) returns bytea */
                                367                 :              6 : PG_FUNCTION_INFO_V1(pg_decrypt_iv);
                                368                 :                : 
                                369                 :                : Datum
                                370                 :              6 : pg_decrypt_iv(PG_FUNCTION_ARGS)
                                371                 :                : {
                                372                 :                :     int         err;
                                373                 :                :     bytea      *data,
                                374                 :                :                *key,
                                375                 :                :                *iv,
                                376                 :                :                *res;
                                377                 :                :     text       *type;
                                378                 :                :     PX_Combo   *c;
                                379                 :                :     unsigned    dlen,
                                380                 :                :                 klen,
                                381                 :                :                 rlen,
                                382                 :                :                 ivlen;
                                383                 :                : 
 2590 noah@leadboat.com         384                 :              6 :     type = PG_GETARG_TEXT_PP(3);
 8207 bruce@momjian.us          385                 :              6 :     c = find_provider(type, (PFN) px_find_combo, "Cipher", 0);
                                386                 :                : 
 2590 noah@leadboat.com         387                 :              6 :     data = PG_GETARG_BYTEA_PP(0);
                                388                 :              6 :     key = PG_GETARG_BYTEA_PP(1);
                                389                 :              6 :     iv = PG_GETARG_BYTEA_PP(2);
                                390   [ -  +  -  -  :              6 :     dlen = VARSIZE_ANY_EXHDR(data);
                                     -  -  -  -  -  
                                                 + ]
                                391   [ -  +  -  -  :              6 :     klen = VARSIZE_ANY_EXHDR(key);
                                     -  -  -  -  -  
                                                 + ]
                                392   [ -  +  -  -  :              6 :     ivlen = VARSIZE_ANY_EXHDR(iv);
                                     -  -  -  -  -  
                                                 + ]
                                393                 :                : 
 8272 bruce@momjian.us          394                 :              6 :     rlen = px_combo_decrypt_len(c, dlen);
                                395                 :              6 :     res = palloc(VARHDRSZ + rlen);
                                396                 :                : 
 2590 noah@leadboat.com         397   [ -  +  -  + ]:              6 :     err = px_combo_init(c, (uint8 *) VARDATA_ANY(key), klen,
                                398                 :                :                         (uint8 *) VARDATA_ANY(iv), ivlen);
 8272 bruce@momjian.us          399         [ +  - ]:              6 :     if (!err)
 2590 noah@leadboat.com         400         [ -  + ]:              6 :         err = px_combo_decrypt(c, (uint8 *) VARDATA_ANY(data), dlen,
                                401                 :                :                                (uint8 *) VARDATA(res), &rlen);
                                402                 :                : 
 8272 bruce@momjian.us          403                 :              6 :     px_combo_free(c);
                                404                 :                : 
                                405         [ +  + ]:              6 :     if (err)
 7570 tgl@sss.pgh.pa.us         406         [ +  - ]:              4 :         ereport(ERROR,
                                407                 :                :                 (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
                                408                 :                :                  errmsg("decrypt_iv error: %s", px_strerror(err))));
                                409                 :                : 
 6256                           410                 :              2 :     SET_VARSIZE(res, VARHDRSZ + rlen);
                                411                 :                : 
 8272 bruce@momjian.us          412         [ -  + ]:              2 :     PG_FREE_IF_COPY(data, 0);
                                413         [ -  + ]:              2 :     PG_FREE_IF_COPY(key, 1);
                                414         [ -  + ]:              2 :     PG_FREE_IF_COPY(iv, 2);
                                415         [ -  + ]:              2 :     PG_FREE_IF_COPY(type, 3);
                                416                 :                : 
                                417                 :              2 :     PG_RETURN_BYTEA_P(res);
                                418                 :                : }
                                419                 :                : 
                                420                 :                : /* SQL function: pg_random_bytes(int4) returns bytea */
 6485 neilc@samurai.com         421                 :              1 : PG_FUNCTION_INFO_V1(pg_random_bytes);
                                422                 :                : 
                                423                 :                : Datum
 6485 neilc@samurai.com         424                 :UBC           0 : pg_random_bytes(PG_FUNCTION_ARGS)
                                425                 :                : {
 6402 bruce@momjian.us          426                 :              0 :     int         len = PG_GETARG_INT32(0);
                                427                 :                :     bytea      *res;
                                428                 :                : 
 6485 neilc@samurai.com         429   [ #  #  #  # ]:              0 :     if (len < 1 || len > 1024)
                                430         [ #  # ]:              0 :         ereport(ERROR,
                                431                 :                :                 (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
                                432                 :                :                  errmsg("Length not in range")));
                                433                 :                : 
                                434                 :              0 :     res = palloc(VARHDRSZ + len);
 6256 tgl@sss.pgh.pa.us         435                 :              0 :     SET_VARSIZE(res, VARHDRSZ + len);
                                436                 :                : 
                                437                 :                :     /* generate result */
 2687 heikki.linnakangas@i      438         [ #  # ]:              0 :     if (!pg_strong_random(VARDATA(res), len))
                                439                 :              0 :         px_THROW_ERROR(PXE_NO_RANDOM);
                                440                 :                : 
 6485 neilc@samurai.com         441                 :              0 :     PG_RETURN_BYTEA_P(res);
                                442                 :                : }
                                443                 :                : 
                                444                 :                : /* SQL function: gen_random_uuid() returns uuid */
 3740 tgl@sss.pgh.pa.us         445                 :CBC           1 : PG_FUNCTION_INFO_V1(pg_random_uuid);
                                446                 :                : 
                                447                 :                : Datum
 3740 tgl@sss.pgh.pa.us         448                 :UBC           0 : pg_random_uuid(PG_FUNCTION_ARGS)
                                449                 :                : {
                                450                 :                :     /* redirect to built-in function */
 1736 peter@eisentraut.org      451                 :              0 :     return gen_random_uuid(fcinfo);
                                452                 :                : }
                                453                 :                : 
                                454                 :                : static void *
 8207 bruce@momjian.us          455                 :CBC         130 : find_provider(text *name,
                                456                 :                :               PFN provider_lookup,
                                457                 :                :               const char *desc, int silent)
                                458                 :                : {
                                459                 :                :     void       *res;
                                460                 :                :     char       *buf;
                                461                 :                :     int         err;
                                462                 :                : 
 2590 noah@leadboat.com         463         [ -  + ]:            130 :     buf = downcase_truncate_identifier(VARDATA_ANY(name),
                                464   [ -  +  -  -  :            130 :                                        VARSIZE_ANY_EXHDR(name),
                                     -  -  -  -  -  
                                                 + ]
                                465                 :                :                                        false);
                                466                 :                : 
 8272 bruce@momjian.us          467                 :            130 :     err = provider_lookup(buf, &res);
                                468                 :                : 
                                469   [ +  +  +  - ]:            130 :     if (err && !silent)
 7570 tgl@sss.pgh.pa.us         470         [ +  - ]:              3 :         ereport(ERROR,
                                471                 :                :                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                472                 :                :                  errmsg("Cannot use \"%s\": %s", buf, px_strerror(err))));
                                473                 :                : 
 7282                           474                 :            127 :     pfree(buf);
                                475                 :                : 
 8272 bruce@momjian.us          476         [ +  - ]:            127 :     return err ? NULL : res;
                                477                 :                : }
        

Generated by: LCOV version 2.1-beta2-3-g6141622