Blame src/sha.h

Packit fa4fcc
/*
Packit fa4fcc
 * sha.h: header file for SHA-1/224/256/384/512 routines
Packit fa4fcc
 *
Packit fa4fcc
 * Ref: NIST FIPS PUB 180-4 Secure Hash Standard
Packit fa4fcc
 *
Packit fa4fcc
 * Copyright (C) 2003-2018 Mark Shelor, All Rights Reserved
Packit fa4fcc
 *
Packit fa4fcc
 * Version: 6.02
Packit fa4fcc
 * Fri Apr 20 16:25:30 MST 2018
Packit fa4fcc
 *
Packit fa4fcc
 */
Packit fa4fcc
Packit fa4fcc
#ifndef _INCLUDE_SHA_H_
Packit fa4fcc
#define _INCLUDE_SHA_H_
Packit fa4fcc
Packit fa4fcc
#include <limits.h>
Packit fa4fcc
Packit fa4fcc
#define SHA32_MAX	4294967295U
Packit fa4fcc
Packit fa4fcc
#define SHA32_SHR(x, n)	((x) >> (n))
Packit fa4fcc
#define SHA32_SHL(x, n)	((x) << (n))
Packit fa4fcc
Packit fa4fcc
#define SHA64_SHR(x, n)	((x) >> (n))
Packit fa4fcc
#define SHA64_SHL(x, n)	((x) << (n))
Packit fa4fcc
Packit fa4fcc
#define SHA32_ALIGNED
Packit fa4fcc
#define SHA64_ALIGNED
Packit fa4fcc
Packit fa4fcc
#define SHA_LO32(x)	(x)
Packit fa4fcc
Packit fa4fcc
#if USHRT_MAX == SHA32_MAX
Packit fa4fcc
	#define SHA32	unsigned short
Packit fa4fcc
	#define SHA32_CONST(c)	c ## U
Packit fa4fcc
#elif UINT_MAX == SHA32_MAX
Packit fa4fcc
	#define SHA32	unsigned int
Packit fa4fcc
	#define SHA32_CONST(c)	c ## U
Packit fa4fcc
#elif ULONG_MAX == SHA32_MAX
Packit fa4fcc
	#define SHA32	unsigned long
Packit fa4fcc
	#define SHA32_CONST(c)	c ## UL
Packit fa4fcc
#else
Packit fa4fcc
	#undef  SHA32_ALIGNED
Packit fa4fcc
	#undef  SHA_LO32
Packit fa4fcc
	#define SHA_LO32(x)	((x) & SHA32_MAX)
Packit fa4fcc
	#undef  SHA32_SHR
Packit fa4fcc
	#define SHA32_SHR(x, n)	(SHA_LO32(x) >> (n))
Packit fa4fcc
	#define SHA32	unsigned long
Packit fa4fcc
	#define SHA32_CONST(c)	c ## UL
Packit fa4fcc
#endif
Packit fa4fcc
Packit fa4fcc
#if defined(ULONG_LONG_MAX) || defined(ULLONG_MAX) || defined(HAS_LONG_LONG)
Packit fa4fcc
	#define SHA_ULL_EXISTS
Packit fa4fcc
#endif
Packit fa4fcc
Packit fa4fcc
#if (((ULONG_MAX >> 16) >> 16) >> 16) >> 15 == 1UL
Packit fa4fcc
	#define SHA64	unsigned long
Packit fa4fcc
	#define SHA64_CONST(c)	c ## UL
Packit fa4fcc
#elif defined(SHA_ULL_EXISTS) && defined(LONGLONGSIZE) && LONGLONGSIZE == 8
Packit fa4fcc
	#define SHA64	unsigned long long
Packit fa4fcc
	#define SHA64_CONST(c)	c ## ULL
Packit fa4fcc
#elif defined(SHA_ULL_EXISTS)
Packit fa4fcc
	#undef  SHA64_ALIGNED
Packit fa4fcc
	#undef  SHA64_SHR
Packit fa4fcc
	#define SHA64_MAX	18446744073709551615ULL
Packit fa4fcc
	#define SHA64_SHR(x, n)	(((x) & SHA64_MAX) >> (n))
Packit fa4fcc
	#define SHA64	unsigned long long
Packit fa4fcc
	#define SHA64_CONST(c)	c ## ULL
Packit fa4fcc
Packit fa4fcc
	/* The following cases detect compilers that
Packit fa4fcc
	 * support 64-bit types in a non-standard way */
Packit fa4fcc
Packit fa4fcc
#elif defined(_MSC_VER)					/* Microsoft C */
Packit fa4fcc
	#define SHA64	unsigned __int64
Packit fa4fcc
	#define SHA64_CONST(c)	(SHA64) c
Packit fa4fcc
#endif
Packit fa4fcc
Packit fa4fcc
#if defined(SHA64) && !defined(NO_SHA_384_512)
Packit fa4fcc
	#define SHA_384_512
Packit fa4fcc
#endif
Packit fa4fcc
Packit fa4fcc
#if defined(BYTEORDER) && (BYTEORDER & 0xffff) == 0x4321
Packit fa4fcc
	#if defined(SHA32_ALIGNED)
Packit fa4fcc
		#define SHA32_SCHED(W, b)	Copy(b, W, 64, char)
Packit fa4fcc
	#endif
