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

94 for (i = 0; i < klen; i++)

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