PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
pgp.c
Go to the documentation of this file.
1 /*
2  * pgp.c
3  * Various utility stuff.
4  *
5  * Copyright (c) 2005 Marko Kreen
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in the
15  * documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * contrib/pgcrypto/pgp.c
30  */
31 
32 #include "postgres.h"
33 
34 #include "px.h"
35 #include "pgp.h"
36 
37 /*
38  * Defaults.
39  */
41 static int def_s2k_cipher_algo = -1;
43 static int def_s2k_count = -1;
46 static int def_compress_level = 6;
47 static int def_disable_mdc = 0;
48 static int def_use_sess_key = 0;
49 static int def_text_mode = 0;
50 static int def_unicode_mode = 0;
51 static int def_convert_crlf = 0;
52 
54 {
55  const char *name;
56  int code;
57  const char *int_name;
58 };
59 
61 {
62  const char *name;
63  int code;
64  const char *int_name;
65  int key_len;
66  int block_len;
67 };
68 
69 static const struct digest_info digest_list[] = {
70  {"md5", PGP_DIGEST_MD5},
71  {"sha1", PGP_DIGEST_SHA1},
72  {"sha-1", PGP_DIGEST_SHA1},
73  {"ripemd160", PGP_DIGEST_RIPEMD160},
74  {"sha256", PGP_DIGEST_SHA256},
75  {"sha384", PGP_DIGEST_SHA384},
76  {"sha512", PGP_DIGEST_SHA512},
77  {NULL, 0}
78 };
79 
80 static const struct cipher_info cipher_list[] = {
81  {"3des", PGP_SYM_DES3, "3des-ecb", 192 / 8, 64 / 8},
82  {"cast5", PGP_SYM_CAST5, "cast5-ecb", 128 / 8, 64 / 8},
83  {"bf", PGP_SYM_BLOWFISH, "bf-ecb", 128 / 8, 64 / 8},
84  {"blowfish", PGP_SYM_BLOWFISH, "bf-ecb", 128 / 8, 64 / 8},
85  {"aes", PGP_SYM_AES_128, "aes-ecb", 128 / 8, 128 / 8},
86  {"aes128", PGP_SYM_AES_128, "aes-ecb", 128 / 8, 128 / 8},
87  {"aes192", PGP_SYM_AES_192, "aes-ecb", 192 / 8, 128 / 8},
88  {"aes256", PGP_SYM_AES_256, "aes-ecb", 256 / 8, 128 / 8},
89  {"twofish", PGP_SYM_TWOFISH, "twofish-ecb", 256 / 8, 128 / 8},
90  {NULL, 0, NULL}
91 };
92 
93 static const struct cipher_info *
95 {
96  const struct cipher_info *i;
97 
98  for (i = cipher_list; i->name; i++)
99  if (i->code == code)
100  return i;
101  return NULL;
102 }
103 
104 int
106 {
107  const struct digest_info *i;
108 
109  for (i = digest_list; i->name; i++)
110  if (pg_strcasecmp(i->name, name) == 0)
111  return i->code;
113 }
114 
115 int
117 {
118  const struct cipher_info *i;
119 
120  for (i = cipher_list; i->name; i++)
121  if (pg_strcasecmp(i->name, name) == 0)
122  return i->code;
124 }
125 
126 const char *
128 {
129  const struct digest_info *i;
130 
131  for (i = digest_list; i->name; i++)
132  if (i->code == code)
133  return i->name;
134  return NULL;
135 }
136 
137 const char *
139 {
140  const struct cipher_info *i = get_cipher_info(code);
141 
142  if (i != NULL)
143  return i->name;
144  return NULL;
145 }
146 
147 int
149 {
150  const struct cipher_info *i = get_cipher_info(code);
151 
152  if (i != NULL)
153  return i->key_len;
154  return 0;
155 }
156 
157 int
159 {
160  const struct cipher_info *i = get_cipher_info(code);
161 
162  if (i != NULL)
163  return i->block_len;
164  return 0;
165 }
166 
167 int
169 {
170  int err;
171  const struct cipher_info *i = get_cipher_info(code);
172 
173  if (i == NULL)
174  return PXE_PGP_CORRUPT_DATA;
175 
176  err = px_find_cipher(i->int_name, res);
177  if (err == 0)
178  return 0;
179 
181 }
182 
183 int
185 {
186  int err;
187  const char *name = pgp_get_digest_name(code);
188 
189  if (name == NULL)
190  return PXE_PGP_CORRUPT_DATA;
191 
192  err = px_find_digest(name, res);
193  if (err == 0)
194  return 0;
195 
197 }
198 
199 int
201 {
202  PGP_Context *ctx;
203 
204  ctx = px_alloc(sizeof *ctx);
205  memset(ctx, 0, sizeof *ctx);
206 
209  ctx->s2k_mode = def_s2k_mode;
210  ctx->s2k_count = def_s2k_count;
218  ctx->text_mode = def_text_mode;
219 
220  *ctx_p = ctx;
221  return 0;
222 }
223 
224 int
226 {
227  if (ctx->pub_key)
228  pgp_key_free(ctx->pub_key);
229  px_memset(ctx, 0, sizeof *ctx);
230  px_free(ctx);
231  return 0;
232 }
233 
234 int
235 pgp_disable_mdc(PGP_Context *ctx, int disable)
236 {
237  ctx->disable_mdc = disable ? 1 : 0;
238  return 0;
239 }
240 
241 int
243 {
244  ctx->use_sess_key = use ? 1 : 0;
245  return 0;
246 }
247 
248 int
250 {
251  ctx->convert_crlf = doit ? 1 : 0;
252  return 0;
253 }
254 
255 int
257 {
258  int err = PXE_OK;
259 
260  switch (mode)
261  {
262  case PGP_S2K_SIMPLE:
263  case PGP_S2K_SALTED:
264  case PGP_S2K_ISALTED:
265  ctx->s2k_mode = mode;
266  break;
267  default:
268  err = PXE_ARGUMENT_ERROR;
269  break;
270  }
271  return err;
272 }
273 
274 int
276 {
277  if (ctx->s2k_mode == PGP_S2K_ISALTED && count >= 1024 && count <= 65011712)
278  {
279  ctx->s2k_count = count;
280  return PXE_OK;
281  }
282  return PXE_ARGUMENT_ERROR;
283 }
284 
285 int
287 {
288  switch (algo)
289  {
290  case PGP_COMPR_NONE:
291  case PGP_COMPR_ZIP:
292  case PGP_COMPR_ZLIB:
293  case PGP_COMPR_BZIP2:
294  ctx->compress_algo = algo;
295  return 0;
296  }
297  return PXE_ARGUMENT_ERROR;
298 }
299 
300 int
302 {
303  if (level >= 0 && level <= 9)
304  {
305  ctx->compress_level = level;
306  return 0;
307  }
308  return PXE_ARGUMENT_ERROR;
309 }
310 
311 int
313 {
314  ctx->text_mode = mode;
315  return 0;
316 }
317 
318 int
320 {
321  int code = pgp_get_cipher_code(name);
322 
323  if (code < 0)
324  return code;
325  ctx->cipher_algo = code;
326  return 0;
327 }
328 
329 int
331 {
332  int code = pgp_get_cipher_code(name);
333 
334  if (code < 0)
335  return code;
336  ctx->s2k_cipher_algo = code;
337  return 0;
338 }
339 
340 int
342 {
343  int code = pgp_get_digest_code(name);
344 
345  if (code < 0)
346  return code;
347  ctx->s2k_digest_algo = code;
348  return 0;
349 }
350 
351 int
353 {
354  return ctx->unicode_mode;
355 }
356 
357 int
359 {
360  ctx->unicode_mode = mode ? 1 : 0;
361  return 0;
362 }
363 
364 int
365 pgp_set_symkey(PGP_Context *ctx, const uint8 *key, int len)
366 {
367  if (key == NULL || len < 1)
368  return PXE_ARGUMENT_ERROR;
369  ctx->sym_key = key;
370  ctx->sym_key_len = len;
371  return 0;
372 }
#define PXE_OK
Definition: px.h:62
#define PXE_PGP_UNSUPPORTED_HASH
Definition: px.h:85
static int def_convert_crlf
Definition: pgp.c:51
#define PXE_ARGUMENT_ERROR
Definition: px.h:74
int pgp_get_cipher_code(const char *name)
Definition: pgp.c:116
#define PXE_PGP_CORRUPT_DATA
Definition: px.h:81
int sym_key_len
Definition: pgp.h:166
int pgp_get_unicode_mode(PGP_Context *ctx)
Definition: pgp.c:352
int pgp_set_s2k_cipher_algo(PGP_Context *ctx, const char *name)
Definition: pgp.c:330
int cipher_algo
Definition: pgp.h:144
static int def_use_sess_key
Definition: pgp.c:48
int pgp_set_s2k_digest_algo(PGP_Context *ctx, const char *name)
Definition: pgp.c:341
int pgp_set_s2k_mode(PGP_Context *ctx, int mode)
Definition: pgp.c:256
static int def_s2k_mode
Definition: pgp.c:42
#define PXE_PGP_UNSUPPORTED_CIPHER
Definition: px.h:84
int key_len
Definition: pgp.c:65
int unicode_mode
Definition: pgp.h:151
#define px_free(p)
Definition: px.h:46
const uint8 * sym_key
Definition: pgp.h:165
unsigned char uint8
Definition: c.h:266
const char * name
Definition: pgp.c:55
static int def_s2k_count
Definition: pgp.c:43
int pg_strcasecmp(const char *s1, const char *s2)
Definition: pgstrcasecmp.c:36
int compress_level
Definition: pgp.h:146
int pgp_get_digest_code(const char *name)
Definition: pgp.c:105
static int def_compress_algo
Definition: pgp.c:45
static int def_compress_level
Definition: pgp.c:46
int disable_mdc
Definition: pgp.h:147
int use_sess_key
Definition: pgp.h:148
int pgp_set_sess_key(PGP_Context *ctx, int use)
Definition: pgp.c:242
static int def_text_mode
Definition: pgp.c:49
const char * name
Definition: pgp.c:62
Definition: px.h:113
int pgp_set_compress_level(PGP_Context *ctx, int level)
Definition: pgp.c:301
static int def_s2k_cipher_algo
Definition: pgp.c:41
void pgp_key_free(PGP_PubKey *pk)
Definition: pgp-pubkey.c:49
int pgp_load_cipher(int code, PX_Cipher **res)
Definition: pgp.c:168
static int def_unicode_mode
Definition: pgp.c:50
int pgp_set_symkey(PGP_Context *ctx, const uint8 *key, int len)
Definition: pgp.c:365
int compress_algo
Definition: pgp.h:145
const char * pgp_get_digest_name(int code)
Definition: pgp.c:127
int pgp_get_cipher_key_size(int code)
Definition: pgp.c:148
int pgp_set_convert_crlf(PGP_Context *ctx, int doit)
Definition: pgp.c:249
int pgp_init(PGP_Context **ctx_p)
Definition: pgp.c:200
static const struct cipher_info * get_cipher_info(int code)
Definition: pgp.c:94
static int def_cipher_algo
Definition: pgp.c:40
int code
Definition: pgp.c:56
int pgp_set_unicode_mode(PGP_Context *ctx, int mode)
Definition: pgp.c:358
int pgp_load_digest(int code, PX_MD **res)
Definition: pgp.c:184
int pgp_set_cipher_algo(PGP_Context *ctx, const char *name)
Definition: pgp.c:319
int pgp_disable_mdc(PGP_Context *ctx, int disable)
Definition: pgp.c:235
#define NULL
Definition: c.h:229
const char * pgp_get_cipher_name(int code)
Definition: pgp.c:138
int pgp_get_cipher_block_size(int code)
Definition: pgp.c:158
int s2k_cipher_algo
Definition: pgp.h:143
int block_len
Definition: pgp.c:66
Definition: px.h:154
const char * name
Definition: encode.c:521
int convert_crlf
Definition: pgp.h:150
const char * int_name
Definition: pgp.c:64
#define px_alloc(s)
Definition: px.h:44
int pgp_set_s2k_count(PGP_Context *ctx, int count)
Definition: pgp.c:275
const char * int_name
Definition: pgp.c:57
int s2k_mode
Definition: pgp.h:140
int s2k_digest_algo
Definition: pgp.h:142
static int def_disable_mdc
Definition: pgp.c:47
int i
int pgp_set_text_mode(PGP_Context *ctx, int mode)
Definition: pgp.c:312
static int def_s2k_digest_algo
Definition: pgp.c:44
PGP_PubKey * pub_key
Definition: pgp.h:164
static const struct digest_info digest_list[]
Definition: pgp.c:69
int pgp_free(PGP_Context *ctx)
Definition: pgp.c:225
int text_mode
Definition: pgp.h:149
static const struct cipher_info cipher_list[]
Definition: pgp.c:80
int px_find_digest(const char *name, PX_MD **res)
Definition: internal.c:578
int s2k_count
Definition: pgp.h:141
void px_memset(void *ptr, int c, size_t len)
Definition: px.c:134
int pgp_set_compress_algo(PGP_Context *ctx, int algo)
Definition: pgp.c:286
int px_find_cipher(const char *name, PX_Cipher **res)
Definition: internal.c:597
int code
Definition: pgp.c:63