1/* 2 * sha.h: header file for SHA-1/224/256/384/512 routines 3 * 4 * Ref: NIST FIPS PUB 180-4 Secure Hash Standard 5 * 6 * Copyright (C) 2003-2023 Mark Shelor, All Rights Reserved 7 * 8 * Version: 6.04 9 * Sat Feb 25 12:00:50 PM MST 2023 10 * 11 */ 12 13#ifndef _INCLUDE_SHA_H_ 14#define _INCLUDE_SHA_H_ 15 16#include <limits.h> 17 18#define SHA32_MAX 4294967295U 19 20#define SHA32_SHR(x, n) ((x) >> (n)) 21#define SHA32_SHL(x, n) ((x) << (n)) 22 23#define SHA64_SHR(x, n) ((x) >> (n)) 24#define SHA64_SHL(x, n) ((x) << (n)) 25 26#define SHA32_ALIGNED 27#define SHA64_ALIGNED 28 29#define SHA_LO32(x) (x) 30 31#if USHRT_MAX == SHA32_MAX 32 #define SHA32 unsigned short 33 #define SHA32_CONST(c) c ## U 34#elif UINT_MAX == SHA32_MAX 35 #define SHA32 unsigned int 36 #define SHA32_CONST(c) c ## U 37#elif ULONG_MAX == SHA32_MAX 38 #define SHA32 unsigned long 39 #define SHA32_CONST(c) c ## UL 40#else 41 #undef SHA32_ALIGNED 42 #undef SHA_LO32 43 #define SHA_LO32(x) ((x) & SHA32_MAX) 44 #undef SHA32_SHR 45 #define SHA32_SHR(x, n) (SHA_LO32(x) >> (n)) 46 #define SHA32 unsigned long 47 #define SHA32_CONST(c) c ## UL 48#endif 49 50#if defined(ULONG_LONG_MAX) || defined(ULLONG_MAX) || defined(HAS_LONG_LONG) 51 #define SHA_ULL_EXISTS 52#endif 53 54#if (((ULONG_MAX >> 16) >> 16) >> 16) >> 15 == 1UL 55 #define SHA64 unsigned long 56 #define SHA64_CONST(c) c ## UL 57#elif defined(SHA_ULL_EXISTS) && defined(LONGLONGSIZE) && LONGLONGSIZE == 8 58 #define SHA64 unsigned long long 59 #define SHA64_CONST(c) c ## ULL 60#elif defined(SHA_ULL_EXISTS) 61 #undef SHA64_ALIGNED 62 #undef SHA64_SHR 63 #define SHA64_MAX 18446744073709551615ULL 64 #define SHA64_SHR(x, n) (((x) & SHA64_MAX) >> (n)) 65 #define SHA64 unsigned long long 66 #define SHA64_CONST(c) c ## ULL 67 68 /* The following cases detect compilers that 69 * support 64-bit types in a non-standard way */ 70 71#elif defined(_MSC_VER) /* Microsoft C */ 72 #define SHA64 unsigned __int64 73 #define SHA64_CONST(c) (SHA64) c 74#endif 75 76#if defined(SHA64) && !defined(NO_SHA_384_512) 77 #define SHA_384_512 78#endif 79 80#if defined(BYTEORDER) && (BYTEORDER & 0xffff) == 0x4321 81 #if defined(SHA32_ALIGNED) 82 #define SHA32_SCHED(W, b) Copy(b, W, 64, char) 83 #endif 84 #if defined(SHA64) && defined(SHA64_ALIGNED) 85 #define SHA64_SCHED(W, b) Copy(b, W, 128, char) 86 #endif 87#endif 88 89#if !defined(SHA32_SCHED) 90 #define SHA32_SCHED(W, b) { int t; SHA32 *q = W; \ 91 for (t = 0; t < 16; t++, b += 4) *q++ = \ 92 (SHA32) b[0] << 24 | (SHA32) b[1] << 16 | \ 93 (SHA32) b[2] << 8 | (SHA32) b[3]; } 94#endif 95 96#if defined(SHA64) && !defined(SHA64_SCHED) 97 #define SHA64_SCHED(W, b) { int t; SHA64 *q = W; \ 98 for (t = 0; t < 16; t++, b += 8) *q++ = \ 99 (SHA64) b[0] << 56 | (SHA64) b[1] << 48 | \ 100 (SHA64) b[2] << 40 | (SHA64) b[3] << 32 | \ 101 (SHA64) b[4] << 24 | (SHA64) b[5] << 16 | \ 102 (SHA64) b[6] << 8 | (SHA64) b[7]; } 103#endif 104 105#define SHA1 1 106#define SHA224 224 107#define SHA256 256 108#define SHA384 384 109#define SHA512 512 110#define SHA512224 512224 111#define SHA512256 512256 112 113#define SHA1_BLOCK_BITS 512 114#define SHA224_BLOCK_BITS SHA1_BLOCK_BITS 115#define SHA256_BLOCK_BITS SHA1_BLOCK_BITS 116#define SHA384_BLOCK_BITS 1024 117#define SHA512_BLOCK_BITS SHA384_BLOCK_BITS 118#define SHA512224_BLOCK_BITS SHA512_BLOCK_BITS 119#define SHA512256_BLOCK_BITS SHA512_BLOCK_BITS 120 121#define SHA1_DIGEST_BITS 160 122#define SHA224_DIGEST_BITS 224 123#define SHA256_DIGEST_BITS 256 124#define SHA384_DIGEST_BITS 384 125#define SHA512_DIGEST_BITS 512 126#define SHA512224_DIGEST_BITS 224 127#define SHA512256_DIGEST_BITS 256 128 129#define SHA_MAX_BLOCK_BITS SHA512_BLOCK_BITS 130#define SHA_MAX_DIGEST_BITS SHA512_DIGEST_BITS 131#define SHA_MAX_HEX_LEN (SHA_MAX_DIGEST_BITS / 4) 132#define SHA_MAX_BASE64_LEN (1 + (SHA_MAX_DIGEST_BITS / 6)) 133 134#if !defined(SHA64) 135 #define SHA64 SHA32 136#endif 137 138typedef struct SHA { 139 int alg; 140 void (*sha)(struct SHA *, unsigned char *); 141 SHA32 H32[8]; 142 SHA64 H64[8]; 143 unsigned char block[SHA_MAX_BLOCK_BITS/8]; 144 unsigned int blockcnt; 145 unsigned int blocksize; 146 SHA32 lenhh, lenhl, lenlh, lenll; 147 unsigned char digest[SHA_MAX_DIGEST_BITS/8]; 148 unsigned int digestlen; 149 char hex[SHA_MAX_HEX_LEN+1]; 150 char base64[SHA_MAX_BASE64_LEN+1]; 151} SHA; 152 153typedef struct { 154 SHA isha; 155 SHA osha; 156 unsigned int digestlen; 157 unsigned char key[SHA_MAX_BLOCK_BITS/8]; 158} HMAC; 159 160#endif /* _INCLUDE_SHA_H_ */ 161