| /* |
| * px.h |
| * Header file for pgcrypto. |
| * |
| * Copyright (c) 2001 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/px.h |
| */ |
| |
| #ifndef __PX_H |
| #define __PX_H |
| |
| #include <sys/types.h> |
| #include <sys/param.h> |
| |
| /* keep debug messages? */ |
| #define PX_DEBUG |
| |
| /* a way to disable palloc |
| * - useful if compiled into standalone |
| */ |
| #ifndef PX_OWN_ALLOC |
| #define px_alloc(s) palloc(s) |
| #define px_realloc(p, s) repalloc(p, s) |
| #define px_free(p) pfree(p) |
| #else |
| void *px_alloc(size_t s); |
| void *px_realloc(void *p, size_t s); |
| void px_free(void *p); |
| #endif |
| |
| /* max len of 'type' parms */ |
| #define PX_MAX_NAMELEN 128 |
| |
| /* max salt returned */ |
| #define PX_MAX_SALT_LEN 128 |
| |
| /* |
| * PX error codes |
| */ |
| #define PXE_OK 0 |
| #define PXE_ERR_GENERIC -1 |
| #define PXE_NO_HASH -2 |
| #define PXE_NO_CIPHER -3 |
| #define PXE_NOTBLOCKSIZE -4 |
| #define PXE_BAD_OPTION -5 |
| #define PXE_BAD_FORMAT -6 |
| #define PXE_KEY_TOO_BIG -7 |
| #define PXE_CIPHER_INIT -8 |
| #define PXE_HASH_UNUSABLE_FOR_HMAC -9 |
| #define PXE_DEV_READ_ERROR -10 |
| #define PXE_OSSL_RAND_ERROR -11 |
| #define PXE_BUG -12 |
| #define PXE_ARGUMENT_ERROR -13 |
| #define PXE_UNKNOWN_SALT_ALGO -14 |
| #define PXE_BAD_SALT_ROUNDS -15 |
| #define PXE_MCRYPT_INTERNAL -16 |
| #define PXE_NO_RANDOM -17 |
| #define PXE_DECRYPT_FAILED -18 |
| |
| #define PXE_MBUF_SHORT_READ -50 |
| |
| #define PXE_PGP_CORRUPT_DATA -100 |
| #define PXE_PGP_CORRUPT_ARMOR -101 |
| #define PXE_PGP_UNSUPPORTED_COMPR -102 |
| #define PXE_PGP_UNSUPPORTED_CIPHER -103 |
| #define PXE_PGP_UNSUPPORTED_HASH -104 |
| #define PXE_PGP_COMPRESSION_ERROR -105 |
| #define PXE_PGP_NOT_TEXT -106 |
| #define PXE_PGP_UNEXPECTED_PKT -107 |
| #define PXE_PGP_NO_BIGNUM -108 |
| #define PXE_PGP_MATH_FAILED -109 |
| #define PXE_PGP_SHORT_ELGAMAL_KEY -110 |
| #define PXE_PGP_RSA_UNSUPPORTED -111 |
| #define PXE_PGP_UNKNOWN_PUBALGO -112 |
| #define PXE_PGP_WRONG_KEY -113 |
| #define PXE_PGP_MULTIPLE_KEYS -114 |
| #define PXE_PGP_EXPECT_PUBLIC_KEY -115 |
| #define PXE_PGP_EXPECT_SECRET_KEY -116 |
| #define PXE_PGP_NOT_V4_KEYPKT -117 |
| #define PXE_PGP_KEYPKT_CORRUPT -118 |
| #define PXE_PGP_NO_USABLE_KEY -119 |
| #define PXE_PGP_NEED_SECRET_PSW -120 |
| #define PXE_PGP_BAD_S2K_MODE -121 |
| #define PXE_PGP_UNSUPPORTED_PUBALGO -122 |
| #define PXE_PGP_MULTIPLE_SUBKEYS -123 |
| |
| |
| typedef struct px_digest PX_MD; |
| typedef struct px_alias PX_Alias; |
| typedef struct px_hmac PX_HMAC; |
| typedef struct px_cipher PX_Cipher; |
| typedef struct px_combo PX_Combo; |
| |
| struct px_digest |
| { |
| unsigned (*result_size) (PX_MD *h); |
| unsigned (*block_size) (PX_MD *h); |
| void (*reset) (PX_MD *h); |
| void (*update) (PX_MD *h, const uint8 *data, unsigned dlen); |
| void (*finish) (PX_MD *h, uint8 *dst); |
| void (*free) (PX_MD *h); |
| /* private */ |
| union |
| { |
| unsigned code; |
| void *ptr; |
| } p; |
| }; |
| |
| struct px_alias |
| { |
| char *alias; |
| char *name; |
| }; |
| |
| struct px_hmac |
| { |
| unsigned (*result_size) (PX_HMAC *h); |
| unsigned (*block_size) (PX_HMAC *h); |
| void (*reset) (PX_HMAC *h); |
| void (*update) (PX_HMAC *h, const uint8 *data, unsigned dlen); |
| void (*finish) (PX_HMAC *h, uint8 *dst); |
| void (*free) (PX_HMAC *h); |
| void (*init) (PX_HMAC *h, const uint8 *key, unsigned klen); |
| |
| PX_MD *md; |
| /* private */ |
| struct |
| { |
| uint8 *ipad; |
| uint8 *opad; |
| } p; |
| }; |
| |
| struct px_cipher |
| { |
| unsigned (*block_size) (PX_Cipher *c); |
| unsigned (*key_size) (PX_Cipher *c); /* max key len */ |
| unsigned (*iv_size) (PX_Cipher *c); |
| |
| int (*init) (PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv); |
| int (*encrypt) (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res); |
| int (*decrypt) (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res); |
| void (*free) (PX_Cipher *c); |
| /* private */ |
| void *ptr; |
| int pstat; /* mcrypt uses it */ |
| }; |
| |
| struct px_combo |
| { |
| int (*init) (PX_Combo *cx, const uint8 *key, unsigned klen, |
| const uint8 *iv, unsigned ivlen); |
| int (*encrypt) (PX_Combo *cx, const uint8 *data, unsigned dlen, |
| uint8 *res, unsigned *rlen); |
| int (*decrypt) (PX_Combo *cx, const uint8 *data, unsigned dlen, |
| uint8 *res, unsigned *rlen); |
| unsigned (*encrypt_len) (PX_Combo *cx, unsigned dlen); |
| unsigned (*decrypt_len) (PX_Combo *cx, unsigned dlen); |
| void (*free) (PX_Combo *cx); |
| |
| PX_Cipher *cipher; |
| unsigned padding; |
| }; |
| |
| int px_find_digest(const char *name, PX_MD **res); |
| int px_find_hmac(const char *name, PX_HMAC **res); |
| int px_find_cipher(const char *name, PX_Cipher **res); |
| int px_find_combo(const char *name, PX_Combo **res); |
| |
| int px_get_random_bytes(uint8 *dst, unsigned count); |
| int px_get_pseudo_random_bytes(uint8 *dst, unsigned count); |
| int px_add_entropy(const uint8 *data, unsigned count); |
| |
| unsigned px_acquire_system_randomness(uint8 *dst); |
| |
| const char *px_strerror(int err); |
| |
| const char *px_resolve_alias(const PX_Alias *aliases, const char *name); |
| |
| void px_set_debug_handler(void (*handler) (const char *)); |
| |
| #ifdef PX_DEBUG |
| void px_debug(const char *fmt, ...) |
| __attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2))); |
| #else |
| #define px_debug(...) |
| #endif |
| |
| #define px_md_result_size(md) (md)->result_size(md) |
| #define px_md_block_size(md) (md)->block_size(md) |
| #define px_md_reset(md) (md)->reset(md) |
| #define px_md_update(md, data, dlen) (md)->update(md, data, dlen) |
| #define px_md_finish(md, buf) (md)->finish(md, buf) |
| #define px_md_free(md) (md)->free(md) |
| |
| #define px_hmac_result_size(hmac) (hmac)->result_size(hmac) |
| #define px_hmac_block_size(hmac) (hmac)->block_size(hmac) |
| #define px_hmac_reset(hmac) (hmac)->reset(hmac) |
| #define px_hmac_init(hmac, key, klen) (hmac)->init(hmac, key, klen) |
| #define px_hmac_update(hmac, data, dlen) (hmac)->update(hmac, data, dlen) |
| #define px_hmac_finish(hmac, buf) (hmac)->finish(hmac, buf) |
| #define px_hmac_free(hmac) (hmac)->free(hmac) |
| |
| |
| #define px_cipher_key_size(c) (c)->key_size(c) |
| #define px_cipher_block_size(c) (c)->block_size(c) |
| #define px_cipher_iv_size(c) (c)->iv_size(c) |
| #define px_cipher_init(c, k, klen, iv) (c)->init(c, k, klen, iv) |
| #define px_cipher_encrypt(c, data, dlen, res) \ |
| (c)->encrypt(c, data, dlen, res) |
| #define px_cipher_decrypt(c, data, dlen, res) \ |
| (c)->decrypt(c, data, dlen, res) |
| #define px_cipher_free(c) (c)->free(c) |
| |
| |
| #define px_combo_encrypt_len(c, dlen) (c)->encrypt_len(c, dlen) |
| #define px_combo_decrypt_len(c, dlen) (c)->decrypt_len(c, dlen) |
| #define px_combo_init(c, key, klen, iv, ivlen) \ |
| (c)->init(c, key, klen, iv, ivlen) |
| #define px_combo_encrypt(c, data, dlen, res, rlen) \ |
| (c)->encrypt(c, data, dlen, res, rlen) |
| #define px_combo_decrypt(c, data, dlen, res, rlen) \ |
| (c)->decrypt(c, data, dlen, res, rlen) |
| #define px_combo_free(c) (c)->free(c) |
| |
| #endif /* __PX_H */ |