PostgreSQL Source Code git master
pgp-cfb.c File Reference
#include "postgres.h"
#include "pgp.h"
#include "px.h"
Include dependency graph for pgp-cfb.c:

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 Documentation

◆ mix_data_t

typedef int(* mix_data_t) (PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst)

Definition at line 37 of file pgp-cfb.c.

Function Documentation

◆ cfb_process()

static int cfb_process ( PGP_CFB ctx,
const uint8 data,
int  len,
uint8 dst,
mix_data_t  mix_data 
)
static

Definition at line 197 of file pgp-cfb.c.

199{
200 int n;
201 int res;
202
203 while (len > 0 && ctx->pos > 0)
204 {
205 n = ctx->block_size - ctx->pos;
206 if (len < n)
207 n = len;
208
209 n = mix_data(ctx, data, n, dst);
210 data += n;
211 dst += n;
212 len -= n;
213
214 if (ctx->pos == ctx->block_size)
215 {
216 memcpy(ctx->fr, ctx->encbuf, ctx->block_size);
217 ctx->pos = 0;
218 }
219 }
220
221 while (len > 0)
222 {
223 unsigned rlen;
224
225 px_cipher_encrypt(ctx->ciph, 0, ctx->fr, ctx->block_size, ctx->fre, &rlen);
226 if (ctx->block_no < 5)
227 ctx->block_no++;
228
229 n = ctx->block_size;
230 if (len < n)
231 n = len;
232
233 res = mix_data(ctx, data, n, dst);
234 data += res;
235 dst += res;
236 len -= res;
237
238 if (ctx->pos == ctx->block_size)
239 {
240 memcpy(ctx->fr, ctx->encbuf, ctx->block_size);
241 ctx->pos = 0;
242 }
243 }
244 return 0;
245}
const void size_t len
const void * data
#define px_cipher_encrypt(c, padding, data, dlen, res, rlen)
Definition: px.h:222
int block_size
Definition: pgp-cfb.c:42
PX_Cipher * ciph
Definition: pgp-cfb.c:41
int pos
Definition: pgp-cfb.c:43
uint8 fre[PGP_MAX_BLOCK]
Definition: pgp-cfb.c:47
uint8 encbuf[PGP_MAX_BLOCK]
Definition: pgp-cfb.c:48
uint8 fr[PGP_MAX_BLOCK]
Definition: pgp-cfb.c:46
int block_no
Definition: pgp-cfb.c:44

References PGP_CFB::block_no, PGP_CFB::block_size, PGP_CFB::ciph, data, PGP_CFB::encbuf, PGP_CFB::fr, PGP_CFB::fre, len, PGP_CFB::pos, px_cipher_encrypt, and res.

Referenced by pgp_cfb_decrypt(), and pgp_cfb_encrypt().

◆ mix_decrypt_normal()

static int mix_decrypt_normal ( PGP_CFB ctx,
const uint8 data,
int  len,
uint8 dst 
)
static

Definition at line 105 of file pgp-cfb.c.

106{
107 int i;
108
109 for (i = ctx->pos; i < ctx->pos + len; i++)
110 {
111 ctx->encbuf[i] = *data++;
112 *dst++ = ctx->fre[i] ^ ctx->encbuf[i];
113 }
114 ctx->pos += len;
115 return len;
116}
int i
Definition: isn.c:72

References data, PGP_CFB::encbuf, PGP_CFB::fre, i, len, and PGP_CFB::pos.

Referenced by pgp_cfb_decrypt().

◆ mix_decrypt_resync()

static int mix_decrypt_resync ( PGP_CFB ctx,
const uint8 data,
int  len,
uint8 dst 
)
static

Definition at line 157 of file pgp-cfb.c.

158{
159 int i,
160 n;
161
162 /* block #2 is 2 bytes long */
163 if (ctx->block_no == 2)
164 {
165 n = 2 - ctx->pos;
166 if (len < n)
167 n = len;
168 for (i = ctx->pos; i < ctx->pos + n; i++)
169 {
170 ctx->encbuf[i] = *data++;
171 *dst++ = ctx->fre[i] ^ ctx->encbuf[i];
172 }
173 ctx->pos += n;
174 len -= n;
175
176 if (ctx->pos == 2)
177 {
178 memcpy(ctx->fr, ctx->encbuf + 2, ctx->block_size - 2);
179 memcpy(ctx->fr + ctx->block_size - 2, ctx->encbuf, 2);
180 ctx->pos = 0;
181 return n;
182 }
183 }
184 for (i = ctx->pos; i < ctx->pos + len; i++)
185 {
186 ctx->encbuf[i] = *data++;
187 *dst++ = ctx->fre[i] ^ ctx->encbuf[i];
188 }
189 ctx->pos += len;
190 return len;
191}

References PGP_CFB::block_no, PGP_CFB::block_size, data, PGP_CFB::encbuf, PGP_CFB::fr, PGP_CFB::fre, i, len, and PGP_CFB::pos.

Referenced by pgp_cfb_decrypt().

◆ mix_encrypt_normal()

static int mix_encrypt_normal ( PGP_CFB ctx,
const uint8 data,
int  len,
uint8 dst 
)
static

Definition at line 94 of file pgp-cfb.c.

95{
96 int i;
97
98 for (i = ctx->pos; i < ctx->pos + len; i++)
99 *dst++ = ctx->encbuf[i] = ctx->fre[i] ^ (*data++);
100 ctx->pos += len;
101 return len;
102}

References data, PGP_CFB::encbuf, PGP_CFB::fre, i, len, and PGP_CFB::pos.

