| /* |
| * pgp.h |
| * OpenPGP implementation. |
| * |
| * Copyright (c) 2005 Marko Kreen |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
| * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
| * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| * |
| * contrib/pgcrypto/pgp.h |
| */ |
| |
| enum PGP_S2K_TYPE |
| { |
| PGP_S2K_SIMPLE = 0, |
| PGP_S2K_SALTED = 1, |
| PGP_S2K_ISALTED = 3 |
| }; |
| |
| enum PGP_PKT_TYPE |
| { |
| PGP_PKT_RESERVED = 0, |
| PGP_PKT_PUBENCRYPTED_SESSKEY = 1, |
| PGP_PKT_SIGNATURE = 2, |
| PGP_PKT_SYMENCRYPTED_SESSKEY = 3, |
| PGP_PKT_SECRET_KEY = 5, |
| PGP_PKT_PUBLIC_KEY = 6, |
| PGP_PKT_SECRET_SUBKEY = 7, |
| PGP_PKT_COMPRESSED_DATA = 8, |
| PGP_PKT_SYMENCRYPTED_DATA = 9, |
| PGP_PKT_MARKER = 10, |
| PGP_PKT_LITERAL_DATA = 11, |
| PGP_PKT_TRUST = 12, |
| PGP_PKT_USER_ID = 13, |
| PGP_PKT_PUBLIC_SUBKEY = 14, |
| PGP_PKT_USER_ATTR = 17, |
| PGP_PKT_SYMENCRYPTED_DATA_MDC = 18, |
| PGP_PKT_MDC = 19, |
| PGP_PKT_PRIV_61 = 61 /* occurs in gpg secring */ |
| }; |
| |
| enum PGP_PUB_ALGO_TYPE |
| { |
| PGP_PUB_RSA_ENCRYPT_SIGN = 1, |
| PGP_PUB_RSA_ENCRYPT = 2, |
| PGP_PUB_RSA_SIGN = 3, |
| PGP_PUB_ELG_ENCRYPT = 16, |
| PGP_PUB_DSA_SIGN = 17 |
| }; |
| |
| enum PGP_SYMENC_TYPE |
| { |
| PGP_SYM_PLAIN = 0, /* ?? */ |
| PGP_SYM_IDEA = 1, /* obsolete, PGP 2.6 compat */ |
| PGP_SYM_DES3 = 2, /* must */ |
| PGP_SYM_CAST5 = 3, /* should */ |
| PGP_SYM_BLOWFISH = 4, |
| PGP_SYM_SAFER_SK128 = 5, /* obsolete */ |
| PGP_SYM_DES_SK = 6, /* obsolete */ |
| PGP_SYM_AES_128 = 7, /* should */ |
| PGP_SYM_AES_192 = 8, |
| PGP_SYM_AES_256 = 9, |
| PGP_SYM_TWOFISH = 10 |
| }; |
| |
| enum PGP_COMPR_TYPE |
| { |
| PGP_COMPR_NONE = 0, /* must */ |
| PGP_COMPR_ZIP = 1, /* should */ |
| PGP_COMPR_ZLIB = 2, |
| PGP_COMPR_BZIP2 = 3 |
| }; |
| |
| enum PGP_DIGEST_TYPE |
| { |
| PGP_DIGEST_MD5 = 1, /* should, deprecated */ |
| PGP_DIGEST_SHA1 = 2, /* must */ |
| PGP_DIGEST_RIPEMD160 = 3, |
| PGP_DIGEST_XSHA = 4, /* obsolete */ |
| PGP_DIGEST_MD2 = 5, /* obsolete */ |
| PGP_DIGEST_TIGER192 = 6, /* obsolete */ |
| PGP_DIGEST_HAVAL5_160 = 7, /* obsolete */ |
| PGP_DIGEST_SHA256 = 8, |
| PGP_DIGEST_SHA384 = 9, |
| PGP_DIGEST_SHA512 = 10 |
| }; |
| |
| #define PGP_MAX_KEY (256/8) |
| #define PGP_MAX_BLOCK (256/8) |
| #define PGP_MAX_DIGEST (512/8) |
| #define PGP_S2K_SALT 8 |
| |
| typedef struct PGP_MPI PGP_MPI; |
| typedef struct PGP_PubKey PGP_PubKey; |
| typedef struct PGP_Context PGP_Context; |
| typedef struct PGP_S2K PGP_S2K; |
| |
| struct PGP_S2K |
| { |
| uint8 mode; |
| uint8 digest_algo; |
| uint8 salt[8]; |
| uint8 iter; |
| /* calculated: */ |
| uint8 key[PGP_MAX_KEY]; |
| uint8 key_len; |
| }; |
| |
| |
| struct PGP_Context |
| { |
| /* |
| * parameters |
| */ |
| PGP_S2K s2k; |
| int s2k_mode; |
| int s2k_digest_algo; |
| int s2k_cipher_algo; |
| int cipher_algo; |
| int compress_algo; |
| int compress_level; |
| int disable_mdc; |
| int use_sess_key; |
| int text_mode; |
| int convert_crlf; |
| int unicode_mode; |
| |
| /* |
| * internal variables |
| */ |
| int mdc_checked; |
| int corrupt_prefix; |
| int in_mdc_pkt; |
| int use_mdcbuf_filter; |
| PX_MD *mdc_ctx; |
| |
| PGP_PubKey *pub_key; /* ctx owns it */ |
| const uint8 *sym_key; /* ctx does not own it */ |
| int sym_key_len; |
| |
| /* |
| * read or generated data |
| */ |
| uint8 sess_key[PGP_MAX_KEY]; |
| unsigned sess_key_len; |
| }; |
| |
| struct PGP_MPI |
| { |
| uint8 *data; |
| int bits; |
| int bytes; |
| }; |
| |
| struct PGP_PubKey |
| { |
| uint8 ver; |
| uint8 time[4]; |
| uint8 algo; |
| |
| /* public part */ |
| union |
| { |
| struct |
| { |
| PGP_MPI *p; |
| PGP_MPI *g; |
| PGP_MPI *y; |
| } elg; |
| struct |
| { |
| PGP_MPI *n; |
| PGP_MPI *e; |
| } rsa; |
| struct |
| { |
| PGP_MPI *p; |
| PGP_MPI *q; |
| PGP_MPI *g; |
| PGP_MPI *y; |
| } dsa; |
| } pub; |
| |
| /* secret part */ |
| union |
| { |
| struct |
| { |
| PGP_MPI *x; |
| } elg; |
| struct |
| { |
| PGP_MPI *d; |
| PGP_MPI *p; |
| PGP_MPI *q; |
| PGP_MPI *u; |
| } rsa; |
| struct |
| { |
| PGP_MPI *x; |
| } dsa; |
| } sec; |
| |
| uint8 key_id[8]; |
| int can_encrypt; |
| }; |
| |
| int pgp_init(PGP_Context **ctx); |
| int pgp_encrypt(PGP_Context *ctx, MBuf *src, MBuf *dst); |
| int pgp_decrypt(PGP_Context *ctx, MBuf *src, MBuf *dst); |
| int pgp_free(PGP_Context *ctx); |
| |
| int pgp_get_digest_code(const char *name); |
| int pgp_get_cipher_code(const char *name); |
| const char *pgp_get_digest_name(int code); |
| const char *pgp_get_cipher_name(int code); |
| |
| int pgp_set_cipher_algo(PGP_Context *ctx, const char *name); |
| int pgp_set_s2k_mode(PGP_Context *ctx, int type); |
| int pgp_set_s2k_cipher_algo(PGP_Context *ctx, const char *name); |
| int pgp_set_s2k_digest_algo(PGP_Context *ctx, const char *name); |
| int pgp_set_convert_crlf(PGP_Context *ctx, int doit); |
| int pgp_disable_mdc(PGP_Context *ctx, int disable); |
| int pgp_set_sess_key(PGP_Context *ctx, int use); |
| int pgp_set_compress_algo(PGP_Context *ctx, int algo); |
| int pgp_set_compress_level(PGP_Context *ctx, int level); |
| int pgp_set_text_mode(PGP_Context *ctx, int mode); |
| int pgp_set_unicode_mode(PGP_Context *ctx, int mode); |
| int pgp_get_unicode_mode(PGP_Context *ctx); |
| |
| int pgp_set_symkey(PGP_Context *ctx, const uint8 *key, int klen); |
| int pgp_set_pubkey(PGP_Context *ctx, MBuf *keypkt, |
| const uint8 *key, int klen, int pubtype); |
| |
| int pgp_get_keyid(MBuf *pgp_data, char *dst); |
| |
| /* internal functions */ |
| |
| int pgp_load_digest(int c, PX_MD **res); |
| int pgp_load_cipher(int c, PX_Cipher **res); |
| int pgp_get_cipher_key_size(int c); |
| int pgp_get_cipher_block_size(int c); |
| |
| int pgp_s2k_fill(PGP_S2K *s2k, int mode, int digest_algo); |
| int pgp_s2k_read(PullFilter *src, PGP_S2K *s2k); |
| int pgp_s2k_process(PGP_S2K *s2k, int cipher, const uint8 *key, int klen); |
| |
| typedef struct PGP_CFB PGP_CFB; |
| int |
| pgp_cfb_create(PGP_CFB **ctx_p, int algo, |
| const uint8 *key, int key_len, int recync, uint8 *iv); |
| void pgp_cfb_free(PGP_CFB *ctx); |
| int pgp_cfb_encrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst); |
| int pgp_cfb_decrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst); |
| |
| int pgp_armor_encode(const uint8 *src, unsigned len, uint8 *dst); |
| int pgp_armor_decode(const uint8 *src, unsigned len, uint8 *dst); |
| unsigned pgp_armor_enc_len(unsigned len); |
| unsigned pgp_armor_dec_len(unsigned len); |
| |
| int pgp_compress_filter(PushFilter **res, PGP_Context *ctx, PushFilter *dst); |
| int pgp_decompress_filter(PullFilter **res, PGP_Context *ctx, PullFilter *src); |
| |
| int pgp_key_alloc(PGP_PubKey **pk_p); |
| void pgp_key_free(PGP_PubKey *pk); |
| int _pgp_read_public_key(PullFilter *pkt, PGP_PubKey **pk_p); |
| |
| int pgp_parse_pubenc_sesskey(PGP_Context *ctx, PullFilter *pkt); |
| int pgp_create_pkt_reader(PullFilter **pf_p, PullFilter *src, int len, |
| int pkttype, PGP_Context *ctx); |
| int pgp_parse_pkt_hdr(PullFilter *src, uint8 *tag, int *len_p, |
| int allow_ctx); |
| |
| int pgp_skip_packet(PullFilter *pkt); |
| int pgp_expect_packet_end(PullFilter *pkt); |
| |
| int pgp_write_pubenc_sesskey(PGP_Context *ctx, PushFilter *dst); |
| int pgp_create_pkt_writer(PushFilter *dst, int tag, PushFilter **res_p); |
| |
| int pgp_mpi_alloc(int bits, PGP_MPI **mpi); |
| int pgp_mpi_create(uint8 *data, int bits, PGP_MPI **mpi); |
| int pgp_mpi_free(PGP_MPI *mpi); |
| int pgp_mpi_read(PullFilter *src, PGP_MPI **mpi); |
| int pgp_mpi_write(PushFilter *dst, PGP_MPI *n); |
| int pgp_mpi_hash(PX_MD *md, PGP_MPI *n); |
| unsigned pgp_mpi_cksum(unsigned cksum, PGP_MPI *n); |
| |
| int pgp_elgamal_encrypt(PGP_PubKey *pk, PGP_MPI *m, |
| PGP_MPI **c1, PGP_MPI **c2); |
| int pgp_elgamal_decrypt(PGP_PubKey *pk, PGP_MPI *c1, PGP_MPI *c2, |
| PGP_MPI **m); |
| int pgp_rsa_encrypt(PGP_PubKey *pk, PGP_MPI *m, PGP_MPI **c); |
| int pgp_rsa_decrypt(PGP_PubKey *pk, PGP_MPI *c, PGP_MPI **m); |
| |
| extern struct PullFilterOps pgp_decrypt_filter; |