/*
 * 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 */
