This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update Digest-SHA to CPAN version 5.97
[perl5.git] / cpan / Digest-SHA / src / sha.h
CommitLineData
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 *
f4f12f2f 6 * Copyright (C) 2003-2017 Mark Shelor, All Rights Reserved
05128928 7 *
f4f12f2f
CBW
8 * Version: 5.97
9 * Wed Sep 6 02:23:02 MST 2017
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
03c6205f
CBW
134#if !defined(SHA64)
135 #define SHA64 SHA32
05128928
NC
136#endif
137
44e8b72c 138typedef struct SHA {
05128928 139 int alg;
44e8b72c 140 void (*sha)(struct SHA *, unsigned char *);
03c6205f
CBW
141 SHA32 H32[8];
142 SHA64 H64[8];
05128928
NC
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];
03c6205f 148 unsigned int digestlen;
05128928
NC
149 char hex[SHA_MAX_HEX_LEN+1];
150 char base64[SHA_MAX_BASE64_LEN+1];
151} SHA;
152
a5b310e3 153typedef struct {
207902b1
CBW
154 SHA isha;
155 SHA osha;
03c6205f 156 unsigned int digestlen;
a5b310e3
CBW
157 unsigned char key[SHA_MAX_BLOCK_BITS/8];
158} HMAC;
05128928
NC
159
160#endif /* _INCLUDE_SHA_H_ */