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