• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2014-2022 The GmSSL Project. All Rights Reserved.
3  *
4  *  Licensed under the Apache License, Version 2.0 (the License); you may
5  *  not use this file except in compliance with the License.
6  *
7  *  http://www.apache.org/licenses/LICENSE-2.0
8  */
9 
10 
11 #ifndef GMSSL_SM4_LCL_H
12 #define GMSSL_SM4_LCL_H
13 
14 #include <gmssl/sm4.h>
15 
16 extern const uint8_t SM4_S[256];
17 extern const uint32_t SM4_T[256];
18 extern const uint32_t SM4_D[65536];
19 
20 #define S32(A)					\
21 	((SM4_S[((A) >> 24)       ] << 24) ^	\
22 	 (SM4_S[((A) >> 16) & 0xff] << 16) ^	\
23 	 (SM4_S[((A) >>  8) & 0xff] <<  8) ^	\
24 	 (SM4_S[((A))       & 0xff]))
25 
26 #define ROUNDS(x0, x1, x2, x3, x4)		\
27 	ROUND(x0, x1, x2, x3, x4, 0);		\
28 	ROUND(x1, x2, x3, x4, x0, 1);		\
29 	ROUND(x2, x3, x4, x0, x1, 2);		\
30 	ROUND(x3, x4, x0, x1, x2, 3);		\
31 	ROUND(x4, x0, x1, x2, x3, 4);		\
32 	ROUND(x0, x1, x2, x3, x4, 5);		\
33 	ROUND(x1, x2, x3, x4, x0, 6);		\
34 	ROUND(x2, x3, x4, x0, x1, 7);		\
35 	ROUND(x3, x4, x0, x1, x2, 8);		\
36 	ROUND(x4, x0, x1, x2, x3, 9);		\
37 	ROUND(x0, x1, x2, x3, x4, 10);		\
38 	ROUND(x1, x2, x3, x4, x0, 11);		\
39 	ROUND(x2, x3, x4, x0, x1, 12);		\
40 	ROUND(x3, x4, x0, x1, x2, 13);		\
41 	ROUND(x4, x0, x1, x2, x3, 14);		\
42 	ROUND(x0, x1, x2, x3, x4, 15);		\
43 	ROUND(x1, x2, x3, x4, x0, 16);		\
44 	ROUND(x2, x3, x4, x0, x1, 17);		\
45 	ROUND(x3, x4, x0, x1, x2, 18);		\
46 	ROUND(x4, x0, x1, x2, x3, 19);		\
47 	ROUND(x0, x1, x2, x3, x4, 20);		\
48 	ROUND(x1, x2, x3, x4, x0, 21);		\
49 	ROUND(x2, x3, x4, x0, x1, 22);		\
50 	ROUND(x3, x4, x0, x1, x2, 23);		\
51 	ROUND(x4, x0, x1, x2, x3, 24);		\
52 	ROUND(x0, x1, x2, x3, x4, 25);		\
53 	ROUND(x1, x2, x3, x4, x0, 26);		\
54 	ROUND(x2, x3, x4, x0, x1, 27);		\
55 	ROUND(x3, x4, x0, x1, x2, 28);		\
56 	ROUND(x4, x0, x1, x2, x3, 29);		\
57 	ROUND(x0, x1, x2, x3, x4, 30);		\
58 	ROUND(x1, x2, x3, x4, x0, 31)
59 
60 #endif
61