mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	This commit back-patches the equivalent of the 9.5-branch commitse2838c580and48e5ba61e, so that we can work with OpenSSL 1.1.0 in 9.4. (Going further back would be a good thing but will take more work; meanwhile let's see what the buildfarm makes of this.) Original patches by Andreas Karlsson and Heikki Linnakangas, back-patching work by Andreas Karlsson. Patch: https://postgr.es/m/0c817abb-3f7d-20fb-583a-58f7593a0bea@proxel.se Discussion: https://postgr.es/m/5129.1492293840@sss.pgh.pa.us
		
			
				
	
	
		
			251 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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_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_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 *));
 | |
| 
 | |
| void		px_memset(void *ptr, int c, size_t len);
 | |
| 
 | |
| #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 */
 |