#include "postgres.h"#include "px.h"
Go to the source code of this file.
Data Structures | |
| struct | error_desc |
Functions | |
| const char * | px_strerror (int err) |
| const char * | px_resolve_alias (const PX_Alias *list, const char *name) |
| void | px_set_debug_handler (void(*handler)(const char *)) |
| void | px_debug (const char *fmt,...) |
| static unsigned | combo_encrypt_len (PX_Combo *cx, unsigned dlen) |
| static unsigned | combo_decrypt_len (PX_Combo *cx, unsigned dlen) |
| static int | combo_init (PX_Combo *cx, const uint8 *key, unsigned klen, const uint8 *iv, unsigned ivlen) |
| static int | combo_encrypt (PX_Combo *cx, const uint8 *data, unsigned dlen, uint8 *res, unsigned *rlen) |
| static int | combo_decrypt (PX_Combo *cx, const uint8 *data, unsigned dlen, uint8 *res, unsigned *rlen) |
| static void | combo_free (PX_Combo *cx) |
| static int | parse_cipher_name (char *full, char **cipher, char **pad) |
| int | px_find_combo (const char *name, PX_Combo **res) |
Variables | |
| static struct error_desc | px_err_list [] |
| static void(* | debug_handler )(const char *) = NULL |
| static int combo_decrypt | ( | PX_Combo * | cx, | |
| const uint8 * | data, | |||
| unsigned | dlen, | |||
| uint8 * | res, | |||
| unsigned * | rlen | |||
| ) | [static] |
Definition at line 269 of file px.c.
References px_combo::cipher, i, px_combo::padding, px_cipher_block_size, and px_cipher_decrypt.
{
unsigned bs,
i,
pad;
unsigned pad_ok;
PX_Cipher *c = cx->cipher;
/* decide whether zero-length input is allowed */
if (dlen == 0)
{
/* with padding, empty ciphertext is not allowed */
if (cx->padding)
return PXE_DECRYPT_FAILED;
/* without padding, report empty result */
*rlen = 0;
return 0;
}
bs = px_cipher_block_size(c);
if (bs > 1 && (dlen % bs) != 0)
goto block_error;
/* decrypt */
*rlen = dlen;
px_cipher_decrypt(c, data, dlen, res);
/* unpad */
if (bs > 1 && cx->padding)
{
pad = res[*rlen - 1];
pad_ok = 0;
if (pad > 0 && pad <= bs && pad <= *rlen)
{
pad_ok = 1;
for (i = *rlen - pad; i < *rlen; i++)
if (res[i] != pad)
{
pad_ok = 0;
break;
}
}
if (pad_ok)
*rlen -= pad;
}
return 0;
block_error:
return PXE_NOTBLOCKSIZE;
}
| static unsigned combo_decrypt_len | ( | PX_Combo * | cx, | |
| unsigned | dlen | |||
| ) | [static] |
| static int combo_encrypt | ( | PX_Combo * | cx, | |
| const uint8 * | data, | |||
| unsigned | dlen, | |||
| uint8 * | res, | |||
| unsigned * | rlen | |||
| ) | [static] |
Definition at line 200 of file px.c.
References px_combo::cipher, error_desc::err, i, px_combo::padding, px_alloc, px_cipher_block_size, px_cipher_encrypt, and px_free.
{
int err = 0;
uint8 *bbuf;
unsigned bs,
bpos,
i,
pad;
PX_Cipher *c = cx->cipher;
bbuf = NULL;
bs = px_cipher_block_size(c);
/* encrypt */
if (bs > 1)
{
bbuf = px_alloc(bs * 4);
bpos = dlen % bs;
*rlen = dlen - bpos;
memcpy(bbuf, data + *rlen, bpos);
/* encrypt full-block data */
if (*rlen)
{
err = px_cipher_encrypt(c, data, *rlen, res);
if (err)
goto out;
}
/* bbuf has now bpos bytes of stuff */
if (cx->padding)
{
pad = bs - (bpos % bs);
for (i = 0; i < pad; i++)
bbuf[bpos++] = pad;
}
else if (bpos % bs)
{
/* ERROR? */
pad = bs - (bpos % bs);
for (i = 0; i < pad; i++)
bbuf[bpos++] = 0;
}
/* encrypt the rest - pad */
if (bpos)
{
err = px_cipher_encrypt(c, bbuf, bpos, res + *rlen);
*rlen += bpos;
}
}
else
{
/* stream cipher/mode - no pad needed */
err = px_cipher_encrypt(c, data, dlen, res);
if (err)
goto out;
*rlen = dlen;
}
out:
if (bbuf)
px_free(bbuf);
return err;
}
| static unsigned combo_encrypt_len | ( | PX_Combo * | cx, | |
| unsigned | dlen | |||
| ) | [static] |
| static void combo_free | ( | PX_Combo * | cx | ) | [static] |
Definition at line 326 of file px.c.
References px_combo::cipher, px_cipher_free, and px_free.
{
if (cx->cipher)
px_cipher_free(cx->cipher);
memset(cx, 0, sizeof(*cx));
px_free(cx);
}
| static int combo_init | ( | PX_Combo * | cx, | |
| const uint8 * | key, | |||
| unsigned | klen, | |||
| const uint8 * | iv, | |||
| unsigned | ivlen | |||
| ) | [static] |
Definition at line 161 of file px.c.
References px_combo::cipher, error_desc::err, px_alloc, px_cipher_init, px_cipher_iv_size, px_cipher_key_size, and px_free.
{
int err;
unsigned ks,
ivs;
PX_Cipher *c = cx->cipher;
uint8 *ivbuf = NULL;
uint8 *keybuf;
ks = px_cipher_key_size(c);
ivs = px_cipher_iv_size(c);
if (ivs > 0)
{
ivbuf = px_alloc(ivs);
memset(ivbuf, 0, ivs);
if (ivlen > ivs)
memcpy(ivbuf, iv, ivs);
else
memcpy(ivbuf, iv, ivlen);
}
if (klen > ks)
klen = ks;
keybuf = px_alloc(ks);
memset(keybuf, 0, ks);
memcpy(keybuf, key, klen);
err = px_cipher_init(c, keybuf, klen, ivbuf);
if (ivbuf)
px_free(ivbuf);
px_free(keybuf);
return err;
}
| static int parse_cipher_name | ( | char * | full, | |
| char ** | cipher, | |||
| char ** | pad | |||
| ) | [static] |
Definition at line 337 of file px.c.
References NULL.
Referenced by px_find_combo().
{
char *p,
*p2,
*q;
*cipher = full;
*pad = NULL;
p = strchr(full, '/');
if (p != NULL)
*p++ = 0;
while (p != NULL)
{
if ((q = strchr(p, '/')) != NULL)
*q++ = 0;
if (!*p)
{
p = q;
continue;
}
p2 = strchr(p, ':');
if (p2 != NULL)
{
*p2++ = 0;
if (strcmp(p, "pad") == 0)
*pad = p2;
else
return PXE_BAD_OPTION;
}
else
return PXE_BAD_FORMAT;
p = q;
}
return 0;
}
| void px_debug | ( | const char * | fmt, | |
| ... | ||||
| ) |
Definition at line 129 of file px.c.
References buf, debug_handler, and vsnprintf().
Referenced by _pgp_read_public_key(), bn_to_mpi(), check_key_cksum(), check_key_sha1(), control_cksum(), decrypt_key(), internal_read_key(), mbuf_append(), mdc_finish(), mdc_read(), mdcbuf_finish(), mpi_to_bn(), parse_compressed_data(), parse_literal_data(), parse_new_len(), parse_old_len(), parse_symenc_mdc_data(), parse_symenc_sesskey(), pgp_decrypt(), pgp_expect_packet_end(), pgp_mpi_alloc(), pgp_parse_pkt_hdr(), pgp_parse_pubenc_sesskey(), pgp_write_pubenc_sesskey(), prefix_init(), process_data_packets(), process_secret_key(), and pullf_read_fixed().
{
va_list ap;
va_start(ap, fmt);
if (debug_handler)
{
char buf[512];
vsnprintf(buf, sizeof(buf), fmt, ap);
debug_handler(buf);
}
va_end(ap);
}
| int px_find_combo | ( | const char * | name, | |
| PX_Combo ** | res | |||
| ) |
Definition at line 379 of file px.c.
References buf, px_combo::cipher, px_combo::decrypt, px_combo::decrypt_len, px_combo::encrypt, px_combo::encrypt_len, error_desc::err, px_combo::free, px_combo::init, NULL, px_combo::padding, parse_cipher_name(), px_alloc, px_cipher_free, px_find_cipher(), and px_free.
Referenced by pg_decrypt(), pg_decrypt_iv(), pg_encrypt(), and pg_encrypt_iv().
{
int err;
char *buf,
*s_cipher,
*s_pad;
PX_Combo *cx;
cx = px_alloc(sizeof(*cx));
memset(cx, 0, sizeof(*cx));
buf = px_alloc(strlen(name) + 1);
strcpy(buf, name);
err = parse_cipher_name(buf, &s_cipher, &s_pad);
if (err)
{
px_free(buf);
px_free(cx);
return err;
}
err = px_find_cipher(s_cipher, &cx->cipher);
if (err)
goto err1;
if (s_pad != NULL)
{
if (strcmp(s_pad, "pkcs") == 0)
cx->padding = 1;
else if (strcmp(s_pad, "none") == 0)
cx->padding = 0;
else
goto err1;
}
else
cx->padding = 1;
cx->init = combo_init;
cx->encrypt = combo_encrypt;
cx->decrypt = combo_decrypt;
cx->encrypt_len = combo_encrypt_len;
cx->decrypt_len = combo_decrypt_len;
cx->free = combo_free;
px_free(buf);
*res = cx;
return 0;
err1:
if (cx->cipher)
px_cipher_free(cx->cipher);
px_free(cx);
px_free(buf);
return PXE_NO_CIPHER;
}
| const char* px_resolve_alias | ( | const PX_Alias * | list, | |
| const char * | name | |||
| ) |
Definition at line 109 of file px.c.
References px_alias::alias, px_alias::name, and pg_strcasecmp().
Referenced by px_find_cipher().
| void px_set_debug_handler | ( | void(*)(const char *) | handler | ) |
Definition at line 123 of file px.c.
References debug_handler.
Referenced by decrypt_internal(), encrypt_internal(), and init_work().
{
debug_handler = handler;
}
| const char* px_strerror | ( | int | err | ) |
Definition at line 97 of file px.c.
References error_desc::desc, and error_desc::err.
Referenced by decrypt_internal(), encrypt_internal(), find_provider(), init_work(), pg_dearmor(), pg_decrypt(), pg_decrypt_iv(), pg_encrypt(), pg_encrypt_iv(), pg_gen_salt(), pg_gen_salt_rounds(), pg_random_bytes(), and pgp_key_id_w().
{
const struct error_desc *e;
for (e = px_err_list; e->desc; e++)
if (e->err == err)
return e->desc;
return "Bad error code";
}
void(* debug_handler)(const char *) = NULL [static] |
Definition at line 120 of file px.c.
Referenced by px_debug(), and px_set_debug_handler().
struct error_desc px_err_list[] [static] |
1.7.1