Commit | Line | Data |
---|---|---|
05128928 NC |
1 | /* |
2 | * sha.h: header file for SHA-1/224/256/384/512 routines | |
3 | * | |
626ec6d7 | 4 | * Ref: NIST FIPS PUB 180-4 Secure Hash Standard |
05128928 | 5 | * |
e80e3195 | 6 | * Copyright (C) 2003-2014 Mark Shelor, All Rights Reserved |
05128928 | 7 | * |
207902b1 CBW |
8 | * Version: 5.92 |
9 | * Sun Jun 1 00:15:44 MST 2014 | |
05128928 NC |
10 | * |
11 | */ | |
12 | ||
13 | #ifndef _INCLUDE_SHA_H_ | |
14 | #define _INCLUDE_SHA_H_ | |
15 | ||
16 | #include <limits.h> | |
17 | ||
18 | #define SHA32_MAX 4294967295U | |
05128928 NC |
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 | |
128cbdba | 63 | #define SHA64_MAX 18446744073709551615ULL |
05128928 NC |
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) | |
207902b1 | 82 | #define SHA32_SCHED(W, b) Copy(b, W, 64, char) |
05128928 NC |
83 | #endif |
84 | #if defined(SHA64) && defined(SHA64_ALIGNED) | |
207902b1 | 85 | #define SHA64_SCHED(W, b) Copy(b, W, 128, char) |
05128928 NC |
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 | ||
65484cb9 CBW |
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 | |
05128928 NC |
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 | |
65484cb9 CBW |
118 | #define SHA512224_BLOCK_BITS SHA512_BLOCK_BITS |
119 | #define SHA512256_BLOCK_BITS SHA512_BLOCK_BITS | |
05128928 NC |
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 | |
65484cb9 CBW |
126 | #define SHA512224_DIGEST_BITS 224 |
127 | #define SHA512256_DIGEST_BITS 256 | |
05128928 NC |
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 SHA_H_SIZE sizeof(SHA64) * 8 | |
136 | #else | |
137 | #define SHA_H_SIZE sizeof(SHA32) * 8 | |
138 | #endif | |
139 | ||
44e8b72c | 140 | typedef struct SHA { |
05128928 | 141 | int alg; |
44e8b72c | 142 | void (*sha)(struct SHA *, unsigned char *); |
05128928 NC |
143 | unsigned char H[SHA_H_SIZE]; |
144 | unsigned char block[SHA_MAX_BLOCK_BITS/8]; | |
145 | unsigned int blockcnt; | |
146 | unsigned int blocksize; | |
147 | SHA32 lenhh, lenhl, lenlh, lenll; | |
148 | unsigned char digest[SHA_MAX_DIGEST_BITS/8]; | |
149 | int digestlen; | |
150 | char hex[SHA_MAX_HEX_LEN+1]; | |
151 | char base64[SHA_MAX_BASE64_LEN+1]; | |
152 | } SHA; | |
153 | ||
a5b310e3 | 154 | typedef struct { |
207902b1 CBW |
155 | SHA isha; |
156 | SHA osha; | |
157 | int digestlen; | |
a5b310e3 CBW |
158 | unsigned char key[SHA_MAX_BLOCK_BITS/8]; |
159 | } HMAC; | |
05128928 NC |
160 | |
161 | #endif /* _INCLUDE_SHA_H_ */ |