40 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL 
   47 #if (ZUC_SUPPORT == ENABLED) 
   50 #define ADD31(x, a, b) \ 
   53    x = (x) + ((x) >> 31); \ 
   58 #define MUL31(x, a, n) \ 
   60    x = ((a) << (n)) | ((a) >> (31 - (n))); \ 
   65 #define SHIFT496(s, s16) \ 
   86 #define LFSR_WITH_INIT_MODE(s, u) \ 
   91    MUL31(temp, s[0], 8); \ 
   92    ADD31(s16, s16, temp); \ 
   93    MUL31(temp, s[4], 20); \ 
   94    ADD31(s16, s16, temp); \ 
   95    MUL31(temp, s[10], 21); \ 
   96    ADD31(s16, s16, temp); \ 
   97    MUL31(temp, s[13], 17); \ 
   98    ADD31(s16, s16, temp); \ 
   99    MUL31(temp, s[15], 15); \ 
  100    ADD31(s16, s16, temp); \ 
  101    ADD31(s16, s16, u); \ 
  106 #define LFSR_WITH_WORKING_MODE(s) \ 
  111    MUL31(temp, s[0], 8); \ 
  112    ADD31(s16, s16, temp); \ 
  113    MUL31(temp, s[4], 20); \ 
  114    ADD31(s16, s16, temp); \ 
  115    MUL31(temp, s[10], 21); \ 
  116    ADD31(s16, s16, temp); \ 
  117    MUL31(temp, s[13], 17); \ 
  118    ADD31(s16, s16, temp); \ 
  119    MUL31(temp, s[15], 15); \ 
  120    ADD31(s16, s16, temp); \ 
  125 #define BIT_REORGANIZATION(x0, x1, x2, x3, s) \ 
  127    x0 = ((s[15] << 1) & 0xFFFF0000) | (s[14] & 0xFFFF); \ 
  128    x1 = ((s[11] << 16) & 0xFFFF0000) | ((s[9] >> 15) & 0xFFFF); \ 
  129    x2 = ((s[7] << 16) & 0xFFFF0000) | ((s[5] >> 15) & 0xFFFF); \ 
  130    x3 = ((s[2] << 16) & 0xFFFF0000) | ((s[0] >> 15) & 0xFFFF); \ 
  134 #define S(x) ((uint32_t) s1[(x) & 0xFF] | \ 
  135    ((uint32_t) s0[((x) >> 8) & 0xFF] << 8) | \ 
  136    ((uint32_t) s1[((x) >> 16) & 0xFF] << 16) | \ 
  137    ((uint32_t) s0[((x) >> 24) & 0xFF] << 24)) 
  140 #define L1(x) ((x) ^ ROL32(x, 2) ^ ROL32(x, 10) ^ ROL32(x, 18) ^ ROL32(x, 24)) 
  141 #define L2(x) ((x) ^ ROL32(x, 8) ^ ROL32(x, 14) ^ ROL32(x, 22) ^ ROL32(x, 30)) 
  144 #define F(w, x0, x1, x2, r1, r2) \ 
  149    w = ((x0) ^ (r1)) + (r2); \ 
  152    temp = (w1 << 16) | (w2 >> 16); \ 
  155    temp = (w2 << 16) | (w1 >> 16); \ 
  161 #define LOAD1(a, b, c) (((uint32_t) (a) << 23) | \ 
  162    ((uint32_t) (b) << 8) | (uint32_t) (c)) 
  165 #define LOAD2(a, b, c, d) (((uint32_t) (a) << 23) | \ 
  166    ((uint32_t) ((b) & 0x7F) << 16) | \ 
  167    ((uint32_t) (c) << 8) | (uint32_t) (d)) 
  170 static const uint16_t d1[16] =
 
  172    0x44D7, 0x26BC, 0x626B, 0x135E, 0x5789, 0x35E2, 0x7135, 0x09AF,
 
  173    0x4D78, 0x2F13, 0x6BC4, 0x1AF1, 0x5E26, 0x3C4D, 0x789A, 0x47AC
 
  177 static const uint8_t d2[16] =
 
  179    0x64, 0x43, 0x7B, 0x2A, 0x11, 0x05, 0x51, 0x42, 0x1A, 0x31, 0x18, 0x66, 0x14, 0x2E, 0x01, 0x5C
 
  183 static const uint8_t d3[16] =
 
  185    0x22, 0x2F, 0x24, 0x2A, 0x6D, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x52, 0x10, 0x30
 
  189 static const uint8_t s0[256] =
 
  191    0x3E, 0x72, 0x5B, 0x47, 0xCA, 0xE0, 0x00, 0x33, 0x04, 0xD1, 0x54, 0x98, 0x09, 0xB9, 0x6D, 0xCB,
 
  192    0x7B, 0x1B, 0xF9, 0x32, 0xAF, 0x9D, 0x6A, 0xA5, 0xB8, 0x2D, 0xFC, 0x1D, 0x08, 0x53, 0x03, 0x90,
 
  193    0x4D, 0x4E, 0x84, 0x99, 0xE4, 0xCE, 0xD9, 0x91, 0xDD, 0xB6, 0x85, 0x48, 0x8B, 0x29, 0x6E, 0xAC,
 
  194    0xCD, 0xC1, 0xF8, 0x1E, 0x73, 0x43, 0x69, 0xC6, 0xB5, 0xBD, 0xFD, 0x39, 0x63, 0x20, 0xD4, 0x38,
 
  195    0x76, 0x7D, 0xB2, 0xA7, 0xCF, 0xED, 0x57, 0xC5, 0xF3, 0x2C, 0xBB, 0x14, 0x21, 0x06, 0x55, 0x9B,
 
  196    0xE3, 0xEF, 0x5E, 0x31, 0x4F, 0x7F, 0x5A, 0xA4, 0x0D, 0x82, 0x51, 0x49, 0x5F, 0xBA, 0x58, 0x1C,
 
  197    0x4A, 0x16, 0xD5, 0x17, 0xA8, 0x92, 0x24, 0x1F, 0x8C, 0xFF, 0xD8, 0xAE, 0x2E, 0x01, 0xD3, 0xAD,
 
  198    0x3B, 0x4B, 0xDA, 0x46, 0xEB, 0xC9, 0xDE, 0x9A, 0x8F, 0x87, 0xD7, 0x3A, 0x80, 0x6F, 0x2F, 0xC8,
 
  199    0xB1, 0xB4, 0x37, 0xF7, 0x0A, 0x22, 0x13, 0x28, 0x7C, 0xCC, 0x3C, 0x89, 0xC7, 0xC3, 0x96, 0x56,
 
  200    0x07, 0xBF, 0x7E, 0xF0, 0x0B, 0x2B, 0x97, 0x52, 0x35, 0x41, 0x79, 0x61, 0xA6, 0x4C, 0x10, 0xFE,
 
  201    0xBC, 0x26, 0x95, 0x88, 0x8A, 0xB0, 0xA3, 0xFB, 0xC0, 0x18, 0x94, 0xF2, 0xE1, 0xE5, 0xE9, 0x5D,
 
  202    0xD0, 0xDC, 0x11, 0x66, 0x64, 0x5C, 0xEC, 0x59, 0x42, 0x75, 0x12, 0xF5, 0x74, 0x9C, 0xAA, 0x23,
 
  203    0x0E, 0x86, 0xAB, 0xBE, 0x2A, 0x02, 0xE7, 0x67, 0xE6, 0x44, 0xA2, 0x6C, 0xC2, 0x93, 0x9F, 0xF1,
 
  204    0xF6, 0xFA, 0x36, 0xD2, 0x50, 0x68, 0x9E, 0x62, 0x71, 0x15, 0x3D, 0xD6, 0x40, 0xC4, 0xE2, 0x0F,
 
  205    0x8E, 0x83, 0x77, 0x6B, 0x25, 0x05, 0x3F, 0x0C, 0x30, 0xEA, 0x70, 0xB7, 0xA1, 0xE8, 0xA9, 0x65,
 
  206    0x8D, 0x27, 0x1A, 0xDB, 0x81, 0xB3, 0xA0, 0xF4, 0x45, 0x7A, 0x19, 0xDF, 0xEE, 0x78, 0x34, 0x60
 
  210 static const uint8_t s1[256] =
 
  212    0x55, 0xC2, 0x63, 0x71, 0x3B, 0xC8, 0x47, 0x86, 0x9F, 0x3C, 0xDA, 0x5B, 0x29, 0xAA, 0xFD, 0x77,
 
  213    0x8C, 0xC5, 0x94, 0x0C, 0xA6, 0x1A, 0x13, 0x00, 0xE3, 0xA8, 0x16, 0x72, 0x40, 0xF9, 0xF8, 0x42,
 
  214    0x44, 0x26, 0x68, 0x96, 0x81, 0xD9, 0x45, 0x3E, 0x10, 0x76, 0xC6, 0xA7, 0x8B, 0x39, 0x43, 0xE1,
 
  215    0x3A, 0xB5, 0x56, 0x2A, 0xC0, 0x6D, 0xB3, 0x05, 0x22, 0x66, 0xBF, 0xDC, 0x0B, 0xFA, 0x62, 0x48,
 
  216    0xDD, 0x20, 0x11, 0x06, 0x36, 0xC9, 0xC1, 0xCF, 0xF6, 0x27, 0x52, 0xBB, 0x69, 0xF5, 0xD4, 0x87,
 
  217    0x7F, 0x84, 0x4C, 0xD2, 0x9C, 0x57, 0xA4, 0xBC, 0x4F, 0x9A, 0xDF, 0xFE, 0xD6, 0x8D, 0x7A, 0xEB,
 
  218    0x2B, 0x53, 0xD8, 0x5C, 0xA1, 0x14, 0x17, 0xFB, 0x23, 0xD5, 0x7D, 0x30, 0x67, 0x73, 0x08, 0x09,
 
  219    0xEE, 0xB7, 0x70, 0x3F, 0x61, 0xB2, 0x19, 0x8E, 0x4E, 0xE5, 0x4B, 0x93, 0x8F, 0x5D, 0xDB, 0xA9,
 
  220    0xAD, 0xF1, 0xAE, 0x2E, 0xCB, 0x0D, 0xFC, 0xF4, 0x2D, 0x46, 0x6E, 0x1D, 0x97, 0xE8, 0xD1, 0xE9,
 
  221    0x4D, 0x37, 0xA5, 0x75, 0x5E, 0x83, 0x9E, 0xAB, 0x82, 0x9D, 0xB9, 0x1C, 0xE0, 0xCD, 0x49, 0x89,
 
  222    0x01, 0xB6, 0xBD, 0x58, 0x24, 0xA2, 0x5F, 0x38, 0x78, 0x99, 0x15, 0x90, 0x50, 0xB8, 0x95, 0xE4,
 
  223    0xD0, 0x91, 0xC7, 0xCE, 0xED, 0x0F, 0xB4, 0x6F, 0xA0, 0xCC, 0xF0, 0x02, 0x4A, 0x79, 0xC3, 0xDE,
 
  224    0xA3, 0xEF, 0xEA, 0x51, 0xE6, 0x6B, 0x18, 0xEC, 0x1B, 0x2C, 0x80, 0xF7, 0x74, 0xE7, 0xFF, 0x21,
 
  225    0x5A, 0x6A, 0x54, 0x1E, 0x41, 0x31, 0x92, 0x35, 0xC4, 0x33, 0x07, 0x0A, 0xBA, 0x7E, 0x0E, 0x34,
 
  226    0x88, 0xB1, 0x98, 0x7C, 0xF3, 0x3D, 0x60, 0x6C, 0x7B, 0xCA, 0xD3, 0x1F, 0x32, 0x65, 0x04, 0x28,
 
  227    0x64, 0xBE, 0x85, 0x9B, 0x2F, 0x59, 0x8A, 0xD7, 0xB0, 0x25, 0xAC, 0xAF, 0x12, 0x03, 0xE2, 0xF2
 
  242    const uint8_t *
