PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator 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 <sys/types.h>
36 #include <sys/param.h>
37 
38 /* keep debug messages? */
39 #define PX_DEBUG
40 
41 /* a way to disable palloc
42  * - useful if compiled into standalone
43  */
44 #ifndef PX_OWN_ALLOC
45 #define px_alloc(s) palloc(s)
46 #define px_realloc(p, s) repalloc(p, s)
47 #define px_free(p) pfree(p)
48 #else
49 void *px_alloc(size_t s);
50 void *px_realloc(void *p, size_t s);
51 void px_free(void *p);
52 #endif
53 
54 /* max len of 'type' parms */
55 #define PX_MAX_NAMELEN 128
56 
57 /* max salt returned */
58 #define PX_MAX_SALT_LEN 128
59 
60 /*
61  * PX error codes
62  */
63 #define PXE_OK 0
64 #define PXE_ERR_GENERIC -1
65 #define PXE_NO_HASH -2
66 #define PXE_NO_CIPHER -3
67 #define PXE_NOTBLOCKSIZE -4
68 #define PXE_BAD_OPTION -5
69 #define PXE_BAD_FORMAT -6
70 #define PXE_KEY_TOO_BIG -7
71 #define PXE_CIPHER_INIT -8
72 #define PXE_HASH_UNUSABLE_FOR_HMAC -9
73 #define PXE_DEV_READ_ERROR -10
74 #define PXE_BUG -12
75 #define PXE_ARGUMENT_ERROR -13
76 #define PXE_UNKNOWN_SALT_ALGO -14
77 #define PXE_BAD_SALT_ROUNDS -15
78 #define PXE_MCRYPT_INTERNAL -16
79 #define PXE_NO_RANDOM -17
80 #define PXE_DECRYPT_FAILED -18
81 
82 #define PXE_PGP_CORRUPT_DATA -100
83 #define PXE_PGP_CORRUPT_ARMOR -101
84 #define PXE_PGP_UNSUPPORTED_COMPR -102
85 #define PXE_PGP_UNSUPPORTED_CIPHER -103
86 #define PXE_PGP_UNSUPPORTED_HASH -104
87 #define PXE_PGP_COMPRESSION_ERROR -105
88 #define PXE_PGP_NOT_TEXT -106
89 #define PXE_PGP_UNEXPECTED_PKT -107
90 /* -108 is unused */
91 #define PXE_PGP_MATH_FAILED -109
92 #define PXE_PGP_SHORT_ELGAMAL_KEY -110
93 /* -111 is unused */
94 #define PXE_PGP_UNKNOWN_PUBALGO -112
95 #define PXE_PGP_WRONG_KEY -113
96 #define PXE_PGP_MULTIPLE_KEYS -114
97 #define PXE_PGP_EXPECT_PUBLIC_KEY -115
98 #define PXE_PGP_EXPECT_SECRET_KEY -116
99 #define PXE_PGP_NOT_V4_KEYPKT -117
100 #define PXE_PGP_KEYPKT_CORRUPT -118
101 #define PXE_PGP_NO_USABLE_KEY -119
102 #define PXE_PGP_NEED_SECRET_PSW -120
103 #define PXE_PGP_BAD_S2K_MODE -121
104 #define PXE_PGP_UNSUPPORTED_PUBALGO -122
105 #define PXE_PGP_MULTIPLE_SUBKEYS -123
106 
107 
108 typedef struct px_digest PX_MD;
109 typedef struct px_alias PX_Alias;
110 typedef struct px_hmac PX_HMAC;
111 typedef struct px_cipher PX_Cipher;
112 typedef struct px_combo PX_Combo;
113 
114 struct px_digest
115 {
116  unsigned (*result_size) (PX_MD *h);
117  unsigned (*block_size) (PX_MD *h);
118  void (*reset) (PX_MD *h);
119  void (*update) (PX_MD *h, const uint8 *data, unsigned dlen);
120  void (*finish) (PX_MD *h, uint8 *dst);
121  void (*free) (PX_MD *h);
122  /* private */
123  union
124  {
125  unsigned code;
126  void *ptr;
127  } p;
128 };
129 
130 struct px_alias
131 {
132  char *alias;
133  char *name;
134 };
135 
136 struct px_hmac
137 {
138  unsigned (*result_size) (PX_HMAC *h);
139  unsigned (*block_size) (PX_HMAC *h);
140  void (*reset) (PX_HMAC *h);
141  void (*update) (PX_HMAC *h, const uint8 *data, unsigned dlen);
142  void (*finish) (PX_HMAC *h, uint8 *dst);
143  void (*free) (PX_HMAC *h);
144  void (*init) (PX_HMAC *h, const uint8 *key, unsigned klen);
145 
147  /* private */
148  struct
149  {
152  } p;
153 };
154 
155 struct px_cipher
156 {
157  unsigned (*block_size) (PX_Cipher *c);
158  unsigned (*key_size) (PX_Cipher *c); /* max key len */
159  unsigned (*iv_size) (PX_Cipher *c);
160 
161  int (*init) (PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv);
162  int (*encrypt) (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res);
163  int (*decrypt) (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res);
164  void (*free) (PX_Cipher *c);
165  /* private */
166  void *ptr;
167  int pstat; /* mcrypt uses it */
168 };
169 
170 struct px_combo
171 {
172  int (*init) (PX_Combo *cx, const uint8 *key, unsigned klen,
173  const uint8 *iv, unsigned ivlen);
174  int (*encrypt) (PX_Combo *cx, const uint8 *data, unsigned dlen,
175  uint8 *res, unsigned *rlen);
176  int (*decrypt) (PX_Combo *cx, const uint8 *data, unsigned dlen,
177  uint8 *res, unsigned *rlen);
178  unsigned (*encrypt_len) (PX_Combo *cx, unsigned dlen);
179  unsigned (*decrypt_len) (PX_Combo *cx, unsigned dlen);
180  void (*free) (PX_Combo *cx);
181 
183  unsigned padding;
184 };
185 
186 int px_find_digest(const char *name, PX_MD **res);
187 int px_find_hmac(const char *name, PX_HMAC **res);
188 int px_find_cipher(const char *name, PX_Cipher **res);
189 int px_find_combo(const char *name, PX_Combo **res);
190 
191 void px_THROW_ERROR(int err) pg_attribute_noreturn();
192 const char *px_strerror(int err);
193 
194 const char *px_resolve_alias(const PX_Alias *aliases, const char *name);
195 
196 void px_set_debug_handler(void (*handler) (const char *));
197 
198 void px_memset(void *ptr, int c, size_t len);
199 
200 #ifdef PX_DEBUG
201 void px_debug(const char *fmt,...) pg_attribute_printf(1, 2);
202 #else
203 #define px_debug(...)
204 #endif
205 
206 #define px_md_result_size(md) (md)->result_size(md)
207 #define px_md_block_size(md) (md)->block_size(md)
208 #define px_md_reset(md) (md)->reset(md)
209 #define px_md_update(md, data, dlen) (md)->update(md, data, dlen)
210 #define px_md_finish(md, buf) (md)->finish(md, buf)
211 #define px_md_free(md) (md)->free(md)
212 
213 #define px_hmac_result_size(hmac) (hmac)->result_size(hmac)
214 #define px_hmac_block_size(hmac) (hmac)->block_size(hmac)
215 #define px_hmac_reset(hmac) (hmac)->reset(hmac)
216 #define px_hmac_init(hmac, key, klen) (hmac)->init(hmac, key, klen)
217 #define px_hmac_update(hmac, data, dlen) (hmac)->update(hmac, data, dlen)
218 #define px_hmac_finish(hmac, buf) (hmac)->finish(hmac, buf)
219 #define px_hmac_free(hmac) (hmac)->free(hmac)
220 
221 
222 #define px_cipher_key_size(c) (c)->key_size(c)
223 #define px_cipher_block_size(c) (c)->block_size(c)
224 #define px_cipher_iv_size(c) (c)->iv_size(c)
225 #define px_cipher_init(c, k, klen, iv) (c)->init(c, k, klen, iv)
226 #define px_cipher_encrypt(c, data, dlen, res) \
227  (c)->encrypt(c, data, dlen, res)
228 #define px_cipher_decrypt(c, data, dlen, res) \
229  (c)->decrypt(c, data, dlen, res)
230 #define px_cipher_free(c) (c)->free(c)
231 
232 
233 #define px_combo_encrypt_len(c, dlen) (c)->encrypt_len(c, dlen)
234 #define px_combo_decrypt_len(c, dlen) (c)->decrypt_len(c, dlen)
235 #define px_combo_init(c, key, klen, iv, ivlen) \
236  (c)->init(c, key, klen, iv, ivlen)
237 #define px_combo_encrypt(c, data, dlen, res, rlen) \
238  (c)->encrypt(c, data, dlen, res, rlen)
239 #define px_combo_decrypt(c, data, dlen, res, rlen) \
240  (c)->decrypt(c, data, dlen, res, rlen)
241 #define px_combo_free(c) (c)->free(c)
242 
243 #endif /* __PX_H */
void px_THROW_ERROR(int err) pg_attribute_noreturn()
Definition: px.c:96
void(* free)(PX_Cipher *c)
Definition: px.h:164
unsigned code
Definition: px.h:125
unsigned(* key_size)(PX_Cipher *c)
Definition: px.h:158
void * ptr
Definition: px.h:126
int px_find_digest(const char *name, PX_MD **res)
Definition: internal.c:578
unsigned(* result_size)(PX_MD *h)
Definition: px.h:116
int cx(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
Definition: geqo_cx.c:47
unsigned padding
Definition: px.h:183
int(* decrypt)(PX_Combo *cx, const uint8 *data, unsigned dlen, uint8 *res, unsigned *rlen)
Definition: px.h:176
#define px_free(p)
Definition: px.h:47
struct px_hmac::@14 p
unsigned char uint8
Definition: c.h:263
int px_find_hmac(const char *name, PX_HMAC **res)
Definition: px-hmac.c:143
Definition: px.h:170
void * ptr
Definition: px.h:166
int pstat
Definition: px.h:167
#define pg_attribute_noreturn()
Definition: c.h:648
void px_debug(const char *fmt,...) pg_attribute_printf(1
unsigned(* decrypt_len)(PX_Combo *cx, unsigned dlen)
Definition: px.h:179
PX_Cipher * cipher
Definition: px.h:182
Definition: px.h:130
void(* update)(PX_MD *h, const uint8 *data, unsigned dlen)
Definition: px.h:119
#define pg_attribute_printf(f, a)
Definition: c.h:633
void(* init)(PX_HMAC *h, const uint8 *key, unsigned klen)
Definition: px.h:144
PX_MD * md
Definition: px.h:146
void(* free)(PX_Combo *cx)
Definition: px.h:180
unsigned(* block_size)(PX_HMAC *h)
Definition: px.h:139
void(* free)(PX_MD *h)
Definition: px.h:121
void(* update)(PX_HMAC *h, const uint8 *data, unsigned dlen)
Definition: px.h:141
int px_find_combo(const char *name, PX_Combo **res)
Definition: px.c:410
Definition: px.h:114
int px_find_cipher(const char *name, PX_Cipher **res)
Definition: internal.c:597
char * c
int(* init)(PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv)
Definition: px.h:161
unsigned(* iv_size)(PX_Cipher *c)
Definition: px.h:159
int(* encrypt)(PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res)
Definition: px.h:162
int(* encrypt)(PX_Combo *cx, const uint8 *data, unsigned dlen, uint8 *res, unsigned *rlen)
Definition: px.h:174
void(* finish)(PX_MD *h, uint8 *dst)
Definition: px.h:120
#define px_realloc(p, s)
Definition: px.h:46
uint8 * opad
Definition: px.h:151
void px_set_debug_handler(void(*handler)(const char *))
Definition: px.c:154
union px_digest::@13 p
const char * px_strerror(int err)
Definition: px.c:122
char * alias
Definition: px.h:132
const char * px_resolve_alias(const PX_Alias *aliases, const char *name)
Definition: px.c:140
unsigned(* result_size)(PX_HMAC *h)
Definition: px.h:138
void(* finish)(PX_HMAC *h, uint8 *dst)
Definition: px.h:142
Definition: px.h:155
const char * name
Definition: encode.c:521
#define px_alloc(s)
Definition: px.h:45
uint8 * ipad
Definition: px.h:150
void(* reset)(PX_MD *h)
Definition: px.h:118
char * name
Definition: px.h:133
int(* init)(PX_Combo *cx, const uint8 *key, unsigned klen, const uint8 *iv, unsigned ivlen)
Definition: px.h:172
Definition: px.h:136
void px_memset(void *ptr, int c, size_t len)
Definition: px.c:134
unsigned(* block_size)(PX_Cipher *c)
Definition: px.h:157
unsigned(* block_size)(PX_MD *h)
Definition: px.h:117
void(* reset)(PX_HMAC *h)
Definition: px.h:140
int(* decrypt)(PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res)
Definition: px.h:163
void(* free)(PX_HMAC *h)
Definition: px.h:143
unsigned(* encrypt_len)(PX_Combo *cx, unsigned dlen)
Definition: px.h:178