PostgreSQL Source Code: contrib/pgcrypto/pgp-pubenc.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
32
34#include "px.h"
35
36
37
38
39static int
41{
43 *p;
44 int pad_len = res_len - 2 - data_len;
45
46 if (pad_len < 8)
48
50 buf[0] = 0x02;
51
53 {
56 }
57
58
59 p = buf + 1;
60 while (p < buf + 1 + pad_len)
61 {
62 if (*p == 0)
63 {
65 {
69 }
70 }
71 if (*p != 0)
72 p++;
73 }
74
75 buf[pad_len + 1] = 0;
76 memcpy(buf + pad_len + 2, data, data_len);
77 *res_p = buf;
78
79 return 0;
80}
81
82static int
84{
86 int res,
87 i;
88 unsigned cksum = 0;
90 uint8 *padded = NULL;
92
93
96
97
98
99
100 secmsg = palloc(klen + 3);
102 memcpy(secmsg + 1, ctx->sess_key, klen);
103 secmsg[klen + 1] = (cksum >> 8) & 0xFF;
104 secmsg[klen + 2] = cksum & 0xFF;
105
106
107
108
110 if (res >= 0)
111 {
112
113 int full_bits = full_bytes * 8 - 6;
114
116 }
117
118 if (padded)
119 {
120 px_memset(padded, 0, full_bytes);
122 }
125
126 if (res >= 0)
127 *msg_p = m;
128
129 return res;
130}
131
132static int
134{
135 int res;
137 *c1 = NULL,
138 *c2 = NULL;
139
140
142 if (res < 0)
143 goto err;
144
145
147 if (res < 0)
148 goto err;
149
150
152 if (res < 0)
153 goto err;
155
160 return res;
161}
162
163static int
165{
166 int res;
168 *c = NULL;
169
170
172 if (res < 0)
173 goto err;
174
175
177 if (res < 0)
178 goto err;
179
180
182
186 return res;
187}
188
189int
191{
192 int res;
197
198 if (pk == NULL)
199 {
202 }
203
204 algo = pk->algo;
205
206
207
208
210 if (res < 0)
211 goto err;
213 if (res < 0)
214 goto err;
216 if (res < 0)
217 goto err;
219 if (res < 0)
220 goto err;
221
222 switch (algo)
223 {
226 break;
230 break;
231 }
232 if (res < 0)
233 goto err;
234
235
236
237
240 if (pkt)
242
243 return res;
244}
void err(int eval, const char *fmt,...)
int pushf_write(PushFilter *mp, const uint8 *data, int len)
int pushf_flush(PushFilter *mp)
void pushf_free(PushFilter *mp)
void pfree(void *pointer)
int pgp_create_pkt_writer(PushFilter *dst, int tag, PushFilter **res_p)
int pgp_elgamal_encrypt(PGP_PubKey *pk, PGP_MPI *_m, PGP_MPI **c1_p, PGP_MPI **c2_p)
int pgp_rsa_encrypt(PGP_PubKey *pk, PGP_MPI *_m, PGP_MPI **c_p)
int pgp_mpi_create(uint8 *data, int bits, PGP_MPI **mpi)
int pgp_mpi_free(PGP_MPI *mpi)
int pgp_mpi_write(PushFilter *dst, PGP_MPI *n)
static int encrypt_and_write_elgamal(PGP_Context *ctx, PGP_PubKey *pk, PushFilter *pkt)
static int pad_eme_pkcs1_v15(uint8 *data, int data_len, int res_len, uint8 **res_p)
static int encrypt_and_write_rsa(PGP_Context *ctx, PGP_PubKey *pk, PushFilter *pkt)
static int create_secmsg(PGP_Context *ctx, PGP_MPI **msg_p, int full_bytes)
int pgp_write_pubenc_sesskey(PGP_Context *ctx, PushFilter *dst)
@ PGP_PKT_PUBENCRYPTED_SESSKEY
@ PGP_PUB_RSA_ENCRYPT_SIGN
bool pg_strong_random(void *buf, size_t len)
void px_debug(const char *fmt,...)
void px_memset(void *ptr, int c, size_t len)
uint8 sess_key[PGP_MAX_KEY]
struct PGP_PubKey::@0::@3 rsa
struct PGP_PubKey::@0::@2 elg