iv, 
size_t ivLen)
 
  252    if(context == NULL || key == NULL || 
iv == NULL)
 
  260    if(keyLen == 16 && ivLen == 16)
 
  263       context->
s[0] = 
LOAD1(key[0], d1[0], 
iv[0]);
 
  264       context->
s[1] = 
LOAD1(key[1], d1[1], 
iv[1]);
 
  265       context->
s[2] = 
LOAD1(key[2], d1[2], 
iv[2]);
 
  266       context->
s[3] = 
LOAD1(key[3], d1[3], 
iv[3]);
 
  267       context->
s[4] = 
LOAD1(key[4], d1[4], 
iv[4]);
 
  268       context->
s[5] = 
LOAD1(key[5], d1[5], 
iv[5]);
 
  269       context->
s[6] = 
LOAD1(key[6], d1[6], 
iv[6]);
 
  270       context->
s[7] = 
LOAD1(key[7], d1[7], 
iv[7]);
 
  271       context->
s[8] = 
LOAD1(key[8], d1[8], 
iv[8]);
 
  272       context->
s[9] = 
LOAD1(key[9], d1[9], 
iv[9]);
 
  273       context->
s[10] = 
LOAD1(key[10], d1[10], 
iv[10]);
 
  274       context->
s[11] = 
LOAD1(key[11], d1[11], 
iv[11]);
 
  275       context->
