3
* OpenPGP implementation.
5
* Copyright (c) 2005 Marko Kreen
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
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.
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
42
PGP_PKT_PUBENCRYPTED_SESSKEY = 1,
43
PGP_PKT_SIGNATURE = 2,
44
PGP_PKT_SYMENCRYPTED_SESSKEY = 3,
45
PGP_PKT_SECRET_KEY = 5,
46
PGP_PKT_PUBLIC_KEY = 6,
47
PGP_PKT_SECRET_SUBKEY = 7,
48
PGP_PKT_COMPRESSED_DATA = 8,
49
PGP_PKT_SYMENCRYPTED_DATA = 9,
51
PGP_PKT_LITERAL_DATA = 11,
54
PGP_PKT_PUBLIC_SUBKEY = 14,
55
PGP_PKT_USER_ATTR = 17,
56
PGP_PKT_SYMENCRYPTED_DATA_MDC = 18,
58
PGP_PKT_PRIV_61 = 61 /* occurs in gpg secring */
61
enum PGP_PUB_ALGO_TYPE
63
PGP_PUB_RSA_ENCRYPT_SIGN = 1,
64
PGP_PUB_RSA_ENCRYPT = 2,
66
PGP_PUB_ELG_ENCRYPT = 16,
72
PGP_SYM_PLAIN = 0, /* ?? */
73
PGP_SYM_IDEA = 1, /* obsolete, PGP 2.6 compat */
74
PGP_SYM_DES3 = 2, /* must */
75
PGP_SYM_CAST5 = 3, /* should */
77
PGP_SYM_SAFER_SK128 = 5, /* obsolete */
78
PGP_SYM_DES_SK = 6, /* obsolete */
79
PGP_SYM_AES_128 = 7, /* should */
87
PGP_COMPR_NONE = 0, /* must */
88
PGP_COMPR_ZIP = 1, /* should */
95
PGP_DIGEST_MD5 = 1, /* should, deprecated */
96
PGP_DIGEST_SHA1 = 2, /* must */
97
PGP_DIGEST_RIPEMD160 = 3,
98
PGP_DIGEST_XSHA = 4, /* obsolete */
99
PGP_DIGEST_MD2 = 5, /* obsolete */
100
PGP_DIGEST_TIGER192 = 6, /* obsolete */
101
PGP_DIGEST_HAVAL5_160 = 7, /* obsolete */
102
PGP_DIGEST_SHA256 = 8,
103
PGP_DIGEST_SHA384 = 9,
104
PGP_DIGEST_SHA512 = 10
107
#define PGP_MAX_KEY (256/8)
108
#define PGP_MAX_BLOCK (256/8)
109
#define PGP_MAX_DIGEST (512/8)
110
#define PGP_S2K_SALT 8
112
typedef struct PGP_MPI PGP_MPI;
113
typedef struct PGP_PubKey PGP_PubKey;
114
typedef struct PGP_Context PGP_Context;
115
typedef struct PGP_S2K PGP_S2K;
124
uint8 key[PGP_MAX_KEY];
153
int use_mdcbuf_filter;
156
PGP_PubKey *pub_key; /* ctx owns it */
157
const uint8 *sym_key; /* ctx does not own it */
161
* read or generated data
163
uint8 sess_key[PGP_MAX_KEY];
164
unsigned sess_key_len;
227
int pgp_init(PGP_Context ** ctx);
228
int pgp_encrypt(PGP_Context * ctx, MBuf * src, MBuf * dst);
229
int pgp_decrypt(PGP_Context * ctx, MBuf * src, MBuf * dst);
230
int pgp_free(PGP_Context * ctx);
232
int pgp_get_digest_code(const char *name);
233
int pgp_get_cipher_code(const char *name);
234
const char *pgp_get_digest_name(int code);
235
const char *pgp_get_cipher_name(int code);
237
int pgp_set_cipher_algo(PGP_Context * ctx, const char *name);
238
int pgp_set_s2k_mode(PGP_Context * ctx, int type);
239
int pgp_set_s2k_cipher_algo(PGP_Context * ctx, const char *name);
240
int pgp_set_s2k_digest_algo(PGP_Context * ctx, const char *name);
241
int pgp_set_convert_crlf(PGP_Context * ctx, int doit);
242
int pgp_disable_mdc(PGP_Context * ctx, int disable);
243
int pgp_set_sess_key(PGP_Context * ctx, int use);
244
int pgp_set_compress_algo(PGP_Context * ctx, int algo);
245
int pgp_set_compress_level(PGP_Context * ctx, int level);
246
int pgp_set_text_mode(PGP_Context * ctx, int mode);
247
int pgp_set_unicode_mode(PGP_Context * ctx, int mode);
248
int pgp_get_unicode_mode(PGP_Context * ctx);
250
int pgp_set_symkey(PGP_Context * ctx, const uint8 *key, int klen);
251
int pgp_set_pubkey(PGP_Context * ctx, MBuf * keypkt,
252
const uint8 *key, int klen, int pubtype);
254
int pgp_get_keyid(MBuf * pgp_data, char *dst);
256
/* internal functions */
258
int pgp_load_digest(int c, PX_MD ** res);
259
int pgp_load_cipher(int c, PX_Cipher ** res);
260
int pgp_get_cipher_key_size(int c);
261
int pgp_get_cipher_block_size(int c);
263
int pgp_s2k_fill(PGP_S2K * s2k, int mode, int digest_algo);
264
int pgp_s2k_read(PullFilter * src, PGP_S2K * s2k);
265
int pgp_s2k_process(PGP_S2K * s2k, int cipher, const uint8 *key, int klen);
267
typedef struct PGP_CFB PGP_CFB;
269
pgp_cfb_create(PGP_CFB ** ctx_p, int algo,
270
const uint8 *key, int key_len, int recync, uint8 *iv);
271
void pgp_cfb_free(PGP_CFB * ctx);
272
int pgp_cfb_encrypt(PGP_CFB * ctx, const uint8 *data, int len, uint8 *dst);
273
int pgp_cfb_decrypt(PGP_CFB * ctx, const uint8 *data, int len, uint8 *dst);
275
int pgp_armor_encode(const uint8 *src, unsigned len, uint8 *dst);
276
int pgp_armor_decode(const uint8 *src, unsigned len, uint8 *dst);
277
unsigned pgp_armor_enc_len(unsigned len);
278
unsigned pgp_armor_dec_len(unsigned len);
280
int pgp_compress_filter(PushFilter ** res, PGP_Context * ctx, PushFilter * dst);
281
int pgp_decompress_filter(PullFilter ** res, PGP_Context * ctx, PullFilter * src);
283
int pgp_key_alloc(PGP_PubKey ** pk_p);
284
void pgp_key_free(PGP_PubKey * pk);
285
int _pgp_read_public_key(PullFilter * pkt, PGP_PubKey ** pk_p);
287
int pgp_parse_pubenc_sesskey(PGP_Context * ctx, PullFilter * pkt);
288
int pgp_create_pkt_reader(PullFilter ** pf_p, PullFilter * src, int len,
289
int pkttype, PGP_Context * ctx);
290
int pgp_parse_pkt_hdr(PullFilter * src, uint8 *tag, int *len_p,
293
int pgp_skip_packet(PullFilter * pkt);
294
int pgp_expect_packet_end(PullFilter * pkt);
296
int pgp_write_pubenc_sesskey(PGP_Context * ctx, PushFilter * dst);
297
int pgp_create_pkt_writer(PushFilter * dst, int tag, PushFilter ** res_p);
299
int pgp_mpi_alloc(int bits, PGP_MPI ** mpi);
300
int pgp_mpi_create(uint8 *data, int bits, PGP_MPI ** mpi);
301
int pgp_mpi_free(PGP_MPI * mpi);
302
int pgp_mpi_read(PullFilter * src, PGP_MPI ** mpi);
303
int pgp_mpi_write(PushFilter * dst, PGP_MPI * n);
304
int pgp_mpi_hash(PX_MD * md, PGP_MPI * n);
305
unsigned pgp_mpi_cksum(unsigned cksum, PGP_MPI * n);
307
int pgp_elgamal_encrypt(PGP_PubKey * pk, PGP_MPI * m,
308
PGP_MPI ** c1, PGP_MPI ** c2);
309
int pgp_elgamal_decrypt(PGP_PubKey * pk, PGP_MPI * c1, PGP_MPI * c2,
311
int pgp_rsa_encrypt(PGP_PubKey * pk, PGP_MPI * m, PGP_MPI ** c);
312
int pgp_rsa_decrypt(PGP_PubKey * pk, PGP_MPI * c, PGP_MPI ** m);
314
extern struct PullFilterOps pgp_decrypt_filter;