This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
cb7610ff435622617a395c27090890be17160785
[perl5.git] / cpan / Digest-SHA / src / sha.h
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  *
6  * Copyright (C) 2003-2011 Mark Shelor, All Rights Reserved
7  *
8  * Version: 5.61
9  * Wed Mar  9 05:26:36 MST 2011
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 /*
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 #define SHA512224       512224
154 #define SHA512256       512256
155
156 #define SHA1_BLOCK_BITS         512
157 #define SHA224_BLOCK_BITS       SHA1_BLOCK_BITS
158 #define SHA256_BLOCK_BITS       SHA1_BLOCK_BITS
159 #define SHA384_BLOCK_BITS       1024
160 #define SHA512_BLOCK_BITS       SHA384_BLOCK_BITS
161 #define SHA512224_BLOCK_BITS    SHA512_BLOCK_BITS
162 #define SHA512256_BLOCK_BITS    SHA512_BLOCK_BITS
163
164 #define SHA1_DIGEST_BITS        160
165 #define SHA224_DIGEST_BITS      224
166 #define SHA256_DIGEST_BITS      256
167 #define SHA384_DIGEST_BITS      384
168 #define SHA512_DIGEST_BITS      512
169 #define SHA512224_DIGEST_BITS   224
170 #define SHA512256_DIGEST_BITS   256
171
172 #define SHA_MAX_BLOCK_BITS      SHA512_BLOCK_BITS
173 #define SHA_MAX_DIGEST_BITS     SHA512_DIGEST_BITS
174 #define SHA_MAX_HEX_LEN         (SHA_MAX_DIGEST_BITS / 4)
175 #define SHA_MAX_BASE64_LEN      (1 + (SHA_MAX_DIGEST_BITS / 6))
176
177 #if defined(SHA64)
178         #define SHA_H_SIZE      sizeof(SHA64) * 8
179 #else
180         #define SHA_H_SIZE      sizeof(SHA32) * 8
181 #endif
182
183 typedef struct SHA {
184         int alg;
185         void (*sha)(struct SHA *, unsigned char *);
186         unsigned char H[SHA_H_SIZE];
187         unsigned char block[SHA_MAX_BLOCK_BITS/8];
188         unsigned int blockcnt;
189         unsigned int blocksize;
190         SHA32 lenhh, lenhl, lenlh, lenll;
191         unsigned char digest[SHA_MAX_DIGEST_BITS/8];
192         int digestlen;
193         char hex[SHA_MAX_HEX_LEN+1];
194         char base64[SHA_MAX_BASE64_LEN+1];
195 } SHA;
196
197 #define SHA_FMT_RAW 1
198 #define SHA_FMT_HEX 2
199 #define SHA_FMT_BASE64 3
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_ALG);
207 unsigned long    shawrite       (_SHA_DATA, _SHA_STATE);
208 void             shafinish      (_SHA_STATE);
209 void             sharewind      (_SHA_STATE);
210 unsigned char   *shadigest      (_SHA_STATE);
211 char            *shahex         (_SHA_STATE);
212 char            *shabase64      (_SHA_STATE);
213 int              shadsize       (_SHA_STATE);
214 int              shaalg         (_SHA_STATE);
215 SHA             *shadup         (_SHA_STATE);
216 int              shadump        (_SHA_FNAME, _SHA_STATE);
217 SHA             *shaload        (_SHA_FNAME);
218 int              shaclose       (_SHA_STATE);
219
220 #ifndef SHA_PERL_MODULE
221
222 unsigned char   *sha1digest             (_SHA_DATA);
223 char            *sha1hex                (_SHA_DATA);
224 char            *sha1base64             (_SHA_DATA);
225 unsigned char   *sha224digest           (_SHA_DATA);
226 char            *sha224hex              (_SHA_DATA);
227 char            *sha224base64           (_SHA_DATA);
228 unsigned char   *sha256digest           (_SHA_DATA);
229 char            *sha256hex              (_SHA_DATA);
230 char            *sha256base64           (_SHA_DATA);
231 unsigned char   *sha384digest           (_SHA_DATA);
232 char            *sha384hex              (_SHA_DATA);
233 char            *sha384base64           (_SHA_DATA);
234 unsigned char   *sha512digest           (_SHA_DATA);
235 char            *sha512hex              (_SHA_DATA);
236 char            *sha512base64           (_SHA_DATA);
237 unsigned char   *sha512224digest        (_SHA_DATA);
238 char            *sha512224hex           (_SHA_DATA);
239 char            *sha512224base64        (_SHA_DATA);
240 unsigned char   *sha512256digest        (_SHA_DATA);
241 char            *sha512256hex           (_SHA_DATA);
242 char            *sha512256base64        (_SHA_DATA);
243
244 #endif
245
246 #endif  /* _INCLUDE_SHA_H_ */