#include "postgres.h"#include "px.h"#include "mbuf.h"#include "pgp.h"
Go to the source code of this file.
Functions | |
| static int | pad_eme_pkcs1_v15 (uint8 *data, int data_len, int res_len, uint8 **res_p) |
| static int | create_secmsg (PGP_Context *ctx, PGP_MPI **msg_p, int full_bytes) |
| static int | encrypt_and_write_elgamal (PGP_Context *ctx, PGP_PubKey *pk, PushFilter *pkt) |
| static int | encrypt_and_write_rsa (PGP_Context *ctx, PGP_PubKey *pk, PushFilter *pkt) |
| int | pgp_write_pubenc_sesskey (PGP_Context *ctx, PushFilter *dst) |
| static int create_secmsg | ( | PGP_Context * | ctx, | |
| PGP_MPI ** | msg_p, | |||
| int | full_bytes | |||
| ) | [static] |
Definition at line 89 of file pgp-pubenc.c.
References PGP_Context::cipher_algo, i, pad_eme_pkcs1_v15(), pgp_mpi_create(), px_alloc, px_free, PGP_Context::sess_key, and PGP_Context::sess_key_len.
Referenced by encrypt_and_write_elgamal(), and encrypt_and_write_rsa().
{
uint8 *secmsg;
int res,
i;
unsigned cksum = 0;
int klen = ctx->sess_key_len;
uint8 *padded = NULL;
PGP_MPI *m = NULL;
/* calc checksum */
for (i = 0; i < klen; i++)
cksum += ctx->sess_key[i];
/*
* create "secret message"
*/
secmsg = px_alloc(klen + 3);
secmsg[0] = ctx->cipher_algo;
memcpy(secmsg + 1, ctx->sess_key, klen);
secmsg[klen + 1] = (cksum >> 8) & 0xFF;
secmsg[klen + 2] = cksum & 0xFF;
/*
* now create a large integer of it
*/
res = pad_eme_pkcs1_v15(secmsg, klen + 3, full_bytes, &padded);
if (res >= 0)
{
/* first byte will be 0x02 */
int full_bits = full_bytes * 8 - 6;
res = pgp_mpi_create(padded, full_bits, &m);
}
if (padded)
{
memset(padded, 0, full_bytes);
px_free(padded);
}
memset(secmsg, 0, klen + 3);
px_free(secmsg);
if (res >= 0)
*msg_p = m;
return res;
}
| static int encrypt_and_write_elgamal | ( | PGP_Context * | ctx, | |
| PGP_PubKey * | pk, | |||
| PushFilter * | pkt | |||
| ) | [static] |
Definition at line 139 of file pgp-pubenc.c.
References create_secmsg(), PGP_PubKey::elg, pgp_elgamal_encrypt(), pgp_mpi_free(), pgp_mpi_write(), and PGP_PubKey::pub.
Referenced by pgp_write_pubenc_sesskey().
{
int res;
PGP_MPI *m = NULL,
*c1 = NULL,
*c2 = NULL;
/* create padded msg */
res = create_secmsg(ctx, &m, pk->pub.elg.p->bytes - 1);
if (res < 0)
goto err;
/* encrypt it */
res = pgp_elgamal_encrypt(pk, m, &c1, &c2);
if (res < 0)
goto err;
/* write out */
res = pgp_mpi_write(pkt, c1);
if (res < 0)
goto err;
res = pgp_mpi_write(pkt, c2);
err:
pgp_mpi_free(m);
pgp_mpi_free(c1);
pgp_mpi_free(c2);
return res;
}
| static int encrypt_and_write_rsa | ( | PGP_Context * | ctx, | |
| PGP_PubKey * | pk, | |||
| PushFilter * | pkt | |||
| ) | [static] |
Definition at line 170 of file pgp-pubenc.c.
References create_secmsg(), pgp_mpi_free(), pgp_mpi_write(), pgp_rsa_encrypt(), PGP_PubKey::pub, and PGP_PubKey::rsa.
Referenced by pgp_write_pubenc_sesskey().
{
int res;
PGP_MPI *m = NULL,
*c = NULL;
/* create padded msg */
res = create_secmsg(ctx, &m, pk->pub.rsa.n->bytes - 1);
if (res < 0)
goto err;
/* encrypt it */
res = pgp_rsa_encrypt(pk, m, &c);
if (res < 0)
goto err;
/* write out */
res = pgp_mpi_write(pkt, c);
err:
pgp_mpi_free(m);
pgp_mpi_free(c);
return res;
}
Definition at line 41 of file pgp-pubenc.c.
References buf, px_alloc, px_free, and px_get_random_bytes().
Referenced by create_secmsg().
{
int res;
uint8 *buf,
*p;
int pad_len = res_len - 2 - data_len;
if (pad_len < 8)
return PXE_BUG;
buf = px_alloc(res_len);
buf[0] = 0x02;
res = px_get_random_bytes(buf + 1, pad_len);
if (res < 0)
{
px_free(buf);
return res;
}
/* pad must not contain zero bytes */
p = buf + 1;
while (p < buf + 1 + pad_len)
{
if (*p == 0)
{
res = px_get_random_bytes(p, 1);
if (res < 0)
break;
}
if (*p != 0)
p++;
}
if (res < 0)
{
memset(buf, 0, res_len);
px_free(buf);
return res;
}
buf[pad_len + 1] = 0;
memcpy(buf + pad_len + 2, data, data_len);
*res_p = buf;
return 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;
}
1.7.1