xref: /rk3399_rockchip-uboot/tools/rockchip/sha2.h (revision 23ba6841ccdaeb51290dc49d4e32f175bd3baa34)
1*23ba6841SJoseph Chen /*
2*23ba6841SJoseph Chen  ---------------------------------------------------------------------------
3*23ba6841SJoseph Chen  Copyright (c) 2002, Dr Brian Gladman <brg@gladman.me.uk>, Worcester, UK.
4*23ba6841SJoseph Chen  All rights reserved.
5*23ba6841SJoseph Chen 
6*23ba6841SJoseph Chen  LICENSE TERMS
7*23ba6841SJoseph Chen 
8*23ba6841SJoseph Chen  The free distribution and use of this software in both source and binary
9*23ba6841SJoseph Chen  form is allowed (with or without changes) provided that:
10*23ba6841SJoseph Chen 
11*23ba6841SJoseph Chen    1. distributions of this source code include the above copyright
12*23ba6841SJoseph Chen       notice, this list of conditions and the following disclaimer;
13*23ba6841SJoseph Chen 
14*23ba6841SJoseph Chen    2. distributions in binary form include the above copyright
15*23ba6841SJoseph Chen       notice, this list of conditions and the following disclaimer
16*23ba6841SJoseph Chen       in the documentation and/or other associated materials;
17*23ba6841SJoseph Chen 
18*23ba6841SJoseph Chen    3. the copyright holder's name is not used to endorse products
19*23ba6841SJoseph Chen       built using this software without specific written permission.
20*23ba6841SJoseph Chen 
21*23ba6841SJoseph Chen  ALTERNATIVELY, provided that this notice is retained in full, this product
22*23ba6841SJoseph Chen  may be distributed under the terms of the GNU General Public License (GPL),
23*23ba6841SJoseph Chen  in which case the provisions of the GPL apply INSTEAD OF those given above.
24*23ba6841SJoseph Chen 
25*23ba6841SJoseph Chen  DISCLAIMER
26*23ba6841SJoseph Chen 
27*23ba6841SJoseph Chen  This software is provided 'as is' with no explicit or implied warranties
28*23ba6841SJoseph Chen  in respect of its properties, including, but not limited to, correctness
29*23ba6841SJoseph Chen  and/or fitness for purpose.
30*23ba6841SJoseph Chen  ---------------------------------------------------------------------------
31*23ba6841SJoseph Chen  Issue Date: 30/11/2002
32*23ba6841SJoseph Chen */
33*23ba6841SJoseph Chen 
34*23ba6841SJoseph Chen #ifndef _SHA2_H
35*23ba6841SJoseph Chen #define _SHA2_H
36*23ba6841SJoseph Chen 
37*23ba6841SJoseph Chen #ifdef USE_HOSTCC
38*23ba6841SJoseph Chen #include <limits.h>
39*23ba6841SJoseph Chen #endif
40*23ba6841SJoseph Chen 
41*23ba6841SJoseph Chen /*  Defines for suffixes to 32 and 64 bit unsigned numeric values   */
42*23ba6841SJoseph Chen 
43*23ba6841SJoseph Chen #define sfx_lo(x,y) x##y
44*23ba6841SJoseph Chen #define sfx_hi(x,y) sfx_lo(x,y)
45*23ba6841SJoseph Chen #define n_u32(p)    sfx_hi(0x##p,s_u32)
46*23ba6841SJoseph Chen #define n_u64(p)    sfx_hi(0x##p,s_u64)
47*23ba6841SJoseph Chen 
48*23ba6841SJoseph Chen #ifdef USE_HOSTCC
49*23ba6841SJoseph Chen /* define an unsigned 32-bit type */
50*23ba6841SJoseph Chen 
51*23ba6841SJoseph Chen #if UINT_MAX == 0xffffffff
52*23ba6841SJoseph Chen typedef   unsigned int     sha2_32t;
53*23ba6841SJoseph Chen #define s_u32    u
54*23ba6841SJoseph Chen #elif ULONG_MAX == 0xffffffff
55*23ba6841SJoseph Chen typedef   unsigned long    sha2_32t;
56*23ba6841SJoseph Chen #define s_u32   ul
57*23ba6841SJoseph Chen #else
58*23ba6841SJoseph Chen #error Please define sha2_32t as an unsigned 32 bit type in sha2.h
59*23ba6841SJoseph Chen #endif
60*23ba6841SJoseph Chen 
61*23ba6841SJoseph Chen /* define an unsigned 64-bit type */
62*23ba6841SJoseph Chen 
63*23ba6841SJoseph Chen #if defined( _MSC_VER )
64*23ba6841SJoseph Chen typedef unsigned __int64   sha2_64t;
65*23ba6841SJoseph Chen #define s_u64 ui64
66*23ba6841SJoseph Chen #elif ULONG_MAX == 0xffffffffffffffff
67*23ba6841SJoseph Chen typedef unsigned long      sha2_64t;
68*23ba6841SJoseph Chen #define s_u64   ul
69*23ba6841SJoseph Chen #elif ULONG_MAX == 0xffffffff
70*23ba6841SJoseph Chen typedef unsigned long long sha2_64t;   /* a somewhat dangerous guess */
71*23ba6841SJoseph Chen #define s_u64  ull
72*23ba6841SJoseph Chen #else
73*23ba6841SJoseph Chen #error Please define sha2_64t as an unsigned 64 bit type in sha2.h
74*23ba6841SJoseph Chen #endif
75*23ba6841SJoseph Chen 
76*23ba6841SJoseph Chen #else
77*23ba6841SJoseph Chen #include <common.h>
78*23ba6841SJoseph Chen 
79*23ba6841SJoseph Chen typedef uint32_t	sha2_32t;
80*23ba6841SJoseph Chen #define s_u32	u
81*23ba6841SJoseph Chen 
82*23ba6841SJoseph Chen typedef uint64_t	sha2_64t;   /* a somewhat dangerous guess */
83*23ba6841SJoseph Chen #define s_u64	ull
84*23ba6841SJoseph Chen #endif /* USE_HOSTCC */
85*23ba6841SJoseph Chen 
86*23ba6841SJoseph Chen #if defined(__cplusplus)
87*23ba6841SJoseph Chen extern "C"
88*23ba6841SJoseph Chen {
89*23ba6841SJoseph Chen #endif
90*23ba6841SJoseph Chen 
91*23ba6841SJoseph Chen #define SHA256_DIGEST_SIZE  32
92*23ba6841SJoseph Chen #define SHA384_DIGEST_SIZE  48
93*23ba6841SJoseph Chen #define SHA512_DIGEST_SIZE  64
94*23ba6841SJoseph Chen 
95*23ba6841SJoseph Chen #define SHA256_BLOCK_SIZE   64
96*23ba6841SJoseph Chen #define SHA384_BLOCK_SIZE  128
97*23ba6841SJoseph Chen #define SHA512_BLOCK_SIZE  128
98*23ba6841SJoseph Chen 
99*23ba6841SJoseph Chen #define SHA2_DIGEST_SIZE        SHA256_DIGEST_SIZE
100*23ba6841SJoseph Chen #define SHA2_MAX_DIGEST_SIZE    SHA512_DIGEST_SIZE
101*23ba6841SJoseph Chen 
102*23ba6841SJoseph Chen #define SHA2_GOOD   0
103*23ba6841SJoseph Chen #define SHA2_BAD    1
104*23ba6841SJoseph Chen 
105*23ba6841SJoseph Chen 	/* type to hold the SHA256 context				*/
106*23ba6841SJoseph Chen 
107*23ba6841SJoseph Chen 	typedef struct {
108*23ba6841SJoseph Chen 		sha2_32t count[2];
109*23ba6841SJoseph Chen 		sha2_32t hash[8];
110*23ba6841SJoseph Chen 		sha2_32t wbuf[16];
111*23ba6841SJoseph Chen 	} sha256_ctx;
112*23ba6841SJoseph Chen 
113*23ba6841SJoseph Chen 	/* type to hold the SHA384/512 context			*/
114*23ba6841SJoseph Chen 
115*23ba6841SJoseph Chen 	typedef struct {
116*23ba6841SJoseph Chen 		sha2_64t count[2];
117*23ba6841SJoseph Chen 		sha2_64t hash[8];
118*23ba6841SJoseph Chen 		sha2_64t wbuf[16];
119*23ba6841SJoseph Chen 	} sha512_ctx;
120*23ba6841SJoseph Chen 
121*23ba6841SJoseph Chen 	typedef sha512_ctx  sha384_ctx;
122*23ba6841SJoseph Chen 
123*23ba6841SJoseph Chen 	/* type to hold a SHA2 context (256/384/512)  */
124*23ba6841SJoseph Chen 
125*23ba6841SJoseph Chen 	typedef struct {
126*23ba6841SJoseph Chen 		union {
127*23ba6841SJoseph Chen 			sha256_ctx  ctx256[1];
128*23ba6841SJoseph Chen 			sha512_ctx  ctx512[1];
129*23ba6841SJoseph Chen 		} uu[1];
130*23ba6841SJoseph Chen 		sha2_32t    sha2_len;
131*23ba6841SJoseph Chen 	} sha2_ctx;
132*23ba6841SJoseph Chen 
133*23ba6841SJoseph Chen 	void sha256_compile(sha256_ctx ctx[1]);
134*23ba6841SJoseph Chen 	void sha512_compile(sha512_ctx ctx[1]);
135*23ba6841SJoseph Chen 
136*23ba6841SJoseph Chen 	void sha256_begin(sha256_ctx ctx[1]);
137*23ba6841SJoseph Chen 	void sha256_hash(sha256_ctx ctx[1], const unsigned char data[], unsigned long len);
138*23ba6841SJoseph Chen 	void sha256_end(sha256_ctx ctx[1], unsigned char hval[]);
139*23ba6841SJoseph Chen 	void sha256(unsigned char hval[], const unsigned char data[], unsigned long len);
140*23ba6841SJoseph Chen 
141*23ba6841SJoseph Chen 	void sha384_begin(sha384_ctx ctx[1]);
142*23ba6841SJoseph Chen #define sha384_hash sha512_hash
143*23ba6841SJoseph Chen 	void sha384_end(sha384_ctx ctx[1], unsigned char hval[]);
144*23ba6841SJoseph Chen 	void sha384(unsigned char hval[], const unsigned char data[], unsigned long len);
145*23ba6841SJoseph Chen 
146*23ba6841SJoseph Chen 	void sha512_begin(sha512_ctx ctx[1]);
147*23ba6841SJoseph Chen 	void sha512_hash(sha512_ctx ctx[1], const unsigned char data[], unsigned long len);
148*23ba6841SJoseph Chen 	void sha512_end(sha512_ctx ctx[1], unsigned char hval[]);
149*23ba6841SJoseph Chen 	void sha512(unsigned char hval[], const unsigned char data[], unsigned long len);
150*23ba6841SJoseph Chen 
151*23ba6841SJoseph Chen 	int sha2_begin(sha2_ctx ctx[1], unsigned long size);
152*23ba6841SJoseph Chen 	void sha2_hash(sha2_ctx ctx[1], const unsigned char data[], unsigned long len);
153*23ba6841SJoseph Chen 	void sha2_end(sha2_ctx ctx[1], unsigned char hval[]);
154*23ba6841SJoseph Chen 	int sha2(unsigned char hval[], unsigned long size, const unsigned char data[], unsigned long len);
155*23ba6841SJoseph Chen 
156*23ba6841SJoseph Chen #if defined(__cplusplus)
157*23ba6841SJoseph Chen }
158*23ba6841SJoseph Chen #endif
159*23ba6841SJoseph Chen 
160*23ba6841SJoseph Chen 
161*23ba6841SJoseph Chen #endif
162