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