int __cdecl SM4_enCode(int a1, int a2, int a3) { int v3; // edi@1 int v4; // eax@1 int v5; // eax@1 int *v6; // edi@1 int v7; // eax@1 int v8; // ecx@1 int *v9; // ST14_4@1 signed __int32 v10; // edi@1 int v11; // edx@1 void *v12; // edi@2 size_t v13; // edi@4 size_t v14; // ST0C_4@4 int v15; // edi@4 int result; // eax@4 int v17; // [sp+0h] [bp-5Ch]@4 signed __int32 v18; // [sp+Ch] [bp-50h]@1 unsigned __int8 *v19; // [sp+10h] [bp-4Ch]@1 int *v20; // [sp+14h] [bp-48h]@1 const void *v21; // [sp+18h] [bp-44h]@2 int *v22; // [sp+1Ch] [bp-40h]@1 int v23; // [sp+20h] [bp-3Ch]@4 char v24; // [sp+27h] [bp-35h]@4 int v25; // [sp+48h] [bp-14h]@1 v3 = a1; v22 = (int *)&_stack_chk_guard; v25 = _stack_chk_guard; v18 = (*(int (__cdecl **)(int, const char *))(*(_DWORD *)a1 + 24))(a1, "java/lang/String"); v19 = (unsigned __int8 *)(*(int (__cdecl **)(int, const char *))(*(_DWORD *)v3 + 668))(v3, "UTF-8"); v4 = (*(int (__cdecl **)(int, signed __int32, const char *, const char *))(*(_DWORD *)v3 + 132))( v3, v18, "getBytes", "(Ljava/lang/String;)[B"); v5 = _JNIEnv::CallObjectMethod(a1, a3, v4, (char)v19); v6 = (int *)v5; v7 = (*(int (__cdecl **)(int, int))(*(_DWORD *)a1 + 684))(a1, v5); v8 = *(_DWORD *)a1; v20 = v6; v9 = v6; v10 = v7; v11 = (*(int (__cdecl **)(int, int *, _DWORD))(v8 + 736))(a1, v9, 0); v18 = v10; if ( v10 <= 0 ) { v19 = 0; } else { v21 = (const void *)v11; v12 = malloc(v18 + 1); memcpy(v12, v21, v18); v11 = (int)v21; v19 = (unsigned __int8 *)v12; *((_BYTE *)v12 + v18) = 0; } (*(void (__cdecl **)(int, int *, int))(*(_DWORD *)a1 + 768))(a1, v20, v11); memcpy(&v24, "lIIh8mmplDg4kQMd148F2eMQLPCQ7Y9y", 0x21u); v20 = &v17; v13 = 16 * (((v18 + ((unsigned int)(v18 >> 31) >> 28)) >> 4) - (((v18 & 0xFu) < 1) - 1)); v18 = (signed __int32)&v17 - v13; sm4_crypt_cbc((unsigned __int8 *)&v24, 1, v13, v19, (unsigned __int8 *)&v17 - v13, &v23); v14 = v13; v15 = (*(int (__cdecl **)(int, size_t))(*(_DWORD *)a1 + 704))(a1, v13); (*(void (__cdecl **)(int, int, _DWORD, size_t, signed __int32))(*(_DWORD *)a1 + 832))(a1, v15, 0, v14, v18); result = *v22; if ( *v22 == v25 ) result = v15; return result; }
int __cdecl SM4_deCode(int *a1, int a2, int a3) { unsigned int v3; // edx@1 char *v4; // edi@1 int v5; // eax@3 int v6; // eax@3 int v7; // eax@3 signed __int32 v8; // edi@3 int v9; // eax@3 int v10; // ecx@3 int v11; // eax@3 int result; // eax@3 bool v13; // cf@3 int v14; // [sp+0h] [bp-5Ch]@1 signed __int32 v15; // [sp+Ch] [bp-50h]@1 int v16; // [sp+10h] [bp-4Ch]@3 const void *v17; // [sp+14h] [bp-48h]@1 unsigned __int8 *v18; // [sp+18h] [bp-44h]@1 unsigned int *v19; // [sp+1Ch] [bp-40h]@1 int v20; // [sp+20h] [bp-3Ch]@3 char v21; // [sp+27h] [bp-35h]@1 int *v22; // [sp+30h] [bp-2Ch]@3 int v23; // [sp+34h] [bp-28h]@3 int v24; // [sp+38h] [bp-24h]@3 signed __int32 v25; // [sp+3Ch] [bp-20h]@3 int v26; // [sp+40h] [bp-1Ch]@3 const char *v27; // [sp+44h] [bp-18h]@3 unsigned int v28; // [sp+48h] [bp-14h]@1 int v29; // [sp+4Ch] [bp-10h]@3 v19 = (unsigned int *)&_stack_chk_guard; v28 = _stack_chk_guard; v17 = (const void *)(*(int (__cdecl **)(int *, int, _DWORD))(*a1 + 736))(a1, a3, 0); v15 = (*(int (__cdecl **)(int *, int))(*a1 + 684))(a1, a3); v3 = (v15 + 15) & 0xFFFFFFF0; v18 = (unsigned __int8 *)&v14 - v3; v4 = (char *)&v14 - v3; memcpy(&v21, "lIIh8mmplDg4kQMd148F2eMQLPCQ7Y9y", 0x21u); if ( v15 > 0 ) memcpy(v4, v17, v15); sm4_crypt_cbc((unsigned __int8 *)&v21, 0, v15, (unsigned __int8 *)v4, v18, &v20); v5 = *a1; v26 = (int)a1; v6 = (*(int (__cdecl **)(int *, const char *))(v5 + 24))(a1, "java/lang/String"); v17 = (const void *)v6; v16 = *a1; v27 = (const char *)v6; v16 = (*(int (__cdecl **)(int *, int, const char *, const char *))(v16 + 132))( a1, v6, "<init>", "([BLjava/lang/String;)V"); v7 = *a1; v8 = v15; v27 = (const char *)v15; v9 = (*(int (__cdecl **)(int *, signed __int32, unsigned int, int))(v7 + 704))(a1, v15, v28, v29); v10 = *a1; v26 = (int)v18; v25 = v8; v24 = 0; v23 = v9; LOBYTE(v8) = v9; v22 = a1; (*(void (__cdecl **)(int *, int, _DWORD, signed __int32, unsigned __int8 *, const char *))(v10 + 832))( a1, v9, 0, v25, v18, v27); v11 = *a1; v27 = "UTF-8"; v26 = (int)a1; v26 = (*(int (__cdecl **)(int *))(v11 + 668))(a1); result = _JNIEnv::NewObject(a1, v17, v16, v8); v13 = *v19 < v28; return result; }
int __cdecl sm4_crypt_cbc(unsigned __int8 *a1, int a2, size_t size, unsigned __int8 *src, unsigned __int8 *a5, int *a6) { return sm4_crypt_cbc(a1, a2, size, src, a5, a6); }
int __cdecl sm4_crypt_cbc(unsigned __int8 *a1, int a2, size_t size, unsigned __int8 *src, unsigned __int8 *a5, int *a6) { int *v6; // edi@1 size_t v7; // esi@3 char *v8; // eax@3 bool v9; // cf@3 size_t v10; // esi@3 __m128 *v11; // eax@5 __m128 *v12; // esi@8 size_t v13; // ecx@10 size_t v14; // eax@13 __m128 *v15; // esi@13 unsigned __int8 *v16; // ecx@13 unsigned __int8 *v17; // ST1C_4@14 size_t v18; // edi@14 unsigned __int8 *v19; // ecx@16 int v20; // eax@16 size_t v21; // ecx@17 size_t v22; // edi@19 int v23; // eax@19 __m128 *v24; // esi@19 int v25; // edx@19 int v26; // ST1C_4@20 _BYTE *v27; // ecx@23 int v28; // eax@23 unsigned __int8 *v31; // [sp+4h] [bp-B8h]@5 size_t v32; // [sp+8h] [bp-B4h]@5 __m128 *v33; // [sp+18h] [bp-A4h]@3 size_t v34; // [sp+1Ch] [bp-A0h]@19 size_t v35; // [sp+20h] [bp-9Ch]@19 int v36; // [sp+28h] [bp-94h]@12 int v37; // [sp+A8h] [bp-14h]@1 v6 = a6; v37 = _stack_chk_guard; if ( size ) { if ( size & 0xF ) { v7 = ((size + ((unsigned int)((signed int)size >> 31) >> 28)) & 0xFFFFFFF0) + 16; v8 = (char *)malloc(v7); v33 = (__m128 *)v8; v9 = v7 < size; v10 = v7 - size; if ( v9 || v10 == 0 ) v10 = 0; v6 = a6; memset(&v8[size], 0, v10); v32 = size; v31 = src; v11 = v33; } else { v11 = (__m128 *)malloc(size); v32 = size; v31 = src; } v12 = v11; memcpy(v11, v31, v32); if ( a2 ) { if ( a2 == 1 ) { v13 = size; if ( size & 0xF ) v13 = ((size + ((unsigned int)((signed int)size >> 31) >> 28)) & 0xFFFFFFF0) + 16; *v6 = v13; sm4_setkey_enc((unsigned __int32 *)&v36, a1); *v12 = _mm_xor_ps(*v12, (__m128)xmmword_2140); sub_10C0(a5); if ( (signed int)size >= 17 ) { v14 = size + 16; v15 = v12 + 1; v16 = a5 + 16; do { v17 = v16; *v15 = _mm_xor_ps(*v15, *((__m128 *)v16 - 1)); v18 = v14; sub_10C0(v16); v14 = v18 - 16; ++v15; v16 = v17 + 16; } while ( (signed int)(v18 - 16) > 32 ); } } } else { sm4_setkey_dec((unsigned __int32 *)&v36, a1); sub_10C0(a5); v19 = a5; *(__m128 *)a5 = _mm_xor_ps(*(__m128 *)a5, (__m128)xmmword_2140); v20 = 0; if ( (signed int)size >= 17 ) { v21 = -33; if ( (signed int)~size > -34 ) v21 = ~size; v22 = ((v21 + size + 16) >> 4) + 1; v34 = (v21 + size + 32) & 0xFFFFFFF0; v23 = (int)&v12[1]; v24 = (__m128 *)(a5 + 16); v35 = ((v21 + size + 16) >> 4) + 1; v25 = v23; do { v26 = v25; sub_10C0(v24); *v24 = _mm_xor_ps(*v24, *(__m128 *)(v26 - 16)); v25 = v26 + 16; ++v24; --v22; } while ( v22 ); v19 = &a5[v34]; v20 = 16 * v35; v6 = a6; } *v6 = v20; if ( *v19 ) { v27 = v19 + 1; v28 = v20 + 1; do *v6 = v28++; while ( *v27++ != 0 ); } } } else { *a6 = 0; } return _stack_chk_guard; }
unsigned __int32 __cdecl sm4_setkey_enc(int a1, int a2) { unsigned __int32 v2; // esi@1 unsigned __int32 v3; // edi@1 unsigned __int32 v4; // edx@1 int v5; // ebx@1 _DWORD *v6; // ecx@1 _DWORD *v7; // ST1C_4@2 unsigned __int32 v8; // ST18_4@2 unsigned __int32 v9; // ST14_4@2 unsigned int v10; // eax@2 int v11; // edx@2 int v12; // ecx@2 int v13; // eax@2 unsigned __int32 result; // eax@2 unsigned __int32 v15; // [sp+4h] [bp-24h]@1 v15 = _byteswap_ulong(*(_DWORD *)a2) ^ 0x5356A350; v2 = _byteswap_ulong(*(_DWORD *)(a2 + 4)) ^ 0xA13AFAC7; v3 = _byteswap_ulong(*(_DWORD *)(a2 + 8)) ^ 0x7D9971D9; v4 = _byteswap_ulong(*(_DWORD *)(a2 + 12)) ^ 0x2BCD07DC; v5 = 0; v6 = &unk_249C; do { v7 = v6; v8 = v2; v9 = v4; v10 = *v6 ^ v3 ^ v4 ^ v2; v11 = ((unsigned __int8)byte_251C[v10 >> 24] << 24) | ((unsigned __int8)byte_251C[(unsigned __int8)(v10 >> 16)] << 16); v2 = v3; v12 = v11 | ((unsigned __int8)byte_251C[BYTE1(v10)] << 8); v3 = v9; v13 = v12 | (unsigned __int8)byte_251C[(unsigned __int8)v10]; v4 = v13 ^ (__PAIR__((unsigned int)v13, v12) >> 9) ^ v15 ^ (__PAIR__((unsigned int)v13, v11) >> 19); *(_DWORD *)(a1 + 4 * v5++) = v4; v6 = v7 + 1; result = v8; v15 = v8; } while ( v5 != 32 ); return result; }
int __cdecl sm4_setkey_dec(int a1, int a2) { unsigned __int32 v2; // edx@1 unsigned __int32 v3; // edi@1 unsigned __int32 v4; // esi@1 int v5; // ebx@1 _DWORD *v6; // eax@1 unsigned __int32 v7; // ST18_4@2 unsigned __int32 v8; // ST14_4@2 unsigned __int32 v9; // ST10_4@2 unsigned int v10; // ecx@2 int v11; // esi@2 int v12; // edx@2 int v13; // ecx@2 int v14; // esi@2 int v15; // esi@3 int v16; // ecx@3 int v17; // edx@3 int v18; // eax@3 int v19; // eax@3 int v20; // eax@3 int v21; // eax@3 int v22; // eax@3 int v23; // eax@3 int v24; // eax@3 int v25; // eax@3 int v26; // eax@3 int v27; // eax@3 int v28; // eax@3 int v29; // eax@3 int v30; // eax@3 int result; // eax@3 unsigned __int32 v32; // [sp+4h] [bp-24h]@1 v32 = _byteswap_ulong(*(_DWORD *)a2) ^ 0x5356A350; v2 = _byteswap_ulong(*(_DWORD *)(a2 + 4)) ^ 0xA13AFAC7; v3 = _byteswap_ulong(*(_DWORD *)(a2 + 8)) ^ 0x7D9971D9; v4 = _byteswap_ulong(*(_DWORD *)(a2 + 12)) ^ 0x2BCD07DC; v5 = 0; v6 = &unk_249C; do { v7 = v2; v8 = v3; v9 = v4; v10 = *v6 ^ v3 ^ v4 ^ v2; v11 = ((unsigned __int8)byte_251C[v10 >> 24] << 24) | ((unsigned __int8)byte_251C[(unsigned __int8)(v10 >> 16)] << 16); v3 = v9; v12 = v11 | ((unsigned __int8)byte_251C[BYTE1(v10)] << 8); v13 = v12 | (unsigned __int8)byte_251C[(unsigned __int8)v10]; v14 = (__PAIR__((unsigned int)v13, v12) >> 9) ^ v32 ^ (__PAIR__((unsigned int)v13, v11) >> 19); v2 = v8; v4 = v13 ^ v14; *(_DWORD *)(a1 + 4 * v5++) = v4; ++v6; v32 = v7; } while ( v5 != 32 ); v15 = a1; v16 = *(_DWORD *)a1; v17 = *(_DWORD *)(a1 + 4); *(_DWORD *)a1 = *(_DWORD *)(a1 + 124); *(_DWORD *)(a1 + 124) = v16; *(_DWORD *)(v15 + 4) = *(_DWORD *)(v15 + 120); *(_DWORD *)(a1 + 120) = v17; v18 = *(_DWORD *)(a1 + 8); *(_DWORD *)(v15 + 8) = *(_DWORD *)(v15 + 116); *(_DWORD *)(a1 + 116) = v18; v19 = *(_DWORD *)(a1 + 12); *(_DWORD *)(v15 + 12) = *(_DWORD *)(v15 + 112); *(_DWORD *)(a1 + 112) = v19; v20 = *(_DWORD *)(a1 + 16); *(_DWORD *)(v15 + 16) = *(_DWORD *)(v15 + 108); *(_DWORD *)(a1 + 108) = v20; v21 = *(_DWORD *)(a1 + 20); *(_DWORD *)(v15 + 20) = *(_DWORD *)(v15 + 104); *(_DWORD *)(a1 + 104) = v21; v22 = *(_DWORD *)(a1 + 24); *(_DWORD *)(v15 + 24) = *(_DWORD *)(v15 + 100); *(_DWORD *)(a1 + 100) = v22; v23 = *(_DWORD *)(a1 + 28); *(_DWORD *)(v15 + 28) = *(_DWORD *)(v15 + 96); *(_DWORD *)(a1 + 96) = v23; v24 = *(_DWORD *)(a1 + 32); *(_DWORD *)(v15 + 32) = *(_DWORD *)(v15 + 92); *(_DWORD *)(a1 + 92) = v24; v25 = *(_DWORD *)(a1 + 36); *(_DWORD *)(v15 + 36) = *(_DWORD *)(v15 + 88); *(_DWORD *)(a1 + 88) = v25; v26 = *(_DWORD *)(a1 + 40); *(_DWORD *)(v15 + 40) = *(_DWORD *)(v15 + 84); *(_DWORD *)(a1 + 84) = v26; v27 = *(_DWORD *)(a1 + 44); *(_DWORD *)(v15 + 44) = *(_DWORD *)(v15 + 80); *(_DWORD *)(a1 + 80) = v27; v28 = *(_DWORD *)(a1 + 48); *(_DWORD *)(v15 + 48) = *(_DWORD *)(v15 + 76); *(_DWORD *)(a1 + 76) = v28; v29 = *(_DWORD *)(a1 + 52); *(_DWORD *)(v15 + 52) = *(_DWORD *)(v15 + 72); *(_DWORD *)(a1 + 72) = v29; v30 = *(_DWORD *)(a1 + 56); *(_DWORD *)(v15 + 56) = *(_DWORD *)(v15 + 68); *(_DWORD *)(a1 + 68) = v30; result = *(_DWORD *)(a1 + 60); *(_DWORD *)(a1 + 60) = *(_DWORD *)(a1 + 64); *(_DWORD *)(a1 + 64) = result; return result; }