Packit fa4fcc
	#if defined(SHA64) && defined(SHA64_ALIGNED)
Packit fa4fcc
		#define SHA64_SCHED(W, b)	Copy(b, W, 128, char)
Packit fa4fcc
	#endif
Packit fa4fcc
#endif
Packit fa4fcc
Packit fa4fcc
#if !defined(SHA32_SCHED)
Packit fa4fcc
	#define SHA32_SCHED(W, b) { int t; SHA32 *q = W;		\
Packit fa4fcc
		for (t = 0; t < 16; t++, b += 4) *q++ =			\
Packit fa4fcc
			(SHA32) b[0] << 24 | (SHA32) b[1] << 16 |	\
Packit fa4fcc
			(SHA32) b[2] <<  8 | (SHA32) b[3]; }
Packit fa4fcc
#endif
Packit fa4fcc
Packit fa4fcc
#if defined(SHA64) && !defined(SHA64_SCHED)
Packit fa4fcc
	#define SHA64_SCHED(W, b) { int t; SHA64 *q = W;		\
Packit fa4fcc
		for (t = 0; t < 16; t++, b += 8) *q++ =			\
Packit fa4fcc
			(SHA64) b[0] << 56 | (SHA64) b[1] << 48 |	\
Packit fa4fcc
			(SHA64) b[2] << 40 | (SHA64) b[3] << 32 |	\
Packit fa4fcc
			(SHA64) b[4] << 24 | (SHA64) b[5] << 16 |	\
Packit fa4fcc
			(SHA64) b[6] <<  8 | (SHA64) b[7]; }
Packit fa4fcc
#endif
Packit fa4fcc
Packit fa4fcc
#define SHA1		1
Packit fa4fcc
#define SHA224		224
Packit fa4fcc
#define SHA256		256
Packit fa4fcc
#define SHA384		384
Packit fa4fcc
#define SHA512		512
Packit fa4fcc
#define SHA512224	512224
Packit fa4fcc
#define SHA512256	512256
Packit fa4fcc
Packit fa4fcc
#define SHA1_BLOCK_BITS		512
Packit fa4fcc
#define SHA224_BLOCK_BITS	SHA1_BLOCK_BITS
Packit fa4fcc
#define SHA256_BLOCK_BITS	SHA1_BLOCK_BITS
Packit fa4fcc
#define SHA384_BLOCK_BITS	1024
Packit fa4fcc
#define SHA512_BLOCK_BITS	SHA384_BLOCK_BITS
Packit fa4fcc
#define SHA512224_BLOCK_BITS	SHA512_BLOCK_BITS
Packit fa4fcc
#define SHA512256_BLOCK_BITS	SHA512_BLOCK_BITS
Packit fa4fcc
Packit fa4fcc
#define SHA1_DIGEST_BITS	160
Packit fa4fcc
#define SHA224_DIGEST_BITS	224
Packit fa4fcc
#define SHA256_DIGEST_BITS	256
Packit fa4fcc
#define SHA384_DIGEST_BITS	384
Packit fa4fcc
#define SHA512_DIGEST_BITS	512
Packit fa4fcc
#define SHA512224_DIGEST_BITS	224
Packit fa4fcc
#define SHA512256_DIGEST_BITS	256
Packit fa4fcc
Packit fa4fcc
#define SHA_MAX_BLOCK_BITS	SHA512_BLOCK_BITS
Packit fa4fcc
#define SHA_MAX_DIGEST_BITS	SHA512_DIGEST_BITS
Packit fa4fcc
#define SHA_MAX_HEX_LEN		(SHA_MAX_DIGEST_BITS / 4)
Packit fa4fcc
#define SHA_MAX_BASE64_LEN	(1 + (SHA_MAX_DIGEST_BITS / 6))
Packit fa4fcc
Packit fa4fcc
#if !defined(SHA64)
Packit fa4fcc
	#define SHA64	SHA32
Packit fa4fcc
#endif
Packit fa4fcc
Packit fa4fcc
typedef struct SHA {
Packit fa4fcc
	int alg;
Packit fa4fcc
	void (*sha)(struct SHA *, unsigned char *);
Packit fa4fcc
	SHA32 H32[8];
Packit fa4fcc
	SHA64 H64[8];
Packit fa4fcc
	unsigned char block[SHA_MAX_BLOCK_BITS/8];
Packit fa4fcc
	unsigned int blockcnt;
Packit fa4fcc
	unsigned int blocksize;
Packit fa4fcc
	SHA32 lenhh, lenhl, lenlh, lenll;
Packit fa4fcc
	unsigned char digest[SHA_MAX_DIGEST_BITS/8];
Packit fa4fcc
	unsigned int digestlen;
Packit fa4fcc
	char hex[SHA_MAX_HEX_LEN+1];
Packit fa4fcc
	char base64[SHA_MAX_BASE64_LEN+1];
Packit fa4fcc
} SHA;
Packit fa4fcc
Packit fa4fcc
typedef struct {
Packit fa4fcc
	SHA isha;
Packit fa4fcc
	SHA osha;
Packit fa4fcc
	unsigned int digestlen;
Packit fa4fcc
	unsigned char key[SHA_MAX_BLOCK_BITS/8];
Packit fa4fcc
} HMAC;
Packit fa4fcc
Packit fa4fcc
#endif	/* _INCLUDE_SHA_H_ */