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 138 typedef 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 153 typedef 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