xref: /src/crypto/libecc/include/libecc/hash/sha2.h (revision f0865ec9906d5a18fa2a3b61381f22ce16e606ad)
1736d6639SKyle Evans /*
2736d6639SKyle Evans  *  Copyright (C) 2017 - This file is part of libecc project
3736d6639SKyle Evans  *
4736d6639SKyle Evans  *  Authors:
5736d6639SKyle Evans  *      Ryad BENADJILA <ryadbenadjila@gmail.com>
6736d6639SKyle Evans  *      Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr>
7736d6639SKyle Evans  *      Jean-Pierre FLORI <jean-pierre.flori@ssi.gouv.fr>
8736d6639SKyle Evans  *
9736d6639SKyle Evans  *  Contributors:
10736d6639SKyle Evans  *      Nicolas VIVET <nicolas.vivet@ssi.gouv.fr>
11736d6639SKyle Evans  *      Karim KHALFALLAH <karim.khalfallah@ssi.gouv.fr>
12736d6639SKyle Evans  *
13736d6639SKyle Evans  *  This software is licensed under a dual BSD and GPL v2 license.
14736d6639SKyle Evans  *  See LICENSE file at the root folder of the project.
15736d6639SKyle Evans  */
16736d6639SKyle Evans #ifndef __SHA2_H__
17736d6639SKyle Evans #define __SHA2_H__
18736d6639SKyle Evans 
19736d6639SKyle Evans #include <libecc/words/words.h>
20736d6639SKyle Evans 
21736d6639SKyle Evans /* Useful primitives for handling 128-bit */
22736d6639SKyle Evans 
23736d6639SKyle Evans /* Add a 128-bit to a 64-bit element and store the result
24736d6639SKyle Evans  * in the input
25736d6639SKyle Evans  */
26736d6639SKyle Evans #define ADD_UINT128_UINT64(low,high,toadd) do {\
27736d6639SKyle Evans 	(low) += (toadd);\
28736d6639SKyle Evans 	if((low) < (toadd)){\
29736d6639SKyle Evans 		(high)++;\
30736d6639SKyle Evans 	}\
31736d6639SKyle Evans } while(0)
32736d6639SKyle Evans 
33736d6639SKyle Evans /* Store a 128-bit element in big endian format */
34736d6639SKyle Evans #define PUT_UINT128_BE(low,high,b,i) do {\
35736d6639SKyle Evans 	PUT_UINT64_BE((high), (b), (i));\
36736d6639SKyle Evans 	PUT_UINT64_BE((low), (b), (i)+8);\
37736d6639SKyle Evans } while(0)
38736d6639SKyle Evans 
39736d6639SKyle Evans /* Multiply a 128-bit element by 8 and store it in big endian
40736d6639SKyle Evans  * format
41736d6639SKyle Evans  */
42736d6639SKyle Evans #define PUT_MUL8_UINT128_BE(low,high,b,i) do {\
43736d6639SKyle Evans 	u64 reslow, reshigh;\
44736d6639SKyle Evans 	reslow = (low) << 3;\
45736d6639SKyle Evans 	reshigh = ((low) >> 61) ^ ((high) << 3);\
46736d6639SKyle Evans 	PUT_UINT128_BE(reslow,reshigh,(b),(i));\
47736d6639SKyle Evans } while(0)
48736d6639SKyle Evans 
49736d6639SKyle Evans /*
50736d6639SKyle Evans  * 32-bit integer manipulation macros (big endian)
51736d6639SKyle Evans  */
52736d6639SKyle Evans #ifndef GET_UINT32_BE
53736d6639SKyle Evans #define GET_UINT32_BE(n, b, i)				\
54736d6639SKyle Evans do {							\
55736d6639SKyle Evans 	(n) =     ( ((u32) (b)[(i)	   ]) << 24 )	\
56736d6639SKyle Evans 		| ( ((u32) (b)[(i) + 1]) << 16 )	\
57736d6639SKyle Evans 		| ( ((u32) (b)[(i) + 2]) <<  8 )	\
58736d6639SKyle Evans 		| ( ((u32) (b)[(i) + 3])       );	\
59736d6639SKyle Evans } while( 0 )
60736d6639SKyle Evans #endif
61736d6639SKyle Evans 
62736d6639SKyle Evans #ifndef PUT_UINT32_BE
63736d6639SKyle Evans #define PUT_UINT32_BE(n, b, i)			\
64736d6639SKyle Evans do {						\
65736d6639SKyle Evans 	(b)[(i)    ] = (u8) ( (n) >> 24 );	\
66736d6639SKyle Evans 	(b)[(i) + 1] = (u8) ( (n) >> 16 );	\
67736d6639SKyle Evans 	(b)[(i) + 2] = (u8) ( (n) >>  8 );	\
68736d6639SKyle Evans 	(b)[(i) + 3] = (u8) ( (n)       );	\
69736d6639SKyle Evans } while( 0 )
70736d6639SKyle Evans #endif
71736d6639SKyle Evans 
72736d6639SKyle Evans /*
73736d6639SKyle Evans  * 64-bit integer manipulation macros (big endian)
74736d6639SKyle Evans  */
75736d6639SKyle Evans #ifndef GET_UINT64_BE
76736d6639SKyle Evans #define GET_UINT64_BE(n,b,i)				\
77736d6639SKyle Evans do {							\
78736d6639SKyle Evans     (n) = ( ((u64) (b)[(i)	   ]) << 56 )		\
79736d6639SKyle Evans 	| ( ((u64) (b)[(i) + 1]) << 48 )		\
80736d6639SKyle Evans 	| ( ((u64) (b)[(i) + 2]) << 40 )		\
81736d6639SKyle Evans 	| ( ((u64) (b)[(i) + 3]) << 32 )		\
82736d6639SKyle Evans 	| ( ((u64) (b)[(i) + 4]) << 24 )		\
83736d6639SKyle Evans 	| ( ((u64) (b)[(i) + 5]) << 16 )		\
84736d6639SKyle Evans 	| ( ((u64) (b)[(i) + 6]) <<  8 )		\
85736d6639SKyle Evans 	| ( ((u64) (b)[(i) + 7])	    );		\
86736d6639SKyle Evans } while( 0 )
87736d6639SKyle Evans #endif /* GET_UINT64_BE */
88736d6639SKyle Evans 
89736d6639SKyle Evans #ifndef PUT_UINT64_BE
90736d6639SKyle Evans #define PUT_UINT64_BE(n,b,i)		\
91736d6639SKyle Evans do {					\
92736d6639SKyle Evans     (b)[(i)    ] = (u8) ( (n) >> 56 );	\
93736d6639SKyle Evans     (b)[(i) + 1] = (u8) ( (n) >> 48 );	\
94736d6639SKyle Evans     (b)[(i) + 2] = (u8) ( (n) >> 40 );	\
95736d6639SKyle Evans     (b)[(i) + 3] = (u8) ( (n) >> 32 );	\
96736d6639SKyle Evans     (b)[(i) + 4] = (u8) ( (n) >> 24 );	\
97736d6639SKyle Evans     (b)[(i) + 5] = (u8) ( (n) >> 16 );	\
98736d6639SKyle Evans     (b)[(i) + 6] = (u8) ( (n) >>  8 );	\
99736d6639SKyle Evans     (b)[(i) + 7] = (u8) ( (n)       );	\
100736d6639SKyle Evans } while( 0 )
101736d6639SKyle Evans #endif /* PUT_UINT64_BE */
102736d6639SKyle Evans 
103736d6639SKyle Evans /* Useful macros for the SHA-2 core function  */
104736d6639SKyle Evans #define CH(x, y, z)	(((x) & (y)) ^ ((~(x)) & (z)))
105736d6639SKyle Evans #define MAJ(x, y, z)	(((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
106736d6639SKyle Evans 
107736d6639SKyle Evans #define UPDATEW(w, i, sha_type) ((w)[(i)] = SIGMA_MIN1_##sha_type((w)[(i)-2]) + (w)[(i)-7] + SIGMA_MIN0_##sha_type((w)[(i)-15]) + (w)[(i)-16])
108736d6639SKyle Evans 
109736d6639SKyle Evans #define SHA2CORE(a, b, c, d, e, f, g, h, w, k, sha_word_type, sha_type) do {\
110736d6639SKyle Evans 	sha_word_type t1, t2;\
111736d6639SKyle Evans 	t1 = (h) + SIGMA_MAJ1_##sha_type((e)) + CH((e), (f), (g)) + (k) + (w);\
112736d6639SKyle Evans 	t2 = SIGMA_MAJ0_##sha_type((a)) + MAJ((a), (b), (c));\
113736d6639SKyle Evans 	(h) = (g);\
114736d6639SKyle Evans 	(g) = (f);\
115736d6639SKyle Evans 	(f) = (e);\
116736d6639SKyle Evans 	(e) = (d) + t1;\
117736d6639SKyle Evans 	(d) = (c);\
118736d6639SKyle Evans 	(c) = (b);\
119736d6639SKyle Evans 	(b) = (a);\
120736d6639SKyle Evans 	(a) = t1 + t2;\
121736d6639SKyle Evans } while(0)
122736d6639SKyle Evans 
123736d6639SKyle Evans #if (defined(WITH_HASH_SHA224) || defined(WITH_HASH_SHA256))
124736d6639SKyle Evans 
125736d6639SKyle Evans /**********************************************/
126736d6639SKyle Evans 
127736d6639SKyle Evans /* SHA-224 and SHA-256 */
128736d6639SKyle Evans #define SHR_SHA256(x, n)       (((u32)(x)) >> (n))
129736d6639SKyle Evans #define ROTR_SHA256(x, n)      ((((u32)(x)) >> (n)) | (((u32)(x)) << (32-(n))))
130736d6639SKyle Evans #define SIGMA_MAJ0_SHA256(x)   (ROTR_SHA256(x, 2)  ^ ROTR_SHA256(x, 13) ^ ROTR_SHA256(x, 22))
131736d6639SKyle Evans #define SIGMA_MAJ1_SHA256(x)   (ROTR_SHA256(x, 6)  ^ ROTR_SHA256(x, 11) ^ ROTR_SHA256(x, 25))
132736d6639SKyle Evans #define SIGMA_MIN0_SHA256(x)   (ROTR_SHA256(x, 7)  ^ ROTR_SHA256(x, 18) ^ SHR_SHA256(x, 3))
133736d6639SKyle Evans #define SIGMA_MIN1_SHA256(x)   (ROTR_SHA256(x, 17) ^ ROTR_SHA256(x, 19) ^ SHR_SHA256(x, 10))
134736d6639SKyle Evans #define SHA2CORE_SHA256(a, b, c, d, e, f, g, h, w, k) \
135736d6639SKyle Evans 	SHA2CORE(a, b, c, d, e, f, g, h, w, k, u32, SHA256)
136736d6639SKyle Evans #define UPDATEW_SHA256(w, i) UPDATEW(w, i, SHA256)
137736d6639SKyle Evans static const u32 K_SHA256[] = {
138736d6639SKyle Evans 	0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
139736d6639SKyle Evans 	0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
140736d6639SKyle Evans 	0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
141736d6639SKyle Evans 	0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
142736d6639SKyle Evans 	0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
143736d6639SKyle Evans 	0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
144736d6639SKyle Evans 	0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
145736d6639SKyle Evans 	0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
146736d6639SKyle Evans 	0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
147736d6639SKyle Evans 	0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
148736d6639SKyle Evans 	0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
149736d6639SKyle Evans 	0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
150736d6639SKyle Evans 	0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
151736d6639SKyle Evans 	0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
152736d6639SKyle Evans 	0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
153736d6639SKyle Evans 	0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
154736d6639SKyle Evans };
155736d6639SKyle Evans 
156736d6639SKyle Evans /**********************************************/
157736d6639SKyle Evans #endif
158736d6639SKyle Evans 
159736d6639SKyle Evans #if (defined(WITH_HASH_SHA384) || defined(WITH_HASH_SHA512))
160736d6639SKyle Evans 
161736d6639SKyle Evans /**********************************************/
162736d6639SKyle Evans 
163736d6639SKyle Evans /* SHA-384 and SHA-512 */
164736d6639SKyle Evans #define SHR_SHA512(x, n)       (((u64)(x)) >> (n))
165736d6639SKyle Evans #define ROTR_SHA512(x, n)      ((((u64)(x)) >> (n)) | (((u64)(x)) << (64-(n))))
166736d6639SKyle Evans #define SIGMA_MAJ0_SHA512(x)   (ROTR_SHA512(x, 28) ^ ROTR_SHA512(x, 34) ^ ROTR_SHA512(x, 39))
167736d6639SKyle Evans #define SIGMA_MAJ1_SHA512(x)   (ROTR_SHA512(x, 14) ^ ROTR_SHA512(x, 18) ^ ROTR_SHA512(x, 41))
168736d6639SKyle Evans #define SIGMA_MIN0_SHA512(x)   (ROTR_SHA512(x, 1)  ^ ROTR_SHA512(x, 8)	^ SHR_SHA512(x, 7))
169736d6639SKyle Evans #define SIGMA_MIN1_SHA512(x)   (ROTR_SHA512(x, 19) ^ ROTR_SHA512(x, 61) ^ SHR_SHA512(x, 6))
170736d6639SKyle Evans #define SHA2CORE_SHA512(a, b, c, d, e, f, g, h, w, k) \
171736d6639SKyle Evans 	SHA2CORE(a, b, c, d, e, f, g, h, w, k, u64, SHA512)
172736d6639SKyle Evans #define UPDATEW_SHA512(w, i) UPDATEW(w, i, SHA512)
173736d6639SKyle Evans static const u64 K_SHA512[] = {
174736d6639SKyle Evans 	(u64)(0x428A2F98D728AE22), (u64)(0x7137449123EF65CD),
175736d6639SKyle Evans 	(u64)(0xB5C0FBCFEC4D3B2F), (u64)(0xE9B5DBA58189DBBC),
176736d6639SKyle Evans 	(u64)(0x3956C25BF348B538), (u64)(0x59F111F1B605D019),
177736d6639SKyle Evans 	(u64)(0x923F82A4AF194F9B), (u64)(0xAB1C5ED5DA6D8118),
178736d6639SKyle Evans 	(u64)(0xD807AA98A3030242), (u64)(0x12835B0145706FBE),
179736d6639SKyle Evans 	(u64)(0x243185BE4EE4B28C), (u64)(0x550C7DC3D5FFB4E2),
180736d6639SKyle Evans 	(u64)(0x72BE5D74F27B896F), (u64)(0x80DEB1FE3B1696B1),
181736d6639SKyle Evans 	(u64)(0x9BDC06A725C71235), (u64)(0xC19BF174CF692694),
182736d6639SKyle Evans 	(u64)(0xE49B69C19EF14AD2), (u64)(0xEFBE4786384F25E3),
183736d6639SKyle Evans 	(u64)(0x0FC19DC68B8CD5B5), (u64)(0x240CA1CC77AC9C65),
184736d6639SKyle Evans 	(u64)(0x2DE92C6F592B0275), (u64)(0x4A7484AA6EA6E483),
185736d6639SKyle Evans 	(u64)(0x5CB0A9DCBD41FBD4), (u64)(0x76F988DA831153B5),
186736d6639SKyle Evans 	(u64)(0x983E5152EE66DFAB), (u64)(0xA831C66D2DB43210),
187736d6639SKyle Evans 	(u64)(0xB00327C898FB213F), (u64)(0xBF597FC7BEEF0EE4),
188736d6639SKyle Evans 	(u64)(0xC6E00BF33DA88FC2), (u64)(0xD5A79147930AA725),
189736d6639SKyle Evans 	(u64)(0x06CA6351E003826F), (u64)(0x142929670A0E6E70),
190736d6639SKyle Evans 	(u64)(0x27B70A8546D22FFC), (u64)(0x2E1B21385C26C926),
191736d6639SKyle Evans 	(u64)(0x4D2C6DFC5AC42AED), (u64)(0x53380D139D95B3DF),
192736d6639SKyle Evans 	(u64)(0x650A73548BAF63DE), (u64)(0x766A0ABB3C77B2A8),
193736d6639SKyle Evans 	(u64)(0x81C2C92E47EDAEE6), (u64)(0x92722C851482353B),
194736d6639SKyle Evans 	(u64)(0xA2BFE8A14CF10364), (u64)(0xA81A664BBC423001),
195736d6639SKyle Evans 	(u64)(0xC24B8B70D0F89791), (u64)(0xC76C51A30654BE30),
196736d6639SKyle Evans 	(u64)(0xD192E819D6EF5218), (u64)(0xD69906245565A910),
197736d6639SKyle Evans 	(u64)(0xF40E35855771202A), (u64)(0x106AA07032BBD1B8),
198736d6639SKyle Evans 	(u64)(0x19A4C116B8D2D0C8), (u64)(0x1E376C085141AB53),
199736d6639SKyle Evans 	(u64)(0x2748774CDF8EEB99), (u64)(0x34B0BCB5E19B48A8),
200736d6639SKyle Evans 	(u64)(0x391C0CB3C5C95A63), (u64)(0x4ED8AA4AE3418ACB),
201736d6639SKyle Evans 	(u64)(0x5B9CCA4F7763E373), (u64)(0x682E6FF3D6B2B8A3),
202736d6639SKyle Evans 	(u64)(0x748F82EE5DEFB2FC), (u64)(0x78A5636F43172F60),
203736d6639SKyle Evans 	(u64)(0x84C87814A1F0AB72), (u64)(0x8CC702081A6439EC),
204736d6639SKyle Evans 	(u64)(0x90BEFFFA23631E28), (u64)(0xA4506CEBDE82BDE9),
205736d6639SKyle Evans 	(u64)(0xBEF9A3F7B2C67915), (u64)(0xC67178F2E372532B),
206736d6639SKyle Evans 	(u64)(0xCA273ECEEA26619C), (u64)(0xD186B8C721C0C207),
207736d6639SKyle Evans 	(u64)(0xEADA7DD6CDE0EB1E), (u64)(0xF57D4F7FEE6ED178),
208736d6639SKyle Evans 	(u64)(0x06F067AA72176FBA), (u64)(0x0A637DC5A2C898A6),
209736d6639SKyle Evans 	(u64)(0x113F9804BEF90DAE), (u64)(0x1B710B35131C471B),
210736d6639SKyle Evans 	(u64)(0x28DB77F523047D84), (u64)(0x32CAAB7B40C72493),
211736d6639SKyle Evans 	(u64)(0x3C9EBE0A15C9BEBC), (u64)(0x431D67C49C100D4C),
212736d6639SKyle Evans 	(u64)(0x4CC5D4BECB3E42B6), (u64)(0x597F299CFC657E2A),
213736d6639SKyle Evans 	(u64)(0x5FCB6FAB3AD6FAEC), (u64)(0x6C44198C4A475817)
214736d6639SKyle Evans };
215736d6639SKyle Evans 
216736d6639SKyle Evans /**********************************************/
217736d6639SKyle Evans #endif
218736d6639SKyle Evans 
219736d6639SKyle Evans #endif /* __SHA2_H__ */
220