diff options
Diffstat (limited to 'code/core/crypto/include')
| -rw-r--r-- | code/core/crypto/include/chacha.h | 48 | ||||
| -rw-r--r-- | code/core/crypto/include/compat.h | 24 | ||||
| -rw-r--r-- | code/core/crypto/include/curve25519.h | 78 | ||||
| -rw-r--r-- | code/core/crypto/include/machine/endian.h | 40 | ||||
| -rw-r--r-- | code/core/crypto/include/md32_common.h | 344 | ||||
| -rw-r--r-- | code/core/crypto/include/poly1305.h | 43 | ||||
| -rw-r--r-- | code/core/crypto/include/sha.h | 186 | 
7 files changed, 763 insertions, 0 deletions
diff --git a/code/core/crypto/include/chacha.h b/code/core/crypto/include/chacha.h new file mode 100644 index 0000000..11885b7 --- /dev/null +++ b/code/core/crypto/include/chacha.h @@ -0,0 +1,48 @@ +/* $OpenBSD: chacha.h,v 1.7 2015/12/09 14:07:55 bcook Exp $ */ +/* + * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef HEADER_CHACHA_H +#define HEADER_CHACHA_H + +#include <stddef.h> +#include <stdint.h> + +#ifdef  __cplusplus +extern "C" { +#endif + +typedef struct { +	unsigned int input[16]; +	unsigned char ks[64]; +	unsigned char unused; +} ChaCha_ctx; + +void ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key, +    unsigned int keybits); +void ChaCha_set_iv(ChaCha_ctx *ctx, const unsigned char *iv, +    const unsigned char *counter); +void ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in, +    size_t len); + +void CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, +    const unsigned char key[32], const unsigned char iv[8], uint64_t counter); + +#ifdef  __cplusplus +} +#endif + +#endif /* HEADER_CHACHA_H */ diff --git a/code/core/crypto/include/compat.h b/code/core/crypto/include/compat.h new file mode 100644 index 0000000..12fb3f4 --- /dev/null +++ b/code/core/crypto/include/compat.h @@ -0,0 +1,24 @@ +#include <sys/types.h> +#include <stdint.h> + +#ifndef HAVE_GETENTROPY +int getentropy(void *buf, size_t buflen); +#endif + +#ifndef HAVE_EXPLICIT_BZERO +void explicit_bzero(void *, size_t); +#endif + +#ifndef HAVE_TIMINGSAFE_BCMP +int timingsafe_bcmp(const void *b1, const void *b2, size_t n); +#endif + +#ifndef HAVE_TIMINGSAFE_MEMCMP +int timingsafe_memcmp(const void *b1, const void *b2, size_t len); +#endif + +#ifndef HAVE_ARC4RANDOM_BUF +uint32_t arc4random(void); +void arc4random_buf(void *_buf, size_t n); +uint32_t arc4random_uniform(uint32_t upper_bound); +#endif diff --git a/code/core/crypto/include/curve25519.h b/code/core/crypto/include/curve25519.h new file mode 100644 index 0000000..a7092cb --- /dev/null +++ b/code/core/crypto/include/curve25519.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2015, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef HEADER_CURVE25519_H +#define HEADER_CURVE25519_H + +#include <stdint.h> +#include <stddef.h> + +#if defined(__cplusplus) +extern "C" { +#endif + +/* + * Curve25519. + * + * Curve25519 is an elliptic curve. See https://tools.ietf.org/html/rfc7748. + */ + +/* + * X25519. + * + * X25519 is the Diffie-Hellman primitive built from curve25519. It is + * sometimes referred to as curve25519, but X25519 is a more precise name. + * See http://cr.yp.to/ecdh.html and https://tools.ietf.org/html/rfc7748. + */ + +#define X25519_KEY_LENGTH 32 + +/* + * X25519_keypair sets |out_public_value| and |out_private_key| to a freshly + * generated, public/private key pair. It returns one on success and zero on  + * error. + */ +int X25519_keypair(uint8_t out_public_value[X25519_KEY_LENGTH], +    uint8_t out_private_key[X25519_KEY_LENGTH],  +    int (*random_buf)(void *, size_t)); + +/* + * X25519 writes a shared key to |out_shared_key| that is calculated from the + * given private key and the peer's public value. It returns one on success and + * zero on error. + * + * Don't use the shared key directly, rather use a KDF and also include the two + * public values as inputs. + */ +int X25519(uint8_t out_shared_key[X25519_KEY_LENGTH], +    const uint8_t private_key[X25519_KEY_LENGTH], +    const uint8_t peers_public_value[X25519_KEY_LENGTH]); + +/* + * ED25519 + */ +int ED25519_keypair(uint8_t out_public_key[32], uint8_t out_private_key[64],  +    int (*random_buf)(void *, size_t)); +int ED25519_sign(uint8_t *out_sig, const uint8_t *message, size_t message_len, +    const uint8_t private_key[64]); +int ED25519_verify(const uint8_t *message, size_t message_len, +    const uint8_t signature[64], const uint8_t public_key[32]); + +#if defined(__cplusplus) +}  /* extern C */ +#endif + +#endif  /* HEADER_CURVE25519_H */ diff --git a/code/core/crypto/include/machine/endian.h b/code/core/crypto/include/machine/endian.h new file mode 100644 index 0000000..5ec39af --- /dev/null +++ b/code/core/crypto/include/machine/endian.h @@ -0,0 +1,40 @@ +/* + * Public domain + * machine/endian.h compatibility shim + */ + +#ifndef LIBCRYPTOCOMPAT_BYTE_ORDER_H_ +#define LIBCRYPTOCOMPAT_BYTE_ORDER_H_ + +#if defined(_WIN32) + +#define LITTLE_ENDIAN  1234 +#define BIG_ENDIAN 4321 +#define PDP_ENDIAN	3412 + +/* + * Use GCC and Visual Studio compiler defines to determine endian. + */ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define BYTE_ORDER LITTLE_ENDIAN +#else +#define BYTE_ORDER BIG_ENDIAN +#endif + +#elif defined(__linux__) +#include <endian.h> + +#elif defined(__sun) || defined(_AIX) || defined(__hpux) +#include <sys/types.h> +#include <arpa/nameser_compat.h> + +#elif defined(__sgi) +#include <standards.h> +#include <sys/endian.h> + +#else +#include_next <machine/endian.h> + +#endif + +#endif diff --git a/code/core/crypto/include/md32_common.h b/code/core/crypto/include/md32_common.h new file mode 100644 index 0000000..7a6e893 --- /dev/null +++ b/code/core/crypto/include/md32_common.h @@ -0,0 +1,344 @@ +/* $OpenBSD: md32_common.h,v 1.22 2016/11/04 13:56:04 miod Exp $ */ +/* ==================================================================== + * Copyright (c) 1999-2007 The OpenSSL Project.  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. + * + * 3. All advertising materials mentioning features or use of this + *    software must display the following acknowledgment: + *    "This product includes software developed by the OpenSSL Project + *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + *    endorse or promote products derived from this software without + *    prior written permission. For written permission, please contact + *    licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + *    nor may "OpenSSL" appear in their names without prior written + *    permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + *    acknowledgment: + *    "This product includes software developed by the OpenSSL Project + *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + */ + +/* + * This is a generic 32 bit "collector" for message digest algorithms. + * Whenever needed it collects input character stream into chunks of + * 32 bit values and invokes a block function that performs actual hash + * calculations. + * + * Porting guide. + * + * Obligatory macros: + * + * DATA_ORDER_IS_BIG_ENDIAN or DATA_ORDER_IS_LITTLE_ENDIAN + *	this macro defines byte order of input stream. + * HASH_CBLOCK + *	size of a unit chunk HASH_BLOCK operates on. + * HASH_LONG + *	has to be at least 32 bit wide. + * HASH_CTX + *	context structure that at least contains following + *	members: + *		typedef struct { + *			... + *			HASH_LONG	Nl,Nh; + *			either { + *			HASH_LONG	data[HASH_LBLOCK]; + *			unsigned char	data[HASH_CBLOCK]; + *			}; + *			unsigned int	num; + *			... + *			} HASH_CTX; + *	data[] vector is expected to be zeroed upon first call to + *	HASH_UPDATE. + * HASH_UPDATE + *	name of "Update" function, implemented here. + * HASH_TRANSFORM + *	name of "Transform" function, implemented here. + * HASH_FINAL + *	name of "Final" function, implemented here. + * HASH_BLOCK_DATA_ORDER + *	name of "block" function capable of treating *unaligned* input + *	message in original (data) byte order, implemented externally. + * HASH_MAKE_STRING + *	macro convering context variables to an ASCII hash string. + * + * MD5 example: + * + *	#define DATA_ORDER_IS_LITTLE_ENDIAN + * + *	#define HASH_LONG		MD5_LONG + *	#define HASH_CTX		MD5_CTX + *	#define HASH_CBLOCK		MD5_CBLOCK + *	#define HASH_UPDATE		MD5_Update + *	#define HASH_TRANSFORM		MD5_Transform + *	#define HASH_FINAL		MD5_Final + *	#define HASH_BLOCK_DATA_ORDER	md5_block_data_order + * + *					<appro@fy.chalmers.se> + */ + +#include <stdint.h> +#include <string.h> + +#if !defined(DATA_ORDER_IS_BIG_ENDIAN) && !defined(DATA_ORDER_IS_LITTLE_ENDIAN) +#error "DATA_ORDER must be defined!" +#endif + +#ifndef HASH_CBLOCK +#error "HASH_CBLOCK must be defined!" +#endif +#ifndef HASH_LONG +#error "HASH_LONG must be defined!" +#endif +#ifndef HASH_CTX +#error "HASH_CTX must be defined!" +#endif + +#ifndef HASH_UPDATE +#error "HASH_UPDATE must be defined!" +#endif +#ifndef HASH_TRANSFORM +#error "HASH_TRANSFORM must be defined!" +#endif +#if !defined(HASH_FINAL) && !defined(HASH_NO_FINAL) +#error "HASH_FINAL or HASH_NO_FINAL must be defined!" +#endif + +#ifndef HASH_BLOCK_DATA_ORDER +#error "HASH_BLOCK_DATA_ORDER must be defined!" +#endif + +/* + * This common idiom is recognized by the compiler and turned into a + * CPU-specific intrinsic as appropriate.  + * e.g. GCC optimizes to roll on amd64 at -O0 + */ +static inline uint32_t ROTATE(uint32_t a, uint32_t n) +{ +	return (a<<n)|(a>>(32-n)); +} + +#if defined(DATA_ORDER_IS_BIG_ENDIAN) + +#if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) +# if (defined(__i386) || defined(__i386__) || \ +      defined(__x86_64) || defined(__x86_64__)) +    /* +     * This gives ~30-40% performance improvement in SHA-256 compiled +     * with gcc [on P4]. Well, first macro to be frank. We can pull +     * this trick on x86* platforms only, because these CPUs can fetch +     * unaligned data without raising an exception. +     */ +#  define HOST_c2l(c,l)	({ unsigned int r=*((const unsigned int *)(c));	\ +				   asm ("bswapl %0":"=r"(r):"0"(r));	\ +				   (c)+=4; (l)=r;			}) +#  define HOST_l2c(l,c)	({ unsigned int r=(l);			\ +				   asm ("bswapl %0":"=r"(r):"0"(r));	\ +				   *((unsigned int *)(c))=r; (c)+=4;	}) +# endif +#endif + +#ifndef HOST_c2l +#define HOST_c2l(c,l) do {l =(((unsigned long)(*((c)++)))<<24);	\ +			  l|=(((unsigned long)(*((c)++)))<<16);	\ +			  l|=(((unsigned long)(*((c)++)))<< 8);	\ +			  l|=(((unsigned long)(*((c)++)))    );	\ +		      } while (0) +#endif +#ifndef HOST_l2c +#define HOST_l2c(l,c) do {*((c)++)=(unsigned char)(((l)>>24)&0xff);	\ +			  *((c)++)=(unsigned char)(((l)>>16)&0xff);	\ +			  *((c)++)=(unsigned char)(((l)>> 8)&0xff);	\ +			  *((c)++)=(unsigned char)(((l)    )&0xff);	\ +		      } while (0) +#endif + +#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN) + +#if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__) +#  define HOST_c2l(c,l)	((l)=*((const unsigned int *)(c)), (c)+=4) +#  define HOST_l2c(l,c)	(*((unsigned int *)(c))=(l), (c)+=4) +#endif + +#ifndef HOST_c2l +#define HOST_c2l(c,l) do {l =(((unsigned long)(*((c)++)))    );	\ +			  l|=(((unsigned long)(*((c)++)))<< 8);	\ +			  l|=(((unsigned long)(*((c)++)))<<16);	\ +			  l|=(((unsigned long)(*((c)++)))<<24);	\ +		      } while (0) +#endif +#ifndef HOST_l2c +#define HOST_l2c(l,c) do {*((c)++)=(unsigned char)(((l)    )&0xff);	\ +			  *((c)++)=(unsigned char)(((l)>> 8)&0xff);	\ +			  *((c)++)=(unsigned char)(((l)>>16)&0xff);	\ +			  *((c)++)=(unsigned char)(((l)>>24)&0xff);	\ +		      } while (0) +#endif + +#endif + +/* + * Time for some action:-) + */ + +int +HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len) +{ +	const unsigned char *data = data_; +	unsigned char *p; +	HASH_LONG l; +	size_t n; + +	if (len == 0) +		return 1; + +	l = (c->Nl + (((HASH_LONG)len) << 3))&0xffffffffUL; +	/* 95-05-24 eay Fixed a bug with the overflow handling, thanks to +	 * Wei Dai <weidai@eskimo.com> for pointing it out. */ +	if (l < c->Nl) /* overflow */ +		c->Nh++; +	c->Nh+=(HASH_LONG)(len>>29);	/* might cause compiler warning on 16-bit */ +	c->Nl = l; + +	n = c->num; +	if (n != 0) { +		p = (unsigned char *)c->data; + +		if (len >= HASH_CBLOCK || len + n >= HASH_CBLOCK) { +			memcpy (p + n, data, HASH_CBLOCK - n); +			HASH_BLOCK_DATA_ORDER (c, p, 1); +			n = HASH_CBLOCK - n; +			data += n; +			len -= n; +			c->num = 0; +			memset (p,0,HASH_CBLOCK);	/* keep it zeroed */ +		} else { +			memcpy (p + n, data, len); +			c->num += (unsigned int)len; +			return 1; +		} +	} + +	n = len/HASH_CBLOCK; +	if (n > 0) { +		HASH_BLOCK_DATA_ORDER (c, data, n); +		n    *= HASH_CBLOCK; +		data += n; +		len -= n; +	} + +	if (len != 0) { +		p = (unsigned char *)c->data; +		c->num = (unsigned int)len; +		memcpy (p, data, len); +	} +	return 1; +} + + +void HASH_TRANSFORM (HASH_CTX *c, const unsigned char *data) +{ +	HASH_BLOCK_DATA_ORDER (c, data, 1); +} + + +#ifndef HASH_NO_FINAL +int HASH_FINAL (unsigned char *md, HASH_CTX *c) +{ +	unsigned char *p = (unsigned char *)c->data; +	size_t n = c->num; + +	p[n] = 0x80; /* there is always room for one */ +	n++; + +	if (n > (HASH_CBLOCK - 8)) { +		memset (p + n, 0, HASH_CBLOCK - n); +		n = 0; +		HASH_BLOCK_DATA_ORDER (c, p, 1); +	} +	memset (p + n, 0, HASH_CBLOCK - 8 - n); + +	p += HASH_CBLOCK - 8; +#if   defined(DATA_ORDER_IS_BIG_ENDIAN) +	HOST_l2c(c->Nh, p); +	HOST_l2c(c->Nl, p); +#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN) +	HOST_l2c(c->Nl, p); +	HOST_l2c(c->Nh, p); +#endif +	p -= HASH_CBLOCK; +	HASH_BLOCK_DATA_ORDER (c, p, 1); +	c->num = 0; +	memset (p, 0, HASH_CBLOCK); + +#ifndef HASH_MAKE_STRING +#error "HASH_MAKE_STRING must be defined!" +#else +	HASH_MAKE_STRING(c, md); +#endif + +	return 1; +} +#endif + +#ifndef MD32_REG_T +#if defined(__alpha) || defined(__sparcv9) || defined(__mips) +#define MD32_REG_T long +/* + * This comment was originaly written for MD5, which is why it + * discusses A-D. But it basically applies to all 32-bit digests, + * which is why it was moved to common header file. + * + * In case you wonder why A-D are declared as long and not + * as MD5_LONG. Doing so results in slight performance + * boost on LP64 architectures. The catch is we don't + * really care if 32 MSBs of a 64-bit register get polluted + * with eventual overflows as we *save* only 32 LSBs in + * *either* case. Now declaring 'em long excuses the compiler + * from keeping 32 MSBs zeroed resulting in 13% performance + * improvement under SPARC Solaris7/64 and 5% under AlphaLinux. + * Well, to be honest it should say that this *prevents* + * performance degradation. + *				<appro@fy.chalmers.se> + */ +#else +/* + * Above is not absolute and there are LP64 compilers that + * generate better code if MD32_REG_T is defined int. The above + * pre-processor condition reflects the circumstances under which + * the conclusion was made and is subject to further extension. + *				<appro@fy.chalmers.se> + */ +#define MD32_REG_T int +#endif +#endif diff --git a/code/core/crypto/include/poly1305.h b/code/core/crypto/include/poly1305.h new file mode 100644 index 0000000..d7af3df --- /dev/null +++ b/code/core/crypto/include/poly1305.h @@ -0,0 +1,43 @@ +/* $OpenBSD: poly1305.h,v 1.3 2014/07/25 14:04:51 jsing Exp $ */ +/* + * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef HEADER_POLY1305_H +#define HEADER_POLY1305_H + +#include <stddef.h> + +#ifdef  __cplusplus +extern "C" { +#endif + +typedef struct poly1305_context { +	size_t aligner; +	unsigned char opaque[136]; +} poly1305_context; + +typedef struct poly1305_context poly1305_state; + +void CRYPTO_poly1305_init(poly1305_context *ctx, const unsigned char key[32]); +void CRYPTO_poly1305_update(poly1305_context *ctx, const unsigned char *in, +    size_t len); +void CRYPTO_poly1305_finish(poly1305_context *ctx, unsigned char mac[16]); + +#ifdef  __cplusplus +} +#endif + +#endif /* HEADER_POLY1305_H */ diff --git a/code/core/crypto/include/sha.h b/code/core/crypto/include/sha.h new file mode 100644 index 0000000..93af5d9 --- /dev/null +++ b/code/core/crypto/include/sha.h @@ -0,0 +1,186 @@ +/* $OpenBSD: sha.h,v 1.21 2015/09/13 21:09:56 doug Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + *  + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to.  The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + *  + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + *  + * 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 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. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *    "This product includes cryptographic software written by + *     Eric Young (eay@cryptsoft.com)" + *    The word 'cryptographic' can be left out if the rouines from the library + *    being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from  + *    the apps directory (application code) you must include an acknowledgement: + *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + *  + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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. + *  + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed.  i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#include <stddef.h> + +#ifndef HEADER_SHA_H +#define HEADER_SHA_H +#if !defined(HAVE_ATTRIBUTE__BOUNDED__) && !defined(__OpenBSD__) +#define __bounded__(x, y, z) +#endif + +#ifdef  __cplusplus +extern "C" { +#endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! SHA_LONG has to be at least 32 bits wide.                    ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +#define SHA_LONG unsigned int + +#define SHA_LBLOCK	16 +#define SHA_CBLOCK	(SHA_LBLOCK*4)	/* SHA treats input data as a +					 * contiguous array of 32 bit +					 * wide big-endian values. */ +#define SHA_LAST_BLOCK  (SHA_CBLOCK-8) +#define SHA_DIGEST_LENGTH 20 + +typedef struct SHAstate_st +	{ +	SHA_LONG h0,h1,h2,h3,h4; +	SHA_LONG Nl,Nh; +	SHA_LONG data[SHA_LBLOCK]; +	unsigned int num; +	} SHA_CTX; + +#ifndef OPENSSL_NO_SHA1 +int SHA1_Init(SHA_CTX *c); +int SHA1_Update(SHA_CTX *c, const void *data, size_t len) +	__attribute__ ((__bounded__(__buffer__,2,3))); +int SHA1_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md) +	__attribute__ ((__bounded__(__buffer__,1,2))); +void SHA1_Transform(SHA_CTX *c, const unsigned char *data); +#endif + +#define SHA256_CBLOCK	(SHA_LBLOCK*4)	/* SHA-256 treats input data as a +					 * contiguous array of 32 bit +					 * wide big-endian values. */ +#define SHA224_DIGEST_LENGTH	28 +#define SHA256_DIGEST_LENGTH	32 + +typedef struct SHA256state_st +	{ +	SHA_LONG h[8]; +	SHA_LONG Nl,Nh; +	SHA_LONG data[SHA_LBLOCK]; +	unsigned int num,md_len; +	} SHA256_CTX; + +#ifndef OPENSSL_NO_SHA256 +int SHA224_Init(SHA256_CTX *c); +int SHA224_Update(SHA256_CTX *c, const void *data, size_t len) +	__attribute__ ((__bounded__(__buffer__,2,3))); +int SHA224_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA224(const unsigned char *d, size_t n,unsigned char *md) +	__attribute__ ((__bounded__(__buffer__,1,2))); +int SHA256_Init(SHA256_CTX *c); +int SHA256_Update(SHA256_CTX *c, const void *data, size_t len) +	__attribute__ ((__bounded__(__buffer__,2,3))); +int SHA256_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA256(const unsigned char *d, size_t n,unsigned char *md) +	__attribute__ ((__bounded__(__buffer__,1,2))); +void SHA256_Transform(SHA256_CTX *c, const unsigned char *data); +#endif + +#define SHA384_DIGEST_LENGTH	48 +#define SHA512_DIGEST_LENGTH	64 + +#ifndef OPENSSL_NO_SHA512 +/* + * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64 + * being exactly 64-bit wide. See Implementation Notes in sha512.c + * for further details. + */ +#define SHA512_CBLOCK	(SHA_LBLOCK*8)	/* SHA-512 treats input data as a +					 * contiguous array of 64 bit +					 * wide big-endian values. */ +#if defined(_LP64) +#define SHA_LONG64 unsigned long +#define U64(C)     C##UL +#else +#define SHA_LONG64 unsigned long long +#define U64(C)     C##ULL +#endif + +typedef struct SHA512state_st +	{ +	SHA_LONG64 h[8]; +	SHA_LONG64 Nl,Nh; +	union { +		SHA_LONG64	d[SHA_LBLOCK]; +		unsigned char	p[SHA512_CBLOCK]; +	} u; +	unsigned int num,md_len; +	} SHA512_CTX; +#endif + +#ifndef OPENSSL_NO_SHA512 +int SHA384_Init(SHA512_CTX *c); +int SHA384_Update(SHA512_CTX *c, const void *data, size_t len) +	__attribute__ ((__bounded__(__buffer__,2,3))); +int SHA384_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA384(const unsigned char *d, size_t n,unsigned char *md) +	__attribute__ ((__bounded__(__buffer__,1,2))); +int SHA512_Init(SHA512_CTX *c); +int SHA512_Update(SHA512_CTX *c, const void *data, size_t len) +	__attribute__ ((__bounded__(__buffer__,2,3))); +int SHA512_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA512(const unsigned char *d, size_t n,unsigned char *md) +	__attribute__ ((__bounded__(__buffer__,1,2))); +void SHA512_Transform(SHA512_CTX *c, const unsigned char *data); +#endif + +#ifdef  __cplusplus +} +#endif + +#endif  | 
