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-2014 Mark Shelor, All Rights Reserved 7 * 8 * Version: 5.88 9 * Mon Mar 17 08:46:10 MST 2014 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) memcpy(W, b, 64) 83 #endif 84 #if defined(SHA64) && defined(SHA64_ALIGNED) 85 #define SHA64_SCHED(W, b) memcpy(W, b, 128) 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 SHA_new New 106 #define SHA_newz Newz 107 #define SHA_free Safefree 108 109 #define SHA1 1 110 #define SHA224 224 111 #define SHA256 256 112 #define SHA384 384 113 #define SHA512 512 114 #define SHA512224 512224 115 #define SHA512256 512256 116 117 #define SHA1_BLOCK_BITS 512 118 #define SHA224_BLOCK_BITS SHA1_BLOCK_BITS 119 #define SHA256_BLOCK_BITS SHA1_BLOCK_BITS 120 #define SHA384_BLOCK_BITS 1024 121 #define SHA512_BLOCK_BITS SHA384_BLOCK_BITS 122 #define SHA512224_BLOCK_BITS SHA512_BLOCK_BITS 123 #define SHA512256_BLOCK_BITS SHA512_BLOCK_BITS 124 125 #define SHA1_DIGEST_BITS 160 126 #define SHA224_DIGEST_BITS 224 127 #define SHA256_DIGEST_BITS 256 128 #define SHA384_DIGEST_BITS 384 129 #define SHA512_DIGEST_BITS 512 130 #define SHA512224_DIGEST_BITS 224 131 #define SHA512256_DIGEST_BITS 256 132 133 #define SHA_MAX_BLOCK_BITS SHA512_BLOCK_BITS 134 #define SHA_MAX_DIGEST_BITS SHA512_DIGEST_BITS 135 #define SHA_MAX_HEX_LEN (SHA_MAX_DIGEST_BITS / 4) 136 #define SHA_MAX_BASE64_LEN (1 + (SHA_MAX_DIGEST_BITS / 6)) 137 138 #if defined(SHA64) 139 #define SHA_H_SIZE sizeof(SHA64) * 8 140 #else 141 #define SHA_H_SIZE sizeof(SHA32) * 8 142 #endif 143 144 typedef struct SHA { 145 int alg; 146 void (*sha)(struct SHA *, unsigned char *); 147 unsigned char H[SHA_H_SIZE]; 148 unsigned char block[SHA_MAX_BLOCK_BITS/8]; 149 unsigned int blockcnt; 150 unsigned int blocksize; 151 SHA32 lenhh, lenhl, lenlh, lenll; 152 unsigned char digest[SHA_MAX_DIGEST_BITS/8]; 153 int digestlen; 154 char hex[SHA_MAX_HEX_LEN+1]; 155 char base64[SHA_MAX_BASE64_LEN+1]; 156 } SHA; 157 158 typedef struct { 159 SHA *ksha; 160 SHA *isha; 161 SHA *osha; 162 unsigned char key[SHA_MAX_BLOCK_BITS/8]; 163 } HMAC; 164 165 #endif /* _INCLUDE_SHA_H_ */ 166