s[12] = 
LOAD1(key[12], d1[12], 
iv[12]);
 
  276       context->
s[13] = 
LOAD1(key[13], d1[13], 
iv[13]);
 
  277       context->
s[14] = 
LOAD1(key[14], d1[14], 
iv[14]);
 
  278       context->
s[15] = 
LOAD1(key[15], d1[15], 
iv[15]);
 
  280    else if(keyLen == 32 && ivLen == 16)
 
  283       context->
s[0] = 
LOAD2(key[0], d2[0], key[16], key[24]);
 
  284       context->
s[1] = 
LOAD2(key[1], d2[1], key[17], key[25]);
 
  285       context->
s[2] = 
LOAD2(key[2], d2[2], key[18], key[26]);
 
  286       context->
s[3] = 
LOAD2(key[3], d2[3], key[19], key[27]);
 
  287       context->
s[4] = 
LOAD2(key[4], d2[4], key[20], key[28]);
 
  288       context->
s[5] = 
LOAD2(key[5], d2[5], key[21], key[29]);
 
  289       context->
s[6] = 
LOAD2(key[6], d2[6], key[22], key[30]);
 
  290       context->
s[7] = 
LOAD2(key[7], d2[7], 
iv[0], 
iv[8]);
 
  291       context->
s[8] = 
LOAD2(key[8], d2[8], 
iv[1], 
iv[9]);
 
  292       context->