Referenced by pgp_cfb_encrypt().

◆ mix_encrypt_resync()

static int mix_encrypt_resync ( PGP_CFB ctx,
const uint8 data,
int  len,
uint8 dst 
)
static

Definition at line 125 of file pgp-cfb.c.

126{
127 int i,
128 n;
129
130 /* block #2 is 2 bytes long */
131 if (ctx->block_no == 2)
132 {
133 n = 2 - ctx->pos;
134 if (len < n)
135 n = len;
136 for (i = ctx->pos; i < ctx->pos + n; i++)
137 *dst++ = ctx->encbuf[i] = ctx->fre[i] ^ (*data++);
138
139 ctx->pos += n;
140 len -= n;
141
142 if (ctx->pos == 2)
143 {
144 memcpy(ctx->fr, ctx->encbuf + 2, ctx->block_size - 2);
145 memcpy(ctx->fr + ctx->block_size - 2, ctx->encbuf, 2);
146 ctx->pos = 0;
147 return n;
148 }
149 }
150 for (i = ctx->pos; i < ctx->pos + len; i++)
151 *dst++ = ctx->encbuf[i] = ctx->fre[i] ^ (*data++);
152 ctx->pos += len;
153 return len;
154}

References PGP_CFB::block_no, PGP_CFB::block_size, data, PGP_CFB::encbuf, PGP_CFB::fr, PGP_CFB::fre, i, len, and PGP_CFB::pos.

Referenced by pgp_cfb_encrypt().

◆ pgp_cfb_create()

int pgp_cfb_create ( PGP_CFB **  ctx_p,
int  algo,
const uint8 key,
int  key_len,
int  resync,
uint8 iv 
)

Definition at line 52 of file pgp-cfb.c.

54{
55 int res;
56 PX_Cipher *ciph;
57 PGP_CFB *ctx;
58
59 res = pgp_load_cipher(algo, &ciph);
60 if (res < 0)
61 return res;
62
63 res = px_cipher_init(ciph, key, key_len, NULL);
64 if (res < 0)
65 {
66 px_cipher_free(ciph);
67 return res;
68 }
69
70 ctx = palloc0(sizeof(*ctx));
71 ctx->ciph = ciph;
73 ctx->resync = resync;
74
75 if (iv)
76 memcpy(ctx->fr, iv, ctx->block_size);
77
78 *ctx_p = ctx;
79 return 0;
80}
void * palloc0(Size size)
Definition: mcxt.c:1347
int pgp_load_cipher(int code, PX_Cipher **res)
Definition: pgp.c:157
#define px_cipher_free(c)
Definition: px.h:226
#define px_cipher_block_size(c)
Definition: px.h:219
#define px_cipher_init(c, k, klen, iv)
Definition: px.h:221
int resync
Definition: pgp-cfb.c:45
Definition: px.h:149

References PGP_CFB::block_size, PGP_CFB::ciph, PGP_CFB::fr, sort-test::key, palloc0(), pgp_load_cipher(), px_cipher_block_size, px_cipher_free, px_cipher_init, res, and PGP_CFB::resync.

Referenced by decrypt_key(), encrypt_init(), parse_symenc_data(), parse_symenc_mdc_data(), process_secret_key(), and symencrypt_sesskey().

◆ pgp_cfb_decrypt()

int pgp_cfb_decrypt ( PGP_CFB ctx,
const uint8 data,
int  len,
uint8 dst 
)

Definition at line 260 of file pgp-cfb.c.

261{
263
264 return cfb_process(ctx, data, len, dst, mix);
265}
#define mix(a, b, c)
Definition: hashfn.c:82
static int mix_decrypt_resync(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst)
Definition: pgp-cfb.c:157
static int cfb_process(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst, mix_data_t mix_data)
Definition: pgp-cfb.c:197
int(* mix_data_t)(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst)
Definition: pgp-cfb.c:37
static int mix_decrypt_normal(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst)
Definition: pgp-cfb.c:105

References cfb_process(), data, len, mix, mix_decrypt_normal(), mix_decrypt_resync(), and PGP_CFB::resync.

Referenced by decrypt_key(), and decrypt_read().

◆ pgp_cfb_encrypt()

int pgp_cfb_encrypt ( PGP_CFB ctx,
const uint8 data,
int  len,
uint8 dst 
)

Definition at line 252 of file pgp-cfb.c.

253{
255
256 return cfb_process(ctx, data, len, dst, mix);
257}
static int mix_encrypt_resync(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst)
Definition: pgp-cfb.c:125
static int mix_encrypt_normal(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst)
Definition: pgp-cfb.c:94

References cfb_process(), data, len, mix, mix_encrypt_normal(), mix_encrypt_resync(), and PGP_CFB::resync.

Referenced by encrypt_process(), and symencrypt_sesskey().

◆ pgp_cfb_free()

void pgp_cfb_free ( PGP_CFB ctx)

Definition at line 83 of file pgp-cfb.c.

84{
85 px_cipher_free(ctx->ciph);
86 px_memset(ctx, 0, sizeof(*ctx));
87 pfree(ctx);
88}
void pfree(void *pointer)
Definition: mcxt.c:1521
void px_memset(void *ptr, int c, size_t len)
Definition: px.c:123

References PGP_CFB::ciph, pfree(), px_cipher_free, and px_memset().

Referenced by decrypt_key(), encrypt_free(), parse_symenc_data(), parse_symenc_mdc_data(), process_secret_key(), and symencrypt_sesskey().