PostgreSQL Source Code  git master
pgp.h
Go to the documentation of this file.
1 /*
2  * pgp.h
3  * OpenPGP implementation.
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.h
30  */
31 
32 #include "lib/stringinfo.h"
33 
34 #include "mbuf.h"
35 #include "px.h"
36 
38 {
42 };
43 
45 {
63  PGP_PKT_PRIV_61 = 61, /* occurs in gpg secring */
64 };
65 
67 {
73 };
74 
76 {
77  PGP_SYM_PLAIN = 0, /* ?? */
78  PGP_SYM_IDEA = 1, /* obsolete, PGP 2.6 compat */
79  PGP_SYM_DES3 = 2, /* must */
80  PGP_SYM_CAST5 = 3, /* should */
82  PGP_SYM_SAFER_SK128 = 5, /* obsolete */
83  PGP_SYM_DES_SK = 6, /* obsolete */
84  PGP_SYM_AES_128 = 7, /* should */
88 };
89 
91 {
92  PGP_COMPR_NONE = 0, /* must */
93  PGP_COMPR_ZIP = 1, /* should */
96 };
97 
99 {
100  PGP_DIGEST_MD5 = 1, /* should, deprecated */
101  PGP_DIGEST_SHA1 = 2, /* must */
103  PGP_DIGEST_XSHA = 4, /* obsolete */
104  PGP_DIGEST_MD2 = 5, /* obsolete */
105  PGP_DIGEST_TIGER192 = 6, /* obsolete */
106  PGP_DIGEST_HAVAL5_160 = 7, /* obsolete */
110 };
111 
112 #define PGP_MAX_KEY (256/8)
113 #define PGP_MAX_BLOCK (256/8)
114 #define PGP_MAX_DIGEST (512/8)
115 #define PGP_S2K_SALT 8
116 
117 typedef struct PGP_MPI PGP_MPI;
118 typedef struct PGP_PubKey PGP_PubKey;
119 typedef struct PGP_Context PGP_Context;
120 typedef struct PGP_S2K PGP_S2K;
121 
122 struct PGP_S2K
123 {
127  uint8 iter; /* encoded (one-octet) count */
128  /* calculated: */
131 };
132 
133 
135 {
136  /*
137  * parameters
138  */
140  int s2k_mode;
141  int s2k_count; /* 4-byte decoded count */
152 
153  /*
154  * internal variables
155  */
157  int corrupt_prefix; /* prefix failed RFC 4880 "quick check" */
158  int unsupported_compr; /* has bzip2 compression */
159  int unexpected_binary; /* binary data seen in text_mode */
163 
164  PGP_PubKey *pub_key; /* ctx owns it */
165  const uint8 *sym_key; /* ctx does not own it */
167 
168  /*
169  * read or generated data
170  */
172  unsigned sess_key_len;
173 };
174 
175 /* from RFC 4880 3.7.1.3 */
176 #define s2k_decode_count(cval) \
177  (((unsigned) 16 + (cval & 15)) << ((cval >> 4) + 6))
178 
179 struct PGP_MPI
180 {
182  int bits;
183  int bytes;
184 };
185 
187 {
191 
192  /* public part */
193  union
194  {
195  struct
196  {
200  } elg;
201  struct
202  {
205  } rsa;
206  struct
207  {
208  PGP_MPI *p;
210  PGP_MPI *g;
211  PGP_MPI *y;
212  } dsa;
213  } pub;
214 
215  /* secret part */
216  union
217  {
218  struct
219  {
221  } elg;
222  struct
223  {
225  PGP_MPI *p;
226  PGP_MPI *q;
228  } rsa;
229  struct
230  {
231  PGP_MPI *x;
232  } dsa;
233  } sec;
234 
237 };
238 
239 int pgp_init(PGP_Context **ctx_p);
240 int pgp_encrypt(PGP_Context *ctx, MBuf *src, MBuf *dst);
241 int pgp_decrypt(PGP_Context *ctx, MBuf *msrc, MBuf *mdst);
242 int pgp_free(PGP_Context *ctx);
243 
244 int pgp_get_digest_code(const char *name);
245 int pgp_get_cipher_code(const char *name);
246 const char *pgp_get_digest_name(int code);
247 
248 int pgp_set_cipher_algo(PGP_Context *ctx, const char *name);
249 int pgp_set_s2k_mode(PGP_Context *ctx, int mode);
250 int pgp_set_s2k_count(PGP_Context *ctx, int count);
251 int pgp_set_s2k_cipher_algo(PGP_Context *ctx, const char *name);
252 int pgp_set_s2k_digest_algo(PGP_Context *ctx, const char *name);
253 int pgp_set_convert_crlf(PGP_Context *ctx, int doit);
254 int pgp_disable_mdc(PGP_Context *ctx, int disable);
255 int pgp_set_sess_key(PGP_Context *ctx, int use);
256 int pgp_set_compress_algo(PGP_Context *ctx, int algo);
257 int pgp_set_compress_level(PGP_Context *ctx, int level);
258 int pgp_set_text_mode(PGP_Context *ctx, int mode);
259 int pgp_set_unicode_mode(PGP_Context *ctx, int mode);
261 
262 int pgp_set_symkey(PGP_Context *ctx, const uint8 *key, int len);
263 int pgp_set_pubkey(PGP_Context *ctx, MBuf *keypkt,
264  const uint8 *key, int key_len, int pubtype);
265 
266 int pgp_get_keyid(MBuf *pgp_data, char *dst);
267 
268 /* internal functions */
269 
270 int pgp_load_digest(int code, PX_MD **res);
271 int pgp_load_cipher(int code, PX_Cipher **res);
272 int pgp_get_cipher_key_size(int code);
273 int pgp_get_cipher_block_size(int code);
274 
275 int pgp_s2k_fill(PGP_S2K *s2k, int mode, int digest_algo, int count);
276 int pgp_s2k_read(PullFilter *src, PGP_S2K *s2k);
277 int pgp_s2k_process(PGP_S2K *s2k, int cipher, const uint8 *key, int key_len);
278 
279 typedef struct PGP_CFB PGP_CFB;
280 int pgp_cfb_create(PGP_CFB **ctx_p, int algo,
281  const uint8 *key, int key_len, int resync, uint8 *iv);
282 void pgp_cfb_free(PGP_CFB *ctx);
283 int pgp_cfb_encrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst);
284 int pgp_cfb_decrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst);
285 
286 void pgp_armor_encode(const uint8 *src, unsigned len, StringInfo dst,
287  int num_headers, char **keys, char **values);
288 int pgp_armor_decode(const uint8 *src, int len, StringInfo dst);
289 int pgp_extract_armor_headers(const uint8 *src, unsigned len,
290  int *nheaders, char ***keys, char ***values);
291 
294 
295 int pgp_key_alloc(PGP_PubKey **pk_p);
296 void pgp_key_free(PGP_PubKey *pk);
297 int _pgp_read_public_key(PullFilter *pkt, PGP_PubKey **pk_p);
298 
300 int pgp_create_pkt_reader(PullFilter **pf_p, PullFilter *src, int len,
301  int pkttype, PGP_Context *ctx);
302 int pgp_parse_pkt_hdr(PullFilter *src, uint8 *tag, int *len_p,
303  int allow_ctx);
304 
305 int pgp_skip_packet(PullFilter *pkt);
307 
309 int pgp_create_pkt_writer(PushFilter *dst, int tag, PushFilter **res_p);
310 
311 int pgp_mpi_alloc(int bits, PGP_MPI **mpi);
312 int pgp_mpi_create(uint8 *data, int bits, PGP_MPI **mpi);
313 int pgp_mpi_free(PGP_MPI *mpi);
314 int pgp_mpi_read(PullFilter *src, PGP_MPI **mpi);
315 int pgp_mpi_write(PushFilter *dst, PGP_MPI *n);
316 int pgp_mpi_hash(PX_MD *md, PGP_MPI *n);
317 unsigned pgp_mpi_cksum(unsigned cksum, PGP_MPI *n);
318 
320  PGP_MPI **c1_p, PGP_MPI **c2_p);
321 int pgp_elgamal_decrypt(PGP_PubKey *pk, PGP_MPI *_c1, PGP_MPI *_c2,
322  PGP_MPI **msg_p);
323 int pgp_rsa_encrypt(PGP_PubKey *pk, PGP_MPI *_m, PGP_MPI **c_p);
324 int pgp_rsa_decrypt(PGP_PubKey *pk, PGP_MPI *_c, PGP_MPI **m_p);
325 
326 extern struct PullFilterOps pgp_decrypt_filter;
static Datum values[MAXATTR]
Definition: bootstrap.c:152
unsigned char uint8
Definition: c.h:491
static PgChecksumMode mode
Definition: pg_checksums.c:56
const void size_t len
const void * data
int pgp_disable_mdc(PGP_Context *ctx, int disable)
Definition: pgp.c:223
int pgp_rsa_decrypt(PGP_PubKey *pk, PGP_MPI *_c, PGP_MPI **m_p)
int pgp_extract_armor_headers(const uint8 *src, unsigned len, int *nheaders, char ***keys, char ***values)
Definition: pgp-armor.c:390
int pgp_get_cipher_code(const char *name)
Definition: pgp.c:115
int pgp_s2k_process(PGP_S2K *s2k, int cipher, const uint8 *key, int key_len)
Definition: pgp-s2k.c:279
int pgp_mpi_create(uint8 *data, int bits, PGP_MPI **mpi)
Definition: pgp-mpi.c:56
int pgp_cfb_encrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst)
Definition: pgp-cfb.c:252
int pgp_elgamal_encrypt(PGP_PubKey *pk, PGP_MPI *_m, PGP_MPI **c1_p, PGP_MPI **c2_p)
PGP_COMPR_TYPE
Definition: pgp.h:91
@ PGP_COMPR_BZIP2
Definition: pgp.h:95
@ PGP_COMPR_ZLIB
Definition: pgp.h:94
@ PGP_COMPR_NONE
Definition: pgp.h:92
@ PGP_COMPR_ZIP
Definition: pgp.h:93
int pgp_init(PGP_Context **ctx_p)
Definition: pgp.c:189
int pgp_decrypt(PGP_Context *ctx, MBuf *msrc, MBuf *mdst)
Definition: pgp-decrypt.c:1093
int pgp_set_text_mode(PGP_Context *ctx, int mode)
Definition: pgp.c:300
int pgp_set_s2k_digest_algo(PGP_Context *ctx, const char *name)
Definition: pgp.c:329
void pgp_cfb_free(PGP_CFB *ctx)
Definition: pgp-cfb.c:83
int pgp_set_s2k_mode(PGP_Context *ctx, int mode)
Definition: pgp.c:244
int pgp_compress_filter(PushFilter **res, PGP_Context *ctx, PushFilter *dst)
Definition: pgp-compress.c:335
PGP_PKT_TYPE
Definition: pgp.h:45
@ PGP_PKT_TRUST
Definition: pgp.h:57
@ PGP_PKT_USER_ATTR
Definition: pgp.h:60
@ PGP_PKT_PUBLIC_SUBKEY
Definition: pgp.h:59
@ PGP_PKT_SYMENCRYPTED_DATA
Definition: pgp.h:54
@ PGP_PKT_RESERVED
Definition: pgp.h:46
@ PGP_PKT_SIGNATURE
Definition: pgp.h:48
@ PGP_PKT_COMPRESSED_DATA
Definition: pgp.h:53
@ PGP_PKT_SECRET_SUBKEY
Definition: pgp.h:52
@ PGP_PKT_MARKER
Definition: pgp.h:55
@ PGP_PKT_SECRET_KEY
Definition: pgp.h:50
@ PGP_PKT_SYMENCRYPTED_SESSKEY
Definition: pgp.h:49
@ PGP_PKT_MDC
Definition: pgp.h:62
@ PGP_PKT_PUBLIC_KEY
Definition: pgp.h:51
@ PGP_PKT_LITERAL_DATA
Definition: pgp.h:56
@ PGP_PKT_USER_ID
Definition: pgp.h:58
@ PGP_PKT_SYMENCRYPTED_DATA_MDC
Definition: pgp.h:61
@ PGP_PKT_PUBENCRYPTED_SESSKEY
Definition: pgp.h:47
@ PGP_PKT_PRIV_61
Definition: pgp.h:63
PGP_S2K_TYPE
Definition: pgp.h:38
@ PGP_S2K_ISALTED
Definition: pgp.h:41
@ PGP_S2K_SALTED
Definition: pgp.h:40
@ PGP_S2K_SIMPLE
Definition: pgp.h:39
int pgp_get_digest_code(const char *name)
Definition: pgp.c:104
int pgp_key_alloc(PGP_PubKey **pk_p)
Definition: pgp-pubkey.c:38
int pgp_elgamal_decrypt(PGP_PubKey *pk, PGP_MPI *_c1, PGP_MPI *_c2, PGP_MPI **msg_p)
int pgp_set_symkey(PGP_Context *ctx, const uint8 *key, int len)
Definition: pgp.c:353
int pgp_armor_decode(const uint8 *src, int len, StringInfo dst)
Definition: pgp-armor.c:314
int pgp_mpi_alloc(int bits, PGP_MPI **mpi)
Definition: pgp-mpi.c:37
int pgp_s2k_fill(PGP_S2K *s2k, int mode, int digest_algo, int count)
Definition: pgp-s2k.c:223
int pgp_parse_pkt_hdr(PullFilter *src, uint8 *tag, int *len_p, int allow_ctx)
Definition: pgp-decrypt.c:129
int pgp_s2k_read(PullFilter *src, PGP_S2K *s2k)
Definition: pgp-s2k.c:253
int pgp_expect_packet_end(PullFilter *pkt)
Definition: pgp-decrypt.c:1078
int pgp_mpi_free(PGP_MPI *mpi)
Definition: pgp-mpi.c:70
int pgp_get_cipher_block_size(int code)
Definition: pgp.c:147
int pgp_write_pubenc_sesskey(PGP_Context *ctx, PushFilter *dst)
Definition: pgp-pubenc.c:190
int pgp_cfb_decrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst)
Definition: pgp-cfb.c:260
int pgp_load_cipher(int code, PX_Cipher **res)
Definition: pgp.c:157
const char * pgp_get_digest_name(int code)
Definition: pgp.c:126
void pgp_key_free(PGP_PubKey *pk)
Definition: pgp-pubkey.c:48
int pgp_mpi_write(PushFilter *dst, PGP_MPI *n)
Definition: pgp-mpi.c:105
int pgp_set_s2k_cipher_algo(PGP_Context *ctx, const char *name)
Definition: pgp.c:318
int pgp_mpi_hash(PX_MD *md, PGP_MPI *n)
Definition: pgp-mpi.c:119
int pgp_set_compress_algo(PGP_Context *ctx, int algo)
Definition: pgp.c:274
void pgp_armor_encode(const uint8 *src, unsigned len, StringInfo dst, int num_headers, char **keys, char **values)
Definition: pgp-armor.c:207
int pgp_get_unicode_mode(PGP_Context *ctx)
Definition: pgp.c:340
int pgp_parse_pubenc_sesskey(PGP_Context *ctx, PullFilter *pkt)
Definition: pgp-pubdec.c:150
PGP_SYMENC_TYPE
Definition: pgp.h:76
@ PGP_SYM_TWOFISH
Definition: pgp.h:87
@ PGP_SYM_IDEA
Definition: pgp.h:78
@ PGP_SYM_SAFER_SK128
Definition: pgp.h:82
@ PGP_SYM_DES3
Definition: pgp.h:79
@ PGP_SYM_AES_256
Definition: pgp.h:86
@ PGP_SYM_BLOWFISH
Definition: pgp.h:81
@ PGP_SYM_PLAIN
Definition: pgp.h:77
@ PGP_SYM_CAST5
Definition: pgp.h:80
@ PGP_SYM_DES_SK
Definition: pgp.h:83
@ PGP_SYM_AES_128
Definition: pgp.h:84
@ PGP_SYM_AES_192
Definition: pgp.h:85
PGP_DIGEST_TYPE
Definition: pgp.h:99
@ PGP_DIGEST_XSHA
Definition: pgp.h:103
@ PGP_DIGEST_MD2
Definition: pgp.h:104
@ PGP_DIGEST_TIGER192
Definition: pgp.h:105
@ PGP_DIGEST_SHA1
Definition: pgp.h:101
@ PGP_DIGEST_SHA256
Definition: pgp.h:107
@ PGP_DIGEST_MD5
Definition: pgp.h:100
@ PGP_DIGEST_SHA512
Definition: pgp.h:109
@ PGP_DIGEST_SHA384
Definition: pgp.h:108
@ PGP_DIGEST_RIPEMD160
Definition: pgp.h:102
@ PGP_DIGEST_HAVAL5_160
Definition: pgp.h:106
int pgp_set_cipher_algo(PGP_Context *ctx, const char *name)
Definition: pgp.c:307
int pgp_set_pubkey(PGP_Context *ctx, MBuf *keypkt, const uint8 *key, int key_len, int pubtype)
Definition: pgp-pubkey.c:565
int pgp_decompress_filter(PullFilter **res, PGP_Context *ctx, PullFilter *src)
Definition: pgp-compress.c:341
int pgp_encrypt(PGP_Context *ctx, MBuf *src, MBuf *dst)
Definition: pgp-encrypt.c:599
#define PGP_MAX_KEY
Definition: pgp.h:112
PGP_PUB_ALGO_TYPE
Definition: pgp.h:67
@ PGP_PUB_RSA_ENCRYPT_SIGN
Definition: pgp.h:68
@ PGP_PUB_RSA_ENCRYPT
Definition: pgp.h:69
@ PGP_PUB_DSA_SIGN
Definition: pgp.h:72
@ PGP_PUB_RSA_SIGN
Definition: pgp.h:70
@ PGP_PUB_ELG_ENCRYPT
Definition: pgp.h:71
int _pgp_read_public_key(PullFilter *pkt, PGP_PubKey **pk_p)
Definition: pgp-pubkey.c:158
int pgp_set_convert_crlf(PGP_Context *ctx, int doit)
Definition: pgp.c:237
int pgp_set_unicode_mode(PGP_Context *ctx, int mode)
Definition: pgp.c:346
int pgp_rsa_encrypt(PGP_PubKey *pk, PGP_MPI *_m, PGP_MPI **c_p)
int pgp_get_keyid(MBuf *pgp_data, char *dst)
Definition: pgp-info.c:112
struct PullFilterOps pgp_decrypt_filter
Definition: pgp-decrypt.c:314
int pgp_skip_packet(PullFilter *pkt)
Definition: pgp-decrypt.c:1064
int pgp_mpi_read(PullFilter *src, PGP_MPI **mpi)
Definition: pgp-mpi.c:80
unsigned pgp_mpi_cksum(unsigned cksum, PGP_MPI *n)
Definition: pgp-mpi.c:132
int pgp_get_cipher_key_size(int code)
Definition: pgp.c:137
int pgp_free(PGP_Context *ctx)
Definition: pgp.c:213
int pgp_cfb_create(PGP_CFB **ctx_p, int algo, const uint8 *key, int key_len, int resync, uint8 *iv)
Definition: pgp-cfb.c:52
int pgp_create_pkt_reader(PullFilter **pf_p, PullFilter *src, int len, int pkttype, PGP_Context *ctx)
Definition: pgp-decrypt.c:223
int pgp_set_s2k_count(PGP_Context *ctx, int count)
Definition: pgp.c:263
int pgp_create_pkt_writer(PushFilter *dst, int tag, PushFilter **res_p)
Definition: pgp-encrypt.c:311
int pgp_set_sess_key(PGP_Context *ctx, int use)
Definition: pgp.c:230
int pgp_load_digest(int code, PX_MD **res)
Definition: pgp.c:173
int pgp_set_compress_level(PGP_Context *ctx, int level)
Definition: pgp.c:289
Definition: mbuf.c:40
int resync
Definition: pgp-cfb.c:45
unsigned sess_key_len
Definition: pgp.h:172
PGP_PubKey * pub_key
Definition: pgp.h:164
int compress_level
Definition: pgp.h:146
int cipher_algo
Definition: pgp.h:144
int disable_mdc
Definition: pgp.h:147
int s2k_mode
Definition: pgp.h:140
int text_mode
Definition: pgp.h:149
PGP_S2K s2k
Definition: pgp.h:139
int corrupt_prefix
Definition: pgp.h:157
int unsupported_compr
Definition: pgp.h:158
int unexpected_binary
Definition: pgp.h:159
int s2k_cipher_algo
Definition: pgp.h:143
int convert_crlf
Definition: pgp.h:150
int s2k_count
Definition: pgp.h:141
uint8 sess_key[PGP_MAX_KEY]
Definition: pgp.h:171
PX_MD * mdc_ctx
Definition: pgp.h:162
int sym_key_len
Definition: pgp.h:166
int unicode_mode
Definition: pgp.h:151
int compress_algo
Definition: pgp.h:145
int use_sess_key
Definition: pgp.h:148
int in_mdc_pkt
Definition: pgp.h:160
int mdc_checked
Definition: pgp.h:156
int s2k_digest_algo
Definition: pgp.h:142
const uint8 * sym_key
Definition: pgp.h:165
int use_mdcbuf_filter
Definition: pgp.h:161
Definition: pgp.h:180
int bits
Definition: pgp.h:182
int bytes
Definition: pgp.h:183
uint8 * data
Definition: pgp.h:181
uint8 time[4]
Definition: pgp.h:189
int can_encrypt
Definition: pgp.h:236
uint8 key_id[8]
Definition: pgp.h:235
PGP_MPI * y
Definition: pgp.h:199
PGP_MPI * q
Definition: pgp.h:209
struct PGP_PubKey::@0::@3 rsa
uint8 algo
Definition: pgp.h:190
struct PGP_PubKey::@0::@2 elg
PGP_MPI * d
Definition: pgp.h:224
PGP_MPI * p
Definition: pgp.h:197
uint8 ver
Definition: pgp.h:188
union PGP_PubKey::@1 sec
struct PGP_PubKey::@0::@4 dsa
PGP_MPI * g
Definition: pgp.h:198
PGP_MPI * e
Definition: pgp.h:204
PGP_MPI * u
Definition: pgp.h:227
PGP_MPI * n
Definition: pgp.h:203
PGP_MPI * x
Definition: pgp.h:220
union PGP_PubKey::@0 pub
Definition: pgp.h:123
uint8 digest_algo
Definition: pgp.h:125
uint8 mode
Definition: pgp.h:124
uint8 key_len
Definition: pgp.h:130
uint8 iter
Definition: pgp.h:127
uint8 salt[8]
Definition: pgp.h:126
uint8 key[PGP_MAX_KEY]
Definition: pgp.h:129
Definition: px.h:141
Definition: px.h:100
const char * name