3 * Header file for pgcrypto.
5 * Copyright (c) 2001 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/px.h
35 #include <sys/param.h>
37 /* keep debug messages? */
40 /* max salt returned */
41 #define PX_MAX_SALT_LEN 128
48 #define PXE_NO_HASH -2
49 #define PXE_NO_CIPHER -3
51 #define PXE_BAD_OPTION -5
52 #define PXE_BAD_FORMAT -6
53 #define PXE_KEY_TOO_BIG -7
54 #define PXE_CIPHER_INIT -8
55 #define PXE_HASH_UNUSABLE_FOR_HMAC -9
59 #define PXE_ARGUMENT_ERROR -13
60 #define PXE_UNKNOWN_SALT_ALGO -14
61 #define PXE_BAD_SALT_ROUNDS -15
63 #define PXE_NO_RANDOM -17
64 #define PXE_DECRYPT_FAILED -18
65 #define PXE_ENCRYPT_FAILED -19
67 #define PXE_PGP_CORRUPT_DATA -100
68 #define PXE_PGP_CORRUPT_ARMOR -101
69 #define PXE_PGP_UNSUPPORTED_COMPR -102
70 #define PXE_PGP_UNSUPPORTED_CIPHER -103
71 #define PXE_PGP_UNSUPPORTED_HASH -104
72 #define PXE_PGP_COMPRESSION_ERROR -105
73 #define PXE_PGP_NOT_TEXT -106
74 #define PXE_PGP_UNEXPECTED_PKT -107
76 #define PXE_PGP_MATH_FAILED -109
77 #define PXE_PGP_SHORT_ELGAMAL_KEY -110
79 #define PXE_PGP_UNKNOWN_PUBALGO -112
80 #define PXE_PGP_WRONG_KEY -113
81 #define PXE_PGP_MULTIPLE_KEYS -114
82 #define PXE_PGP_EXPECT_PUBLIC_KEY -115
83 #define PXE_PGP_EXPECT_SECRET_KEY -116
84 #define PXE_PGP_NOT_V4_KEYPKT -117
85 #define PXE_PGP_KEYPKT_CORRUPT -118
86 #define PXE_PGP_NO_USABLE_KEY -119
87 #define PXE_PGP_NEED_SECRET_PSW -120
88 #define PXE_PGP_BAD_S2K_MODE -121
89 #define PXE_PGP_UNSUPPORTED_PUBALGO -122
90 #define PXE_PGP_MULTIPLE_SUBKEYS -123
93 typedef struct px_digest PX_MD
;
94 typedef struct px_alias PX_Alias
;
95 typedef struct px_hmac PX_HMAC
;
96 typedef struct px_cipher PX_Cipher
;
97 typedef struct px_combo PX_Combo
;
101 unsigned (*result_size
) (PX_MD
*h
);
102 unsigned (*block_size
) (PX_MD
*h
);
103 void (*reset
) (PX_MD
*h
);
104 void (*update
) (PX_MD
*h
, const uint8
*data
, unsigned dlen
);
105 void (*finish
) (PX_MD
*h
, uint8
*dst
);
106 void (*free
) (PX_MD
*h
);
123 unsigned (*result_size
) (PX_HMAC
*h
);
124 unsigned (*block_size
) (PX_HMAC
*h
);
125 void (*reset
) (PX_HMAC
*h
);
126 void (*update
) (PX_HMAC
*h
, const uint8
*data
, unsigned dlen
);
127 void (*finish
) (PX_HMAC
*h
, uint8
*dst
);
128 void (*free
) (PX_HMAC
*h
);
129 void (*init
) (PX_HMAC
*h
, const uint8
*key
, unsigned klen
);
142 unsigned (*block_size
) (PX_Cipher
*c
);
143 unsigned (*key_size
) (PX_Cipher
*c
); /* max key len */
144 unsigned (*iv_size
) (PX_Cipher
*c
);
146 int (*init
) (PX_Cipher
*c
, const uint8
*key
, unsigned klen
, const uint8
*iv
);
147 int (*encrypt
) (PX_Cipher
*c
, int padding
, const uint8
*data
, unsigned dlen
, uint8
*res
, unsigned *rlen
);
148 int (*decrypt
) (PX_Cipher
*c
, int padding
, const uint8
*data
, unsigned dlen
, uint8
*res
, unsigned *rlen
);
149 void (*free
) (PX_Cipher
*c
);
152 int pstat
; /* mcrypt uses it */
157 int (*init
) (PX_Combo
*cx
, const uint8
*key
, unsigned klen
,
158 const uint8
*iv
, unsigned ivlen
);
159 int (*encrypt
) (PX_Combo
*cx
, const uint8
*data
, unsigned dlen
,
160 uint8
*res
, unsigned *rlen
);
161 int (*decrypt
) (PX_Combo
*cx
, const uint8
*data
, unsigned dlen
,
162 uint8
*res
, unsigned *rlen
);
163 unsigned (*encrypt_len
) (PX_Combo
*cx
, unsigned dlen
);
164 unsigned (*decrypt_len
) (PX_Combo
*cx
, unsigned dlen
);
165 void (*free
) (PX_Combo
*cx
);
171 int px_find_digest(const char *name
, PX_MD
**res
);
172 int px_find_hmac(const char *name
, PX_HMAC
**res
);
173 int px_find_cipher(const char *name
, PX_Cipher
**res
);
174 int px_find_combo(const char *name
, PX_Combo
**res
);
176 void px_THROW_ERROR(int err
) pg_attribute_noreturn();
177 const char *px_strerror(int err
);
179 const char *px_resolve_alias(const PX_Alias
*list
, const char *name
);
181 void px_set_debug_handler(void (*handler
) (const char *));
183 void px_memset(void *ptr
, int c
, size_t len
);
186 void px_debug(const char *fmt
,...) pg_attribute_printf(1, 2);
188 #define px_debug(...)
191 #define px_md_result_size(md) (md)->result_size(md)
192 #define px_md_block_size(md) (md)->block_size(md)
193 #define px_md_reset(md) (md)->reset(md)
194 #define px_md_update(md, data, dlen) (md)->update(md, data, dlen)
195 #define px_md_finish(md, buf) (md)->finish(md, buf)
196 #define px_md_free(md) (md)->free(md)
198 #define px_hmac_result_size(hmac) (hmac)->result_size(hmac)
199 #define px_hmac_block_size(hmac) (hmac)->block_size(hmac)
200 #define px_hmac_reset(hmac) (hmac)->reset(hmac)
201 #define px_hmac_init(hmac, key, klen) (hmac)->init(hmac, key, klen)
202 #define px_hmac_update(hmac, data, dlen) (hmac)->update(hmac, data, dlen)
203 #define px_hmac_finish(hmac, buf) (hmac)->finish(hmac, buf)
204 #define px_hmac_free(hmac) (hmac)->free(hmac)
207 #define px_cipher_key_size(c) (c)->key_size(c)
208 #define px_cipher_block_size(c) (c)->block_size(c)
209 #define px_cipher_iv_size(c) (c)->iv_size(c)
210 #define px_cipher_init(c, k, klen, iv) (c)->init(c, k, klen, iv)
211 #define px_cipher_encrypt(c, padding, data, dlen, res, rlen) \
212 (c)->encrypt(c, padding, data, dlen, res, rlen)
213 #define px_cipher_decrypt(c, padding, data, dlen, res, rlen) \
214 (c)->decrypt(c, padding, data, dlen, res, rlen)
215 #define px_cipher_free(c) (c)->free(c)
218 #define px_combo_encrypt_len(c, dlen) (c)->encrypt_len(c, dlen)
219 #define px_combo_decrypt_len(c, dlen) (c)->decrypt_len(c, dlen)
220 #define px_combo_init(c, key, klen, iv, ivlen) \
221 (c)->init(c, key, klen, iv, ivlen)
222 #define px_combo_encrypt(c, data, dlen, res, rlen) \
223 (c)->encrypt(c, data, dlen, res, rlen)
224 #define px_combo_decrypt(c, data, dlen, res, rlen) \
225 (c)->decrypt(c, data, dlen, res, rlen)
226 #define px_combo_free(c) (c)->free(c)