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
117typedef struct PGP_MPI PGP_MPI;
118typedef struct PGP_PubKey PGP_PubKey;
120typedef struct PGP_S2K PGP_S2K;
121
123{
127 uint8 iter; /* encoded (one-octet) count */
128 /* calculated: */
131};
132
133
135{
136 /*
137 * parameters
138 */
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
180{
182 int bits;
183 int bytes;
184};
185
187{
191
192 /* public part */
193 union
194 {
195 struct
196 {
201 struct
202 {
206 struct
207 {
208 PGP_MPI *p;
210 PGP_MPI *g;
211 PGP_MPI *y;
214
215 /* secret part */
216 union
217 {
218 struct
219 {
222 struct
223 {
225 PGP_MPI *p;
226 PGP_MPI *q;
229 struct
230 {
231 PGP_MPI *x;
234
237};
238
239int pgp_init(PGP_Context **ctx_p);
240int pgp_encrypt(PGP_Context *ctx, MBuf *src, MBuf *dst);
241int pgp_decrypt(PGP_Context *ctx, MBuf *msrc, MBuf *mdst);
242int pgp_free(PGP_Context *ctx);
243
244int pgp_get_digest_code(const char *name);
245int pgp_get_cipher_code(const char *name);
246const char *pgp_get_digest_name(int code);
247
248int pgp_set_cipher_algo(PGP_Context *ctx, const char *name);
249int pgp_set_s2k_mode(PGP_Context *ctx, int mode);
250int pgp_set_s2k_count(PGP_Context *ctx, int count);
251int pgp_set_s2k_cipher_algo(PGP_Context *ctx, const char *name);
252int pgp_set_s2k_digest_algo(PGP_Context *ctx, const char *name);
253int pgp_set_convert_crlf(PGP_Context *ctx, int doit);
254int pgp_disable_mdc(PGP_Context *ctx, int disable);
255int pgp_set_sess_key(PGP_Context *ctx, int use);
256int pgp_set_compress_algo(PGP_Context *ctx, int algo);
257int pgp_set_compress_level(PGP_Context *ctx, int level);
258int pgp_set_text_mode(PGP_Context *ctx, int mode);
261
262int pgp_set_symkey(PGP_Context *ctx, const uint8 *key, int len);
263int pgp_set_pubkey(PGP_Context *ctx, MBuf *keypkt,
264 const uint8 *key, int key_len, int pubtype);
265
266int pgp_get_keyid(MBuf *pgp_data, char *dst);
267
268/* internal functions */
269
270int pgp_load_digest(int code, PX_MD **res);
271int pgp_load_cipher(int code, PX_Cipher **res);
272int pgp_get_cipher_key_size(int code);
273int pgp_get_cipher_block_size(int code);
274
275int pgp_s2k_fill(PGP_S2K *s2k, int mode, int digest_algo, int count);
276int pgp_s2k_read(PullFilter *src, PGP_S2K *s2k);
277int pgp_s2k_process(PGP_S2K *s2k, int cipher, const uint8 *key, int key_len);
278
279typedef struct PGP_CFB PGP_CFB;
280int pgp_cfb_create(PGP_CFB **ctx_p, int algo,
281 const uint8 *key, int key_len, int resync, uint8 *iv);
282void pgp_cfb_free(PGP_CFB *ctx);
283int pgp_cfb_encrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst);
284int pgp_cfb_decrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst);
285
286void pgp_armor_encode(const uint8 *src, unsigned len, StringInfo dst,
287 int num_headers, char **keys, char **values);
288int pgp_armor_decode(const uint8 *src, int len, StringInfo dst);
289int pgp_extract_armor_headers(const uint8 *src, unsigned len,
290 int *nheaders, char ***keys, char ***values);
291
294
295int pgp_key_alloc(PGP_PubKey **pk_p);
296void pgp_key_free(PGP_PubKey *pk);
298
300int pgp_create_pkt_reader(PullFilter **pf_p, PullFilter *src, int len,
301 int pkttype, PGP_Context *ctx);
302int pgp_parse_pkt_hdr(PullFilter *src, uint8 *tag, int *len_p,
303 int allow_ctx);
304
307
309int pgp_create_pkt_writer(PushFilter *dst, int tag, PushFilter **res_p);
310
311int pgp_mpi_alloc(int bits, PGP_MPI **mpi);
312int pgp_mpi_create(uint8 *data, int bits, PGP_MPI **mpi);
313int pgp_mpi_free(PGP_MPI *mpi);
314int pgp_mpi_read(PullFilter *src, PGP_MPI **mpi);
315int pgp_mpi_write(PushFilter *dst, PGP_MPI *n);
316int pgp_mpi_hash(PX_MD *md, PGP_MPI *n);
317unsigned pgp_mpi_cksum(unsigned cksum, PGP_MPI *n);
318
320 PGP_MPI **c1_p, PGP_MPI **c2_p);
322 PGP_MPI **msg_p);
323int pgp_rsa_encrypt(PGP_PubKey *pk, PGP_MPI *_m, PGP_MPI **c_p);
324int pgp_rsa_decrypt(PGP_PubKey *pk, PGP_MPI *_c, PGP_MPI **m_p);
325
static Datum values[MAXATTR]
Definition: bootstrap.c:151
uint8_t uint8
Definition: c.h:486
static PgChecksumMode mode
Definition: pg_checksums.c:55
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
const char * pgp_get_digest_name(int code)
Definition: pgp.c:126
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
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:149
Definition: px.h:108
const char * name