#include "postgres.h"
#include "mbuf.h"
#include "px.h"
#include "pgp.h"
Go to the source code of this file.
Data Structures | |
struct | PGP_CFB |
Typedefs | |
typedef int(* | mix_data_t )(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst) |
Functions | |
int | pgp_cfb_create (PGP_CFB **ctx_p, int algo, const uint8 *key, int key_len, int resync, uint8 *iv) |
void | pgp_cfb_free (PGP_CFB *ctx) |
static int | mix_encrypt_normal (PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst) |
static int | mix_decrypt_normal (PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst) |
static int | mix_encrypt_resync (PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst) |
static int | mix_decrypt_resync (PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst) |
static int | cfb_process (PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst, mix_data_t mix_data) |
int | pgp_cfb_encrypt (PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst) |
int | pgp_cfb_decrypt (PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst) |
typedef int(* mix_data_t)(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst) |
static int cfb_process | ( | PGP_CFB * | ctx, | |
const uint8 * | data, | |||
int | len, | |||
uint8 * | dst, | |||
mix_data_t | mix_data | |||
) | [static] |
Definition at line 199 of file pgp-cfb.c.
References PGP_CFB::block_no, PGP_CFB::block_size, PGP_CFB::ciph, PGP_CFB::encbuf, PGP_CFB::fr, PGP_CFB::fre, PGP_CFB::pos, and px_cipher_encrypt.
Referenced by pgp_cfb_decrypt(), and pgp_cfb_encrypt().
{ int n; int res; while (len > 0 && ctx->pos > 0) { n = ctx->block_size - ctx->pos; if (len < n) n = len; n = mix_data(ctx, data, n, dst); data += n; dst += n; len -= n; if (ctx->pos == ctx->block_size) { memcpy(ctx->fr, ctx->encbuf, ctx->block_size); ctx->pos = 0; } } while (len > 0) { px_cipher_encrypt(ctx->ciph, ctx->fr, ctx->block_size, ctx->fre); if (ctx->block_no < 5) ctx->block_no++; n = ctx->block_size; if (len < n) n = len; res = mix_data(ctx, data, n, dst); data += res; dst += res; len -= res; if (ctx->pos == ctx->block_size) { memcpy(ctx->fr, ctx->encbuf, ctx->block_size); ctx->pos = 0; } } return 0; }
Definition at line 107 of file pgp-cfb.c.
References PGP_CFB::encbuf, PGP_CFB::fre, i, and PGP_CFB::pos.
Definition at line 159 of file pgp-cfb.c.
References PGP_CFB::block_no, PGP_CFB::block_size, PGP_CFB::encbuf, PGP_CFB::fr, PGP_CFB::fre, i, and PGP_CFB::pos.
Referenced by pgp_cfb_decrypt().
{ int i, n; /* block #2 is 2 bytes long */ if (ctx->block_no == 2) { n = 2 - ctx->pos; if (len < n) n = len; for (i = ctx->pos; i < ctx->pos + n; i++) { ctx->encbuf[i] = *data++; *dst++ = ctx->fre[i] ^ ctx->encbuf[i]; } ctx->pos += n; len -= n; if (ctx->pos == 2) { memcpy(ctx->fr, ctx->encbuf + 2, ctx->block_size - 2); memcpy(ctx->fr + ctx->block_size - 2, ctx->encbuf, 2); ctx->pos = 0; return n; } } for (i = ctx->pos; i < ctx->pos + len; i++) { ctx->encbuf[i] = *data++; *dst++ = ctx->fre[i] ^ ctx->encbuf[i]; } ctx->pos += len; return len; }
Definition at line 96 of file pgp-cfb.c.
References PGP_CFB::encbuf, PGP_CFB::fre, i, and PGP_CFB::pos.
Definition at line 127 of file pgp-cfb.c.
References PGP_CFB::block_no, PGP_CFB::block_size, PGP_CFB::encbuf, PGP_CFB::fr, PGP_CFB::fre, i, and PGP_CFB::pos.
Referenced by pgp_cfb_encrypt().
{ int i, n; /* block #2 is 2 bytes long */ if (ctx->block_no == 2) { n = 2 - ctx->pos; if (len < n) n = len; for (i = ctx->pos; i < ctx->pos + n; i++) *dst++ = ctx->encbuf[i] = ctx->fre[i] ^ (*data++); ctx->pos += n; len -= n; if (ctx->pos == 2) { memcpy(ctx->fr, ctx->encbuf + 2, ctx->block_size - 2); memcpy(ctx->fr + ctx->block_size - 2, ctx->encbuf, 2); ctx->pos = 0; return n; } } for (i = ctx->pos; i < ctx->pos + len; i++) *dst++ = ctx->encbuf[i] = ctx->fre[i] ^ (*data++); ctx->pos += len; return len; }
int pgp_cfb_create | ( | PGP_CFB ** | ctx_p, | |
int | algo, | |||
const uint8 * | key, | |||
int | key_len, | |||
int | resync, | |||
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); }