
Go to the source code of this file.
| #define PGP_MAX_BLOCK (256/8) |
Definition at line 108 of file pgp.h.
Referenced by prefix_init(), and write_prefix().
| #define PGP_MAX_KEY (256/8) |
Definition at line 107 of file pgp.h.
Referenced by parse_symenc_sesskey().
| #define PGP_S2K_SALT 8 |
Definition at line 110 of file pgp.h.
Referenced by calc_s2k_iter_salted(), calc_s2k_salted(), and pgp_s2k_fill().
| typedef struct PGP_Context PGP_Context |
| typedef struct PGP_PubKey PGP_PubKey |
| enum PGP_COMPR_TYPE |
Definition at line 85 of file pgp.h.
{
PGP_COMPR_NONE = 0, /* must */
PGP_COMPR_ZIP = 1, /* should */
PGP_COMPR_ZLIB = 2,
PGP_COMPR_BZIP2 = 3
};
| enum PGP_DIGEST_TYPE |
| PGP_DIGEST_MD5 | |
| PGP_DIGEST_SHA1 | |
| PGP_DIGEST_RIPEMD160 | |
| PGP_DIGEST_XSHA | |
| PGP_DIGEST_MD2 | |
| PGP_DIGEST_TIGER192 | |
| PGP_DIGEST_HAVAL5_160 | |
| PGP_DIGEST_SHA256 | |
| PGP_DIGEST_SHA384 | |
| PGP_DIGEST_SHA512 |
Definition at line 93 of file pgp.h.
{
PGP_DIGEST_MD5 = 1, /* should, deprecated */
PGP_DIGEST_SHA1 = 2, /* must */
PGP_DIGEST_RIPEMD160 = 3,
PGP_DIGEST_XSHA = 4, /* obsolete */
PGP_DIGEST_MD2 = 5, /* obsolete */
PGP_DIGEST_TIGER192 = 6, /* obsolete */
PGP_DIGEST_HAVAL5_160 = 7, /* obsolete */
PGP_DIGEST_SHA256 = 8,
PGP_DIGEST_SHA384 = 9,
PGP_DIGEST_SHA512 = 10
};
| enum PGP_PKT_TYPE |
Definition at line 39 of file pgp.h.
{
PGP_PKT_RESERVED = 0,
PGP_PKT_PUBENCRYPTED_SESSKEY = 1,
PGP_PKT_SIGNATURE = 2,
PGP_PKT_SYMENCRYPTED_SESSKEY = 3,
PGP_PKT_SECRET_KEY = 5,
PGP_PKT_PUBLIC_KEY = 6,
PGP_PKT_SECRET_SUBKEY = 7,
PGP_PKT_COMPRESSED_DATA = 8,
PGP_PKT_SYMENCRYPTED_DATA = 9,
PGP_PKT_MARKER = 10,
PGP_PKT_LITERAL_DATA = 11,
PGP_PKT_TRUST = 12,
PGP_PKT_USER_ID = 13,
PGP_PKT_PUBLIC_SUBKEY = 14,
PGP_PKT_USER_ATTR = 17,
PGP_PKT_SYMENCRYPTED_DATA_MDC = 18,
PGP_PKT_MDC = 19,
PGP_PKT_PRIV_61 = 61 /* occurs in gpg secring */
};
| enum PGP_PUB_ALGO_TYPE |
| PGP_PUB_RSA_ENCRYPT_SIGN | |
| PGP_PUB_RSA_ENCRYPT | |
| PGP_PUB_RSA_SIGN | |
| PGP_PUB_ELG_ENCRYPT | |
| PGP_PUB_DSA_SIGN |
Definition at line 61 of file pgp.h.
{
PGP_PUB_RSA_ENCRYPT_SIGN = 1,
PGP_PUB_RSA_ENCRYPT = 2,
PGP_PUB_RSA_SIGN = 3,
PGP_PUB_ELG_ENCRYPT = 16,
PGP_PUB_DSA_SIGN = 17
};
| enum PGP_S2K_TYPE |
Definition at line 32 of file pgp.h.
{
PGP_S2K_SIMPLE = 0,
PGP_S2K_SALTED = 1,
PGP_S2K_ISALTED = 3
};
| enum PGP_SYMENC_TYPE |
| PGP_SYM_PLAIN | |
| PGP_SYM_IDEA | |
| PGP_SYM_DES3 | |
| PGP_SYM_CAST5 | |
| PGP_SYM_BLOWFISH | |
| PGP_SYM_SAFER_SK128 | |
| PGP_SYM_DES_SK | |
| PGP_SYM_AES_128 | |
| PGP_SYM_AES_192 | |
| PGP_SYM_AES_256 | |
| PGP_SYM_TWOFISH |
Definition at line 70 of file pgp.h.
{
PGP_SYM_PLAIN = 0, /* ?? */
PGP_SYM_IDEA = 1, /* obsolete, PGP 2.6 compat */
PGP_SYM_DES3 = 2, /* must */
PGP_SYM_CAST5 = 3, /* should */
PGP_SYM_BLOWFISH = 4,
PGP_SYM_SAFER_SK128 = 5, /* obsolete */
PGP_SYM_DES_SK = 6, /* obsolete */
PGP_SYM_AES_128 = 7, /* should */
PGP_SYM_AES_192 = 8,
PGP_SYM_AES_256 = 9,
PGP_SYM_TWOFISH = 10
};
| int _pgp_read_public_key | ( | PullFilter * | pkt, | |
| PGP_PubKey ** | pk_p | |||
| ) |
Definition at line 159 of file pgp-pubkey.c.
References PGP_PubKey::algo, calc_key_id(), PGP_PubKey::can_encrypt, PGP_PubKey::dsa, PGP_PubKey::elg, GETBYTE, pgp_key_alloc(), pgp_key_free(), pgp_mpi_read(), PGP_PUB_DSA_SIGN, PGP_PUB_ELG_ENCRYPT, PGP_PUB_RSA_ENCRYPT, PGP_PUB_RSA_ENCRYPT_SIGN, PGP_PUB_RSA_SIGN, PGP_PubKey::pub, pullf_read_fixed(), px_debug(), PGP_PubKey::rsa, PGP_PubKey::time, and PGP_PubKey::ver.
Referenced by internal_read_key(), process_secret_key(), and read_pubkey_keyid().
{
int res;
PGP_PubKey *pk;
res = pgp_key_alloc(&pk);
if (res < 0)
return res;
/* get version */
GETBYTE(pkt, pk->ver);
if (pk->ver != 4)
{
res = PXE_PGP_NOT_V4_KEYPKT;
goto out;
}
/* read time */
res = pullf_read_fixed(pkt, 4, pk->time);
if (res < 0)
goto out;
/* pubkey algorithm */
GETBYTE(pkt, pk->algo);
switch (pk->algo)
{
case PGP_PUB_DSA_SIGN:
res = pgp_mpi_read(pkt, &pk->pub.dsa.p);
if (res < 0)
break;
res = pgp_mpi_read(pkt, &pk->pub.dsa.q);
if (res < 0)
break;
res = pgp_mpi_read(pkt, &pk->pub.dsa.g);
if (res < 0)
break;
res = pgp_mpi_read(pkt, &pk->pub.dsa.y);
if (res < 0)
break;
res = calc_key_id(pk);
break;
case PGP_PUB_RSA_SIGN:
case PGP_PUB_RSA_ENCRYPT:
case PGP_PUB_RSA_ENCRYPT_SIGN:
res = pgp_mpi_read(pkt, &pk->pub.rsa.n);
if (res < 0)
break;
res = pgp_mpi_read(pkt, &pk->pub.rsa.e);
if (res < 0)
break;
res = calc_key_id(pk);
if (pk->algo != PGP_PUB_RSA_SIGN)
pk->can_encrypt = 1;
break;
case PGP_PUB_ELG_ENCRYPT:
res = pgp_mpi_read(pkt, &pk->pub.elg.p);
if (res < 0)
break;
res = pgp_mpi_read(pkt, &pk->pub.elg.g);
if (res < 0)
break;
res = pgp_mpi_read(pkt, &pk->pub.elg.y);
if (res < 0)
break;
res = calc_key_id(pk);
pk->can_encrypt = 1;
break;
default:
px_debug("unknown public algo: %d", pk->algo);
res = PXE_PGP_UNKNOWN_PUBALGO;
}
out:
if (res < 0)
pgp_key_free(pk);
else
*pk_p = pk;
return res;
}
| unsigned pgp_armor_dec_len | ( | unsigned | len | ) |
Definition at line 380 of file pgp-armor.c.
References b64_dec_len().
Referenced by pg_dearmor().
{
return b64_dec_len(len);
}
Definition at line 313 of file pgp-armor.c.
References b64_decode(), buf, crc24(), find_header(), and NULL.
Referenced by pg_dearmor().
{
const uint8 *p = src;
const uint8 *data_end = src + len;
long crc;
const uint8 *base64_start,
*armor_end;
const uint8 *base64_end = NULL;
uint8 buf[4];
int hlen;
int res = PXE_PGP_CORRUPT_ARMOR;
/* armor start */
hlen = find_header(src, data_end, &p, 0);
if (hlen <= 0)
goto out;
p += hlen;
/* armor end */
hlen = find_header(p, data_end, &armor_end, 1);
if (hlen <= 0)
goto out;
/* skip comments - find empty line */
while (p < armor_end && *p != '\n' && *p != '\r')
{
p = memchr(p, '\n', armor_end - p);
if (!p)
goto out;
/* step to start of next line */
p++;
}
base64_start = p;
/* find crc pos */
for (p = armor_end; p >= base64_start; p--)
if (*p == '=')
{
base64_end = p - 1;
break;
}
if (base64_end == NULL)
goto out;
/* decode crc */
if (b64_decode(p + 1, 4, buf) != 3)
goto out;
crc = (((long) buf[0]) << 16) + (((long) buf[1]) << 8) + (long) buf[2];
/* decode data */
res = b64_decode(base64_start, base64_end - base64_start, dst);
/* check crc */
if (res >= 0 && crc24(dst, res) != crc)
res = PXE_PGP_CORRUPT_ARMOR;
out:
return res;
}
| unsigned pgp_armor_enc_len | ( | unsigned | len | ) |
Definition at line 374 of file pgp-armor.c.
References armor_footer, armor_header, and b64_enc_len().
Referenced by pg_armor().
{
return b64_enc_len(len) + strlen(armor_header) + strlen(armor_footer) + 16;
}
Definition at line 208 of file pgp-armor.c.
References _base64, armor_footer, armor_header, b64_encode(), and crc24().
Referenced by pg_armor().
{
int n;
uint8 *pos = dst;
unsigned crc = crc24(src, len);
n = strlen(armor_header);
memcpy(pos, armor_header, n);
pos += n;
n = b64_encode(src, len, pos);
pos += n;
if (*(pos - 1) != '\n')
*pos++ = '\n';
*pos++ = '=';
pos[3] = _base64[crc & 0x3f];
crc >>= 6;
pos[2] = _base64[crc & 0x3f];
crc >>= 6;
pos[1] = _base64[crc & 0x3f];
crc >>= 6;
pos[0] = _base64[crc & 0x3f];
pos += 4;
n = strlen(armor_footer);
memcpy(pos, armor_footer, n);
pos += n;
return pos - dst;
}
| int pgp_cfb_create | ( | PGP_CFB ** | ctx_p, | |
| int | algo, | |||
| const uint8 * | key, | |||
| int | key_len, | |||
| int | recync, | |||
| uint8 * | iv | |||
| ) |
Definition at line 53 of file pgp-cfb.c.
References PGP_CFB::block_size, PGP_CFB::ciph, PGP_CFB::fr, NULL, pgp_load_cipher(), px_alloc, px_cipher_block_size, px_cipher_free, px_cipher_init, and PGP_CFB::resync.
Referenced by decrypt_key(), encrypt_init(), parse_symenc_data(), parse_symenc_mdc_data(), process_secret_key(), and symencrypt_sesskey().
{
int res;
PX_Cipher *ciph;
PGP_CFB *ctx;
res = pgp_load_cipher(algo, &ciph);
if (res < 0)
return res;
res = px_cipher_init(ciph, key, key_len, NULL);
if (res < 0)
{
px_cipher_free(ciph);
return res;
}
ctx = px_alloc(sizeof(*ctx));
memset(ctx, 0, sizeof(*ctx));
ctx->ciph = ciph;
ctx->block_size = px_cipher_block_size(ciph);
ctx->resync = resync;
if (iv)
memcpy(ctx->fr, iv, ctx->block_size);
*ctx_p = ctx;
return 0;
}
Definition at line 260 of file pgp-cfb.c.
References cfb_process(), mix, mix_decrypt_resync(), and PGP_CFB::resync.
Referenced by decrypt_key(), and decrypt_read().
{
mix_data_t mix = ctx->resync ? mix_decrypt_resync : mix_decrypt_normal;
return cfb_process(ctx, data, len, dst, mix);
}
Definition at line 252 of file pgp-cfb.c.
References cfb_process(), mix, mix_encrypt_resync(), and PGP_CFB::resync.
Referenced by encrypt_process(), and symencrypt_sesskey().
{
mix_data_t mix = ctx->resync ? mix_encrypt_resync : mix_encrypt_normal;
return cfb_process(ctx, data, len, dst, mix);
}
| void pgp_cfb_free | ( | PGP_CFB * | ctx | ) |
Definition at line 85 of file pgp-cfb.c.
References PGP_CFB::ciph, px_cipher_free, and px_free.
Referenced by decrypt_key(), parse_symenc_data(), parse_symenc_mdc_data(), process_secret_key(), and symencrypt_sesskey().
{
px_cipher_free(ctx->ciph);
memset(ctx, 0, sizeof(*ctx));
px_free(ctx);
}
| int pgp_compress_filter | ( | PushFilter ** | res, | |
| PGP_Context * | ctx, | |||
| PushFilter * | dst | |||
| ) |
Definition at line 318 of file pgp-compress.c.
Referenced by init_compress().
{
return PXE_PGP_UNSUPPORTED_COMPR;
}
| int pgp_create_pkt_reader | ( | PullFilter ** | pf_p, | |
| PullFilter * | src, | |||
| int | len, | |||
| int | pkttype, | |||
| PGP_Context * | ctx | |||
| ) |
Definition at line 223 of file pgp-decrypt.c.
References PktData::len, pullf_create(), px_alloc, px_free, and PktData::type.
Referenced by internal_read_key(), pgp_decrypt(), pgp_get_keyid(), and process_data_packets().
{
int res;
struct PktData *pkt = px_alloc(sizeof(*pkt));
pkt->type = pkttype;
pkt->len = len;
res = pullf_create(pf_p, &pktreader_filter, pkt, src);
if (res < 0)
px_free(pkt);
return res;
}
| int pgp_create_pkt_writer | ( | PushFilter * | dst, | |
| int | tag, | |||
| PushFilter ** | res_p | |||
| ) |
Definition at line 311 of file pgp-encrypt.c.
References NULL, pushf_create(), and write_tag_only().
Referenced by pgp_write_pubenc_sesskey().
{
int res;
res = write_tag_only(dst, tag);
if (res < 0)
return res;
return pushf_create(res_p, &pkt_stream_filter, NULL, dst);
}
| int pgp_decompress_filter | ( | PullFilter ** | res, | |
| PGP_Context * | ctx, | |||
| PullFilter * | src | |||
| ) |
Definition at line 324 of file pgp-compress.c.
Referenced by parse_compressed_data().
{
return PXE_PGP_UNSUPPORTED_COMPR;
}
| int pgp_decrypt | ( | PGP_Context * | ctx, | |
| MBuf * | src, | |||
| MBuf * | dst | |||
| ) |
Definition at line 1096 of file pgp-decrypt.c.
References PGP_Context::corrupt_prefix, PGP_Context::disable_mdc, NO_CTX_SIZE, parse_symenc_data(), parse_symenc_mdc_data(), parse_symenc_sesskey(), pgp_create_pkt_reader(), pgp_parse_pkt_hdr(), pgp_parse_pubenc_sesskey(), PGP_PKT_MARKER, PGP_PKT_PUBENCRYPTED_SESSKEY, PGP_PKT_SYMENCRYPTED_DATA, PGP_PKT_SYMENCRYPTED_DATA_MDC, PGP_PKT_SYMENCRYPTED_SESSKEY, pgp_skip_packet(), pullf_create_mbuf_reader(), pullf_free(), and px_debug().
Referenced by decrypt_internal().
{
int res;
PullFilter *src = NULL;
PullFilter *pkt = NULL;
uint8 tag;
int len;
int got_key = 0;
int got_data = 0;
res = pullf_create_mbuf_reader(&src, msrc);
while (res >= 0)
{
res = pgp_parse_pkt_hdr(src, &tag, &len, NO_CTX_SIZE);
if (res <= 0)
break;
res = pgp_create_pkt_reader(&pkt, src, len, res, ctx);
if (res < 0)
break;
res = PXE_PGP_CORRUPT_DATA;
switch (tag)
{
case PGP_PKT_MARKER:
res = pgp_skip_packet(pkt);
break;
case PGP_PKT_PUBENCRYPTED_SESSKEY:
/* fixme: skip those */
res = pgp_parse_pubenc_sesskey(ctx, pkt);
got_key = 1;
break;
case PGP_PKT_SYMENCRYPTED_SESSKEY:
if (got_key)
/*
* Theoretically, there could be several keys, both public
* and symmetric, all of which encrypt same session key.
* Decrypt should try with each one, before failing.
*/
px_debug("pgp_decrypt: using first of several keys");
else
{
got_key = 1;
res = parse_symenc_sesskey(ctx, pkt);
}
break;
case PGP_PKT_SYMENCRYPTED_DATA:
if (!got_key)
px_debug("pgp_decrypt: have data but no key");
else if (got_data)
px_debug("pgp_decrypt: got second data packet");
else
{
got_data = 1;
ctx->disable_mdc = 1;
res = parse_symenc_data(ctx, pkt, mdst);
}
break;
case PGP_PKT_SYMENCRYPTED_DATA_MDC:
if (!got_key)
px_debug("pgp_decrypt: have data but no key");
else if (got_data)
px_debug("pgp_decrypt: several data pkts not supported");
else
{
got_data = 1;
ctx->disable_mdc = 0;
res = parse_symenc_mdc_data(ctx, pkt, mdst);
}
break;
default:
px_debug("pgp_decrypt: unknown tag: 0x%02x", tag);
}
pullf_free(pkt);
pkt = NULL;
}
if (pkt)
pullf_free(pkt);
if (src)
pullf_free(src);
if (res < 0)
return res;
if (!got_data || ctx->corrupt_prefix)
res = PXE_PGP_CORRUPT_DATA;
return res;
}
| int pgp_disable_mdc | ( | PGP_Context * | ctx, | |
| int | disable | |||
| ) |
Definition at line 234 of file pgp.c.
References PGP_Context::disable_mdc.
Referenced by set_arg().
{
ctx->disable_mdc = disable ? 1 : 0;
return 0;
}
| int pgp_elgamal_decrypt | ( | PGP_PubKey * | pk, | |
| PGP_MPI * | c1, | |||
| PGP_MPI * | c2, | |||
| PGP_MPI ** | m | |||
| ) |
Definition at line 217 of file pgp-mpi-internal.c.
References bn_to_mpi(), PGP_PubKey::elg, mp_clear_free(), mp_int_exptmod(), mp_int_invmod(), mp_modmul(), mp_new(), mpi_to_bn(), PGP_PubKey::pub, and PGP_PubKey::sec.
Referenced by decrypt_elgamal().
{
int res = PXE_PGP_MATH_FAILED;
mpz_t *c1 = mpi_to_bn(_c1);
mpz_t *c2 = mpi_to_bn(_c2);
mpz_t *p = mpi_to_bn(pk->pub.elg.p);
mpz_t *x = mpi_to_bn(pk->sec.elg.x);
mpz_t *c1x = mp_new();
mpz_t *div = mp_new();
mpz_t *m = mp_new();
if (!c1 || !c2 || !p || !x || !c1x || !div || !m)
goto err;
/*
* m = c2 / (c1^x)
*/
mp_int_exptmod(c1, x, p, c1x);
mp_int_invmod(c1x, p, div);
mp_modmul(c2, div, p, m);
/* result */
*msg_p = bn_to_mpi(m);
if (*msg_p)
res = 0;
err:
mp_clear_free(m);
mp_clear_free(div);
mp_clear_free(c1x);
mp_clear_free(x);
mp_clear_free(p);
mp_clear_free(c2);
mp_clear_free(c1);
return res;
}
| int pgp_elgamal_encrypt | ( | PGP_PubKey * | pk, | |
| PGP_MPI * | m, | |||
| PGP_MPI ** | c1, | |||
| PGP_MPI ** | c2 | |||
| ) |
Definition at line 167 of file pgp-mpi-internal.c.
References bn_to_mpi(), decide_k_bits(), PGP_PubKey::elg, mp_clear_free(), mp_int_count_bits(), mp_int_exptmod(), mp_modmul(), mp_new(), mp_px_rand(), mpi_to_bn(), and PGP_PubKey::pub.
Referenced by encrypt_and_write_elgamal().
{
int res = PXE_PGP_MATH_FAILED;
int k_bits;
mpz_t *m = mpi_to_bn(_m);
mpz_t *p = mpi_to_bn(pk->pub.elg.p);
mpz_t *g = mpi_to_bn(pk->pub.elg.g);
mpz_t *y = mpi_to_bn(pk->pub.elg.y);
mpz_t *k = mp_new();
mpz_t *yk = mp_new();
mpz_t *c1 = mp_new();
mpz_t *c2 = mp_new();
if (!m || !p || !g || !y || !k || !yk || !c1 || !c2)
goto err;
/*
* generate k
*/
k_bits = decide_k_bits(mp_int_count_bits(p));
res = mp_px_rand(k_bits, k);
if (res < 0)
return res;
/*
* c1 = g^k c2 = m * y^k
*/
mp_int_exptmod(g, k, p, c1);
mp_int_exptmod(y, k, p, yk);
mp_modmul(m, yk, p, c2);
/* result */
*c1_p = bn_to_mpi(c1);
*c2_p = bn_to_mpi(c2);
if (*c1_p && *c2_p)
res = 0;
err:
mp_clear_free(c2);
mp_clear_free(c1);
mp_clear_free(yk);
mp_clear_free(k);
mp_clear_free(y);
mp_clear_free(g);
mp_clear_free(p);
mp_clear_free(m);
return res;
}
| int pgp_encrypt | ( | PGP_Context * | ctx, | |
| MBuf * | src, | |||
| MBuf * | dst | |||
| ) |
Definition at line 603 of file pgp-encrypt.c.
References buf, PGP_Context::compress_algo, PGP_Context::compress_level, PGP_Context::convert_crlf, PGP_Context::disable_mdc, init_compress(), init_encdata_packet(), init_litdata_packet(), init_s2k_key(), init_sess_key(), mbuf_avail(), mbuf_grab(), pgp_write_pubenc_sesskey(), PGP_Context::pub_key, pushf_create(), pushf_create_mbuf_writer(), pushf_flush(), pushf_free_all(), pushf_write(), PGP_Context::sym_key, PGP_Context::text_mode, write_prefix(), and write_symenc_sesskey().
Referenced by encrypt_internal().
{
int res;
int len;
uint8 *buf;
PushFilter *pf,
*pf_tmp;
/*
* do we have any key
*/
if (!ctx->sym_key && !ctx->pub_key)
return PXE_ARGUMENT_ERROR;
/* MBuf writer */
res = pushf_create_mbuf_writer(&pf, dst);
if (res < 0)
goto out;
/*
* initialize symkey
*/
if (ctx->sym_key)
{
res = init_s2k_key(ctx);
if (res < 0)
goto out;
}
res = init_sess_key(ctx);
if (res < 0)
goto out;
/*
* write keypkt
*/
if (ctx->pub_key)
res = pgp_write_pubenc_sesskey(ctx, pf);
else
res = write_symenc_sesskey(ctx, pf);
if (res < 0)
goto out;
/* encrypted data pkt */
res = init_encdata_packet(&pf_tmp, ctx, pf);
if (res < 0)
goto out;
pf = pf_tmp;
/* encrypter */
res = pushf_create(&pf_tmp, &encrypt_filter, ctx, pf);
if (res < 0)
goto out;
pf = pf_tmp;
/* hasher */
if (ctx->disable_mdc == 0)
{
res = pushf_create(&pf_tmp, &mdc_filter, ctx, pf);
if (res < 0)
goto out;
pf = pf_tmp;
}
/* prefix */
res = write_prefix(ctx, pf);
if (res < 0)
goto out;
/* compressor */
if (ctx->compress_algo > 0 && ctx->compress_level > 0)
{
res = init_compress(&pf_tmp, ctx, pf);
if (res < 0)
goto out;
pf = pf_tmp;
}
/* data streamer */
res = init_litdata_packet(&pf_tmp, ctx, pf);
if (res < 0)
goto out;
pf = pf_tmp;
/* text conversion? */
if (ctx->text_mode && ctx->convert_crlf)
{
res = pushf_create(&pf_tmp, &crlf_filter, ctx, pf);
if (res < 0)
goto out;
pf = pf_tmp;
}
/*
* chain complete
*/
len = mbuf_grab(src, mbuf_avail(src), &buf);
res = pushf_write(pf, buf, len);
if (res >= 0)
res = pushf_flush(pf);
out:
pushf_free_all(pf);
return res;
}
| int pgp_expect_packet_end | ( | PullFilter * | pkt | ) |
Definition at line 1078 of file pgp-decrypt.c.
References pullf_read(), and px_debug().
Referenced by pgp_parse_pubenc_sesskey(), and process_secret_key().
{
int res = 1;
uint8 *tmp;
while (res > 0)
{
res = pullf_read(pkt, 32 * 1024, &tmp);
if (res > 0)
{
px_debug("pgp_expect_packet_end: got data");
return PXE_PGP_CORRUPT_DATA;
}
}
return res < 0 ? res : 0;
}
| int pgp_free | ( | PGP_Context * | ctx | ) |
Definition at line 224 of file pgp.c.
References pgp_key_free(), PGP_Context::pub_key, and px_free.
Referenced by decrypt_internal(), and encrypt_internal().
{
if (ctx->pub_key)
pgp_key_free(ctx->pub_key);
memset(ctx, 0, sizeof *ctx);
px_free(ctx);
return 0;
}
| int pgp_get_cipher_block_size | ( | int | c | ) |
Definition at line 158 of file pgp.c.
References cipher_info::block_len, get_cipher_info(), i, and NULL.
Referenced by prefix_init(), process_secret_key(), and write_prefix().
{
const struct cipher_info *i = get_cipher_info(code);
if (i != NULL)
return i->block_len;
return 0;
}
| int pgp_get_cipher_code | ( | const char * | name | ) |
Definition at line 116 of file pgp.c.
References cipher_info::code, i, cipher_info::name, and pg_strcasecmp().
Referenced by pgp_set_cipher_algo(), pgp_set_s2k_cipher_algo(), and set_arg().
{
const struct cipher_info *i;
for (i = cipher_list; i->name; i++)
if (pg_strcasecmp(i->name, name) == 0)
return i->code;
return PXE_PGP_UNSUPPORTED_CIPHER;
}
| int pgp_get_cipher_key_size | ( | int | c | ) |
Definition at line 148 of file pgp.c.
References get_cipher_info(), i, cipher_info::key_len, and NULL.
Referenced by decrypt_key(), init_sess_key(), and pgp_s2k_process().
{
const struct cipher_info *i = get_cipher_info(code);
if (i != NULL)
return i->key_len;
return 0;
}
| const char* pgp_get_cipher_name | ( | int | code | ) |
Definition at line 138 of file pgp.c.
References get_cipher_info(), i, cipher_info::name, and NULL.
{
const struct cipher_info *i = get_cipher_info(code);
if (i != NULL)
return i->name;
return NULL;
}
| int pgp_get_digest_code | ( | const char * | name | ) |
Definition at line 105 of file pgp.c.
References digest_info::code, i, digest_info::name, and pg_strcasecmp().
Referenced by pgp_set_s2k_digest_algo(), and set_arg().
{
const struct digest_info *i;
for (i = digest_list; i->name; i++)
if (pg_strcasecmp(i->name, name) == 0)
return i->code;
return PXE_PGP_UNSUPPORTED_HASH;
}
| const char* pgp_get_digest_name | ( | int | code | ) |
Definition at line 127 of file pgp.c.
References digest_info::code, i, and digest_info::name.
Referenced by pgp_load_digest().
{
const struct digest_info *i;
for (i = digest_list; i->name; i++)
if (i->code == code)
return i->name;
return NULL;
}
| int pgp_get_keyid | ( | MBuf * | pgp_data, | |
| char * | dst | |||
| ) |
Definition at line 112 of file pgp-info.c.
References any_key, memcmp(), NULL, pgp_create_pkt_reader(), pgp_parse_pkt_hdr(), PGP_PKT_MARKER, PGP_PKT_PRIV_61, PGP_PKT_PUBENCRYPTED_SESSKEY, PGP_PKT_PUBLIC_KEY, PGP_PKT_PUBLIC_SUBKEY, PGP_PKT_SECRET_KEY, PGP_PKT_SECRET_SUBKEY, PGP_PKT_SIGNATURE, PGP_PKT_SYMENCRYPTED_DATA, PGP_PKT_SYMENCRYPTED_DATA_MDC, PGP_PKT_SYMENCRYPTED_SESSKEY, PGP_PKT_TRUST, PGP_PKT_USER_ATTR, PGP_PKT_USER_ID, pgp_skip_packet(), print_key(), pullf_create_mbuf_reader(), pullf_free(), read_pubenc_keyid(), and read_pubkey_keyid().
Referenced by pgp_key_id_w().
{
int res;
PullFilter *src;
PullFilter *pkt = NULL;
int len;
uint8 tag;
int got_pub_key = 0,
got_symenc_key = 0,
got_pubenc_key = 0;
int got_data = 0;
uint8 keyid_buf[8];
int got_main_key = 0;
res = pullf_create_mbuf_reader(&src, pgp_data);
if (res < 0)
return res;
while (1)
{
res = pgp_parse_pkt_hdr(src, &tag, &len, 0);
if (res <= 0)
break;
res = pgp_create_pkt_reader(&pkt, src, len, res, NULL);
if (res < 0)
break;
switch (tag)
{
case PGP_PKT_SECRET_KEY:
case PGP_PKT_PUBLIC_KEY:
/* main key is for signing, so ignore it */
if (!got_main_key)
{
got_main_key = 1;
res = pgp_skip_packet(pkt);
}
else
res = PXE_PGP_MULTIPLE_KEYS;
break;
case PGP_PKT_SECRET_SUBKEY:
case PGP_PKT_PUBLIC_SUBKEY:
res = read_pubkey_keyid(pkt, keyid_buf);
if (res < 0)
break;
if (res > 0)
got_pub_key++;
break;
case PGP_PKT_PUBENCRYPTED_SESSKEY:
got_pubenc_key++;
res = read_pubenc_keyid(pkt, keyid_buf);
break;
case PGP_PKT_SYMENCRYPTED_DATA:
case PGP_PKT_SYMENCRYPTED_DATA_MDC:
/* don't skip it, just stop */
got_data = 1;
break;
case PGP_PKT_SYMENCRYPTED_SESSKEY:
got_symenc_key++;
/* fallthru */
case PGP_PKT_SIGNATURE:
case PGP_PKT_MARKER:
case PGP_PKT_TRUST:
case PGP_PKT_USER_ID:
case PGP_PKT_USER_ATTR:
case PGP_PKT_PRIV_61:
res = pgp_skip_packet(pkt);
break;
default:
res = PXE_PGP_CORRUPT_DATA;
}
if (pkt)
pullf_free(pkt);
pkt = NULL;
if (res < 0 || got_data)
break;
}
pullf_free(src);
if (pkt)
pullf_free(pkt);
if (res < 0)
return res;
/* now check sanity */
if (got_pub_key && got_pubenc_key)
res = PXE_PGP_CORRUPT_DATA;
if (got_pub_key > 1)
res = PXE_PGP_MULTIPLE_KEYS;
if (got_pubenc_key > 1)
res = PXE_PGP_MULTIPLE_KEYS;
/*
* if still ok, look what we got
*/
if (res >= 0)
{
if (got_pubenc_key || got_pub_key)
{
if (memcmp(keyid_buf, any_key, 8) == 0)
{
memcpy(dst, "ANYKEY", 7);
res = 6;
}
else
res = print_key(keyid_buf, dst);
}
else if (got_symenc_key)
{
memcpy(dst, "SYMKEY", 7);
res = 6;
}
else
res = PXE_PGP_NO_USABLE_KEY;
}
return res;
}
| int pgp_get_unicode_mode | ( | PGP_Context * | ctx | ) |
Definition at line 340 of file pgp.c.
References PGP_Context::unicode_mode.
Referenced by decrypt_internal(), and encrypt_internal().
{
return ctx->unicode_mode;
}
| int pgp_init | ( | PGP_Context ** | ctx | ) |
Definition at line 200 of file pgp.c.
References PGP_Context::cipher_algo, PGP_Context::compress_algo, PGP_Context::compress_level, PGP_Context::convert_crlf, def_cipher_algo, def_compress_algo, def_compress_level, def_convert_crlf, def_disable_mdc, def_s2k_cipher_algo, def_s2k_digest_algo, def_s2k_mode, def_text_mode, def_unicode_mode, def_use_sess_key, PGP_Context::disable_mdc, px_alloc, PGP_Context::s2k_cipher_algo, PGP_Context::s2k_digest_algo, PGP_Context::s2k_mode, PGP_Context::text_mode, PGP_Context::unicode_mode, and PGP_Context::use_sess_key.
Referenced by init_work().
{
PGP_Context *ctx;
ctx = px_alloc(sizeof *ctx);
memset(ctx, 0, sizeof *ctx);
ctx->cipher_algo = def_cipher_algo;
ctx->s2k_cipher_algo = def_s2k_cipher_algo;
ctx->s2k_mode = def_s2k_mode;
ctx->s2k_digest_algo = def_s2k_digest_algo;
ctx->compress_algo = def_compress_algo;
ctx->compress_level = def_compress_level;
ctx->disable_mdc = def_disable_mdc;
ctx->use_sess_key = def_use_sess_key;
ctx->unicode_mode = def_unicode_mode;
ctx->convert_crlf = def_convert_crlf;
ctx->text_mode = def_text_mode;
*ctx_p = ctx;
return 0;
}
| int pgp_key_alloc | ( | PGP_PubKey ** | pk_p | ) |
Definition at line 38 of file pgp-pubkey.c.
References px_alloc.
Referenced by _pgp_read_public_key().
{
PGP_PubKey *pk;
pk = px_alloc(sizeof(*pk));
memset(pk, 0, sizeof(*pk));
*pk_p = pk;
return 0;
}
| void pgp_key_free | ( | PGP_PubKey * | pk | ) |
Definition at line 49 of file pgp-pubkey.c.
References PGP_PubKey::algo, PGP_PubKey::dsa, PGP_PubKey::elg, NULL, pgp_mpi_free(), PGP_PUB_DSA_SIGN, PGP_PUB_ELG_ENCRYPT, PGP_PUB_RSA_ENCRYPT, PGP_PUB_RSA_ENCRYPT_SIGN, PGP_PUB_RSA_SIGN, PGP_PubKey::pub, px_free, PGP_PubKey::rsa, and PGP_PubKey::sec.
Referenced by _pgp_read_public_key(), internal_read_key(), pgp_free(), process_secret_key(), and read_pubkey_keyid().
{
if (pk == NULL)
return;
switch (pk->algo)
{
case PGP_PUB_ELG_ENCRYPT:
pgp_mpi_free(pk->pub.elg.p);
pgp_mpi_free(pk->pub.elg.g);
pgp_mpi_free(pk->pub.elg.y);
pgp_mpi_free(pk->sec.elg.x);
break;
case PGP_PUB_RSA_SIGN:
case PGP_PUB_RSA_ENCRYPT:
case PGP_PUB_RSA_ENCRYPT_SIGN:
pgp_mpi_free(pk->pub.rsa.n);
pgp_mpi_free(pk->pub.rsa.e);
pgp_mpi_free(pk->sec.rsa.d);
pgp_mpi_free(pk->sec.rsa.p);
pgp_mpi_free(pk->sec.rsa.q);
pgp_mpi_free(pk->sec.rsa.u);
break;
case PGP_PUB_DSA_SIGN:
pgp_mpi_free(pk->pub.dsa.p);
pgp_mpi_free(pk->pub.dsa.q);
pgp_mpi_free(pk->pub.dsa.g);
pgp_mpi_free(pk->pub.dsa.y);
pgp_mpi_free(pk->sec.dsa.x);
break;
}
memset(pk, 0, sizeof(*pk));
px_free(pk);
}
| int pgp_load_cipher | ( | int | c, | |
| PX_Cipher ** | res | |||
| ) |
Definition at line 168 of file pgp.c.
References get_cipher_info(), i, cipher_info::int_name, NULL, and px_find_cipher().
Referenced by pgp_cfb_create().
{
int err;
const struct cipher_info *i = get_cipher_info(code);
if (i == NULL)
return PXE_PGP_CORRUPT_DATA;
err = px_find_cipher(i->int_name, res);
if (err == 0)
return 0;
return PXE_PGP_UNSUPPORTED_CIPHER;
}
| int pgp_load_digest | ( | int | c, | |
| PX_MD ** | res | |||
| ) |
Definition at line 184 of file pgp.c.
References name, NULL, pgp_get_digest_name(), and px_find_digest().
Referenced by calc_key_id(), check_key_sha1(), mdc_init(), and pgp_s2k_process().
{
int err;
const char *name = pgp_get_digest_name(code);
if (name == NULL)
return PXE_PGP_CORRUPT_DATA;
err = px_find_digest(name, res);
if (err == 0)
return 0;
return PXE_PGP_UNSUPPORTED_HASH;
}
| int pgp_mpi_alloc | ( | int | bits, | |
| PGP_MPI ** | mpi | |||
| ) |
Definition at line 38 of file pgp-mpi.c.
References PGP_MPI::bits, PGP_MPI::bytes, PGP_MPI::data, px_alloc, and px_debug().
Referenced by bn_to_mpi(), pgp_mpi_create(), and pgp_mpi_read().
| unsigned pgp_mpi_cksum | ( | unsigned | cksum, | |
| PGP_MPI * | n | |||
| ) |
Definition at line 133 of file pgp-mpi.c.
References PGP_MPI::bits, PGP_MPI::bytes, PGP_MPI::data, and i.
Referenced by check_key_cksum().
Definition at line 57 of file pgp-mpi.c.
References PGP_MPI::bytes, PGP_MPI::data, and pgp_mpi_alloc().
Referenced by create_secmsg().
{
int res;
PGP_MPI *n;
res = pgp_mpi_alloc(bits, &n);
if (res < 0)
return res;
memcpy(n->data, data, n->bytes);
*mpi = n;
return 0;
}
| int pgp_mpi_free | ( | PGP_MPI * | mpi | ) |
Definition at line 71 of file pgp-mpi.c.
References PGP_MPI::bytes, NULL, and px_free.
Referenced by bn_to_mpi(), decrypt_elgamal(), decrypt_rsa(), encrypt_and_write_elgamal(), encrypt_and_write_rsa(), pgp_key_free(), pgp_mpi_read(), and pgp_parse_pubenc_sesskey().
Definition at line 120 of file pgp-mpi.c.
References PGP_MPI::bits, buf, PGP_MPI::bytes, PGP_MPI::data, and px_md_update.
Referenced by calc_key_id(), and check_key_sha1().
{
uint8 buf[2];
buf[0] = n->bits >> 8;
buf[1] = n->bits & 0xFF;
px_md_update(md, buf, 2);
px_md_update(md, n->data, n->bytes);
return 0;
}
| int pgp_mpi_read | ( | PullFilter * | src, | |
| PGP_MPI ** | mpi | |||
| ) |
Definition at line 81 of file pgp-mpi.c.
References PGP_MPI::bytes, PGP_MPI::data, pgp_mpi_alloc(), pgp_mpi_free(), and pullf_read_fixed().
Referenced by _pgp_read_public_key(), decrypt_elgamal(), decrypt_rsa(), and process_secret_key().
{
int res;
uint8 hdr[2];
int bits;
PGP_MPI *n;
res = pullf_read_fixed(src, 2, hdr);
if (res < 0)
return res;
bits = ((unsigned) hdr[0] << 8) + hdr[1];
res = pgp_mpi_alloc(bits, &n);
if (res < 0)
return res;
res = pullf_read_fixed(src, n->bytes, n->data);
if (res < 0)
pgp_mpi_free(n);
else
*mpi = n;
return res;
}
| int pgp_mpi_write | ( | PushFilter * | dst, | |
| PGP_MPI * | n | |||
| ) |
Definition at line 106 of file pgp-mpi.c.
References PGP_MPI::bits, buf, PGP_MPI::bytes, PGP_MPI::data, and pushf_write().
Referenced by encrypt_and_write_elgamal(), and encrypt_and_write_rsa().
{
int res;
uint8 buf[2];
buf[0] = n->bits >> 8;
buf[1] = n->bits & 0xFF;
res = pushf_write(dst, buf, 2);
if (res >= 0)
res = pushf_write(dst, n->data, n->bytes);
return res;
}
| int pgp_parse_pkt_hdr | ( | PullFilter * | src, | |
| uint8 * | tag, | |||
| int * | len_p, | |||
| int | allow_ctx | |||
| ) |
Definition at line 129 of file pgp-decrypt.c.
References parse_new_len(), parse_old_len(), PKT_CONTEXT, pullf_read(), and px_debug().
Referenced by internal_read_key(), pgp_decrypt(), pgp_get_keyid(), and process_data_packets().
{
int lentype;
int res;
uint8 *p;
/* EOF is normal here, thus we dont use GETBYTE */
res = pullf_read(src, 1, &p);
if (res < 0)
return res;
if (res == 0)
return 0;
if ((*p & 0x80) == 0)
{
px_debug("pgp_parse_pkt_hdr: not pkt hdr");
return PXE_PGP_CORRUPT_DATA;
}
if (*p & 0x40)
{
*tag = *p & 0x3f;
res = parse_new_len(src, len_p);
}
else
{
lentype = *p & 3;
*tag = (*p >> 2) & 0x0F;
if (lentype == 3)
res = allow_ctx ? PKT_CONTEXT : PXE_PGP_CORRUPT_DATA;
else
res = parse_old_len(src, len_p, lentype);
}
return res;
}
| int pgp_parse_pubenc_sesskey | ( | PGP_Context * | ctx, | |
| PullFilter * | pkt | |||
| ) |
Definition at line 151 of file pgp-pubdec.c.
References any_key, PGP_MPI::bytes, check_eme_pkcs1_v15(), PGP_Context::cipher_algo, control_cksum(), PGP_MPI::data, decrypt_elgamal(), decrypt_rsa(), GETBYTE, PGP_PubKey::key_id, memcmp(), NULL, pgp_expect_packet_end(), pgp_mpi_free(), PGP_PUB_ELG_ENCRYPT, PGP_PUB_RSA_ENCRYPT, PGP_PUB_RSA_ENCRYPT_SIGN, PGP_Context::pub_key, pullf_read_fixed(), px_debug(), PGP_Context::sess_key, and PGP_Context::sess_key_len.
Referenced by pgp_decrypt().
{
int ver;
int algo;
int res;
uint8 key_id[8];
PGP_PubKey *pk;
uint8 *msg;
int msglen;
PGP_MPI *m;
pk = ctx->pub_key;
if (pk == NULL)
{
px_debug("no pubkey?");
return PXE_BUG;
}
GETBYTE(pkt, ver);
if (ver != 3)
{
px_debug("unknown pubenc_sesskey pkt ver=%d", ver);
return PXE_PGP_CORRUPT_DATA;
}
/*
* check if keyid's match - user-friendly msg
*/
res = pullf_read_fixed(pkt, 8, key_id);
if (res < 0)
return res;
if (memcmp(key_id, any_key, 8) != 0
&& memcmp(key_id, pk->key_id, 8) != 0)
{
px_debug("key_id's does not match");
return PXE_PGP_WRONG_KEY;
}
/*
* Decrypt
*/
GETBYTE(pkt, algo);
switch (algo)
{
case PGP_PUB_ELG_ENCRYPT:
res = decrypt_elgamal(pk, pkt, &m);
break;
case PGP_PUB_RSA_ENCRYPT:
case PGP_PUB_RSA_ENCRYPT_SIGN:
res = decrypt_rsa(pk, pkt, &m);
break;
default:
res = PXE_PGP_UNKNOWN_PUBALGO;
}
if (res < 0)
return res;
/*
* extract message
*/
msg = check_eme_pkcs1_v15(m->data, m->bytes);
if (msg == NULL)
{
px_debug("check_eme_pkcs1_v15 failed");
res = PXE_PGP_WRONG_KEY;
goto out;
}
msglen = m->bytes - (msg - m->data);
res = control_cksum(msg, msglen);
if (res < 0)
goto out;
/*
* got sesskey
*/
ctx->cipher_algo = *msg;
ctx->sess_key_len = msglen - 3;
memcpy(ctx->sess_key, msg + 1, ctx->sess_key_len);
out:
pgp_mpi_free(m);
if (res < 0)
return res;
return pgp_expect_packet_end(pkt);
}
| int pgp_rsa_decrypt | ( | PGP_PubKey * | pk, | |
| PGP_MPI * | c, | |||
| PGP_MPI ** | m | |||
| ) |
Definition at line 283 of file pgp-mpi-internal.c.
References bn_to_mpi(), mp_clear_free(), mp_int_exptmod(), mp_new(), mpi_to_bn(), PGP_PubKey::pub, PGP_PubKey::rsa, and PGP_PubKey::sec.
Referenced by decrypt_rsa().
{
int res = PXE_PGP_MATH_FAILED;
mpz_t *c = mpi_to_bn(_c);
mpz_t *d = mpi_to_bn(pk->sec.rsa.d);
mpz_t *n = mpi_to_bn(pk->pub.rsa.n);
mpz_t *m = mp_new();
if (!m || !d || !n || !c)
goto err;
/*
* m = c ^ d
*/
mp_int_exptmod(c, d, n, m);
*m_p = bn_to_mpi(m);
if (*m_p)
res = 0;
err:
mp_clear_free(m);
mp_clear_free(n);
mp_clear_free(d);
mp_clear_free(c);
return res;
}
| int pgp_rsa_encrypt | ( | PGP_PubKey * | pk, | |
| PGP_MPI * | m, | |||
| PGP_MPI ** | c | |||
| ) |
Definition at line 255 of file pgp-mpi-internal.c.
References bn_to_mpi(), mp_clear_free(), mp_int_exptmod(), mp_new(), mpi_to_bn(), PGP_PubKey::pub, and PGP_PubKey::rsa.
Referenced by encrypt_and_write_rsa().
{
int res = PXE_PGP_MATH_FAILED;
mpz_t *m = mpi_to_bn(_m);
mpz_t *e = mpi_to_bn(pk->pub.rsa.e);
mpz_t *n = mpi_to_bn(pk->pub.rsa.n);
mpz_t *c = mp_new();
if (!m || !e || !n || !c)
goto err;
/*
* c = m ^ e
*/
mp_int_exptmod(m, e, n, c);
*c_p = bn_to_mpi(c);
if (*c_p)
res = 0;
err:
mp_clear_free(c);
mp_clear_free(n);
mp_clear_free(e);
mp_clear_free(m);
return res;
}
| int pgp_s2k_fill | ( | PGP_S2K * | s2k, | |
| int | mode, | |||
| int | digest_algo | |||
| ) |
Definition at line 210 of file pgp-s2k.c.
References decide_count(), PGP_S2K::digest_algo, PGP_S2K::iter, PGP_S2K::mode, PGP_S2K_SALT, px_get_pseudo_random_bytes(), and PGP_S2K::salt.
Referenced by init_s2k_key().
{
int res = 0;
uint8 tmp;
s2k->mode = mode;
s2k->digest_algo = digest_algo;
switch (s2k->mode)
{
case 0:
break;
case 1:
res = px_get_pseudo_random_bytes(s2k->salt, PGP_S2K_SALT);
break;
case 3:
res = px_get_pseudo_random_bytes(s2k->salt, PGP_S2K_SALT);
if (res < 0)
break;
res = px_get_pseudo_random_bytes(&tmp, 1);
if (res < 0)
break;
s2k->iter = decide_count(tmp);
break;
default:
res = PXE_PGP_BAD_S2K_MODE;
}
return res;
}
Definition at line 267 of file pgp-s2k.c.
References calc_s2k_iter_salted(), calc_s2k_salted(), calc_s2k_simple(), PGP_S2K::digest_algo, PGP_S2K::key_len, PGP_S2K::mode, pgp_get_cipher_key_size(), pgp_load_digest(), and px_md_free.
Referenced by init_s2k_key(), parse_symenc_sesskey(), and process_secret_key().
{
int res;
PX_MD *md;
s2k->key_len = pgp_get_cipher_key_size(cipher);
if (s2k->key_len <= 0)
return PXE_PGP_UNSUPPORTED_CIPHER;
res = pgp_load_digest(s2k->digest_algo, &md);
if (res < 0)
return res;
switch (s2k->mode)
{
case 0:
res = calc_s2k_simple(s2k, md, key, key_len);
break;
case 1:
res = calc_s2k_salted(s2k, md, key, key_len);
break;
case 3:
res = calc_s2k_iter_salted(s2k, md, key, key_len);
break;
default:
res = PXE_PGP_BAD_S2K_MODE;
}
px_md_free(md);
return res;
}
| int pgp_s2k_read | ( | PullFilter * | src, | |
| PGP_S2K * | s2k | |||
| ) |
Definition at line 241 of file pgp-s2k.c.
References PGP_S2K::digest_algo, GETBYTE, PGP_S2K::iter, PGP_S2K::mode, pullf_read_fixed(), and PGP_S2K::salt.
Referenced by parse_symenc_sesskey(), and process_secret_key().
{
int res = 0;
GETBYTE(src, s2k->mode);
GETBYTE(src, s2k->digest_algo);
switch (s2k->mode)
{
case 0:
break;
case 1:
res = pullf_read_fixed(src, 8, s2k->salt);
break;
case 3:
res = pullf_read_fixed(src, 8, s2k->salt);
if (res < 0)
break;
GETBYTE(src, s2k->iter);
break;
default:
res = PXE_PGP_BAD_S2K_MODE;
}
return res;
}
| int pgp_set_cipher_algo | ( | PGP_Context * | ctx, | |
| const char * | name | |||
| ) |
Definition at line 307 of file pgp.c.
References PGP_Context::cipher_algo, cipher_info::code, and pgp_get_cipher_code().
Referenced by set_arg().
{
int code = pgp_get_cipher_code(name);
if (code < 0)
return code;
ctx->cipher_algo = code;
return 0;
}
| int pgp_set_compress_algo | ( | PGP_Context * | ctx, | |
| int | algo | |||
| ) |
Definition at line 274 of file pgp.c.
References PGP_Context::compress_algo, PGP_COMPR_BZIP2, PGP_COMPR_NONE, PGP_COMPR_ZIP, and PGP_COMPR_ZLIB.
Referenced by set_arg().
{
switch (algo)
{
case PGP_COMPR_NONE:
case PGP_COMPR_ZIP:
case PGP_COMPR_ZLIB:
case PGP_COMPR_BZIP2:
ctx->compress_algo = algo;
return 0;
}
return PXE_ARGUMENT_ERROR;
}
| int pgp_set_compress_level | ( | PGP_Context * | ctx, | |
| int | level | |||
| ) |
Definition at line 289 of file pgp.c.
References PGP_Context::compress_level.
Referenced by set_arg().
{
if (level >= 0 && level <= 9)
{
ctx->compress_level = level;
return 0;
}
return PXE_ARGUMENT_ERROR;
}
| int pgp_set_convert_crlf | ( | PGP_Context * | ctx, | |
| int | doit | |||
| ) |
Definition at line 248 of file pgp.c.
References PGP_Context::convert_crlf.
Referenced by set_arg().
{
ctx->convert_crlf = doit ? 1 : 0;
return 0;
}
| int pgp_set_pubkey | ( | PGP_Context * | ctx, | |
| MBuf * | keypkt, | |||
| const uint8 * | key, | |||
| int | klen, | |||
| int | pubtype | |||
| ) |
Definition at line 566 of file pgp-pubkey.c.
References internal_read_key(), PGP_Context::pub_key, pullf_create_mbuf_reader(), and pullf_free().
Referenced by decrypt_internal(), and encrypt_internal().
{
int res;
PullFilter *src;
PGP_PubKey *pk = NULL;
res = pullf_create_mbuf_reader(&src, keypkt);
if (res < 0)
return res;
res = internal_read_key(src, &pk, key, key_len, pubtype);
pullf_free(src);
if (res >= 0)
ctx->pub_key = pk;
return res < 0 ? res : 0;
}
| int pgp_set_s2k_cipher_algo | ( | PGP_Context * | ctx, | |
| const char * | name | |||
| ) |
Definition at line 318 of file pgp.c.
References cipher_info::code, pgp_get_cipher_code(), and PGP_Context::s2k_cipher_algo.
Referenced by set_arg().
{
int code = pgp_get_cipher_code(name);
if (code < 0)
return code;
ctx->s2k_cipher_algo = code;
return 0;
}
| int pgp_set_s2k_digest_algo | ( | PGP_Context * | ctx, | |
| const char * | name | |||
| ) |
Definition at line 329 of file pgp.c.
References cipher_info::code, pgp_get_digest_code(), and PGP_Context::s2k_digest_algo.
Referenced by set_arg().
{
int code = pgp_get_digest_code(name);
if (code < 0)
return code;
ctx->s2k_digest_algo = code;
return 0;
}
| int pgp_set_s2k_mode | ( | PGP_Context * | ctx, | |
| int | type | |||
| ) |
Definition at line 255 of file pgp.c.
References PGP_S2K_ISALTED, PGP_S2K_SALTED, PGP_S2K_SIMPLE, and PGP_Context::s2k_mode.
Referenced by set_arg().
{
int err = PXE_OK;
switch (mode)
{
case PGP_S2K_SIMPLE:
case PGP_S2K_SALTED:
case PGP_S2K_ISALTED:
ctx->s2k_mode = mode;
break;
default:
err = PXE_ARGUMENT_ERROR;
break;
}
return err;
}
| int pgp_set_sess_key | ( | PGP_Context * | ctx, | |
| int | use | |||
| ) |
Definition at line 241 of file pgp.c.
References PGP_Context::use_sess_key.
Referenced by set_arg().
{
ctx->use_sess_key = use ? 1 : 0;
return 0;
}
| int pgp_set_symkey | ( | PGP_Context * | ctx, | |
| const uint8 * | key, | |||
| int | klen | |||
| ) |
Definition at line 353 of file pgp.c.
References NULL, PGP_Context::sym_key, and PGP_Context::sym_key_len.
Referenced by decrypt_internal(), and encrypt_internal().
{
if (key == NULL || len < 1)
return PXE_ARGUMENT_ERROR;
ctx->sym_key = key;
ctx->sym_key_len = len;
return 0;
}
| int pgp_set_text_mode | ( | PGP_Context * | ctx, | |
| int | mode | |||
| ) |
Definition at line 300 of file pgp.c.
References PGP_Context::text_mode.
Referenced by init_work().
{
ctx->text_mode = mode;
return 0;
}
| int pgp_set_unicode_mode | ( | PGP_Context * | ctx, | |
| int | mode | |||
| ) |
Definition at line 346 of file pgp.c.
References PGP_Context::unicode_mode.
Referenced by set_arg().
{
ctx->unicode_mode = mode ? 1 : 0;
return 0;
}
| int pgp_skip_packet | ( | PullFilter * | pkt | ) |
Definition at line 1064 of file pgp-decrypt.c.
References pullf_read().
Referenced by internal_read_key(), pgp_decrypt(), pgp_get_keyid(), read_pubenc_keyid(), and read_pubkey_keyid().
{
int res = 1;
uint8 *tmp;
while (res > 0)
res = pullf_read(pkt, 32 * 1024, &tmp);
return res < 0 ? res : 0;
}
| int pgp_write_pubenc_sesskey | ( | PGP_Context * | ctx, | |
| PushFilter * | dst | |||
| ) |
Definition at line 196 of file pgp-pubenc.c.
References PGP_PubKey::algo, encrypt_and_write_elgamal(), encrypt_and_write_rsa(), PGP_PubKey::key_id, NULL, pgp_create_pkt_writer(), PGP_PKT_PUBENCRYPTED_SESSKEY, PGP_PUB_ELG_ENCRYPT, PGP_PUB_RSA_ENCRYPT, PGP_PUB_RSA_ENCRYPT_SIGN, PGP_Context::pub_key, pushf_flush(), pushf_free(), pushf_write(), and px_debug().
Referenced by pgp_encrypt().
{
int res;
PGP_PubKey *pk = ctx->pub_key;
uint8 ver = 3;
PushFilter *pkt = NULL;
uint8 algo;
if (pk == NULL)
{
px_debug("no pubkey?\n");
return PXE_BUG;
}
algo = pk->algo;
/*
* now write packet
*/
res = pgp_create_pkt_writer(dst, PGP_PKT_PUBENCRYPTED_SESSKEY, &pkt);
if (res < 0)
goto err;
res = pushf_write(pkt, &ver, 1);
if (res < 0)
goto err;
res = pushf_write(pkt, pk->key_id, 8);
if (res < 0)
goto err;
res = pushf_write(pkt, &algo, 1);
if (res < 0)
goto err;
switch (algo)
{
case PGP_PUB_ELG_ENCRYPT:
res = encrypt_and_write_elgamal(ctx, pk, pkt);
break;
case PGP_PUB_RSA_ENCRYPT:
case PGP_PUB_RSA_ENCRYPT_SIGN:
res = encrypt_and_write_rsa(ctx, pk, pkt);
break;
}
if (res < 0)
goto err;
/*
* done, signal packet end
*/
res = pushf_flush(pkt);
err:
if (pkt)
pushf_free(pkt);
return res;
}
| struct PullFilterOps pgp_decrypt_filter |
Definition at line 324 of file pgp-decrypt.c.
Referenced by process_secret_key().
1.7.1