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
29 * contrib/pgcrypto/pgp.h
32 #include "lib/stringinfo.h"
47 PGP_PKT_PUBENCRYPTED_SESSKEY
= 1,
48 PGP_PKT_SIGNATURE
= 2,
49 PGP_PKT_SYMENCRYPTED_SESSKEY
= 3,
50 PGP_PKT_SECRET_KEY
= 5,
51 PGP_PKT_PUBLIC_KEY
= 6,
52 PGP_PKT_SECRET_SUBKEY
= 7,
53 PGP_PKT_COMPRESSED_DATA
= 8,
54 PGP_PKT_SYMENCRYPTED_DATA
= 9,
56 PGP_PKT_LITERAL_DATA
= 11,
59 PGP_PKT_PUBLIC_SUBKEY
= 14,
60 PGP_PKT_USER_ATTR
= 17,
61 PGP_PKT_SYMENCRYPTED_DATA_MDC
= 18,
63 PGP_PKT_PRIV_61
= 61, /* occurs in gpg secring */
66 enum PGP_PUB_ALGO_TYPE
68 PGP_PUB_RSA_ENCRYPT_SIGN
= 1,
69 PGP_PUB_RSA_ENCRYPT
= 2,
71 PGP_PUB_ELG_ENCRYPT
= 16,
72 PGP_PUB_DSA_SIGN
= 17,
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 */
92 PGP_COMPR_NONE
= 0, /* must */
93 PGP_COMPR_ZIP
= 1, /* should */
100 PGP_DIGEST_MD5
= 1, /* should, deprecated */
101 PGP_DIGEST_SHA1
= 2, /* must */
102 PGP_DIGEST_RIPEMD160
= 3,
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 */
107 PGP_DIGEST_SHA256
= 8,
108 PGP_DIGEST_SHA384
= 9,
109 PGP_DIGEST_SHA512
= 10,
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
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
;
127 uint8 iter
; /* encoded (one-octet) count */
129 uint8 key
[PGP_MAX_KEY
];
141 int s2k_count
; /* 4-byte decoded count */
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 */
161 int use_mdcbuf_filter
;
164 PGP_PubKey
*pub_key
; /* ctx owns it */
165 const uint8
*sym_key
; /* ctx does not own it */
169 * read or generated data
171 uint8 sess_key
[PGP_MAX_KEY
];
172 unsigned sess_key_len
;
175 /* from RFC 4880 3.7.1.3 */
176 #define s2k_decode_count(cval) \
177 (((unsigned) 16 + (cval & 15)) << ((cval >> 4) + 6))
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
);
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
);
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
);
260 int pgp_get_unicode_mode(PGP_Context
*ctx
);
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
);
266 int pgp_get_keyid(MBuf
*pgp_data
, char *dst
);
268 /* internal functions */
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
);
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
);
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
);
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
);
292 int pgp_compress_filter(PushFilter
**res
, PGP_Context
*ctx
, PushFilter
*dst
);
293 int pgp_decompress_filter(PullFilter
**res
, PGP_Context
*ctx
, PullFilter
*src
);
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
);
299 int pgp_parse_pubenc_sesskey(PGP_Context
*ctx
, PullFilter
*pkt
);
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
,
305 int pgp_skip_packet(PullFilter
*pkt
);
306 int pgp_expect_packet_end(PullFilter
*pkt
);
308 int pgp_write_pubenc_sesskey(PGP_Context
*ctx
, PushFilter
*dst
);
309 int pgp_create_pkt_writer(PushFilter
*dst
, int tag
, PushFilter
**res_p
);
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
);
319 int pgp_elgamal_encrypt(PGP_PubKey
*pk
, PGP_MPI
*_m
,
320 PGP_MPI
**c1_p
, PGP_MPI
**c2_p
);
321 int pgp_elgamal_decrypt(PGP_PubKey
*pk
, PGP_MPI
*_c1
, PGP_MPI
*_c2
,
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
);
326 extern struct PullFilterOps pgp_decrypt_filter
;