Commit | Line | Data |
05128928 |
1 | /* |
2 | * sha.h: header file for SHA-1/224/256/384/512 routines |
3 | * |
4 | * Ref: NIST FIPS PUB 180-2 Secure Hash Standard |
5 | * |
77d2a621 |
6 | * Copyright (C) 2003-2006 Mark Shelor, All Rights Reserved |
05128928 |
7 | * |
c7e5c266 |
8 | * Version: 5.38 |
9 | * Thu May 25 02:02:02 MST 2006 |
05128928 |
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 |
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 |
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 | /* |
106 | * SHA_STO_CLASS: default to auto storage class for message schedule |
107 | * arrays inside transform routines. Note that redefining this to |
108 | * static might improve performance on some platforms (e.g. Intel). |
109 | */ |
110 | |
111 | #if !defined(SHA_STO_CLASS) |
112 | #define SHA_STO_CLASS auto |
113 | #endif |
114 | |
115 | /* Override use of static arrays if compiling for thread-safety */ |
116 | #ifdef SHA_THREAD_SAFE |
117 | #undef SHA_STO_CLASS |
118 | #define SHA_STO_CLASS auto |
119 | #endif |
120 | |
121 | /* Configure memory management and I/O for Perl or standalone C */ |
122 | #ifdef SHA_PERL_MODULE |
123 | #define SHA_new New |
124 | #define SHA_newz Newz |
125 | #define SHA_free Safefree |
126 | #define SHA_FILE PerlIO |
127 | #define SHA_stdin() PerlIO_stdin() |
128 | #define SHA_stdout() PerlIO_stdout() |
129 | #define SHA_open PerlIO_open |
130 | #define SHA_close PerlIO_close |
131 | #define SHA_fprintf PerlIO_printf |
132 | #define SHA_feof PerlIO_eof |
133 | #define SHA_getc PerlIO_getc |
134 | #else |
135 | #define SHA_new(id, p, n, t) p = (t *) malloc(sizeof(t)) |
136 | #define SHA_newz(id, p, n, t) p = (t *) calloc(n, sizeof(t)) |
137 | #define SHA_free free |
138 | #define SHA_FILE FILE |
139 | #define SHA_stdin() stdin |
140 | #define SHA_stdout() stdout |
141 | #define SHA_open fopen |
142 | #define SHA_close fclose |
143 | #define SHA_fprintf fprintf |
144 | #define SHA_feof feof |
145 | #define SHA_getc fgetc |
146 | #endif |
147 | |
148 | #define SHA1 1 |
149 | #define SHA224 224 |
150 | #define SHA256 256 |
151 | #define SHA384 384 |
152 | #define SHA512 512 |
153 | |
154 | #define SHA1_BLOCK_BITS 512 |
155 | #define SHA224_BLOCK_BITS SHA1_BLOCK_BITS |
156 | #define SHA256_BLOCK_BITS SHA1_BLOCK_BITS |
157 | #define SHA384_BLOCK_BITS 1024 |
158 | #define SHA512_BLOCK_BITS SHA384_BLOCK_BITS |
159 | |
160 | #define SHA1_DIGEST_BITS 160 |
161 | #define SHA224_DIGEST_BITS 224 |
162 | #define SHA256_DIGEST_BITS 256 |
163 | #define SHA384_DIGEST_BITS 384 |
164 | #define SHA512_DIGEST_BITS 512 |
165 | |
166 | #define SHA_MAX_BLOCK_BITS SHA512_BLOCK_BITS |
167 | #define SHA_MAX_DIGEST_BITS SHA512_DIGEST_BITS |
168 | #define SHA_MAX_HEX_LEN (SHA_MAX_DIGEST_BITS / 4) |
169 | #define SHA_MAX_BASE64_LEN (1 + (SHA_MAX_DIGEST_BITS / 6)) |
170 | |
171 | #if defined(SHA64) |
172 | #define SHA_H_SIZE sizeof(SHA64) * 8 |
173 | #else |
174 | #define SHA_H_SIZE sizeof(SHA32) * 8 |
175 | #endif |
176 | |
177 | typedef struct { |
178 | int alg; |
179 | void (*sha)(); |
180 | unsigned char H[SHA_H_SIZE]; |
181 | unsigned char block[SHA_MAX_BLOCK_BITS/8]; |
182 | unsigned int blockcnt; |
183 | unsigned int blocksize; |
184 | SHA32 lenhh, lenhl, lenlh, lenll; |
185 | unsigned char digest[SHA_MAX_DIGEST_BITS/8]; |
186 | int digestlen; |
187 | char hex[SHA_MAX_HEX_LEN+1]; |
188 | char base64[SHA_MAX_BASE64_LEN+1]; |
189 | } SHA; |
190 | |
191 | #define SHA_FMT_RAW 1 |
192 | #define SHA_FMT_HEX 2 |
193 | #define SHA_FMT_BASE64 3 |
194 | |
195 | #if defined(__STDC__) && __STDC__ != 0 |
196 | #define _SHA_P(protos) protos |
197 | #else |
198 | #define _SHA_P(protos) () |
199 | #endif |
200 | |
201 | #define _SHA_STATE SHA *s |
202 | #define _SHA_ALG int alg |
203 | #define _SHA_DATA unsigned char *bitstr, unsigned long bitcnt |
204 | #define _SHA_FNAME char *filename |
205 | |
206 | SHA *shaopen _SHA_P((_SHA_ALG)); |
207 | unsigned long shawrite _SHA_P((_SHA_DATA, _SHA_STATE)); |
208 | void shafinish _SHA_P((_SHA_STATE)); |
209 | void sharewind _SHA_P((_SHA_STATE)); |
210 | unsigned char *shadigest _SHA_P((_SHA_STATE)); |
211 | char *shahex _SHA_P((_SHA_STATE)); |
212 | char *shabase64 _SHA_P((_SHA_STATE)); |
213 | int shadsize _SHA_P((_SHA_STATE)); |
214 | SHA *shadup _SHA_P((_SHA_STATE)); |
215 | int shadump _SHA_P((_SHA_FNAME, _SHA_STATE)); |
216 | SHA *shaload _SHA_P((_SHA_FNAME)); |
217 | int shaclose _SHA_P((_SHA_STATE)); |
218 | |
219 | unsigned char *sha1digest _SHA_P((_SHA_DATA)); |
220 | char *sha1hex _SHA_P((_SHA_DATA)); |
221 | char *sha1base64 _SHA_P((_SHA_DATA)); |
222 | unsigned char *sha224digest _SHA_P((_SHA_DATA)); |
223 | char *sha224hex _SHA_P((_SHA_DATA)); |
224 | char *sha224base64 _SHA_P((_SHA_DATA)); |
225 | unsigned char *sha256digest _SHA_P((_SHA_DATA)); |
226 | char *sha256hex _SHA_P((_SHA_DATA)); |
227 | char *sha256base64 _SHA_P((_SHA_DATA)); |
228 | unsigned char *sha384digest _SHA_P((_SHA_DATA)); |
229 | char *sha384hex _SHA_P((_SHA_DATA)); |
230 | char *sha384base64 _SHA_P((_SHA_DATA)); |
231 | unsigned char *sha512digest _SHA_P((_SHA_DATA)); |
232 | char *sha512hex _SHA_P((_SHA_DATA)); |
233 | char *sha512base64 _SHA_P((_SHA_DATA)); |
234 | |
235 | #endif /* _INCLUDE_SHA_H_ */ |