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