libfortuna  1
FortunalibraryfunctionsextractedfromPostgreSQLsource
 All Data Structures Files Functions Variables Typedefs Macros
px.h
Go to the documentation of this file.
1 /*
2  * px.h
3  * Header file for pgcrypto.
4  *
5  * Copyright (c) 2001 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/px.h
30  */
31 
32 #ifndef __PX_H
33 #define __PX_H
34 
35 #include <stdlib.h>
36 #include <sys/types.h>
37 #include <sys/param.h>
38 #include <malloc_np.h>
39 #include "c.h"
40 
41 /* keep debug messages? */
42 #define PX_DEBUG
43 
44 
45 /* max len of 'type' parms */
46 #define PX_MAX_NAMELEN 128
47 
48 /* max salt returned */
49 #define PX_MAX_SALT_LEN 128
50 
51 /*
52  * PX error codes
53  */
54 #define PXE_OK 0
55 #define PXE_ERR_GENERIC -1
56 #define PXE_NO_HASH -2
57 #define PXE_NO_CIPHER -3
58 #define PXE_NOTBLOCKSIZE -4
59 #define PXE_BAD_OPTION -5
60 #define PXE_BAD_FORMAT -6
61 #define PXE_KEY_TOO_BIG -7
62 #define PXE_CIPHER_INIT -8
63 #define PXE_HASH_UNUSABLE_FOR_HMAC -9
64 #define PXE_DEV_READ_ERROR -10
65 #define PXE_OSSL_RAND_ERROR -11
66 #define PXE_BUG -12
67 #define PXE_ARGUMENT_ERROR -13
68 #define PXE_UNKNOWN_SALT_ALGO -14
69 #define PXE_BAD_SALT_ROUNDS -15
70 #define PXE_MCRYPT_INTERNAL -16
71 #define PXE_NO_RANDOM -17
72 #define PXE_DECRYPT_FAILED -18
73 
74 #define PXE_MBUF_SHORT_READ -50
75 
76 #define PXE_PGP_CORRUPT_DATA -100
77 #define PXE_PGP_CORRUPT_ARMOR -101
78 #define PXE_PGP_UNSUPPORTED_COMPR -102
79 #define PXE_PGP_UNSUPPORTED_CIPHER -103
80 #define PXE_PGP_UNSUPPORTED_HASH -104
81 #define PXE_PGP_COMPRESSION_ERROR -105
82 #define PXE_PGP_NOT_TEXT -106
83 #define PXE_PGP_UNEXPECTED_PKT -107
84 #define PXE_PGP_NO_BIGNUM -108
85 #define PXE_PGP_MATH_FAILED -109
86 #define PXE_PGP_SHORT_ELGAMAL_KEY -110
87 #define PXE_PGP_RSA_UNSUPPORTED -111
88 #define PXE_PGP_UNKNOWN_PUBALGO -112
89 #define PXE_PGP_WRONG_KEY -113
90 #define PXE_PGP_MULTIPLE_KEYS -114
91 #define PXE_PGP_EXPECT_PUBLIC_KEY -115
92 #define PXE_PGP_EXPECT_SECRET_KEY -116
93 #define PXE_PGP_NOT_V4_KEYPKT -117
94 #define PXE_PGP_KEYPKT_CORRUPT -118
95 #define PXE_PGP_NO_USABLE_KEY -119
96 #define PXE_PGP_NEED_SECRET_PSW -120
97 #define PXE_PGP_BAD_S2K_MODE -121
98 #define PXE_PGP_UNSUPPORTED_PUBALGO -122
99 #define PXE_PGP_MULTIPLE_SUBKEYS -123
100 
101 
102 typedef struct px_digest PX_MD;
103 typedef struct px_alias PX_Alias;
104 typedef struct px_hmac PX_HMAC;
105 typedef struct px_cipher PX_Cipher;
106 typedef struct px_combo PX_Combo;
107 
108 struct px_digest
109 {
110  unsigned (*result_size) (PX_MD *h);
111  unsigned (*block_size) (PX_MD *h);
112  void (*reset) (PX_MD *h);
113  void (*update) (PX_MD *h, const uint8 *data, unsigned dlen);
114  void (*finish) (PX_MD *h, uint8 *dst);
115  void (*free) (PX_MD *h);
116  /* private */
117  union
118  {
119  unsigned code;
120  void *ptr;
121  } p;
122 };
123 
124 struct px_alias
125 {
126  char *alias;
127  char *name;
128 };
129 
130 struct px_hmac
131 {
132  unsigned (*result_size) (PX_HMAC *h);
133  unsigned (*block_size) (PX_HMAC *h);
134  void (*reset) (PX_HMAC *h);
135  void (*update) (PX_HMAC *h, const uint8 *data, unsigned dlen);
136  void (*finish) (PX_HMAC *h, uint8 *dst);
137  void (*free) (PX_HMAC *h);
138  void (*init) (PX_HMAC *h, const uint8 *key, unsigned klen);
139 
141  /* private */
142  struct
143  {
146  } p;
147 };
148 
149 struct px_cipher
150 {
151  unsigned (*block_size) (PX_Cipher *c);
152  unsigned (*key_size) (PX_Cipher *c); /* max key len */
153  unsigned (*iv_size) (PX_Cipher *c);
154 
155  int (*init) (PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv);
156  int (*encrypt) (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res);
157  int (*decrypt) (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res);
158  void (*free) (PX_Cipher *c);
159  /* private */
160  void *ptr;
161  int pstat; /* mcrypt uses it */
162 };
163 
164 struct px_combo
165 {
166  int (*init) (PX_Combo *cx, const uint8 *key, unsigned klen,
167  const uint8 *iv, unsigned ivlen);
168  int (*encrypt) (PX_Combo *cx, const uint8 *data, unsigned dlen,
169  uint8 *res, unsigned *rlen);
170  int (*decrypt) (PX_Combo *cx, const uint8 *data, unsigned dlen,
171  uint8 *res, unsigned *rlen);
172  unsigned (*encrypt_len) (PX_Combo *cx, unsigned dlen);
173  unsigned (*decrypt_len) (PX_Combo *cx, unsigned dlen);
174  void (*free) (PX_Combo *cx);
175 
177  unsigned padding;
178 };
179 
180 int px_find_digest(const char *name, PX_MD **res);
181 int px_find_hmac(const char *name, PX_HMAC **res);
182 int px_find_cipher(const char *name, PX_Cipher **res);
183 int px_find_combo(const char *name, PX_Combo **res);
184 
185 int px_get_random_bytes(uint8 *dst, unsigned count);
186 int px_get_pseudo_random_bytes(uint8 *dst, unsigned count);
187 int px_add_entropy(const uint8 *data, unsigned count);
188 
189 unsigned px_acquire_system_randomness(uint8 *dst);
190 
191 const char *px_strerror(int err);
192 
193 const char *px_resolve_alias(const PX_Alias *aliases, const char *name);
194 
195 void px_set_debug_handler(void (*handler) (const char *));
196 
197 
198 #define px_md_result_size(md) (md)->result_size(md)
199 #define px_md_block_size(md) (md)->block_size(md)
200 #define px_md_reset(md) (md)->reset(md)
201 #define px_md_update(md, data, dlen) (md)->update(md, data, dlen)
202 #define px_md_finish(md, buf) (md)->finish(md, buf)
203 #define px_md_free(md) (md)->free(md)
204 
205 #define px_hmac_result_size(hmac) (hmac)->result_size(hmac)
206 #define px_hmac_block_size(hmac) (hmac)->block_size(hmac)
207 #define px_hmac_reset(hmac) (hmac)->reset(hmac)
208 #define px_hmac_init(hmac, key, klen) (hmac)->init(hmac, key, klen)
209 #define px_hmac_update(hmac, data, dlen) (hmac)->update(hmac, data, dlen)
210 #define px_hmac_finish(hmac, buf) (hmac)->finish(hmac, buf)
211 #define px_hmac_free(hmac) (hmac)->free(hmac)
212 
213 
214 #define px_cipher_key_size(c) (c)->key_size(c)
215 #define px_cipher_block_size(c) (c)->block_size(c)
216 #define px_cipher_iv_size(c) (c)->iv_size(c)
217 #define px_cipher_init(c, k, klen, iv) (c)->init(c, k, klen, iv)
218 #define px_cipher_encrypt(c, data, dlen, res) \
219  (c)->encrypt(c, data, dlen, res)
220 #define px_cipher_decrypt(c, data, dlen, res) \
221  (c)->decrypt(c, data, dlen, res)
222 #define px_cipher_free(c) (c)->free(c)
223 
224 
225 #define px_combo_encrypt_len(c, dlen) (c)->encrypt_len(c, dlen)
226 #define px_combo_decrypt_len(c, dlen) (c)->decrypt_len(c, dlen)
227 #define px_combo_init(c, key, klen, iv, ivlen) \
228  (c)->init(c, key, klen, iv, ivlen)
229 #define px_combo_encrypt(c, data, dlen, res, rlen) \
230  (c)->encrypt(c, data, dlen, res, rlen)
231 #define px_combo_decrypt(c, data, dlen, res, rlen) \
232  (c)->decrypt(c, data, dlen, res, rlen)
233 #define px_combo_free(c) (c)->free(c)
234 
235 #endif /* __PX_H */