#include "postgres.h"#include "px.h"#include "mbuf.h"#include "pgp.h"
Go to the source code of this file.
Functions | |
| static uint8 * | check_eme_pkcs1_v15 (uint8 *data, int len) |
| static int | control_cksum (uint8 *msg, int msglen) |
| static int | decrypt_elgamal (PGP_PubKey *pk, PullFilter *pkt, PGP_MPI **m_p) |
| static int | decrypt_rsa (PGP_PubKey *pk, PullFilter *pkt, PGP_MPI **m_p) |
| int | pgp_parse_pubenc_sesskey (PGP_Context *ctx, PullFilter *pkt) |
Variables | |
| static const uint8 | any_key [] = {0, 0, 0, 0, 0, 0, 0, 0} |
Definition at line 43 of file pgp-pubdec.c.
Referenced by pgp_parse_pubenc_sesskey().
| static int control_cksum | ( | uint8 * | msg, | |
| int | msglen | |||
| ) | [static] |
Definition at line 75 of file pgp-pubdec.c.
References i, and px_debug().
Referenced by pgp_parse_pubenc_sesskey().
{
int i;
unsigned my_cksum,
got_cksum;
if (msglen < 3)
return PXE_PGP_WRONG_KEY;
my_cksum = 0;
for (i = 1; i < msglen - 2; i++)
my_cksum += msg[i];
my_cksum &= 0xFFFF;
got_cksum = ((unsigned) (msg[msglen - 2]) << 8) + msg[msglen - 1];
if (my_cksum != got_cksum)
{
px_debug("pubenc cksum failed");
return PXE_PGP_WRONG_KEY;
}
return 0;
}
| static int decrypt_elgamal | ( | PGP_PubKey * | pk, | |
| PullFilter * | pkt, | |||
| PGP_MPI ** | m_p | |||
| ) | [static] |
Definition at line 98 of file pgp-pubdec.c.
References PGP_PubKey::algo, pgp_elgamal_decrypt(), pgp_mpi_free(), pgp_mpi_read(), and PGP_PUB_ELG_ENCRYPT.
Referenced by pgp_parse_pubenc_sesskey().
{
int res;
PGP_MPI *c1 = NULL;
PGP_MPI *c2 = NULL;
if (pk->algo != PGP_PUB_ELG_ENCRYPT)
return PXE_PGP_WRONG_KEY;
/* read elgamal encrypted data */
res = pgp_mpi_read(pkt, &c1);
if (res < 0)
goto out;
res = pgp_mpi_read(pkt, &c2);
if (res < 0)
goto out;
/* decrypt */
res = pgp_elgamal_decrypt(pk, c1, c2, m_p);
out:
pgp_mpi_free(c1);
pgp_mpi_free(c2);
return res;
}
| static int decrypt_rsa | ( | PGP_PubKey * | pk, | |
| PullFilter * | pkt, | |||
| PGP_MPI ** | m_p | |||
| ) | [static] |
Definition at line 125 of file pgp-pubdec.c.
References PGP_PubKey::algo, pgp_mpi_free(), pgp_mpi_read(), PGP_PUB_RSA_ENCRYPT, PGP_PUB_RSA_ENCRYPT_SIGN, and pgp_rsa_decrypt().
Referenced by pgp_parse_pubenc_sesskey().
{
int res;
PGP_MPI *c;
if (pk->algo != PGP_PUB_RSA_ENCRYPT
&& pk->algo != PGP_PUB_RSA_ENCRYPT_SIGN)
return PXE_PGP_WRONG_KEY;
/* read rsa encrypted data */
res = pgp_mpi_read(pkt, &c);
if (res < 0)
return res;
/* decrypt */
res = pgp_rsa_decrypt(pk, c, m_p);
pgp_mpi_free(c);
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);
}
Definition at line 148 of file pgp-pubdec.c.
Referenced by pgp_parse_pubenc_sesskey().
1.7.1