s[9] = 
LOAD2(key[9], d2[9], 
iv[2], 
iv[10]);
 
  293       context->
s[10] = 
LOAD2(key[10], d2[10], 
iv[3], 
iv[11]);
 
  294       context->
s[11] = 
LOAD2(key[11], d2[11], 
iv[4], 
iv[12]);
 
  295       context->
s[12] = 
LOAD2(key[12], d2[12], 
iv[5], 
iv[13]);
 
  296       context->
s[13] = 
LOAD2(key[13], d2[13], 
iv[6], 
iv[14]);
 
  297       context->
s[14] = 
LOAD2(key[14], d2[14], 
iv[7], 
iv[15]);
 
  298       context->
s[15] = 
LOAD2(key[15], d2[15], key[23], key[31]);
 
  300    else if(keyLen == 32 && ivLen == 25)
 
  303       context->
s[0] =  
LOAD2(key[0], d3[0], key[21], key[16]);
 
  304       context->
s[1] =  
LOAD2(key[1], d3[1], key[22], key[17]);
 
  305       context->
s[2] =  
LOAD2(key[2], d3[2], key[23], key[18]);
 
  306       context->
s[3] =  
LOAD2(key[3], d3[3], key[24], key[19]);
 
  307       context->
s[4] =  
LOAD2(key[4], d3[4], key[25], key[20]);
 
  308       context->
s[5] =  
LOAD2(
iv[0], d3[5] | (
iv[17] & 0x3F), key[5], key[26]);
 
  309       context->
s[6] =  
LOAD2(
iv[1], d3[6] | (
iv[18] & 0x3F), key[6], key[27]);
 
  310       context->
s[7] =  
LOAD2(
iv[10], d3[7] | (
iv[19] & 0x3F), key[7], 
iv[2]);
 
  311       context->
s[8] =  
LOAD2(key[8], d3[8] | (
iv[20] & 0x3F), 
iv[3], 
iv[11]);
 
  312       context->
s[9] =  
LOAD2(key[9], d3[9] | (
iv[21] & 0x3F), 
iv[12], 
iv[4]);
 
  313       context->
s[10] = 
LOAD2(
iv[5], d3[10] | (
iv[22] & 0x3F), key[10], key[28]);
 
  314       context->
s[11] = 
LOAD2(key[11], d3[11] | (
iv[23] & 0x3F), 
iv[6], 
iv[13]);
 
  315       context->
s[12] = 
LOAD2(key[12], d3[12] | (
iv[24] & 0x3F), 
iv[7], 
iv[14]);
 
  316       context->
s[13] = 
LOAD2(key[13], d3[13], 
iv[15], 
iv[8]);
 
  317       context->
s[14] = 
LOAD2(key[14], d3[14] | ((key[31] >> 4) & 0x0F), 
iv[16], 
iv[9]);
 
  318       context->
s[15] = 
LOAD2(key[15], d3[15] | (key[31] & 0x0F), key[30], key[29]);
 
  331    for(i = 0; i < 32; i++)
 
  334       F(w, x0, x1, x2, context->
r1, context->
r2);
 
  343    F(w, x0, x1, x2, context->
r1, context->
r2);
 
  369    for(i = 0; i < 
length; i++)
 
  374       F(
z, x0, x1, x2, context->
r1, context->
r2);
 
  401    for(i = 0; i < 
length; i++)
 
  404       if(context->
n == 0 || context->
n >= 4)
 
  417             output[i] = input[i] ^ ((context->
ks >> 24) & 0xFF);
 
  422             output[i] = (context->
ks >> 24) & 0xFF;